RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2436933 views

А вот проблема с которой я точно не разберусь.

Гулял по коду 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 Скорее всего, верен первый вариант.

Aleks Versus Moderator 21.02.2018 06:21 (8 years ago)

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. И вот никак не могу сделать выбор.

Но лучше посмотрите в файле. Там понятнее.

Использую первые три локаиции для теста.

file.qsp

Aleks Versus Moderator 21.02.2018 17:18 (8 years ago)

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. Почему я не дописал там индексацию? Я пытаюсь его к одному знаменателю привести чтоли. Индекс там просто для вывода названий того или иного хелмета и других вещей экипировки. Если их убрать, то вообще будет грузить последний в списке хелмет.

izmenennyiy_faylik.qsp

Aleks Versus Moderator 21.02.2018 20:11 (8 years ago)

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 'Экипировка'
Aleks Versus Moderator 23.02.2018 12:59 (8 years ago)

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)]

Log in or Register to post comments.