///////////////////////////////////////////////////////////////////////////// // Name: pokemod/ItemEffect.cpp // Purpose: Define an effect of an item // Author: Ben Boeckel // Modified by: Ben Boeckel // Created: Tue Mar 20 18:25:26 2007 // Copyright: ©2007 Ben Boeckel and Nerdy Productions // Licence: // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ///////////////////////////////////////////////////////////////////////////// #include "ItemEffect.h" PokeGen::PokeMod::ItemEffect::ItemEffect(const Pokemod *par, const unsigned _id) : overworld(false), battle(false), held(false), effect(UINT_MAX), val1(UINT_MAX), val2(UINT_MAX), val3(1, 1), val4(UINT_MAX), val5(UINT_MAX) { LogCtor("ItemEffect", _id); id = _id; pokemod = par; } PokeGen::PokeMod::ItemEffect::ItemEffect(const Pokemod *par, Ini &ini, const unsigned _id) { LogCtorIni("ItemEffect", _id); pokemod = par; ImportIni(ini, _id); if (id == UINT_MAX) LogIdError("ItemEffect"); } PokeGen::PokeMod::ItemEffect::~ItemEffect() { LogDtor("ItemEffect", id); } #ifdef PG_DEBUG_WINDOW void PokeGen::PokeMod::ItemEffect::Validate(const wxListBox &output) #else void PokeGen::PokeMod::ItemEffect::Validate() #endif { LogValidateStart("ItemEffect", id); // TODO (Validation#1#): ItemEffect Validation # warning "ItemEffect Validation" LogValidateOver("ItemEffect", id, isValid); } void PokeGen::PokeMod::ItemEffect::ImportIni(Ini &ini, const unsigned _id) { LogImportStart("ItemEffect"); if (_id == UINT_MAX) { ini.GetValue("id", id); if (id == UINT_MAX) LogIdNotFound("ItemEffect"); } else id = _id; unsigned i; unsigned j; ini.GetValue("overworld", overworld, false); ini.GetValue("battle", battle, false); ini.GetValue("held", held, false); ini.GetValue("effect", effect); ini.GetValue("val1", val1); ini.GetValue("val2", val2); ini.GetValue("val3-n", i, 1); ini.GetValue("val3-n", j, 1); val3.Set(i, j); ini.GetValue("val4", val4); ini.GetValue("val5", val5); LogImportOver("ItemEffect", id); } void PokeGen::PokeMod::ItemEffect::ExportIni(std::ofstream &fout, const String &item) const { LogExportStart("ItemEffect", id); Ini exItemEffect(item + " itemEffect"); exItemEffect.AddField("id", id); exItemEffect.AddField("overworld", overworld); exItemEffect.AddField("battle", battle); exItemEffect.AddField("held", held); exItemEffect.AddField("effect", effect); exItemEffect.AddField("val1", val1); exItemEffect.AddField("val2", val2); exItemEffect.AddField("val3-n", val3.GetNum()); exItemEffect.AddField("val3-d", val3.GetDenom()); exItemEffect.AddField("val4", val4); exItemEffect.AddField("val5", val5); exItemEffect.Export(fout); LogExportOver("ItemEffect", id); } void PokeGen::PokeMod::ItemEffect::SetOverworld(const bool o) { LogSetVar("ItemEffect", id, "overworld", o); overworld = o; } void PokeGen::PokeMod::ItemEffect::SetBattle(const bool b) { LogSetVar("ItemEffect", id, "battle", b); battle = b; } void PokeGen::PokeMod::ItemEffect::SetHeld(const bool h) { LogSetVar("ItemEffect", id, "held", h); held = h; } void PokeGen::PokeMod::ItemEffect::SetEffect(const unsigned e) { LogSetVar("ItemEffect", id, "effect", e); if (e < IE_END) { effect = e; val1 = INT_MAX; val2 = INT_MAX; val3.Set(1, 1, (e == IE_BALL) || (e == IE_TYPE_BOOST) || (e == IE_PP_BOOST)); val4 = UINT_MAX; val5 = UINT_MAX; } } void PokeGen::PokeMod::ItemEffect::SetEffect(const String &e) { SetEffect(FindIn(IE_END, e, ItemEffectStr)); } void PokeGen::PokeMod::ItemEffect::SetVal1(const int v1) { LogSetVar("ItemEffect", id, "val1", v1); switch (effect) { case IE_HP_CURE: case IE_REVIVE: if (val4 == REL_ABSOLUTE) { if (v1) val1 = v1; else LogOutOfRange("ItemEffect", id, "val1", v1, "effect", ItemEffectStr[effect]); break; } case IE_CURE_STATUS: case IE_FLINCH: case IE_FIRST: case IE_KEEP_ALIVE: case IE_RUN_BAT: case IE_TYPE_BOOST: case IE_PP_RESTORE: case IE_EXP_SHARE: case IE_ESCAPE: case IE_TM: case IE_HM: case IE_MAP: case IE_ITEMFINDER: case IE_BIKE: case IE_SCOPE: LogNoUse("ItemEffect", id, "val1", v1, "effect", ItemEffectStr[effect]); break; case IE_LEVEL_BOOST: case IE_SHIELD_BAT: case IE_PP_BOOST: case IE_REPEL: if (v1) val1 = v1; else LogOutOfRange("ItemEffect", id, "val1", v1, "effect", ItemEffectStr[effect]); break; case IE_STAT_BOOST: case IE_ACORN: if ((0 <= v1) && (v1 < 65536)) val1 = v1; else LogOutOfRange("ItemEffect", id, "val1", v1, "effect", ItemEffectStr[effect]); break; case IE_MODIFY_STAT_BAT: if ((-6 <= v1) && (v1 <= 6)) val1 = v1; else LogOutOfRange("ItemEffect", id, "val1", v1, "effect", "Modify Stat (Battle)"); break; case IE_FISH: case IE_COIN: case IE_COIN_CASE: val1 = v1; break; case IE_BALL: switch (val4) { case BLT_REGULAR: if ((unsigned)v1 < 256) val1 = (unsigned)v1; else LogOutOfRange("ItemEffect", id, "val1", v1, "effect", "Ball"); break; case BLT_LEVEL: if ((unsigned)v1 <= pokemod->GetMaxLevel()) val1 = (unsigned)v1; else LogOutOfRange("ItemEffect", id, "val1", v1, "effect", "Ball"); break; case BLT_BATTLE: case BLT_FRIEND: case BLT_STAT: val1 = v1; break; default: LogNoUse("ItemEffect", id, "val1", v1, "effect", ItemEffectStr[effect]); } break; case IE_BERRY: // TODO (Ben#1#): Berry Effect val1 // Depends on val4 break; default: LogNotSet("ItemEffect", id, "val1", v1, "effect"); } } void PokeGen::PokeMod::ItemEffect::SetVal2(const int v2) { LogSetVar("ItemEffect", id, "val2", v2); switch (effect) { case IE_HP_CURE: case IE_REVIVE: case IE_CURE_STATUS: case IE_LEVEL_BOOST: case IE_FLINCH: case IE_FIRST: case IE_KEEP_ALIVE: case IE_MODIFY_STAT_BAT: case IE_SHIELD_BAT: case IE_RUN_BAT: case IE_PP_BOOST: case IE_TYPE_BOOST: case IE_PP_RESTORE: case IE_EXP_SHARE: case IE_FISH: case IE_REPEL: case IE_ESCAPE: case IE_TM: case IE_HM: case IE_MAP: case IE_ITEMFINDER: case IE_BIKE: case IE_SCOPE: case IE_BERRY: case IE_ACORN: LogNoUse("ItemEffect", id, "val2", v2, "effect", ItemEffectStr[effect]); break; case IE_STAT_BOOST: if ((0 < v2) && (v2 < 65536)) val2 = v2; else LogOutOfRange("ItemEffect", id, "val2", v2, "effect", "Stat Boost"); break; case IE_BALL: // TODO (Ben#1#): Ball Effect val2 // Depends on val4 break; case IE_COIN: case IE_COIN_CASE: if (0 < v2) val2 = v2; else LogOutOfRange("ItemEffect", id, "val2", v2, "effect", ItemEffectStr[effect]); break; default: LogNotSet("ItemEffect", id, "val2", v2, "effect"); } } void PokeGen::PokeMod::ItemEffect::SetVal3(const Frac &v3) { LogSetVar("ItemEffect", id, "val3", v3.GetNum(), v3.GetDenom()); switch (effect) { case IE_HP_CURE: case IE_REVIVE: case IE_FLINCH: case IE_FIRST: case IE_KEEP_ALIVE: case IE_SHIELD_BAT: case IE_RUN_BAT: case IE_PP_BOOST: case IE_TYPE_BOOST: case IE_PP_RESTORE: case IE_EXP_SHARE: case IE_REPEL: val3 = v3; break; case IE_CURE_STATUS: case IE_LEVEL_BOOST: case IE_STAT_BOOST: case IE_MODIFY_STAT_BAT: case IE_FISH: case IE_ESCAPE: case IE_TM: case IE_HM: case IE_MAP: case IE_ITEMFINDER: case IE_BIKE: case IE_SCOPE: case IE_COIN: case IE_COIN_CASE: case IE_ACORN: LogNoUse("ItemEffect", id, "val3", 0, "effect", ItemEffectStr[effect]); break; case IE_BALL: // TODO (Ben#1#): Ball Effect val3 // Depends on val4 break; case IE_BERRY: // TODO (Ben#1#): Berry Effect val3 // Depends on val4 break; default: LogNotSet("ItemEffect", id, "val3", 0, "effect"); } } void PokeGen::PokeMod::ItemEffect::SetVal3(const unsigned n, const unsigned d) { LogSetVar("ItemEffect", id, "val3", n, d); switch (effect) { case IE_HP_CURE: case IE_REVIVE: case IE_FLINCH: case IE_FIRST: case IE_KEEP_ALIVE: case IE_SHIELD_BAT: case IE_RUN_BAT: case IE_PP_BOOST: case IE_TYPE_BOOST: case IE_PP_RESTORE: case IE_EXP_SHARE: case IE_REPEL: val3.Set(n, d); break; case IE_CURE_STATUS: case IE_LEVEL_BOOST: case IE_STAT_BOOST: case IE_MODIFY_STAT_BAT: case IE_FISH: case IE_ESCAPE: case IE_TM: case IE_HM: case IE_MAP: case IE_ITEMFINDER: case IE_BIKE: case IE_SCOPE: case IE_COIN: case IE_COIN_CASE: case IE_ACORN: LogNoUse("ItemEffect", id, "val3", 0, "effect", ItemEffectStr[effect]); break; case IE_BALL: // TODO (Ben#1#): Ball Effect val3 // Depends on val4 break; case IE_BERRY: // TODO (Ben#1#): Berry Effect val3 // Depends on val4 break; default: LogNotSet("ItemEffect", id, "val3", 0, "effect"); } } void PokeGen::PokeMod::ItemEffect::SetVal3Num(const unsigned n) { LogSetVar("ItemEffect", id, "val3 numerator", n); switch (effect) { case IE_HP_CURE: case IE_REVIVE: case IE_FLINCH: case IE_FIRST: case IE_KEEP_ALIVE: case IE_SHIELD_BAT: case IE_RUN_BAT: case IE_PP_BOOST: case IE_TYPE_BOOST: case IE_PP_RESTORE: case IE_EXP_SHARE: case IE_REPEL: val3.SetNum(n); break; case IE_CURE_STATUS: case IE_LEVEL_BOOST: case IE_STAT_BOOST: case IE_MODIFY_STAT_BAT: case IE_FISH: case IE_ESCAPE: case IE_TM: case IE_HM: case IE_MAP: case IE_ITEMFINDER: case IE_BIKE: case IE_SCOPE: case IE_COIN: case IE_COIN_CASE: case IE_ACORN: LogNoUse("ItemEffect", id, "val3", n, "effect", ItemEffectStr[effect]); break; case IE_BALL: // TODO (Ben#1#): Ball Effect val3 // Depends on val4 break; case IE_BERRY: // TODO (Ben#1#): Berry Effect val3 // Depends on val4 break; default: LogNotSet("ItemEffect", id, "val3 numerator", n, "effect"); } } void PokeGen::PokeMod::ItemEffect::SetVal3Denom(const unsigned d) { LogSetVar("ItemEffect", id, "val3 denominator", d); switch (effect) { case IE_HP_CURE: case IE_REVIVE: case IE_FLINCH: case IE_FIRST: case IE_KEEP_ALIVE: case IE_SHIELD_BAT: case IE_RUN_BAT: case IE_PP_BOOST: case IE_TYPE_BOOST: case IE_PP_RESTORE: case IE_EXP_SHARE: case IE_REPEL: val3.SetDenom(d); break; case IE_CURE_STATUS: case IE_LEVEL_BOOST: case IE_STAT_BOOST: case IE_MODIFY_STAT_BAT: case IE_FISH: case IE_ESCAPE: case IE_TM: case IE_HM: case IE_MAP: case IE_ITEMFINDER: case IE_BIKE: case IE_SCOPE: case IE_COIN: case IE_COIN_CASE: case IE_ACORN: LogNoUse("ItemEffect", id, "val3", d, "effect", ItemEffectStr[effect]); break; case IE_BALL: // TODO (Ben#1#): Ball Effect val3 // Depends on val4 break; case IE_BERRY: // TODO (Ben#1#): Berry Effect val3 // Depends on val4 break; default: LogNotSet("ItemEffect", id, "val3 denominator", d, "effect"); } } void PokeGen::PokeMod::ItemEffect::SetVal4(const unsigned v4) { LogSetVar("ItemEffect", id, "val4", v4); switch (effect) { case IE_HP_CURE: case IE_REVIVE: if (v4 < REL_END) val4 = v4; else LogOutOfRange("ItemEffect", id, "val4", v4, "effect", ItemEffectStr[effect]); break; case IE_CURE_STATUS: if (pokemod->GetStatus(v4)) val4 = v4; else LogOutOfRange("ItemEffect", id, "val4", v4, "effect", "Cure Status"); break; case IE_LEVEL_BOOST: case IE_FLINCH: case IE_FIRST: case IE_KEEP_ALIVE: case IE_RUN_BAT: case IE_PP_BOOST: case IE_EXP_SHARE: case IE_FISH: case IE_MAP: case IE_ITEMFINDER: case IE_BIKE: case IE_SCOPE: case IE_COIN: case IE_COIN_CASE: LogNoUse("ItemEffect", id, "val4", v4, "effect", ItemEffectStr[effect]); break; case IE_STAT_BOOST: case IE_MODIFY_STAT_BAT: // Stat break; case IE_SHIELD_BAT: // Special/Physical break; case IE_TYPE_BOOST: if (pokemod->GetType(v4)) val4 = v4; else LogOutOfRange("ItemEffect", id, "val4", v4, "effect", "Type Boost"); break; case IE_PP_RESTORE: // All/One break; case IE_REPEL: // First/Max/All break; case IE_ESCAPE: // Anywhere/Dungeon break; case IE_TM: case IE_HM: if (pokemod->GetMove(v4)) val4 = v4; else LogOutOfRange("ItemEffect", id, "val4", v4, "effect", "TM/HM"); break; case IE_BALL: // BallType break; case IE_BERRY: // BerryType break; case IE_ACORN: if (pokemod->GetItem(v4)) val4 = v4; else LogOutOfRange("ItemEffect", id, "val4", v4, "effect", "Acorn"); break; default: LogNotSet("ItemEffect", id, "val4", v4, "effect"); } } void PokeGen::PokeMod::ItemEffect::SetVal4(const String &v4) { LogSetVar("ItemEffect", id, "val4 string", v4); switch (effect) { case IE_HP_CURE: case IE_REVIVE: // Percent/Abs break; case IE_CURE_STATUS: // Status break; case IE_LEVEL_BOOST: case IE_FLINCH: case IE_FIRST: case IE_KEEP_ALIVE: case IE_RUN_BAT: case IE_PP_BOOST: case IE_EXP_SHARE: case IE_FISH: case IE_MAP: case IE_ITEMFINDER: case IE_BIKE: case IE_SCOPE: case IE_COIN: case IE_COIN_CASE: LogNoUse("ItemEffect", id, "val4", v4, "effect", ItemEffectStr[effect]); break; case IE_STAT_BOOST: case IE_MODIFY_STAT_BAT: // Stat break; case IE_SHIELD_BAT: // Special/Physical break; case IE_TYPE_BOOST: // Type break; case IE_PP_RESTORE: // All/One break; case IE_REPEL: // First/Max/All break; case IE_ESCAPE: // Anywhere/Dungeon break; case IE_TM: case IE_HM: // Move break; case IE_BALL: // BallType break; case IE_BERRY: // BerryType break; case IE_ACORN: // Item break; default: LogNotSet("ItemEffect", id, "val4", v4, "effect"); } } void PokeGen::PokeMod::ItemEffect::SetVal5(const unsigned v5) { LogSetVar("ItemEffect", id, "val5", v5); switch (effect) { case IE_HP_CURE: case IE_REVIVE: case IE_CURE_STATUS: case IE_LEVEL_BOOST: case IE_STAT_BOOST: case IE_FLINCH: case IE_FIRST: case IE_KEEP_ALIVE: case IE_MODIFY_STAT_BAT: case IE_SHIELD_BAT: case IE_RUN_BAT: case IE_PP_BOOST: case IE_TYPE_BOOST: case IE_PP_RESTORE: case IE_EXP_SHARE: case IE_FISH: case IE_REPEL: case IE_ESCAPE: case IE_TM: case IE_HM: case IE_MAP: case IE_ITEMFINDER: case IE_BIKE: case IE_SCOPE: case IE_COIN: case IE_COIN_CASE: case IE_ACORN: LogNoUse("ItemEffect", id, "val5", v5, "effect", ItemEffectStr[effect]); break; case IE_BALL: // TODO (Ben#1#): Ball Effect val5 // Depends on val4 break; case IE_BERRY: // TODO (Ben#1#): Berry Effect val5 // Depends on val4 break; default: LogNotSet("ItemEffect", id, "val5", v5, "effect"); } } void PokeGen::PokeMod::ItemEffect::SetVal5(const String &v5) { LogSetVar("ItemEffect", id, "val5", v5); switch (effect) { case IE_HP_CURE: case IE_REVIVE: case IE_CURE_STATUS: case IE_LEVEL_BOOST: case IE_STAT_BOOST: case IE_FLINCH: case IE_FIRST: case IE_KEEP_ALIVE: case IE_MODIFY_STAT_BAT: case IE_SHIELD_BAT: case IE_RUN_BAT: case IE_PP_BOOST: case IE_TYPE_BOOST: case IE_PP_RESTORE: case IE_EXP_SHARE: case IE_FISH: case IE_REPEL: case IE_ESCAPE: case IE_TM: case IE_HM: case IE_MAP: case IE_ITEMFINDER: case IE_BIKE: case IE_SCOPE: case IE_COIN: case IE_COIN_CASE: case IE_ACORN: LogNoUse("ItemEffect", id, "val5", v5, "effect", ItemEffectStr[effect]); break; case IE_BALL: // TODO (Ben#1#): Ball Effect val5 // Depends on val4 break; case IE_BERRY: // TODO (Ben#1#): Berry Effect val5 // Depends on val4 break; default: LogNotSet("ItemEffect", id, "val5", v5, "effect"); } } bool PokeGen::PokeMod::ItemEffect::GetOverworld() const { LogFetchVar("ItemEffect", id, "overworld", overworld); return overworld; } bool PokeGen::PokeMod::ItemEffect::GetBattle() const { LogFetchVar("ItemEffect", id, "battle", battle); return battle; } bool PokeGen::PokeMod::ItemEffect::GetHeld() const { LogFetchVar("ItemEffect", id, "held", held); return held; } unsigned PokeGen::PokeMod::ItemEffect::GetEffect() const { LogFetchVar("ItemEffect", id, "effect", effect); return effect; } // TODO (Ben#1#): Values fetching int PokeGen::PokeMod::ItemEffect::GetVal1() const { LogFetchVar("ItemEffect", id, "val1", val1); return val1; } int PokeGen::PokeMod::ItemEffect::GetVal2() const { LogFetchVar("ItemEffect", id, "val2", val2); return val2; } PokeGen::PokeMod::Frac PokeGen::PokeMod::ItemEffect::GetVal3() const { LogFetchVar("ItemEffect", id, "val3", val3.GetNum(), val3.GetDenom()); return val3; } unsigned PokeGen::PokeMod::ItemEffect::GetVal3Num() const { LogFetchVar("ItemEffect", id, "val3 numerator", val3.GetNum()); return val3.GetNum(); } unsigned PokeGen::PokeMod::ItemEffect::GetVal3Denom() const { LogFetchVar("ItemEffect", id, "val3 denominator", val3.GetDenom()); return val3.GetDenom(); } unsigned PokeGen::PokeMod::ItemEffect::GetVal4() const { LogFetchVar("ItemEffect", id, "val4", val4); return val4; } PokeGen::PokeMod::String PokeGen::PokeMod::ItemEffect::GetVal4String() const { LogFetchVar("ItemEffect", id, "val4 string", val4); String ret = ""; switch (effect) { case IE_HP_CURE: case IE_REVIVE: // Percent/Abs break; case IE_CURE_STATUS: // Status break; case IE_STAT_BOOST: case IE_MODIFY_STAT_BAT: // Stat break; case IE_SHIELD_BAT: // Special/Physical break; case IE_TYPE_BOOST: // Type break; case IE_PP_RESTORE: // All/One break; case IE_REPEL: // First/Max/All break; case IE_ESCAPE: // Anywhere/Dungeon break; case IE_TM: case IE_HM: // Move break; case IE_BALL: // BallType break; case IE_BERRY: // BerryType break; case IE_ACORN: // Item break; } return ret; } unsigned PokeGen::PokeMod::ItemEffect::GetVal5() const { LogFetchVar("ItemEffect", id, "val5", val5); return val5; } PokeGen::PokeMod::String PokeGen::PokeMod::ItemEffect::GetVal5String() const { LogFetchVar("ItemEffect", id, "val5 string", val5); String ret = ""; switch (effect) { case IE_BALL: // TODO (Ben#1#): Dependant if ((val4 == 0) && (val5 < 0)) ret = BallEffectStr[val5]; break; case IE_BERRY: if ((val4 == 0) && (val5 < 0)) ret = BallEffectStr[val5]; break; } return ret; }