Добавлен Clamp,
опубликован
Процесс разработки
Содержание:
Во многих "правильных" РПГ играх существует такой показатель, как карма. Он показывает отношение определённой фракции к игроку, от него зависят цены в магазинах этой фракции, возможность получать некоторые задания от её представителей, доступ к некоторым локациям, принадлежащим ей и так далее.
Карма может быть как фракционная, так и по отношению к конкретному персонажу. Обычно она влияет на варианты разговора с ним и его отношение к игроку в плане враждебности.
Не стала исключением из этого хорошего правила и "Plague". Карма здесь существует в качестве системы и позволяет создавать как фракционные показатели, так и личные. Ключом к значению является название фракции или имя персонажа (никаких StringHash при этом не используется). Карма в моём варианте исчисляется в абсолютном значении от -500 до 500, однако имеет своеобразные уровни. Вот их список:
# | Название | От | До |
---|---|---|---|
1 | Hostile | -500 | -376 |
2 | Negative | -375 | -126 |
3 | Incredulity | -125 | -1 |
4 | Neutral | 0 | 124 |
5 | Respectful | 125 | 264 |
6 | Friendly | 265 | 374 |
7 | Eulogize | 375 | 499 |
8 | Idealizing | 500 | 999 |
Следует заметить, что эти уровни служат только для визуального отображения изменения уровня отношений, все системы, в которых задействована карма, используют абсолютное значение (-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()
}
}
Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
Комментарии пока отсутcтвуют.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.