Как сделать?
…
Вопрос такой заинтересовал
Вот есть DYNEVAL и FUNC
FUNC вызывает локацию для обработки с возвратом результата, а DYNEVAL вызывает переменную с возвратом результата
Но вот не могу понять, когда стоит вызывать ту или иную функцию?
Torgald,
если нет прямой необходимости использовать dyneval - используй func.
Torgald,
Может это не интересно, но поделюсь своим опытом.
FUNC
Spoiler
Есть довольно плохой (на мое мнение) метод с использованием локации в качестве шаблона. Удобно, тогда можно обработать два-три десятка строк, провести все сопоставления, скомпоновать переменные… в таком случае можно использовать FUNC.
Вообще, можно использовать и GOSUB, но если тебе нужно вернуть значение для дальнейших вычислений, то FUNC незаменим.
К примеру, если мы хотим сгенерировать 24 пингвинов через цикл.
Мы их генерируем и возвращаем счетчик циклов.
Далее, мы можем вернувшееся значение поделить на три.
И сгенерировать в три раза меньше северных медведей.
Удобство в том, что можно поручить игроку ввод количества пингвидей, а код уже сам всё высчитает.
Таким образом, FUNC хороша при дополнительном исчислении.
Ваш покорный слуга, правда, использует его вместо GS, это плохой тон, но в целом, можно использовать и так.
Про DYNEVAL не скажу. Он отлично принимает формулы в текстовом виде, но лично для себя не нашел применения, эта функция обходит меня стороной..
Вообще, советую перейти в дискорд. Там быстро и более оживленно отвечают на вопросы.
Если исполняемый код меняется от аргументов, используй DYNEVAL. Если исполняемый код статичный и всегда отрабатывает одинаково, проще использовать FUNC.
DYNEVAL необходим только для обработки динамического кода. Например, если нужно присвоить переменной результат динамического вычисления.
Пример задачи: функция должна получить название переменной, взять из нее значение и обработать, а саму переменную очистить.
В данном случае FUNC не поможет, так как название переменной динамическое, соответственно исполняемый код изменится. DYNAMIC также не поможет если записывать значение переменной в локальный аргумент ARGS, так как DYNAMIC использует свои личные аргументы ARGS. Необходим DYNEVAL.
переменная = 50
gs "тест", "переменная"
#тест
! получаем значение, args[1] становится =50
args[1] = dyneval("result = <<$args[0]>>")
! обрабатываем как угодно, это лишь пример
$какой-то_важный_массив[args[1]] = "значение обработано"
! чистим переменную
killvar $args[0]
! (dynamic "args[1] = <<$args[0]>>") в данном случае не отработает, потому что dynamic запишет СВОЙ аргумент args[1], а не аргумент локации, в которой он был вызван.
Спасибо за ответы)
Здравствуйте, прошелся по учебнику для новичков в разработке текстовых игр. Там был пример создания и запоминания имени(в том случае планеты). По такому же принципу можно ведь сделать ввод имени гг. Но как сделать так что бы после ввода действие ввода имени пропало?
Loner,
if $name='':
act "Как вас зовут?":
$tname=$input("Укажите имя:")
! тут можно встроить проверку, что ввёл игрок
$name=$tname
goto $curloc
end
end
Спасибо, всё работает.
Не могу найти на форуме ничего про статы гг. Нету примера или может кто знает как прописать банальное здоровье тоже. Для этого я так понимаю надо создать отдельную локацию где прописать
$здоровье = 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.