QString FGame::cachedImage(int size, FGameSizeConstrain fsc, FGameArt imgType ) { QString fscI; if(fsc == FWidth) fscI = "w_"; else fscI = "h_"; QString fName(QString::number(dbId) + "_" + FGameArtToStr(imgType) + "_" + fscI + QString::number(size) + ".png"); QString dir = getCacheDir(); QString cached = dir + "/" + fName; if(QFile(cached).exists()) return cached; else { QString unCached = getArt(imgType); if(unCached == "") return unCached; QPixmap p(unCached); if(fsc == FWidth) p= p.scaledToWidth(size, Qt::SmoothTransformation); else p = p.scaledToHeight(size, Qt::SmoothTransformation); QFile file(cached); file.open(QIODevice::WriteOnly); p.save(&file, "png", 90); file.close(); qDebug() << "Resized " << cached; return cached; } }
si32 CArtifactSet::getArtTypeId(ArtifactPosition pos) const { const CArtifactInstance * const a = getArt(pos); if(!a) { logGlobal->warnStream() << (dynamic_cast<const CGHeroInstance*>(this))->name << " has no artifact at " << pos << " (getArtTypeId)"; return -1; } return a->artType->id; }
void CGHeroInstance::initArmy(IArmyDescriptor *dst /*= nullptr*/) { if(!dst) dst = this; int howManyStacks = 0; //how many stacks will hero receives <1 - 3> int pom = cb->gameState()->getRandomGenerator().nextInt(99); int warMachinesGiven = 0; if(pom < 9) howManyStacks = 1; else if(pom < 79) howManyStacks = 2; else howManyStacks = 3; vstd::amin(howManyStacks, type->initialArmy.size()); for(int stackNo=0; stackNo < howManyStacks; stackNo++) { auto & stack = type->initialArmy[stackNo]; int count = cb->gameState()->getRandomGenerator().nextInt(stack.minAmount, stack.maxAmount); if(stack.creature >= CreatureID::CATAPULT && stack.creature <= CreatureID::ARROW_TOWERS) //war machine { warMachinesGiven++; if(dst != this) continue; int slot = -1; ArtifactID aid = ArtifactID::NONE; switch (stack.creature) { case CreatureID::CATAPULT: slot = ArtifactPosition::MACH4; aid = ArtifactID::CATAPULT; break; default: aid = CArtHandler::creatureToMachineID(stack.creature); slot = 9 + aid; break; } auto convSlot = ArtifactPosition(slot); if(!getArt(convSlot)) putArtifact(convSlot, CArtifactInstance::createNewArtifactInstance(aid)); else logGlobal->warnStream() << "Hero " << name << " already has artifact at " << slot << ", omitting giving " << aid; } else dst->setCreature(SlotID(stackNo-warMachinesGiven), stack.creature, count); } }
bool CGHeroInstance::canCastThisSpell(const CSpell * spell) const { return spell->isCastableBy(this, nullptr !=getArt(ArtifactPosition::SPELLBOOK), spells); }
void CGHeroInstance::initHero() { assert(validTypes(true)); if(!type) type = VLC->heroh->heroes[subID]; if (ID == Obj::HERO) appearance = VLC->objtypeh->getHandlerFor(Obj::HERO, type->heroClass->id)->getTemplates().front(); if(!vstd::contains(spells, SpellID::PRESET)) //hero starts with a spell { for(auto spellID : type->spells) spells.insert(spellID); } else //remove placeholder spells -= SpellID::PRESET; if(!getArt(ArtifactPosition::MACH4) && !getArt(ArtifactPosition::SPELLBOOK) && type->haveSpellBook) //no catapult means we haven't read pre-existent set -> use default rules for spellbook putArtifact(ArtifactPosition::SPELLBOOK, CArtifactInstance::createNewArtifactInstance(0)); if(!getArt(ArtifactPosition::MACH4)) putArtifact(ArtifactPosition::MACH4, CArtifactInstance::createNewArtifactInstance(3)); //everyone has a catapult if(portrait < 0 || portrait == 255) portrait = type->imageIndex; if(!hasBonus(Selector::sourceType(Bonus::HERO_BASE_SKILL))) { for(int g=0; g<GameConstants::PRIMARY_SKILLS; ++g) { pushPrimSkill(static_cast<PrimarySkill::PrimarySkill>(g), type->heroClass->primarySkillInitial[g]); } } if(secSkills.size() == 1 && secSkills[0] == std::pair<SecondarySkill,ui8>(SecondarySkill::DEFAULT, -1)) //set secondary skills to default secSkills = type->secSkillsInit; if (!name.length()) name = type->name; if (sex == 0xFF)//sex is default sex = type->sex; setFormation(false); if (!stacksCount()) //standard army//initial army { initArmy(); } assert(validTypes()); level = 1; if(exp == 0xffffffff) { initExp(); } else { levelUpAutomatically(); } if (VLC->modh->modules.COMMANDERS && !commander) { commander = new CCommanderInstance(type->heroClass->commander->idNumber); commander->setArmyObj (castToArmyObj()); //TODO: separate function for setting commanders commander->giveStackExp (exp); //after our exp is set } if (mana < 0) mana = manaLimit(); }
bool CGHeroInstance::hasSpellbook() const { return getArt(ArtifactPosition::SPELLBOOK); }
void CGHeroInstance::putArtifact(ArtifactPosition pos, CArtifactInstance *art) { assert(!getArt(pos)); art->putAt(ArtifactLocation(this, pos)); }