Помощь в создании "Асатамы III"
Спустя годы я все-таки вновь возвращаюсь к мысли создать еще более глобальную и интересную игру в этой серии, несмотря на то, что, возможно, это практически никому не интересно (а вдруг станет интересно?). (и вообще я так понимаю в целом в “сообществе любителей текстовых игр” тишина, или это поверхностное впечатление?)
Новую часть делаю медленно, но кропотливо и аккуратно, не совершая прошлых ошибок. Это касается и общих моментов касательно геймплея, и более удобного кода - чтобы не рябило в глазах и все было понятно, если придется к нему возвращаться спустя какое-то время. Упрощая то, что можно упростить, оптимизируя то, что можно оптимизировать и улучшая то, что требует доработки, как-то так.
Но уже появляются вопросы, с которыми нет сил биться совсем в одиночку. В частности, это касается моих гуманитарных мозгов. Код я осваивал самостоятельно и с чем сумел разобраться, то и использовал в первых двух частях. А с чем не сумел - так и осталось темным пятном.
Поэтому создаю эту тему не только по тому вопросу, который волнует сейчас, но и впрок, если появятся новые.
1. Первый вопрос касается моего главного пробела в языке qsp, из-за которого для обеих частей я придумал собственный большой костыль, который сейчас уже кажется слишком неудобным. Это массивы. Я много раз пытался их освоить и уже не пытаюсь. Поэтому прошу просто подсказать, что и как писать, чтобы реализовать конкретную идею.
ЧТО ИМЕЕМ
1. Есть переменная $mon=‘’ - это имя монстра.
Когда игрок нападает на монстра, мы присваиваем ему имя, а затем переходим в служебную одноименную локацию gs ‘mon’
В ней содержатся все данные о любом монстре, выглядят это так:
if $mon = 'Крыса':
hp = 10
st = 10
... и так далее
end
Причем данных, особенно если монстр непростой бывает очень много, до 30+ строчек получается.
2 Когда игрок находится в свободном плавании, он рискует столкнуться со случайным монстром. Это зависит от типа локации “Лес”, “Поле”, “Горы” и т.д., и сложности конкретного отрезка местности - “1, 2, 3…”. Т.е. если игрок в лесу и сложность 1, он будет встречать всяких зайчиков и оленей и в худшем случае какого-нибудь волка повстречает. Если он в горах и сложность максимальная, то встретит какого-нибудь убер-страшного горного великана. А некоторые монстры могут встречаться сразу в нескольких типах местностях - разбойник, например. Также некоторые монстры могут встречаться на нескольких уровнях сложности. Т.е. мы не обязательно столкнемся с тем горным великаном, вполне, что за поворотом затесался горный козлик, мирно жующий травку. +какие монстры при одинаковых условиях встречаются реже или чаще остальных.
Сам код в этом месте определения монстра получился у меня жутко неудобным. Я просто на отдельной локации “checkmon” настраивал множество условий и вероятностей, типа:
if местность = лес:
if сложность = 1:
х=rand(1,12)
if x < 2:
$mon='Заяц'
end
if x > 1 and x < 5:
$mon='Разбойник'
if rand(1,100) > 80:
$mon = 'Матерый разбойник'
end
end
if x > 4:
$mon = 'Волк'
end
if x = 12:
$mon = 'Медведь'
end
end
if сложность = 2:
!то же самое, но если хотим чтобы какой-нибудь заяц встречался и здесь, то также вручную добавляем и его:)
end
end
Итого, при том что монстров очень много и условий то же, все это со временем превратилось в кашу.
ЧТО ХОЧЕТСЯ РЕАЛИЗОВАТЬ
Я представляю себе это так: есть некий пакет с именами монстров и с их “полевыми характеристиками”, типа каким местностям они свойственны, какая у них максимальная и минимальная планка сложности и какой уровень редкости.
Когда игрок должен столкнуться со случайным монстром он одной командой просто получает из этого пакета своего монстра, - т.е. оттуда сразу же исключается те, кому местность, в которой находится игрок не по душе, те, кому нынешняя сложность не подходит и из оставшихся рэндомно кто-нибудь вытягивается, но у кого-то в силу редкости шанс на вытягивание ниже или выше.
Вот как такой пакет “написать” без полного погружения меня в мир массивов :)
И какая должна быть команда в момент столкновения игрока с монстром и может ли она уместиться в одну строчку?
mkir:
Убрал все-таи эту единичку -1
Ты прав, у меня с этой единичкой всегда проблемы)), но в c=rand(0,arrsize(’temp’)-1) она точно нужна).
mkir:
А со сложностями ничего подобного. Какие указаны, такие и есть.
Конечно, все и должно работать. Просто при таком подходе, ты не сможешь сделать так, чтоб у тебя волки на первом уровне холмов не появлялись. Если уберешь из списка первый уровень сложности, то волки исчезнут со всех локаций первого уровня сложности. Но если тебя все устраивает, то я рад, обращайся, если что.
Ну, вот я сделал так -
$mname[0]=‘Волк’
$terra_area_a[0]=‘Леса’
$terra_area_b[0]=‘Болота’
$terra_area_c[0]=‘Холмы’
lvl_a[0]=3
и теперь волки только на 3-м уровне, проверил
mkir:
Ну, вот я сделал так -
$mname[0]=‘Волк’
$terra_area_a[0]=‘Леса’
$terra_area_b[0]=‘Болота’
$terra_area_c[0]=‘Холмы’
lvl_a[0]=3и теперь волки только на 3-м уровне, проверил
Все правильно.
А теперь попробуй сделать так, чтоб волк появлялся на первом уровне леса, а на первом уровне болот и холмов не появлялся, при этом, волк должен появляться на втором уровне всех локаций и на третьем уровне он должен быть только в холмах.
Я тут подумал, может тебе будет проще инициализировать список мобов в самой локации и там же производить выборку? Но, конечно, это уже будет не один список имен, а куча маленьких списков для каждой локации. Пропишешь массив имен, а потом только выберешь через рандом с вероятностью, как ты делал раньше.
dmvikar:
Пропишешь массив имен, а потом только выберешь через рандом с вероятностью, как ты делал раньше.
Да даже имена не надо инициализировать, просто будет:
a=rand(1,100)
if a>0 and a<=10:$mon='Медведь'
if a>10 and a<=25:$mon='Разбойник'
if a>25 and a<=60:$mon='Волк'
if a>60 and a<=100:$mon='Заяц'
Новый вопрос.
Хочу сделать так, чтобы если игрок определенного монстра убивал несколько раз и на победу, например, три раза подряд выходил с полным HP, то в следующей встрече с тем же монстром он убивался или убегал автоматически, а игрок получал бы короткое оповещение о том как он легко разделался с надоедливым $mon взял лут, опыт и пошел дальше, или о том как трусливый $mon убрался от вас подальше.
Т.е. : как запоминать что-то подобное для отдельной переменной $mon, не делая это вручную, т.к. потенциально таких монстров может быть много? Как, запоминая, одних монстров записывать в крыс (умирают с одного плевка), других в бандитов (улепетывают) ?
Допустим, на локации победы над монстром, сверяем, полное ли HP у игрока. Затем даем единичку к счетчику такого-то монстра. Если hp неполное то счетчик такого-то монстра обнуляется; при встрече с $mon проходит проверка этого счетчика и если он равен 3, $mon уже не опасен. Звучит просто, но как такой счетчик сделать, я не знаю)
Наверное, через args.
Ты скажи, какой код используешь в начале битвы. т.е., как ты передаешь имя монстра в локацию боя.
Пока пришла в голову такая конструкция
if hp=полное:
счетчик[$mon]+=1
else
счетчик[$mon]=0
end
Соответственно, потом только проверку счетчика перед боем внедрить.
Передаю так:
Перед боем присваивается какой будет монстр
$mon = ‘Крыса’
Потом на отдельной локации соответственно имени идет присвоение всех характеристик и абилок монстра
Gs ‘mon’
Т.к. этот gs будет проверяться каждый раунд, то перед боем идет еще присвоение начальных но изменяемых в ходе боя характеристик, типа:
Hpenem = starthpenem
Потом уже переход в бой:
Gt ‘battle’
Я правильно понял, что с такой формулой доствточно в начале боя сделать проверку после gs?
If счетчик[$mon] > 3
И на каждое имя таким образом будет отдельный счет?
Думаю, тогда с разграничением по типу “сбежал или быстро помер” будет уже проще - добавить в gs на каждре имя соответствующий тип 1 или 0 и тогда что-то вроде:
If счетчик[$mon] > 3:
If deadorrun = 0:
Else
End
End
Проверку счетчик[$mon] ты можешь делать сразу, после присвоения значения $mon, никаких gs для этого не нужно, только почему >, если ты после 3х решил, так у тебя после 4х получится.
Gs ‘mon’ будет каждый раунд выполняться? Оно точно необходимо, эта локация у тебя должно быть немерено огромна…
Кстати, на каком варианте генерации монстров ты остановился?
Ну в общем поверчу.
Все-таки не до, а после, чтобы узнать “убегает или умирает”. Еще могут быть и монстры, для которых такой счетчик может быть исключением и жто тоже строчка в характеристиках.
Каждый раунд, т.к. во время боя может произойти много модификаций - изменения навыков, игнорирование и т.д. локация большая, но это вроде не вызывало проблем.
3-4 - не принципиально, это ж еще как пример только.
Остановился на простой генерации которая зависит только от типа местности и сложности, к вероятностям тогда вернусь позже, если смогу осилить)
Большое спасибо за помощь!
mkir:
Остановился на простой генерации которая зависит только от типа местности и сложности, к вероятностям тогда вернусь позже, если смогу осилить)
А этот вариант смотрел? Мне кажется, он более эффективен будет.
a=rand(1,100)
if a>0 and a<=10:$mon='Медведь'
if a>10 and a<=25:$mon='Разбойник'
if a>25 and a<=60:$mon='Волк'
if a>60 and a<=100:$mon='Заяц'
Если все-таки будешь использовать первый вариант, то посмотри, может тебе не нужно использовать условие уровня локации, а достаточно будет только имени. У тебя локации реальные?, т.е. 1 локация в кугене соответствует локации в игре или в одной локации кугена описана группа локаций?
В любом случае, можно избавится от переменной уровня. В первом случае просто используешь curloc, как и раньше, а во втором, вместо сurloc пропишешь имя по условию.
Этот вариант и был у меня изначально)
Нет, локация-шаблон для отыгрыша разных территорий одна, а самих территорий подразумевается, что очень много - они и различаются по типу местности и прочему, отчего на них можно встретить то и другое, сложнее или проще совершать какие-то действия и т.д.
Возможно ли как-то скрыть от пользователя папки с картинками, звуками и проч.? Чтобы был доступен только исполняемый файл, а медиафайлы, используемые в игре, открывались только в ней?
Отдельное приложение надо писать. Я видел у конкурсантов exe, но даже там картинки были отдельно в папках.
Ты можешь сделать их скрытыми, как для виндовс), но вряд ли тебе нужно именно это). Еще можно поудалять расширения медиафайлов, но это такая себе защита, от детей и пенсионеров скрыть поможет.
Можешь особо изощренный вариант попробовать - изменить расширения файла на какую-нить страшную)), типа .ttz
Чисто теоретически можно. ASCII-графикой :P ;)
А я как-то задумывался о том, чтобы разбить изображения на тайлы, им назначить случайные имена, а потом собирать изображение с помощью таблицы.))
Ещё на папках можно ставить атрибут “скрытый”, но это тоже защита от детей и стариков.))