Как сделать?
…
Кто может мне помощь с боевой системой =(
Целый день мучаюсь, нечего лучше этого не написала
if былпляж2=0
'вы видете свою жену и дочерей. Это была хорошая новость, а вот новость плохая, их загнал на небольшую скалу большой краб, ни жена ни дети еще вас пока не увидили'
act 'напасть на краба':
if 'кокосовый орех':
act 'бросить кокосом в краба':
крабкокос=rand(1,10)
if крабкокос=1:
молодойкрабжизнь=молодойкрабжизнь-5
'Вы попали кокосовым орехом в краба'
act 'ударить':
крабударить=rand(1,10)
крабатака1=rand(1,100)
крабатака2=rand(1,100)
if крабударить=1:
молодойкрабжизнь=молодойкрабжизнь-урон
end
if крабатака1=<15:
жизнь=жизнь-молодойкрабурон
end
if крабатака2=<15:
жизнь=жизнь-молодойкрабурон
end
end
end
end
end
end
end
end
Столкнулся с небольшой проблемой, которая сильно сбила меня с толку. Вообще ситуация очень сильно похожа на баг плеера (?), хотя я возможно не знаю каких-то тонкостей, так что хотелось бы прояснить.
Есть две строки кода, выглядящие таким образом:
$a=$a-$b
if $c>$a : $c=$a
Во всех трех переменных - числа и кроме чисел ничего там быть в принципе не может. До этих строк $a всегда равно $c ($b иногда может быть больше нуля и равна нулю). Прикол вот в чем: какое-то время все работает как надо, все считается правильно, но рано или поздно вторая строка почему-то начинает игнорироваться. Я даже вывод переменных в доп. описание давал: получалось, например, ДО строк что $a=10 $b=2 $c=10, а после: $a=8 $b=2 $c=10. Спрашивается как такое вообще возможно? Строковые переменные в числовые переводятся автоматом (я собственно только их и использую для удобства) и никаких проблем до этого не встречалось. Что интересно проблема вроде бы исчезла после того как я заменил вторую строку на $c=$c-$b (то же самое по сути), во всяком случае прогнал код с сотню раз и такого казуса как в предыдущем случае не возникало. При первом варианте он проявлялся где-то через 10-20 повторов. За почти 150кб работоспособного кода в первый раз встречаю косяк, которому просто не вижу никакого разумного объяснения. Вообще с кодом так - либо работает, либо нет. А серединный вариант - это чушь какая-то… Тем более на таком простеньком отрезке.
Stag_Beetle:
Спрашивается как такое вообще возможно?
У тебя ’10’ и ’8’ сравнились как строки (’8’ больше). Если это действительно происходит по-разному с каждым прогоном, то это баг плеера.
Попробуй использовать функцию VAL при сравнении:
$a=$a-$b
if VAL($c)>VAL($a) : $c=$a
А вообще - пользоваться строковыми переменными для чисел - это путь генерации багов…
vais:
Кто может мне помощь с боевой системой
Целый день мучаюсь, нечего лучше этого не написала
Здесь нужно плясать от игрока, что он должен видеть.
У тебя по коду каждое новое действие добавляется по нажатию предыдущего, причем предыдущее не пропадает. Тебе явно часть действий нужно написать в параллель.
if былпляж2=0
'Вы видите свою жену и дочерей. Это была хорошая новость, а вот новость плохая - их загнал на небольшую скалу большой краб, ни жена, ни дети еще вас пока не увидели'
act 'напасть на краба':
delact 'напасть на краба'
if 'кокосовый орех':
act 'бросить кокосом в краба':
крабкокос=rand(1,10)
if крабкокос=1:
молодойкрабжизнь=молодойкрабжизнь-5
'Вы попали кокосовым орехом в краба'
end
!Возможно здесь нужно удалить кокос из предметов
end
end
act 'ударить':
крабударить=rand(1,10)
крабатака1=rand(1,100)
крабатака2=rand(1,100)
if крабударить=1:
молодойкрабжизнь=молодойкрабжизнь-урон
end
if крабатака1=<15:
жизнь=жизнь-молодойкрабурон
end
if крабатака2=<15:
жизнь=жизнь-молодойкрабурон
end
end
end
end
Ну а с самой математикой боя я не могу ничего посоветовать. Возможно кто-нибудь сможет. :)
if ‘кокосовый орех’:
Это что вообще такое? “Если *отобразить надпись*, то делаем…” Или я что-то не понимаю или это ересь какая-то. Разве там не должно быть:
if кокосовыйорех=1:
vais, EL_RIO прав, скорее всего имелось в виду
if obj('кокосовый орех'):
newsash:
vais, EL_RIO прав, скорее всего имелось в виду
if obj('кокосовый орех'):
Да. Немного ошиблась.
Ну все равно что с этой надписью, что без, боевая система не тянет. Не могу сделать цикличность.
vais:
Да. Немного ошиблась.
Ну все равно что с этой надписью, что без, боевая система не тянет. Не могу сделать цикличность.
Какого рода цикличность? По идее в моём варианте действия ударить и бросок кокоса доступны, т.е. можно их тыкать до конца боя. Чем не цикличность?
Кстати, в каждое действие с уроном нужно прикрутить проверку здоровья с переходом на соответствующую локацию. Например:
.......
if крабатака2=<15:
жизнь=жизнь-молодойкрабурон
end
if жизнь <= 0: gt 'поражение'
if молодойкрабжизнь <= 0: gt 'победа'
end
Короче, по быстрому дописал код с минимальными изменениями. Система проста как два рубля, так что с циклами не стал даже заморачиваться. Они нужны для более сложных боевых систем. Вот код из редактора:
!Недостающая инфа
!---------------------------
addobj'кокосовый орех'
молодойкрабжизнь=15
молодойкрабурон=1
жизнь=15
урон=5
!---------------------------
'Краб: <<молодойкрабжизнь>>'
'Вы: <<жизнь>>'
*nl
if былпляж2=0:
'Вы видите свою жену и дочерей. Это была хорошая новость, а вот новость плохая - их загнал на небольшую скалу большой краб, ни жена, ни дети еще вас пока не увидели'
act 'напасть на краба':
delact $selact
if obj'Кокосовый орех':
act 'Бросить кокосом в краба':
delact $selact
delobj'кокосовый орех'
крабкокос=rand(1,10)
!10% шанс попадания
if крабкокос=1:
молодойкрабжизнь=молодойкрабжизнь-5
'Вы попали кокосовым орехом в краба'
'Краб: <<молодойкрабжизнь>>'
'Вы: <<жизнь>>'
else
'Вы бросили кокос и промахнулись.'
'Краб: <<молодойкрабжизнь>>'
'Вы: <<жизнь>>'
end
end
end
act 'Ударить':
крабударить=rand(1,10)
крабатака1=rand(1,100)
крабатака2=rand(1,100)
!10% шанс попадания по крабу
if крабударить=1:
молодойкрабжизнь=молодойкрабжизнь-урон
'Вы пинаете тварь и попадаете, нанеся <<урон>> ед. урона.'
'Краб: <<молодойкрабжизнь>>'
'Вы: <<жизнь>>'
else
'Вы пытаетесь пнуть тварь, но промахиваетесь.'
'Краб: <<молодойкрабжизнь>>'
'Вы: <<жизнь>>'
end
!15% шанс, что краб вас достанет 1й атакой
if крабатака1=<15:
жизнь=жизнь-молодойкрабурон
'Краб огрызается в ответ и первой же атакой наносит вам <<молодойкрабурон>> ед. урона.'
'Краб: <<молодойкрабжизнь>>'
'Вы: <<жизнь>>'
else
'В бешенстве краб бросается на вас, но промахивается'
'Краб: <<молодойкрабжизнь>>'
'Вы: <<жизнь>>'
end
!15% шанс, что краб вас достанет 2й атакой
if крабатака2=<15:
жизнь=жизнь-молодойкрабурон
'Краб переходит в контратаку и наносит вам <<молодойкрабурон>> ед. урона.'
'Краб: <<молодойкрабжизнь>>'
'Вы: <<жизнь>>'
else
'Пытаясь контратаковать, краб бросается на вас, но промахивается'
'Краб: <<молодойкрабжизнь>>'
'Вы: <<жизнь>>'
end
if молодойкрабжизнь<=0 and жизнь>0:msg'Вы победили'
if жизнь<=0:msg'Вы мертвы'
end
end
end
Сразу замечание по шансам попадания - это кошмар какой-то. Там что, инвалиды дерутся, что попадает только 1 из 10 или 1 из 6,[6] ударов? Подправить бы…
1) Про инвалидов, считайте это мое виденье игры) Не хочу что бы было как у всех. Раз раз и готово. И не хочу что бы было как в Дисах 3 которых убили большие цифры. ставить по 1000хп
2) Что то мне совсем не нравится такая система боя( А именно на ней и застряла(
проблема в том что у меня очень много монстров. есть те кто появляются по событию(после постройки лагеря, пока не уничтожишь 3 колонии крабов будут приходит по три краба от каждой колонии в поисках пищи) одних крабов пять видов. А это только один вид монстров. И писать для каждого код сложно. Может у кого есть готовый код боевой системы которым он может поделиться? Или мысли как упростить боевку
Эх… что-то я слишком добрый сегодня. В принципе, нет ничего особо сложного для начинающего в том, чтобы перевести эту боевку в обобщенный вид. Просто написать для неё самый примитивный “движок” на основе уже имеющейся логики.
Это вставляем на локацию (на тот же пляж, к примеру)
$loc=$curloc
act'Напасть на беззащитное существо':
!---------------------------
addobj'какос'
!---------------------------
!Параметры ГГ
hp=15
damage=5
!---------------------------
!Параметры врага
$vrag_name='Няшный краб'
vrag_hp=15
vrag_damage=1
!---------------------------
gt'battle'
end
А вот это в локацию “battle”:
cla
clr
*clr
if hp<=0 or vrag_hp<=0:
!Переход на локацию смерти
if hp<=0:msg'You Loose!'>'death'
!Выводим сабж и отправляем на локацию, хранящуюся в переменной $loc
if vrag_hp<=0:msg'You Win!'>'<<$loc>>'
else
'Ваша жизнь: <<hp>>'
'Жизнь врага (<<$vrag_name>>): <<vrag_hp>>'
''
if obj'какос':
act'Кинуть какосом':
cla
r=rand(1,10)
if r=1:
'Вы попали какосом во врага! Истинный папуас!'
vrag_hp=vrag_hp-5
else
'Вы ожидаемо промахнулись мимо врага'
end
delobj'какос'
act'Далее':gt'battle'
end
end
act'Удврить':
cla
r=rand(1,10)
if r=1:
'Вы попадаете и наносите <<damage>> урона'
vrag_hp-=damage
else
'Вы промахиваетесь'
end
r=rand(1,100)
if r<=15:
'Краб бьет вас и отнимает <<vrag_damage>> ед. вашей жалкой жизни.'
hp-=vrag_damage
else
'Враг промахивается'
end
r=rand(1,100)
if r<=15:
'Краб бьет вас и отнимает <<vrag_damage>> ед. вашей жалкой жизни.'
hp-=vrag_damage
else
'Враг промахивается'
end
act'Далее':gt'battle'
end
end
Все довольно просто, если потратить чуть-чуть времени и разобраться. И дополнительные “фичи” (в рамках разумного) добавляются без проблем. Если охота чего-то посложнее, то тут уже каждый сам пилит свой велосипед. Посмотрите как реализованы боевые системы в других играх (коих тут не мало) и выберите наиболее подходящую. А если такой вдруг(!) не найдется, так хотя бы будете знать что и как нужно делать, чтобы получить определенный результат.
EL_RIO:
Посмотрите как реализованы боевые системы в других играх (коих тут не мало) и выберите наиболее подходящую
Тринити :D
vais:
И не хочу что бы было как в Дисах 3 которых убили большие цифры. ставить по 1000хп
А если делать как во вторых дисах?
Игнор поленейший… неужели никто ни разу не пытался прикрутить бесплатный открытый синтезатор речи??? в паре с гарнитурой это же находка просто.
BECEJIb4AK_Y:
Игнор поленейший… неужели никто ни разу не пытался прикрутить бесплатный открытый синтезатор речи??? в паре с гарнитурой это же находка просто.
Чтобы ты не чувствовал себя в игноре: лично я никаких упоминаний синтезаторов речи в сообществе не видел, хотя слышал были попытки адаптировать плеер для слепых. Это всё, что я знаю по этой теме (хотя я тут недавно, могу чего-то не знать).