- Регистрация
- 10 Июн 2013
- Сообщения
- 2.332
- Реакции
- 2.028
- Баллы
- 434
- Лучшие ответы
- 0
Вопроса вообщем-то два, но они связаны:
1) Как настроить сложность монстров? Т.е. тирность например (тут твик о котором выше говорилось
, хорошобы его внести тогда в основные настройки) , которая по-хорошему должна определять кол-во аффиксов (а по факту определяет и аффиксы и мощь?), при этом см. вопрос2
2) Осквернённые я ориентировочно понимал как и описывал выше, это же касается и богатых и удачливых (хотя хотелось бы подробнее о них услышать, т.е. в какой степени они усиливают монстров/улучшают лут), но есть ещё и "благославляющие" (которые внезапно тоже накидывают аффиксов, или просто так совпадает всегда) количество которых настройками нерегулируется. Вообщем вопрос о том, как бы нам урегилировать кол-во аффиксов у монстров.
Плохой пример: с отключенными осквернёнными, богатыми и удачливыми и мощью маг.насыщения в ноль встречается монстр с необычной редкостью (Тир1) но с 2мя строчками аффиксов.
Как я представлю себе это в своих влажных фантазиях:
Т1 монстр имеет до 2ух аффиксов, Т2: 3...4 и т.д, потолок тира от первой главы настраивается (дальше автоматически +1 за главу если не макс), шанс встречи более высокого тира настраивается (и настраивается капитель от главы/уровня ГГ).
Каждый аффикс усиливает монстра на N процентов, данное N модифицируется настройкой мощи насыщения (та что сейчас существует)
При наличии у монстра осквернения/богатства/удачи он получает +2...3 аффикса (всякие "благословенные" исключения существовать не должны, т.е. при отключении всех этих типов монстров мы встречаем кол-во аффиксов только соотвествующее тирам, так понятнее должно быть) при этом, в идеале, эти монстры не должны иметь усилений на N за эти дополнительные 2...3 аффикса, т.к. они фактически на тир ниже чем должны являться.
1) Как настроить сложность монстров? Т.е. тирность например (тут твик о котором выше говорилось
2) Осквернённые я ориентировочно понимал как и описывал выше, это же касается и богатых и удачливых (хотя хотелось бы подробнее о них услышать, т.е. в какой степени они усиливают монстров/улучшают лут), но есть ещё и "благославляющие" (которые внезапно тоже накидывают аффиксов, или просто так совпадает всегда) количество которых настройками нерегулируется. Вообщем вопрос о том, как бы нам урегилировать кол-во аффиксов у монстров.
Плохой пример: с отключенными осквернёнными, богатыми и удачливыми и мощью маг.насыщения в ноль встречается монстр с необычной редкостью (Тир1) но с 2мя строчками аффиксов.
Как я представлю себе это в своих влажных фантазиях:
Т1 монстр имеет до 2ух аффиксов, Т2: 3...4 и т.д, потолок тира от первой главы настраивается (дальше автоматически +1 за главу если не макс), шанс встречи более высокого тира настраивается (и настраивается капитель от главы/уровня ГГ).
Каждый аффикс усиливает монстра на N процентов, данное N модифицируется настройкой мощи насыщения (та что сейчас существует)
При наличии у монстра осквернения/богатства/удачи он получает +2...3 аффикса (всякие "благословенные" исключения существовать не должны, т.е. при отключении всех этих типов монстров мы встречаем кол-во аффиксов только соотвествующее тирам, так понятнее должно быть) при этом, в идеале, эти монстры не должны иметь усилений на N за эти дополнительные 2...3 аффикса, т.к. они фактически на тир ниже чем должны являться.
Так, смотри как работают тиры, да и просто собирается Infusion в движке
C++:
MagicInfusionData* CreateInfusion(int tier)
{
const MagicInfusionData* prefix = GetRandomInfusion(StExt_InfusionType_Preffix, tier, false);
const MagicInfusionData* affix = GetRandomInfusion(StExt_InfusionType_Affix, tier, false);
const MagicInfusionData* suffix = GetRandomInfusion(StExt_InfusionType_Suffix, tier, false);
if (!suffix && !affix && !prefix)
{
if (StExt_Rand::Bool()) prefix = GetRandomInfusion(StExt_InfusionType_Preffix, tier, true);
else suffix = GetRandomInfusion(StExt_InfusionType_Suffix, tier, true);
}
Array<const MagicInfusionData*> infusionData = Array<const MagicInfusionData*>();
infusionData.Insert(prefix);
infusionData.Insert(affix);
infusionData.Insert(suffix);
MagicInfusionData* result = new MagicInfusionData();
result->Tier = tier;
result->PreffixId = prefix ? prefix->Id : -1;
result->AffixId = affix ? affix->Id : -1;
result->SuffixId = suffix ? suffix->Id : -1;
result->Effect = "";
for (int i = 0; i < 10; ++i)
result->Abilities[i] = -1;
Array<zSTRING> effectsData = Array<zSTRING>();
Array<int> abilitiesData = Array<int>();
for (unsigned int i = 0; i < infusionData.GetNum(); ++i)
{
if (!infusionData[i]) continue;
// Npc mods
result->NpcFlags |= infusionData[i]->NpcFlags;
result->Size += infusionData[i]->Size;
result->SpeedMod += infusionData[i]->SpeedMod;
result->ExtraLevel += infusionData[i]->ExtraLevel;
result->ExtraLevelMult += infusionData[i]->ExtraLevelMult;
// Attribute mods
result->ExtraHp += infusionData[i]->ExtraHp;
result->ExtraEs += infusionData[i]->ExtraEs;
result->ExtraStr += infusionData[i]->ExtraStr;
result->ExtraAgi += infusionData[i]->ExtraAgi;
result->ExtraHpMult += infusionData[i]->ExtraHpMult;
result->ExtraEsMult += infusionData[i]->ExtraEsMult;
result->ExtraStrMult += infusionData[i]->ExtraStrMult;
result->ExtraAgiMult += infusionData[i]->ExtraAgiMult;
// Damage mods
result->ExtraBluntDam += infusionData[i]->ExtraBluntDam;
result->ExtraEdgeDam += infusionData[i]->ExtraEdgeDam;
result->ExtraFireDam += infusionData[i]->ExtraFireDam;
result->ExtraFlyDam += infusionData[i]->ExtraFlyDam;
result->ExtraMagicDam += infusionData[i]->ExtraMagicDam;
result->ExtraPointDam += infusionData[i]->ExtraPointDam;
result->ExtraHitchances += infusionData[i]->ExtraHitchances;
// Protection mods
result->ExtraDodgeChance += infusionData[i]->ExtraDodgeChance;
result->ExtraBluntProt += infusionData[i]->ExtraBluntProt;
result->ExtraEdgeProt += infusionData[i]->ExtraEdgeProt;
result->ExtraFireProt += infusionData[i]->ExtraFireProt;
result->ExtraFlyProt += infusionData[i]->ExtraFlyProt;
result->ExtraMagicProt += infusionData[i]->ExtraMagicProt;
result->ExtraPointProt += infusionData[i]->ExtraPointProt;
result->ExtraProtAllMult += infusionData[i]->ExtraProtAllMult;
result->ResistEdge += infusionData[i]->ResistEdge;
result->ResistBlunt += infusionData[i]->ResistBlunt;
result->ResistPoint += infusionData[i]->ResistPoint;
result->ResistMagic += infusionData[i]->ResistMagic;
result->ResistFire += infusionData[i]->ResistFire;
result->ResistFly += infusionData[i]->ResistFly;
result->ResistPois += infusionData[i]->ResistPois;
result->GoldBonus += infusionData[i]->GoldBonus;
result->LuckBonus += infusionData[i]->LuckBonus;
// Visual effects
if (!infusionData[i]->Effect.IsEmpty())
effectsData.Insert(infusionData[i]->Effect);
// Abilities
if (!abilitiesData.HasEqual(infusionData[i]->PassiveAbilityId) && (infusionData[i]->PassiveAbilityId > 0))
abilitiesData.Insert(infusionData[i]->PassiveAbilityId);
if (!abilitiesData.HasEqual(infusionData[i]->LowAbilityId) && (infusionData[i]->LowAbilityId > 0))
abilitiesData.Insert(infusionData[i]->LowAbilityId);
if (!abilitiesData.HasEqual(infusionData[i]->MedAbilityId) && (tier >= 2) && (infusionData[i]->MedAbilityId > 0))
abilitiesData.Insert(infusionData[i]->MedAbilityId);
if (!abilitiesData.HasEqual(infusionData[i]->TopAbilityId) && (tier >= 3) && (infusionData[i]->TopAbilityId > 0))
abilitiesData.Insert(infusionData[i]->TopAbilityId);
if (!abilitiesData.HasEqual(infusionData[i]->SummonAbilityId) && (tier >= 2) && (infusionData[i]->SummonAbilityId > 0))
abilitiesData.Insert(infusionData[i]->SummonAbilityId);
if (!abilitiesData.HasEqual(infusionData[i]->BuffAbilityId) && (infusionData[i]->BuffAbilityId > 0))
abilitiesData.Insert(infusionData[i]->BuffAbilityId);
if (!abilitiesData.HasEqual(infusionData[i]->DebuffAbilityId) && (infusionData[i]->DebuffAbilityId > 0))
abilitiesData.Insert(infusionData[i]->DebuffAbilityId);
}
// Visual effects selection
if (effectsData.GetNum() > 0)
result->Effect = effectsData[StExt_Rand::Index(effectsData.GetNum())];
int abilityNum = abilitiesData.GetNum();
if (abilityNum > 10)
StExt_Rand::ShuffleArray(abilitiesData);
for (int i = 0; i < 10; ++i) {
result->Abilities[i] = ((abilityNum == 0) || (i >= abilityNum)) ? Invalid : abilitiesData[i];
}
// Model scale
result->Size += 1.0f;
if (result->Size < 0.75f) result->Size = 0.75f;
if (result->Size > 2.00f) result->Size = 2.00f;
return result;
}
inline const MagicInfusionData* GetRandomInfusion(int type, int tier, int grantInfusion)
{
int chance = StExt_Rand::Next(100) + (tier * 5);
if (!grantInfusion && (chance < 50)) return Null;
switch (type)
{
case StExt_InfusionType_Affix:
return &InfusionAffixes[StExt_Rand::Index(InfusionAffixes.GetNum())];
case StExt_InfusionType_Preffix:
return &InfusionPreffixes[StExt_Rand::Index(InfusionPreffixes.GetNum())];
case StExt_InfusionType_Suffix:
return &InfusionSuffixes[StExt_Rand::Index(InfusionSuffixes.GetNum())];
default:
return Null;
}
return Null;
}
то есть тир так или иначе влияет на кол-во имён у моба, а это уже в свою очередь влияет на статы с учётом суммарного множителя + там в скриптах от тира расчёт.
Генерацию тира переделаю - я её тогда по всей видимости на скорую руку заделал, потом обдумаю как бы гибкости той системе добавить.
Абилки - это сумма абилок от всех 3х возможных аффиксов у моба (префикс, аффикс и суффикс) Они хранятся в соответсвующей структуре м просто смешиваются - так что кол-во умений у непися ограничено лишь физическим капом в 10 штук и как видно в коде - его тиром, дабы мясной жук не кастовал армагедон, а крыса не призывала демонов)
Пометки богатый и удачливый если мне ща память не изменяет - просто увеличивают "входящую мощь нпс" при генерации что бы сделать моба чуть сильнее, но в замен накинуть больше мощи удачи при дропе.