RU

Помощь в создании "Асатамы III"

mkir #1281 16.01.2020 14:00 59 comments 15479 views

Спустя годы я все-таки вновь возвращаюсь к мысли создать еще более глобальную и интересную игру в этой серии, несмотря на то, что, возможно, это практически никому не интересно (а вдруг станет интересно?). (и вообще я так понимаю в целом в “сообществе любителей текстовых игр” тишина, или это поверхностное впечатление?)

Новую часть делаю медленно, но кропотливо и аккуратно, не совершая прошлых ошибок. Это касается и общих моментов касательно геймплея, и более удобного кода - чтобы не рябило в глазах и все было понятно, если придется к нему возвращаться спустя какое-то время. Упрощая то, что можно упростить, оптимизируя то, что можно оптимизировать и улучшая то, что требует доработки, как-то так.

Но уже появляются вопросы, с которыми нет сил биться совсем в одиночку. В частности, это касается моих гуманитарных мозгов. Код я осваивал самостоятельно и с чем сумел разобраться, то и использовал в первых двух частях. А с чем не сумел - так и осталось темным пятном.

Поэтому создаю эту тему не только по тому вопросу, который волнует сейчас, но и впрок, если появятся новые.

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 уже не опасен. Звучит просто, но как такой счетчик сделать, я не знаю)

Edited at 21.01.2020 10:58 (6 years ago)

Наверное, через 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

Последний из Гаяр Moderator 23.01.2020 15:06 (6 years ago)

Чисто теоретически можно. ASCII-графикой :P ;)

Aleks Versus Moderator 24.01.2020 07:53 (6 years ago)

А я как-то задумывался о том, чтобы разбить изображения на тайлы, им назначить случайные имена, а потом собирать изображение с помощью таблицы.))

Ещё на папках можно ставить атрибут “скрытый”, но это тоже защита от детей и стариков.))

Log in or Register to post comments.