RU 📌 Pinned

Как сделать?

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

Aleks Versus Moderator 01.11.2016 15:36 (9 years ago)

Macmep,
проще отказаться от окна действий и реализовать их в виде обычных гиперссылок:

<a href="exec:goto 'тёмный_лес'">Идти в лес</a>

Если хорошо управляешься со слоями, не составит труда всё организовать.

St-john,

St-john:

Получается, что ты заканчиваешь if args[0]=1 и дальше у тебя идет просто общий код. Так и задумывалось?

Если я убираю end то выскакивает ошибка 112 (Многострочные формы операторов должны заканчиваться словом end)
Как же это геморно - писать диалоги, малейшая ошибка и все, может есть какой то упрощенный способ писать диалоги без всей этой х**ни ?

Aleks Versus Moderator 01.11.2016 18:03 (9 years ago)

Prizrak_07,
можешь попробовать мой модуль для диалогов easy.dialog

Prizrak_07:

Как же это геморно - писать диалоги, малейшая ошибка и все, может есть какой то упрощенный способ писать диалоги без всей этой х**ни ?

Ну, это не так уж и сложно :) Все схемы довольно простые, просто надо понимать логику происходящего. Чуть-чуть помучаешься и дальше будет уже само собой получаться. Даже если что-то не получилось сразу же, ты уже по результату будешь понимать что сделал не так и как это исправить. QSP вообще довольно прост в освоении, и это его главный плюс. Тут почти не бывает такого, что вот не понимаешь, и хоть убейся. За все время я только один раз не смог понять почему у меня код сработал именно так, а не как я задумывал.

Prizrak_07:

Если я убираю end то выскакивает ошибка 112

Я не могу знать точно, что именно ты задумывал, но скорее всего надо этот end перенести в самый конец приведенного тобой фрагмента.

St-john,

St-john:

Я не могу знать точно, что именно ты задумывал, но скорее всего надо этот end перенести в самый конец приведенного тобой фрагмента.

Уже переносил, тоже самое (ошибка 112). Чтож буду пробовать снова (может лучше будет вообще весь диалог переписать заново). Пока для меня самое сложное - это диалоги. Я делаю визуальную новеллу - RPG в мире фэнтези, и диалоги - это 80 % игры, а без диалогов и вариантов выбора RPG не RPG. Кстати сколько максимально может весить архив с игрой чтобы его можно было опубликовать здесь, или это не имеет значения ?

Aleks Versus,
Прочитал на сайте про твой модуль, и возник такой вопрос: Обязательно ли присутствие в папке с игрой фаилов “easy.dialog.qsp” и “easy.math.qsp”. чтобы все работало у игрока ? (т.е пихать их в архив с игрой или нет, когда игра будет готова ?)

Prizrak_07:

Уже переносил, тоже самое (ошибка 112)

От переноса этого end не может выскакивать ошибки. Ошибка может выскочить только если ты просто уберешь end, а не передвинешь его.

Aleks Versus Moderator 02.11.2016 11:40 (9 years ago)

Prizrak_07,
если “подключаешь” с помощью команды addqst, то обязательно. Но можно просто скопировать из этих файлов все локации в свою игру.

Диалоги писать не сложно, если изначально продумаешь весь план диалога “на бумаге”. Есть ещё модуль Олегуса, посмотреть можно здесь. И там же в теме Олегус даёт ссылку на диалог от Чешира, его исходники. Скачай http://dl.dropbox.com/u/5161162/dialog.zip и посмотри текстовый файл.

Вечером посмотрю твой диалог, поищу ошибки.

Aleks Versus Moderator 02.11.2016 14:28 (9 years ago)

Вот так выглядит твой код судя по прошлому сообщению:

Spoiler
cla 
if args[0]=0: 
	if Скретч=0: 
		'<font color=green>(Белка) — Эй ты какого х*я ты лезешь в мой дом !?</font>' 
		act'Ты говорящая белка ?!': 
			'<font color=blue>(<<$Имя>>) — <<$selact>></font>' 
			delact $selact 
			'<font color=green>(Белка) — (Вздох)Слушай этот мир полон гномов, эльфов, драконов, магов, а тебя волнует говорящая белка !?</font>' 
			wait 1000 
			if $Пол = 'Мужчина': 
				'<font color=green>(Белка) — Да я умею говорить и мне не нравиться что какой-то урод  лезет прямо ко мне в дом без приглашения !</font>' 
			end 
			if $Пол = 'Женщина': 
				'<font color=green>(Белка) — Да я умею говорить и мне не нравиться что какая-то дура  лезет прямо ко мне в дом без приглашения !</font>' 
			end 
			gs 'Скретч диалог',1 
		end 
		act 'Это ты кидал шишки в меня !': 
			'<font color=blue>(<<$Имя>>) — <<$selact>></font>' 
			delact $selact 
			if $Пол = 'Мужчина': 
				'<font color=green>(Белка) — А ты как хотел? ты же самым наглым образом полез прямо в мой дом!</font>' 
				wait 1000 
			end 
			if $Пол = 'Женщина': 
				'<font color=green>(Белка) — А ты как хотела? ты же самым наглым образом полезла прямо в мой дом!</font>' 
				wait 1000 
			end 
			'<font color=green>(Белка) — Вот я и кинул и кину еще если не прекратишь ибо нехуй !</font>' 
			gs 'Скретч диалог',1 
		end 
	end 
end 

if args[0]=1: 
	if Скретч=0 and Пакет_орехов = 1: 
		act'Попытаться успокоить белку дав ей орехи': 
			'<font color=blue>(<<$Имя>>) - Слушай прости за вторжение, я не знал что тут кто-то живет, и в качестве извинения позволь угостить тебя орехами.' 
			delact $selact 
			set Пакет_орехов = 3 
			DELOBJ 'Пакет орехов' 
			wait 1000 
			'<font color=green>(Белка) — О орешки, мои любимые !, ну ладно прощаю.</font>' 
			wait 500 
			'<font color=green>(Белка) — Тебя как звать то ?</font>' 
			'<font color=blue>(<<$Имя>>) — <<$Имя>>' 
			wait 500 
			'<font color=green>(Белка) — А меня Скретч очень приятно. ?</font>' 
			wait 500 
			'<font color=green>(Скретч) — Ну, ты обращайся, если что нужно будет, где меня найти – уже знаешь.</font>' 
			set Скретч = 1 
			gs 'Скретч диалог',2 
		end 
	end 
end 

if Скретч=0: 
	act 'Попытаться успокоить белку (Харизма)': 
		delact $selact 
		if Харизма => 8: 
			'<font color=blue>(<<$Имя>>)(Харизма УСПЕХ) (Вы прилагаете все усилия, чтобы убедить белку, что вы не враг и не хотели ее обворовать или съесть.)' 
			'<font color=green>(Белка) — Да в красноречии тебе не откажешь, ну ладно верю.</font>' 
			wait 500 
			'<font color=green>(Белка) — Тебя как звать то ?</font>' 
			'<font color=blue>(<<$Имя>>) — <<$Имя>>' 
			wait 500 
			'<font color=green>(Белка) — А меня Скретч очень приятно. ?</font>' 
			wait 500 
			'<font color=green>(Скретч) — Ну, ты обращайся, если что нужно будет, где меня найти – уже знаешь.</font>' 
			set Скретч = 1 
			gs 'Скретч диалог',2 
		end 
		if Харизма < 8: 
			'<font color=blue>(<<$Имя>>) (Харизма НЕУДАЧА) (Вы прилагаете все усилия, чтобы убедить белку, что вы не враг и не хотели ее обворовать или съесть, Но она вам не верит, вам явно недостает харизмы.)' 
			'<font color=green>(Белка) - Че-то не убедил, валика ты отсюда, а то я ребят позову, и тебе мало не покажется.</font>' 
			set Скретч = 2 
			gs 'Скретч диалог',2 
			act 'Да что эта белка может мне сделать ?': gt "Лесная братва" 
			act 'Уйти': gt "Темный лес опушка" 
		end 
	end 
end

А вот так выглядит логика твоего кода:

Spoiler

Отсюда я могу сделать вывод, что ты плохо представляешь, что такое args[0]. Так что забей на них и не пользуйся.
Проще всего управлять выводом всех действий через переменные-флаги.
В твоём диалоге всего шесть действий. Можно уж для них ввести шесть переменных-флагов. Но в принципе, можно обойтись и меньшим количеством.

Итак,

Spoiler

если я правильно понимаю, чего ты хочешь добиться. В начале диалога должны появиться три действия:
“ты говорящая белка?”
“это ты кидал шишки в меня?”
“Попытаться успокоить белку (харизма)”
Если есть пакет орехов, то должно появиться четвёртое действие: “успокоить белку, дав ему по орехам орехов”
Первые два действия должны отпадать, когда на них нажимаешь, так? Поэтому для первых двух действий определяем отдельные флаги: флаг_белка_говоришь и флаг_белка_шишки. Если значения этих переменных будут отличаться от нуля, действия выводиться не будут.
Начальный текст должен был выводиться лишь раз, поэтому для него тоже определяем флаг. флаг_белка_начало
Для действия “дать белке орехов” важно, чтобы переменная Пакет_орехов была равна единице. Оставляем только это условие.
Переменная скретч определяет на какой стадии развития находится диалог. Если она равна нулю, выводятся все реплики. Первые два действия выводятся в любом случае, пока их не выполнили, поэтому кроме их “личных” флагов, ничем их вывод не обуславливается.
Действия “успокоить” выводятся пока не выбрано хотя бы одно из них, так? Это событие определяется переменной Скретч. Причём. Если белку удалось успокоить Скретч = 1, а если не удалось Скретч = 2. Если белку успокоить не удалось выводятся два последних действия.
Иными словами, пока скретч = 0 выводятся действия “успокоить”. Если скретч =2 выводятся действия “уйти” и “чё ты мне сделаешь”. Делаем соответствующие условия. И получаем вот такой код:

cla 
if флаг_белка_начало=0:
	'<font color=green>(Белка) — Эй ты какого х*я ты лезешь в мой дом !?</font>'
	флаг_белка_начало=1
end
	if флаг_белка_говоришь=0:
		act'Ты говорящая белка ?!': 
			'<font color=blue>(<<$Имя>>) — <<$selact>></font>' 
			'<font color=green>(Белка) — (Вздох)Слушай этот мир полон гномов, эльфов, драконов, магов, а тебя волнует говорящая белка !?</font>' 
			wait 1000 
			if $Пол = 'Мужчина': 
				'<font color=green>(Белка) — Да я умею говорить и мне не нравиться что какой-то урод  лезет прямо ко мне в дом без приглашения !</font>' 
			end 
			if $Пол = 'Женщина': 
				'<font color=green>(Белка) — Да я умею говорить и мне не нравиться что какая-то дура  лезет прямо ко мне в дом без приглашения !</font>' 
			end
			флаг_белка_говоришь=1
			gs 'Скретч диалог'
		end
	end
	if флаг_белка_шишки = 0:
		act 'Это ты кидал шишки в меня !': 
			'<font color=blue>(<<$Имя>>) — <<$selact>></font>' 
			if $Пол = 'Мужчина': 
				'<font color=green>(Белка) — А ты как хотел? ты же самым наглым образом полез прямо в мой дом!</font>' 
				wait 1000 
			end 
			if $Пол = 'Женщина': 
				'<font color=green>(Белка) — А ты как хотела? ты же самым наглым образом полезла прямо в мой дом!</font>' 
				wait 1000 
			end 
			'<font color=green>(Белка) — Вот я и кинул и кину еще если не прекратишь ибо нехуй !</font>' 
			флаг_белка_шишки = 1
			gs 'Скретч диалог'
		end
	end
if Скретч=0:
	if Пакет_орехов = 1: 
		act'Попытаться успокоить белку дав ей орехи': 
			'<font color=blue>(<<$Имя>>) - Слушай прости за вторжение, я не знал что тут кто-то живет, и в качестве извинения позволь угостить тебя орехами.' 
			Пакет_орехов = 3 
			DELOBJ 'Пакет орехов' 
			wait 1000 
			'<font color=green>(Белка) — О орешки, мои любимые !, ну ладно прощаю.</font>' 
			wait 500 
			'<font color=green>(Белка) — Тебя как звать то ?</font>' 
			'<font color=blue>(<<$Имя>>) — <<$Имя>>' 
			wait 500 
			'<font color=green>(Белка) — А меня Скретч очень приятно. ?</font>' 
			wait 500 
			'<font color=green>(Скретч) — Ну, ты обращайся, если что нужно будет, где меня найти – уже знаешь.</font>' 
			Скретч = 1 
			gs 'Скретч диалог'
		end 
	end 
	act 'Попытаться успокоить белку (Харизма)': 
		if Харизма => 8: 
			'<font color=blue>(<<$Имя>>)(Харизма УСПЕХ) (Вы прилагаете все усилия, чтобы убедить белку, что вы не враг и не хотели ее обворовать или съесть.)' 
			'<font color=green>(Белка) — Да в красноречии тебе не откажешь, ну ладно верю.</font>' 
			wait 500 
			'<font color=green>(Белка) — Тебя как звать то ?</font>' 
			'<font color=blue>(<<$Имя>>) — <<$Имя>>' 
			wait 500 
			'<font color=green>(Белка) — А меня Скретч очень приятно. ?</font>' 
			wait 500 
			'<font color=green>(Скретч) — Ну, ты обращайся, если что нужно будет, где меня найти – уже знаешь.</font>' 
			Скретч = 1 
			gs 'Скретч диалог'
		end 
		if Харизма < 8: 
			'<font color=blue>(<<$Имя>>) (Харизма НЕУДАЧА) (Вы прилагаете все усилия, чтобы убедить белку, что вы не враг и не хотели ее обворовать или съесть, Но она вам не верит, вам явно недостает харизмы.)' 
			'<font color=green>(Белка) - Че-то не убедил, валика ты отсюда, а то я ребят позову, и тебе мало не покажется.</font>' 
			Скретч = 2 
			gs 'Скретч диалог' 
		end 
	end 
end
if Скретч=2:
	act 'Да что эта белка может мне сделать ?': gt "Лесная братва" 
	act 'Уйти': gt "Темный лес опушка"
end

Aleks Versus,
Да действительно я не понимал зачем нужна args[0], но на всякий случай я делал как в образце. Большое спасибо тебе что объяснил такому нубу как я. Теперь буду делать по флагам так реально легче.

St-john и Aleks Versus,
Еше раз спасибо вам за все, я включу вас в титры, если хотите то могу разместить ссылки на сайты или группы вк.(когда игра будет готова)

Aleks Versus Moderator 03.11.2016 08:29 (9 years ago)

Prizrak_07,
args[] - это переменные, которым можно передавать значения “на один раз”. Делал ты это так:

gosub 'Скретч диалог',2

Двойка после запятой, как раз и указывает, что когда плеер обратится к локации “Скретч диалог”, значение args[0] - должно быть равно 2. Это называется передача аргументов. Можно передавать девять значений, т.е. задавать на начало локации значения переменным от args[0] до args[8]. В общем виде это выглядит так:

gosub 'имя_локации',args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7],args[8]

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

время=время
дни=время/(24*60) 
часы=(время-дни*24*60)/60 
минуты=время-часы*60-дни*24*60

Так вот,как сделать чтоб определенный персонаж присутствовал на конкретной локации допустим с 11 до 15,и если он там присутствует появлялось действие? Пробовал так:

if часы >11 and минуты > 00 and часы < 15 and минуты < 00:
 '
 В комнате персонаж'
 
 act 'подойти к персонажу':
 goto 'перс':
 end
 end

В чем косяк? Сильно не пинайте,пожалуйста,туплю…. :(

Aleks Versus Moderator 04.11.2016 13:33 (9 years ago)

aplesin,
а где ты размещаешь оба этих кусочка кода?
кстати, после goto ‘перс’ двоеточие не нужно.

Косяк в том, что одновременно не могут удовлетворяться условия

if ... минуты > 00 ... and минуты < 00

Решение заключается в том, чтобы логически правильно записать свою мысль:

if (часы >11 and минуты > 00) and (часы < 15 and минуты < 00)

Однако: [] во-первых, я не уверен, что число 0 можно записывать как “00”;
[
] во-вторых, я не уверен, что минуты могут быть отрицательным числом (минуты < 0);
[*] в-третьих, если на самом деле имелся в виду интервал 12 ч 01 мин … 14 ч 59 мин,

if (часы >11 and минуты > 0) and (часы < 15 and минуты <= 59)

то моменты времени 13:00 и 14:00 не подпадают под это условие и обрабатываться не будут.
Решением может быть использование интервала 12:00…14:59.

if часы > 11 and часы < 15

Либо, если все-таки необходимо исключить 12:00 и 15:00, то

минуты_прошедшие_с_начала_суток = время - дни*(24*60)
if минуты_прошедшие_с_начала_суток > 12*60 and минуты_прошедшие_с_начала_суток < 15*60

Aleks Versus:

aplesin,
а где ты размещаешь оба этих кусочка кода?
кстати, после goto ‘перс’ двоеточие не нужно.

Кусок кода с временем в локации “статус”,выполнить при посещении, в локации “начало” использую

$ONNEWLOC="Статус"

А второй кусок кода использую непосредственно в локации где должен появится перс. так же выполнить при посещении…

evp,
Нужно именно с 12 до 15 чтоб выполнялось условие

'В комнате персонаж' 

act 'подойти к персонажу':
бла бла бла

Ща попробую новую переменную времени ввести как ты сказал…

UPD.

evp,
Спасибо за наводку,получилось:)

aplesin:

Нужно именно с 12 до 15 чтоб выполнялось условие

if часы > 11 and часы < 15

Включает в себя интервал 12:00…14:59.

Но, конечно, удобнее иметь дело с минутами. Используя минуты можно без лишних заморочек указать любой требуемый интервал.

Log in or Register to post comments.