RU 📌 Pinned

Как сделать?

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

Спасибо, попробую. Если приоритетный файл который у меня в папке игры, то это здорово. Я фактически свой юзер-интерфейс могу сваять таким образом.

TimA,
да. При определённом усердии можно поменять расположение окошек в этом файле так, как не поменяешь мышкой. Если редактировать его вручную.

Столкнулся со странной заморочкой: писал функцию обыска локации
Код локации

Spoiler
*clr
if vizited[$curloc]=0: 
	set vizited[$curloc]=1 & ! устанавливаем признак посещенности локации
	!===========Установка имеющегося в локации лута ======================== 
	i=arrsize('lootname')& ! определяем размер массива уже имеющегося лута
	set $lootname[i]='Планшет' &! название лута
	set $lootloc[$lootname[i]]=$curloc &! в какой локации находится
	set taken[$lootname[i]]=0 &! взят/не взят
	set lootseen[$lootname[i]]=0 &! обнаружен/не обнаружен
	set wght[$lootname[i]]=150 &! вес лута в граммах
	set lootsence[$lootname[i]]=50 &! сенс. необходимый для обнаружения
	set $lootexe[$lootname[i]]='addobj $tmp' &! добавляет в инвентарь
!==================== то же самое в сокращенном виде================================= 
	$lootname[i+1]='Шокер'& $lootloc[$lootname[i+1]]=$curloc& taken[$lootname[i+1]]=0& _
	lootseen[$lootname[i+1]]=0& wght[$lootname[i+1]]=400& lootsence[$lootname[i+1]]=450 _
	& $lootexe[$lootname[i+1]]='$purse[j]=$tmp'&! добавляет в сумку
	
	$lootname[i+2]='500cr'& $lootloc[$lootname[i+2]]=$curloc& taken[$lootname[i+2]]=0& _
	lootseen[$lootname[i+2]]=0& wght[$lootname[i+2]]=0& lootsence[$lootname[i+2]]=250 _
	& $lootexe[$lootname[i+2]]='money=money+500' &! добавляет счетные предметы(деньги,патроны)
	set lootnum[$curloc]=3 &! ОБЯЗАТЕЛЬНО!! это число объектов лута в локации 
	*pl 'Lootinit end'
! =================================================================================== 
end

'<center>Кладовка</center>'
*pl '<table width=100%><tr><td><img align=left src="pic\клад.jpg"></td>
<td>В кладовке стоит шкаф со всяким барахлом</td>'
p '</tr></table>'

time=420
*pl 'Money =<<money>> кред.; sense=<<sence>>; weight=<<weight>>; viz=<<vizited[$curloc]>>'
i=0
:c1
if i<3:
	*pl '<<$lootname[i]>>, seen=<<lootseen[$lootname[i]]>>, taken=<<taken[$lootname[i]]>>'
	i+=1
	jump 'c1'
end

if time < 1380:
	cla
	if sence>50 and seen[$curloc]<lootnum[$curloc]: 
		act 'Осмотреть': gs 'explore',$curloc
	end
	act 'налево': gt 'налево'
	act 'направо': gt 'направо'
	act 'Выйти из дома': gt 'двор'
else
	act 'Разбить лагерь': gt 'camp'
end

код функции

Spoiler
cla
if $args[0] ! '':
	$return=$args[0]
	$string = 'Найдено: '
	$stract='Подобрать найденное'
	set i=0
	set k=0
	:cycle1
	if i<arrsize('lootname'):
		if $lootloc[$lootname[i]]=$args[0]:
			if sence>=lootsence[$lootname[i]] and lootseen[$lootname[i]]=0:
				$string = $string+$lootname[i]+' вес(<<wght[$lootname[i]]>>), '
				lootseen[$lootname[i]]=1
				sence+=5
				seen[$args[0]]+=1
				k+=1
				$tmploot=$lootname[i]
				pl'Seen <<$lootname[i]>> seenset=<<lootseen[$lootname[i]]>>'
			end
		end
		i+=1
		jump 'cycle1' 
	end
	if k=0: $string = 'Ничего нового не найдено,'
	if seen[$args[0]]<lootnum[$args[0]]: 
		$string=$string+' для обнаружения еще чего-либо нового наблюдательности не хватает. <<$return>>'
	else 
		$string=$string+' вы нашли все, что можно'
	end
	*pl $string	
	
	!===========подбор==================
	set i=0
	:cycle2
	if i<arrsize('lootname'):
		if $lootloc[$lootname[i]]=$args[0]:
			if sence>=lootsence[$lootname[i]] and taken[$lootname[i]]=0:
				act 'Подобрать_'+$lootname[i]: 
					$tmp=replace($selact,'Подобрать_')
					taken[$tmp]=1
					weight=weight+wght[$tmp]
					j=arrsize('purse')
					pl 'Taken = <<$tmp>>; takenset=<<taken[$tmp]>>; вес=<<weight>>'
					dynamic $lootexe[$tmp]
					delact $selact
				end
			end
		end
		i+=1
		jump 'cycle2' 
	end

	act 'Выйти из режима осмотра':
		delact $selact
		gt $args[0]	
	end
end

и происходит что-то непонятное. Когда в функции в действии “Выйти из режима осмотра” ставлю gt $args[0] плеер выдает сообщение: ошибка. локация explore; место:при посещении; строка 108; код ошибки 111; Локации с таким именем не существует. Если ставлю gt $return - все работет штатно. В связи с этим вопрос: когда успел скурвится ARGS[0]?

TimA,
весь код, который пишется внутри “ACT”, выполняется отдельно от локации. По сути, написав ACT, ты создаёшь отдельный независимый участок кода. Вследствие этого, например, нельзя использовать JUMP чтобы напрямую перейти из действия на метку локации, в которой создавался ACT.

Также, исполняется код не в момент создания действия, а в момент выбора этого действия игроком. К тому времени, как игрок выберет действие, уже давно будет завершено выполнение функции и соответственно восстановлено значение массива $ARGS.

Сохранить переданную в функцию информацию в отдельной переменной, чтобы потом воспользоваться ей в момент выбора действия - правильный подход.

Спасибо, я уже так и сделал. Мне просто интересно было механику явления понять. Та же беда происходит и с $curloc, и видимо с другими системными переменными; но если ACT, по сути, независимые куски кода тогда все ясно.

Возник вопрос, а можно ли посчитать кол-во переводов строки в текстовой переменной, например в $stattxt?

Bumbr,
можно. Тебе понадобится цикл и функция INSTR.
Перевод строки задаётся так:

$перевод_строки = '
'

Здравствуйте, еще вопрос по HTML в AeroQSP.
Никак не могу заставить работать атрибут стиля background-image.

Spoiler
'
<table>
<tr>
<td style="background-color: #00ff00; background-image: url(''img/loc/wood.jpg'')">Некоторый текст</td>
</tr>
</table>
'

Выводится только текст, background-color работает нормально, но нужна именно картинка.

Bumbr,
в AeroQSP, путь к background-image записывается без “url()”.

Здравствуйте, возможно ли сделать так чтоб картинка в главном окне менялась в соответствии дня и ночи, (реального времени). И как можно сделать так, чтобы переход на другую локацию был за какой то промежуток времени (например, из локации дом в локацию лес, переход за 10 сек).

За 10 реальных секунд? Если да, то просто перед переходом напишите wait 10000. Это поставит игру на паузу на 10 реальных секунд.

Если речь идёт о внутриигровом времени, то просто создайте переменную время, которая будет менятся или в реальном времени (в локации-счётчике пропишите увеличение), либо при совершении игроком действий, таких как переход с локации на локацию (просто в коде действия добавите время += время_действия, где время_действия затрачиваемое время).
Смену фоновой картинки можно реализовать через локацию счётчик. Сделать там проверку по времени.

Spoiler
if часы > 0 and часы <= 6: $backimage 'ночь.jpg' & refint
if часы > 6 and часы <= 12: $backimage 'утро.jpg' & refint
if часы > 12 and часы <= 18: $backimage 'день.jpg' & refint
if часы > 18: $backimage 'ночь.jpg' & refint

Как сделать привязку к реальному времени - не знаю. В голову приходить только попросить игрока ввести его при старте, а дальше уже через локацию счётчик менять. Поставить SETTIMER 1000 и в локации-счётчике прописать секунды += 1.
Про игровое время в справке хорошо написано.
http://qsp.su/index.php?option=com_content&view=article&id=111:-10&catid=36:2009-02-19-06-11-21&Itemid=76

Я правильно понимаю, что в AeroQSP нельзя разбить игру на отдельные модули? ADDQST он вообще не распознает как действие.
Можно ли как-то обойти это или только копировать вручную всё в основной qsp-файл?

Здравствуйте, возможно ли сделать так, чтоб при переходе из одной локации в другую, появлялась смежная локация, например с монстром, и она с какой- либо вероятностью менялась на другую.

есть специальная локация название которой хранится в переменной $ONNEWLOC. В стартовой локации пишете $ONNEWLOC ‘onnewloc’ и создаете локацию onnewloc или с любым другим названием. Код прописанный в этой локации будет выполнятся при переходе с одной локации на другую.
Случайный переход на другую локацию можно реализовать так:

Spoiler
loc = rand(0,4)
if loc = 1: gt 'монстр 1'
if loc = 2: gt 'монстр 2'
if loc = 3: gt 'монстр 3'
if loc = 4: gt 'монстр 4'

rand можно прописать любой, чтобы точно подогнать шансы выпадения тех или иных событий.

Bumbr,
в локации $ONNEWLOC потребуется ещё делать проверку, с какой локации на какую происходит переход. Иначе монстры будут встречаться при переходе на любую локацию.

Кстати, нельзя использовать переменную с именем “loc” - в новой версии библиотеки это имя зарезервировано для функции. И ещё ты забыл написать присваивание.

Есть способ сделать всё проще, без использования $ONNEWLOC.

Создаём “промежуточную” локацию, например, “дорога_монстров”.
Там где у нас был переход

GOTO 'Локация 2'

заменяем на

GOTO 'дорога_монстров'

В локации ‘дорога_монстров’ пишем:

! Случайное число - 0, 1, 2, 3
monstr = RAND(0, 3)
! Если выпало число больше 0, переходим на локацию с монстром
IF monstr = 1:
  GT 'монстр1'
ELSEIF monstr = 2:
  GT 'монстр2'
ELSEIF monstr = 3:
  GT 'монстр3'
END
! Выпало число 0, монстр не встретился
GT 'Локация 2'

Log in or Register to post comments.