RU 📌 Pinned

Как сделать?

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

Объясни подробнее, пожалуйста.
Как я понял из твоего сообщения. У нас существует локация ‘Menu.ui’ В ней находится подлокация в виде $ARGS=‘Main’.
Ты приводишь следующий код:

Spoiler
$ui.DataSelect = 'Menu/Main'

!Определение локации для перехода:
$UICut.DataSelect = $UI.DataSelect
IF INSTR($UICut.DataSelect,'/') ! 0:
UICut.Mark['end'] = INSTR($UICut.DataSelect,'/')-1
$UICut.DataMid = UCASE(MID($UICut.DataSelect,0,UICut.Mark['end']))
$UICut.SubDataMid = MID($UICut.DataSelect,UICut.Mark['end']+2)
GS '<<$UICut.DataMid>>.ui'
ELSE:
$UICut.DataMid = UCASE($UICut.DataSelect)
GS '<<$UICut.DataMid>>.ui'
END

Я протестировал этот код. В итоге я попадаю на локацию ‘Menu.ui’, но не в подлокацию ‘Main’.
Ты приводишь в коде такую переменную:

$UICut.SubDataMid = MID($UICut.DataSelect,UICut.Mark['end']+2)

Но при этом не используешь её. Значение этой переменной как раз равняется ‘Main’.
То ли ты не дописал код - потому что задача, которую я хотел решить как раз и состоит в том, чтобы попасть в подлокацию ‘Main’, то ли я не понял что и к чему.
В соответствии с моими знаниями, единственное, как мы можем попасть в данную подлокацию - это дописав через запятую неиспользованную переменную $UICut.SubDataMid сразу после GS ‘<<$UICut.DataMid>>.ui’. То есть:

GS '<<$UICut.DataMid>>.ui', '<<$UICut.SubDataMid>>'

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

Spoiler

Мне это нужно для работы динамиков. Здесь вычисляется местоположение НПС в определённое время.
Соответственно, я использую этот массив $NPC[’<<args[9]>>_22’] (который отражает местонахождение ученика в данный момент в соответствии с другой, неупомянутой переменной) для перехода на заданную локацию.

If Hour >= 8 and Hour < 18:
If Args[9]/20 = 0:
$NPC['<<args[9]>>_22'] = "Школа","Класс_1" & !%Место загвоздки%
End
End

В этом коде всё работает до той поры, пока не попытаешься припихнуть сюда подлокацию. Если будет просто “Школа” - всё работает. Но на подлокацию мы не попадём. А у меня уже созданы все эти локации, в большом количестве. И не хотелось бы сильно менять код… Поэтому и нужно узнать, существует ли возможность через переменную перейти сразу на заданную подлокацию.
В общем это всё тяжело объяснить, не приводя огромное количество кода. Вопрос не такой сложный, но решение этого вопроса не очевидно для меня. Я думал, что это теоретически можно сделать, правильно указав кавычки и скобки. Но судя по всему, плеер всегда будет считывать это как название одной локации, не желая учитывать временный массив…

Mushinia,

$test = "'Школа','Класс_1'"
dynamic 'gs <<$test>>'

?

Mushinia,
Прочитай внимательно весь текст, что я тебе написал и поймешь.
Вырезанное значение может быть полезно, если 1 значение совпадает с названием второго.
Да есть недостаток в том, что нужно правильно расставить проверку.
Если не понял, тебе уже подсказали как сделать через передачу.
Однако, раз уж ты разобрал мой код, то все понял.
Но ты не очень внимательно читаешь.

Много раз перечитывал, проверил всё в силу своих возможностей!
Я только учусь, поэтому может какие-то детали просто упускаю :(
Сейчас проверю, что предложил Engineer.

Engineer,
Если использовать это вообще, то работает.
В моём случае, в динамиках, игра крашится.

Mushinia,
Я лишь ответил на вопрос, “как запихнуть в одну переменную возможность перехода на подлокацию”, т.е. два аргумента для gs (или gt). Остальное смотри в своем коде. Наверняка где-то цикл бесконечный, если плеер перестает отвечать.

Aleks Versus Moderator 03.03.2021 05:32 (4 years ago)

Mushinia,
лучше задавать вопрос в виде конкретной задачи. Например: “Можно ли на одной локации сделать несколько мест? И как это сделать?” Из твоего вопроса не ясно, зачем нужна локация “Школа”, если ты переходишь потом на локации “Класс_1”, “Класс_2” и т.д. Возможно, перепутаны понятия: локация - блок кода, и локация - конкретное место. Но, насколько я понимаю, переход и не должен происходить. Вот пример путешествия по школе, как я думаю, он у тебя должен выглядеть:

!# школа
If $args[0]='' or $args[0]='холл':
   *pl "Я стою посреди школьного холла. Отсюда я могу попасть в любой из классов"
   act "В класс 1":
       goto 'школа','Класс_1'
   end
   act "В класс 2":
       goto 'школа','Класс_2'
   end
end
If $ARGS[0]='Класс_1':
   *pl "Я нахожусь в Классе 1"
   act "Выйти в холл":
       goto 'школа','холл'
   end
End
If $ARGS[0]='Класс_2':
   *pl "Я нахожусь в Классе 2"
   act "Выйти в холл":
       goto 'школа','холл'
   end
End

Здравствуйте. У меня небольшая загвоздка. Вылезает часть текста не так, как планировалось. И действие “не оплачивать проезд” особенно при повторном посещении локации, надо прожимать иногда несколько раз, с первого раза почему-то не срабатывает. Не поможете?

Spoiler

if место_занято=1 and проезд_оплачен=0:
*nl
*nl “К тебе подошел кондуктор.”
*nl
*nl “-Здесь что за проезд?!”
act “Оплатить проезд”:
проезд_оплачен=1
оплачен_на_месте=1
goto $curloc
end
end

if место_занято=1 and проезд_оплачен=0:
*nl
*nl “Тебе не очень хочется оплачивать проезд, поэтому ты делаешь вид, что не замечаешь кондуктора.” (!!! Проблема в том, что вылезает эта строка, сразу после фразы -Здесь что за проезд?!”. Задумывалось, что она будет появляться только после действия “Не оплачивать проезд”!!!)
act “Не оплачивать проезд”:
*nl
*nl “Немного подождав, и поняв, что ты оплачивать проезд не собираешься…”
*nl
*nl “-За проезд будем оплачивать!!!? - снова спросил кондуктор, повышая голос.”
конфликт=rand (1) !!! Тут пока для теста первый вариант конфликта, в дальнейшем планируется добавить еще несколько вариантов.
delact “Оплатить проезд”
goto $curloc
end
end

if конфликт=1:
*nl
*nl “Ты пробуешь схитрить, и просящим тоном говоришь.”
*nl
*nl “-Я деньги потерял, можно я так проеду, тут недалеко?”
ответ_кондуктора=rand (1,2)
end

if ответ_кондуктора=1:
*nl
*nl “-Что, на проезд заработать не можешь? Потерял он, ага! Ладно, езжай уж. Работать надо, а не побираться!”
место_занято=1
проезд_оплачен=1
delact “Не оплачивать проезд”
delact “Оплатить проезд”
end

if ответ_кондуктора=2:
*nl
*nl “-Я тут не собираюсь штрафы за каждого безбилетника платить! Меня тоже проверяют! Нет денег, пешком тогда ходи! Давай, на выход.”
*nl
*nl “-Останови автобус! - потребовал кондуктор у водителя.”
*nl
*nl “Водитель остановился и открыл двери.”
*nl
*nl “-Выходим! - потребовал кондуктор.”
delact “Не оплачивать проезд”
delact “Оплатить проезд”
act “Выйти из автобуса”:
goto “Улица”
end
end

if проезд_оплачен=1 and оплачен_на_месте=1:
*clr
*nl
*nl “Ты оплачиваешь проезд. Кондуктор пересчитав твои деньги выдает тебе билет и сдачу, и отправляется дальше по салону.”
end

if место_занято=1 and проезд_оплачен=1:
act ‘Выйти на остановке “Коммунистическая площадь”’:
time+=20
gs “Календарь”
goto “Площадь”
сел_в_автобус=0
end
end

Нубай,
Доброго времени вам. Позвольте узнать - это весь код на локации?
Так же смущают данные строки кода:

if место_занято=1 and проезд_оплачен=0:
*nl
*nl “К тебе подошел кондуктор.”
*nl
*nl “-Здесь что за проезд?!”
act “Оплатить проезд”:
проезд_оплачен=1
оплачен_на_месте=1
goto $curloc
end
end

if место_занято=1 and проезд_оплачен=0:

Весь код, не скрытый в блоки (Act) выполняется сразу один за другим.
При одном условии - будут исполнятся оба. А условие одно. Непорядок.

Я бы посоветовал (хоть другие осудят) использовать перенос строки вместо *nl’’ (пустого, прошу заметить).
Облегчит работу с текстом при том же результате. А для удобства можете выставить “Перенос строки по словам” в QGen (вкладка “Редактор кода”).

Вообще, на мое личное мнение, у вас главная проблема - с условиями.

Нубай,

Нубай:

*nl “Тебе не очень хочется оплачивать проезд, поэтому ты делаешь вид, что не замечаешь кондуктора.” (!!! Проблема в том, что вылезает эта строка, сразу после фразы -Здесь что за проезд?!”. Задумывалось, что она будет появляться только после действия “Не оплачивать проезд”!!!)

Сам же и отвечаешь себе. Если после действия - то и запихивай в акт. Учти однако, что если в акте стоит gt curloc, текст ты не увидишь, т.к. он обновит локацию.
Ты вводишь очень много лишних переменных, повторю еще раз - напиши алгоритм на листочке (если, то, все со стрелочками и т.д.) и тебе не нужно будет городить огороды и путаться с актами и курлоками.
Если не осилишь, сбрасывай полный код локации, распишу с комментариями.

Вот полный код локации, с ошибками конечно же. Я вроде стараюсь минимум переменных вводить. Опять же заметил, что у всех свой стиль, если так можно сказать программирования. Мне просто так, как я делаю сейчас понятно, для меня по крайней мере. Если будет слишком мастерский пример кода от вас, то скорее его, я его просто не пойму, в виду малого объема знаний, пытаюсь, но…Извиняюсь за задержкой, реал неожиданно накрыл рутиной.

Spoiler

if сел_в_автобус=1:
проезд_оплачен=0
место_занято=0
end

*nl
*nl “Ты зашел в автобус.”

if hour>=6 and hour<7:
*nl “Сейчас раннее утро, и в автобусе почти нет пассажиров.”
end

if hour>=7 and hour<8:
час_пик=1
*nl
*nl ‘Сейчас “час пик”, и в автобусе очень много пассажиров.’
end

if hour>=8 and hour<10:
*nl
*nl “Сейчас утро, и в автобусе немного пассажиров.”
end

if hour>=10 and hour<13:
*nl
*nl “Сейчас первая половина дня, и в автобусе среднее количество пассажиров.”
end

if hour>=13 and hour<14:
*nl
*nl “Сейчас обеденное время, и в автобусе довольно много пассажиров.”
обед=1
end

if hour>=14 and hour<17:
*nl
*nl “Сейчас вторая половина дня, и в автобусе среднее количество пассажиров.”
end

if hour>=17 and hour<19:
час_пик=1
*nl
*nl ‘Сейчас “час пик”, и в автобусе очень много пассажиров.’
end

if hour>=19 and hour<21:
*nl
*nl “Сейчас вечер, и в автобусе немного пассажиров.”
end

if hour>=21 and hour<23:
*nl
*nl “Сейчас поздний вечер, и в автобусе почти нет пассажиров.”
end

if проезд_оплачен=0 and место_занято=0:
act “Подойти к кондуктору”:
проезд_оплачен=1
оплачен_на_входе=1
место_занято=0
goto $curloc
end
end
if час_пик=1:
delact “Подойти к кондуктору”
end

if проезд_оплачен=1 and оплачен_на_входе=1:
*clr
*nl
*nl “Ты подошел к кондуктору и оплатил проезд.”
end

if место_занято=0:
act “Занять место в начале автобуса”:
место_занято=1
занял_в_начале=1
goto $curloc
end
if обед=1 or час_пик=1:
delact “Занять место в начале автобуса”
end
act “Встать в середине автобуса”:
место_занято=1
занял_в_центре=1
goto $curloc
end
if час_пик=1:
delact “Встать в середине автобуса”
end
act “Занять место в конце автобуса”:
место_занято=1
занял_в_конце=1
goto $curloc
end
if обед=1 or час_пик=1:
delact “Занять место в конце автобуса”
end
act “Занять любое сидячее место”:
место_занято=1
занял_сидячее=1
goto $curloc
end
if обед=1 or час_пик=1:
delact “Занять любое сидячее место”
end
act “Занять любое стоячее место”:
место_занято=1
занял_стоячее=1
goto $curloc
end
end

if место_занято=1:
if занял_в_начале=1:
*clr
*nl
*nl “Ты прошел в начало салона автобуса и сел в свободное кресло.”
end
if занял_в_центре=1:
*clr
*nl
*nl “Ты занял место стоя у окна в середине салона автобуса, облокотившись на поручень.”
end
if занял_в_конце=1:
*clr
*nl
*nl “Ты прошел в самый конец салона автобуса и занял свободное кресло у окна.”
end
if занял_сидячее=1:
*clr
*nl
*nl “Оглядев салон автобуса, ты увидел свободное кресло и поспешил его занять.”
end
if занял_стоячее=1:
*clr
*nl
*nl “Ты оглядел салон автобуса, но все сидячие места были заняты пассажирами. Ты выбрал более-менее свободное место, и встал держась рукой за поручень.”
end
end

if место_занято=1 and проезд_оплачен=0:
*nl
*nl “К тебе подошел кондуктор.”
*nl
*nl “-Здесь что за проезд?!”
act “Оплатить проезд”:
проезд_оплачен=1
оплачен_на_месте=1
goto $curloc
end
end

!!! Эту часть я наконец смог сделать, так, как мне надо в плане диалога
if место_занято=1 and проезд_оплачен=0:
act “Не оплачивать проезд”:
отказ_платить=1
*nl
*nl “Тебе не очень хочется оплачивать проезд, поэтому ты делаешь вид, что не замечаешь кондуктора.”
delact “Оплатить проезд”
if отказ_платить=1:
*nl
*nl “Немного подождав, и поняв, что ты оплачивать проезд не собираешься…”
*nl
*nl “-За проезд будем оплачивать!!!? - снова спросил кондуктор, повышая голос.”
delact “Не оплачивать проезд”
конфликт=rand (1)
end
end
end

!!! Эту часть временно исключил из обработки, так как не работает, так, как надо. Подозреваю, что из-за curloc’а, хотя с этим кодом плеер видит и переходит на конфликт, но не совсем корректно текст отображается.
!if место_занято=1 and проезд_оплачен=0 and отказ_платить=1:
!!*nl
!*nl “Немного подождав, и поняв, что ты оплачивать проезд не собираешься…”
!*nl
!*nl “-За проезд будем оплачивать!!!? - снова спросил кондуктор, повышая голос.”
!конфликт=rand (1)
!goto $curloc
!end

!!! А вот эта часть не хочет работать, задумывается, что будет несколько вариантов, после отказа ГГ платить, но плеер не хочет ее видеть. А как заставить видеть пока не понятно.
if конфликт=1:
*nl
*nl “Ты пробуешь схитрить, и просящим тоном говоришь.”
*nl
*nl “-Я деньги потерял, можно я так проеду, тут недалеко?”
ответ_кондуктора=rand (1,2)
end

if ответ_кондуктора=1:
*nl
*nl “-Что, на проезд заработать не можешь? Потерял он, ага! Ладно, езжай уж. Работать надо, а не побираться!”
место_занято=1
проезд_оплачен=1
delact “Не оплачивать проезд”
delact “Оплатить проезд”
end

if ответ_кондуктора=2:
*nl
*nl “-Я тут не собираюсь штрафы за каждого безбилетника платить! Меня тоже проверяют! Нет денег, пешком тогда ходи! Давай, на выход.”
*nl
*nl “-Останови автобус! - потребовал кондуктор у водителя.”
*nl
*nl “Водитель остановился и открыл двери.”
*nl
*nl “-Выходим! - потребовал кондуктор.”
delact “Не оплачивать проезд”
delact “Оплатить проезд”
act “Выйти из автобуса”:
goto “Улица”
end
end

if проезд_оплачен=1 and оплачен_на_месте=1:
*clr
*nl
*nl “Ты оплачиваешь проезд. Кондуктор пересчитав твои деньги выдает тебе билет и сдачу, и отправляется дальше по салону.”
end

if место_занято=1 and проезд_оплачен=1:
act ‘Выйти на остановке “Коммунистическая площадь”’:
time+=20
gs “Календарь”
goto “Площадь”
сел_в_автобус=0
end
end

Нубай,
Хм, мне кажется, у тебя ошибка в архитектуре кода.
Ты проводишь постоянные обновления и проверки, вместо того, чтобы создавать под-действия в том же IF, продолжая код.
230+ строк кода на проезд - это слишком круто. В плохом смысле. Лишняя детализация в проезде не добавит шарма игре. Особенно, если игроку необходимо будет ездить на автобусе часто. Это ошибка дизайна игры.
И большое число !!!???!? - режет глаз. За $curloc смотри выше.

Spoiler

!!! А вот эта часть не хочет работать, задумывается, что будет несколько вариантов, после отказа ГГ платить, но плеер не хочет ее видеть. А как заставить видеть пока не понятно.

! -= HronoS.: если убрать лишние перепроверки - работает отлично. =- !

if конфликт=1:
*nl
*nl “Ты пробуешь схитрить, и просящим тоном говоришь.”
*nl
*nl “-Я деньги потерял, можно я так проеду, тут недалеко?”
ответ_кондуктора=rand (1,2)
if ответ_кондуктора=1:
*nl
*nl “-Что, на проезд заработать не можешь? Потерял он, ага! Ладно, езжай уж. Работать надо, а не побираться!”
место_занято=1
проезд_оплачен=1
delact “Не оплачивать проезд”
delact “Оплатить проезд”
end
if ответ_кондуктора=2:
*nl
*nl “-Я тут не собираюсь штрафы за каждого безбилетника платить! Меня тоже проверяют! Нет денег, пешком тогда ходи! Давай, на выход.”
*nl
*nl “-Останови автобус! - потребовал кондуктор у водителя.”
*nl
*nl “Водитель остановился и открыл двери.”
*nl
*nl “-Выходим! - потребовал кондуктор.”
delact “Не оплачивать проезд”
delact “Оплатить проезд”
act “Выйти из автобуса”:
goto “Улица”
end
end
end

Добавлено: У тебя немного не согласован конфликт. Я не могу найти (может, из-за размера кода) что будет делать игра, есликонфликта не будет.

Edited at 31.03.2021 20:03 (4 years ago)

Нубай,
Я заболел, т.ч. сорян, посмотрю позже.

HronoStranger:

Ты проводишь постоянные обновления и проверки, вместо того, чтобы создавать под-действия в том же IF, продолжая код.

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

Доброго времени. У меня вот такой вопрос: сложно ли на qsp реализовать, хоть какой-то, рогалик и занимался ли кто таким?

Log in or Register to post comments.