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 }