Как сделать?
…
if mama_kux_zav = 2:
‘<center><img src=“pict\mom\1сны.gif” ></center>’
‘<center>Тут текст бла-бла-бла-бла</center>’
ACT ‘Встать’:
GT ‘Комната ГГ’……
….
…
Чтобы не запутаться в многострочной форме оператора IF, я бы свел в таком случае его к однострочной форме записи с применением Jump, Gosub и подобных как следствие выполнения условия, заданного If. Вынес бы таким образом блоки кода за пределы строчки записи оператора If. Такая разбивка делает код некрасивым, но дает больше возможностей увидеть свою ошибку и отладить код поэтапно.
skov, ну и потом))) Не вижу смысла втискивать в эту всю конструкцию рутинное назначение переменным $image возможных значений. Определи их заранее, до сна, или до начала игры. Для “валяния в кровати” тоже определи зарание другую группу. А применяй в этом участке кода только рандом по ним. Пусть меня поправят, если я ошибаюсь.
Однострочные IF - основной источник проблем и багов )
skov,
ты, как я вижу, не понимаешь, зачем нужны end’ы. А ведь всего пару страниц назад разбирали похожий случай. end даёт программе понять, где кончается код действия или код, выполняемый по условию:
! открываем действие
act 'название действия':
!код действия
! код действия
! код действия
! закрываем действие
end
...
!открываем условие (если выполняется это)
if УСЛОВИЕ:
! код, если условие выполнено
! код, если условие выполнено
! вторая часть условия (если условие не выполняется)
else
! код, если условие не выполнено
! код, если условие не выполнено
! окончание проверки условия и выполнения соответствующих блоков кода
end
Плеер игнорирует отступы перед строками в коде и определяет окончание того или иного многострочного оператора по наличию end. Преформатирование делается только для удобства чтения кода.
Вот так должен выглядеть твой код:
Spoiler
! открываем действие "спать"
ACT 'спать':
time+=340
Cla
*CLR
! открываем условие
if mama_kux_zav = 2:
'<center><img src="pict\mom\1сны.gif" ></center>'
'<center>Тут текст бла-бла-бла-бла</center>'
! открываем действие "встать"
ACT 'Встать':
GT 'Комната ГГ'
! закрываем действие "встать" потому что код, который описывает это действие кончился
end
! вторая часть условия
else
$image[0]= '<center><img src="pict\gg\1спитГГ.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[1]= '<center><img src="pict\gg\2спитГГ.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[2]= '<center><img src="pict\gg\3спитГГ.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[3]= '<center><img src="pict\gg\4спитГГ.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[4]= '<center><img src="pict\gg\1гифсон.gif"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[5]= '<center><img src="pict\gg\2cон.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[6]= '<center><img src="pict\gg\2гифсон.gif"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[7]= '<center><img src="pict\gg\2гифсон2.gif"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[8]= '<center><img src="pict\gg\3гифсон.gif"></center>
<center>Тут текст бла-бла-бла-бла</center>'
*clr
$image[rand(0,8)]
! открываем действие "встать"
ACT 'Встать':
GT 'Комната ГГ'
! закрываем действие "встать"
! закрываем условие mama_kux_zav = 2
end
! закрываем действие "спать"
end
! открываем действие "Поваляться в кровати"
ACT 'Поваляться в кровати':
CLA
*CLR
$image[0]= '<center><img src="pict\gg\2кровать.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[1]= '<center><img src="pict\gg\3кровать.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[2]= '<center><img src="pict\gg\4кровать.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[3]= '<center><img src="pict\gg\4кровать.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
*clr
$image[rand(0,3)]
'<center>Тут текст бла-бла-бла-бла</center>'
! открываем действие "встать с кровати"
ACT 'Встать с кровати':
CLA
gt 'Комната ГГ'
! закрываем действие "встать с кровати"
END
! закрываем действие "Поваляться в кровати"
end
А вот так плеер понимает твой нынешний код:
Spoiler
! открываем действие спать
ACT 'спать':
time+=340
Cla
*CLR
! открываем условие
if mama_kux_zav = 2:
'<center><img src="pict\mom\1сны.gif" ></center>'
'<center>Тут текст бла-бла-бла-бла</center>'
! открываем действие "встать"
ACT 'Встать':
GT 'Комната ГГ'
! эта часть идёт внутри действия "встать", а потому else игнорируется!!!
else
$image[0]= '<center><img src="pict\gg\1спитГГ.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[1]= '<center><img src="pict\gg\2спитГГ.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[2]= '<center><img src="pict\gg\3спитГГ.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[3]= '<center><img src="pict\gg\4спитГГ.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[4]= '<center><img src="pict\gg\1гифсон.gif"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[5]= '<center><img src="pict\gg\2cон.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[6]= '<center><img src="pict\gg\2гифсон.gif"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[7]= '<center><img src="pict\gg\2гифсон2.gif"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[8]= '<center><img src="pict\gg\3гифсон.gif"></center>
<center>Тут текст бла-бла-бла-бла</center>'
*clr
$image[rand(0,8)]
! открываем действие "встать" внутри действия "встать"
ACT 'Встать':
GT 'Комната ГГ'
! закрываем действие "встать" последнее
END
! закрываем действие "встать" первое
end
! закрываем условие
END
! закрываем действие "спать"
end
! открываем действие "поваляться в кровати"
ACT 'Поваляться в кровати':
CLA
*CLR
$image[0]= '<center><img src="pict\gg\2кровать.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[1]= '<center><img src="pict\gg\3кровать.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[2]= '<center><img src="pict\gg\4кровать.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
$image[3]= '<center><img src="pict\gg\4кровать.jpg"></center>
<center>Тут текст бла-бла-бла-бла</center>'
*clr
$image[rand(0,3)]
'<center>Тут текст бла-бла-бла-бла</center>'
! открываем действие "Встать с кровати"
ACT 'Встать с кровати':
CLA
gt 'Комната ГГ'
! закрываем действие "Встать с кровати"
END
! действие "поваляться в кровати" не закрыто. Поэтому "многострочные формы операторов должны завершаться словом end"
Спасибо огромное, и предыдущим собеседникам тоже спасибо)
Постараюсь найти время почитать последние сообщения этой темы. Как раз сегодня на работе сидел и думал как раз о том, что я не правильно указал конец операторов, и поэтому программа путается, теперь буду аккуратнее писать, хотя за раз как я понимаю этому не научиться)
Документацию я читал, но я не могу взять и сходу написать код без ошибок, раньше никакие языки не изучал, но вот кстати очень нравится, хоть и уходит на одну ошибку до целых суток)
Спасибо еще раз за решение уже моей второй проблемы, иногда просто не понимаешь что делаешь и как :)
Никак не могу понять как передать номер нпс (num) в модуль олегуса для меню
$areaNPC=''
as=arrsize('$loc_<<X[you]>>_<<Y[you]>>_<<Z[you]>>')
temp_i=0
view
:mark_loc
dynamic 'num=$loc_<<X[you]>>_<<Y[you]>>_<<Z[you]>>[temp_i]'
if num!you and dead[num]=0 and num>0 and invisible[num]=0:
$status[num]=''
if mobtipe[num]=1:
if agression[num]=0:
statusrand=rand(1,4)
if statusrand=1:$status[num]='скалит зубы'
if statusrand=2:$status[num]='рычит'
if statusrand=3:$status[num]='угрожающе скалится'
if statusrand=4:$status[num]='гавкает'
agrorand=rand(1,100)
if agrorand>=90:
agression[num]=1
end
else
energy[you]+=atk[num]
$status[num]='кусает вас'
end
end
gs'Menu.Create','NPCmainMenu'
gs'Menu.Add','NPCmainMenu','Посмотреть','','MainMenuLoc','see','<<num>>'
gs'Menu.Add','NPCmainMenu','Ударить','','MainMenuLoc','slap','<<num>>'
if wand[you]>0:gs'Menu.Add','NPCmainMenu','Колдовать','','MainMenuLoc','wand','<<num>>'
$areaNPC+=" <a href='exec: gs""Menu.Call"",""NPCmainMenu""'><<$name[num]>></b> <<$status[num]>></a>"
$areaNPC += "<br>"
end
temp_i+=1
if temp_i<=as:jump'mark_loc'
$areaNPC
Все время передается номер последнего нпс, а не того которого нужно.
По-хорошему, надо было бы представить только проблемную часть кода, а не всю простыню. Я не претендую на ответ, но, возможно, дело в том, что в dynamic(в том виде, как записали его вы) подвыражения вычисляются передего выполнением. Так сказать, один раз и навсегда. Этого можно избежать, заключив динамический код в фигурные скобки.
$My_dynamic = {
num=$loc_<<X[you]>>_<<Y[you]>>_<<Z[you]>>[temp_i]
}
:mark_loc
dynamic $My_dynamic
!...
temp_i+=1
if temp_i<=as:jump'mark_loc'
Я не особо вникал в код (из-за его обширности), поэтому не могу гарантировать, что уловил суть проблемы.
evp,
в фигурных скобках подвыражение не вычисляется.
DaGrozz,
дело в том, что ты создаёшь меню с именем ‘NPCmainMenu’, а если верить модулю Олегуса, он убивает предыдущее созданное меню с таким же именем. Или я чего не понимаю?
! # Menu.Create
if $ARGS[0]='': EXIT
!----------
$ARGS[0]='otg_Меню_'+$ARGS[0]
!----------
killvar '<<$ARGS[0]>>'
killvar '<<$ARGS[0]>>_Параметры'
killvar '<<$ARGS[0]>>_Выбрали'
killvar '<<$ARGS[0]>>_ВыбранныйПункт'
killvar '<<$ARGS[0]>>_Время'
killvar '<<$ARGS[0]>>_МодулиСобытий'
Поэтому, как я полагаю, ты создаёшь меню только для последнего NPC. Попробуй вместо
gs'Menu.Create','NPCmainMenu'
делать
gs'Menu.Create','NPCmainMenu<<num>>'
ну и далее.
Aleks Versus:
в фигурных скобках подвыражение не вычисляется
Все там вычисляется. Разница только в том, когдавычисляется. Если dynamicзадан текстом (кавычками), то выражения вычисляются в момент инициализации и не могут быть изменены в дальнейшем. Если dynamic задан фигурными скобками, то подвыражения вычисляются при каждом вызове динамического кода. В этом легко убедиться, запустив пример:
i = 0
$My_dynamic = "*nl '<<i>>'"
$My_dynamic_brace = {*nl "<<i>>"}
dynamic $My_dynamic
dynamic $My_dynamic_brace
*nl
i = 1
dynamic $My_dynamic
dynamic $My_dynamic_brace
Почувствуйте разницу. Кстати, в справке этот момент описан.
Другое дело, что проблема заключается не в этом и мой совет был ошибочным.
evp,
я всё понимаю. Но вот это работать не будет:
evp:
$My_dynamic = { num=$loc_<<X[you]>>_<<Y[you]>>_<<Z[you]>>[temp_i] }
Ах. Это - да. Не будет. Недосмотрел.
Давненько не брал я в руки шашки QSP. :) Вот и допускаю такие ляпы.
дело в том, что ты создаёшь меню с именем ‘NPCmainMenu’, а если верить модулю Олегуса, он убивает предыдущее созданное меню с таким же именем. Или я чего не понимаю?
Ну да именно так. Я нашел как исправить положение.
Нужно в ссылке на нпс выдавать gs на локацию где и создается меню, а номер нпс передавать через args
PS я как мог сократил код для наглядности. В реале он раз этак в 10ть больше, так как там расчет отображения статусов нпс и еще захватывает соседние локации.
Гуру qsp подскажите как сделать таблицу в главном окне?
Darvin432,
! включаем режим распознавания html
usehtml=1
! выводим таблицу html
*p '<table border=1><tr><td>первая ячейка</td><td>вторая ячейка</td></tr></table>'
Между html-тегами не должно случаться переводов строки, символов пробелов и табуляции, ну и прочего.
Aleks Versus, Спасибо! А как эту таблицу сделать с фиксированными размерами? А то она варьируеться относитьельно размера названия ячейки
Да и ещё вопрос:
Есть команда по типа “go to” но что бы не прописывать локацию куда идти, а вjзвращаться на локацию откуда пришёл? Заранее спасибо