Как сделать?
…
Не могу найти на форуме ничего про статы гг. Нету примера или может кто знает как прописать банальное здоровье тоже. Для этого я так понимаю надо создать отдельную локацию где прописать
$здоровье = 100
if $здоровье < 0:
ACT ‘Поражение’:
GOTO ‘Поражение’
END
END
Или типо того? Может у кого нибудь пример будет? Или статья.
Можно просто завести переменную для здоровья; health
Лично я делаю проверку на отдельной локации, так как у меня много чего проверять нужно. Проверку можно делать по разному. Вот мой, самый, простой код проверки;
if health<0:
gt 'game_over'
end
Loner,
перед числовыми переменными не нужно ставить знак $.
здоровье = 100
Все статы хранятся в переменных. Локация — это просто блок кода, который можно выполнить. Сама по себе локация ничего не хранит.
Обычно все начальные характеристики определяются на самой первой локации в игре:
здоровье=100
макс_здоровье=100
мана=100
стамина=100
Затем по ходу игры эти показатели могут изменяться. Опять же, работаем с переменными:
act "Перелезть через колючую проволоку":
здоровье=здоровье-15
goto "свобода"
end
Так же распространена практика вывода статистики в окно дополнительного описания. Для этого при изменении каждого параметра, окно доп описания очищается и выводятся все параметры заново:
act "Перелезть через колючую проволоку":
здоровье=здоровье-15
clear
pl "Здоровье: <<здоровье>>/<<макс_здоровье>>"
pl "Мана: <<мана>>"
pl "Стамина: <<стамина>>"
goto "свобода"
end
Но чтобы не писать целую гору кода, обычно пишут отдельную локацию, которая будет отвечать за вывод в окно доп описания:
# stat
! это код локации stat, отвечающей за вывод статистики в окно доп описания
clear
pl "Здоровье: <<здоровье>>/<<макс_здоровье>>"
pl "Мана: <<мана>>"
pl "Стамина: <<стамина>>"
- stat
# любая другая локация
act "Перелезть через колючую проволоку":
здоровье=здоровье-15
gosub 'stat' & ! обновляем статистику через вызов локации stat
goto "свобода"
end
- любая другая локация
Приветствую. Как можно придать текстовое значение цифровой переменной? Необходимо сделать описание персонажа, к примеру тип лица, который может менятся в зависимости от ивентов и действий. Пока додумался только до того что бы прописать в первой локации все начальные параметры персонажа сразу в текстовой переменной, а при изменении на какой либо локации, менять через изменение значения текстовой переменной. А хотелось бы что бы Тип лица был записан в цифровой переменной, к примеру Лицо=1, а в описании выводилось <<ЛицоГГ>> такое то.
Вопрос второй. Как вообще можно сделать характеристики персонажа? Отдельной служебной локацией? Тогда каким образом оформить обращение к ней, что бы в результате действия менялись параметры?
Заранее спасибо.
Piksha,
вопрос создания персонажа не то чтобы сложный, но весьма обширный. Его сложно осветить коротким ответом, так как этот вопрос напрямую зависит от навыков программирования и геймдизайна. Но пойдём по порядку.
Piksha:
Как можно придать текстовое значение цифровой переменной?
Никак. Переменные только хранят значения, и только определённого типа. Числовая переменная не может хранить текстовое значение, а текстовая переменная не может хранить числовое. Можно конвертировать значения, когда это возможно, с помощью функций. Подробнее можно прочитать в статье “Преобразование типов в QSP” (альтернативная ссылка).
Piksha:
хотелось бы что бы Тип лица был записан в цифровой переменной, к примеру Лицо=1, а в описании выводилось <<ЛицоГГ>> такое то.
А вот это сделать можно и даже очень легко. Более того, подобный пример приводился множество раз, и выглядит он так:
$название_месяца[1]='Январь'
$название_месяца[2]='Февраль'
$название_месяца[3]='Март'
$название_месяца[4]='Апрель'
$название_месяца[5]='Май'
$название_месяца[6]='Июнь'
$название_месяца[7]='Июль'
$название_месяца[8]='Август'
$название_месяца[9]='Сентябрь'
$название_месяца[10]='Октябрь'
$название_месяца[11]='Ноябрь'
$название_месяца[12]='Декабрь'
Как видишь, это массив, и в нём перечислены названия месяцев в двенадцати ячейках. При этом номера месяцев совпадают с номерами ячеек, в которых эти названия записаны. Таким образом можно удобно считать месяцы в различных формулах по числу, а вывод делать в текстовом виде.
текущий_месяц=7
*pl "Текущий месяц: "+$название_месяца[текущий_месяц]
То же самое можно сделать и для любых параметров, определять которые нужно числом, а выводить в виде текста:
! где-то заранее заполняем массив
$лицо[0]='Негр'
$лицо[1]='Белый'
$лицо[2]='Краснокожий'
$лицо[3]='Азиат'
$лицо[4]='Метис'
! теперь можем выбирать рассу, просто изменяя номер
*pl "Ваш персонаж <<$лицо[моё_лицо]>>."
act "Изменить расу":
моё_лицо+=1
if моё_лицо>4: моё_лицо=0
goto $curloc & ! возвращение на текущую локацию
end
Нужно помнить, что нумерация ячеек массива всегда начинается с нуля!
Теперь что касается вопроса
Piksha:
Как вообще можно сделать характеристики персонажа?
Это очень невнятный вопрос. Или очень размытый. Все характеристики персонажа хранятся в переменных. “Сделать характеристики” в моём понимании означает “поместить нужные значения в переменные”. Как правило, все характеристики задаются в самом начале игры. То есть всем необходимым переменным прописываются необходимые значения:
$раса="Орк"
возраст=23
вес=125
рост=189
$имя="Грог'Бул"
Что затем можно делать с этими данными? Их можно выводить на экран, и их можно изменять. Следует помнить, что это два разных процесса. Если ты изменяешь значения переменных, это ещё не значит, что ты увидишь их на экране. И если ты выводишь их на экран, это не влияет на их значения.
Чтобы вывести все значения переменных в окно дополнительного описания, нужно использовать соответствующие операторы вывода текста. Например, так:
clr & ! очищаем окно доп. описания
pl "<<$имя>> (<<$раса>>)
возраст: <<возраст>>
вес: <<вес>>
рост: <<рост>>"
Скорее всего тебе так придётся выводить значения множество раз, поэтому чтобы не писать весь этот код, можно вынести его в отдельную локацию, а уже эту локацию вызывать в удобном для тебя месте. Например, я вынес этот код в локацию “stat” и теперь могу обновить информацию на экране, просто вызвав локацию “stat”:
gosub 'stat'
Но, как я уже говорил, вывод на экран - это один процесс. А вот изменение значений - другой. Поэтому если тебе нужно, чтобы значение не только изменялось, но и обновлялось на экране, нужно после изменения значения стереть с экрана старую информацию (в нашем коде за это отвечает команда clr), а затем вывести новую.
act "Съесть один килограмм песку":
вес=вес+1 & ! изменяем значение
gosub 'stat' & ! обновляем информацию на экране
end
Благодарю. Еще вопрос -
Для создания времени, использовал код из гайда
Spoiler
! 2440 минут = 1 день + 16 часов + 40 минут
время = 2440
дни = время / (24*60)
часы = (время - дни*24*60) / 60
минуты = время - часы*60 - дни*24*60
*PL ‘Время: <<дни>> день, <<часы>>:<<минуты>>.’
Но нигде не нашел обьяснения, каким образом применить время не на одной локации, а что бы оно работало на всём протяжении игры, и менялось в зависимости от действий. Логика подсказывает прописать данный код в отдельной служебной локации, и при каждом изменении времени (к примеру переходе между локациями) обращаться к служебке. Но каким образом это сделать?
Команду gusub понимаю очень смутно, каким образом она работает?
Piksha,
Есть служебная локация $ONNEWLOC. Она срабатывает автоматически при каждом обновлении локации. Тебе нужно создать локацию и инициализировать ее на стартовой локации.
$ONNEWLOC=локация - имя локации любое.
Далее, создай локацию с этим именем и помести туда код времени.
Скажу сразу, т.к. $ONNEWLOC используется при каждом обновлении, то чем больше кода туда запихнешь, тем больше будет тугодумить плеер.
Команда gusub заходит на локацию читает и выполняет на той локации код, но переход на ту локацию не осуществляется. Ты остаешься на исходной локации, вот и все. Т.е., вместо gs ты можешь вставлять на исходую локацию тот код, который подгружается с целевой локации. Но, тогда придется на каждой локации дублировать один и тот же код по сто раз, потому и используют gs.
Piksha:
Благодарю. Еще вопрос -
Для создания времени, использовал код из гайдаНо нигде не нашел обьяснения, каким образом применить время не на одной локации, а что бы оно работало на всём протяжении игры, и менялось в зависимости от действий. Логика подсказывает прописать данный код в отдельной служебной локации, и при каждом изменении времени (к примеру переходе между локациями) обращаться к служебке…
Приветствую. Приведенный код никак не будет менять время. При перемещении меняй самое малое значение (минут достаточно), а после - уже отображай. Ты можешь сделать одну локацию для отображения, одну для изменения, а можешь прописывать сразу в действиях.
Лично я бы посоветовал набросать сам “алгоритм” на бумаге и осмыслить “что” делать и “как” реализовать.
Написание игр состоит из оперирования переменными и их значением. Шаблонизировать очень полезно для средних и больших проектов. Однако если на данном этапе у тебя трудности - напиши что-то маленькое. По-экспериментируй, закрепи знания. Это и правда полезно и на практике много вопросов решаться сами собой. Открой справку, подумай для чего это использовать, пробегись по функциям, операторам - это даст понимание того, что делаешь и что за что отвечает.
И главное - не бойся ошибаться.
HronoS.
HronoStranger,
Этот код предназначен для подсчета времени из переменной ‘время’, т.е. ты руками прописываешь время+=10, обращаешься к вышеуказанному коду, и он тебе выводит дни, часы, минуты. Правильность я не проверял.
Большое спасибо за ответы! Разобрался.
Привет, уважаемые знатоки! Мне при написании квеста очень сильно надоело прописывать массив каждого “модуля” и условия для каждого “модуля” (я пишу что-то вроде симулятора капсулы жизнеобеспечения)
Помогите пожалуйста, кто знает как задать сразу переменные и условия для одного и того же массива? Чтобы не писать вот этот вагон кода:
$module[0]='Кислородный модуль'
$mod_disc[0]='(Описание модуля)'
modulemhp[0]=6
mod_capacity[0]=200
modulecost[0]=1000
$module[1]='Капсульный щит'
$mod_disc[1]=''
modulemhp[1]=2
mod_capacity[1]=250
modulecost[1]=5000
$module[2]='Генератор'
$mod_disc[2]=''
modulemhp[2]=4
mod_capacity[2]=1500
modulecost[2]=750
$module[3]='Радиостанция'
$mod_disc[3]=''
modulemhp[3]=2
mod_capacity[3]=250
modulecost[3]=2000
$module[4]='Климат-модуль'
$mod_disc[4]=''
modulemhp[4]=2
mod_capacity[4]=40
modulecost[4]=1600
$module[5]='Клешня'
$mod_disc[5]=''
modulemhp[5]=2
mod_capacity[5]=0
modulecost[5]=500
$module[6]='Электрошок'
$mod_disc[6]=''
modulemhp[6]=2
mod_capacity[6]=5
modulecost[6]=500
$module[6]='Транспортный Модуль'
$mod_disc[6]=''
modulemhp[6]=4
mod_capacity[6]=12
modulecost[6]=3000
! -------- локация счетчик -------
if modulehp[0]=modulemhp[0]: $modstat[0]='<font color=rgb(100,250,100)>Работает</font>'
if modulehp[0]<=modulemhp[0]/2: $modstat[0]='<font color=rgb(190,160,80)>Поврежден</font>'
if modulehp[0]=0: $modstat[0]='<font color=rgb(250,70,70)>Отсутствует</font>'
if modulehp[1]=modulemhp[1]: $modstat[1]='<font color=rgb(100,250,100)>Работает</font>'
if modulehp[1]<=modulemhp[1]/2: $modstat[1]='<font color=rgb(190,160,80)>Поврежден</font>'
if modulehp[1]=0: $modstat[1]='<font color=rgb(250,70,70)>Отсутствует</font>'
if modulehp[2]=modulemhp[2]: $modstat[2]='<font color=rgb(100,250,100)>Работает</font>'
if modulehp[2]<=modulemhp[2]/2: $modstat[2]='<font color=rgb(190,160,80)>Поврежден</font>'
if modulehp[2]=0: $modstat[2]='<font color=rgb(250,70,70)>Отсутствует</font>'
if modulehp[3]=modulemhp[3]: $modstat[3]='<font color=rgb(100,250,100)>Работает</font>'
if modulehp[3]<=modulemhp[3]/2: $modstat[3]='<font color=rgb(190,160,80)>Поврежден</font>'
if modulehp[3]=0: $modstat[3]='<font color=rgb(250,70,70)>Отсутствует</font>'
if modulehp[4]=modulemhp[4]: $modstat[4]='<font color=rgb(100,250,100)>Работает</font>'
if modulehp[4]<=modulemhp[4]/2: $modstat[4]='<font color=rgb(190,160,80)>Поврежден</font>'
if modulehp[4]=0: $modstat[4]='<font color=rgb(250,70,70)>Отсутствует</font>'
! и так далее............
! я хотел сделать так, но не сработало:
if modulehp[]=modulemhp[]: $modstat[]='<font color=rgb(100,250,100)>Работает</font>'
if modulehp[]<=modulemhp[]/2: $modstat[]='<font color=rgb(190,160,80)>Поврежден</font>'
if modulehp[]=0: $modstat[]='<font color=rgb(250,70,70)>Отсутствует</font>'
Дембелёк,
Заполнить массив проще вряд ли получится. Если нет алгоритма, то лучше так, как есть. Оно удобнее, в том смысле, что ты наглядно представляешь все характеристики и можешь их балансировать.
Дамир Белялов,
a=0
a_max=arrsize'$module'
:mark
if modulehp[a]=modulemhp[a]: $modstat[a]='<font color=rgb(100,250,100)>Работает</font>'
if modulehp[a]<=modulemhp[a]/2: $modstat[a]='<font color=rgb(190,160,80)>Поврежден</font>'
if modulehp[a]=0: $modstat[a]='<font color=rgb(250,70,70)>Отсутствует</font>'
a+=1
if a<a_max:jump'mark'
Понятно, спасибо и на этом)
Дамир Белялов,
Приветствую, заранее желаю удачной симуляции.
Некоторое время назад я экспериментировал с самой банальной, поверхностной симуляцией космического корабля.
Так вот, можно шаблонизировать алгоритмы, но базы данных всегда приходится писать вручную. Вы можете задать статус “кво” на начале, с дальнейшей коррекцией при изменении. Однако изначальную точку только руками.
С уважением,
HronoS.