Как сделать?
…
Тогда нафига тебе JUMP?
Я хотел попробовать. Меня документация qsp в интернете подучила, что так можно. Я его убрал, проблема с динамиком не исчезла.
Вполне себе:
И сформируй строку для Динамика отдельно!
Код вынести в отдельную текстовую переменную? Я так делал, когда самостоятельно искал решение проблемы . Проблема не решилась:(
Вот как сделал бы я:
if arrsize('npconloc') >0:
g=arrsize('npconloc')
loop i= 0 while i<g step i+=1:
npc=npconloc[i]
$DinStr="" &! Очищаем строку
$DinStr+="act 'Поговорить с <<$name[npc]>> <<$surname[npc]>>':
if race[npc]=0:
cla
'<center><img src =""new/orcface.jpg"" ></center>'
if agro[npc]=1:
'Дерёмся'
act 'Погнали': gt 'orcfight'
else
act 'уйти': gt '<<$loc>>'
end
else
cla
'<center> <img src =""new/202.jpg"" ></center>'
if agro[npc]=1:
'Дерёмся'
act 'Погнали': gt 'humanfight'
else
act 'уйти': gt '<<$loc>>'
end
end
end"
Dinamic('<<$DinStr>>')
end
end
Из твоего кода следует смотреть формирование массива agro[n]
А вот этот динамик вообще лишний:
$gend = {
npc=i
gs 'namegen'
gs 'surnamegen'
agro[npc] = rand(0,1)
race[npc] =rand(0,1)
n=rand(1,7)
locx[npc]=n
}
loop i=1 while i<=10 step i+=1:
dynamic $gend
end
Упрости. Внеси все в цикл и не делай себе голову беременной!
Да, и потом мне кажется, что тебе надо формировать массив с “0”-го индекса
loop i=0 while i<=9 step i+=1:
gs 'namegen'
gs 'surnamegen'
agro[i] = rand(0,1)
race[i] = rand(0,1)
locx[i] = rand(1,7)
end
Вполне себе:
Из твоего кода следует смотреть формирование массива agro[n]
.Я попробовал сделать со строкой. Проблема осталась :( Я также попробовал сделать без killvar ‘npconloc’. Нпс начинают таскаться из локации в локацию, их имена остаются привязанными к ним, а вот всё остальное меняется. Например в одной локации все орки и все готовы к драке, но при переходе на другую локацию они тут-же становятся такими как местные. Мой код каким-то образом раздаёт всем имена, но все остальные параметры генерируются 1 раз на всю локацию и раздаются всем как методичка. Я плохо организовал вот эту проверку индекса для race и agro. Она видимо проверяется у кого-то одного или что-такое.
Вполне себе:
Упрости. Внеси все в цикл и не делай себе голову беременной!
Да, и потом мне кажется, что тебе надо формировать массив с “0”-го индекса
Наверное, можно и без динамика, я не до конца понимаю, что я делаю. Я как обезъяна с гранатой.
Индекс 0 я думал зарезервировать под главного героя и вводить вручную. Мне казалось удобным хранить его параметры в тех же массивах. Это как-то ломает генерацию?
У тебя ломается не генерация, а логика. Ты генеришь с 1-ого индекса, а читаешь с 0-го. Не забивай себе сейчас этим голову. Делай все максимально просто. Чем гуще дебри, тем меньше видно леса! Я упростил твой код (до известной степени) и все (как мне кажется), встало на место.
!Формирование массива из 10 персон. Распределение по случайно локации (от 1 до 7)
loop i=0 while i<10 step i+=1:
gs 'namegen' & ! Генератор Имени
gs 'surnamegen' & ! Генератор Фамилии
agro[npc] = rand(0,1) & ! Готовность
race[npc] = rand(0,1) & ! Раса
locx[npc] = rand(1,7) & ! Случайная локация
end
Код локации для проверки присутствия Непися
g=arrsize ('locx')
loop i=0 while i<g
j = arrpos('locx',x,i) & ! Где "Х" - номер локации Непися
if j>=0 :
npconloc[]=j & ! Если Непись в локации, то в список заходит его номер (Номер Непися), т.е. запросто может быть и "0"
i=j+1 & ! Смещаем поиск на следующую позицию
else
i=g & ! Больше местов нет. Завершаем цикл.
end
end
g=arrsize('npconloc')
if g >0:
loop i= 0 while i<g step i+=1:
npc=npconloc[i]
act 'Поговорить с <<$name[npc]>> <<$surname[npc]>>':
if race[npc]=0:
CLA
'<center><img src =""new/orcface.jpg"" ></center>'
if agro[npc] =1:
'Дерёмся'
act 'Погнали': gt 'orcfight'
else
act 'Уйти': gt '<<$loc>>'
end
else
CLA
'<center> <img src =""new/202.jpg"" ></center>'
if agro[npc] =1:
'Дерёмся'
act 'Погнали': gt 'humanfight'
else
act 'Уйти': gt '<<$loc>>'
end
end
end
end
end
killvar 'npconloc'
И вот теперь самое важное и нужное: Это переходы на локацию <<$loc>> и на файтинг. Нет возврата в меню на шаг выше. Если $loc это таже локация, то рекурсивный вызов может нарушать счетчики. Для этого надо передавать в локацию параметр “шага”. Я, например, делаю это так: gt ($Loc, $Param1, $Param2, $Param3…) А уже в теле обрабатываю этот параметр как $Args[n]
Кроме того у тебя killvar ‘npconloc’ может вообще не работать, так как “Нет возврата в меню на шаг выше. “. Поэтому цикл npconloc[]=j может повторяться до бесконечности. Попробуй киллварить массив перед его новым формированием.
g=arrsize ('locx')
killvar 'npconloc' !!!!!
loop i=0 while i<g
j = arrpos('locx',x,i) & ! Где "Х" - номер локации Непися
if j>=0 :
npconloc[]=j & ! Если Непись в локации, то в список заходит его номер (Номер Непися), т.е. запросто может быть и "0"
i=j+1 & ! Смещаем поиск на следующую позицию
else
i=g & ! Больше местов нет. Завершаем цикл.
end
end
PS. В данном, конкретном случае тебе даже Динамик не нужен. Вот пример формирования ступенчатого меню действий c обязательным возвратом на уровень выше. Так можно формировать меню Действий любой сложности и вложенности. А можно разбить на отдельные локации:
#Меню боя
If $Args[0]='Главное' :
CLA
!Проверка на Призыв Волка
If @Возможно_Призвать=On :
Act '<font color=<<$Colors[ФЛТ]>>>Амулет Призыва Волка |►</font>' :
CLA
If @GetPercent(Fighter_1['РеалВНС'],Fighter_1['Выносливость'])>=20 And @GetPercent(Fighter_1['РеалМан'],Fighter_1['Мана'])>=20 :
Act 'Призыв Волка. На минималках |<b><font color=<<$Colors[ВНС]>>>ВНС-20%</font></b> | <b><font color=<<$Colors[МАН]>>>МАН-20%</font></b>|' : $ArrWar[]=@Призыв_Волка('Fighter_1',20) & @Бой('Враг')
End
If @GetPercent(Fighter_1['РеалВНС'],Fighter_1['Выносливость'])>=30 And @GetPercent(Fighter_1['РеалМан'],Fighter_1['Мана'])>=30 :
Act 'Призыв Волка. По-простому |<b><font color=<<$Colors[ВНС]>>>ВНС-30%</font></b> | <b><font color=<<$Colors[МАН]>>>МАН-30%</font></b>|' : $ArrWar[]=@Призыв_Волка('Fighter_1',30) & @Бой('Враг')
End
If @GetPercent(Fighter_1['РеалВНС'],Fighter_1['Выносливость'])>=40 And @GetPercent(Fighter_1['РеалМан'],Fighter_1['Мана'])>=40 :
Act 'Призыв Волка. Пацанский подгон |<b><font color=<<$Colors[ВНС]>>>ВНС-40%</font></b> | <b><font color=<<$Colors[МАН]>>>МАН-40%</font></b>|' : $ArrWar[]=@Призыв_Волка('Fighter_1',40) & @Бой('Враг')
End
If @GetPercent(Fighter_1['РеалВНС'],Fighter_1['Выносливость'])>=50 And @GetPercent(Fighter_1['РеалМан'],Fighter_1['Мана'])>=50 :
Act 'Призыв Волка. Все по-взросломцу |<b><font color=<<$Colors[ВНС]>>>ВНС-50%</font></b> | <b><font color=<<$Colors[МАН]>>>МАН-50%</font></b>|' : $ArrWar[]=@Призыв_Волка('Fighter_1',50) & @Бой('Враг')
End
Act '<font color=<<$Colors[ФЛТ]>>>Назад ◄|</font>' : @Меню_Боя('Главное')
End
End
If Волк['Призыв']=On :
Act '<font color=<<$Colors[ФЛТ]>>>Умения призванного волка |►</font>' :
CLA
Act '<font color=<<$Colors[ФЛТ]>>>Назад ◄|</font>' : @Меню_Боя('Главное')
End
End
If @Атака('Разрешить','Fighter_1','Fighter_2')=On : Act '<<@Атака(''Меню'',''Fighter_1'')>>' : @Атака('Удар','Fighter_1','Fighter_2') & @Бой('Враг')
If @Искры('Разрешить','Fighter_1','Fighter_2')=On : Act '<<@Искры(''Меню'',''Fighter_1'')>>' : @Искры('Удар','Fighter_1','Fighter_2') & @Бой('Враг')
If @Сильный('Разрешить','Fighter_1','Fighter_2')=On : Act '<<@Сильный(''Меню'',''Fighter_1'')>>' : @Сильный('Удар','Fighter_1','Fighter_2') & @Бой('Враг')
If @Подсечка('Разрешить','Fighter_1','Fighter_2')=On : Act '<<@Подсечка(''Меню'',''Fighter_1'')>>' : @Подсечка('Удар','Fighter_1','Fighter_2') & @Бой('Враг')
If Fighter_1['СилаДуха']>0 :
Act '<font color=<<$Colors[ТСР]>>>Умения Силы Духа |►</font>' : @Меню_Боя('МенюДуха')
End
If On=On :
Act '<font color=<<$Colors[ФЛТ]>>>Предметы |►</font>' : @Меню_Боя('МенюПредметы')
End
If On=On :
Act '<font color=<<$Colors[ГЛД]>>>Умения 1-ого Уровня |►</font>' : @Меню_Боя('МенюУмения1')
End
Act '<b><font color=<<$Colors[ЗДР]>>>Сдаться (-20% ЗДР)</font></b>' :
CLA
Act '<b><font color=<<$Colors[ЗЕЛ]>>>Я уверен и хочу сдаться!</font></b>' : @Сдаться('Fighter_1') & @Бой('Конец')
Act '<b><font color=<<$Colors[КРС]>>>Я передумал</font></b>' : @Меню_Боя('Главное')
End
End
If $Args[0]='МенюДуха' :
CLA
Act '<font color=<<$Colors[ТСР]>>>Назад ◄|</font>' : @Меню_Боя('Главное')
End
If $Args[0]='МенюПредметы' :
CLA
Act '<font color=<<$Colors[ФЛТ]>>>Назад ◄|</font>' : @Меню_Боя('Главное')
End
If $Args[0]='МенюУмения1' :
CLA
Act '<font color=<<$Colors[ГЛД]>>>Назад ◄|</font>' : @Меню_Боя('Главное')
End
If $Args[0]='МенюКонец' :
CLA
Act '<font color=<<$Colors[ГЛД]>>>Завершить</font>' : Gt 'Город','Второй'
End
По сути, ты каждый раз формируешь одну и туже последовательность. Вынеси, как в примере, это меню в отдельную локацию и запускай его как gs ‘Меню’.
Тогда твой код будет выглядеть примерно так:
#Меню
If $Args[0]='Заново'
g=arrsize('npconloc')
CLA & ! Очищаем меню Действий
*CLR & ! Очищаем Картинку (поле вывода)
Loop i= 0 while i<g step i+=1:
npc=npconloc[i]
Act 'Поговорить с <<$name[npc]>> <<$surname[npc]>>':
If race[npc]=0:
CLA & ! Очищаем меню Действий
*CLR & ! Очищаем Картинку (поле вывода)
'<center><img src =""new/orcface.jpg"" ></center>'
If agro[npc] =1:
'Дерёмся'
Act 'Погнали': gt 'orcfight' & ! А что происходит в эйтой локации с массивами? Эта локация без возврата!
End
Act 'Назад': Gs ('Меню','Заново') & ! Возврат формируешь в безусловном порядке. Это закон вежливости игры. Принудительно можешь потом его обрубить при необходимости
Else
CLA & ! Очищаем меню Действий
*CLR & ! Очищаем Картинку (поле вывода)
'<center> <img src =""new/202.jpg"" ></center>'
If agro[npc] =1:
'Дерёмся'
Act 'Погнали': gt 'humanfight' & ! А что происходит в эйтой локации с массивами? Эта локация без возврата!
End
Act 'Назад': Gs ('Меню','Заново') & ! Возврат формируешь в безусловном порядке. Это закон вежливости игры. Принудительно можешь потом его обрубить при необходимости
End
End
End
End
Act 'Уйти' : Gt '<<$loc>>'
--- Меню ---
Вполне себе:
По сути, ты каждый раз формируешь одну и туже последовательность. Вынеси, как в примере, это меню в отдельную локацию и запускай его как gs
Да, я делаю это на отдельной локации. Вылечило проблему добавление npc =<<npc>> в тело act. Видимо при клике на ссылку он вызывал последнее из значений npc, а не все.
Вполне себе:
Возврат формируешь в безусловном порядке. Это закон вежливости игры
По поводу читаемости и вежливости кода, тут я вообще плох. Никогда до этого не программировал и не знаю как всё опрятно делать. Это наверное придёт с опытом
provincial:
Да, я делаю это на отдельной локации. Вылечило проблему добавление npc =<<npc>> в тело act. Видимо при клике на ссылку он вызывал последнее из значений npc, а не все.
По сути я тебе это и сказал - формирование одной и той же последовательности. Но твое решение - это костыль! На нем далеко не ухромаешь. Надо смотреть что возвращает NPC и <<NPC>>
У тебя еще многое впереди, особенно если ты никогда раньше не программировал.
Логика программирования - та еще фенечка. От нее многое зависит. Если не всё, то почти всё. Так как QSP это не компилятор (тот что проверяет код на исполняемость, а затем формирует исполняемый файл), а интерпретатор - тот кто выполняет каждую операцию последовательно, то ошибки кода неизбежны, а значит надо всегда создавать возможность возврата из “пустого экрана”. Для этого, если мне надо что-то рассчитать или вывести - прежде любой операции создаю Действие возврата. А затем, когда все рассчитал и получил результат - удаляю его и публикую нужные действия. Пример я тебе уже показал. Динамиком я пользуюсь только тогда, когда нельзя его заменить на простой код. В примере это тоже хорошо указано.