summaryrefslogtreecommitdiffstats
path: root/pokebattle/TeamMember.cpp
diff options
context:
space:
mode:
authorBen Boeckel <MathStuf@gmail.com>2008-08-28 14:52:45 +0000
committerBen Boeckel <MathStuf@gmail.com>2008-08-28 14:52:45 +0000
commitb99ffef4aa68dd5f0af64de9aec0f610e267d8cc (patch)
treed5f9e905c21c47f6a98688d400a99ce8f479e52b /pokebattle/TeamMember.cpp
parente4630543dc17d2a42c27d192518fe3f54e7888bc (diff)
downloadsigen-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.cpp139
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())
{