Как сделать?
…
А вот проблема с которой я точно не разберусь.
Гулял по коду rubedo и решил понять что за onNewLoc.
У него там было вот такое
Spoiler
!{ Форматы ссылок:
((текст)) - при клике перейти (gt) на локацию с названием "текст"
((текст||)) - при клике обработать (gs) локацию с названием "текст"
((текст|локация)) - при клике перейти (gt) на указанную локацию, текущее описание заменяется новым
((текст||локация)) - при клике обработать (gs) указанную локацию, новое описание добавляется к текущему
((текст|||строка кода)) - при клике выполнить строку кода
((текст|локация|строка кода)) - то же, что и ((текст|локация)), но перед переходом выполнить строку кода
((текст||локация|строка кода)) - то же, что и ((текст||локация)), но перед обработкой выполнить строку кода
}
$main=$maintxt
*clr
$regex='\(\(([^\)\|]+)(\|{0,2})([^\)\|]*)(\|?)([^\)]*)\)\)'
:subExLoop
pos=strpos($main, $regex)
if pos:
$a_dsc=$strfind($main, $regex, 1)
$a_dm1=$strfind($main, $regex, 2)
$a_loc=$strfind($main, $regex, 3)
$a_dm2=$strfind($main, $regex, 4)
$a_exe=$strfind($main, $regex, 5)
$a_exe=$replace($a_exe, '"', '\"\"')
if $a_loc='' and $a_dm2='':$a_loc=$a_dsc
!{
if len($a_dm1)=2:
if $a_loc='':
$link='<a href="exec:showhead=0&dynamic \"<<$a_exe>>\"&'+ _
'gs \"<<$onnewloc>>\""><<$a_dsc>></a>'
else
$link='<a href="exec:showhead=0&dynamic \"<<$a_exe>>\"&'+ _
'gs \"<<$a_loc>>\"&gs \"<<$onnewloc>>\""><<$a_dsc>></a>'
end
else
$link='<a href="exec:showhead=1&dynamic \"<<$a_exe>>\"&'+ _
'gt \"<<$a_loc>>\""><<$a_dsc>></a>'
end
}
!for Android, only support one line by illume
if len($a_dm1)=2:
if $a_loc='':
$link='<a href="exec:showhead=0&dynamic {<<$a_exe>>} & gs '+"'<<$onnewloc>>'"+'"><<$a_dsc>></a>'
else
$link='<a href="exec:showhead=0&dynamic {<<$a_exe>>} & gs '+"'<<$a_loc>>' + gs '<<$onnewloc>>'"+'"><<$a_dsc>></a>'
end
else
$link='<a href="exec:showhead=1&dynamic {<<$a_exe>>} & gt '+"'<<$a_loc>>'"+'"><<$a_dsc>></a>'
end
!'a_dsc_<<$a_dsc>><br>a_dm1_<<$a_dm1>><br>a_loc_<<$a_loc>><br>a_dm2_<<$a_dm2>><br>a_exe_<<$a_exe>><br>'
$main=$mid($main, 1, pos-1)+$link+$mid($main, pos+len($strfind($main, $regex)))
jump 'subExLoop'
end
if showhead:
!'<h3>Location "<<$curloc>>"</h3><hr />'
*p $main
!'<h3>Description end</h3>'
else
*p $main
end
То есть там есть регекс (который я вообще не понимаю), и самое важное в начале.
Поэтому такой вопрос. вот это
Spoiler
!{ Форматы ссылок:
((текст)) - при клике перейти (gt) на локацию с названием "текст"
((текст||)) - при клике обработать (gs) локацию с названием "текст"
((текст|локация)) - при клике перейти (gt) на указанную локацию, текущее описание заменяется новым
((текст||локация)) - при клике обработать (gs) указанную локацию, новое описание добавляется к текущему
((текст|||строка кода)) - при клике выполнить строку кода
((текст|локация|строка кода)) - то же, что и ((текст|локация)), но перед переходом выполнить строку кода
((текст||локация|строка кода)) - то же, что и ((текст||локация)), но перед обработкой выполнить строку кода
}
Вот эти форматы ссылок. Он их сам сделал, или же это так работает сам ксп и он просто как справку для себя вынес?
А вот проблема с которой я точно не разберусь.
Гулял по коду rubedo и решил понять что за onNewLoc.
У него там было вот такое
Spoiler
!{ Форматы ссылок:
((текст)) - при клике перейти (gt) на локацию с названием "текст"
((текст||)) - при клике обработать (gs) локацию с названием "текст"
((текст|локация)) - при клике перейти (gt) на указанную локацию, текущее описание заменяется новым
((текст||локация)) - при клике обработать (gs) указанную локацию, новое описание добавляется к текущему
((текст|||строка кода)) - при клике выполнить строку кода
((текст|локация|строка кода)) - то же, что и ((текст|локация)), но перед переходом выполнить строку кода
((текст||локация|строка кода)) - то же, что и ((текст||локация)), но перед обработкой выполнить строку кода
}
$main=$maintxt
*clr
$regex='\(\(([^\)\|]+)(\|{0,2})([^\)\|]*)(\|?)([^\)]*)\)\)'
:subExLoop
pos=strpos($main, $regex)
if pos:
$a_dsc=$strfind($main, $regex, 1)
$a_dm1=$strfind($main, $regex, 2)
$a_loc=$strfind($main, $regex, 3)
$a_dm2=$strfind($main, $regex, 4)
$a_exe=$strfind($main, $regex, 5)
$a_exe=$replace($a_exe, '"', '\"\"')
if $a_loc='' and $a_dm2='':$a_loc=$a_dsc
!{
if len($a_dm1)=2:
if $a_loc='':
$link='<a href="exec:showhead=0&dynamic \"<<$a_exe>>\"&'+ _
'gs \"<<$onnewloc>>\""><<$a_dsc>></a>'
else
$link='<a href="exec:showhead=0&dynamic \"<<$a_exe>>\"&'+ _
'gs \"<<$a_loc>>\"&gs \"<<$onnewloc>>\""><<$a_dsc>></a>'
end
else
$link='<a href="exec:showhead=1&dynamic \"<<$a_exe>>\"&'+ _
'gt \"<<$a_loc>>\""><<$a_dsc>></a>'
end
}
!for Android, only support one line by illume
if len($a_dm1)=2:
if $a_loc='':
$link='<a href="exec:showhead=0&dynamic {<<$a_exe>>} & gs '+"'<<$onnewloc>>'"+'"><<$a_dsc>></a>'
else
$link='<a href="exec:showhead=0&dynamic {<<$a_exe>>} & gs '+"'<<$a_loc>>' + gs '<<$onnewloc>>'"+'"><<$a_dsc>></a>'
end
else
$link='<a href="exec:showhead=1&dynamic {<<$a_exe>>} & gt '+"'<<$a_loc>>'"+'"><<$a_dsc>></a>'
end
!'a_dsc_<<$a_dsc>><br>a_dm1_<<$a_dm1>><br>a_loc_<<$a_loc>><br>a_dm2_<<$a_dm2>><br>a_exe_<<$a_exe>><br>'
$main=$mid($main, 1, pos-1)+$link+$mid($main, pos+len($strfind($main, $regex)))
jump 'subExLoop'
end
if showhead:
!'<h3>Location "<<$curloc>>"</h3><hr />'
*p $main
!'<h3>Description end</h3>'
else
*p $main
end
То есть там есть регекс (который я вообще не понимаю), и самое важное в начале.
Поэтому такой вопрос. вот это
Spoiler
!{ Форматы ссылок:
((текст)) - при клике перейти (gt) на локацию с названием "текст"
((текст||)) - при клике обработать (gs) локацию с названием "текст"
((текст|локация)) - при клике перейти (gt) на указанную локацию, текущее описание заменяется новым
((текст||локация)) - при клике обработать (gs) указанную локацию, новое описание добавляется к текущему
((текст|||строка кода)) - при клике выполнить строку кода
((текст|локация|строка кода)) - то же, что и ((текст|локация)), но перед переходом выполнить строку кода
((текст||локация|строка кода)) - то же, что и ((текст||локация)), но перед обработкой выполнить строку кода
}
Вот эти форматы ссылок. Он их сам сделал, или же это так работает сам ксп и он просто как справку для себя вынес?
И с верху вопрос. Как вообще пользоваться onNewLoc’ом?
Небольшая проблемка… насчёт команды strfind.
Я хочу сделать игру про хакеров, с элементами парсера. Объясните, что с этим кодом не так?
if strfind($usrtxt, '\W\d\d\d\d', 0) = '#2199' and strfind($usrtxt, '^\w\w\w\w********', 0) = 'stat device':
'Тестинг'
end
При наборе “stat device #2199” должно писать “Тестинг”.
Суть в том, что мне хочется показать, что символ может присутствовать, а может и не присутствовать. А может там вообще пробел будет. С таким кодом
if strfind($usrtxt, '\W\d\d\d\d', 0) = '#2199' and strfind($usrtxt, '^\w\w\w\w?.?.?.?.?.?.?.', 0) = 'stat device':
'Тестинг'
end
всё работает, но только тогда, когда длина найденного текста равна 11 символам.
Что мне делать?! Я уже по стенам начинаю ходить. Либо мне надо делать отдельные “if-ы” для каждой команды (а их там будет ого-го), либо забить на всё и начать делать другую игру.
P. S. Страшное выражение ’^\w\w\w\w?(\w|\W)?(\w|\W)?(\w|\W)?(\w|\W)?(\w|\W)?(\w|\W)?(\w|\W)’ тоже не сработало как нужно.
oleksandrigo,
Локация onnewloc - код на ней выполняется тогда, когда ты попал на другую локацию. Лично я использую её тогда, когда нужно сделать на разных локациях разное оформление. К примеру:
Spoiler
Локация 1:
style = 1
'Это локация один. Здесь чёрный фон и белый текст.'
$onnewloc = 'onnewloc'
act 'Туда':
gt 'локация2'
end
Локация 2:
style = 2
'Это локация два. Здесь белый фон и чёрный текст.'
$onnewloc = 'onnewloc'
act 'Обратно':
gt 'локация1'
end
А на локации “onnewloc” пишешь вот такой код:
if style=1:
refint
bcolor = rgb(0,0,0)
fcolor = rgb(255,255,255)
end
end
if style=2:
refint
bcolor = rgb(255,255,255)
fcolor = rgb(0,0,0)
end
end
Можно приспособить её для проверки количества чего-то, к примеру:
if деньги < 500 and $локация = 'банк':
'У вас не хватает денег для перехода на эту локацию'
gt $назад
end
Вообще у неё может быть куча разных применений (в том числе то, которое ты показал). Всё ограничено только фантазией :-)
Насчёт кода rubedo помочь ничем не могу, так как я сам в нём нихрена не понял 0_o Скорее всего, верен первый вариант.
NickoAilus,
надо проверить условия отдельно. Вообще лучше регэкспы тестировать не в готовой игре, а в чистом поле, чтобы проверить их работоспособность.
Запускаем и проверяем
$usrtxt_1='stat device #2199'
':'+$strfind($usrtxt_1, '\W\d\d\d\d', 0)+':'
! :#2199:
':'+$strfind($usrtxt_1, '^\w\w\w\w********', 0)+':'
! :stat:
Видишь в чём проблема? * — это не множество, не класс, а КВАНТИФИКАТОР, указывающий на 0 и более вхождений.
Твой регэксп должен выглядеть так:
^\w\w\w\w\s\w+
Или лучше так:
^\w{4}\s\w+
это тоже квантификатор. И +. Квантификаторы указывают количество вхождений.
В итоге код:
if $strfind($usrtxt,'\W\d{4}')='#2199' and $strfind($usrtxt,'^\w{4}\s\w+')='stat device':
'Тестинг'
end
Aleks Versus,
Огромное спасибо!
В общем такая ситуация. Хочу сделать экипировку. Но не через addobj а просто локацией.
Файл с игрой ниже. Просто его сюда перенести сложновато.
Но опишу примерно как он задумывался.
Есть переменные helmet / $helmet / $head. То бишь числовая хелмет отвечает за то что щлем есть в инвентаре. $helmet просто для названия и последняя для того, чтобы вывести, то что на голове. $head = $helmet.
Вот только моих хелметов может быть много, поэтому я их решил проиндексировать типо $helmet[leather] или $helmet[iron]. Так вот если я пытаюсь его “одеть” тоесть хед прировнять к хелмету, то возникают проблемы. К примеру тот хелмет, который был обработан последним и будет $helmet. И вот никак не могу сделать выбор.
Но лучше посмотрите в файле. Там понятнее.
Использую первые три локаиции для теста.
oleksandrigo,
не понятно, по какому признаку индексируются хелметы? Если ты пытаешься указывать в качестве индексов материал, то индекс должен быть текстовым, я полагаю. А текстовые значения мы размещаем в кавычках:
$helmet[’leather’]
$helmet[”iron”]
Так же и в файле игры.
А на локации “Экипировка” хелмет вообще не индексируется:
if $head <> $helmet:
Само собой одевается нечто пустое, что даже ещё не было создано.
Aleks Versus,
по идее код
if $head <> $helmet:
должен говорить одет ли шлем вообще. Тесть он не должен равняться хелмету. И тогда и создается возможность “одеть”.
$head = $helmet
.
На счет индексации спасибо. Теперь на одну проблему меньше. Но теперь появился странный момент.
У меня есть вот это.
Spoiler
act 'vzat bronu1':
helmet['null'] = 1
delact $selact
end
act 'vzat bronu2':
helmet['nu'] = 1
delact $selact
end
То бишь числовые хелметы которые по идее должны говорить есть ли они в инвентаре.(ооbr - инвентарь).
В инвентаре же
Spoiler
if helmet['null'] = 1:
$helmet['null'] = 'Кожаный шлем'
end
if helmet['nu'] = 1:
$helmet['nu'] = 'zeleznii shlem'
end
В итоге если я прогружу взять броню1 или броню2 то грузится потом только она. То есть, смотрите тыкаю кнопку взять броню1(кож.шлем), иду в “экипировку”, и там пытаюсь
Spoiler
gs 'oobr'
if $head <> $helmet:
act 'Надеть шлем':
$head = $helmet
gt $curloc
end
end
оно надевает, НО!
Если я выйду назад и нажму взять броню2, и снова вернусь назад и попытаюсь сменить хелмет, то ничего не получится.
Никак не могу понять почему хелмет не меняется.
ps. null - кож.бронь; nu - zeleznay bron
pss. и я пробoвал “снимать” хелмет
Spoiler
if $head = $helmet:
act 'Снять шлем':
$head = 'шевелюра'
gt $curloc
end
end
но результата не дало.
psss. Почему я не дописал там индексацию? Я пытаюсь его к одному знаменателю привести чтоли. Индекс там просто для вывода названий того или иного хелмета и других вещей экипировки. Если их убрать, то вообще будет грузить последний в списке хелмет.
oleksandrigo,
$helmet — это $helmet[0]. Если ты инициализировал сначала $helmet[’null’], то $helmet[’null’] — это тоже $helmet[0].
В общем. Текстовые индексы массивов соотносятся с числовыми индексами в порядке инициализации. Запись $helmet означает, что ты делаешь запись в ячейку массива под номером 0.
Проверяется просто:
$helmet['null'] = 'шелом'
$helmet[0]
Aleks Versus,
Оуу. Окей я понял. Пара идей появилась. Спасибо
Можно ли сделать так что бы действие переносило на рандомную локацию
типа gt=rand(1,2,3,4….) ?
Антипапа,
Нуу можно, но где то так. НИЗЯ
Spoiler
x = gt 'location1'
y = gt 'location2'
rand (x,y)
Я правда не уверен в нем.
Или же вот такой.
Spoiler
location = rand (1,5)
if location = 1: gt 'loc1'
if location = 2: gt 'loc2'
if location = 3: gt 'loc3'
if location = 4: gt 'loc4'
if location = 5: gt 'loc5'
Вот он должен работать
UPD Насчет первого кода можно еще так НИЗЯ
Spoiler
$x = rand (loc1,loc2)
gt '$x'
В нем я тоже не уверен, но вроде должен. И он только между двумя локациями. Поэтому если нужно больше то только второй вариант.
И все это дело под act втыкнуть да и всё.
В общем такая ситуация: Есть предмет ‘персонаж’ в нем есть менюшки всякие и одна из них это ‘Экипировка’. Как я понял при нажатии на него локация не gt’шится а скорее gs’иться. То есть это не переход. Но по некоторым причинам мне нужен именно переход. Можно ли
$pers_menu[4] = 'Экипировка:Экипировка'
сделать так чтобы он сразу gt’шился.
Я то придумал как это обойти, но приходится делать доп. локацию, что не очень удобно.
Spoiler
$pers_menu[4] = 'Экипировка:Обр_Экип'
в локации ‘Обр_Экип’
gt 'Экипировка'
oleksandrigo,
да. Это пожалуй, единственный способ. Если таких локаций приходится делать много, можно поплясать с передачей аргументов, но это тоже не удобно.
oleksandrigo:
x = gt 'location1' y = gt 'location2' rand (x,y)
:D ты как на java пишешь. Переменные в QSP — это не объекты. =) Первый и третий способ не сработают без некоторых изменений.
Антипапа,
Можно внести названия локаций в массив:
$places[0]='Дом'
$places[1]='Улица'
$places[2]='Лес'
$places[3]='Пустыня'
goto $places[rand(0,3)]