/* * The ManaPlus Client * Copyright (C) 2004-2009 The Mana World Development Team * Copyright (C) 2009-2010 The Mana Developers * Copyright (C) 2011-2020 The ManaPlus Developers * Copyright (C) 2020-2023 The ManaVerse Developers * * This file is part of The ManaPlus Client. * * 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 2 of the License, or * 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 "resources/skill/skillinfo.h" #include "being/playerinfo.h" #include "gui/models/skillmodel.h" #include "utils/foreach.h" #include "utils/stringutils.h" #include "resources/skill/skilldata.h" #include "resources/skill/skilltypelist.h" #include "debug.h" SkillInfo::SkillInfo() : skillLevel(), skillEffect(), useButton(), errorText(), castingAction(), castingRideAction(), castingSkyAction(), castingWaterAction(), dataMap(), model(nullptr), tab(nullptr), data(nullptr), level(0), customSelectedLevel(0), customOffsetX(0), customOffsetY(0), skillLevelWidth(0), id(0), range(0), sp(0), duration(0), durationTime(0), cooldown(0), x(0), y(0), type(SkillType::Unknown), owner(SkillOwner::Player), customCastType(CastType::Default), modifiable(Modifiable_false), visible(Visible_false), alwaysVisible(Visible_false), useTextParameter(false) { dataMap[0] = new SkillData; data = dataMap[0]; } SkillInfo::~SkillInfo() { FOR_EACH (SkillDataMapIter, it, dataMap) delete (*it).second; dataMap.clear(); } void SkillInfo::update() { const int baseLevel = PlayerInfo::getSkillLevel(id); if (modifiable == Modifiable_false && baseLevel == 0) { if (visible == Visible_true) { visible = Visible_false; if (model != nullptr) model->updateVisibilities(); } return; } const bool updateVisibility = (visible == Visible_false); visible = Visible_true; if (baseLevel == 0) { skillLevel.clear(); } else { if (customSelectedLevel == 0) { // TRANSLATORS: skill level skillLevel = strprintf(_("Lvl: %d"), baseLevel); } else { // TRANSLATORS: skill level skillLevel = strprintf(_("Lvl: %d / %d"), customSelectedLevel, baseLevel); } } // TRANSLATORS: skill type const char *const typeStr = _("Type: %s"); if (type == SkillType::Unknown) { // TRANSLATORS: Skill type skillEffect = strprintf(typeStr, _("Unknown")); } else { skillEffect.clear(); for (size_t f = 0; f < skillTypeListSize; f ++) { const SkillTypeEntry &item = skillTypeList[f]; if ((item.type & type) != 0) { if (!skillEffect.empty()) skillEffect.append(", "); skillEffect.append(strprintf(typeStr, item.name)); } } } if (skillEffect.empty()) { // TRANSLATORS: Skill type skillEffect = strprintf(typeStr, _("Unknown:")); skillEffect.append(" ").append(toString(CAST_S32(type))); } if (sp != 0) { // TRANSLATORS: skill mana skillEffect.append(strprintf(_(" / Mana: -%d"), sp)); } if (range > 0) { if (!skillEffect.empty()) skillEffect.append(" / "); // TRANSLATORS: skill range skillEffect.append(strprintf(_("Range: %d"), range)); } level = baseLevel; if (customSelectedLevel > level) customSelectedLevel = level; skillLevelWidth = -1; if (updateVisibility && (model != nullptr)) model->updateVisibilities(); data = getData(level); if (data == nullptr) data = dataMap[0]; } void SkillInfo::addData(const int level1, SkillData *const data1) { dataMap[level1] = data1; } SkillData *SkillInfo::getData(const int level1) const { const SkillDataMapCIter it = dataMap.find(level1); if (it == dataMap.end()) return nullptr; return (*it).second; } SkillData *SkillInfo::getData1(const int lev) const { const SkillDataMapCIter it = dataMap.find(lev); if (it == dataMap.end()) return (*dataMap.begin()).second; return (*it).second; } std::string SkillInfo::toDataStr() const { return strprintf("%d %d %d", CAST_S32(customCastType), customOffsetX, customOffsetY); }