Как сделать?
…
Jolly Roger,
файлы QSP - это не бинарный код. Это обычные текстовые файлы, зашифрованные (если можно так сказать). Так что вылетает скорее всего по причине зацикливания, явного, или неявного. В иных случаях тебе бы плеер выдал ошибку, но не вылетал. Проверь код анализатором на предмет ошибок, и исправь те, что он сможет найти. После этого, если вылеты не пропадут, начинай искать все gs и gt, которые могут рекурсивно обращаться друг к другу. В крайнем случае, действительно, отправь CoSinyS’у или мне файл игры. Лучше прикрепить его в теме, чтобы как можно больше людей поучаствовали в поиске ошибки, но если не хочется пока выставлять игру на всеобщее обозрение, то остаются только верхние варианты.
Спасибо, попробую найти ошибку.
PPS
Вроде нашел причину. Случайно запустил файл с багом с флешки, все работает.
Вот что оказалось:
Если один и тот же файл у меня запускается из (mm - папка с игрой.)
комп(работа)
1. C:\QSP\mm - стабильный вылет по типу “зацикливание”.
флешка
2. G:\MAIN\mm - норм.
комп(дом)
3. D:\QSP\mm - норм.
Почему так - ф.з. Возможно, на работе вирус. :)
Скажите пожалуйста, как сделать так, чтобы при выборе предмета появлялось его описание?
Katy,
создаёшь новую локацию с любым названием (обычно выбирают onobjsel, чтоб не путаться), это будет локация-обработчик выбора предмета.
На самой первой локации в игре пишешь
$onobjsel = 'onobjsel' & ! здесь нужно писать имя созданной локации, т.е. может быть:
! $onobjsel = 'выбор_предмета'
Допустим, у тебя есть предмет “Кленовый лист”, он уже где-то был создан. Описание к нему такое:
“Кленовый лист, кленовый лист,
Ты мне среди зимы приснись”
На локации-обработчике выбора предмета (onobjsel, да?) пишешь следующее:
if $selobj = 'Кленовый лист':
! Если выбран объект кленовый лист
! Выводим описание в окно основного описания:
*pl 'Кленовый лист, кленовый лист,
Ты мне среди зимы приснись'
! завершаем конструкцию проверки условия
end
! снимаем выделение с предмета
unsel
Jolly Roger,
А ты не пробовал на работе переустановить QSP? Лучше не с набора игрока, а взять из отдельного архива и распаковать. Или даже взять дома архив, поставить на него пароль, потом запустить QSP прямо из архива на работе и попробовать открыть игру.
Спасибо за помощь, Aleks Versus, это сработало.
А как сделать так, чтобы после того, как действие сработало один раз и исчезло, появилось новое действие?
У меня действие исчезает, а новое, которое должно было появится вместо старого, не появляется.
Katy,
это можно сделать несколькими способами. Самый простой - вложить действие в действие:
Spoiler
act 'Поднять хомяка':
! начало действия поднять хомяка
! выводим сопроводительный текст в основное описание
*pl 'Вы взяли хомяка на руки, но он стал отчаянно вырываться.'
! удаляем текущее действие
delact $selact
! вставляем новое действие
act 'Отпустить хомяка':
! начало действия отпустить хомяка
! выводим сопроводительный текст в основное описание
*pl 'Вы отпустили хомяка, и он тут же исчез в кустах.'
! удаляем текущее действие
delact $selact
! конец действия отпустить хомяка
end
! конец действия поднять хомяка
end
Есть другой способ действие по условию. Пишешь два разных действия, но одно выводится при одном значении переменной, другое при другом:
Spoiler
! начало многострочной конструкции условия:
if хомяк = 0:
! если хомяка в руках нет
act 'Поднять хомяка':
! начало действия поднять хомяка
! выводим сопроводительный текст в основное описание
*pl 'Вы взяли хомяка на руки, но он стал отчаянно вырываться.'
! выставляем маркер, чтобы знать, что хомяк в руках
хомяк = 1
! возвращаемся на текущую локацию
goto $curloc
! конец действия поднять хомяка
end
elseif хомяк = 1:
! в противном случае, если хомяк в руках
act 'Отпустить хомяка':
! начало действия отпустить хомяка
! выводим сопроводительный текст в основное описание
*pl 'Вы отпустили хомяка, и он тут же исчез в кустах.'
! выставляем маркер, чтобы знать, что хомяк отпущен
хомяк = 2
! возвращаемся на текущую локацию
goto $curloc
! конец действия отпустить хомяка
end
elseif хомяк = 2:
! в противном случае, если хомяк убежал
! ничего не делаем, этот пункт можно исключить
! конец многострочной конструкции условия
end
Спасибо. Ещё один вопрос - как сделать переход при нажатии на что-то в описании?
К примеру, описывается комната: “Обычная комната, у стены стоял шкаф, у окна кровать”. И при нажатии на слово шкаф, переходишь на локацию. Как так сделать?
Katy, это делается при помощи гиперссылок. На самой первой локации игры пишешь
usehtml = 1
Это включит распознавание html-разметки. Если есть капелька знаний по html, дальше будет проще. Если нет - советую почитать.
Гиперссылка создаётся так:
<a href="exec:!код, который нужно выполнить при нажатии на ссылку">текст, который будет выведен на экран</a>
Т.е., чтобы “создать шкаф”, по которому переходишь на новую локацию, пишешь:
<a href="exec: goto 'Тайная комната'">шкаф</a>
Будь внимательнее к апострофам и кавычкам. Справка в помощь.
Aleks Versus,
А можно как-то очистить окно дополнительного описания, когда там появляется новое описание?
Я сделала описание предметов, при нажатии на них, в дополнительном окне, но дополнительное окно не очищается само.
При использовании CLR, описание вообще не появляется, видимо я как-то неправильно это делаю.
В связи с предыдущим вопросом, также возникла проблема.
<a href="exec: goto 'Тайная комната'">шкаф</a>
Пишет, что это неизвестное действие. Если написать просто goto тайная комната без кавычек, то всё в порядке, но если нажать на шкаф, то пишет, что такой локации нет, хотя она есть.
Последняя проблема отменяется, я разобралась с ней. Я скопировала этот код, но вы, похоже, где-то написали неправильную букву, потому что когда я написала всё в ручную, у меня он заработал. И нужно было 2 раза поставить кавычки - ‘‘Тайная комната’’
Katy, вначале очистка, потом вывод описания, иначе - да, что-то неправильно)
всем привет, сразу хочу сказать спс за помощь, многое стало ясно.
но столкнулся с небольшой проблемой.
есть рандом rand (1,5)
как сделать так что бы после первого открытия к примеру rand (2), он больше не появлялся.
Spoiler
if искать = 4 and рец_стр = 0:
‘вы нашли журнал построй сам’
act ‘забрать книгу’:
addobj ‘рецепт’
рец_стр = 1
gs ‘рецепт’
gt $curloc
end
end
это понятно что по условию, но тогда, при следующем посещении пустой экран, а как сделать что бы убрать его полностью?
Katy,
Я не зря обратил твоё внимание на кавычки и апострофы, и посоветовал почитать справку. Где-то там про это подробно написано. Если ты выводишь на экран строку, то используешь апострофы (’) или двойные апострофы (”), которые мы называем кавычками:
*pl 'Строка, помещённая в апострофы'
*pl "Строка помещённая в двойные апострофы"
Но Если тебе нужно вывести например такую строку:
It’s a beautiful kitty!
В ней уже есть апостроф, и использовать апострофы для вывода не получится. Если написать просто
*pl 'It's a beautiful kitty!'
плеер заругается на неизвестное действие. Как у тебя, очевидно, и было.
В этом случае ты можешь разместить строку с апострофом между двойными апострофами:
*pl "It's a beautiful kitty!"
Или экранировать апостроф внутри строки, написав его дважды:
*pl 'It''s a beautiful kitty!'
Экранировать можно и двойные апострофы:
*pl "Магазинчик ""Лавка Чудес"" работает каждый день с 10:00 до 20:00 без перерывов и выходных"
Теперь если внимательно посмотреть на ссылку, которую я тебе составил, ты увидишь, что в ней используются как двойные апострофы, так и одинарные. Это значит, что если ты выводишь ссылку с помощью *p, *pl или как-то ещё, применяя апострофы, или двойные апострофы, нужно экранировать какую-то группу:
*pl "<a href=""exec: goto 'Тайная комната'"">шкаф</a>"
!или
*pl '<a href="exec: goto ''Тайная комната''">шкаф</a>'
Очистка дополнительного описания при выборе предмета, и вывод нового текста делается просто. На локации-обработчике выбора предмета (onobjsel?), перед строкой, которая выводит описание предмета ставишь команду clr, как тебе правильно уже подсказал CoSinyS:
if $selobj = 'Кленовый лист':
! Если выбран объект кленовый лист
! очищаем окно дополнительного описания
clr
! Выводим описание в окно дополнительного описания:
pl 'Кленовый лист, кленовый лист, Ты мне среди зимы приснись'
! завершаем конструкцию проверки условия
end
! снимаем выделение с предмета
unsel
Gefestions,
не вижу рандома в предложенном коде.
попробовал добавить
if искать =4 and рец_стр >0:
искать = rand (1,5)
end
неполучилось
!лока с действием
Spoiler
if bag = 1:
act ‘копаться в кабинете’:
minut += rand (1,5)
искать = rand (1,5)
gs ‘$мусор’
end
end
!лок хранения $мусор
Spoiler
if искать = 4 and рец_стр = 0:
‘вы нашли журнал построй сам’
act ‘забрать книгу’:
addobj ‘рецепт’
рец_стр = 1
gs ‘рецепт’
gt $curloc
end
end