///////////////////////////////////////////////////////////////////////////// // 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; }