FAO по плееру QSP
Здравствуйте всем. Я не новичок в программировании: язык хотя-бы Паскаль я знаю.
Я прочел мануал к программе, посмотрел уроки Нексуса. СПАСИБО большое. ДА: перетаскивать предметы, переименовывать персонажей из рандомных имен, вставлять картинки, менять тегами цвет текста.. Это я могу- понимаю.
И да, я примеры программ смотрел-видел. Спасибо, что разбираете и показваете.
Так вот вопрос-проблема именно в построении списков в плеере. Опять вернусь к теме с продажей животных.
В магазине купили животных- это действие на локации в МАГАЗИНЕ. А у нас же у фермера есть загоны, в которых надо сохранять животных хотя-бы по гендеру.
ЕСТЬ список- таблица на одной локации. Как перенести- скопировать или вставить её на другую локацию.
Но это надо делать проверку, например, по гендеру.
Да- динамические массивы. dynamic. Можно как-то вставить текстом.
Я вставил после покупки копировать массив в массив. Но у меня при переходе в локацию игра залипает.
файл с текстом локации прилогаю.voprosnik.txt
Poganec37:
Я не новичок в программировании
С этим я бы поспорил. Знать!=Уметь.
args[9]=args[9]
Что это?
args['race']=rand(0,1)
args['ver']=rand(20,50)
if args['ver']>=20 and args['ver']<=29:
args['variant']=0
elseif args['ver']>=37 and args['ver']<=50:
args['variant']=1
elseif args['ver']>=30 and args['ver']<=36:
args['variant']=2
end
Еще раз почитай что такое args.
! блок первого посещения
if $args[0]="":
Это блок любого посещения без аргументов. Блок первого посещения лучше через переменную делать.
Poganec37:
Так вот вопрос-проблема именно в построении списков в плеере.
Нет такого встроенного инструмента “работа со списками”. Списки ты сам задаешь в любом удобном для себя формате.
Poganec37:
ЕСТЬ список- таблица на одной локации. Как перенести- скопировать или вставить её на другую локацию.
Ничего не надо копировать\вставлять. Разделяй графику от данных.
Данные сохранены и не меняются, тебе просто нужно их вывести в двух разных местах. Тут даже dynamic не нужен.
Старые советы остаются в силе. Раздели на локации, станет гораздо проще. Дебагать тут нельзя, так что используй usercom или хотя-бы msg, p.
У меня локация грузится и работает, проверь переменные циклов, скорее всего бесконечный цикл где-то.
Poganec37,
каждое животное в магазине — это запись в массивах под одним индексом:
! это не код, просто для наглядности
$Trace[0]='кошка' & $Tgender[0]='жен' & Tprice[0]=80 & $Tmark[0]='продано' & ! кошка за 80
$Trace[1]='кошка' & $Tgender[1]='муж' & Tprice[1]=170 & $Tmark[1]='' & ! кот за 170
$Trace[2]='кошка' & $Tgender[2]='дети' & Tprice[2]=120 & $Tmark[2]='' & ! котёнок за 120
$Trace[3]='собака' & $Tgender[3]='муж' & Tprice[3]=170 & $Tmark[3]='продано' & ! кобель за 170
В следующий раз, когда игрок приходит в магазин, будет сформирован новый список.
В момент покупки (где $args[0]=‘buy’) нужно данные из этих массивов переносить в массивы, которые отвечают за запись животных в магазине.
Покажу на примере денег.
Переменная money — это деньги в кошельке. Как положить деньги в банк? Заводим новую переменную money_bank. Теперь кладём 100 рублей в банк:
money=money-100 & ! вынули сто из кошелька
money_bank=money_bank+100 & ! положили сто в банк
Так же и с животными. Была кошка, которую купил игрок, она записана в виде данных под одним индексом в четыре массива:
! это не код, просто для наглядности
$Trace[0]='кошка' & $Tgender[0]='жен' & Tprice[0]=80 & $Tmark[0]='продано'
Во время покупки нужно вписать её в массивы, соответствующие ферме. Например:
if $ARGS[0]="buy":
! блок покупки
if money>=Tprice[args[1]]:
money=money-Tprice[args[1]]
$Tmark[args[1]]="продано"
! закидываем кошку на ферму
$PhermRace[]=$Trace[args['i']]
$PhermGender[]=$Tgender[args['i']]
PhermPrice[]=Tprice[args['i']]
! выводим на экран список магазина
gs "магазин","print"
else
gs "магазин","print"
*pl "У вас нет денег"
end
end
Engineer,
Engineer:
Код:
args[9]=args[9]
Что это?
это инициализация локальной переменной, чтобы данные из args[’i’] не затёрли скажем args[0]. Элементы массивов, которые индексируются текстом, на самом деле индексируются числами, текстовый индекс как бы привязывается к числовому. Поэтому если ты пишешь:
mass['index']=100
*pl mass[0]
На экран выводится не 0, а 100
Engineer:
Еще раз почитай что такое args.
что ты имел ввиду? :D Что args предназначен для передачи аргументов? Таки да. Но только args с нулевого по восьмой. Поэтому args[9] инициирован первой строкой. Поэтому можно использовать args как локальные переменные с любыми индексами в дальнейшем.
Если что, код написан мной в результате переработки кода Poganec37. Все косяки — мои.
Насчёт глобальной переменной для учёта первого посещения ты прав, но не совсем. Нужно знать геймдизайн и как оно работает в остальной игре, чтобы предложить адекватное решение. Поскольку ни ты, ни я не видели остального кода игры, мы не можем утверждать, что наши решения верны.
Дело в том, что когда любой вид программирования доходит до массивов данных, то я начинаю тормозить в коде. И получаются ошибки. Заскок в данный момент был вот в чем: ARGS - локальная переменная, которая работает только на локации. А я думал, что массив, созданный через такую переменную, можно отображать на любой локации.
теперь я исправил код так: я вывел ПРИНТ-вывод на другую локацию. И теперь при обращении к ней в нужном месте печатается текст с наличием животных.
Например, при условии, что животное мужского пола- печатается в локации- клетки с мальчиками.
Спасибо за комментарий.
Aleks Versus:
это инициализация локальной переменной, чтобы данные из args[’i’] не затёрли скажем args[0]
Что-то я не понимаю. Когда ты попадаешь на локацию, все необходимые переменные с 0 по X (до 8) уже инициализированы, каким образом args[’i’] перезапишет их?
Aleks Versus:
что ты имел ввиду?
…
Поэтому можно использовать args как локальные переменные с любыми индексами в дальнейшем.
Как уже сказано выше, зачем использовать args, когда ему надо записать и использовать результат в других местах.
Aleks Versus:
Нужно знать геймдизайн и как оно работает в остальной игре, чтобы предложить адекватное решение.
Не надо знать геймдизайн, чтобы понять, что локальная переменная локации - худшее решение для записи о посещении этой локации.
Можно это сделать один раз, если ты на 100% уверен, что игрок попадет на локацию только из одного места. Там в переход засунуть аргумент, а после этого попадать на локацию без этого аргумента.
Использование обычной переменной объективно лучше, на что я и намекнул. А остальное уже сам.
magazin.txt
Пожалуйста, если я надоедаю, то простите меня.
Я сделал вывод на ферму.
На локации ферма смотрим клетки с животными: пусто. Теперь идём покупать в магазин. здесь список. Купить- продано. В списке-ферме должно отобразиться по гендерному признаку запись с животным.
1. я поставил проверку на пол. Получилось, что покупаем мужчину- в списке появляется не мужчина, а “дети” или женщины.
2. Если уйти из магазина, то можно посмотреть в клетки: получается случайно заполняется: или в мужской, или в женскй формируется список .
Я в коде разобрался. я понимаю, что, где находится. Но не правильно выполняется программа. не вижу, где ошибка. Все Энды я поставил.
То, что Алексей Шпак(Нексус) делает видео по программе- большой плюс. Но иногда в ФАО к программе нет нормального объяснения. Конечно, ФАО- это не полноценный учебник. Но чем больше ковыряешься в программе, тем больше возникает вопросов.
ДА- я затестил “Создаём простую Систему Предметов на QSP”. Но это не то, что нужно.
Engineer:
Что-то я не понимаю. Когда ты попадаешь на локацию, все необходимые переменные с 0 по X (до 8) уже инициализированы, каким образом args[’i’] перезапишет их?
Да, ты прав. Так оно и работает. Ничего не перезапишется.
Engineer:
Как уже сказано выше, зачем использовать args, когда ему надо записать и использовать результат в других местах.
Нет, из поставленной задачи я этого не увидел. К тому же используется только для локальных нужд.
Engineer:
Не надо знать геймдизайн, чтобы понять, что локальная переменная локации - худшее решение для записи о посещении этой локации.
Это не запись о посещении. Это запись о выполнении кода на момент входа. Если войти на локацию ещё раз, код сработает ещё раз. Именно так я и понял работу локации.
Ладно. Всё это оффтоп.
Poganec37:
Алексей Шпак(Нексус)
Poganec37,
я не Нексус. :D
А ошибка у тебя проста. Ты хотя может быть и проверяешь пол, но выводишь всё равно всех подряд.
*clr
*pl "Список девочек "
*p '<table border="1" cellpadding="10">'
args['i']=0
:for_printWim
! в следующей строке заменил название массива на правильное
if args['i']<arrsize('$PhermRace'):
! добавил действительно условие для проверки пола
if $PhermGender[args['i']]='жен':
*p '<tr>'
*p '<th>'+args['i']+'</th>'
*p '<th>'+$PhermRace[args['i']]+'</th>'
*p '<th>'+$PhermGender[args['i']]+'</th>'
*p '<th>'+PhermPrice[args['i']]+'</th>'
*p '<th><font color="#BC8F8F">Преобретено</font></th>'
*p '</tr>'
end
args['i']+=1
jump 'for_printWim'
end
*pl '</table>'
Engineer тебе правильно говорит. Отдельно работа с данными, отдельно вывод на экран. Ты же мешаешь всё в одно, и путаешься. Ну, здесь правда отдельные локации для вывода. ) Это правильно.
Я разделил мальчиков и девочек. Да- работает код:
(if $PhermGender[args[’i’]]=‘муж’) - это вывод мальчико в таблицу мужской части.
(if $PhermGender[args[’i’]]<>’муж’) - это женская часть. НЕ РАВНО, т.к. надо, чтобы ДЕТИ жили с мамами.
вот.
Есть проблема: код делит по гендеру в клетки. Да- формируется список, все нормально.
Купили детей. - в списке женщины. Это же не верно.
Если, скажем, я сделаю 3 части, которые будут отдельно равны значению. То все будет в мужской части..
Poganec37,
вывод - это вывод. Он ничего не означает. Ты просто отсеиваешь во время вывода по половому признаку и на экране отображается так, как ты хочешь. Но в переменных/массивах никак не записано, что одни животные — в одной клетке, другие — в другой.
Можешь сочетать условия, разве нет?
if $PhermGender[args['i']]='жен' or $PhermGender[args['i']]='дети':
Будут выводиться и девочки и дети.
1. Я попробовал делать код с if $PhermGender[args[’i’]]=‘жен’ or $PhermGender[args[’i’]]=‘дети’
если купить детей, а потом взрослых, то в списке-вольере женском появляются либо все дени, или все помечаются как женщины.
Ещё может сделаться так: купить мужчину- будет отображаться или ДЕТИ, или женщины.
2. Я разбил каждый гендер по локации и проверку на каждый гендер вывел отдельно.
Код проверки везде одинаковый, просто условия равенства по гендеру разные. Программа путает место вывода текста.
Можно это как-то пофиксить?
Poganec37,
я внимательно посмотрел твой код. Снова напутано с данными. Не знаю, как ты это делаешь. Ещё раз.
1. Животные в магазине помещаются в массивы $Trace $Tgender Tprice $Tmark
2. Животные на ферме помещаются в массивы $PhermRace $PhermGender PhermPrice $PhermMark (в необходимости последнего массива я не уверен.
Массивы сами по себе означают разные места расположения животных: магазин или ферма, — но животное не записывается в массивы фермы под тем же индексом, под каким записано в массивы магазина. Поэтому вывод информации в магазине снова неверный.
3. Ни в одном из этих массивов нет информации, в какой конкретно клетке на ферме сидит животное.
Напишу на почту.