RU 📌 Pinned

Как сделать?

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

Aleks Versus Moderator 10.09.2015 20:31 (10 years ago)

Jolly Roger,
файлы QSP - это не бинарный код. Это обычные текстовые файлы, зашифрованные (если можно так сказать). Так что вылетает скорее всего по причине зацикливания, явного, или неявного. В иных случаях тебе бы плеер выдал ошибку, но не вылетал. Проверь код анализатором на предмет ошибок, и исправь те, что он сможет найти. После этого, если вылеты не пропадут, начинай искать все gs и gt, которые могут рекурсивно обращаться друг к другу. В крайнем случае, действительно, отправь CoSinyS’у или мне файл игры. Лучше прикрепить его в теме, чтобы как можно больше людей поучаствовали в поиске ошибки, но если не хочется пока выставлять игру на всеобщее обозрение, то остаются только верхние варианты.

Спасибо, попробую найти ошибку.

PPS

Вроде нашел причину. Случайно запустил файл с багом с флешки, все работает.
Вот что оказалось:
Если один и тот же файл у меня запускается из (mm - папка с игрой.)
комп(работа)
1. C:\QSP\mm - стабильный вылет по типу “зацикливание”.
флешка
2. G:\MAIN\mm - норм.
комп(дом)
3. D:\QSP\mm - норм.
Почему так - ф.з. Возможно, на работе вирус. :)

Скажите пожалуйста, как сделать так, чтобы при выборе предмета появлялось его описание?

Aleks Versus Moderator 11.09.2015 14:15 (10 years ago)

Katy,

создаёшь новую локацию с любым названием (обычно выбирают onobjsel, чтоб не путаться), это будет локация-обработчик выбора предмета.
На самой первой локации в игре пишешь

$onobjsel = 'onobjsel' & ! здесь нужно писать имя созданной локации, т.е. может быть:
! $onobjsel = 'выбор_предмета'

Допустим, у тебя есть предмет “Кленовый лист”, он уже где-то был создан. Описание к нему такое:
“Кленовый лист, кленовый лист,
Ты мне среди зимы приснись”
На локации-обработчике выбора предмета (onobjsel, да?) пишешь следующее:

if $selobj = 'Кленовый лист':
! Если выбран объект кленовый лист
! Выводим описание в окно основного описания:
*pl 'Кленовый лист, кленовый лист,
Ты мне среди зимы приснись'
! завершаем конструкцию проверки условия
end
! снимаем выделение с предмета
unsel
Aleks Versus Moderator 11.09.2015 14:20 (10 years ago)

Jolly Roger,
А ты не пробовал на работе переустановить QSP? Лучше не с набора игрока, а взять из отдельного архива и распаковать. Или даже взять дома архив, поставить на него пароль, потом запустить QSP прямо из архива на работе и попробовать открыть игру.

Спасибо за помощь, Aleks Versus, это сработало.
А как сделать так, чтобы после того, как действие сработало один раз и исчезло, появилось новое действие?
У меня действие исчезает, а новое, которое должно было появится вместо старого, не появляется.

Aleks Versus Moderator 11.09.2015 15:48 (10 years ago)

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

Спасибо. Ещё один вопрос - как сделать переход при нажатии на что-то в описании?
К примеру, описывается комната: “Обычная комната, у стены стоял шкаф, у окна кровать”. И при нажатии на слово шкаф, переходишь на локацию. Как так сделать?

Aleks Versus Moderator 12.09.2015 09:23 (10 years ago)

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

Aleks Versus Moderator 12.09.2015 16:36 (10 years ago)

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

Log in or Register to post comments.