Войти
ПрограммированиеФорумИгровая логика и ИИ

Как можно реализовать диалоги с неписями в рпг? (19 стр)

Страницы: 118 19 20 2132 Следующая »
#270
(Правка: 13:20) 12:46, 22 ноя 2022

>samrrr

А ты покажи полный код, как ты этот таг добавишь, как удалишь при изменении репутации.

Так равно так же? Только delete?
DelTokens | Как можно реализовать диалоги с неписями в рпг?
//Токены запущенных процессов. ID [5000]
//[5000][XXXX][XXXX], где [ID][ProcessID]
//Токены модификаторов бесплатных автоулучшений в ячейке. ID [7000]
//[7000][X][X][XXXX][XXXX][XX.XX], где [ID][BuildingClass: Negative/Positive 1/0][BuildingType: Negative/Positive 1/0][BuildingClass][BuildingType][Time_Sek]

Super_inoy, правильно заметил на тему зоны видимости переменных. Вы же не меняеете где ни попадя, что не попадя не относящееся к этому объекту. Изменением данных занимается непосредственно то, что за них отвечает, а читать может все, но через прослойку.

1) Ангел убил демона = добавить токен повышения репутации привильно будет = добавить токен об требовании изменить репутацию
2) Модуль отвечающий за репутацию, отслеживает наличие токена о требовании поменять репутацию, и выполняет если требуется.

1) Наступила ночь
2) Модуль отвечающий за проверку Ночь или день, создали токен о наступлении ночи.
3) Модуль связывающий репутацию и ночь проверяет есть ли токены на изменение репутации ночью и токен ночь
4) Создает токен с требованием изменить репутацию

Модуль 2 проверяет есть ли токен изменения репутации

Я не понимаю проблемы. Даже если вы тупо будете пихать эти ключи, где не попадя есть несколько вариантов действий:
1) Найти все ключи в коде = F7 поиск = 10 файлов, посмотрели поменяли
2) Допустим система сложнейшая стала и менять лень = делаем новые ключи на ключи с ключами меняющие их действия и забиваем. Да это будет ограничено, но в одиночку вы все равно столько не сделаете, что бы упереться в пределы.

Это не Events, которые даже при крайне правильной реализации, остледить это надо постараться. Тут все в разы проще, а далает, нечто схожее, только в единичном виде.
Если у вас в программе каша, где все меняет все, то да, эта система не подойдет, так как ее будет сложно использовать, хотя то же возможно.
Кроме того, изначально речь шла про диалоги, а это всего 1 уровень. Токены проверяются только в 1м месте, во всех остальных они только добавляются при некоторых условиях. (я просто пытаюсь эту систему расширить, но к диалогам это имеет косвенное отношение, так как в диалогах только 1 уровень связи)

А ты покажи полный код

QuestionsNode[3].IsLoseToken = true;
QuestionsNode[3].LoseTokens = new int[2];
QuestionsNode[3].LoseTokens[0] = 111111;
QuestionsNode[3].LoseTokens[1] = 222222;

Вот эти параметры говорят о необходимости удалить указаные ключи. Вам код удаления элемента массива нужен?

#271
5:16, 23 ноя 2022

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

Super_inoy
> DPS то ниже, если бы в игре была сложность ты бы страдал при такой прокачке.

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

#272
(Правка: 5:32) 5:30, 23 ноя 2022

RikiTikiTak
> Так и должно быть, это называется выбор
Так не должно быть, это зашквар зашкварный. За то что не можешь определиться с выбором должно быть наказание в виде очень сложного прохождения.
А любые лимиты искусственные - убогая херота.
RikiTikiTak
> Но в таких играх разрабы предусмотрели очень многое , что бы игрок даже с
> запоротой прокачкой смог пройти
И это плохо, точнее само по себе мог пройти хорошо, а вот то что пройти легко - плохо.
С запоротой прокачкой все должно превращаться в ад вида - получи 0 урона за час танцев(а по другому тут это не назвать) с боссом, иначе ваншотнет.
По сути - распыление скиллов на всякий мусор нерелевантный должно делать из игры на нормале игру на ультранайтмаре, вот это годный подход.
А ограничения не нужны. Те же прозрачные стены, только не в мире, а в системе прокачки, фу такое убожество поощрять.

#273
8:05, 23 ноя 2022

FourGen
> Так равно так же? Только delete?
Ты код мне покажи, а не телегу текста, как ты подобный таг будешь добавлять/удалять.

#274
12:59, 23 ноя 2022

>samrrr

как ты подобный таг будешь добавлять/удалять

А как код удаления или добавления тага, влияет на реализацию диалогов?
Как хотите, так и добавляйте/удаляйте, предварительно все сведя в одну точку, что бы можно было переназначить действия без изменения кода в тех местах, где это действие добавлено.

Ну хорошо, вот так, если вам мой говнокод нужен примерно так:

AddToken(TokenNumber, ref TokensList);
DelToken(TokenNumber, ref TokensList);

AddTokens(TokensMas, ref TokensList);
...
public void AddTokens(TokensMas, ref TokensList)
{
  for (int i =0; i < TokensMas.Length; i++)
  {
    AddToken(TokenNumber, ref TokensList);  
  }
}
#275
14:12, 23 ноя 2022

FourGen
> Ну хорошо, вот так, если вам мой говнокод нужен примерно так:
Не, ты покажи как именно те таги будешь добавлять, а не просто функцию добавления.

#276
14:13, 23 ноя 2022

FourGen
Вот где и как ты поставишь money ≥500

#277
(Правка: 15:56) 15:47, 23 ноя 2022

>samrrr
Вы кажется считаете, что тут что-то более сложное, чем есть на самом деле. Вы не понимаете простой вещи, тут ровно тото же IF только переведенный несколько в другую форму.

Можно сделать так:

int money = 0;
if (money >= 500) { Func1(); } else { Func2(); }
if (Apples >= 500) { Func3(); } else { Func4(); }

А можно так:

  • псевдокод
  • if (12345) { Func1(); } else { Func2(); }
    if (54321) { Func3(); } else { Func4(); }
    Разницу не видете?

    1) Придумываем от балды число: 12345
    2) Для себя записываете, где угодно, хоть на бумажке: число 12345 означает, что Money >=500
    3) Добавляете это число в массив или во что еще без разницы
    BaseTokenList[0] = 12345;
    Все это больше не трогаем и не меняем, это для вас константа, вы ее придумали записали и можете использовать в дальнейшем.
    У персонажа есть массив текущих токенов
    int[] CharacterTokens

    В коде, где у вас обрабатывается предмет Money вы пишете:
    if (Money >= 500) {AddToken(BaseTokenList[0]); }

    После этого в массив CharacterTokens, добавился новый элемент: BaseTokenList[0] = 12345
    (CharacterTokens[0] = 12345)

    Когда вам надо, допустим отобразить список предметов но только если у персонажа Money >=500
    Если у персонажа в массиве его текщих токенов CharacterTokens, есть токен указанный в первом элементе массива BaseTokenList выполняем то или иное.
    if (IsTokenExist(BaseTokenList[0]) == true), CharacterTokens) { Func1();} else { Func2(); }

    Если вам в дальнейшем понадобится проверять не Money >=500, а например, Apples >= 500
    Вы сдеалете так:
    1) Придумываем от балды число: 54321
    2) Для себя записываете, где угодно, хоть на бумажке: число 54321 означает, что Apples >=500
    3) Добавляете это число в массив или во что еще без разницы
    BaseTokenList[1] = 54321;
    Все это больше не трогаем и не меняем, это для вас константа, вы ее придумали записали и можете использовать в дальнейшем.

    Если вам будет нужно отобразить ноду диалога, только если у персонажа Money >= 500, а Apples < 500 вы сделаете так:
    if ((IsTokenExist(BaseTokenList[0], CharacterTokens) == true) && (IsTokenExist(BaseTokenList[1], CharacterTokens) == false)) { ShowDialogNode(1);} else { ShowDialogNode(2); }
    Вы проверяете произошедшеие события:
    1) Персонаж набрал Money >=500
    2) Персонаж еще не набрал Apples >= 500

    #278
    17:50, 23 ноя 2022

    > Можно сделать так:
    А теперь самое интересное, куда ты этот ифчик впихнешь?

    #279
    (Правка: 21:19) 21:12, 23 ноя 2022

    >samrrr

    А теперь самое интересное, куда ты этот ифчик впихнешь?

    Он впихнется туда, где требуется подобная проверка. В частности я уже 50 раз вам приводил пример:

      QuestionsNode[1].NeedQuestionsLevel = 0;
            QuestionsNode[1].QuestionText = "Question Level 0: Как дела?";
            QuestionsNode[1].IsLoseToken = false;
            QuestionsNode[1].IsRequiredToken = true;
            QuestionsNode[1].RequiredTokens = new int[1];
            QuestionsNode[1].RequiredTokens[0] = 111111;
            QuestionsNode[1].IsTokenNotExist = true;
            QuestionsNode[1].NotExitsToken = new int[1];
            QuestionsNode[1].NotExitsToken[0] = 222222;
            QuestionsNode[1].IsNextLevel = false;
            QuestionsNode[1].AnswerNodeNumber = 1;
            QuestionsNode[1].IsShowBackButton = true;

    Для того, что бы показать эту ноду диалога, требуется что бы был токен 111111 и не было токена 222222.

    Применительно к варианту выше будет вот так:

      QuestionsNode[1].NeedQuestionsLevel = 0;
            QuestionsNode[1].QuestionText = "Question Level 0: Как дела?";
            QuestionsNode[1].IsLoseToken = false;
            QuestionsNode[1].IsRequiredToken = true;
            QuestionsNode[1].RequiredTokens = new int[1];
            QuestionsNode[1].RequiredTokens[0] = 12345;
            QuestionsNode[1].IsTokenNotExist = true;
            QuestionsNode[1].NotExitsToken = new int[1];
            QuestionsNode[1].NotExitsToken[0] = 54321;
            QuestionsNode[1].IsNextLevel = false;
            QuestionsNode[1].AnswerNodeNumber = 1;
            QuestionsNode[1].IsShowBackButton = true;

    Показать ноду диалога, если у персонажа есть токен 12345 (>=500 Money) и нет токена 54321 (>=500 Apples)

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

    Надо добавить Money персонажу... а пофиг Money += 100; Надо в другом месте добавить, а пофиг Money += 150; Так у меня деньги добавляются в 100500 классах. Блин куда же я вставлю if на проверку сколько у персонажа денег??????????????? Как же я могу их в свои 100500 мест вставить проверку токена?????????

    * Приведите плз пример, как вы какой нибудь ресурс добавляете из разных классов?

    #280
    (Правка: 21:24) 21:20, 23 ноя 2022

    FourGen
    > уже 50 раз вам приводил пример
    это использование, samrrr спрашивает в каком месте устанавливается токен так чтобы он появился у перcонажа

    а ещё вопрос, как выдать персонажу reward в такой системе? те же злосчастных 500 голды?

    т.е. вот это
    FourGen
    > В коде, где у вас обрабатывается предмет Money вы пишете:
    > if (Money >= 500) {AddToken(BaseTokenList[0]); }

    вопрос сводится как раз к "где у вас обрабатывается предмет Money"
    и где же?

    #281
    21:35, 23 ноя 2022

    >#!
    Ну пусть samrrr ответит: как вы какой нибудь ресурс добавляете из разных классов?
    Интересно посмотреть псевдокод подобного действия.

    #282
    (Правка: 21:53) 21:50, 23 ноя 2022

    нет проблем добавлять откуда угодно, можно перегрузить оператор+ для Money
    но я бы максимум поставил туда логирование, а вот работу с квестовой подсистемой уже зашквар

    потому что там может быть 100500 таких условий >=100, >=200 ...
    ещё надо не забыть выкинуть токены когда голды станет меньше

    #283
    22:02, 23 ноя 2022

    там много вопросов с перегрузкой начиная с ownership т.е. чьи это деньги? валяются ли они бесхозно или у кого-то в кармане, тогда в чьём, и надо уметь менять владельца

    #284
    (Правка: 22:30) 22:07, 23 ноя 2022

    >!#

    перегрузить оператор+

    Ваш вариант то же бы интересно посмотреть. Что вам надо сделать, что бы, например, без переписывания кода, а только его добавлением (БЕЗ УДАЛЕНИЯ ПРОШЛОГО) перестать увеличивать Money если вам вдруг это захотелось или в этом пропала необходимость В КОНКРЕТНОМ МЕСТЕ программы?

    Как вы поступете, если в дальнейшем вам опять понадобилось добавлять Money. Что вы сделаете, что бы без переписывания кода, а только его добавлением это реализовать, но так что бы ПЕРВЫЙ и ВТОРОЙ вариант так же остался РАБОТОСПОСОБЕН.

    что там может быть 100500 таких условий

    Да может, и каждое надо обработать, я об этом уже писал.
    Что-то можно автоматизировать, но что-то глобальное придется писать отдельно.

    * Просто для понимания, прикиньте сколько времени понадобится реализовать 100500 различных цепочек? (даже если будет меняться только 1 слово).

    1) Понадобится минимум 100500 слов написать, подгрузить, перевести и тд.
    2) Вы уверены, что вам жизни хватат на реализацию 100500 цепочек?
    3) Может их реально будет всего 10-20-100 в конце концов?
    4) 10-20-100 отдельных процедур/функций обработки этих несчастных токенов не такая проблема?

    с ownership т.е. чьи это деньги?

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

    Страницы: 118 19 20 2132 Следующая »
    ПрограммированиеФорумИгровая логика и ИИ