Как сделать?
…
Однострочные 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звращаться на локацию откуда пришёл? Заранее спасибо
Darvin432,
фиксированные размеры можно задавать атрибутом width. Ширина таблицы:
<table width=600>...
Ширина ячейки:
<td width=200>
Можно задавать относительные размеры. Растягиваем таблицу на ширину окна:
<table width=100%>...
Столбец в половину ширины таблицы:
<td width=50%>
Почитай здесь по тегам http://htmlbook.ru/html/table
Darvin432:
Есть команда по типа “go to” но что бы не прописывать локацию куда идти, а вjзвращаться на локацию откуда пришёл?
Есть решение для возврата на предыдущую локацию, но я не уверен, что оно подойдёт. Не совсем понимаю, что тебе нужно. Отдельной команды для возврата нет.
Всем привет. Возникла необходимость в том, чтобы Notepad распознавал синтаксис QSP - то есть вместо закорючек, было бы видно нормальны команды… Можно ли такое реализовать? И если да, то как? :)