Процесс разработки

Содержание:
Во многих "правильных" РПГ играх существует такой показатель, как карма. Он показывает отношение определённой фракции к игроку, от него зависят цены в магазинах этой фракции, возможность получать некоторые задания от её представителей, доступ к некоторым локациям, принадлежащим ей и так далее.
Карма может быть как фракционная, так и по отношению к конкретному персонажу. Обычно она влияет на варианты разговора с ним и его отношение к игроку в плане враждебности.

Не стала исключением из этого хорошего правила и "Plague". Карма здесь существует в качестве системы и позволяет создавать как фракционные показатели, так и личные. Ключом к значению является название фракции или имя персонажа (никаких StringHash при этом не используется). Карма в моём варианте исчисляется в абсолютном значении от -500 до 500, однако имеет своеобразные уровни. Вот их список:
#НазваниеОтДо
1Hostile-500-376
2Negative-375-126
3Incredulity-125-1
4Neutral0124
5Respectful125264
6Friendly265374
7Eulogize375499
8Idealizing500999
Следует заметить, что эти уровни служат только для визуального отображения изменения уровня отношений, все системы, в которых задействована карма, используют абсолютное значение (-500~500).
Максимальным значением по факту является 500, появление условной верхней границы в 999 очков обусловлено особенностью написания системы, так как в ней указывается минимальное значение для уровня кармы, а верхняя граница вычисляется из значения следующего уровня, если он есть, или ничем не ограничивается, если его нету.
Вообще добавляются новые уровни и фракции (или персонажи, суть совершенно одинаковая) невероятно легко, буквально в одну строчку:
раскрыть
Переменные
    private string  array   Fraction
    private int     array   FractionKarma
    private int             FractionsNum    = 0
    private string  array   KarmaLevelName
    private int     array   KarmaLevel
    private int             KarmaLevelMax   = 0
Само добавление
    private void init_fractions_assistant(string Name, int Karma)
    {
        Fraction        [FractionsNum] = Name
        FractionKarma   [FractionsNum] = Karma
        FractionsNum    ++
    }
    
    private void init_levels_assistant(string Name, int Karma)
    {
        KarmaLevelName  [KarmaLevelMax] = Name
        KarmaLevel      [KarmaLevelMax] = Karma
        KarmaLevelMax   ++
    }

    private void init_fractions()
    {
        init_fractions_assistant("Survivors",  0)   //Выжившие
        init_fractions_assistant("Citisens",   0)   //Горожане
        init_fractions_assistant("Undeads",    0)   //Гули
        init_fractions_assistant("Guards",     0)   //Стражи Дворца
        init_fractions_assistant("Engineers",  0)   //Инженеры Дворца
        init_fractions_assistant("Pillagers", -125) //Мародёры
        init_fractions_assistant("Brigands",  -500) //Налётчики
    }

    private void init_levels()
    {
        init_levels_assistant("Hostile",    -500)   //Враждебно
        init_levels_assistant("Negative",   -375)   //Негативно
        init_levels_assistant("Incredulity",-125)   //Недоверчиво
        init_levels_assistant("Neutral",     0)     //Нейтрально
        init_levels_assistant("Respectful",  125)   //Уважительно
        init_levels_assistant("Friendly",    265)   //Дружелюбно
        init_levels_assistant("Eulogize",    375)   //Восхваляюще
        init_levels_assistant("Idealizing",  500)   //Идеализируют
        init_levels_assistant("Idealizing",  999)   //Вспомогательная
        KarmaLevelMax   --
    }
Уровень отношений проверяется при каждом изменении кармы, если он меняется, то в LogBox добавляется соответствующая запись. В силу того, что я ленивый хрен, эта проверка выполнена в виде двойного цикла:
раскрыть
    private void ChangeKarmaSafe(int in, int fracid)
    {
        FractionKarma[fracid] = iborder(KarmaLevel[0],in,KarmaLevel[KarmaLevelMax])
    }

    private void ChangeById(int fraction, int howmany)
    {
        int cur = FractionKarma[fraction]
        int new = FractionKarma[fraction] + howmany
        int i = 0
        int j = 0
        ChangeKarmaSafe(new, fraction)
        loop
        {
            if((cur >= KarmaLevel[i]) && (cur < KarmaLevel[i+1]))
            {
                loop
                {
                    if((new >= KarmaLevel[j]) && (new < KarmaLevel[j+1]))
                    {
                        if(i != j)
                        {
                            AddLog("Now " + CGold(Fraction[fraction]) + " treat you as \"" + CGold(KarmaLevelName[j]) + "\"")
                            break
                        }
                        break
                    }
                    j++
                    stop j == KarmaLevelMax
                }
            }
            i++
            stop i == KarmaLevelMax
        }
    }

    void KarmaChange(string fraction, int howmany)
    {
        int i = 0
        loop
        {
            stop i == FractionsNum
            if(Fraction[i] == fraction)
            {
                ChangeById(i, howmany)
                break
            }
            i++
        }
    }
Библиотека в общем виде выглядит вот так:
раскрыть
lib Karma init Init uses Print, Match, Logs
{    
    private string  array   Fraction
    private int     array   FractionKarma
    private int             FractionsNum    = 0
    private string  array   KarmaLevelName
    private int     array   KarmaLevel
    private int             KarmaLevelMax   = 0

    private void init_fractions_assistant(string name, int Karma)
    {
        Fraction        [FractionsNum] = name
        FractionKarma   [FractionsNum] = Karma
        FractionsNum    ++
    }
    
    private void init_levels_assistant(string name, int Karma)
    {
        KarmaLevelName  [KarmaLevelMax] = name
        KarmaLevel      [KarmaLevelMax] = Karma
        KarmaLevelMax   ++
    }

    private void init_fractions()
    {
        init_fractions_assistant("Survivors",  0)   //Выжившие
        init_fractions_assistant("Citisens",   0)   //Горожане
        init_fractions_assistant("Undeads",    0)   //Гули
        init_fractions_assistant("Guards",     0)   //Стражи Дворца
        init_fractions_assistant("Engineers",  0)   //Инженеры Дворца
        init_fractions_assistant("Pillagers", -125) //Мародёры
        init_fractions_assistant("Brigands",  -500) //Налётчики
    }

    private void init_levels()
    {
        init_levels_assistant("Hostile",    -500)   //Враждебно
        init_levels_assistant("Negative",   -375)   //Негативно
        init_levels_assistant("Incredulity",-125)   //Недоверчиво
        init_levels_assistant("Neutral",     0)     //Нейтрально
        init_levels_assistant("Respectful",  125)   //Уважительно
        init_levels_assistant("Friendly",    265)   //Дружелюбно
        init_levels_assistant("Eulogize",    375)   //Восхваляюще
        init_levels_assistant("Idealizing",  500)   //Идеализируют
        init_levels_assistant("Idealizing",  999)   //Вспомогательная
        KarmaLevelMax   --
    }
    
    private void ChangeKarmaSafe(int in, int fracid)
    {
        FractionKarma[fracid] = iborder(KarmaLevel[0],in,KarmaLevel[KarmaLevelMax])
    }

    private void ChangeById(int fraction, int howmany)
    {
        int cur = FractionKarma[fraction]
        int new = FractionKarma[fraction] + howmany
        int i = 0
        int j = 0
        ChangeKarmaSafe(new, fraction)
        loop
        {
            if((cur >= KarmaLevel[i]) && (cur < KarmaLevel[i+1]))
            {
                loop
                {
                    if((new >= KarmaLevel[j]) && (new < KarmaLevel[j+1]))
                    {
                        if(i != j)
                        {
                            AddLog("Now " + CGold(Fraction[fraction]) + " treat you as \"" + CGold(KarmaLevelName[j]) + "\"")
                            break
                        }
                        break
                    }
                    j++
                    stop j == KarmaLevelMax
                }
            }
            i++
            stop i == KarmaLevelMax
        }
    }

    void KarmaChange(string fraction, int howmany)
    {
        int i = 0
        loop
        {
            stop i == FractionsNum
            if(Fraction[i] == fraction)
            {
                ChangeById(i, howmany)
                break
            }
            i++
        }
    }

    private void Init()
    {
        init_fractions()
        init_levels()
    }
}

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...