- Сообщений: 25
- Спасибо получено: 34
1 Задавайте конкретные вопросы. Для болтовни есть свободный раздел.
2 По возможности давайте конкретные ответы.
3 Один вопрос=одна тема. Если хотите задать ещё вопрос, то начинайте новую тему.
4 Название темы должно составлять сам вопрос, и быть максимально конкретным. Рекомендуется начинать тему словами "Как", "Что", "Почему". А первый пост повторяет вопрос и даёт расширенные сведения.
5 Рекомендуется указывать версию мейкера (2000, 2003, RMXP, RMVX, ACE, IGM, и.т.д.. Это важно, и всё равно ведь спросят.
6 Темы "Пара вопросов", "Помогите", и подобные им - самый лёгкий путь к бану.
7 Поиск находится вверху справа.
А. Названия подразделов этого раздела уточняются. Советы принимаются.
Сократить количество переменных
Допустим, ГГ знакомится с НИПом.
Он может узнать имя НИПа сразу(знание1). А может потом.
В определенный момент разговора он узнает, что данный НИП является беглым преступником (знание2). А может, и не узнает.
Затем он, если поинтересуется, может узнать, что данный НИП является профессиональным взломщиком (знание3).
Опционально этот НИП присоединяется к партии.
В результате, наткнувшись на сложный замок, ГГ может попросить этого НИПа его взломать, если знает о его навыках.
Итого получается такая схема, что задействованы аж 3 переменных.
Вопрос: можно ли как-то оптимизировать этот момент, но без ущерба разнообразию?
Чуть ниже схематичный пример диалога (не обязательно, но для большей наглядности):
Джек (Д) - НИП
Алрик (А) - ГГ
1.
Д: *Сидит под замком*
А: *заходит*
Д: Привет, незнакомец! Ты не мог бы выпустить меня?
А: Да не вопрос, мне как раз попался ключ от камеры *Выпускает Д*
Д: Спасибо!
А: Не за что. А теперь я пошел.
(Результат: ГГ не знает о НИПе ничего)
2.
Д: *Сидит под замком*
А: *заходит*
Д: Привет, незнакомец! Ты не мог бы выпустить меня?
А: Погоди-погоди. Ты кто такой есть и почему здесь сидишь?
Д: Меня зовут Джек. Меня посадили за кражу, но теперь все ушли, и мне остается умирать голодной смертью.
А: Да, это печально. Я тебя выпущу, у меня как раз есть ключ от камеры *Выпускает Д*
Д: Спасибо!
А: Не за что. А теперь я пошел.
Д: Хочешь, я присоединюсь к тебе?
А: Нет.
(Результат: ГГ знает, что НИП преступник и его имя)
3. Д: *Сидит под замком*
А: *заходит*
Д: Привет, незнакомец! Ты не мог бы выпустить меня?
А: Погоди-погоди. Ты кто такой есть и почему здесь сидишь?
Д: Меня зовут Джек. Меня посадили за кражу, но теперь все ушли, и мне остается умирать голодной смертью.
А: Если я тебя выпущу, то что мне за это будет?
Д: Я тебе пригожусь. Я могу показать тебе, где спрятаны древние сокровища. И могу обезвредить любую ловушку и взломать любой замок на пути к ним.
А: А камеру-то чего не взломал?
Д: А чем? У меня же все забрали.
А: Понятно. Ну ладно, освобожу тебя.
Д: Спасибо!
А: Показывай свои древние сокровища.
*Джек присоединяется к партии*
(Результат: ГГ знает о НИПе все, что может узнать в данный момент)
В данном примере уже используется две переменных. По ходу сюжета ГГ вариативно может узнать о том же НИПе еще какую-то информацию, которая в дальнейшем выстрелит, так что переменных в итоге получается невообразимое количество.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Переменная=1 - узнал имя
Переменная=2 - узнал имя, а потом узнал профессию
Переменная
- узнал имя, потом узнал профессию, а потом - про навык взлома.Если же все эти знания независимы, и герой может узнать про то, что этот человек обладает навыком взлома, а ни об имени, ни о преступных его наклонностях не ведать, то имеет смысл пользоваться не переменными, а переключателями: ВЫКЛ - не знает, ВКЛ - знает.
Ну и не вижу особого смысла на них экономить: что переменные, что переключатели абсолютно бесплатны, а какие-то хитрые костыли могут в итоге вылиться в кучу багов.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Ну и не вижу особого смысла на них экономить: что переменные, что переключатели абсолютно бесплатны, а какие-то хитрые костыли могут в итоге вылиться в кучу багов.
У переменных есть свойство заканчиваться и вопросом экономии переменных задается не только автор поста (8
В конкретно этом случае, экономить переменные будет сложно, так как ГГ может узнавать что-то про НПЦ в процессе игры. Но совершенно ни к чему использовать больше одной переменной, надо просто мыслить чуть-чуть шире и пойти в сложнейшую математику двухзначных чисел, а то и О УЖАС трёхзначных. Сча поясню.
Тут сразу же встает вопрос, а что конкретно будет узнаваться по ходу игры и вот примеры.
Допустим:
У нас есть 3 стартовых варианта:
- ГГ просто взял его в пати узнав имя и мы даём переменной значение 10
- ГГ узнал профессию, даём значение 20
- ГГ узнал ещё и о навыке, даём значение 30
- ГГ знал только имя и узнал кашеварение 100 лвл - мы даём значение переменной 11
- ГГ знал и про профессию - даём значение 21
- ГГ знал всё и узнал что-то новое - даём значение 31
- ГГ ничего не узнал нового, оставляем 10\20\30
И вот настал момент, нам пора узнать, что наш НПЦ копрофил, что позволит нам выслужиться перед копро-батюшкой в храме. Че делаем:
- ГГ знал только имя и узнал кашеварение 100 лвл, теперь догнал и про копрофилию - делаем 13
- ГГ знал и про профессию, узнал и про любовь к калу - даём значение 23
- ГГ знал всё и узнал что-то новое - даём значение 33
- ГГ ничего не узнал нового, оставляем 10\20\30 или если знал про кашу 11\21\31
- ГГ не знал про кашу, но узнал про любовь к извращениям с фикалиями делаем 12\22\32
Надеюсь далее объяснять логику не нужно? Да придется сразу продумать все возможные варианты и оставить для себя небольшое поле для манёвра. Но это не так сложно, как могло бы показаться.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
который даст ещё тонну. Дми вон недавно выкладывал плагин, который позволяет каждому событию присваивать локальную переменную, если вдруг это зачем-то надо.
Впрочем, вариант с использованием разрядов в числах я тоже рассматривал, но чисто теоретически, без шансов воплотить его в реальности.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Ну ок, да лимит переменных 5000. Это ж до фига много!
Для крупного проекта, это не так уж много. Просто пара примеров.
В игре 10 фракций, у которых есть репутация, репутация влияет на реакцию каждого отдельного НПЦ, на реакцию каждого отельного НПЦ влияет ещё и его личная история, даже, настроение. НПЦ на 10 фракций у нас 200 человек (те, с которыми мы можем работать), чтобы суммировать всё это дело и грамотно проверять реакцию нам необходимо хотя бы по 1 переменной, а лучше по 2, на каждого НПЦ. Это уже 400 штук, ну и репа фракций 410.
У нас есть 10 навыков, каждый навык имеет свои бонусы от вещей, состояний и всего остального, так же и штрафы. Чтобы работать со всем этим было удобно, желательно выделить по 3 переменных на навык. Текущее значение\штраф\бонус. И вот ещё 30 штук.
А там еще квесты, где нужны переменные, ачивки, другие всякие механики, рандомы\погоды\строительство и крафты ну и т.д...
Набрать на 5к переменных можно довольно быстро и сам не заметишь как. Да, далеко не всем проектам это нужно, я не буду спорить, но ведь может случиться так, что и нужно (8 но всё это ведь не относится к вопросу, не так ли?
Если же мы говорим о конкретном примере из вопроса, то зачем нам плодить переменные - это не так удобно. Куда удобнее когда за 1 персонажа будет отвечать 1 переменная, вместо 10. Ты будешь знать какое значение и где должно быть и проверить его будет намного проще, чем постоянно листать список переменных (очень уж это в тесте делать неудобно, стандартными средствами), особенно если НПЦ будет не 2-3, а штук 20.
По этому оптимизировать количество необходимых переключателей и переменных, по моему здравая идея (8 даже, если вопрос не тупой экономии числа переменных.
Плагины - дело совершенно другого порядка (8 да и зачем они, когда можно без них.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Но ведь если у нас 200 человек с одинаковыми параметрами, использовать для них стандартный интерфейс для переменных неудобно. В современных мейкерах даже убрали непрямое обращение «переменная с № из другой переменной», то есть стандартным интерфейсом переменных нам придётся вручную 200 раз повторять одно и то же...Безликий пишет: В игре 10 фракций, у которых есть репутация, репутация влияет на реакцию каждого отдельного НПЦ, на реакцию каждого отельного НПЦ влияет ещё и его личная история, даже, настроение. НПЦ на 10 фракций у нас 200 человек (те, с которыми мы можем работать), чтобы суммировать всё это дело и грамотно проверять реакцию нам необходимо хотя бы по 1 переменной, а лучше по 2, на каждого НПЦ. Это уже 400 штук, ну и репа фракций 410.
Скорее всего, вы не повторяете одно и то же 200 раз, а используете скрипты для того, чтобы обратиться к переменной по номеру другой переменной. А раз вы всё равно используете скрипты, то зачем вам вообще переменные? Храните данные где-то ещё (в простейшем случае можно в начале игры сделать [tt]$gameSystem.npcMood = new Array(201).fill(0);[/tt] а потом обращаться к нему через [tt]$gameSystem.npcMood[1] = 1;[/tt])
Или, если удобнее использовать переменные через скрипты, то можно просто убрать ограничение на 5000 переменных: в [tt]Game_Variables.prototype.setValue[/tt] проверку [tt]$dataSystem.variables.length[/tt] надо заменить на [tt]10000[/tt], и будет 10 000 переменных. Да, оставшиеся 5000 будут без названия и работать с ними можно будет только через скрипты — но ведь вы и так будете работать с ними через скрипты, так что какая разница?
Ну, это полностью вопрос вкуса. Кому-то удобнее 1 переменная, кому-то 20.Безликий пишет: Если же мы говорим о конкретном примере из вопроса, то зачем нам плодить переменные - это не так удобно. Куда удобнее когда за 1 персонажа будет отвечать 1 переменная, вместо 10. Ты будешь знать какое значение и где должно быть и проверить его будет намного проще, чем постоянно листать список переменных (очень уж это в тесте делать неудобно, стандартными средствами), особенно если НПЦ будет не 2-3, а штук 20.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Даже ответ на мой пример, ты приводишь массивы и вынос значений "за редактор", ну камон. Почему вы всё стараетесь перевести в понятные только вам места? (8 Не все могут в программирование (и открою тайну, очень многие даже не хотят туда мочь) и пойдут делать всё на переменных и переключателях, по тому как никакие скрипты для этого не нужны.
Опять же, сам себе кидаешь контраргумент, сначала "если у вас 200 переменных, то вы наверняка используете скрипты", а потом "дело вкуса, кому-то удобнее 1, кому-то 20". Так может я принципиально не использую скрипты? У меня вот есть пример, который принципиально не использует плагины... Дело вкуса же.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Создаём тип навыков "Скрытый" и навыки с этим типом: "Взлом", "Монгольский язык", "Тётка в Саратове", "Родинка на пятке"... Когда надо какую-то из особенностей получить, заставляем персонажа выучить этот навык и потом, когда понадобится, проверяем его наличие. При этом персонаж может вообще не иметь доступа к этой группе навыков, они не будут отображаться в меню навыков, но всё равно будут у него в наличии, будут изучаться и учитываться при проверке.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
в данном случае у нас есть три хар-ки:
- знает или нет имя НИПа
- является ли беглым преступником
- является ли профессиональным взломщиком
все три пункта имеют два значения - "да" и "нет". а значит нам вообще незачем брать переменные и лучше взять переключатели. и всё.
незачем усложнять, вводя переменные так как если у нас переменные то сразу мы начинаем вспоминать а какие значения там могут быть? по логике должно быть два но раз у нас переменная то значит есть еще кроме 1 и 0? в итоге мы ищем переключатели, смотрим где они задействуются. лишняя путаница и мучения памяти. а вот с переключателями все понятно.
про то, что следует пихать разные данные в одну переменную тоже лучше забыть - кроме путанницы это ничего не даст. также вполне может быть: ты чуть поменяешь квест и добавится четвертая хар-ка или изменится логика. а значит если одна переемнная то придется все координально переделывать. а если у тебя три отдельных переключателя то их вообще не трогаешь, просто добавляешь четвертый
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
К примеру, создал переменную и назвал ее Алрик (по имени ГГ). И нарисовал себе такую шпаргалку.
Буду тестить)))
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
1 - имя
2 - беглый преступник
3 - имя и преступник
4 - взломщик
5 - имя и взломщик
6 - беглый преступник и взломщик
7 - имя, преступник и взломщик
8 - быстро бегает
9 - имя и быстро бегает
10 - беглый преступник и быстро бегает
11 - имя беглый преступник и быстро бегает
Ну, и т д
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Lekste пишет: Одна переменная:
То есть, с полудесятком-десятком триггеров разбираться сложно, а с этой таблицей телефонных кодов - нет?
Я представил, сколько тут надо будет проверок, чтобы выяснить, является ли персонаж беглым преступником. Это же надо будет проверить, равна ли переменная 2, или 6, или 7, или 10, или 11...
Мне кажется, такое могло бы использоваться при жёсткой нехватке переменных, но вряд ли хоть кому-то добавит удобства.
Система Элофа-Безликого хотя бы может быть оптимизирована за счёт отбрасывания лишних разрядов, но и то мне интересно посмотреть, оправдает ли она себя на практике.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Братец Лис
-
- Не в сети
- Захожу иногда
-
- Злая неадекватная скотина
- Сообщений: 158
- Спасибо получено: 167
Eloth001 пишет:
Буду тестить)))
Я бы в данном случае заюзал переключатели, и не парился с переменными.
Меньше возни с проверками нужного свойства в будущем.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Братец Лис
-
- Не в сети
- Захожу иногда
-
- Злая неадекватная скотина
- Сообщений: 158
- Спасибо получено: 167
Lekste пишет: Одна переменная:
1 - имя
2 - беглый преступник
3 - имя и преступник
4 - взломщик
5 - имя и взломщик
6 - беглый преступник и взломщик
7 - имя, преступник и взломщик
8 - быстро бегает
9 - имя и быстро бегает
10 - беглый преступник и быстро бегает
11 - имя беглый преступник и быстро бегает
Ну, и т д
ну и как тут проверить не городя огород, является ли, например, беглым преступником? Я в скрипты не очень, мб потому не догоняю.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Со скриптами так:Братец Лис пишет: ну и как тут проверить не городя лес, является ли, например, беглым преступником? Я в скрипты не очень, мб потому не догоняю.
[tt]$gameVariables.value(1) & 2[/tt]
(Вместо 1 нужно вставить номер переменной. Вместо 2 — нужную степень двойки: 1, 2, 4, 8, 16, 32, 64 и т.п.)
& — это побитовое «и». То есть мы записываем число в двоичной системе и применяем к каждому биту (двоичному разряду) обеих чисел операцию «и».
Запишем наши возможные значения переменной в двоичном виде (если что, это можно сделать на калькуляторе ):
00012 = 110 — имя
00102 = 210 — беглый преступник
00112 = 310 — имя и преступник
01002 = 410 — взломщик
01012 = 510 — имя и взломщик
01102 = 610 — беглый преступник и взломщик
01112 = 710 — имя, преступник и взломщик
10002 = 810 — быстро бегает
10012 = 910 — имя и быстро бегает
10102 = 1010 — беглый преступник и быстро бегает
10112 = 1110 — имя беглый преступник и быстро бегает
Число, с которым мы сравниваем, тоже записываем двоичной системе:
00102 = 210 — беглый преступник
А дальше побитово применяем операцию «И». Операция «и» даёт 1 (истину), если обе значения равны 1 (истинны). Например, «Маша умная И ответственная» будет истинно лишь есть истинны и выражение «Маша умная», и «Маша ответственная». Иначе будет ложно.
Вот так и с числами. Операция «И» даст 1, если в обеих числах в этом двоичном разряде (бите) единица, иначе даст 0.
Берём два числа:
[tt]0110[/tt]2 = 610 (беглый преступник и взломщик)
[tt]0010[/tt]2 = 210 (беглый преступник)
И для каждого разряда проверяем (по традиции идём справа налево):
- в конце 0 (не имя) И 0 (проверяем не имя) = 0
- второй разряд сзади: 1 (беглый преступник) и 1 (проверяем, что беглый преступник) = 1
- третий разряд сзади: 1 (взломщик) и 0 (не проверяем, что взломщик) = 0
- четвёртый разряд (самый левый): 0 (не быстро бегает) и 0 (не проверяем, что быстро бегает) = 0
[tt]0010[/tt]2 = 210 (беглый преступник)
А если мы берём число без беглого преступника, то получаем результат 0:
[tt]1001[/tt]2 = 910 (имя и быстро бегает)
[tt]0010[/tt]2 = 210 (беглый преступник)
Применяем операцию И к каждой цифре:
[tt]0000[/tt]2 = 010
Таким образом, если после применения побитового И с нужным числом у нас получился 0, то персонаж не обладает нужной чертой. Если получилось что-то, отличное от нуля, — обладает.
В результате достаточно проверить, что после побитового «и» у нас останется не ноль:
[tt]$gameVariables.value(1) & 2 != 0[/tt]
Однако в JavaScript 0 считается ложным, а все остальные числа — положительными. Значит, проверку можно упростить, ведь 0 и так будет считаться как не прошедшая проверка:
[tt]$gameVariables.value(1) & 2[/tt]
Надеюсь, понятно объяснил... Если что, спрашивайте.
Lekste предложил использовать не
[tt]$gameVariables.value(1) & 2[/tt]
а
[tt]$gameVariables.value(1) & (1 << 1)[/tt]
Это чтобы самому не умножать числа на 2 (1, 2, 4,
, а писать 1, 2, 3, 4.Операция << дописывает к двоичному числу указанное число (двоичных) нулей:
1 << 1 возьмёт число 12 и допишет к нему двоичный 0, получится 102 = 210
1 << 2 даст 1002 = 410
1 << 3 даст 10002 = 810
1 << 4 даст 100002 = 1610
1 << 5 даст 1000002 = 3210
1 << 6 даст 10000002 = 6410
1 << 7 даст 100000002 = 12810
1 << 8 даст 1000000002 = 25610
1 << 9 даст 10000000002 = 51210
и так далее...
Это такой способ не умножать на 2 вручную.
Эта операцию идентична возведению 2 в нужную степень (в JavaScript возведение в степень обозначается двумя звёздочками [tt]**[/tt], а равенство — двумя знаками [tt]==[/tt]):
[tt]1 << 1 == 2**1 == 2[/tt]
[tt]1 << 2 == 2**2 == 4[/tt]
[tt]1 << 3 == 2**3 == 8[/tt]
[tt]1 << 4 == 2**4 == 16[/tt]
[tt]1 << 5 == 2**5 == 32[/tt]
и т.д.
Впрочем, если мы используем скрипты, то непонятно, зачем это вообще всё... Ведь со скриптами не нужно экономить переменные/переключатели.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
А фрагменты скрипта, для изменения или проверки, можно вставлять в поле "Выполнить скрипт" в команде ивента или в поле скрипта в команде проверки условия.
+ в других местах эту переменную можно в ивенте менять или проверять, если почему-то оказалось надо.
Кстати, поставить флаг можно так (не знаю, как оно в JS делается):
А снять так:
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Lekste пишет: Кстати, поставить флаг можно так (не знаю, как оно в JS делается):
Code:gameVariables.value(номер_переменной) |= (1 << номер_флага)
А снять так:Code:gameVariables.value(номер_переменной) &= !(1 << номер_флага)
Это делается так:
[tt]$gameVariables.setValue(номер_переменной, $gameVariables.value(номер_переменной) | (1 << номер_флага))[/tt]
А снять так:
[tt]$gameVariables.setValue(номер_переменной, $gameVariables.value(номер_переменной) & ~(1 << номер_флага))[/tt]
По-моему это тяжеловесно и неудобно, я бы это не использовал без веской причины.
Не понимаю, почему это проблема, ей-богу.Lekste пишет: Смысл в том, что не нужно в скрипте создавать переменную где-то.
Если создать новое свойство в каком-нибудь стандартном объекте ([tt]$gameSystem[/tt] или [tt]$gameVariables[/tt]), то оно автоматически сохраняется при сохранении и всё такое, никаких дополнительных действий не нужно.
Если создавать новые переменные по принципу [tt]$gameVariables.myVarName[/tt], то и создавать ничего не надо. Главное какой-то префикс типа my выбрать, чтобы с добавленными плагинами названиями не было конфликта. Ну и стоит помнить, что по умолчанию в переменной не 0, а [tt]undefined[/tt], так что придётся писать что-то типа [tt](s.myVar || 0) + 1[/tt].
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
