File indexing completed on 2024-05-05 05:40:26

0001 /***************************************************************************
0002  *   Copyright (C) 2015 by Renaud Guezennec                                *
0003  *   https://rolisteam.org/contact                   *
0004  *                                                                         *
0005  *   rolisteam is free software; you can redistribute it and/or modify     *
0006  *   it under the terms of the GNU General Public License as published by  *
0007  *   the Free Software Foundation; either version 2 of the License, or     *
0008  *   (at your option) any later version.                                   *
0009  *                                                                         *
0010  *   This program is distributed in the hope that it will be useful,       *
0011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
0012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
0013  *   GNU General Public License for more details.                          *
0014  *                                                                         *
0015  *   You should have received a copy of the GNU General Public License     *
0016  *   along with this program; if not, write to the                         *
0017  *   Free Software Foundation, Inc.,                                       *
0018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
0019  ***************************************************************************/
0020 
0021 #include "data/player.h"
0022 
0023 #include <QBuffer>
0024 #include <QDebug>
0025 
0026 #include "data/character.h"
0027 #include "worker/utilshelper.h"
0028 
0029 bool containsCharacter(QString name, QColor color, QByteArray avatar,
0030                        const std::vector<std::unique_ptr<Character>>& characters)
0031 {
0032     return (characters.end()
0033             != std::find_if(characters.begin(), characters.end(),
0034                             [name, color, avatar](const std::unique_ptr<Character>& character) {
0035                                 return character->name() == name && character->getColor() == color
0036                                        && character->avatar() == avatar;
0037                             }));
0038 }
0039 
0040 bool containsPointer(Character* character, const std::vector<std::unique_ptr<Character>>& characters)
0041 {
0042     return (characters.end()
0043             != std::find_if(characters.begin(), characters.end(),
0044                             [character](const std::unique_ptr<Character>& pointer)
0045                             { return character == pointer.get(); }));
0046 }
0047 
0048 Player::Player() {}
0049 
0050 Player::Player(const QString& nom, const QColor& color, bool master)
0051     : Person(nom, color), m_gameMaster(master) //, m_link(link)
0052 {
0053 }
0054 
0055 Player::Player(const QString& uuid, const QString& nom, const QColor& color, bool master)
0056     : Person(nom, color, uuid), m_gameMaster(master) //, m_link(link)
0057 {
0058 }
0059 
0060 Player::~Player()= default;
0061 
0062 int Player::characterCount() const
0063 {
0064     return static_cast<int>(m_characters.size());
0065 }
0066 
0067 const std::vector<std::unique_ptr<Character>>& Player::children()
0068 {
0069     return m_characters;
0070 }
0071 
0072 Character* Player::getCharacterByIndex(int index) const
0073 {
0074     if(index < static_cast<int>(m_characters.size()) && index >= 0)
0075         return m_characters[static_cast<std::size_t>(index)].get();
0076     return nullptr;
0077 }
0078 
0079 Character* Player::characterById(const QString& id) const
0080 {
0081     auto it= std::find_if(m_characters.begin(), m_characters.end(),
0082                           [id](const std::unique_ptr<Character>& character) { return character->uuid() == id; });
0083     if(it == m_characters.end())
0084         return nullptr;
0085     return it->get();
0086 }
0087 
0088 int Player::indexOf(Character* character) const
0089 {
0090     auto it= std::find_if(m_characters.begin(), m_characters.end(),
0091                           [character](const std::unique_ptr<Character>& data) { return character == data.get(); });
0092 
0093     if(it == m_characters.end())
0094         return -1;
0095     else
0096         return static_cast<int>(std::distance(m_characters.begin(), it));
0097 }
0098 
0099 bool Player::isGM() const
0100 {
0101     return m_gameMaster;
0102 }
0103 
0104 void Player::setGM(bool value)
0105 {
0106     if(value == m_gameMaster)
0107         return;
0108     m_gameMaster= value;
0109     emit gmChanged();
0110 }
0111 
0112 void Player::addCharacter(const QString& uuid, const QString& name, const QColor& color, const QByteArray& data,
0113                           const QHash<QString, QVariant>& params, bool Npc)
0114 {
0115     if(containsCharacter(name, color, data, m_characters))
0116         return;
0117 
0118     using std::placeholders::_1;
0119 
0120     auto character= new Character(uuid, name, color, m_gameMaster, Npc);
0121     helper::utils::setParamIfAny<int>(Core::updater::key_char_property_hp, params,
0122                                       std::bind(&Character::setHealthPointsCurrent, character, _1));
0123     helper::utils::setParamIfAny<int>(Core::updater::key_char_property_maxhp, params,
0124                                       std::bind(&Character::setHealthPointsMax, character, _1));
0125     helper::utils::setParamIfAny<int>(Core::updater::key_char_property_minhp, params,
0126                                       std::bind(&Character::setHealthPointsMin, character, _1));
0127     helper::utils::setParamIfAny<int>(Core::updater::key_char_property_dist, params,
0128                                       std::bind(&Character::setDistancePerTurn, character, _1));
0129     helper::utils::setParamIfAny<QString>(Core::updater::key_char_property_state_id, params,
0130                                           std::bind(&Character::setStateId, character, _1));
0131     helper::utils::setParamIfAny<QColor>(Core::updater::key_char_property_life_color, params,
0132                                          std::bind(&Character::setLifeColor, character, _1));
0133     helper::utils::setParamIfAny<bool>(Core::updater::key_char_property_has_init, params,
0134                                        std::bind(&Character::setHasInitiative, character, _1));
0135     helper::utils::setParamIfAny<QString>(Core::updater::key_char_property_init_cmd, params,
0136                                           std::bind(&Character::setInitCommand, character, _1));
0137     helper::utils::setParamIfAny<int>(Core::updater::key_char_property_init_score, params,
0138                                       std::bind(&Character::setInitiativeScore, character, _1));
0139 
0140     character->setAvatar(data);
0141     addCharacter(character);
0142 }
0143 
0144 void Player::addCharacter(Character* character)
0145 {
0146     if(!character || containsPointer(character, m_characters))
0147         return;
0148 
0149     std::unique_ptr<Character> data(character);
0150 
0151     connect(data.get(), &Character::nameChanged, this, &Player::characterChanged);
0152     connect(data.get(), &Character::colorChanged, this, &Player::characterChanged);
0153     connect(data.get(), &Character::avatarChanged, this, &Player::characterChanged);
0154     connect(data.get(), &Character::currentHealthPointsChanged, this, &Player::characterChanged);
0155     connect(data.get(), &Character::maxHPChanged, this, &Player::characterChanged);
0156     connect(data.get(), &Character::minHPChanged, this, &Player::characterChanged);
0157     connect(data.get(), &Character::distancePerTurnChanged, this, &Player::characterChanged);
0158     connect(data.get(), &Character::hasInitScoreChanged, this, &Player::characterChanged);
0159     connect(data.get(), &Character::lifeColorChanged, this, &Player::characterChanged);
0160     connect(data.get(), &Character::initiativeChanged, this, &Player::characterChanged);
0161     connect(data.get(), &Character::stateIdChanged, this, &Player::characterChanged);
0162     connect(data.get(), &Character::initCommandChanged, this, &Player::characterChanged);
0163 
0164     data->setParentPerson(this);
0165     m_characters.push_back(std::move(data));
0166 }
0167 
0168 void Player::clearCharacterList()
0169 {
0170     for(auto& character : m_characters)
0171     {
0172         character->setParentPerson(nullptr);
0173     }
0174     m_characters.clear();
0175     emit characterCountChanged();
0176 }
0177 
0178 bool Player::removeChild(Character* character)
0179 {
0180     if(nullptr == character)
0181         return false;
0182     auto id= character->uuid();
0183     auto size= m_characters.size();
0184     m_characters.erase(std::remove_if(m_characters.begin(), m_characters.end(),
0185                                       [id](const std::unique_ptr<Character>& tmp) { return tmp->uuid() == id; }));
0186 
0187     if(size != m_characters.size())
0188     {
0189         emit characterCountChanged();
0190         return true;
0191     }
0192     else
0193         return false;
0194 }
0195 
0196 QHash<QString, QString> Player::getVariableDictionnary()
0197 {
0198     return QHash<QString, QString>();
0199 }
0200 
0201 bool Player::isLeaf() const
0202 {
0203     return false;
0204 }
0205 
0206 QString Player::userVersion() const
0207 {
0208     return m_softVersion;
0209 }
0210 
0211 void Player::setUserVersion(QString softV)
0212 {
0213     m_softVersion= softV;
0214 }
0215 void Player::copyPlayer(Player* player)
0216 {
0217     setAvatar(player->avatar());
0218     setColor(player->getColor());
0219     setGM(player->isGM());
0220     setName(player->name());
0221     setUserVersion(player->userVersion());
0222 }
0223 
0224 bool Player::isFullyDefined()
0225 {
0226     if(m_uuid.isEmpty())
0227         return false;
0228     if(m_name.isEmpty())
0229         return false;
0230 
0231     return true;
0232 }