diff options
| author | Ben Boeckel <MathStuf@gmail.com> | 2008-08-28 14:52:45 +0000 |
|---|---|---|
| committer | Ben Boeckel <MathStuf@gmail.com> | 2008-08-28 14:52:45 +0000 |
| commit | b99ffef4aa68dd5f0af64de9aec0f610e267d8cc (patch) | |
| tree | d5f9e905c21c47f6a98688d400a99ce8f479e52b /pokebattle/TeamMember.cpp | |
| parent | e4630543dc17d2a42c27d192518fe3f54e7888bc (diff) | |
| download | sigen-b99ffef4aa68dd5f0af64de9aec0f610e267d8cc.tar.gz sigen-b99ffef4aa68dd5f0af64de9aec0f610e267d8cc.tar.xz sigen-b99ffef4aa68dd5f0af64de9aec0f610e267d8cc.zip | |
[FIX] Changed the providers URL to a better structure
[FIX] Arenas can now count how many players are still active
[FIX] long long is now used for experience
[FIX] Scripts initialized now
git-svn-id: https://pokegen.svn.sourceforge.net/svnroot/pokegen/trunk@248 6ecfd1a5-f3ed-3746-8530-beee90d26b22
Diffstat (limited to 'pokebattle/TeamMember.cpp')
| -rw-r--r-- | pokebattle/TeamMember.cpp | 139 |
1 files changed, 111 insertions, 28 deletions
diff --git a/pokebattle/TeamMember.cpp b/pokebattle/TeamMember.cpp index c4470e48..84727cb7 100644 --- a/pokebattle/TeamMember.cpp +++ b/pokebattle/TeamMember.cpp @@ -19,6 +19,7 @@ #include "TeamMember.h" // Pokebattle includes +#include "Arena.h" #include "Containment.h" #include "Player.h" @@ -26,9 +27,11 @@ #include "../pokescripting/AbilityWrapper.h" #include "../pokescripting/ItemWrapper.h" #include "../pokescripting/MapTrainerTeamMemberWrapper.h" +#include "../pokescripting/MoveWrapper.h" #include "../pokescripting/NatureWrapper.h" #include "../pokescripting/PokemodWrapper.h" #include "../pokescripting/RulesWrapper.h" +#include "../pokescripting/StatusWrapper.h" #include "../pokescripting/SpeciesWrapper.h" #include "../pokescripting/SpeciesAbilityWrapper.h" #include "../pokescripting/SpeciesItemWrapper.h" @@ -48,6 +51,39 @@ // C includes #include <cmath> +// TODO: Current HP +// TODO: Script cleanup (battle) + +int Pokebattle::actionPriority(const TeamMember* teamMember, const TeamMember::Action& action) +{ + int priority = INT_MAX; + switch (action.first) + { + case TeamMember::Attack: + priority = teamMember->pokemod()->move(action.second.first.toString())->priority(); + break; + case TeamMember::Item: + priority = INT_MIN / 3; + break; + case TeamMember::Switch: + priority = INT_MIN / 2; + break; + case TeamMember::Run: + priority = INT_MIN; + break; + case TeamMember::Skip: + priority = INT_MAX - 2; + break; + case TeamMember::Timeout: + priority = INT_MAX; + break; + case TeamMember::Invalid: + priority = INT_MAX - 1; + break; + } + return priority; +} + Pokebattle::TeamMember::TeamMember(const int speciesId, const QString& name, const int level, Containment* containment, const bool suppressItems) : Pokescripting::Config(containment), m_containment(containment), @@ -81,6 +117,7 @@ Pokebattle::TeamMember::TeamMember(const int speciesId, const QString& name, con evolution->addObject(this, "owner", Kross::ChildrenInterface::AutoConnectSignals); evolution->trigger(); } + m_currentHp = statValue(Pokemod::ST_HP); } Pokebattle::TeamMember::TeamMember(Pokescripting::MapTrainerTeamMemberWrapper* teamMember, Containment* containment) : @@ -93,12 +130,9 @@ Pokebattle::TeamMember::TeamMember(Pokescripting::MapTrainerTeamMemberWrapper* t setName(m_species->name()); setLevel(teamMember->level()); m_items = teamMember->items(); - m_abilities = teamMember->abilities(); - initAbilities(); - m_moves = teamMember->moves(); - initMoves(); - m_natures = teamMember->natures(); - initNatures(); + initAbilities(teamMember->abilities()); + initMoves(teamMember->moves()); + initNatures(teamMember->natures()); initStats(); if (m_species->genderFactor() <= 1) m_gender = (m_species->genderFactor().poll() ? Male : Female); @@ -106,6 +140,7 @@ Pokebattle::TeamMember::TeamMember(Pokescripting::MapTrainerTeamMemberWrapper* t m_gender = Genderless; for (int i = 0; i < Pokemod::ST_End_GSC; ++i) m_statExp[i] = 0; + m_currentHp = statValue(Pokemod::ST_HP); } QUuid Pokebattle::TeamMember::id() const @@ -120,6 +155,11 @@ QString Pokebattle::TeamMember::name() const return m_name; } +long long Pokebattle::TeamMember::currentHp() const +{ + return m_currentHp; +} + Pokescripting::SpeciesWrapper* Pokebattle::TeamMember::species() const { if (value("species").canConvert<Pokescripting::SpeciesWrapper*>()) @@ -139,10 +179,10 @@ Pokebattle::TeamMember::Gender Pokebattle::TeamMember::gender() const return m_gender; } -int Pokebattle::TeamMember::levelExperience() const +long long Pokebattle::TeamMember::levelExperience() const { - if (value("levelExperience").canConvert<int>()) - return value("levelExperience").toInt(); + if (value("levelExperience").canConvert<long long>()) + return value("levelExperience").toLongLong(); return m_levelExp; } @@ -153,11 +193,11 @@ int Pokebattle::TeamMember::baseStat(const Pokemod::Stat stat) const return m_species->baseStat(stat); } -int Pokebattle::TeamMember::statExperience(const Pokemod::Stat stat) const +long long Pokebattle::TeamMember::statExperience(const Pokemod::Stat stat) const { const QString valueName = QString("statExperience-%1").arg((pokemod()->rules()->specialSplit() ? Pokemod::StatGSCStr : Pokemod::StatRBYStr)[stat]); - if (value(valueName).canConvert<int>()) - return value(valueName).toInt(); + if (value(valueName).canConvert<long long>()) + return value(valueName).toLongLong(); return m_statExp[stat]; } @@ -173,9 +213,9 @@ int Pokebattle::TeamMember::dv(const Pokemod::Stat stat) const return m_dv[stat]; } -int Pokebattle::TeamMember::statValue(const Pokemod::Stat stat, const int exp) const +long long Pokebattle::TeamMember::statValue(const Pokemod::Stat stat, const long long exp) const { - int statValue; + long long statValue; if (exp < 0) statValue = statExperience(stat); else @@ -207,12 +247,12 @@ int Pokebattle::TeamMember::statValue(const Pokemod::Stat stat, const int exp) c return statValue; } -int Pokebattle::TeamMember::calcExp(int level) const +long long Pokebattle::TeamMember::calcExp(int level) const { if (level < 0) level = m_level; - const int square = level * level; - const int cube = square * level; + const long long square = level * level; + const long long cube = square * level; switch (m_species->growth()) { case Pokemod::Species::Fluctuating: @@ -336,9 +376,10 @@ void Pokebattle::TeamMember::cureStatus(Pokescripting::StatusWrapper* status) { if (m_status.contains(status)) { - m_status.removeAll(status); - - // TODO: clean up status script + QList<Kross::Action*> actions = m_status.values(status); + foreach (Kross::Action* action, actions) + delete action; + m_status.remove(status); emit(statusCured(status)); } } @@ -348,8 +389,13 @@ void Pokebattle::TeamMember::giveStatus(Pokescripting::StatusWrapper* status) Q_ASSERT(pokemod()->statusIndex(status) != INT_MAX); if (!m_status.contains(status)) { - m_status.append(status); - // TODO: initialize status script + const Pokemod::Script script = status->worldScript(); + Kross::Action* statusAction = new Kross::Action(Kross::Manager::self().actionCollection()->collection("status"), QString("status-%1").arg(QUuid::createUuid().toString())); + statusAction->setInterpreter(script.interpreter()); + statusAction->setCode(script.script().toUtf8()); + statusAction->addObject(this, "owner", Kross::ChildrenInterface::AutoConnectSignals); + statusAction->trigger(); + m_status.insert(status, statusAction); emit(statusInflicted(status)); } } @@ -453,8 +499,30 @@ Pokebattle::TeamMember::Action Pokebattle::TeamMember::requestAction() const void Pokebattle::TeamMember::makeActive(Arena* arena) { - // TODO: initialize status scripts - // TODO: initialize ability scripts + QList<Pokescripting::StatusWrapper*> statuses = m_status.uniqueKeys(); + foreach (Pokescripting::StatusWrapper* status, statuses) + { + const Pokemod::Script script = status->battleScript(); + Kross::Action* statusScript = new Kross::Action(Kross::Manager::self().actionCollection()->collection("status"), QString("status-%1").arg(QUuid::createUuid().toString())); + statusScript->setInterpreter(script.interpreter()); + statusScript->setCode(script.script().toUtf8()); + statusScript->addObject(arena, "arena", Kross::ChildrenInterface::AutoConnectSignals); + statusScript->addObject(this, "owner", Kross::ChildrenInterface::AutoConnectSignals); + statusScript->trigger(); + m_statusBattleScripts.append(statusScript); + } + QList<Pokescripting::AbilityWrapper*> abilities = m_abilities.keys(); + foreach (Pokescripting::AbilityWrapper* ability, abilities) + { + const Pokemod::Script script = ability->battleScript(); + Kross::Action* abilityScript = new Kross::Action(Kross::Manager::self().actionCollection()->collection("ability"), QString("ability-%1").arg(QUuid::createUuid().toString())); + abilityScript->setInterpreter(script.interpreter()); + abilityScript->setCode(script.script().toUtf8()); + abilityScript->addObject(arena, "arena", Kross::ChildrenInterface::AutoConnectSignals); + abilityScript->addObject(this, "owner", Kross::ChildrenInterface::AutoConnectSignals); + abilityScript->trigger(); + m_abilityBattleScripts.append(abilityScript); + } } void Pokebattle::TeamMember::writeBack() @@ -496,6 +564,17 @@ void Pokebattle::TeamMember::makeConnections() // TODO: make connections that are necessary (watching Config changes mainly) } +void Pokebattle::TeamMember::initAbility(Pokescripting::AbilityWrapper* ability) +{ + const Pokemod::Script script = ability->battleScript(); + Kross::Action* abilityScript = new Kross::Action(Kross::Manager::self().actionCollection()->collection("ability"), QString("ability-%1").arg(QUuid::createUuid().toString())); + abilityScript->setInterpreter(script.interpreter()); + abilityScript->setCode(script.script().toUtf8()); + abilityScript->addObject(this, "owner", Kross::ChildrenInterface::AutoConnectSignals); + abilityScript->trigger(); + m_abilities[ability] = abilityScript; +} + void Pokebattle::TeamMember::initItems() { Pokemod::Hat<Pokescripting::ItemWrapper*> hat = m_species->itemHat(); @@ -506,19 +585,22 @@ void Pokebattle::TeamMember::initItems() } } -void Pokebattle::TeamMember::initAbilities() +void Pokebattle::TeamMember::initAbilities(const QList<Pokescripting::AbilityWrapper*>& initial) { + foreach (Pokescripting::AbilityWrapper* ability, initial) + initAbility(ability); Pokemod::Hat<Pokescripting::AbilityWrapper*> hat = m_species->abilityHat(); while (m_abilities.size() < pokemod()->rules()->maxAbilities()) { Pokescripting::AbilityWrapper* ability = hat.takeAndClear(); if (!m_abilities.contains(ability)) - m_abilities.append(ability); + initAbility(ability); } } -void Pokebattle::TeamMember::initMoves() +void Pokebattle::TeamMember::initMoves(const QList<Pokescripting::MoveWrapper*>& initial) { + m_moves = initial; for (int i = 0; (i < m_species->moveCount()) && (m_moves.size() < pokemod()->rules()->maxMoves()); ++i) { Pokescripting::SpeciesMoveWrapper* move = m_species->move(i); @@ -527,8 +609,9 @@ void Pokebattle::TeamMember::initMoves() } } -void Pokebattle::TeamMember::initNatures() +void Pokebattle::TeamMember::initNatures(const QList<Pokescripting::NatureWrapper*>& initial) { + m_natures = initial; Pokemod::Hat<Pokescripting::NatureWrapper*> hat = pokemod()->natureHat(); while (m_natures.size() < pokemod()->rules()->maxNatures()) { |
