/////////////////////////////////////////////////////////////////////////////
// Name: pokemod/MapTrainer.cpp
// Purpose: Define a trainer for a map
// Author: Ben Boeckel
// Modified by: Ben Boeckel
// Created: Fri June 1 2007 23:11:28
// Copyright: ©2007-2008 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 3 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, see .
/////////////////////////////////////////////////////////////////////////////
#include
#include
#include
#include
#include
#include
#include "Pokemod.h"
#include "Dialog.h"
#include "MapTrainer.h"
MapTrainer::MapTrainer(const Pokemod& par, const unsigned _id) :
Object(par, _id),
name(""),
coordinate(0, 0),
skin(""),
sight(0),
direction(UINT_MAX),
numFight(1),
ai(""),
appearFlag(0, 0),
overworldDialog(UINT_MAX),
winDialog(UINT_MAX),
loseDialog(UINT_MAX),
leadTeamMember(UINT_MAX)
{
}
MapTrainer::MapTrainer(const Pokemod& par, const MapTrainer& t, const unsigned _id) :
Object(par, _id)
{
*this = t;
}
MapTrainer::MapTrainer(const Pokemod& par, const QString& fname, const unsigned _id) :
Object(par, _id)
{
load(fname, _id);
}
bool MapTrainer::validate() const
{
bool valid = true;
pokemod.validationMsg(QString("------Trainer \"%1\" with id %2---").arg(name).arg(id), Pokemod::V_Msg);
if (name == "")
{
pokemod.validationMsg("Name is not defined");
valid = false;
}
if (!QFile::exists(QString("%1/image/skin/%2.png").arg(pokemod.getPath()).arg(skin)))
{
pokemod.validationMsg("Skin could't be found");
valid = false;
}
if (D_End_None <= direction)
{
pokemod.validationMsg("Invalid direction");
valid = false;
}
if (!numFight || (pokemod.getRules().getMaxFight() < numFight))
{
pokemod.validationMsg("Invalid number of Pokémon for a fight");
valid = false;
}
if (!QFile::exists(QString("%1/ai/%2.pai").arg(pokemod.getPath()).arg(ai)))
{
pokemod.validationMsg("AI file couldn\'t be found");
valid = false;
}
if (pokemod.getDialogIndex(overworldDialog) == UINT_MAX)
{
pokemod.validationMsg("Invalid overworld dialog");
valid = false;
}
if (pokemod.getDialogIndex(winDialog) == UINT_MAX)
{
pokemod.validationMsg("Invalid win dialog");
valid = false;
}
if (pokemod.getDialogIndex(loseDialog) == UINT_MAX)
{
pokemod.validationMsg("Invalid lose dialog");
valid = false;
}
if (getTeamMemberCount() <= leadTeamMember)
{
pokemod.validationMsg("Invalid lead member");
valid = false;
}
if (getTeamMemberCount())
{
QMap idChecker;
for (QListIterator i(teamMembers); i.hasNext(); i.next())
{
if (!i.peekNext().isValid())
valid = false;
++idChecker[i.peekNext().getId()];
}
for (QMapIterator i(idChecker); i.hasNext(); i.next())
{
if (1 < i.value())
{
pokemod.validationMsg(QString("There are %1 team members with id %2").arg(i.value()).arg(i.key()));
valid = false;
}
}
}
else
{
pokemod.validationMsg("There are no team members");
valid = false;
}
return valid;
}
unsigned MapTrainer::getNewId() const
{
unsigned i = 0;
for (; i < getTeamMemberCount(); ++i)
{
if (getTeamMemberIndex(i) == UINT_MAX)
return i;
}
return UINT_MAX;
}
void MapTrainer::load(const QString& fname, const unsigned _id) throw(Exception)
{
Ini ini(fname);
if (_id == UINT_MAX)
ini.getValue("id", id);
else
id = _id;
unsigned i;
unsigned j;
ini.getValue("name", name);
ini.getValue("coordinate-x", i, 0);
ini.getValue("coordinate-y", j, 0);
coordinate.set(i, j);
ini.getValue("skin", skin);
ini.getValue("sight", sight, 0);
ini.getValue("direction", direction);
ini.getValue("numFight", numFight, 1);
ini.getValue("ai", ai);
ini.getValue("appearFlag-f", i, 0);
ini.getValue("appearFlag-s", j, 0);
appearFlag.set(i, j);
ini.getValue("overworldDialog", overworldDialog);
ini.getValue("winDialog", winDialog);
ini.getValue("loseDialog", loseDialog);
ini.getValue("leadTeamMember", leadTeamMember);
QStringList path = pokemod.getPath().split('/');
path.removeLast();
QDir fdir(path.join("/"));
teamMembers.clear();
if (fdir.cd("team"))
{
for (QStringListIterator i(fdir.entryList(QStringList("*.pini"), QDir::Files, QDir::Name)); i.hasNext(); )
newTeamMember(i.next());
}
}
void MapTrainer::save(const QString& map) const throw(Exception)
{
Ini ini;
ini.addField("id", id);
ini.addField("name", name);
ini.addField("name", name);
ini.addField("coordinate-x", coordinate.getX());
ini.addField("coordinate-y", coordinate.getY());
ini.addField("skin", skin);
ini.addField("sight", sight);
ini.addField("direction", direction);
ini.addField("numFight", numFight);
ini.addField("ai", ai);
ini.addField("appearFlag-f", appearFlag.getFlag());
ini.addField("appearFlag-s", appearFlag.getStatus());
ini.addField("overworldDialog", overworldDialog);
ini.addField("winDialog", winDialog);
ini.addField("loseDialog", loseDialog);
ini.addField("leadTeamMember", leadTeamMember);
ini.save(QString("%1/map/%2/trainer/%3/data.pini").arg(pokemod.getPath()).arg(map).arg(name));
for (QListIterator i(teamMembers); i.hasNext(); )
i.next().save(map, name);
}
void MapTrainer::setName(const QString& n)
{
name = n;
}
void MapTrainer::setCoordinate(const unsigned x, const unsigned y)
{
coordinate.set(x, y);
}
void MapTrainer::setCoordinateX(const unsigned x)
{
coordinate.setX(x);
}
void MapTrainer::setCoordinateY(const unsigned y)
{
coordinate.setY(y);
}
void MapTrainer::setSkin(const QString& s) throw(OpenException)
{
if (!QFile::exists(QString("%1/image/skin/%2.png").arg(pokemod.getPath()).arg(s)))
throw(OpenException("MapTrainer", QString("%1/image/skin/%2.png").arg(pokemod.getPath()).arg(s)));
skin = s;
}
void MapTrainer::setSight(const unsigned s)
{
sight = s;
}
void MapTrainer::setDirection(const unsigned d) throw(BoundsException)
{
if (D_End_None <= d)
throw(BoundsException("MapTrainer", "direction"));
direction = d;
}
void MapTrainer::setNumFight(const unsigned n) throw(BoundsException)
{
if (!n || (pokemod.getRules().getMaxFight() < n))
throw(BoundsException("MapTrainer", "numFight"));
numFight = n;
}
void MapTrainer::setAI(const QString& a) throw(OpenException)
{
if (!QFile::exists(QString("%1/ai/%2.pai").arg(pokemod.getPath()).arg(a)))
throw(OpenException("MapTrainer", QString("%1/ai/%2.pai").arg(pokemod.getPath()).arg(a)));
ai = a;
}
void MapTrainer::setAppearFlag(const unsigned f, const unsigned s)
{
appearFlag.set(f, s);
}
void MapTrainer::setAppearFlagFlag(const unsigned f)
{
appearFlag.setFlag(f);
}
void MapTrainer::setAppearFlagStatus(const unsigned s)
{
appearFlag.setStatus(s);
}
void MapTrainer::setOverworldDialog(const unsigned o) throw(BoundsException)
{
if (pokemod.getDialogIndex(o) == UINT_MAX)
throw(BoundsException("MapTrainer", "overworldDialog"));
overworldDialog = o;
}
void MapTrainer::setWinDialog(const unsigned w) throw(BoundsException)
{
if (pokemod.getDialogIndex(w) == UINT_MAX)
throw(BoundsException("MapTrainer", "winDialog"));
winDialog = w;
}
void MapTrainer::setLoseDialog(const unsigned l) throw(BoundsException)
{
if (pokemod.getDialogIndex(l) == UINT_MAX)
throw(BoundsException("MapTrainer", "loseDialog"));
loseDialog = l;
}
void MapTrainer::setLeadTeamMember(const unsigned l) throw(BoundsException)
{
if (getTeamMemberCount() <= l)
throw(BoundsException("MapTrainer", "leadTeamMember"));
leadTeamMember = l;
}
QString MapTrainer::getName() const
{
return name;
}
Point MapTrainer::getCoordinate() const
{
return coordinate;
}
QString MapTrainer::getSkin() const
{
return skin;
}
unsigned MapTrainer::getSight() const
{
return sight;
}
unsigned MapTrainer::getDirection() const
{
return direction;
}
unsigned MapTrainer::getNumFight() const
{
return numFight;
}
QString MapTrainer::getAI() const
{
return ai;
}
Flag MapTrainer::getAppearFlag() const
{
return appearFlag;
}
unsigned MapTrainer::getOverworldDialog() const
{
return overworldDialog;
}
unsigned MapTrainer::getWinDialog() const
{
return winDialog;
}
unsigned MapTrainer::getLoseDialog() const
{
return loseDialog;
}
unsigned MapTrainer::getLeadTeamMember() const
{
return leadTeamMember;
}
const MapTrainerTeamMember& MapTrainer::getTeamMember(const unsigned i) const throw(IndexException)
{
if (getTeamMemberCount() <= i)
throw(IndexException("MapTrainer"));
return teamMembers.at(i);
}
MapTrainerTeamMember& MapTrainer::getTeamMember(const unsigned i) throw(IndexException)
{
if (getTeamMemberCount() <= i)
throw(IndexException("MapTrainer"));
return teamMembers[i];
}
const MapTrainerTeamMember& MapTrainer::getTeamMemberByID(const unsigned i) const throw(IndexException)
{
return getTeamMember(getTeamMemberIndex(i));
}
MapTrainerTeamMember& MapTrainer::getTeamMemberByID(const unsigned i) throw(IndexException)
{
return getTeamMember(getTeamMemberIndex(i));
}
unsigned MapTrainer::getTeamMemberIndex(const unsigned _id) const
{
for (unsigned i = 0; i < getTeamMemberCount(); ++i)
{
if (teamMembers[i].getId() == _id)
return i;
}
return UINT_MAX;
}
unsigned MapTrainer::getTeamMemberCount() const
{
return teamMembers.size();
}
MapTrainerTeamMember& MapTrainer::newTeamMember()
{
teamMembers.append(MapTrainerTeamMember(pokemod, getNewId()));
return teamMembers[getTeamMemberCount() - 1];
}
MapTrainerTeamMember& MapTrainer::newTeamMember(const QString& fname)
{
teamMembers.append(MapTrainerTeamMember(pokemod, fname, getNewId()));
return teamMembers[getTeamMemberCount() - 1];
}
MapTrainerTeamMember& MapTrainer::newTeamMember(const MapTrainerTeamMember& p)
{
teamMembers.append(MapTrainerTeamMember(pokemod, p, getNewId()));
return teamMembers[getTeamMemberCount() - 1];
}
void MapTrainer::deleteTeamMember(const unsigned i) throw(IndexException)
{
if (getTeamMemberCount() <= i)
throw(IndexException("MapTrainer"));
teamMembers.removeAt(i);
}
MapTrainer& MapTrainer::operator=(const MapTrainer& rhs)
{
if (this == &rhs)
return *this;
name = rhs.name;
coordinate = rhs.coordinate;
skin = rhs.skin;
sight = rhs.sight;
direction = rhs.direction;
numFight = rhs.numFight;
ai = rhs.ai;
appearFlag = rhs.appearFlag;
overworldDialog = rhs.overworldDialog;
winDialog = rhs.winDialog;
loseDialog = rhs.loseDialog;
leadTeamMember = rhs.leadTeamMember;
teamMembers.clear();
for (unsigned i = 0; i < rhs.getTeamMemberCount(); ++i)
newTeamMember(rhs.getTeamMember(i));
return *this;
}