130 lines
5.5 KiB
C++
130 lines
5.5 KiB
C++
//
|
|
// alchemy.cpp
|
|
// BoE
|
|
//
|
|
// Created by Celtic Minstrel on 2023-08-28.
|
|
//
|
|
//
|
|
|
|
#include "alchemy.hpp"
|
|
|
|
std::map<eAlchemy,cAlchemy> cAlchemy::dictionary;
|
|
|
|
// Fail chance lookup, based on adjusted skill
|
|
const std::array<short, 9> cAlchemy::fail_chances = {
|
|
50,40,30,20,10,
|
|
8,6,4,2,
|
|
};
|
|
|
|
cAlchemy::cAlchemy(eAlchemy id) : id(id) {}
|
|
|
|
cAlchemy& cAlchemy::withValue(short val) {
|
|
value = val;
|
|
return *this;
|
|
}
|
|
|
|
cAlchemy& cAlchemy::withDifficulty(int d) {
|
|
difficulty = d;
|
|
return *this;
|
|
}
|
|
|
|
cAlchemy& cAlchemy::withIngredient(eItemAbil ingred) {
|
|
ingred1 = ingred;
|
|
ingred2 = eItemAbil::NONE;
|
|
return *this;
|
|
}
|
|
|
|
cAlchemy& cAlchemy::withIngredients(eItemAbil first, eItemAbil second) {
|
|
ingred1 = first;
|
|
ingred2 = second;
|
|
return *this;
|
|
}
|
|
|
|
cAlchemy& cAlchemy::withAbility(eItemAbil abil, int stren) {
|
|
ability = abil;
|
|
abil_strength = stren;
|
|
return *this;
|
|
}
|
|
|
|
cAlchemy& cAlchemy::withAbility(eItemAbil abil, int stren, eStatus status) {
|
|
withAbility(abil, stren);
|
|
abil_data.status = status;
|
|
return *this;
|
|
}
|
|
|
|
cAlchemy& cAlchemy::withUse(eItemUse use) {
|
|
magic_use_type = use;
|
|
return *this;
|
|
}
|
|
|
|
const cAlchemy& cAlchemy::finish() {
|
|
dictionary.emplace(id, *this);
|
|
return *this;
|
|
}
|
|
|
|
short cAlchemy::fail_chance(short skill) const {
|
|
if(skill < difficulty) return 100;
|
|
if(skill - difficulty > fail_chances.size()) return 0;
|
|
return fail_chances[skill - difficulty];
|
|
}
|
|
|
|
short cAlchemy::charges(short skill) const {
|
|
if(skill < difficulty) return 0;
|
|
short diff = skill - difficulty;
|
|
if(diff >= 11) return 3;
|
|
if(diff >= 5) return 2;
|
|
return 1;
|
|
}
|
|
|
|
bool cAlchemy::can_make(short skill) const {
|
|
return fail_chance(skill) < 100;
|
|
}
|
|
|
|
const cAlchemy& operator* (eAlchemy alch) {
|
|
return cAlchemy::dictionary.at(alch);
|
|
}
|
|
|
|
cAlchemy A_CURE_WEAK = cAlchemy(eAlchemy::CURE_WEAK).withDifficulty(1).withValue(40)
|
|
.withIngredient(eItemAbil::HOLLY).withAbility(eItemAbil::AFFECT_STATUS, 2, eStatus::POISON).finish();
|
|
cAlchemy A_HEAL_WEAK = cAlchemy(eAlchemy::HEAL_WEAK).withDifficulty(1).withValue(60)
|
|
.withIngredient(eItemAbil::COMFREY).withAbility(eItemAbil::AFFECT_HEALTH, 2).finish();
|
|
cAlchemy A_POISON_WEAK = cAlchemy(eAlchemy::POISON_WEAK).withDifficulty(1).withValue(15)
|
|
.withIngredient(eItemAbil::HOLLY).withAbility(eItemAbil::POISON_WEAPON, 2).finish();
|
|
cAlchemy A_SPEED_WEAK = cAlchemy(eAlchemy::SPEED_WEAK).withDifficulty(3).withValue(50)
|
|
.withIngredients(eItemAbil::COMFREY, eItemAbil::WORMGRASS).withAbility(eItemAbil::AFFECT_STATUS, 2, eStatus::HASTE_SLOW).finish();
|
|
cAlchemy A_POISON_MED = cAlchemy(eAlchemy::POISON_MED).withDifficulty(3).withValue(50)
|
|
.withIngredient(eItemAbil::WORMGRASS).withAbility(eItemAbil::POISON_WEAPON, 4).finish();
|
|
|
|
cAlchemy A_HEAL_MED = cAlchemy(eAlchemy::HEAL_MED).withDifficulty(4).withValue(180)
|
|
.withIngredient(eItemAbil::NETTLE).withAbility(eItemAbil::AFFECT_HEALTH, 5).finish();
|
|
cAlchemy A_CURE_STRONG = cAlchemy(eAlchemy::CURE_STRONG).withDifficulty(5).withValue(200)
|
|
.withIngredient(eItemAbil::NETTLE).withAbility(eItemAbil::AFFECT_STATUS, 8, eStatus::POISON).finish();
|
|
cAlchemy A_SPEED_MED = cAlchemy(eAlchemy::SPEED_MED).withDifficulty(5).withValue(100)
|
|
.withIngredients(eItemAbil::WORMGRASS, eItemAbil::NETTLE).withAbility(eItemAbil::AFFECT_STATUS, 5, eStatus::HASTE_SLOW).finish();
|
|
cAlchemy A_GRAYMOLD = cAlchemy(eAlchemy::GRAYMOLD).withDifficulty(7).withValue(150)
|
|
.withIngredient(eItemAbil::GRAYMOLD).withAbility(eItemAbil::AFFECT_STATUS, 4, eStatus::DISEASE).withUse(eItemUse::HELP_ALL).finish();
|
|
cAlchemy A_POWER_WEAK = cAlchemy(eAlchemy::POWER_WEAK).withDifficulty(9).withValue(100)
|
|
.withIngredients(eItemAbil::WORMGRASS, eItemAbil::ASPTONGUE).withAbility(eItemAbil::AFFECT_SPELL_POINTS, 2).finish();
|
|
|
|
cAlchemy A_CLARITY = cAlchemy(eAlchemy::CLARITY).withDifficulty(9).withValue(200)
|
|
.withIngredients(eItemAbil::GRAYMOLD, eItemAbil::HOLLY).withAbility(eItemAbil::AFFECT_STATUS, 8, eStatus::DUMB).finish();
|
|
cAlchemy A_POISON_STRING = cAlchemy(eAlchemy::POISON_STRONG).withDifficulty(10).withValue(150)
|
|
.withIngredient(eItemAbil::ASPTONGUE).withAbility(eItemAbil::POISON_WEAPON, 6).finish();
|
|
cAlchemy A_HEAL_STRONG = cAlchemy(eAlchemy::HEAL_STRONG).withDifficulty(12).withValue(300)
|
|
.withIngredients(eItemAbil::GRAYMOLD, eItemAbil::COMFREY).withAbility(eItemAbil::AFFECT_HEALTH, 8).finish();
|
|
cAlchemy A_POISON_KILL = cAlchemy(eAlchemy::POISON_KILL).withDifficulty(12).withValue(400)
|
|
.withIngredient(eItemAbil::MANDRAKE).withAbility(eItemAbil::POISON_WEAPON, 8).finish();
|
|
cAlchemy A_RESURRECT = cAlchemy(eAlchemy::RESURRECT).withDifficulty(9).withValue(100)
|
|
.withIngredient(eItemAbil::EMBERF).withAbility(eItemAbil::RESURRECTION_BALM, 0).finish();
|
|
|
|
cAlchemy A_POWER_MED = cAlchemy(eAlchemy::POWER_MED).withDifficulty(14).withValue(300)
|
|
.withIngredients(eItemAbil::MANDRAKE, eItemAbil::ASPTONGUE).withAbility(eItemAbil::AFFECT_SPELL_POINTS, 5).finish();
|
|
cAlchemy A_KNOWLEDGE = cAlchemy(eAlchemy::KNOWLEDGE).withDifficulty(19).withValue(500)
|
|
.withIngredients(eItemAbil::MANDRAKE, eItemAbil::EMBERF).withAbility(eItemAbil::AFFECT_SKILL_POINTS, 2).finish();
|
|
cAlchemy A_STRENGTH = cAlchemy(eAlchemy::STRENGTH).withDifficulty(10).withValue(175)
|
|
.withIngredients(eItemAbil::NETTLE, eItemAbil::EMBERF).withAbility(eItemAbil::AFFECT_STATUS, 8, eStatus::BLESS_CURSE).finish();
|
|
cAlchemy A_BLISS = cAlchemy(eAlchemy::BLISS).withDifficulty(16).withValue(250)
|
|
.withIngredients(eItemAbil::GRAYMOLD, eItemAbil::ASPTONGUE).withAbility(eItemAbil::BLISS_DOOM, 5).finish();
|
|
cAlchemy A_POWER_STRONG = cAlchemy(eAlchemy::POWER_STRONG).withDifficulty(20).withValue(500)
|
|
.withIngredients(eItemAbil::MANDRAKE, eItemAbil::EMBERF).withAbility(eItemAbil::AFFECT_SKILL_POINTS, 8).finish();
|