1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-24 22:14:36 +02:00

Always use ResourcePath for referencing images and animations

This commit is contained in:
Ivan Savenko 2023-08-23 15:07:50 +03:00
parent f79492e5b0
commit 823ffa7a07
201 changed files with 1390 additions and 1362 deletions

View File

@ -68,7 +68,7 @@ PriorityEvaluator::~PriorityEvaluator()
void PriorityEvaluator::initVisitTile() void PriorityEvaluator::initVisitTile()
{ {
auto file = CResourceHandler::get()->load(ResourceID("config/ai/object-priorities.txt"))->readAll(); auto file = CResourceHandler::get()->load(ResourcePath("config/ai/object-priorities.txt"))->readAll();
std::string str = std::string((char *)file.first.get(), file.second); std::string str = std::string((char *)file.first.get(), file.second);
engine = fl::FllImporter().fromString(str); engine = fl::FllImporter().fromString(str);
armyLossPersentageVariable = engine->getInputVariable("armyLoss"); armyLossPersentageVariable = engine->getInputVariable("armyLoss");

View File

@ -251,7 +251,7 @@ int main(int argc, char * argv[])
// Some basic data validation to produce better error messages in cases of incorrect install // Some basic data validation to produce better error messages in cases of incorrect install
auto testFile = [](std::string filename, std::string message) auto testFile = [](std::string filename, std::string message)
{ {
if (!CResourceHandler::get()->existsResource(ResourceID(filename))) if (!CResourceHandler::get()->existsResource(ResourcePath(filename)))
handleFatalError(message, false); handleFatalError(message, false);
}; };

View File

@ -75,7 +75,7 @@ void CSoundHandler::onVolumeChange(const JsonNode &volumeNode)
CSoundHandler::CSoundHandler(): CSoundHandler::CSoundHandler():
listener(settings.listen["general"]["sound"]), listener(settings.listen["general"]["sound"]),
ambientConfig(JsonNode(ResourceID("config/ambientSounds.json"))) ambientConfig(JsonNode(ResourcePath("config/ambientSounds.json")))
{ {
listener(std::bind(&CSoundHandler::onVolumeChange, this, _1)); listener(std::bind(&CSoundHandler::onVolumeChange, this, _1));
@ -126,7 +126,7 @@ Mix_Chunk *CSoundHandler::GetSoundChunk(std::string &sound, bool cache)
if (cache && soundChunks.find(sound) != soundChunks.end()) if (cache && soundChunks.find(sound) != soundChunks.end())
return soundChunks[sound].first; return soundChunks[sound].first;
auto data = CResourceHandler::get()->load(ResourceID(std::string("SOUNDS/") + sound, EResType::SOUND))->readAll(); auto data = CResourceHandler::get()->load(ResourcePath(std::string("SOUNDS/") + sound, EResType::SOUND))->readAll();
SDL_RWops *ops = SDL_RWFromMem(data.first.get(), (int)data.second); SDL_RWops *ops = SDL_RWFromMem(data.first.get(), (int)data.second);
Mix_Chunk *chunk = Mix_LoadWAV_RW(ops, 1); // will free ops Mix_Chunk *chunk = Mix_LoadWAV_RW(ops, 1); // will free ops
@ -357,7 +357,7 @@ CMusicHandler::CMusicHandler():
{ {
listener(std::bind(&CMusicHandler::onVolumeChange, this, _1)); listener(std::bind(&CMusicHandler::onVolumeChange, this, _1));
auto mp3files = CResourceHandler::get()->getFilteredFiles([](const ResourceID & id) -> bool auto mp3files = CResourceHandler::get()->getFilteredFiles([](const ResourcePath & id) -> bool
{ {
if(id.getType() != EResType::SOUND) if(id.getType() != EResType::SOUND)
return false; return false;
@ -369,7 +369,7 @@ CMusicHandler::CMusicHandler():
return true; return true;
}); });
for(const ResourceID & file : mp3files) for(const ResourcePath & file : mp3files)
{ {
if(boost::algorithm::istarts_with(file.getName(), "MUSIC/Combat")) if(boost::algorithm::istarts_with(file.getName(), "MUSIC/Combat"))
addEntryToSet("battle", file.getName()); addEntryToSet("battle", file.getName());
@ -573,7 +573,7 @@ void MusicEntry::load(std::string musicURI)
try try
{ {
auto musicFile = MakeSDLRWops(CResourceHandler::get()->load(ResourceID(std::move(musicURI), EResType::SOUND))); auto musicFile = MakeSDLRWops(CResourceHandler::get()->load(ResourcePath(std::move(musicURI), EResType::SOUND)));
music = Mix_LoadMUS_RW(musicFile, SDL_TRUE); music = Mix_LoadMUS_RW(musicFile, SDL_TRUE);
} }
catch(std::exception &e) catch(std::exception &e)

View File

@ -1112,11 +1112,11 @@ void CPlayerInterface::showBlockingDialog( const std::string &text, const std::v
for (auto & component : components) for (auto & component : components)
intComps.push_back(std::make_shared<CSelectableComponent>(component)); //will be deleted by CSelWindow::close intComps.push_back(std::make_shared<CSelectableComponent>(component)); //will be deleted by CSelWindow::close
std::vector<std::pair<std::string,CFunctionList<void()> > > pom; std::vector<std::pair<AnimationPath,CFunctionList<void()> > > pom;
pom.push_back(std::pair<std::string,CFunctionList<void()> >("IOKAY.DEF",0)); pom.push_back({ AnimationPath::builtin("IOKAY.DEF"),0});
if (cancel) if (cancel)
{ {
pom.push_back(std::pair<std::string,CFunctionList<void()> >("ICANCEL.DEF",0)); pom.push_back({AnimationPath::builtin("ICANCEL.DEF"),0});
} }
int charperline = 35; int charperline = 35;

View File

@ -748,7 +748,7 @@ void CServerHandler::debugStartTest(std::string filename, bool save)
if(save) if(save)
{ {
resetStateForLobby(StartInfo::LOAD_GAME); resetStateForLobby(StartInfo::LOAD_GAME);
mapInfo->saveInit(ResourceID(filename, EResType::SAVEGAME)); mapInfo->saveInit(ResourcePath(filename, EResType::SAVEGAME));
screenType = ESelectionScreen::loadGame; screenType = ESelectionScreen::loadGame;
} }
else else

View File

@ -85,7 +85,7 @@ bool CVideoPlayer::open(std::string fname, bool loop, bool useOverlay, bool scal
doLoop = loop; doLoop = loop;
frameTime = 0; frameTime = 0;
ResourceID resource(std::string("Video/") + fname, EResType::VIDEO); ResourcePath resource(std::string("Video/") + fname, EResType::VIDEO);
if (!CResourceHandler::get()->existsResource(resource)) if (!CResourceHandler::get()->existsResource(resource))
{ {

View File

@ -222,7 +222,7 @@ void CClient::loadGame(CGameState * initializedGameState)
// try to deserialize client data including sleepingHeroes // try to deserialize client data including sleepingHeroes
try try
{ {
boost::filesystem::path clientSaveName = *CResourceHandler::get()->getResourceName(ResourceID(CSH->si->mapname, EResType::CLIENT_SAVEGAME)); boost::filesystem::path clientSaveName = *CResourceHandler::get()->getResourceName(ResourcePath(CSH->si->mapname, EResType::CLIENT_SAVEGAME));
if(clientSaveName.empty()) if(clientSaveName.empty())
throw std::runtime_error("Cannot open client part of " + CSH->si->mapname); throw std::runtime_error("Cannot open client part of " + CSH->si->mapname);

View File

@ -182,12 +182,12 @@ void ClientCommandManager::handleNotDialogCommand()
void ClientCommandManager::handleConvertTextCommand() void ClientCommandManager::handleConvertTextCommand()
{ {
logGlobal->info("Searching for available maps"); logGlobal->info("Searching for available maps");
std::unordered_set<ResourceID> mapList = CResourceHandler::get()->getFilteredFiles([&](const ResourceID & ident) std::unordered_set<ResourcePath> mapList = CResourceHandler::get()->getFilteredFiles([&](const ResourcePath & ident)
{ {
return ident.getType() == EResType::MAP; return ident.getType() == EResType::MAP;
}); });
std::unordered_set<ResourceID> campaignList = CResourceHandler::get()->getFilteredFiles([&](const ResourceID & ident) std::unordered_set<ResourcePath> campaignList = CResourceHandler::get()->getFilteredFiles([&](const ResourcePath & ident)
{ {
return ident.getType() == EResType::CAMPAIGN; return ident.getType() == EResType::CAMPAIGN;
}); });
@ -292,7 +292,7 @@ void ClientCommandManager::handleGetTextCommand()
VCMIDirs::get().userExtractedPath(); VCMIDirs::get().userExtractedPath();
auto list = auto list =
CResourceHandler::get()->getFilteredFiles([](const ResourceID & ident) CResourceHandler::get()->getFilteredFiles([](const ResourcePath & ident)
{ {
return ident.getType() == EResType::TEXT && boost::algorithm::starts_with(ident.getName(), "DATA/"); return ident.getType() == EResType::TEXT && boost::algorithm::starts_with(ident.getName(), "DATA/");
}); });
@ -317,7 +317,7 @@ void ClientCommandManager::handleDef2bmpCommand(std::istringstream& singleWordBu
{ {
std::string URI; std::string URI;
singleWordBuffer >> URI; singleWordBuffer >> URI;
std::unique_ptr<CAnimation> anim = std::make_unique<CAnimation>(URI); std::unique_ptr<CAnimation> anim = std::make_unique<CAnimation>(AnimationPath::builtin(URI));
anim->preload(); anim->preload();
anim->exportBitmaps(VCMIDirs::get().userExtractedPath()); anim->exportBitmaps(VCMIDirs::get().userExtractedPath());
} }
@ -327,11 +327,11 @@ void ClientCommandManager::handleExtractCommand(std::istringstream& singleWordBu
std::string URI; std::string URI;
singleWordBuffer >> URI; singleWordBuffer >> URI;
if(CResourceHandler::get()->existsResource(ResourceID(URI))) if(CResourceHandler::get()->existsResource(ResourcePath(URI)))
{ {
const boost::filesystem::path outPath = VCMIDirs::get().userExtractedPath() / URI; const boost::filesystem::path outPath = VCMIDirs::get().userExtractedPath() / URI;
auto data = CResourceHandler::get()->load(ResourceID(URI))->readAll(); auto data = CResourceHandler::get()->load(ResourcePath(URI))->readAll();
boost::filesystem::create_directories(outPath.parent_path()); boost::filesystem::create_directories(outPath.parent_path());
std::ofstream outFile(outPath.c_str(), std::ofstream::binary); std::ofstream outFile(outPath.c_str(), std::ofstream::binary);

View File

@ -30,7 +30,7 @@
#include "../PlayerLocalState.h" #include "../PlayerLocalState.h"
#include "../../lib/constants/StringConstants.h" #include "../../lib/constants/StringConstants.h"
#include "../../lib/filesystem/ResourceID.h" #include "../../lib/filesystem/ResourcePath.h"
AdventureMapWidget::AdventureMapWidget( std::shared_ptr<AdventureMapShortcuts> shortcuts ) AdventureMapWidget::AdventureMapWidget( std::shared_ptr<AdventureMapShortcuts> shortcuts )
: shortcuts(shortcuts) : shortcuts(shortcuts)
@ -56,11 +56,11 @@ AdventureMapWidget::AdventureMapWidget( std::shared_ptr<AdventureMapShortcuts> s
for (const auto & entry : shortcuts->getShortcuts()) for (const auto & entry : shortcuts->getShortcuts())
addShortcut(entry.shortcut, entry.callback); addShortcut(entry.shortcut, entry.callback);
const JsonNode config(ResourceID("config/widgets/adventureMap.json")); const JsonNode config(ResourcePath("config/widgets/adventureMap.json"));
for(const auto & entry : config["options"]["imagesPlayerColored"].Vector()) for(const auto & entry : config["options"]["imagesPlayerColored"].Vector())
{ {
ResourceID resourceName(entry.String(), EResType::IMAGE); ResourcePath resourceName(entry.String(), EResType::IMAGE);
playerColorerImages.push_back(resourceName.getName()); playerColorerImages.push_back(resourceName.getName());
} }
@ -127,22 +127,22 @@ Rect AdventureMapWidget::readArea(const JsonNode & source, const Rect & bounding
return Rect(topLeft + boundingBox.topLeft(), dimensions); return Rect(topLeft + boundingBox.topLeft(), dimensions);
} }
std::shared_ptr<IImage> AdventureMapWidget::loadImage(const std::string & name) std::shared_ptr<IImage> AdventureMapWidget::loadImage(const JsonNode & name)
{ {
ResourceID resource(name, EResType::IMAGE); ImagePath resource = ImagePath::fromJson(name);
if(images.count(resource.getName()) == 0) if(images.count(resource.getName()) == 0)
images[resource.getName()] = IImage::createFromFile(resource.getName()); images[resource.getName()] = IImage::createFromFile(resource);
return images[resource.getName()]; return images[resource.getName()];
} }
std::shared_ptr<CAnimation> AdventureMapWidget::loadAnimation(const std::string & name) std::shared_ptr<CAnimation> AdventureMapWidget::loadAnimation(const JsonNode & name)
{ {
ResourceID resource(name, EResType::ANIMATION); AnimationPath resource = AnimationPath::fromJson(name);
if(animations.count(resource.getName()) == 0) if(animations.count(resource.getName()) == 0)
animations[resource.getName()] = std::make_shared<CAnimation>(resource.getName()); animations[resource.getName()] = std::make_shared<CAnimation>(resource);
return animations[resource.getName()]; return animations[resource.getName()];
} }
@ -158,15 +158,14 @@ std::shared_ptr<CIntObject> AdventureMapWidget::buildMapImage(const JsonNode & i
{ {
Rect targetArea = readTargetArea(input["area"]); Rect targetArea = readTargetArea(input["area"]);
Rect sourceArea = readSourceArea(input["sourceArea"], input["area"]); Rect sourceArea = readSourceArea(input["sourceArea"], input["area"]);
std::string image = input["image"].String();
return std::make_shared<CFilledTexture>(loadImage(image), targetArea, sourceArea); return std::make_shared<CFilledTexture>(loadImage(input["image"]), targetArea, sourceArea);
} }
std::shared_ptr<CIntObject> AdventureMapWidget::buildMapButton(const JsonNode & input) std::shared_ptr<CIntObject> AdventureMapWidget::buildMapButton(const JsonNode & input)
{ {
auto position = readTargetArea(input["area"]); auto position = readTargetArea(input["area"]);
auto image = input["image"].String(); auto image = AnimationPath::fromJson(input["image"]);
auto help = readHintText(input["help"]); auto help = readHintText(input["help"]);
bool playerColored = input["playerColored"].Bool(); bool playerColored = input["playerColored"].Bool();
@ -259,9 +258,8 @@ std::shared_ptr<CIntObject> AdventureMapWidget::buildMapIcon(const JsonNode & in
Rect area = readTargetArea(input["area"]); Rect area = readTargetArea(input["area"]);
size_t index = input["index"].Integer(); size_t index = input["index"].Integer();
size_t perPlayer = input["perPlayer"].Integer(); size_t perPlayer = input["perPlayer"].Integer();
std::string image = input["image"].String();
return std::make_shared<CAdventureMapIcon>(area.topLeft(), loadAnimation(image), index, perPlayer); return std::make_shared<CAdventureMapIcon>(area.topLeft(), loadAnimation(input["image"]), index, perPlayer);
} }
std::shared_ptr<CIntObject> AdventureMapWidget::buildMapTownList(const JsonNode & input) std::shared_ptr<CIntObject> AdventureMapWidget::buildMapTownList(const JsonNode & input)
@ -298,7 +296,7 @@ std::shared_ptr<CIntObject> AdventureMapWidget::buildMinimap(const JsonNode & in
std::shared_ptr<CIntObject> AdventureMapWidget::buildResourceDateBar(const JsonNode & input) std::shared_ptr<CIntObject> AdventureMapWidget::buildResourceDateBar(const JsonNode & input)
{ {
Rect area = readTargetArea(input["area"]); Rect area = readTargetArea(input["area"]);
std::string image = input["image"].String(); auto image = ImagePath::fromJson(input["image"]);
auto result = std::make_shared<CResDataBar>(image, area.topLeft()); auto result = std::make_shared<CResDataBar>(image, area.topLeft());
@ -320,7 +318,7 @@ std::shared_ptr<CIntObject> AdventureMapWidget::buildResourceDateBar(const JsonN
std::shared_ptr<CIntObject> AdventureMapWidget::buildStatusBar(const JsonNode & input) std::shared_ptr<CIntObject> AdventureMapWidget::buildStatusBar(const JsonNode & input)
{ {
Rect area = readTargetArea(input["area"]); Rect area = readTargetArea(input["area"]);
std::string image = input["image"].String(); auto image = ImagePath::fromJson(input["image"]);
auto background = std::make_shared<CFilledTexture>(image, area); auto background = std::make_shared<CFilledTexture>(image, area);
@ -330,7 +328,7 @@ std::shared_ptr<CIntObject> AdventureMapWidget::buildStatusBar(const JsonNode &
std::shared_ptr<CIntObject> AdventureMapWidget::buildTexturePlayerColored(const JsonNode & input) std::shared_ptr<CIntObject> AdventureMapWidget::buildTexturePlayerColored(const JsonNode & input)
{ {
logGlobal->debug("Building widget CFilledTexture"); logGlobal->debug("Building widget CFilledTexture");
auto image = input["image"].String(); auto image = ImagePath::fromJson(input["image"]);
Rect area = readTargetArea(input["area"]); Rect area = readTargetArea(input["area"]);
return std::make_shared<FilledTexturePlayerColored>(image, area); return std::make_shared<FilledTexturePlayerColored>(image, area);
} }

View File

@ -48,8 +48,8 @@ class AdventureMapWidget : public InterfaceObjectConfigurable
Rect readSourceArea(const JsonNode & source, const JsonNode & sourceCommon); Rect readSourceArea(const JsonNode & source, const JsonNode & sourceCommon);
Rect readArea(const JsonNode & source, const Rect & boundingBox); Rect readArea(const JsonNode & source, const Rect & boundingBox);
std::shared_ptr<IImage> loadImage(const std::string & name); std::shared_ptr<IImage> loadImage(const JsonNode & name);
std::shared_ptr<CAnimation> loadAnimation(const std::string & name); std::shared_ptr<CAnimation> loadAnimation(const JsonNode & name);
std::shared_ptr<CIntObject> buildInfobox(const JsonNode & input); std::shared_ptr<CIntObject> buildInfobox(const JsonNode & input);
std::shared_ptr<CIntObject> buildMapImage(const JsonNode & input); std::shared_ptr<CIntObject> buildMapImage(const JsonNode & input);

View File

@ -25,22 +25,22 @@
#include "../../lib/StartInfo.h" #include "../../lib/StartInfo.h"
AdventureOptions::AdventureOptions() AdventureOptions::AdventureOptions()
: CWindowObject(PLAYER_COLORED, "ADVOPTS") : CWindowObject(PLAYER_COLORED, ImagePath::builtin("ADVOPTS"))
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
viewWorld = std::make_shared<CButton>(Point(24, 23), "ADVVIEW.DEF", CButton::tooltip(), [&](){ close(); }, EShortcut::ADVENTURE_VIEW_WORLD); viewWorld = std::make_shared<CButton>(Point(24, 23), AnimationPath::builtin("ADVVIEW.DEF"), CButton::tooltip(), [&](){ close(); }, EShortcut::ADVENTURE_VIEW_WORLD);
viewWorld->addCallback( [] { LOCPLINT->viewWorldMap(); }); viewWorld->addCallback( [] { LOCPLINT->viewWorldMap(); });
exit = std::make_shared<CButton>(Point(204, 313), "IOK6432.DEF", CButton::tooltip(), std::bind(&AdventureOptions::close, this), EShortcut::GLOBAL_RETURN); exit = std::make_shared<CButton>(Point(204, 313), AnimationPath::builtin("IOK6432.DEF"), CButton::tooltip(), std::bind(&AdventureOptions::close, this), EShortcut::GLOBAL_RETURN);
scenInfo = std::make_shared<CButton>(Point(24, 198), "ADVINFO.DEF", CButton::tooltip(), [&](){ close(); }, EShortcut::ADVENTURE_VIEW_SCENARIO); scenInfo = std::make_shared<CButton>(Point(24, 198), AnimationPath::builtin("ADVINFO.DEF"), CButton::tooltip(), [&](){ close(); }, EShortcut::ADVENTURE_VIEW_SCENARIO);
scenInfo->addCallback(AdventureOptions::showScenarioInfo); scenInfo->addCallback(AdventureOptions::showScenarioInfo);
puzzle = std::make_shared<CButton>(Point(24, 81), "ADVPUZ.DEF", CButton::tooltip(), [&](){ close(); }, EShortcut::ADVENTURE_VIEW_PUZZLE); puzzle = std::make_shared<CButton>(Point(24, 81), AnimationPath::builtin("ADVPUZ.DEF"), CButton::tooltip(), [&](){ close(); }, EShortcut::ADVENTURE_VIEW_PUZZLE);
puzzle->addCallback(std::bind(&CPlayerInterface::showPuzzleMap, LOCPLINT)); puzzle->addCallback(std::bind(&CPlayerInterface::showPuzzleMap, LOCPLINT));
dig = std::make_shared<CButton>(Point(24, 139), "ADVDIG.DEF", CButton::tooltip(), [&](){ close(); }, EShortcut::ADVENTURE_DIG_GRAIL); dig = std::make_shared<CButton>(Point(24, 139), AnimationPath::builtin("ADVDIG.DEF"), CButton::tooltip(), [&](){ close(); }, EShortcut::ADVENTURE_DIG_GRAIL);
if(const CGHeroInstance *h = LOCPLINT->localState->getCurrentHero()) if(const CGHeroInstance *h = LOCPLINT->localState->getCurrentHero())
dig->addCallback(std::bind(&CPlayerInterface::tryDigging, LOCPLINT, h)); dig->addCallback(std::bind(&CPlayerInterface::tryDigging, LOCPLINT, h));
else else

View File

@ -51,7 +51,7 @@ CInfoBar::EmptyVisibleInfo::EmptyVisibleInfo()
CInfoBar::VisibleHeroInfo::VisibleHeroInfo(const CGHeroInstance * hero) CInfoBar::VisibleHeroInfo::VisibleHeroInfo(const CGHeroInstance * hero)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
background = std::make_shared<CPicture>("ADSTATHR"); background = std::make_shared<CPicture>(ImagePath::builtin("ADSTATHR"));
if(settings["gameTweaks"]["infoBarCreatureManagement"].Bool()) if(settings["gameTweaks"]["infoBarCreatureManagement"].Bool())
heroTooltip = std::make_shared<CInteractableHeroTooltip>(Point(0,0), hero); heroTooltip = std::make_shared<CInteractableHeroTooltip>(Point(0,0), hero);
@ -62,7 +62,7 @@ CInfoBar::VisibleHeroInfo::VisibleHeroInfo(const CGHeroInstance * hero)
CInfoBar::VisibleTownInfo::VisibleTownInfo(const CGTownInstance * town) CInfoBar::VisibleTownInfo::VisibleTownInfo(const CGTownInstance * town)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
background = std::make_shared<CPicture>("ADSTATCS"); background = std::make_shared<CPicture>(ImagePath::builtin("ADSTATCS"));
if(settings["gameTweaks"]["infoBarCreatureManagement"].Bool()) if(settings["gameTweaks"]["infoBarCreatureManagement"].Bool())
townTooltip = std::make_shared<CInteractableTownTooltip>(Point(0,0), town); townTooltip = std::make_shared<CInteractableTownTooltip>(Point(0,0), town);
@ -88,36 +88,36 @@ CInfoBar::VisibleDateInfo::VisibleDateInfo()
forceRefresh.push_back(label); forceRefresh.push_back(label);
} }
std::string CInfoBar::VisibleDateInfo::getNewDayName() AnimationPath CInfoBar::VisibleDateInfo::getNewDayName()
{ {
if(LOCPLINT->cb->getDate(Date::DAY) == 1) if(LOCPLINT->cb->getDate(Date::DAY) == 1)
return "NEWDAY"; return AnimationPath::builtin("NEWDAY");
if(LOCPLINT->cb->getDate(Date::DAY_OF_WEEK) != 1) if(LOCPLINT->cb->getDate(Date::DAY_OF_WEEK) != 1)
return "NEWDAY"; return AnimationPath("NEWDAY");
switch(LOCPLINT->cb->getDate(Date::WEEK)) switch(LOCPLINT->cb->getDate(Date::WEEK))
{ {
case 1: case 1:
return "NEWWEEK1"; return AnimationPath("NEWWEEK1");
case 2: case 2:
return "NEWWEEK2"; return AnimationPath("NEWWEEK2");
case 3: case 3:
return "NEWWEEK3"; return AnimationPath("NEWWEEK3");
case 4: case 4:
return "NEWWEEK4"; return AnimationPath("NEWWEEK4");
default: default:
return ""; return AnimationPath();
} }
} }
CInfoBar::VisibleEnemyTurnInfo::VisibleEnemyTurnInfo(PlayerColor player) CInfoBar::VisibleEnemyTurnInfo::VisibleEnemyTurnInfo(PlayerColor player)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
background = std::make_shared<CPicture>("ADSTATNX"); background = std::make_shared<CPicture>(ImagePath::builtin("ADSTATNX"));
banner = std::make_shared<CAnimImage>("CREST58", player.getNum(), 0, 20, 51); banner = std::make_shared<CAnimImage>(AnimationPath::builtin("CREST58"), player.getNum(), 0, 20, 51);
sand = std::make_shared<CShowableAnim>(99, 51, "HOURSAND", 0, 100); // H3 uses around 100 ms per frame sand = std::make_shared<CShowableAnim>(99, 51, AnimationPath::builtin("HOURSAND"), 0, 100); // H3 uses around 100 ms per frame
glass = std::make_shared<CShowableAnim>(99, 51, "HOURGLAS", CShowableAnim::PLAY_ONCE, 1000); // H3 scales this nicely for AI turn duration, don't have anything like that in vcmi glass = std::make_shared<CShowableAnim>(99, 51, AnimationPath::builtin("HOURGLAS"), CShowableAnim::PLAY_ONCE, 1000); // H3 scales this nicely for AI turn duration, don't have anything like that in vcmi
} }
CInfoBar::VisibleGameStatusInfo::VisibleGameStatusInfo() CInfoBar::VisibleGameStatusInfo::VisibleGameStatusInfo()
@ -148,14 +148,14 @@ CInfoBar::VisibleGameStatusInfo::VisibleGameStatusInfo()
} }
//generate widgets //generate widgets
background = std::make_shared<CPicture>("ADSTATIN"); background = std::make_shared<CPicture>(ImagePath::builtin("ADSTATIN"));
allyLabel = std::make_shared<CLabel>(10, 106, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->allTexts[390] + ":"); allyLabel = std::make_shared<CLabel>(10, 106, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->allTexts[390] + ":");
enemyLabel = std::make_shared<CLabel>(10, 136, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->allTexts[391] + ":"); enemyLabel = std::make_shared<CLabel>(10, 136, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->allTexts[391] + ":");
int posx = allyLabel->pos.w + allyLabel->pos.x - pos.x + 4; int posx = allyLabel->pos.w + allyLabel->pos.x - pos.x + 4;
for(PlayerColor & player : allies) for(PlayerColor & player : allies)
{ {
auto image = std::make_shared<CAnimImage>("ITGFLAGS", player.getNum(), 0, posx, 102); auto image = std::make_shared<CAnimImage>(AnimationPath::builtin("ITGFLAGS"), player.getNum(), 0, posx, 102);
posx += image->pos.w; posx += image->pos.w;
flags.push_back(image); flags.push_back(image);
} }
@ -163,14 +163,14 @@ CInfoBar::VisibleGameStatusInfo::VisibleGameStatusInfo()
posx = enemyLabel->pos.w + enemyLabel->pos.x - pos.x + 4; posx = enemyLabel->pos.w + enemyLabel->pos.x - pos.x + 4;
for(PlayerColor & player : enemies) for(PlayerColor & player : enemies)
{ {
auto image = std::make_shared<CAnimImage>("ITGFLAGS", player.getNum(), 0, posx, 132); auto image = std::make_shared<CAnimImage>(AnimationPath::builtin("ITGFLAGS"), player.getNum(), 0, posx, 132);
posx += image->pos.w; posx += image->pos.w;
flags.push_back(image); flags.push_back(image);
} }
for(size_t i=0; i<halls.size(); i++) for(size_t i=0; i<halls.size(); i++)
{ {
hallIcons.push_back(std::make_shared<CAnimImage>("itmtl", i, 0, 6 + 42 * (int)i , 11)); hallIcons.push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("itmtl"), i, 0, 6 + 42 * (int)i , 11));
if(halls[i]) if(halls[i])
hallLabels.push_back(std::make_shared<CLabel>( 26 + 42 * (int)i, 64, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, std::to_string(halls[i]))); hallLabels.push_back(std::make_shared<CLabel>( 26 + 42 * (int)i, 64, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, std::to_string(halls[i])));
} }
@ -180,7 +180,7 @@ CInfoBar::VisibleComponentInfo::VisibleComponentInfo(const std::vector<Component
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
background = std::make_shared<CPicture>("ADSTATOT", 1, 0); background = std::make_shared<CPicture>(ImagePath::builtin("ADSTATOT"), 1, 0);
auto fullRect = Rect(CInfoBar::offset, CInfoBar::offset, data_width - 2 * CInfoBar::offset, data_height - 2 * CInfoBar::offset); auto fullRect = Rect(CInfoBar::offset, CInfoBar::offset, data_width - 2 * CInfoBar::offset, data_height - 2 * CInfoBar::offset);
auto textRect = fullRect; auto textRect = fullRect;
auto imageRect = fullRect; auto imageRect = fullRect;

View File

@ -11,6 +11,7 @@
#include "../gui/CIntObject.h" #include "../gui/CIntObject.h"
#include "CConfigHandler.h" #include "CConfigHandler.h"
#include "../../lib/filesystem/ResourcePath.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
@ -86,7 +87,7 @@ private:
std::shared_ptr<CShowableAnim> animation; std::shared_ptr<CShowableAnim> animation;
std::shared_ptr<CLabel> label; std::shared_ptr<CLabel> label;
std::string getNewDayName(); AnimationPath getNewDayName();
public: public:
VisibleDateInfo(); VisibleDateInfo();
}; };

View File

@ -206,9 +206,9 @@ void CList::selectPrev()
CHeroList::CEmptyHeroItem::CEmptyHeroItem() CHeroList::CEmptyHeroItem::CEmptyHeroItem()
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
movement = std::make_shared<CAnimImage>("IMOBIL", 0, 0, 0, 1); movement = std::make_shared<CAnimImage>(AnimationPath::builtin("IMOBIL"), 0, 0, 0, 1);
portrait = std::make_shared<CPicture>("HPSXXX", movement->pos.w + 1, 0); portrait = std::make_shared<CPicture>(ImagePath::builtin("HPSXXX"), movement->pos.w + 1, 0);
mana = std::make_shared<CAnimImage>("IMANA", 0, 0, movement->pos.w + portrait->pos.w + 2, 1 ); mana = std::make_shared<CAnimImage>(AnimationPath::builtin("IMANA"), 0, 0, movement->pos.w + portrait->pos.w + 2, 1 );
pos.w = mana->pos.w + mana->pos.x - pos.x; pos.w = mana->pos.w + mana->pos.x - pos.x;
pos.h = std::max(std::max<int>(movement->pos.h + 1, mana->pos.h + 1), portrait->pos.h); pos.h = std::max(std::max<int>(movement->pos.h + 1, mana->pos.h + 1), portrait->pos.h);
@ -219,9 +219,9 @@ CHeroList::CHeroItem::CHeroItem(CHeroList *parent, const CGHeroInstance * Hero)
hero(Hero) hero(Hero)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
movement = std::make_shared<CAnimImage>("IMOBIL", 0, 0, 0, 1); movement = std::make_shared<CAnimImage>(AnimationPath::builtin("IMOBIL"), 0, 0, 0, 1);
portrait = std::make_shared<CAnimImage>("PortraitsSmall", hero->portrait, 0, movement->pos.w + 1); portrait = std::make_shared<CAnimImage>(AnimationPath::builtin("PortraitsSmall"), hero->portrait, 0, movement->pos.w + 1);
mana = std::make_shared<CAnimImage>("IMANA", 0, 0, movement->pos.w + portrait->pos.w + 2, 1); mana = std::make_shared<CAnimImage>(AnimationPath::builtin("IMANA"), 0, 0, movement->pos.w + portrait->pos.w + 2, 1);
pos.w = mana->pos.w + mana->pos.x - pos.x; pos.w = mana->pos.w + mana->pos.x - pos.x;
pos.h = std::max(std::max<int>(movement->pos.h + 1, mana->pos.h + 1), portrait->pos.h); pos.h = std::max(std::max<int>(movement->pos.h + 1, mana->pos.h + 1), portrait->pos.h);
@ -238,7 +238,7 @@ void CHeroList::CHeroItem::update()
std::shared_ptr<CIntObject> CHeroList::CHeroItem::genSelection() std::shared_ptr<CIntObject> CHeroList::CHeroItem::genSelection()
{ {
return std::make_shared<CPicture>("HPSYYY", movement->pos.w + 1, 0); return std::make_shared<CPicture>(ImagePath::builtin("HPSYYY"), movement->pos.w + 1, 0);
} }
void CHeroList::CHeroItem::select(bool on) void CHeroList::CHeroItem::select(bool on)
@ -319,7 +319,7 @@ std::shared_ptr<CIntObject> CTownList::createItem(size_t index)
{ {
if (LOCPLINT->localState->getOwnedTowns().size() > index) if (LOCPLINT->localState->getOwnedTowns().size() > index)
return std::make_shared<CTownItem>(this, LOCPLINT->localState->getOwnedTown(index)); return std::make_shared<CTownItem>(this, LOCPLINT->localState->getOwnedTown(index));
return std::make_shared<CAnimImage>("ITPA", 0); return std::make_shared<CAnimImage>(AnimationPath::builtin("ITPA"), 0);
} }
CTownList::CTownItem::CTownItem(CTownList *parent, const CGTownInstance *Town): CTownList::CTownItem::CTownItem(CTownList *parent, const CGTownInstance *Town):
@ -327,14 +327,14 @@ CTownList::CTownItem::CTownItem(CTownList *parent, const CGTownInstance *Town):
town(Town) town(Town)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
picture = std::make_shared<CAnimImage>("ITPA", 0); picture = std::make_shared<CAnimImage>(AnimationPath::builtin("ITPA"), 0);
pos = picture->pos; pos = picture->pos;
update(); update();
} }
std::shared_ptr<CIntObject> CTownList::CTownItem::genSelection() std::shared_ptr<CIntObject> CTownList::CTownItem::genSelection()
{ {
return std::make_shared<CAnimImage>("ITPA", 1); return std::make_shared<CAnimImage>(AnimationPath::builtin("ITPA"), 1);
} }
void CTownList::CTownItem::update() void CTownList::CTownItem::update()

View File

@ -94,7 +94,7 @@ CMinimap::CMinimap(const Rect & position)
pos.w = position.w; pos.w = position.w;
pos.h = position.h; pos.h = position.h;
aiShield = std::make_shared<CPicture>("AIShield"); aiShield = std::make_shared<CPicture>(ImagePath::builtin("AIShield"));
aiShield->disable(); aiShield->disable();
} }

View File

@ -24,7 +24,7 @@
#include "../../lib/CGeneralTextHandler.h" #include "../../lib/CGeneralTextHandler.h"
#include "../../lib/ResourceSet.h" #include "../../lib/ResourceSet.h"
CResDataBar::CResDataBar(const std::string & imageName, const Point & position) CResDataBar::CResDataBar(const ImagePath & imageName, const Point & position)
{ {
pos.x += position.x; pos.x += position.x;
pos.y += position.y; pos.y += position.y;
@ -37,7 +37,7 @@ CResDataBar::CResDataBar(const std::string & imageName, const Point & position)
pos.h = background->pos.h; pos.h = background->pos.h;
} }
CResDataBar::CResDataBar(const std::string & defname, int x, int y, int offx, int offy, int resdist, int datedist): CResDataBar::CResDataBar(const ImagePath & defname, int x, int y, int offx, int offy, int resdist, int datedist):
CResDataBar(defname, Point(x,y)) CResDataBar(defname, Point(x,y))
{ {
for (int i = 0; i < 7 ; i++) for (int i = 0; i < 7 ; i++)

View File

@ -10,6 +10,7 @@
#pragma once #pragma once
#include "../gui/CIntObject.h" #include "../gui/CIntObject.h"
#include "../../lib/filesystem/ResourcePath.h"
/// Resources bar which shows information about how many gold, crystals,... you have /// Resources bar which shows information about how many gold, crystals,... you have
/// Current date is displayed too /// Current date is displayed too
@ -25,10 +26,10 @@ class CResDataBar : public CIntObject
public: public:
/// For dynamically-sized UI windows, e.g. adventure map interface /// For dynamically-sized UI windows, e.g. adventure map interface
CResDataBar(const std::string & imageName, const Point & position); CResDataBar(const ImagePath & imageName, const Point & position);
/// For fixed-size UI windows, e.g. CastleInterface /// For fixed-size UI windows, e.g. CastleInterface
CResDataBar(const std::string &defname, int x, int y, int offx, int offy, int resdist, int datedist); CResDataBar(const ImagePath & defname, int x, int y, int offx, int offy, int resdist, int datedist);
void setDatePosition(const Point & position); void setDatePosition(const Point & position);
void setResourcePosition(const GameResID & resource, const Point & position); void setResourcePosition(const GameResID & resource, const Point & position);

View File

@ -25,7 +25,7 @@
#include "../../CCallback.h" #include "../../CCallback.h"
#include "../../lib/CStack.h" #include "../../lib/CStack.h"
#include "../../lib/CPlayerState.h" #include "../../lib/CPlayerState.h"
#include "../../lib/filesystem/ResourceID.h" #include "../../lib/filesystem/ResourcePath.h"
TurnTimerWidget::DrawRect::DrawRect(const Rect & r, const ColorRGBA & c): TurnTimerWidget::DrawRect::DrawRect(const Rect & r, const ColorRGBA & c):
CIntObject(), rect(r), color(c) CIntObject(), rect(r), color(c)
@ -47,7 +47,7 @@ TurnTimerWidget::TurnTimerWidget():
recActions &= ~DEACTIVATE; recActions &= ~DEACTIVATE;
const JsonNode config(ResourceID("config/widgets/turnTimer.json")); const JsonNode config(ResourcePath("config/widgets/turnTimer.json"));
build(config); build(config);

View File

@ -807,7 +807,7 @@ void CatapultAnimation::tick(uint32_t msPassed)
Point shotTarget = owner.stacksController->getStackPositionAtHex(dest, defendingStack) + Point(225, 225) - Point(126, 105); Point shotTarget = owner.stacksController->getStackPositionAtHex(dest, defendingStack) + Point(225, 225) - Point(126, 105);
std::string soundFilename = (catapultDamage > 0) ? "WALLHIT" : "WALLMISS"; std::string soundFilename = (catapultDamage > 0) ? "WALLHIT" : "WALLMISS";
std::string effectFilename = (catapultDamage > 0) ? "SGEXPL" : "CSGRCK"; AnimationPath effectFilename = AnimationPath::builtin((catapultDamage > 0) ? "SGEXPL" : "CSGRCK");
CCS->soundh->playSound( soundFilename ); CCS->soundh->playSound( soundFilename );
owner.stacksController->addNewAnim( new EffectAnimation(owner, effectFilename, shotTarget)); owner.stacksController->addNewAnim( new EffectAnimation(owner, effectFilename, shotTarget));
@ -879,42 +879,42 @@ uint32_t CastAnimation::getAttackClimaxFrame() const
return maxFrames / 2; return maxFrames / 2;
} }
EffectAnimation::EffectAnimation(BattleInterface & owner, std::string animationName, int effects, bool reversed): EffectAnimation::EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, int effects, bool reversed):
BattleAnimation(owner), BattleAnimation(owner),
animation(std::make_shared<CAnimation>(animationName)), animation(std::make_shared<CAnimation>(animationName)),
effectFlags(effects), effectFlags(effects),
effectFinished(false), effectFinished(false),
reversed(reversed) reversed(reversed)
{ {
logAnim->debug("CPointEffectAnimation::init: effect %s", animationName); logAnim->debug("CPointEffectAnimation::init: effect %s", animationName.getName());
} }
EffectAnimation::EffectAnimation(BattleInterface & owner, std::string animationName, std::vector<BattleHex> hex, int effects, bool reversed): EffectAnimation::EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, std::vector<BattleHex> hex, int effects, bool reversed):
EffectAnimation(owner, animationName, effects, reversed) EffectAnimation(owner, animationName, effects, reversed)
{ {
battlehexes = hex; battlehexes = hex;
} }
EffectAnimation::EffectAnimation(BattleInterface & owner, std::string animationName, BattleHex hex, int effects, bool reversed): EffectAnimation::EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, BattleHex hex, int effects, bool reversed):
EffectAnimation(owner, animationName, effects, reversed) EffectAnimation(owner, animationName, effects, reversed)
{ {
assert(hex.isValid()); assert(hex.isValid());
battlehexes.push_back(hex); battlehexes.push_back(hex);
} }
EffectAnimation::EffectAnimation(BattleInterface & owner, std::string animationName, std::vector<Point> pos, int effects, bool reversed): EffectAnimation::EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, std::vector<Point> pos, int effects, bool reversed):
EffectAnimation(owner, animationName, effects, reversed) EffectAnimation(owner, animationName, effects, reversed)
{ {
positions = pos; positions = pos;
} }
EffectAnimation::EffectAnimation(BattleInterface & owner, std::string animationName, Point pos, int effects, bool reversed): EffectAnimation::EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, Point pos, int effects, bool reversed):
EffectAnimation(owner, animationName, effects, reversed) EffectAnimation(owner, animationName, effects, reversed)
{ {
positions.push_back(pos); positions.push_back(pos);
} }
EffectAnimation::EffectAnimation(BattleInterface & owner, std::string animationName, Point pos, BattleHex hex, int effects, bool reversed): EffectAnimation::EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, Point pos, BattleHex hex, int effects, bool reversed):
EffectAnimation(owner, animationName, effects, reversed) EffectAnimation(owner, animationName, effects, reversed)
{ {
assert(hex.isValid()); assert(hex.isValid());

View File

@ -10,6 +10,7 @@
#pragma once #pragma once
#include "../../lib/battle/BattleHex.h" #include "../../lib/battle/BattleHex.h"
#include "../../lib/filesystem/ResourcePath.h"
#include "BattleConstants.h" #include "BattleConstants.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
@ -334,17 +335,17 @@ public:
}; };
/// Create animation with screen-wide effect /// Create animation with screen-wide effect
EffectAnimation(BattleInterface & owner, std::string animationName, int effects = 0, bool reversed = false); EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, int effects = 0, bool reversed = false);
/// Create animation positioned at point(s). Note that positions must be are absolute, including battleint position offset /// Create animation positioned at point(s). Note that positions must be are absolute, including battleint position offset
EffectAnimation(BattleInterface & owner, std::string animationName, Point pos , int effects = 0, bool reversed = false); EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, Point pos , int effects = 0, bool reversed = false);
EffectAnimation(BattleInterface & owner, std::string animationName, std::vector<Point> pos , int effects = 0, bool reversed = false); EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, std::vector<Point> pos , int effects = 0, bool reversed = false);
/// Create animation positioned at certain hex(es) /// Create animation positioned at certain hex(es)
EffectAnimation(BattleInterface & owner, std::string animationName, BattleHex hex , int effects = 0, bool reversed = false); EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, BattleHex hex , int effects = 0, bool reversed = false);
EffectAnimation(BattleInterface & owner, std::string animationName, std::vector<BattleHex> hex, int effects = 0, bool reversed = false); EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, std::vector<BattleHex> hex, int effects = 0, bool reversed = false);
EffectAnimation(BattleInterface & owner, std::string animationName, Point pos, BattleHex hex, int effects = 0, bool reversed = false); EffectAnimation(BattleInterface & owner, const AnimationPath & animationName, Point pos, BattleHex hex, int effects = 0, bool reversed = false);
~EffectAnimation(); ~EffectAnimation();
bool init() override; bool init() override;

View File

@ -27,7 +27,7 @@
#include "../../CCallback.h" #include "../../CCallback.h"
#include "../../lib/battle/BattleAction.h" #include "../../lib/battle/BattleAction.h"
#include "../../lib/filesystem/ResourceID.h" #include "../../lib/filesystem/ResourcePath.h"
#include "../../lib/NetPacks.h" #include "../../lib/NetPacks.h"
#include "../../lib/CStack.h" #include "../../lib/CStack.h"
#include "../../lib/IGameEventsReceiver.h" #include "../../lib/IGameEventsReceiver.h"
@ -48,7 +48,7 @@ void BattleEffectsController::displayEffect(EBattleEffect effect, std::string so
{ {
size_t effectID = static_cast<size_t>(effect); size_t effectID = static_cast<size_t>(effect);
std::string customAnim = graphics->battleACToDef[effectID][0]; AnimationPath customAnim = AnimationPath::builtinTODO(graphics->battleACToDef[effectID][0]);
CCS->soundh->playSound( soundFile ); CCS->soundh->playSound( soundFile );
@ -132,7 +132,7 @@ void BattleEffectsController::collectRenderableObjects(BattleRenderer & renderer
void BattleEffectsController::loadColorMuxers() void BattleEffectsController::loadColorMuxers()
{ {
const JsonNode config(ResourceID("config/battleEffects.json")); const JsonNode config(ResourcePath("config/battleEffects.json"));
for(auto & muxer : config["colorMuxers"].Struct()) for(auto & muxer : config["colorMuxers"].Struct())
{ {

View File

@ -120,20 +120,20 @@ BattleFieldController::BattleFieldController(BattleInterface & owner):
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE; OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
//preparing cells and hexes //preparing cells and hexes
cellBorder = IImage::createFromFile("CCELLGRD.BMP", EImageBlitMode::COLORKEY); cellBorder = IImage::createFromFile(ImagePath::builtin("CCELLGRD.BMP"), EImageBlitMode::COLORKEY);
cellShade = IImage::createFromFile("CCELLSHD.BMP"); cellShade = IImage::createFromFile(ImagePath::builtin("CCELLSHD.BMP"));
cellUnitMovementHighlight = IImage::createFromFile("UnitMovementHighlight.PNG", EImageBlitMode::COLORKEY); cellUnitMovementHighlight = IImage::createFromFile(ImagePath::builtin("UnitMovementHighlight.PNG"), EImageBlitMode::COLORKEY);
cellUnitMaxMovementHighlight = IImage::createFromFile("UnitMaxMovementHighlight.PNG", EImageBlitMode::COLORKEY); cellUnitMaxMovementHighlight = IImage::createFromFile(ImagePath::builtin("UnitMaxMovementHighlight.PNG"), EImageBlitMode::COLORKEY);
attackCursors = std::make_shared<CAnimation>("CRCOMBAT"); attackCursors = std::make_shared<CAnimation>(AnimationPath::builtin("CRCOMBAT"));
attackCursors->preload(); attackCursors->preload();
initializeHexEdgeMaskToFrameIndex(); initializeHexEdgeMaskToFrameIndex();
rangedFullDamageLimitImages = std::make_shared<CAnimation>("battle/rangeHighlights/rangeHighlightsGreen.json"); rangedFullDamageLimitImages = std::make_shared<CAnimation>(AnimationPath::builtin("battle/rangeHighlights/rangeHighlightsGreen.json"));
rangedFullDamageLimitImages->preload(); rangedFullDamageLimitImages->preload();
shootingRangeLimitImages = std::make_shared<CAnimation>("battle/rangeHighlights/rangeHighlightsRed.json"); shootingRangeLimitImages = std::make_shared<CAnimation>(AnimationPath::builtin("battle/rangeHighlights/rangeHighlightsRed.json"));
shootingRangeLimitImages->preload(); shootingRangeLimitImages->preload();
flipRangeLimitImagesIntoPositions(rangedFullDamageLimitImages); flipRangeLimitImagesIntoPositions(rangedFullDamageLimitImages);
@ -150,7 +150,7 @@ BattleFieldController::BattleFieldController(BattleInterface & owner):
} }
else else
{ {
std::string backgroundName = owner.siegeController->getBattleBackgroundName(); auto backgroundName = owner.siegeController->getBattleBackgroundName();
background = IImage::createFromFile(backgroundName, EImageBlitMode::OPAQUE); background = IImage::createFromFile(backgroundName, EImageBlitMode::OPAQUE);
} }

View File

@ -440,8 +440,8 @@ void BattleInterface::spellCast(const BattleSpellCast * sc)
bool side = sc->side; bool side = sc->side;
addToAnimationStage(EAnimationEvents::AFTER_HIT, [=](){ addToAnimationStage(EAnimationEvents::AFTER_HIT, [=](){
stacksController->addNewAnim(new EffectAnimation(*this, side ? "SP07_A.DEF" : "SP07_B.DEF", leftHero)); stacksController->addNewAnim(new EffectAnimation(*this, AnimationPath::builtin(side ? "SP07_A.DEF" : "SP07_B.DEF"), leftHero));
stacksController->addNewAnim(new EffectAnimation(*this, side ? "SP07_B.DEF" : "SP07_A.DEF", rightHero)); stacksController->addNewAnim(new EffectAnimation(*this, AnimationPath::builtin(side ? "SP07_B.DEF" : "SP07_A.DEF"), rightHero));
}); });
} }

View File

@ -342,7 +342,7 @@ BattleHero::BattleHero(const BattleInterface & owner, const CGHeroInstance * her
currentFrame(0.f), currentFrame(0.f),
flagCurrentFrame(0.f) flagCurrentFrame(0.f)
{ {
std::string animationPath; AnimationPath animationPath;
if(!hero->type->battleImage.empty()) if(!hero->type->battleImage.empty())
animationPath = hero->type->battleImage; animationPath = hero->type->battleImage;
@ -364,9 +364,9 @@ BattleHero::BattleHero(const BattleInterface & owner, const CGHeroInstance * her
animation->verticalFlip(); animation->verticalFlip();
if(defender) if(defender)
flagAnimation = std::make_shared<CAnimation>("CMFLAGR"); flagAnimation = std::make_shared<CAnimation>(AnimationPath::builtin("CMFLAGR"));
else else
flagAnimation = std::make_shared<CAnimation>("CMFLAGL"); flagAnimation = std::make_shared<CAnimation>(AnimationPath::builtin("CMFLAGL"));
flagAnimation->preload(); flagAnimation->preload();
flagAnimation->playerColored(hero->tempOwner); flagAnimation->playerColored(hero->tempOwner);
@ -386,7 +386,7 @@ HeroInfoBasicPanel::HeroInfoBasicPanel(const InfoAboutHero & hero, Point * posit
if(initializeBackground) if(initializeBackground)
{ {
background = std::make_shared<CPicture>("CHRPOP"); background = std::make_shared<CPicture>(ImagePath::builtin("CHRPOP"));
background->getSurface()->setBlitMode(EImageBlitMode::OPAQUE); background->getSurface()->setBlitMode(EImageBlitMode::OPAQUE);
background->colorize(hero.owner); background->colorize(hero.owner);
} }
@ -406,7 +406,7 @@ void HeroInfoBasicPanel::initializeData(const InfoAboutHero & hero)
auto currentSpellPoints = hero.details->mana; auto currentSpellPoints = hero.details->mana;
auto maxSpellPoints = hero.details->manaLimit; auto maxSpellPoints = hero.details->manaLimit;
icons.push_back(std::make_shared<CAnimImage>("PortraitsLarge", hero.portrait, 0, 10, 6)); icons.push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("PortraitsLarge"), hero.portrait, 0, 10, 6));
//primary stats //primary stats
labels.push_back(std::make_shared<CLabel>(9, 75, EFonts::FONT_TINY, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->allTexts[380] + ":")); labels.push_back(std::make_shared<CLabel>(9, 75, EFonts::FONT_TINY, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->allTexts[380] + ":"));
@ -423,8 +423,8 @@ void HeroInfoBasicPanel::initializeData(const InfoAboutHero & hero)
labels.push_back(std::make_shared<CLabel>(9, 131, EFonts::FONT_TINY, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->allTexts[384] + ":")); labels.push_back(std::make_shared<CLabel>(9, 131, EFonts::FONT_TINY, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->allTexts[384] + ":"));
labels.push_back(std::make_shared<CLabel>(9, 143, EFonts::FONT_TINY, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->allTexts[385] + ":")); labels.push_back(std::make_shared<CLabel>(9, 143, EFonts::FONT_TINY, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->allTexts[385] + ":"));
icons.push_back(std::make_shared<CAnimImage>("IMRL22", morale + 3, 0, 47, 131)); icons.push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("IMRL22"), morale + 3, 0, 47, 131));
icons.push_back(std::make_shared<CAnimImage>("ILCK22", luck + 3, 0, 47, 143)); icons.push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("ILCK22"), luck + 3, 0, 47, 143));
//spell points //spell points
labels.push_back(std::make_shared<CLabel>(39, 174, EFonts::FONT_TINY, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->allTexts[387])); labels.push_back(std::make_shared<CLabel>(39, 174, EFonts::FONT_TINY, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->allTexts[387]));
@ -446,7 +446,7 @@ void HeroInfoBasicPanel::show(Canvas & to)
} }
HeroInfoWindow::HeroInfoWindow(const InfoAboutHero & hero, Point * position) HeroInfoWindow::HeroInfoWindow(const InfoAboutHero & hero, Point * position)
: CWindowObject(RCLICK_POPUP | SHADOW_DISABLED, "CHRPOP") : CWindowObject(RCLICK_POPUP | SHADOW_DISABLED, ImagePath::builtin("CHRPOP"))
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
if (position != nullptr) if (position != nullptr)
@ -462,16 +462,16 @@ BattleResultWindow::BattleResultWindow(const BattleResult & br, CPlayerInterface
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
background = std::make_shared<CPicture>("CPRESULT"); background = std::make_shared<CPicture>(ImagePath::builtin("CPRESULT"));
background->colorize(owner.playerID); background->colorize(owner.playerID);
pos = center(background->pos); pos = center(background->pos);
exit = std::make_shared<CButton>(Point(384, 505), "iok6432.def", std::make_pair("", ""), [&](){ bExitf();}, EShortcut::GLOBAL_ACCEPT); exit = std::make_shared<CButton>(Point(384, 505), AnimationPath::builtin("iok6432.def"), std::make_pair("", ""), [&](){ bExitf();}, EShortcut::GLOBAL_ACCEPT);
exit->setBorderColor(Colors::METALLIC_GOLD); exit->setBorderColor(Colors::METALLIC_GOLD);
if(allowReplay) if(allowReplay)
{ {
repeat = std::make_shared<CButton>(Point(24, 505), "icn6432.def", std::make_pair("", ""), [&](){ bRepeatf();}, EShortcut::GLOBAL_CANCEL); repeat = std::make_shared<CButton>(Point(24, 505), AnimationPath::builtin("icn6432.def"), std::make_pair("", ""), [&](){ bRepeatf();}, EShortcut::GLOBAL_CANCEL);
repeat->setBorderColor(Colors::METALLIC_GOLD); repeat->setBorderColor(Colors::METALLIC_GOLD);
labels.push_back(std::make_shared<CLabel>(232, 520, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("vcmi.battleResultsWindow.applyResultsLabel"))); labels.push_back(std::make_shared<CLabel>(232, 520, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->translate("vcmi.battleResultsWindow.applyResultsLabel")));
} }
@ -507,7 +507,7 @@ BattleResultWindow::BattleResultWindow(const BattleResult & br, CPlayerInterface
if(heroInfo.portrait >= 0) //attacking hero if(heroInfo.portrait >= 0) //attacking hero
{ {
icons.push_back(std::make_shared<CAnimImage>("PortraitsLarge", heroInfo.portrait, 0, xs[i], 38)); icons.push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("PortraitsLarge"), heroInfo.portrait, 0, xs[i], 38));
sideNames[i] = heroInfo.name; sideNames[i] = heroInfo.name;
} }
else else
@ -525,7 +525,7 @@ BattleResultWindow::BattleResultWindow(const BattleResult & br, CPlayerInterface
if(best != stacks.end()) //should be always but to be safe... if(best != stacks.end()) //should be always but to be safe...
{ {
icons.push_back(std::make_shared<CAnimImage>("TWCRPORT", (*best)->unitType()->getIconIndex(), 0, xs[i], 38)); icons.push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("TWCRPORT"), (*best)->unitType()->getIconIndex(), 0, xs[i], 38));
sideNames[i] = (*best)->unitType()->getNamePluralTranslated(); sideNames[i] = (*best)->unitType()->getNamePluralTranslated();
} }
} }
@ -552,7 +552,7 @@ BattleResultWindow::BattleResultWindow(const BattleResult & br, CPlayerInterface
if (creature->getId() == CreatureID::ARROW_TOWERS ) if (creature->getId() == CreatureID::ARROW_TOWERS )
continue; // do not show destroyed towers in battle results continue; // do not show destroyed towers in battle results
icons.push_back(std::make_shared<CAnimImage>("CPRSMALL", creature->getIconIndex(), 0, xPos, yPos)); icons.push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("CPRSMALL"), creature->getIconIndex(), 0, xPos, yPos));
std::ostringstream amount; std::ostringstream amount;
amount<<elem.second; amount<<elem.second;
labels.push_back(std::make_shared<CLabel>(xPos + 16, yPos + 42, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, amount.str())); labels.push_back(std::make_shared<CLabel>(xPos + 16, yPos + 42, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, amount.str()));
@ -676,8 +676,8 @@ StackQueue::StackQueue(bool Embedded, BattleInterface & owner)
pos.x += parent->pos.w/2 - pos.w/2; pos.x += parent->pos.w/2 - pos.w/2;
pos.y += 10; pos.y += 10;
icons = std::make_shared<CAnimation>("CPRSMALL"); icons = std::make_shared<CAnimation>(AnimationPath::builtin("CPRSMALL"));
stateIcons = std::make_shared<CAnimation>("VCMI/BATTLEQUEUE/STATESSMALL"); stateIcons = std::make_shared<CAnimation>(AnimationPath::builtin("VCMI/BATTLEQUEUE/STATESSMALL"));
} }
else else
{ {
@ -686,10 +686,10 @@ StackQueue::StackQueue(bool Embedded, BattleInterface & owner)
pos.x += 0; pos.x += 0;
pos.y -= pos.h; pos.y -= pos.h;
background = std::make_shared<CFilledTexture>("DIBOXBCK", Rect(0, 0, pos.w, pos.h)); background = std::make_shared<CFilledTexture>(ImagePath::builtin("DIBOXBCK"), Rect(0, 0, pos.w, pos.h));
icons = std::make_shared<CAnimation>("TWCRPORT"); icons = std::make_shared<CAnimation>(AnimationPath::builtin("TWCRPORT"));
stateIcons = std::make_shared<CAnimation>("VCMI/BATTLEQUEUE/STATESSMALL"); stateIcons = std::make_shared<CAnimation>(AnimationPath::builtin("VCMI/BATTLEQUEUE/STATESSMALL"));
//TODO: where use big icons? //TODO: where use big icons?
//stateIcons = std::make_shared<CAnimation>("VCMI/BATTLEQUEUE/STATESBIG"); //stateIcons = std::make_shared<CAnimation>("VCMI/BATTLEQUEUE/STATESBIG");
} }
@ -750,7 +750,7 @@ StackQueue::StackBox::StackBox(StackQueue * owner):
CIntObject(SHOW_POPUP | HOVER), owner(owner) CIntObject(SHOW_POPUP | HOVER), owner(owner)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
background = std::make_shared<CPicture>(owner->embedded ? "StackQueueSmall" : "StackQueueLarge"); background = std::make_shared<CPicture>(ImagePath::builtin(owner->embedded ? "StackQueueSmall" : "StackQueueLarge"));
pos.w = background->pos.w; pos.w = background->pos.w;
pos.h = background->pos.h; pos.h = background->pos.h;

View File

@ -42,7 +42,7 @@ BattleObstacleController::BattleObstacleController(BattleInterface & owner):
void BattleObstacleController::loadObstacleImage(const CObstacleInstance & oi) void BattleObstacleController::loadObstacleImage(const CObstacleInstance & oi)
{ {
std::string animationName = oi.getAnimation(); AnimationPath animationName = oi.getAnimation();
if (animationsCache.count(animationName) == 0) if (animationsCache.count(animationName) == 0)
{ {
@ -50,7 +50,7 @@ void BattleObstacleController::loadObstacleImage(const CObstacleInstance & oi)
{ {
// obstacle uses single bitmap image for animations // obstacle uses single bitmap image for animations
auto animation = std::make_shared<CAnimation>(); auto animation = std::make_shared<CAnimation>();
animation->setCustom(animationName, 0, 0); animation->setCustom(animationName.getName(), 0, 0);
animationsCache[animationName] = animation; animationsCache[animationName] = animation;
animation->preload(); animation->preload();
} }
@ -76,7 +76,7 @@ void BattleObstacleController::obstacleRemoved(const std::vector<ObstacleChanges
continue; continue;
} }
auto animation = std::make_shared<CAnimation>(obstacle["appearAnimation"].String()); auto animation = std::make_shared<CAnimation>(AnimationPath::fromJson(obstacle["appearAnimation"]));
animation->preload(); animation->preload();
auto first = animation->getImage(0, 0); auto first = animation->getImage(0, 0);
@ -87,7 +87,7 @@ void BattleObstacleController::obstacleRemoved(const std::vector<ObstacleChanges
// -> if we know how to blit obstacle, let's blit the effect in the same place // -> if we know how to blit obstacle, let's blit the effect in the same place
Point whereTo = getObstaclePosition(first, obstacle); Point whereTo = getObstaclePosition(first, obstacle);
//AFAIK, in H3 there is no sound of obstacle removal //AFAIK, in H3 there is no sound of obstacle removal
owner.stacksController->addNewAnim(new EffectAnimation(owner, obstacle["appearAnimation"].String(), whereTo, obstacle["position"].Integer(), 0, true)); owner.stacksController->addNewAnim(new EffectAnimation(owner, AnimationPath::fromJson(obstacle["appearAnimation"]), whereTo, obstacle["position"].Integer(), 0, true));
obstacleAnimations.erase(oi.id); obstacleAnimations.erase(oi.id);
//so when multiple obstacles are removed, they show up one after another //so when multiple obstacles are removed, they show up one after another

View File

@ -9,6 +9,8 @@
*/ */
#pragma once #pragma once
#include "../../lib/filesystem/ResourcePath.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
struct BattleHex; struct BattleHex;
@ -35,7 +37,7 @@ class BattleObstacleController
float timePassed; float timePassed;
/// cached animations of all obstacles in current battle /// cached animations of all obstacles in current battle
std::map<std::string, std::shared_ptr<CAnimation>> animationsCache; std::map<AnimationPath, std::shared_ptr<CAnimation>> animationsCache;
/// list of all obstacles that are currently being rendered /// list of all obstacles that are currently being rendered
std::map<si32, std::shared_ptr<CAnimation>> obstacleAnimations; std::map<si32, std::shared_ptr<CAnimation>> obstacleAnimations;

View File

@ -188,7 +188,7 @@ void BattleProjectileController::initStackProjectile(const CStack * stack)
projectilesCache[creature.animation.projectileImageName] = createProjectileImage(creature.animation.projectileImageName); projectilesCache[creature.animation.projectileImageName] = createProjectileImage(creature.animation.projectileImageName);
} }
std::shared_ptr<CAnimation> BattleProjectileController::createProjectileImage(const std::string & path ) std::shared_ptr<CAnimation> BattleProjectileController::createProjectileImage(const AnimationPath & path )
{ {
std::shared_ptr<CAnimation> projectile = std::make_shared<CAnimation>(path); std::shared_ptr<CAnimation> projectile = std::make_shared<CAnimation>(path);
projectile->preload(); projectile->preload();
@ -204,7 +204,7 @@ std::shared_ptr<CAnimation> BattleProjectileController::createProjectileImage(co
std::shared_ptr<CAnimation> BattleProjectileController::getProjectileImage(const CStack * stack) std::shared_ptr<CAnimation> BattleProjectileController::getProjectileImage(const CStack * stack)
{ {
const CCreature & creature = getShooter(stack); const CCreature & creature = getShooter(stack);
std::string imageName = creature.animation.projectileImageName; AnimationPath imageName = creature.animation.projectileImageName;
if (!projectilesCache.count(imageName)) if (!projectilesCache.count(imageName))
initStackProjectile(stack); initStackProjectile(stack);
@ -361,7 +361,7 @@ void BattleProjectileController::createProjectile(const CStack * shooter, Point
void BattleProjectileController::createSpellProjectile(const CStack * shooter, Point from, Point dest, const CSpell * spell) void BattleProjectileController::createSpellProjectile(const CStack * shooter, Point from, Point dest, const CSpell * spell)
{ {
double projectileAngle = std::abs(atan2(dest.x - from.x, dest.y - from.y)); double projectileAngle = std::abs(atan2(dest.x - from.x, dest.y - from.y));
std::string animToDisplay = spell->animationInfo.selectProjectile(projectileAngle); AnimationPath animToDisplay = spell->animationInfo.selectProjectile(projectileAngle);
assert(!animToDisplay.empty()); assert(!animToDisplay.empty());

View File

@ -11,6 +11,7 @@
#include "../../lib/CCreatureHandler.h" #include "../../lib/CCreatureHandler.h"
#include "../../lib/Point.h" #include "../../lib/Point.h"
#include "../../lib/filesystem/ResourcePath.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
@ -83,13 +84,13 @@ class BattleProjectileController
BattleInterface & owner; BattleInterface & owner;
/// all projectiles loaded during current battle /// all projectiles loaded during current battle
std::map<std::string, std::shared_ptr<CAnimation>> projectilesCache; std::map<AnimationPath, std::shared_ptr<CAnimation>> projectilesCache;
/// projectiles currently flying on battlefield /// projectiles currently flying on battlefield
std::vector<std::shared_ptr<ProjectileBase>> projectiles; std::vector<std::shared_ptr<ProjectileBase>> projectiles;
std::shared_ptr<CAnimation> getProjectileImage(const CStack * stack); std::shared_ptr<CAnimation> getProjectileImage(const CStack * stack);
std::shared_ptr<CAnimation> createProjectileImage(const std::string & path ); std::shared_ptr<CAnimation> createProjectileImage(const AnimationPath & path );
void initStackProjectile(const CStack * stack); void initStackProjectile(const CStack * stack);
bool stackUsesRayProjectile(const CStack * stack) const; bool stackUsesRayProjectile(const CStack * stack) const;

View File

@ -28,7 +28,7 @@
#include "../../lib/CStack.h" #include "../../lib/CStack.h"
#include "../../lib/mapObjects/CGTownInstance.h" #include "../../lib/mapObjects/CGTownInstance.h"
std::string BattleSiegeController::getWallPieceImageName(EWallVisual::EWallVisual what, EWallState state) const ImagePath BattleSiegeController::getWallPieceImageName(EWallVisual::EWallVisual what, EWallState state) const
{ {
auto getImageIndex = [&]() -> int auto getImageIndex = [&]() -> int
{ {
@ -68,44 +68,44 @@ std::string BattleSiegeController::getWallPieceImageName(EWallVisual::EWallVisua
auto faction = town->town->faction->getIndex(); auto faction = town->town->faction->getIndex();
if (faction == ETownType::RAMPART || faction == ETownType::NECROPOLIS || faction == ETownType::DUNGEON || faction == ETownType::STRONGHOLD) if (faction == ETownType::RAMPART || faction == ETownType::NECROPOLIS || faction == ETownType::DUNGEON || faction == ETownType::STRONGHOLD)
return prefix + "TPW1.BMP"; return ImagePath::builtinTODO(prefix + "TPW1.BMP");
else else
return prefix + "TPWL.BMP"; return ImagePath::builtinTODO(prefix + "TPWL.BMP");
} }
case EWallVisual::KEEP: case EWallVisual::KEEP:
return prefix + "MAN" + addit + ".BMP"; return ImagePath::builtinTODO(prefix + "MAN" + addit + ".BMP");
case EWallVisual::BOTTOM_TOWER: case EWallVisual::BOTTOM_TOWER:
return prefix + "TW1" + addit + ".BMP"; return ImagePath::builtinTODO(prefix + "TW1" + addit + ".BMP");
case EWallVisual::BOTTOM_WALL: case EWallVisual::BOTTOM_WALL:
return prefix + "WA1" + addit + ".BMP"; return ImagePath::builtinTODO(prefix + "WA1" + addit + ".BMP");
case EWallVisual::WALL_BELLOW_GATE: case EWallVisual::WALL_BELLOW_GATE:
return prefix + "WA3" + addit + ".BMP"; return ImagePath::builtinTODO(prefix + "WA3" + addit + ".BMP");
case EWallVisual::WALL_OVER_GATE: case EWallVisual::WALL_OVER_GATE:
return prefix + "WA4" + addit + ".BMP"; return ImagePath::builtinTODO(prefix + "WA4" + addit + ".BMP");
case EWallVisual::UPPER_WALL: case EWallVisual::UPPER_WALL:
return prefix + "WA6" + addit + ".BMP"; return ImagePath::builtinTODO(prefix + "WA6" + addit + ".BMP");
case EWallVisual::UPPER_TOWER: case EWallVisual::UPPER_TOWER:
return prefix + "TW2" + addit + ".BMP"; return ImagePath::builtinTODO(prefix + "TW2" + addit + ".BMP");
case EWallVisual::GATE: case EWallVisual::GATE:
return prefix + "DRW" + addit + ".BMP"; return ImagePath::builtinTODO(prefix + "DRW" + addit + ".BMP");
case EWallVisual::GATE_ARCH: case EWallVisual::GATE_ARCH:
return prefix + "ARCH.BMP"; return ImagePath::builtinTODO(prefix + "ARCH.BMP");
case EWallVisual::BOTTOM_STATIC_WALL: case EWallVisual::BOTTOM_STATIC_WALL:
return prefix + "WA2.BMP"; return ImagePath::builtinTODO(prefix + "WA2.BMP");
case EWallVisual::UPPER_STATIC_WALL: case EWallVisual::UPPER_STATIC_WALL:
return prefix + "WA5.BMP"; return ImagePath::builtinTODO(prefix + "WA5.BMP");
case EWallVisual::MOAT: case EWallVisual::MOAT:
return prefix + "MOAT.BMP"; return ImagePath::builtinTODO(prefix + "MOAT.BMP");
case EWallVisual::MOAT_BANK: case EWallVisual::MOAT_BANK:
return prefix + "MLIP.BMP"; return ImagePath::builtinTODO(prefix + "MLIP.BMP");
case EWallVisual::KEEP_BATTLEMENT: case EWallVisual::KEEP_BATTLEMENT:
return prefix + "MANC.BMP"; return ImagePath::builtinTODO(prefix + "MANC.BMP");
case EWallVisual::BOTTOM_BATTLEMENT: case EWallVisual::BOTTOM_BATTLEMENT:
return prefix + "TW1C.BMP"; return ImagePath::builtinTODO(prefix + "TW1C.BMP");
case EWallVisual::UPPER_BATTLEMENT: case EWallVisual::UPPER_BATTLEMENT:
return prefix + "TW2C.BMP"; return ImagePath::builtinTODO(prefix + "TW2C.BMP");
default: default:
return ""; return ImagePath();
} }
} }
@ -118,10 +118,10 @@ void BattleSiegeController::showWallPiece(Canvas & canvas, EWallVisual::EWallVis
canvas.draw(wallPieceImages[what], Point(pos.x, pos.y)); canvas.draw(wallPieceImages[what], Point(pos.x, pos.y));
} }
std::string BattleSiegeController::getBattleBackgroundName() const ImagePath BattleSiegeController::getBattleBackgroundName() const
{ {
const std::string & prefix = town->town->clientInfo.siegePrefix; const std::string & prefix = town->town->clientInfo.siegePrefix;
return prefix + "BACK.BMP"; return ImagePath::builtinTODO(prefix + "BACK.BMP");
} }
bool BattleSiegeController::getWallPieceExistance(EWallVisual::EWallVisual what) const bool BattleSiegeController::getWallPieceExistance(EWallVisual::EWallVisual what) const
@ -341,7 +341,7 @@ void BattleSiegeController::stackIsCatapulting(const CatapultAttack & ca)
positions.push_back(owner.stacksController->getStackPositionAtHex(attackInfo.destinationTile, nullptr) + Point(99, 120)); positions.push_back(owner.stacksController->getStackPositionAtHex(attackInfo.destinationTile, nullptr) + Point(99, 120));
CCS->soundh->playSound( "WALLHIT" ); CCS->soundh->playSound( "WALLHIT" );
owner.stacksController->addNewAnim(new EffectAnimation(owner, "SGEXPL.DEF", positions)); owner.stacksController->addNewAnim(new EffectAnimation(owner, AnimationPath::builtin("SGEXPL.DEF"), positions));
} }
owner.waitForAnimations(); owner.waitForAnimations();

View File

@ -11,6 +11,7 @@
#include "../../lib/GameConstants.h" #include "../../lib/GameConstants.h"
#include "../../lib/battle/BattleHex.h" #include "../../lib/battle/BattleHex.h"
#include "../../lib/filesystem/ResourcePath.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
@ -76,7 +77,7 @@ class BattleSiegeController
std::array<std::shared_ptr<IImage>, EWallVisual::WALL_LAST + 1> wallPieceImages; std::array<std::shared_ptr<IImage>, EWallVisual::WALL_LAST + 1> wallPieceImages;
/// return URI for image for a wall piece /// return URI for image for a wall piece
std::string getWallPieceImageName(EWallVisual::EWallVisual what, EWallState state) const; ImagePath getWallPieceImageName(EWallVisual::EWallVisual what, EWallState state) const;
/// returns BattleHex to which chosen wall piece is bound /// returns BattleHex to which chosen wall piece is bound
BattleHex getWallPiecePosition(EWallVisual::EWallVisual what) const; BattleHex getWallPiecePosition(EWallVisual::EWallVisual what) const;
@ -102,7 +103,7 @@ public:
/// queries from other battle controllers /// queries from other battle controllers
bool isAttackableByCatapult(BattleHex hex) const; bool isAttackableByCatapult(BattleHex hex) const;
std::string getBattleBackgroundName() const; ImagePath getBattleBackgroundName() const;
const CCreature *getTurretCreature() const; const CCreature *getTurretCreature() const;
Point getTurretCreaturePosition( BattleHex position ) const; Point getTurretCreaturePosition( BattleHex position ) const;

View File

@ -76,10 +76,10 @@ BattleStacksController::BattleStacksController(BattleInterface & owner):
animIDhelper(0) animIDhelper(0)
{ {
//preparing graphics for displaying amounts of creatures //preparing graphics for displaying amounts of creatures
amountNormal = IImage::createFromFile("CMNUMWIN.BMP", EImageBlitMode::COLORKEY); amountNormal = IImage::createFromFile(ImagePath::builtin("CMNUMWIN.BMP"), EImageBlitMode::COLORKEY);
amountPositive = IImage::createFromFile("CMNUMWIN.BMP", EImageBlitMode::COLORKEY); amountPositive = IImage::createFromFile(ImagePath::builtin("CMNUMWIN.BMP"), EImageBlitMode::COLORKEY);
amountNegative = IImage::createFromFile("CMNUMWIN.BMP", EImageBlitMode::COLORKEY); amountNegative = IImage::createFromFile(ImagePath::builtin("CMNUMWIN.BMP"), EImageBlitMode::COLORKEY);
amountEffNeutral = IImage::createFromFile("CMNUMWIN.BMP", EImageBlitMode::COLORKEY); amountEffNeutral = IImage::createFromFile(ImagePath::builtin("CMNUMWIN.BMP"), EImageBlitMode::COLORKEY);
static const auto shifterNormal = ColorFilter::genRangeShifter( 0.f, 0.f, 0.f, 0.6f, 0.2f, 1.0f ); static const auto shifterNormal = ColorFilter::genRangeShifter( 0.f, 0.f, 0.f, 0.6f, 0.2f, 1.0f );
static const auto shifterPositive = ColorFilter::genRangeShifter( 0.f, 0.f, 0.f, 0.2f, 1.0f, 0.2f ); static const auto shifterPositive = ColorFilter::genRangeShifter( 0.f, 0.f, 0.f, 0.2f, 1.0f, 0.2f );

View File

@ -37,7 +37,7 @@
#include "../../lib/mapObjects/CGHeroInstance.h" #include "../../lib/mapObjects/CGHeroInstance.h"
#include "../../lib/CStack.h" #include "../../lib/CStack.h"
#include "../../lib/CConfigHandler.h" #include "../../lib/CConfigHandler.h"
#include "../../lib/filesystem/ResourceID.h" #include "../../lib/filesystem/ResourcePath.h"
#include "../windows/settings/SettingsMainWindow.h" #include "../windows/settings/SettingsMainWindow.h"
BattleWindow::BattleWindow(BattleInterface & owner): BattleWindow::BattleWindow(BattleInterface & owner):
@ -51,7 +51,7 @@ BattleWindow::BattleWindow(BattleInterface & owner):
REGISTER_BUILDER("battleConsole", &BattleWindow::buildBattleConsole); REGISTER_BUILDER("battleConsole", &BattleWindow::buildBattleConsole);
const JsonNode config(ResourceID("config/widgets/BattleWindow2.json")); const JsonNode config(ResourcePath("config/widgets/BattleWindow2.json"));
addShortcut(EShortcut::GLOBAL_OPTIONS, std::bind(&BattleWindow::bOptionsf, this)); addShortcut(EShortcut::GLOBAL_OPTIONS, std::bind(&BattleWindow::bOptionsf, this));
addShortcut(EShortcut::BATTLE_SURRENDER, std::bind(&BattleWindow::bSurrenderf, this)); addShortcut(EShortcut::BATTLE_SURRENDER, std::bind(&BattleWindow::bSurrenderf, this));
@ -436,23 +436,23 @@ void BattleWindow::showAlternativeActionIcon(PossiblePlayerBattleAction action)
if(!w) if(!w)
return; return;
std::string iconName = variables["actionIconDefault"].String(); AnimationPath iconName = AnimationPath::fromJson(variables["actionIconDefault"]);
switch(action.get()) switch(action.get())
{ {
case PossiblePlayerBattleAction::ATTACK: case PossiblePlayerBattleAction::ATTACK:
iconName = variables["actionIconAttack"].String(); iconName = AnimationPath::fromJson(variables["actionIconAttack"]);
break; break;
case PossiblePlayerBattleAction::SHOOT: case PossiblePlayerBattleAction::SHOOT:
iconName = variables["actionIconShoot"].String(); iconName = AnimationPath::fromJson(variables["actionIconShoot"]);
break; break;
case PossiblePlayerBattleAction::AIMED_SPELL_CREATURE: case PossiblePlayerBattleAction::AIMED_SPELL_CREATURE:
iconName = variables["actionIconSpell"].String(); iconName = AnimationPath::fromJson(variables["actionIconSpell"]);
break; break;
case PossiblePlayerBattleAction::ANY_LOCATION: case PossiblePlayerBattleAction::ANY_LOCATION:
iconName = variables["actionIconSpell"].String(); iconName = AnimationPath::fromJson(variables["actionIconSpell"]);
break; break;
//TODO: figure out purpose of this icon //TODO: figure out purpose of this icon
@ -461,11 +461,11 @@ void BattleWindow::showAlternativeActionIcon(PossiblePlayerBattleAction action)
//break; //break;
case PossiblePlayerBattleAction::ATTACK_AND_RETURN: case PossiblePlayerBattleAction::ATTACK_AND_RETURN:
iconName = variables["actionIconReturn"].String(); iconName = AnimationPath::fromJson(variables["actionIconReturn"]);
break; break;
case PossiblePlayerBattleAction::WALK_AND_ATTACK: case PossiblePlayerBattleAction::WALK_AND_ATTACK:
iconName = variables["actionIconNoReturn"].String(); iconName = AnimationPath::fromJson(variables["actionIconNoReturn"]);
break; break;
} }

View File

@ -185,7 +185,7 @@ void CreatureAnimation::setType(ECreatureAnimType type)
speed = speedController(this, type); speed = speedController(this, type);
} }
CreatureAnimation::CreatureAnimation(const std::string & name_, TSpeedController controller) CreatureAnimation::CreatureAnimation(const AnimationPath & name_, TSpeedController controller)
: name(name_), : name(name_),
speed(0.1f), speed(0.1f),
shadowAlpha(128), shadowAlpha(128),

View File

@ -70,7 +70,7 @@ public:
using TSpeedController = std::function<float(CreatureAnimation *, ECreatureAnimType)>; using TSpeedController = std::function<float(CreatureAnimation *, ECreatureAnimType)>;
private: private:
std::string name; AnimationPath name;
/// animation for rendering stack in default orientation - facing right /// animation for rendering stack in default orientation - facing right
std::shared_ptr<CAnimation> forward; std::shared_ptr<CAnimation> forward;
@ -122,7 +122,7 @@ public:
/// name - path to .def file, relative to SPRITES/ directory /// name - path to .def file, relative to SPRITES/ directory
/// controller - function that will return for how long *each* frame /// controller - function that will return for how long *each* frame
/// in specified group of animation should be played, measured in seconds /// in specified group of animation should be played, measured in seconds
CreatureAnimation(const std::string & name_, TSpeedController speedController); CreatureAnimation(const AnimationPath & name_, TSpeedController speedController);
/// sets type of animation and resets framecount /// sets type of animation and resets framecount
void setType(ECreatureAnimType type); void setType(ECreatureAnimType type);

View File

@ -46,10 +46,10 @@ CursorHandler::CursorHandler()
cursors = cursors =
{ {
std::make_unique<CAnimation>("CRADVNTR"), std::make_unique<CAnimation>(AnimationPath::builtin("CRADVNTR")),
std::make_unique<CAnimation>("CRCOMBAT"), std::make_unique<CAnimation>(AnimationPath::builtin("CRCOMBAT")),
std::make_unique<CAnimation>("CRDEFLT"), std::make_unique<CAnimation>(AnimationPath::builtin("CRDEFLT")),
std::make_unique<CAnimation>("CRSPELL") std::make_unique<CAnimation>(AnimationPath::builtin("CRSPELL"))
}; };
for (auto & cursor : cursors) for (auto & cursor : cursors)
@ -100,7 +100,7 @@ void CursorHandler::dragAndDropCursor(std::shared_ptr<IImage> image)
cursor->setImage(getCurrentImage(), getPivotOffset()); cursor->setImage(getCurrentImage(), getPivotOffset());
} }
void CursorHandler::dragAndDropCursor (std::string path, size_t index) void CursorHandler::dragAndDropCursor (const AnimationPath & path, size_t index)
{ {
CAnimation anim(path); CAnimation anim(path);
anim.load(index); anim.load(index);

View File

@ -10,6 +10,7 @@
#pragma once #pragma once
#include "../../lib/Point.h" #include "../../lib/Point.h"
#include "../../lib/filesystem/ResourcePath.h"
class ICursor; class ICursor;
class IImage; class IImage;
@ -143,7 +144,7 @@ public:
/// @param image Image to replace cursor with or nullptr to use the normal cursor. /// @param image Image to replace cursor with or nullptr to use the normal cursor.
void dragAndDropCursor(std::shared_ptr<IImage> image); void dragAndDropCursor(std::shared_ptr<IImage> image);
void dragAndDropCursor(std::string path, size_t index); void dragAndDropCursor(const AnimationPath & path, size_t index);
/// Changes cursor to specified index /// Changes cursor to specified index
void set(Cursor::Default index); void set(Cursor::Default index);

View File

@ -31,7 +31,7 @@
#include "../../lib//constants/StringConstants.h" #include "../../lib//constants/StringConstants.h"
#include "../../lib/CGeneralTextHandler.h" #include "../../lib/CGeneralTextHandler.h"
#include "../../lib/filesystem/ResourceID.h" #include "../../lib/filesystem/ResourcePath.h"
InterfaceObjectConfigurable::InterfaceObjectConfigurable(const JsonNode & config, int used, Point offset): InterfaceObjectConfigurable::InterfaceObjectConfigurable(const JsonNode & config, int used, Point offset):
InterfaceObjectConfigurable(used, offset) InterfaceObjectConfigurable(used, offset)
@ -110,7 +110,7 @@ void InterfaceObjectConfigurable::build(const JsonNode &config)
{ {
if (!config["library"].isNull()) if (!config["library"].isNull())
{ {
const JsonNode library(ResourceID(config["library"].String())); const JsonNode library(ResourcePath(config["library"].String()));
loadCustomBuilders(library); loadCustomBuilders(library);
} }
@ -305,7 +305,7 @@ EShortcut InterfaceObjectConfigurable::readHotkey(const JsonNode & config) const
std::shared_ptr<CPicture> InterfaceObjectConfigurable::buildPicture(const JsonNode & config) const std::shared_ptr<CPicture> InterfaceObjectConfigurable::buildPicture(const JsonNode & config) const
{ {
logGlobal->debug("Building widget CPicture"); logGlobal->debug("Building widget CPicture");
auto image = config["image"].String(); auto image = ImagePath::fromJson(config["image"]);
auto position = readPosition(config["position"]); auto position = readPosition(config["position"]);
auto pic = std::make_shared<CPicture>(image, position.x, position.y); auto pic = std::make_shared<CPicture>(image, position.x, position.y);
if(!config["visible"].isNull()) if(!config["visible"].isNull())
@ -369,7 +369,7 @@ std::shared_ptr<CToggleButton> InterfaceObjectConfigurable::buildToggleButton(co
{ {
logGlobal->debug("Building widget CToggleButton"); logGlobal->debug("Building widget CToggleButton");
auto position = readPosition(config["position"]); auto position = readPosition(config["position"]);
auto image = config["image"].String(); auto image = AnimationPath::fromJson(config["image"]);
auto help = readHintText(config["help"]); auto help = readHintText(config["help"]);
auto button = std::make_shared<CToggleButton>(position, image, help); auto button = std::make_shared<CToggleButton>(position, image, help);
if(!config["items"].isNull()) if(!config["items"].isNull())
@ -395,7 +395,7 @@ std::shared_ptr<CButton> InterfaceObjectConfigurable::buildButton(const JsonNode
{ {
logGlobal->debug("Building widget CButton"); logGlobal->debug("Building widget CButton");
auto position = readPosition(config["position"]); auto position = readPosition(config["position"]);
auto image = config["image"].String(); auto image = AnimationPath::fromJson(config["image"]);
auto help = readHintText(config["help"]); auto help = readHintText(config["help"]);
auto button = std::make_shared<CButton>(position, image, help); auto button = std::make_shared<CButton>(position, image, help);
if(!config["items"].isNull()) if(!config["items"].isNull())
@ -522,7 +522,7 @@ std::shared_ptr<CAnimImage> InterfaceObjectConfigurable::buildImage(const JsonNo
{ {
logGlobal->debug("Building widget CAnimImage"); logGlobal->debug("Building widget CAnimImage");
auto position = readPosition(config["position"]); auto position = readPosition(config["position"]);
auto image = config["image"].String(); auto image = AnimationPath::fromJson(config["image"]);
int group = config["group"].isNull() ? 0 : config["group"].Integer(); int group = config["group"].isNull() ? 0 : config["group"].Integer();
int frame = config["frame"].isNull() ? 0 : config["frame"].Integer(); int frame = config["frame"].isNull() ? 0 : config["frame"].Integer();
return std::make_shared<CAnimImage>(image, frame, group, position.x, position.y); return std::make_shared<CAnimImage>(image, frame, group, position.x, position.y);
@ -531,7 +531,7 @@ std::shared_ptr<CAnimImage> InterfaceObjectConfigurable::buildImage(const JsonNo
std::shared_ptr<CFilledTexture> InterfaceObjectConfigurable::buildTexture(const JsonNode & config) const std::shared_ptr<CFilledTexture> InterfaceObjectConfigurable::buildTexture(const JsonNode & config) const
{ {
logGlobal->debug("Building widget CFilledTexture"); logGlobal->debug("Building widget CFilledTexture");
auto image = config["image"].String(); auto image = ImagePath::fromJson(config["image"]);
auto rect = readRect(config["rect"]); auto rect = readRect(config["rect"]);
auto playerColor = readPlayerColor(config["color"]); auto playerColor = readPlayerColor(config["color"]);
if(playerColor.isValidPlayer()) if(playerColor.isValidPlayer())
@ -546,7 +546,7 @@ std::shared_ptr<ComboBox> InterfaceObjectConfigurable::buildComboBox(const JsonN
{ {
logGlobal->debug("Building widget ComboBox"); logGlobal->debug("Building widget ComboBox");
auto position = readPosition(config["position"]); auto position = readPosition(config["position"]);
auto image = config["image"].String(); auto image = AnimationPath::fromJson(config["image"]);
auto help = readHintText(config["help"]); auto help = readHintText(config["help"]);
auto result = std::make_shared<ComboBox>(position, image, help, config["dropDown"]); auto result = std::make_shared<ComboBox>(position, image, help, config["dropDown"]);
if(!config["items"].isNull()) if(!config["items"].isNull())
@ -573,7 +573,7 @@ std::shared_ptr<CTextInput> InterfaceObjectConfigurable::buildTextInput(const Js
logGlobal->debug("Building widget CTextInput"); logGlobal->debug("Building widget CTextInput");
auto rect = readRect(config["rect"]); auto rect = readRect(config["rect"]);
auto offset = readPosition(config["backgroundOffset"]); auto offset = readPosition(config["backgroundOffset"]);
auto bgName = config["background"].String(); auto bgName = ImagePath::fromJson(config["background"]);
auto result = std::make_shared<CTextInput>(rect, offset, bgName, 0); auto result = std::make_shared<CTextInput>(rect, offset, bgName, 0);
if(!config["alignment"].isNull()) if(!config["alignment"].isNull())
result->alignment = readTextAlignment(config["alignment"]); result->alignment = readTextAlignment(config["alignment"]);
@ -664,7 +664,7 @@ std::shared_ptr<CShowableAnim> InterfaceObjectConfigurable::buildAnimation(const
{ {
logGlobal->debug("Building widget CShowableAnim"); logGlobal->debug("Building widget CShowableAnim");
auto position = readPosition(config["position"]); auto position = readPosition(config["position"]);
auto image = config["image"].String(); auto image = AnimationPath::fromJson(config["image"]);
ui8 flags = 0; ui8 flags = 0;
if(!config["repeat"].Bool()) if(!config["repeat"].Bool())
flags |= CShowableAnim::EFlags::PLAY_ONCE; flags |= CShowableAnim::EFlags::PLAY_ONCE;

View File

@ -65,18 +65,17 @@ CBonusSelection::CBonusSelection()
{ {
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE; OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
std::string bgName = getCampaign()->getRegions().getBackgroundName(); setBackground(getCampaign()->getRegions().getBackgroundName());
setBackground(bgName);
panelBackground = std::make_shared<CPicture>("CAMPBRF.BMP", 456, 6); panelBackground = std::make_shared<CPicture>(ImagePath::builtin("CAMPBRF.BMP"), 456, 6);
buttonStart = std::make_shared<CButton>(Point(475, 536), "CBBEGIB.DEF", CButton::tooltip(), std::bind(&CBonusSelection::startMap, this), EShortcut::GLOBAL_ACCEPT); buttonStart = std::make_shared<CButton>(Point(475, 536), AnimationPath::builtin("CBBEGIB.DEF"), CButton::tooltip(), std::bind(&CBonusSelection::startMap, this), EShortcut::GLOBAL_ACCEPT);
buttonRestart = std::make_shared<CButton>(Point(475, 536), "CBRESTB.DEF", CButton::tooltip(), std::bind(&CBonusSelection::restartMap, this), EShortcut::GLOBAL_ACCEPT); buttonRestart = std::make_shared<CButton>(Point(475, 536), AnimationPath::builtin("CBRESTB.DEF"), CButton::tooltip(), std::bind(&CBonusSelection::restartMap, this), EShortcut::GLOBAL_ACCEPT);
buttonBack = std::make_shared<CButton>(Point(624, 536), "CBCANCB.DEF", CButton::tooltip(), std::bind(&CBonusSelection::goBack, this), EShortcut::GLOBAL_CANCEL); buttonBack = std::make_shared<CButton>(Point(624, 536), AnimationPath::builtin("CBCANCB.DEF"), CButton::tooltip(), std::bind(&CBonusSelection::goBack, this), EShortcut::GLOBAL_CANCEL);
campaignName = std::make_shared<CLabel>(481, 28, FONT_BIG, ETextAlignment::TOPLEFT, Colors::YELLOW, CSH->si->getCampaignName()); campaignName = std::make_shared<CLabel>(481, 28, FONT_BIG, ETextAlignment::TOPLEFT, Colors::YELLOW, CSH->si->getCampaignName());
iconsMapSizes = std::make_shared<CAnimImage>("SCNRMPSZ", 4, 0, 735, 26); iconsMapSizes = std::make_shared<CAnimImage>(AnimationPath::builtin("SCNRMPSZ"), 4, 0, 735, 26);
labelCampaignDescription = std::make_shared<CLabel>(481, 63, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::YELLOW, CGI->generaltexth->allTexts[38]); labelCampaignDescription = std::make_shared<CLabel>(481, 63, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::YELLOW, CGI->generaltexth->allTexts[38]);
campaignDescription = std::make_shared<CTextBox>(getCampaign()->getDescription(), Rect(480, 86, 286, 117), 1); campaignDescription = std::make_shared<CTextBox>(getCampaign()->getDescription(), Rect(480, 86, 286, 117), 1);
@ -97,13 +96,13 @@ CBonusSelection::CBonusSelection()
for(size_t b = 0; b < difficultyIcons.size(); ++b) for(size_t b = 0; b < difficultyIcons.size(); ++b)
{ {
difficultyIcons[b] = std::make_shared<CAnimImage>("GSPBUT" + std::to_string(b + 3) + ".DEF", 0, 0, 709, 455); difficultyIcons[b] = std::make_shared<CAnimImage>(AnimationPath::builtinTODO("GSPBUT" + std::to_string(b + 3) + ".DEF"), 0, 0, 709, 455);
} }
if(getCampaign()->playerSelectedDifficulty()) if(getCampaign()->playerSelectedDifficulty())
{ {
buttonDifficultyLeft = std::make_shared<CButton>(Point(694, 508), "SCNRBLF.DEF", CButton::tooltip(), std::bind(&CBonusSelection::decreaseDifficulty, this)); buttonDifficultyLeft = std::make_shared<CButton>(Point(694, 508), AnimationPath::builtin("SCNRBLF.DEF"), CButton::tooltip(), std::bind(&CBonusSelection::decreaseDifficulty, this));
buttonDifficultyRight = std::make_shared<CButton>(Point(738, 508), "SCNRBRT.DEF", CButton::tooltip(), std::bind(&CBonusSelection::increaseDifficulty, this)); buttonDifficultyRight = std::make_shared<CButton>(Point(738, 508), AnimationPath::builtin("SCNRBRT.DEF"), CButton::tooltip(), std::bind(&CBonusSelection::increaseDifficulty, this));
} }
for(auto scenarioID : getCampaign()->allScenarios()) for(auto scenarioID : getCampaign()->allScenarios())
@ -302,7 +301,7 @@ void CBonusSelection::createBonusesIcons()
break; break;
} }
std::shared_ptr<CToggleButton> bonusButton = std::make_shared<CToggleButton>(Point(475 + i * 68, 455), "", CButton::tooltip(desc, desc)); std::shared_ptr<CToggleButton> bonusButton = std::make_shared<CToggleButton>(Point(475 + i * 68, 455), AnimationPath(), CButton::tooltip(desc, desc));
if(picNumber != -1) if(picNumber != -1)
picName += ":" + std::to_string(picNumber); picName += ":" + std::to_string(picNumber);

View File

@ -43,17 +43,17 @@ CLobbyScreen::CLobbyScreen(ESelectionScreen screenType)
{ {
tabSel->callOnSelect = std::bind(&IServerAPI::setMapInfo, CSH, _1, nullptr); tabSel->callOnSelect = std::bind(&IServerAPI::setMapInfo, CSH, _1, nullptr);
buttonSelect = std::make_shared<CButton>(Point(411, 80), "GSPBUTT.DEF", CGI->generaltexth->zelp[45], 0, EShortcut::LOBBY_SELECT_SCENARIO); buttonSelect = std::make_shared<CButton>(Point(411, 80), AnimationPath::builtin("GSPBUTT.DEF"), CGI->generaltexth->zelp[45], 0, EShortcut::LOBBY_SELECT_SCENARIO);
buttonSelect->addCallback([&]() buttonSelect->addCallback([&]()
{ {
toggleTab(tabSel); toggleTab(tabSel);
CSH->setMapInfo(tabSel->getSelectedMapInfo()); CSH->setMapInfo(tabSel->getSelectedMapInfo());
}); });
buttonOptions = std::make_shared<CButton>(Point(411, 510), "GSPBUTT.DEF", CGI->generaltexth->zelp[46], std::bind(&CLobbyScreen::toggleTab, this, tabOpt), EShortcut::LOBBY_ADDITIONAL_OPTIONS); buttonOptions = std::make_shared<CButton>(Point(411, 510), AnimationPath::builtin("GSPBUTT.DEF"), CGI->generaltexth->zelp[46], std::bind(&CLobbyScreen::toggleTab, this, tabOpt), EShortcut::LOBBY_ADDITIONAL_OPTIONS);
}; };
buttonChat = std::make_shared<CButton>(Point(619, 80), "GSPBUT2.DEF", CGI->generaltexth->zelp[48], std::bind(&CLobbyScreen::toggleChat, this), EShortcut::LOBBY_HIDE_CHAT); buttonChat = std::make_shared<CButton>(Point(619, 80), AnimationPath::builtin("GSPBUT2.DEF"), CGI->generaltexth->zelp[48], std::bind(&CLobbyScreen::toggleChat, this), EShortcut::LOBBY_HIDE_CHAT);
buttonChat->addTextOverlay(CGI->generaltexth->allTexts[532], FONT_SMALL, Colors::WHITE); buttonChat->addTextOverlay(CGI->generaltexth->allTexts[532], FONT_SMALL, Colors::WHITE);
switch(screenType) switch(screenType)
@ -63,7 +63,7 @@ CLobbyScreen::CLobbyScreen(ESelectionScreen screenType)
tabOpt = std::make_shared<OptionsTab>(); tabOpt = std::make_shared<OptionsTab>();
tabRand = std::make_shared<RandomMapTab>(); tabRand = std::make_shared<RandomMapTab>();
tabRand->mapInfoChanged += std::bind(&IServerAPI::setMapInfo, CSH, _1, _2); tabRand->mapInfoChanged += std::bind(&IServerAPI::setMapInfo, CSH, _1, _2);
buttonRMG = std::make_shared<CButton>(Point(411, 105), "GSPBUTT.DEF", CGI->generaltexth->zelp[47], 0, EShortcut::LOBBY_RANDOM_MAP); buttonRMG = std::make_shared<CButton>(Point(411, 105), AnimationPath::builtin("GSPBUTT.DEF"), CGI->generaltexth->zelp[47], 0, EShortcut::LOBBY_RANDOM_MAP);
buttonRMG->addCallback([&]() buttonRMG->addCallback([&]()
{ {
toggleTab(tabRand); toggleTab(tabRand);
@ -72,24 +72,24 @@ CLobbyScreen::CLobbyScreen(ESelectionScreen screenType)
card->iconDifficulty->addCallback(std::bind(&IServerAPI::setDifficulty, CSH, _1)); card->iconDifficulty->addCallback(std::bind(&IServerAPI::setDifficulty, CSH, _1));
buttonStart = std::make_shared<CButton>(Point(411, 535), "SCNRBEG.DEF", CGI->generaltexth->zelp[103], std::bind(&CLobbyScreen::startScenario, this, true), EShortcut::LOBBY_BEGIN_GAME); buttonStart = std::make_shared<CButton>(Point(411, 535), AnimationPath::builtin("SCNRBEG.DEF"), CGI->generaltexth->zelp[103], std::bind(&CLobbyScreen::startScenario, this, true), EShortcut::LOBBY_BEGIN_GAME);
initLobby(); initLobby();
break; break;
} }
case ESelectionScreen::loadGame: case ESelectionScreen::loadGame:
{ {
tabOpt = std::make_shared<OptionsTab>(); tabOpt = std::make_shared<OptionsTab>();
buttonStart = std::make_shared<CButton>(Point(411, 535), "SCNRLOD.DEF", CGI->generaltexth->zelp[103], std::bind(&CLobbyScreen::startScenario, this, true), EShortcut::LOBBY_LOAD_GAME); buttonStart = std::make_shared<CButton>(Point(411, 535), AnimationPath::builtin("SCNRLOD.DEF"), CGI->generaltexth->zelp[103], std::bind(&CLobbyScreen::startScenario, this, true), EShortcut::LOBBY_LOAD_GAME);
initLobby(); initLobby();
break; break;
} }
case ESelectionScreen::campaignList: case ESelectionScreen::campaignList:
tabSel->callOnSelect = std::bind(&IServerAPI::setMapInfo, CSH, _1, nullptr); tabSel->callOnSelect = std::bind(&IServerAPI::setMapInfo, CSH, _1, nullptr);
buttonStart = std::make_shared<CButton>(Point(411, 535), "SCNRLOD.DEF", CButton::tooltip(), std::bind(&CLobbyScreen::startCampaign, this), EShortcut::LOBBY_BEGIN_GAME); buttonStart = std::make_shared<CButton>(Point(411, 535), AnimationPath::builtin("SCNRLOD.DEF"), CButton::tooltip(), std::bind(&CLobbyScreen::startCampaign, this), EShortcut::LOBBY_BEGIN_GAME);
break; break;
} }
buttonBack = std::make_shared<CButton>(Point(581, 535), "SCNRBACK.DEF", CGI->generaltexth->zelp[105], [&]() buttonBack = std::make_shared<CButton>(Point(581, 535), AnimationPath::builtin("SCNRBACK.DEF"), CGI->generaltexth->zelp[105], [&]()
{ {
CSH->sendClientDisconnecting(); CSH->sendClientDisconnecting();
close(); close();

View File

@ -40,7 +40,7 @@ CSavingScreen::CSavingScreen()
tabSel->toggleMode(); tabSel->toggleMode();
curTab = tabSel; curTab = tabSel;
buttonStart = std::make_shared<CButton>(Point(411, 535), "SCNRSAV.DEF", CGI->generaltexth->zelp[103], std::bind(&CSavingScreen::saveGame, this), EShortcut::LOBBY_SAVE_GAME); buttonStart = std::make_shared<CButton>(Point(411, 535), AnimationPath::builtin("SCNRSAV.DEF"), CGI->generaltexth->zelp[103], std::bind(&CSavingScreen::saveGame, this), EShortcut::LOBBY_SAVE_GAME);
} }
const CMapInfo * CSavingScreen::getMapInfo() const CMapInfo * CSavingScreen::getMapInfo()
@ -80,7 +80,7 @@ void CSavingScreen::saveGame()
close(); close();
}; };
if(CResourceHandler::get("local")->existsResource(ResourceID(path, EResType::SAVEGAME))) if(CResourceHandler::get("local")->existsResource(ResourcePath(path, EResType::SAVEGAME)))
{ {
std::string hlp = CGI->generaltexth->allTexts[493]; //%s exists. Overwrite? std::string hlp = CGI->generaltexth->allTexts[493]; //%s exists. Overwrite?
boost::algorithm::replace_first(hlp, "%s", tabSel->inputName->getText()); boost::algorithm::replace_first(hlp, "%s", tabSel->inputName->getText());

View File

@ -45,7 +45,7 @@ CScenarioInfoScreen::CScenarioInfoScreen()
card->changeSelection(); card->changeSelection();
card->iconDifficulty->setSelected(getCurrentDifficulty()); card->iconDifficulty->setSelected(getCurrentDifficulty());
buttonBack = std::make_shared<CButton>(Point(584, 535), "SCNRBACK.DEF", CGI->generaltexth->zelp[105], [=](){ close();}, EShortcut::GLOBAL_CANCEL); buttonBack = std::make_shared<CButton>(Point(584, 535), AnimationPath::builtin("SCNRBACK.DEF"), CGI->generaltexth->zelp[105], [=](){ close();}, EShortcut::GLOBAL_CANCEL);
} }
CScenarioInfoScreen::~CScenarioInfoScreen() CScenarioInfoScreen::~CScenarioInfoScreen()

View File

@ -80,16 +80,16 @@ CSelectionBase::CSelectionBase(ESelectionScreen type)
pos.h = 584; pos.h = 584;
if(screenType == ESelectionScreen::campaignList) if(screenType == ESelectionScreen::campaignList)
{ {
setBackground("CamCust.bmp"); setBackground(ImagePath::builtin("CamCust.bmp"));
} }
else else
{ {
const JsonVector & bgNames = CMainMenuConfig::get().getConfig()["game-select"].Vector(); const JsonVector & bgNames = CMainMenuConfig::get().getConfig()["game-select"].Vector();
setBackground(RandomGeneratorUtil::nextItem(bgNames, CRandomGenerator::getDefault())->String()); setBackground(ImagePath::fromJson(*RandomGeneratorUtil::nextItem(bgNames, CRandomGenerator::getDefault())));
} }
pos = background->center(); pos = background->center();
card = std::make_shared<InfoCard>(); card = std::make_shared<InfoCard>();
buttonBack = std::make_shared<CButton>(Point(581, 535), "SCNRBACK.DEF", CGI->generaltexth->zelp[105], [=](){ close();}, EShortcut::GLOBAL_CANCEL); buttonBack = std::make_shared<CButton>(Point(581, 535), AnimationPath::builtin("SCNRBACK.DEF"), CGI->generaltexth->zelp[105], [=](){ close();}, EShortcut::GLOBAL_CANCEL);
} }
void CSelectionBase::toggleTab(std::shared_ptr<CIntObject> tab) void CSelectionBase::toggleTab(std::shared_ptr<CIntObject> tab)
@ -125,7 +125,7 @@ InfoCard::InfoCard()
mapName = std::make_shared<CLabel>(26, 39, FONT_BIG, ETextAlignment::TOPLEFT, Colors::YELLOW); mapName = std::make_shared<CLabel>(26, 39, FONT_BIG, ETextAlignment::TOPLEFT, Colors::YELLOW);
Rect descriptionRect(26, 149, 320, 115); Rect descriptionRect(26, 149, 320, 115);
mapDescription = std::make_shared<CTextBox>("", descriptionRect, 1); mapDescription = std::make_shared<CTextBox>("", descriptionRect, 1);
playerListBg = std::make_shared<CPicture>("CHATPLUG.bmp", 16, 276); playerListBg = std::make_shared<CPicture>(ImagePath::builtin("CHATPLUG.bmp"), 16, 276);
chat = std::make_shared<CChatBox>(Rect(26, 132, 340, 132)); chat = std::make_shared<CChatBox>(Rect(26, 132, 340, 132));
if(SEL->screenType == ESelectionScreen::campaignList) if(SEL->screenType == ESelectionScreen::campaignList)
@ -134,14 +134,14 @@ InfoCard::InfoCard()
} }
else else
{ {
background = std::make_shared<CPicture>("GSELPOP1.bmp", 0, 0); background = std::make_shared<CPicture>(ImagePath::builtin("GSELPOP1.bmp"), 0, 0);
parent->addChild(background.get()); parent->addChild(background.get());
auto it = vstd::find(parent->children, this); //our position among parent children auto it = vstd::find(parent->children, this); //our position among parent children
parent->children.insert(it, background.get()); //put BG before us parent->children.insert(it, background.get()); //put BG before us
parent->children.pop_back(); parent->children.pop_back();
pos.w = background->pos.w; pos.w = background->pos.w;
pos.h = background->pos.h; pos.h = background->pos.h;
iconsMapSizes = std::make_shared<CAnimImage>("SCNRMPSZ", 4, 0, 318, 22); //let it be custom size (frame 4) by default iconsMapSizes = std::make_shared<CAnimImage>(AnimationPath::builtin("SCNRMPSZ"), 4, 0, 318, 22); //let it be custom size (frame 4) by default
iconDifficulty = std::make_shared<CToggleGroup>(0); iconDifficulty = std::make_shared<CToggleGroup>(0);
{ {
@ -149,7 +149,7 @@ InfoCard::InfoCard()
for(int i = 0; i < 5; i++) for(int i = 0; i < 5; i++)
{ {
auto button = std::make_shared<CToggleButton>(Point(110 + i * 32, 450), difButns[i], CGI->generaltexth->zelp[24 + i]); auto button = std::make_shared<CToggleButton>(Point(110 + i * 32, 450), AnimationPath::builtin(difButns[i]), CGI->generaltexth->zelp[24 + i]);
iconDifficulty->addToggle(i, button); iconDifficulty->addToggle(i, button);
if(SEL->screenType != ESelectionScreen::newGame) if(SEL->screenType != ESelectionScreen::newGame)
@ -165,8 +165,8 @@ InfoCard::InfoCard()
labelScenarioDescription = std::make_shared<CLabel>(26, 132, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::YELLOW, CGI->generaltexth->allTexts[496]); labelScenarioDescription = std::make_shared<CLabel>(26, 132, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::YELLOW, CGI->generaltexth->allTexts[496]);
labelVictoryCondition = std::make_shared<CLabel>(26, 283, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::YELLOW, CGI->generaltexth->allTexts[497]); labelVictoryCondition = std::make_shared<CLabel>(26, 283, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::YELLOW, CGI->generaltexth->allTexts[497]);
labelLossCondition = std::make_shared<CLabel>(26, 339, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::YELLOW, CGI->generaltexth->allTexts[498]); labelLossCondition = std::make_shared<CLabel>(26, 339, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::YELLOW, CGI->generaltexth->allTexts[498]);
iconsVictoryCondition = std::make_shared<CAnimImage>("SCNRVICT", 0, 0, 24, 302); iconsVictoryCondition = std::make_shared<CAnimImage>(AnimationPath::builtin("SCNRVICT"), 0, 0, 24, 302);
iconsLossCondition = std::make_shared<CAnimImage>("SCNRLOSS", 0, 0, 24, 359); iconsLossCondition = std::make_shared<CAnimImage>(AnimationPath::builtin("SCNRLOSS"), 0, 0, 24, 359);
labelVictoryConditionText = std::make_shared<CLabel>(60, 307, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE); labelVictoryConditionText = std::make_shared<CLabel>(60, 307, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE);
labelLossConditionText = std::make_shared<CLabel>(60, 366, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE); labelLossConditionText = std::make_shared<CLabel>(60, 366, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE);
@ -356,7 +356,7 @@ CFlagBox::CFlagBox(const Rect & rect)
labelAllies = std::make_shared<CLabel>(0, 0, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->allTexts[390] + ":"); labelAllies = std::make_shared<CLabel>(0, 0, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->allTexts[390] + ":");
labelEnemies = std::make_shared<CLabel>(133, 0, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->allTexts[391] + ":"); labelEnemies = std::make_shared<CLabel>(133, 0, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->allTexts[391] + ":");
iconsTeamFlags = std::make_shared<CAnimation>("ITGFLAGS.DEF"); iconsTeamFlags = std::make_shared<CAnimation>(AnimationPath::builtin("ITGFLAGS.DEF"));
iconsTeamFlags->preload(); iconsTeamFlags->preload();
} }
@ -390,7 +390,7 @@ void CFlagBox::showPopupWindow(const Point & cursorPosition)
} }
CFlagBox::CFlagBoxTooltipBox::CFlagBoxTooltipBox(std::shared_ptr<CAnimation> icons) CFlagBox::CFlagBoxTooltipBox::CFlagBoxTooltipBox(std::shared_ptr<CAnimation> icons)
: CWindowObject(BORDERED | RCLICK_POPUP | SHADOW_DISABLED, "DIBOXBCK") : CWindowObject(BORDERED | RCLICK_POPUP | SHADOW_DISABLED, ImagePath::builtin("DIBOXBCK"))
{ {
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE; OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;

View File

@ -137,7 +137,7 @@ OptionsTab::OptionsTab() : humanPlayers(0)
} }
}); });
const JsonNode config(ResourceID("config/widgets/optionsTab.json")); const JsonNode config(ResourcePath("config/widgets/optionsTab.json"));
build(config); build(config);
//set timers combo box callbacks //set timers combo box callbacks
@ -343,18 +343,18 @@ size_t OptionsTab::CPlayerSettingsHelper::getImageIndex(bool big)
return 0; return 0;
} }
std::string OptionsTab::CPlayerSettingsHelper::getImageName(bool big) AnimationPath OptionsTab::CPlayerSettingsHelper::getImageName(bool big)
{ {
switch(type) switch(type)
{ {
case OptionsTab::TOWN: case OptionsTab::TOWN:
return big ? "ITPt": "ITPA"; return AnimationPath::builtin(big ? "ITPt": "ITPA");
case OptionsTab::HERO: case OptionsTab::HERO:
return big ? "PortraitsLarge": "PortraitsSmall"; return AnimationPath::builtin(big ? "PortraitsLarge": "PortraitsSmall");
case OptionsTab::BONUS: case OptionsTab::BONUS:
return "SCNRSTAR"; return AnimationPath::builtin("SCNRSTAR");
} }
return ""; return {};
} }
std::string OptionsTab::CPlayerSettingsHelper::getName() std::string OptionsTab::CPlayerSettingsHelper::getName()
@ -553,7 +553,7 @@ OptionsTab::CPlayerOptionTooltipBox::CPlayerOptionTooltipBox(CPlayerSettingsHelp
void OptionsTab::CPlayerOptionTooltipBox::genHeader() void OptionsTab::CPlayerOptionTooltipBox::genHeader()
{ {
backgroundTexture = std::make_shared<CFilledTexture>("DIBOXBCK", pos); backgroundTexture = std::make_shared<CFilledTexture>(ImagePath::builtin("DIBOXBCK"), pos);
updateShadow(); updateShadow();
labelTitle = std::make_shared<CLabel>(pos.w / 2 + 8, 21, FONT_MEDIUM, ETextAlignment::CENTER, Colors::YELLOW, getTitle()); labelTitle = std::make_shared<CLabel>(pos.w / 2 + 8, 21, FONT_MEDIUM, ETextAlignment::CENTER, Colors::YELLOW, getTitle());
@ -585,7 +585,7 @@ void OptionsTab::CPlayerOptionTooltipBox::genHeroWindow()
labelHeroSpeciality = std::make_shared<CLabel>(pos.w / 2 + 4, 117, FONT_MEDIUM, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[78]); labelHeroSpeciality = std::make_shared<CLabel>(pos.w / 2 + 4, 117, FONT_MEDIUM, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[78]);
auto heroIndex = settings.hero.getNum() >= CGI->heroh->size() ? 0 : settings.hero.getNum(); auto heroIndex = settings.hero.getNum() >= CGI->heroh->size() ? 0 : settings.hero.getNum();
imageSpeciality = std::make_shared<CAnimImage>("UN44", (*CGI->heroh)[heroIndex]->imageIndex, 0, pos.w / 2 - 22, 134); imageSpeciality = std::make_shared<CAnimImage>(AnimationPath::builtin("UN44"), (*CGI->heroh)[heroIndex]->imageIndex, 0, pos.w / 2 - 22, 134);
labelSpecialityName = std::make_shared<CLabel>(pos.w / 2, 188, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, (*CGI->heroh)[heroIndex]->getSpecialtyNameTranslated()); labelSpecialityName = std::make_shared<CLabel>(pos.w / 2, 188, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, (*CGI->heroh)[heroIndex]->getSpecialtyNameTranslated());
} }
@ -717,7 +717,7 @@ void OptionsTab::SelectionWindow::recreate()
pos = Rect(0, 0, x, y); pos = Rect(0, 0, x, y);
backgroundTexture = std::make_shared<FilledTexturePlayerColored>("DiBoxBck", pos); backgroundTexture = std::make_shared<FilledTexturePlayerColored>(ImagePath::builtin("DiBoxBck"), pos);
backgroundTexture->playerColored(PlayerColor(1)); backgroundTexture->playerColored(PlayerColor(1));
updateShadow(); updateShadow();
@ -747,7 +747,7 @@ void OptionsTab::SelectionWindow::genContentGrid(int lines)
{ {
for(int x = 0; x < elementsPerLine; x++) for(int x = 0; x < elementsPerLine; x++)
{ {
components.push_back(std::make_shared<CPicture>("lobby/townBorderBig", x * (ICON_BIG_WIDTH-1), y * (ICON_BIG_HEIGHT-1))); components.push_back(std::make_shared<CPicture>(ImagePath::builtin("lobby/townBorderBig"), x * (ICON_BIG_WIDTH-1), y * (ICON_BIG_HEIGHT-1)));
} }
} }
} }
@ -763,7 +763,7 @@ void OptionsTab::SelectionWindow::genContentFactions()
components.push_back(std::make_shared<CAnimImage>(helper.getImageName(), helper.getImageIndex(), 0, 6, (ICON_SMALL_HEIGHT/2))); components.push_back(std::make_shared<CAnimImage>(helper.getImageName(), helper.getImageIndex(), 0, 6, (ICON_SMALL_HEIGHT/2)));
drawOutlinedText(TEXT_POS_X, TEXT_POS_Y, (selectedFaction.getNum() == PlayerSettings::RANDOM) ? Colors::YELLOW : Colors::WHITE, helper.getName()); drawOutlinedText(TEXT_POS_X, TEXT_POS_Y, (selectedFaction.getNum() == PlayerSettings::RANDOM) ? Colors::YELLOW : Colors::WHITE, helper.getName());
if(selectedFaction.getNum() == PlayerSettings::RANDOM) if(selectedFaction.getNum() == PlayerSettings::RANDOM)
components.push_back(std::make_shared<CPicture>("lobby/townBorderSmallActivated", 6, (ICON_SMALL_HEIGHT/2))); components.push_back(std::make_shared<CPicture>(ImagePath::builtin("lobby/townBorderSmallActivated"), 6, (ICON_SMALL_HEIGHT/2)));
for(auto & elem : allowedFactions) for(auto & elem : allowedFactions)
{ {
@ -776,7 +776,7 @@ void OptionsTab::SelectionWindow::genContentFactions()
CPlayerSettingsHelper helper = CPlayerSettingsHelper(set, SelType::TOWN); CPlayerSettingsHelper helper = CPlayerSettingsHelper(set, SelType::TOWN);
components.push_back(std::make_shared<CAnimImage>(helper.getImageName(true), helper.getImageIndex(true), 0, x * (ICON_BIG_WIDTH-1), y * (ICON_BIG_HEIGHT-1))); components.push_back(std::make_shared<CAnimImage>(helper.getImageName(true), helper.getImageIndex(true), 0, x * (ICON_BIG_WIDTH-1), y * (ICON_BIG_HEIGHT-1)));
components.push_back(std::make_shared<CPicture>(selectedFaction == elem ? "lobby/townBorderBigActivated" : "lobby/townBorderBig", x * (ICON_BIG_WIDTH-1), y * (ICON_BIG_HEIGHT-1))); components.push_back(std::make_shared<CPicture>(ImagePath::builtin(selectedFaction == elem ? "lobby/townBorderBigActivated" : "lobby/townBorderBig"), x * (ICON_BIG_WIDTH-1), y * (ICON_BIG_HEIGHT-1)));
drawOutlinedText(x * (ICON_BIG_WIDTH-1) + TEXT_POS_X, y * (ICON_BIG_HEIGHT-1) + TEXT_POS_Y, (selectedFaction == elem) ? Colors::YELLOW : Colors::WHITE, helper.getName()); drawOutlinedText(x * (ICON_BIG_WIDTH-1) + TEXT_POS_X, y * (ICON_BIG_HEIGHT-1) + TEXT_POS_Y, (selectedFaction == elem) ? Colors::YELLOW : Colors::WHITE, helper.getName());
factions.push_back(elem); factions.push_back(elem);
@ -795,7 +795,7 @@ void OptionsTab::SelectionWindow::genContentHeroes()
components.push_back(std::make_shared<CAnimImage>(helper.getImageName(), helper.getImageIndex(), 0, 6, (ICON_SMALL_HEIGHT/2))); components.push_back(std::make_shared<CAnimImage>(helper.getImageName(), helper.getImageIndex(), 0, 6, (ICON_SMALL_HEIGHT/2)));
drawOutlinedText(TEXT_POS_X, TEXT_POS_Y, (selectedHero.getNum() == PlayerSettings::RANDOM) ? Colors::YELLOW : Colors::WHITE, helper.getName()); drawOutlinedText(TEXT_POS_X, TEXT_POS_Y, (selectedHero.getNum() == PlayerSettings::RANDOM) ? Colors::YELLOW : Colors::WHITE, helper.getName());
if(selectedHero.getNum() == PlayerSettings::RANDOM) if(selectedHero.getNum() == PlayerSettings::RANDOM)
components.push_back(std::make_shared<CPicture>("lobby/townBorderSmallActivated", 6, (ICON_SMALL_HEIGHT/2))); components.push_back(std::make_shared<CPicture>(ImagePath::builtin("lobby/townBorderSmallActivated"), 6, (ICON_SMALL_HEIGHT/2)));
for(auto & elem : allowedHeroes) for(auto & elem : allowedHeroes)
{ {
@ -814,11 +814,11 @@ void OptionsTab::SelectionWindow::genContentHeroes()
components.push_back(std::make_shared<CAnimImage>(helper.getImageName(true), helper.getImageIndex(true), 0, x * (ICON_BIG_WIDTH-1), y * (ICON_BIG_HEIGHT-1))); components.push_back(std::make_shared<CAnimImage>(helper.getImageName(true), helper.getImageIndex(true), 0, x * (ICON_BIG_WIDTH-1), y * (ICON_BIG_HEIGHT-1)));
drawOutlinedText(x * (ICON_BIG_WIDTH-1) + TEXT_POS_X, y * (ICON_BIG_HEIGHT-1) + TEXT_POS_Y, (selectedHero == elem) ? Colors::YELLOW : Colors::WHITE, helper.getName()); drawOutlinedText(x * (ICON_BIG_WIDTH-1) + TEXT_POS_X, y * (ICON_BIG_HEIGHT-1) + TEXT_POS_Y, (selectedHero == elem) ? Colors::YELLOW : Colors::WHITE, helper.getName());
std::string image = "lobby/townBorderBig"; ImagePath image = ImagePath::builtin("lobby/townBorderBig");
if(selectedHero == elem) if(selectedHero == elem)
image = "lobby/townBorderBigActivated"; image = ImagePath::builtin("lobby/townBorderBigActivated");
if(unusableHeroes.count(elem)) if(unusableHeroes.count(elem))
image = "lobby/townBorderBigGrayedOut"; image = ImagePath::builtin("lobby/townBorderBigGrayedOut");
components.push_back(std::make_shared<CPicture>(image, x * (ICON_BIG_WIDTH-1), y * (ICON_BIG_HEIGHT-1))); components.push_back(std::make_shared<CPicture>(image, x * (ICON_BIG_WIDTH-1), y * (ICON_BIG_HEIGHT-1)));
heroes.push_back(elem); heroes.push_back(elem);
@ -843,7 +843,7 @@ void OptionsTab::SelectionWindow::genContentBonus()
drawOutlinedText(x * (ICON_BIG_WIDTH-1) + TEXT_POS_X, y * (ICON_BIG_HEIGHT-1) + TEXT_POS_Y, Colors::WHITE , helper.getName()); drawOutlinedText(x * (ICON_BIG_WIDTH-1) + TEXT_POS_X, y * (ICON_BIG_HEIGHT-1) + TEXT_POS_Y, Colors::WHITE , helper.getName());
if(selectedBonus == elem) if(selectedBonus == elem)
{ {
components.push_back(std::make_shared<CPicture>("lobby/townBorderSmallActivated", x * (ICON_BIG_WIDTH-1) + 6, y * (ICON_BIG_HEIGHT-1) + (ICON_SMALL_HEIGHT/2))); components.push_back(std::make_shared<CPicture>(ImagePath::builtin("lobby/townBorderSmallActivated"), x * (ICON_BIG_WIDTH-1) + 6, y * (ICON_BIG_HEIGHT-1) + (ICON_SMALL_HEIGHT/2)));
drawOutlinedText(x * (ICON_BIG_WIDTH-1) + TEXT_POS_X, y * (ICON_BIG_HEIGHT-1) + TEXT_POS_Y, Colors::YELLOW , helper.getName()); drawOutlinedText(x * (ICON_BIG_WIDTH-1) + TEXT_POS_X, y * (ICON_BIG_HEIGHT-1) + TEXT_POS_Y, Colors::YELLOW , helper.getName());
} }
@ -1075,18 +1075,18 @@ OptionsTab::PlayerOptionsEntry::PlayerOptionsEntry(const PlayerSettings & S, con
"ADOPOPNL.bmp", "ADOPPPNL.bmp", "ADOPTPNL.bmp", "ADOPSPNL.bmp" "ADOPOPNL.bmp", "ADOPPPNL.bmp", "ADOPTPNL.bmp", "ADOPSPNL.bmp"
}}; }};
background = std::make_shared<CPicture>(bgs[s->color.getNum()], 0, 0); background = std::make_shared<CPicture>(ImagePath::builtin(bgs[s->color.getNum()]), 0, 0);
labelPlayerName = std::make_shared<CLabel>(55, 10, EFonts::FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, s->name); labelPlayerName = std::make_shared<CLabel>(55, 10, EFonts::FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, s->name);
labelWhoCanPlay = std::make_shared<CMultiLineLabel>(Rect(6, 23, 45, (int)graphics->fonts[EFonts::FONT_TINY]->getLineHeight()*2), EFonts::FONT_TINY, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->arraytxt[206 + whoCanPlay]); labelWhoCanPlay = std::make_shared<CMultiLineLabel>(Rect(6, 23, 45, (int)graphics->fonts[EFonts::FONT_TINY]->getLineHeight()*2), EFonts::FONT_TINY, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->arraytxt[206 + whoCanPlay]);
if(SEL->screenType == ESelectionScreen::newGame) if(SEL->screenType == ESelectionScreen::newGame)
{ {
buttonTownLeft = std::make_shared<CButton>(Point(107, 5), "ADOPLFA.DEF", CGI->generaltexth->zelp[132], std::bind(&IServerAPI::setPlayerOption, CSH, LobbyChangePlayerOption::TOWN, -1, s->color)); buttonTownLeft = std::make_shared<CButton>(Point(107, 5), AnimationPath::builtin("ADOPLFA.DEF"), CGI->generaltexth->zelp[132], std::bind(&IServerAPI::setPlayerOption, CSH, LobbyChangePlayerOption::TOWN, -1, s->color));
buttonTownRight = std::make_shared<CButton>(Point(168, 5), "ADOPRTA.DEF", CGI->generaltexth->zelp[133], std::bind(&IServerAPI::setPlayerOption, CSH, LobbyChangePlayerOption::TOWN, +1, s->color)); buttonTownRight = std::make_shared<CButton>(Point(168, 5), AnimationPath::builtin("ADOPRTA.DEF"), CGI->generaltexth->zelp[133], std::bind(&IServerAPI::setPlayerOption, CSH, LobbyChangePlayerOption::TOWN, +1, s->color));
buttonHeroLeft = std::make_shared<CButton>(Point(183, 5), "ADOPLFA.DEF", CGI->generaltexth->zelp[148], std::bind(&IServerAPI::setPlayerOption, CSH, LobbyChangePlayerOption::HERO, -1, s->color)); buttonHeroLeft = std::make_shared<CButton>(Point(183, 5), AnimationPath::builtin("ADOPLFA.DEF"), CGI->generaltexth->zelp[148], std::bind(&IServerAPI::setPlayerOption, CSH, LobbyChangePlayerOption::HERO, -1, s->color));
buttonHeroRight = std::make_shared<CButton>(Point(244, 5), "ADOPRTA.DEF", CGI->generaltexth->zelp[149], std::bind(&IServerAPI::setPlayerOption, CSH, LobbyChangePlayerOption::HERO, +1, s->color)); buttonHeroRight = std::make_shared<CButton>(Point(244, 5), AnimationPath::builtin("ADOPRTA.DEF"), CGI->generaltexth->zelp[149], std::bind(&IServerAPI::setPlayerOption, CSH, LobbyChangePlayerOption::HERO, +1, s->color));
buttonBonusLeft = std::make_shared<CButton>(Point(259, 5), "ADOPLFA.DEF", CGI->generaltexth->zelp[164], std::bind(&IServerAPI::setPlayerOption, CSH, LobbyChangePlayerOption::BONUS, -1, s->color)); buttonBonusLeft = std::make_shared<CButton>(Point(259, 5), AnimationPath::builtin("ADOPLFA.DEF"), CGI->generaltexth->zelp[164], std::bind(&IServerAPI::setPlayerOption, CSH, LobbyChangePlayerOption::BONUS, -1, s->color));
buttonBonusRight = std::make_shared<CButton>(Point(320, 5), "ADOPRTA.DEF", CGI->generaltexth->zelp[165], std::bind(&IServerAPI::setPlayerOption, CSH, LobbyChangePlayerOption::BONUS, +1, s->color)); buttonBonusRight = std::make_shared<CButton>(Point(320, 5), AnimationPath::builtin("ADOPRTA.DEF"), CGI->generaltexth->zelp[165], std::bind(&IServerAPI::setPlayerOption, CSH, LobbyChangePlayerOption::BONUS, +1, s->color));
} }
hideUnavailableButtons(); hideUnavailableButtons();
@ -1095,7 +1095,7 @@ OptionsTab::PlayerOptionsEntry::PlayerOptionsEntry(const PlayerSettings & S, con
{ {
flag = std::make_shared<CButton>( flag = std::make_shared<CButton>(
Point(-43, 2), Point(-43, 2),
flags[s->color.getNum()], AnimationPath::builtin(flags[s->color.getNum()]),
CGI->generaltexth->zelp[180], CGI->generaltexth->zelp[180],
std::bind(&OptionsTab::onSetPlayerClicked, &parentTab, *s) std::bind(&OptionsTab::onSetPlayerClicked, &parentTab, *s)
); );

View File

@ -62,7 +62,7 @@ private:
/// visible image settings /// visible image settings
size_t getImageIndex(bool big = false); size_t getImageIndex(bool big = false);
std::string getImageName(bool big = false); AnimationPath getImageName(bool big = false);
std::string getName(); /// name visible in options dialog std::string getName(); /// name visible in options dialog
std::string getTitle(); /// title in popup box std::string getTitle(); /// title in popup box

View File

@ -118,7 +118,7 @@ RandomMapTab::RandomMapTab():
}); });
} }
const JsonNode config(ResourceID("config/widgets/randomMapTab.json")); const JsonNode config(ResourcePath("config/widgets/randomMapTab.json"));
build(config); build(config);
//set combo box callbacks //set combo box callbacks
@ -388,7 +388,7 @@ std::vector<int> RandomMapTab::getPossibleMapSizes()
TeamAlignmentsWidget::TeamAlignmentsWidget(RandomMapTab & randomMapTab): TeamAlignmentsWidget::TeamAlignmentsWidget(RandomMapTab & randomMapTab):
InterfaceObjectConfigurable() InterfaceObjectConfigurable()
{ {
const JsonNode config(ResourceID("config/widgets/randomMapTeamsWidget.json")); const JsonNode config(ResourcePath("config/widgets/randomMapTeamsWidget.json"));
variables = config["variables"]; variables = config["variables"];
int humanPlayers = randomMapTab.obtainMapGenOptions().getPlayerCount(); int humanPlayers = randomMapTab.obtainMapGenOptions().getPlayerCount();

View File

@ -158,16 +158,16 @@ SelectionTab::SelectionTab(ESelectionScreen Type)
if(tabType != ESelectionScreen::campaignList) if(tabType != ESelectionScreen::campaignList)
{ {
sortingBy = _format; sortingBy = _format;
background = std::make_shared<CPicture>("SCSELBCK.bmp", 0, 6); background = std::make_shared<CPicture>(ImagePath::builtin("SCSELBCK.bmp"), 0, 6);
pos = background->pos; pos = background->pos;
inputName = std::make_shared<CTextInput>(inputNameRect, Point(-32, -25), "GSSTRIP.bmp", 0); inputName = std::make_shared<CTextInput>(inputNameRect, Point(-32, -25), ImagePath::builtin("GSSTRIP.bmp"), 0);
inputName->filters += CTextInput::filenameFilter; inputName->filters += CTextInput::filenameFilter;
labelMapSizes = std::make_shared<CLabel>(87, 62, FONT_SMALL, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[510]); labelMapSizes = std::make_shared<CLabel>(87, 62, FONT_SMALL, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[510]);
int sizes[] = {36, 72, 108, 144, 0}; int sizes[] = {36, 72, 108, 144, 0};
const char * filterIconNmes[] = {"SCSMBUT.DEF", "SCMDBUT.DEF", "SCLGBUT.DEF", "SCXLBUT.DEF", "SCALBUT.DEF"}; const char * filterIconNmes[] = {"SCSMBUT.DEF", "SCMDBUT.DEF", "SCLGBUT.DEF", "SCXLBUT.DEF", "SCALBUT.DEF"};
for(int i = 0; i < 5; i++) for(int i = 0; i < 5; i++)
buttonsSortBy.push_back(std::make_shared<CButton>(Point(158 + 47 * i, 46), filterIconNmes[i], CGI->generaltexth->zelp[54 + i], std::bind(&SelectionTab::filter, this, sizes[i], true))); buttonsSortBy.push_back(std::make_shared<CButton>(Point(158 + 47 * i, 46), AnimationPath::builtin(filterIconNmes[i]), CGI->generaltexth->zelp[54 + i], std::bind(&SelectionTab::filter, this, sizes[i], true)));
int xpos[] = {23, 55, 88, 121, 306, 339}; int xpos[] = {23, 55, 88, 121, 306, 339};
const char * sortIconNames[] = {"SCBUTT1.DEF", "SCBUTT2.DEF", "SCBUTCP.DEF", "SCBUTT3.DEF", "SCBUTT4.DEF", "SCBUTT5.DEF"}; const char * sortIconNames[] = {"SCBUTT1.DEF", "SCBUTT2.DEF", "SCBUTCP.DEF", "SCBUTT3.DEF", "SCBUTT4.DEF", "SCBUTT5.DEF"};
@ -177,7 +177,7 @@ SelectionTab::SelectionTab(ESelectionScreen Type)
if(criteria == _name) if(criteria == _name)
criteria = generalSortingBy; criteria = generalSortingBy;
buttonsSortBy.push_back(std::make_shared<CButton>(Point(xpos[i], 86), sortIconNames[i], CGI->generaltexth->zelp[107 + i], std::bind(&SelectionTab::sortBy, this, criteria))); buttonsSortBy.push_back(std::make_shared<CButton>(Point(xpos[i], 86), AnimationPath::builtin(sortIconNames[i]), CGI->generaltexth->zelp[107 + i], std::bind(&SelectionTab::sortBy, this, criteria)));
} }
} }
@ -203,17 +203,17 @@ SelectionTab::SelectionTab(ESelectionScreen Type)
pos.x += 3; pos.x += 3;
pos.y += 6; pos.y += 6;
buttonsSortBy.push_back(std::make_shared<CButton>(Point(23, 86), "CamCusM.DEF", CButton::tooltip(), std::bind(&SelectionTab::sortBy, this, _numOfMaps))); buttonsSortBy.push_back(std::make_shared<CButton>(Point(23, 86), AnimationPath::builtin("CamCusM.DEF"), CButton::tooltip(), std::bind(&SelectionTab::sortBy, this, _numOfMaps)));
buttonsSortBy.push_back(std::make_shared<CButton>(Point(55, 86), "CamCusL.DEF", CButton::tooltip(), std::bind(&SelectionTab::sortBy, this, _name))); buttonsSortBy.push_back(std::make_shared<CButton>(Point(55, 86), AnimationPath::builtin("CamCusL.DEF"), CButton::tooltip(), std::bind(&SelectionTab::sortBy, this, _name)));
break; break;
default: default:
assert(0); assert(0);
break; break;
} }
iconsMapFormats = std::make_shared<CAnimation>("SCSELC.DEF"); iconsMapFormats = std::make_shared<CAnimation>(AnimationPath::builtin("SCSELC.DEF"));
iconsVictoryCondition = std::make_shared<CAnimation>("SCNRVICT.DEF"); iconsVictoryCondition = std::make_shared<CAnimation>(AnimationPath::builtin("SCNRVICT.DEF"));
iconsLossCondition = std::make_shared<CAnimation>("SCNRLOSS.DEF"); iconsLossCondition = std::make_shared<CAnimation>(AnimationPath::builtin("SCNRLOSS.DEF"));
for(int i = 0; i < positionsToShow; i++) for(int i = 0; i < positionsToShow; i++)
listItems.push_back(std::make_shared<ListItem>(Point(30, 129 + i * 25), iconsMapFormats, iconsVictoryCondition, iconsLossCondition)); listItems.push_back(std::make_shared<ListItem>(Point(30, 129 + i * 25), iconsMapFormats, iconsVictoryCondition, iconsLossCondition));
@ -244,7 +244,7 @@ void SelectionTab::toggleMode()
{ {
inputName->disable(); inputName->disable();
auto files = getFiles("Maps/", EResType::MAP); auto files = getFiles("Maps/", EResType::MAP);
files.erase(ResourceID("Maps/Tutorial.tut", EResType::MAP)); files.erase(ResourcePath("Maps/Tutorial.tut", EResType::MAP));
parseMaps(files); parseMaps(files);
break; break;
} }
@ -367,7 +367,7 @@ void SelectionTab::showPopupWindow(const Point & cursorPosition)
if(curItems[py]->date != "") if(curItems[py]->date != "")
text += boost::str(boost::format("\r\n\r\n%1%:\r\n%2%") % CGI->generaltexth->translate("vcmi.lobby.creationDate") % curItems[py]->date); text += boost::str(boost::format("\r\n\r\n%1%:\r\n%2%") % CGI->generaltexth->translate("vcmi.lobby.creationDate") % curItems[py]->date);
GH.windows().createAndPushWindow<CMapInfoTooltipBox>(text, ResourceID(curItems[py]->fileURI), tabType); GH.windows().createAndPushWindow<CMapInfoTooltipBox>(text, ResourcePath(curItems[py]->fileURI), tabType);
} }
} }
@ -556,7 +556,7 @@ void SelectionTab::select(int position)
if(inputName && inputName->isActive()) if(inputName && inputName->isActive())
{ {
auto filename = *CResourceHandler::get()->getResourceName(ResourceID(curItems[py]->fileURI, EResType::SAVEGAME)); auto filename = *CResourceHandler::get()->getResourceName(ResourcePath(curItems[py]->fileURI, EResType::SAVEGAME));
inputName->setText(filename.stem().string()); inputName->setText(filename.stem().string());
} }
@ -723,7 +723,7 @@ bool SelectionTab::isMapSupported(const CMapInfo & info)
return false; return false;
} }
void SelectionTab::parseMaps(const std::unordered_set<ResourceID> & files) void SelectionTab::parseMaps(const std::unordered_set<ResourcePath> & files)
{ {
logGlobal->debug("Parsing %d maps", files.size()); logGlobal->debug("Parsing %d maps", files.size());
allItems.clear(); allItems.clear();
@ -744,7 +744,7 @@ void SelectionTab::parseMaps(const std::unordered_set<ResourceID> & files)
} }
} }
void SelectionTab::parseSaves(const std::unordered_set<ResourceID> & files) void SelectionTab::parseSaves(const std::unordered_set<ResourcePath> & files)
{ {
for(auto & file : files) for(auto & file : files)
{ {
@ -786,7 +786,7 @@ void SelectionTab::parseSaves(const std::unordered_set<ResourceID> & files)
} }
} }
void SelectionTab::parseCampaigns(const std::unordered_set<ResourceID> & files) void SelectionTab::parseCampaigns(const std::unordered_set<ResourcePath> & files)
{ {
allItems.reserve(files.size()); allItems.reserve(files.size());
for(auto & file : files) for(auto & file : files)
@ -800,7 +800,7 @@ void SelectionTab::parseCampaigns(const std::unordered_set<ResourceID> & files)
} }
} }
std::unordered_set<ResourceID> SelectionTab::getFiles(std::string dirURI, int resType) std::unordered_set<ResourcePath> SelectionTab::getFiles(std::string dirURI, EResType resType)
{ {
boost::to_upper(dirURI); boost::to_upper(dirURI);
CResourceHandler::get()->updateFilteredFiles([&](const std::string & mount) CResourceHandler::get()->updateFilteredFiles([&](const std::string & mount)
@ -808,7 +808,7 @@ std::unordered_set<ResourceID> SelectionTab::getFiles(std::string dirURI, int re
return boost::algorithm::starts_with(mount, dirURI); return boost::algorithm::starts_with(mount, dirURI);
}); });
std::unordered_set<ResourceID> ret = CResourceHandler::get()->getFilteredFiles([&](const ResourceID & ident) std::unordered_set<ResourcePath> ret = CResourceHandler::get()->getFilteredFiles([&](const ResourcePath & ident)
{ {
return ident.getType() == resType && boost::algorithm::starts_with(ident.getName(), dirURI); return ident.getType() == resType && boost::algorithm::starts_with(ident.getName(), dirURI);
}); });
@ -816,7 +816,7 @@ std::unordered_set<ResourceID> SelectionTab::getFiles(std::string dirURI, int re
return ret; return ret;
} }
SelectionTab::CMapInfoTooltipBox::CMapInfoTooltipBox(std::string text, ResourceID resource, ESelectionScreen tabType) SelectionTab::CMapInfoTooltipBox::CMapInfoTooltipBox(std::string text, ResourcePath resource, ESelectionScreen tabType)
: CWindowObject(BORDERED | RCLICK_POPUP) : CWindowObject(BORDERED | RCLICK_POPUP)
{ {
drawPlayerElements = tabType == ESelectionScreen::newGame; drawPlayerElements = tabType == ESelectionScreen::newGame;
@ -826,7 +826,7 @@ SelectionTab::CMapInfoTooltipBox::CMapInfoTooltipBox(std::string text, ResourceI
std::vector<std::shared_ptr<IImage>> mapLayerImages; std::vector<std::shared_ptr<IImage>> mapLayerImages;
if(renderImage) if(renderImage)
mapLayerImages = createMinimaps(ResourceID(resource.getName(), EResType::MAP), IMAGE_SIZE); mapLayerImages = createMinimaps(ResourcePath(resource.getName(), EResType::MAP), IMAGE_SIZE);
if(mapLayerImages.size() == 0) if(mapLayerImages.size() == 0)
renderImage = false; renderImage = false;
@ -844,7 +844,7 @@ SelectionTab::CMapInfoTooltipBox::CMapInfoTooltipBox(std::string text, ResourceI
pos.h = BORDER + textHeight + BORDER; pos.h = BORDER + textHeight + BORDER;
if(renderImage) if(renderImage)
pos.h += IMAGE_SIZE + BORDER; pos.h += IMAGE_SIZE + BORDER;
backgroundTexture = std::make_shared<CFilledTexture>("DIBOXBCK", pos); backgroundTexture = std::make_shared<CFilledTexture>(ImagePath::builtin("DIBOXBCK"), pos);
updateShadow(); updateShadow();
drawLabel(); drawLabel();
@ -903,7 +903,7 @@ Canvas SelectionTab::CMapInfoTooltipBox::createMinimapForLayer(std::unique_ptr<C
return canvas; return canvas;
} }
std::vector<std::shared_ptr<IImage>> SelectionTab::CMapInfoTooltipBox::createMinimaps(ResourceID resource, int size) std::vector<std::shared_ptr<IImage>> SelectionTab::CMapInfoTooltipBox::createMinimaps(ResourcePath resource, int size)
{ {
std::vector<std::shared_ptr<IImage>> ret = std::vector<std::shared_ptr<IImage>>(); std::vector<std::shared_ptr<IImage>> ret = std::vector<std::shared_ptr<IImage>>();
@ -935,7 +935,7 @@ SelectionTab::ListItem::ListItem(Point position, std::shared_ptr<CAnimation> ico
: CIntObject(LCLICK, position) : CIntObject(LCLICK, position)
{ {
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE; OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
pictureEmptyLine = std::make_shared<CPicture>(IImage::createFromFile("camcust"), Rect(25, 121, 349, 26), -8, -14); pictureEmptyLine = std::make_shared<CPicture>(IImage::createFromFile(ImagePath::builtin("camcust")), Rect(25, 121, 349, 26), -8, -14);
labelName = std::make_shared<CLabel>(184, 0, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE); labelName = std::make_shared<CLabel>(184, 0, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE);
labelName->setAutoRedraw(false); labelName->setAutoRedraw(false);
labelAmountOfPlayers = std::make_shared<CLabel>(8, 0, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE); labelAmountOfPlayers = std::make_shared<CLabel>(8, 0, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE);
@ -945,7 +945,7 @@ SelectionTab::ListItem::ListItem(Point position, std::shared_ptr<CAnimation> ico
labelMapSizeLetter = std::make_shared<CLabel>(41, 0, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE); labelMapSizeLetter = std::make_shared<CLabel>(41, 0, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE);
labelMapSizeLetter->setAutoRedraw(false); labelMapSizeLetter->setAutoRedraw(false);
// FIXME: This -12 should not be needed, but for some reason CAnimImage displaced otherwise // FIXME: This -12 should not be needed, but for some reason CAnimImage displaced otherwise
iconFolder = std::make_shared<CPicture>("lobby/iconFolder.png", -8, -12); iconFolder = std::make_shared<CPicture>(ImagePath::builtin("lobby/iconFolder.png"), -8, -12);
iconFormat = std::make_shared<CAnimImage>(iconsFormats, 0, 0, 59, -12); iconFormat = std::make_shared<CAnimImage>(iconsFormats, 0, 0, 59, -12);
iconVictoryCondition = std::make_shared<CAnimImage>(iconsVictory, 0, 0, 277, -12); iconVictoryCondition = std::make_shared<CAnimImage>(iconsVictory, 0, 0, 277, -12);
iconLossCondition = std::make_shared<CAnimImage>(iconsLoss, 0, 0, 310, -12); iconLossCondition = std::make_shared<CAnimImage>(iconsLoss, 0, 0, 310, -12);

View File

@ -14,6 +14,7 @@ VCMI_LIB_NAMESPACE_BEGIN
class CMap; class CMap;
VCMI_LIB_NAMESPACE_END VCMI_LIB_NAMESPACE_END
#include "../../lib/mapping/CMapInfo.h" #include "../../lib/mapping/CMapInfo.h"
#include "../../lib/filesystem/ResourcePath.h"
class CSlider; class CSlider;
class CLabel; class CLabel;
@ -81,9 +82,9 @@ class SelectionTab : public CIntObject
std::shared_ptr<CPicture> image2; std::shared_ptr<CPicture> image2;
Canvas createMinimapForLayer(std::unique_ptr<CMap> & map, int layer); Canvas createMinimapForLayer(std::unique_ptr<CMap> & map, int layer);
std::vector<std::shared_ptr<IImage>> createMinimaps(ResourceID resource, int size); std::vector<std::shared_ptr<IImage>> createMinimaps(ResourcePath resource, int size);
public: public:
CMapInfoTooltipBox(std::string text, ResourceID resource, ESelectionScreen tabType); CMapInfoTooltipBox(std::string text, ResourcePath resource, ESelectionScreen tabType);
}; };
public: public:
std::vector<std::shared_ptr<ElementInfo>> allItems; std::vector<std::shared_ptr<ElementInfo>> allItems;
@ -134,8 +135,8 @@ private:
auto checkSubfolder(std::string path); auto checkSubfolder(std::string path);
bool isMapSupported(const CMapInfo & info); bool isMapSupported(const CMapInfo & info);
void parseMaps(const std::unordered_set<ResourceID> & files); void parseMaps(const std::unordered_set<ResourcePath> & files);
void parseSaves(const std::unordered_set<ResourceID> & files); void parseSaves(const std::unordered_set<ResourcePath> & files);
void parseCampaigns(const std::unordered_set<ResourceID> & files); void parseCampaigns(const std::unordered_set<ResourcePath> & files);
std::unordered_set<ResourceID> getFiles(std::string dirURI, int resType); std::unordered_set<ResourcePath> getFiles(std::string dirURI, EResType resType);
}; };

View File

@ -86,7 +86,7 @@ std::shared_ptr<CButton> CCampaignScreen::createExitButton(const JsonNode & butt
if(!button["help"].isNull() && button["help"].Float() > 0) if(!button["help"].isNull() && button["help"].Float() > 0)
help = CGI->generaltexth->zelp[(size_t)button["help"].Float()]; help = CGI->generaltexth->zelp[(size_t)button["help"].Float()];
return std::make_shared<CButton>(Point((int)button["x"].Float(), (int)button["y"].Float()), button["name"].String(), help, [=](){ close();}, EShortcut::GLOBAL_CANCEL); return std::make_shared<CButton>(Point((int)button["x"].Float(), (int)button["y"].Float()), AnimationPath::fromJson(button["name"]), help, [=](){ close();}, EShortcut::GLOBAL_CANCEL);
} }
CCampaignScreen::CCampaignButton::CCampaignButton(const JsonNode & config) CCampaignScreen::CCampaignButton::CCampaignButton(const JsonNode & config)
@ -109,14 +109,14 @@ CCampaignScreen::CCampaignButton::CCampaignButton(const JsonNode & config)
if(status != CCampaignScreen::DISABLED) if(status != CCampaignScreen::DISABLED)
{ {
addUsedEvents(LCLICK | HOVER); addUsedEvents(LCLICK | HOVER);
graphicsImage = std::make_shared<CPicture>(config["image"].String()); graphicsImage = std::make_shared<CPicture>(ImagePath::fromJson(config["image"]));
hoverLabel = std::make_shared<CLabel>(pos.w / 2, pos.h + 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::YELLOW, ""); hoverLabel = std::make_shared<CLabel>(pos.w / 2, pos.h + 20, FONT_MEDIUM, ETextAlignment::CENTER, Colors::YELLOW, "");
parent->addChild(hoverLabel.get()); parent->addChild(hoverLabel.get());
} }
if(status == CCampaignScreen::COMPLETED) if(status == CCampaignScreen::COMPLETED)
graphicsCompleted = std::make_shared<CPicture>("CAMPCHK"); graphicsCompleted = std::make_shared<CPicture>(ImagePath::builtin("CAMPCHK"));
} }
void CCampaignScreen::CCampaignButton::show(Canvas & to) void CCampaignScreen::CCampaignButton::show(Canvas & to)

View File

@ -78,7 +78,7 @@ CMenuScreen::CMenuScreen(const JsonNode & configNode)
{ {
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE; OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
background = std::make_shared<CPicture>(config["background"].String()); background = std::make_shared<CPicture>(ImagePath::fromJson(config["background"]));
if(config["scalable"].Bool()) if(config["scalable"].Bool())
background->scaleTo(GH.screenDimensions()); background->scaleTo(GH.screenDimensions());
@ -237,7 +237,7 @@ std::shared_ptr<CButton> CMenuEntry::createButton(CMenuScreen * parent, const Js
EShortcut shortcut = GH.shortcuts().findShortcut(button["shortcut"].String()); EShortcut shortcut = GH.shortcuts().findShortcut(button["shortcut"].String());
auto result = std::make_shared<CButton>(Point(posx, posy), button["name"].String(), help, command, shortcut); auto result = std::make_shared<CButton>(Point(posx, posy), AnimationPath::fromJson(button["name"]), help, command, shortcut);
if (button["center"].Bool()) if (button["center"].Bool())
result->moveBy(Point(-result->pos.w/2, -result->pos.h/2)); result->moveBy(Point(-result->pos.w/2, -result->pos.h/2));
@ -262,7 +262,7 @@ CMenuEntry::CMenuEntry(CMenuScreen * parent, const JsonNode & config)
} }
CMainMenuConfig::CMainMenuConfig() CMainMenuConfig::CMainMenuConfig()
: campaignSets(JsonNode(ResourceID("config/campaignSets.json"))), config(JsonNode(ResourceID("config/mainmenu.json"))) : campaignSets(JsonNode(ResourcePath("config/campaignSets.json"))), config(JsonNode(ResourcePath("config/mainmenu.json")))
{ {
} }
@ -291,7 +291,7 @@ CMainMenu::CMainMenu()
GH.defActionsDef = 63; GH.defActionsDef = 63;
menu = std::make_shared<CMenuScreen>(CMainMenuConfig::get().getConfig()["window"]); menu = std::make_shared<CMenuScreen>(CMainMenuConfig::get().getConfig()["window"]);
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE; OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
backgroundAroundMenu = std::make_shared<CFilledTexture>("DIBOXBCK", pos); backgroundAroundMenu = std::make_shared<CFilledTexture>(ImagePath::builtin("DIBOXBCK"), pos);
} }
CMainMenu::~CMainMenu() CMainMenu::~CMainMenu()
@ -374,7 +374,7 @@ void CMainMenu::openCampaignScreen(std::string name)
void CMainMenu::startTutorial() void CMainMenu::startTutorial()
{ {
ResourceID tutorialMap("Maps/Tutorial.tut", EResType::MAP); ResourcePath tutorialMap("Maps/Tutorial.tut", EResType::MAP);
if(!CResourceHandler::get()->existsResource(tutorialMap)) if(!CResourceHandler::get()->existsResource(tutorialMap))
{ {
CInfoWindow::showInfoDialog(CGI->generaltexth->translate("core.genrltxt.742"), std::vector<std::shared_ptr<CComponent>>(), PlayerColor(1)); CInfoWindow::showInfoDialog(CGI->generaltexth->translate("core.genrltxt.742"), std::vector<std::shared_ptr<CComponent>>(), PlayerColor(1));
@ -397,7 +397,7 @@ std::shared_ptr<CMainMenu> CMainMenu::create()
std::shared_ptr<CPicture> CMainMenu::createPicture(const JsonNode & config) std::shared_ptr<CPicture> CMainMenu::createPicture(const JsonNode & config)
{ {
return std::make_shared<CPicture>(config["name"].String(), (int)config["x"].Float(), (int)config["y"].Float()); return std::make_shared<CPicture>(ImagePath::fromJson(config["name"]), (int)config["x"].Float(), (int)config["y"].Float());
} }
CMultiMode::CMultiMode(ESelectionScreen ScreenType) CMultiMode::CMultiMode(ESelectionScreen ScreenType)
@ -405,20 +405,20 @@ CMultiMode::CMultiMode(ESelectionScreen ScreenType)
{ {
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE; OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
background = std::make_shared<CPicture>("MUPOPUP.bmp"); background = std::make_shared<CPicture>(ImagePath::builtin("MUPOPUP.bmp"));
pos = background->center(); //center, window has size of bg graphic pos = background->center(); //center, window has size of bg graphic
picture = std::make_shared<CPicture>("MUMAP.bmp", 16, 77); picture = std::make_shared<CPicture>(ImagePath::builtin("MUMAP.bmp"), 16, 77);
statusBar = CGStatusBar::create(std::make_shared<CPicture>(background->getSurface(), Rect(7, 465, 440, 18), 7, 465)); statusBar = CGStatusBar::create(std::make_shared<CPicture>(background->getSurface(), Rect(7, 465, 440, 18), 7, 465));
playerName = std::make_shared<CTextInput>(Rect(19, 436, 334, 16), background->getSurface()); playerName = std::make_shared<CTextInput>(Rect(19, 436, 334, 16), background->getSurface());
playerName->setText(getPlayerName()); playerName->setText(getPlayerName());
playerName->cb += std::bind(&CMultiMode::onNameChange, this, _1); playerName->cb += std::bind(&CMultiMode::onNameChange, this, _1);
buttonHotseat = std::make_shared<CButton>(Point(373, 78), "MUBHOT.DEF", CGI->generaltexth->zelp[266], std::bind(&CMultiMode::hostTCP, this)); buttonHotseat = std::make_shared<CButton>(Point(373, 78), AnimationPath::builtin("MUBHOT.DEF"), CGI->generaltexth->zelp[266], std::bind(&CMultiMode::hostTCP, this));
buttonHost = std::make_shared<CButton>(Point(373, 78 + 57 * 1), "MUBHOST.DEF", CButton::tooltip(CGI->generaltexth->translate("vcmi.mainMenu.hostTCP"), ""), std::bind(&CMultiMode::hostTCP, this)); buttonHost = std::make_shared<CButton>(Point(373, 78 + 57 * 1), AnimationPath::builtin("MUBHOST.DEF"), CButton::tooltip(CGI->generaltexth->translate("vcmi.mainMenu.hostTCP"), ""), std::bind(&CMultiMode::hostTCP, this));
buttonJoin = std::make_shared<CButton>(Point(373, 78 + 57 * 2), "MUBJOIN.DEF", CButton::tooltip(CGI->generaltexth->translate("vcmi.mainMenu.joinTCP"), ""), std::bind(&CMultiMode::joinTCP, this)); buttonJoin = std::make_shared<CButton>(Point(373, 78 + 57 * 2), AnimationPath::builtin("MUBJOIN.DEF"), CButton::tooltip(CGI->generaltexth->translate("vcmi.mainMenu.joinTCP"), ""), std::bind(&CMultiMode::joinTCP, this));
buttonCancel = std::make_shared<CButton>(Point(373, 424), "MUBCANC.DEF", CGI->generaltexth->zelp[288], [=](){ close();}, EShortcut::GLOBAL_CANCEL); buttonCancel = std::make_shared<CButton>(Point(373, 424), AnimationPath::builtin("MUBCANC.DEF"), CGI->generaltexth->zelp[288], [=](){ close();}, EShortcut::GLOBAL_CANCEL);
} }
void CMultiMode::hostTCP() void CMultiMode::hostTCP()
@ -453,7 +453,7 @@ CMultiPlayers::CMultiPlayers(const std::string & firstPlayer, ESelectionScreen S
: loadMode(LoadMode), screenType(ScreenType), host(Host) : loadMode(LoadMode), screenType(ScreenType), host(Host)
{ {
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE; OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
background = std::make_shared<CPicture>("MUHOTSEA.bmp"); background = std::make_shared<CPicture>(ImagePath::builtin("MUHOTSEA.bmp"));
pos = background->center(); //center, window has size of bg graphic pos = background->center(); //center, window has size of bg graphic
std::string text = CGI->generaltexth->allTexts[446]; std::string text = CGI->generaltexth->allTexts[446];
@ -466,8 +466,8 @@ CMultiPlayers::CMultiPlayers(const std::string & firstPlayer, ESelectionScreen S
inputNames[i]->cb += std::bind(&CMultiPlayers::onChange, this, _1); inputNames[i]->cb += std::bind(&CMultiPlayers::onChange, this, _1);
} }
buttonOk = std::make_shared<CButton>(Point(95, 338), "MUBCHCK.DEF", CGI->generaltexth->zelp[560], std::bind(&CMultiPlayers::enterSelectionScreen, this), EShortcut::GLOBAL_ACCEPT); buttonOk = std::make_shared<CButton>(Point(95, 338), AnimationPath::builtin("MUBCHCK.DEF"), CGI->generaltexth->zelp[560], std::bind(&CMultiPlayers::enterSelectionScreen, this), EShortcut::GLOBAL_ACCEPT);
buttonCancel = std::make_shared<CButton>(Point(205, 338), "MUBCANC.DEF", CGI->generaltexth->zelp[561], [=](){ close();}, EShortcut::GLOBAL_CANCEL); buttonCancel = std::make_shared<CButton>(Point(205, 338), AnimationPath::builtin("MUBCANC.DEF"), CGI->generaltexth->zelp[561], [=](){ close();}, EShortcut::GLOBAL_CANCEL);
statusBar = CGStatusBar::create(std::make_shared<CPicture>(background->getSurface(), Rect(7, 381, 348, 18), 7, 381)); statusBar = CGStatusBar::create(std::make_shared<CPicture>(background->getSurface(), Rect(7, 381, 348, 18), 7, 381));
inputNames[0]->setText(firstPlayer, true); inputNames[0]->setText(firstPlayer, true);
@ -498,7 +498,7 @@ void CMultiPlayers::enterSelectionScreen()
CSimpleJoinScreen::CSimpleJoinScreen(bool host) CSimpleJoinScreen::CSimpleJoinScreen(bool host)
{ {
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE; OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
background = std::make_shared<CPicture>("MUDIALOG.bmp"); // address background background = std::make_shared<CPicture>(ImagePath::builtin("MUDIALOG.bmp")); // address background
pos = background->center(); //center, window has size of bg graphic (x,y = 396,278 w=232 h=212) pos = background->center(); //center, window has size of bg graphic (x,y = 396,278 w=232 h=212)
textTitle = std::make_shared<CTextBox>("", Rect(20, 20, 205, 50), 0, FONT_BIG, ETextAlignment::CENTER, Colors::WHITE); textTitle = std::make_shared<CTextBox>("", Rect(20, 20, 205, 50), 0, FONT_BIG, ETextAlignment::CENTER, Colors::WHITE);
@ -515,14 +515,14 @@ CSimpleJoinScreen::CSimpleJoinScreen(bool host)
inputAddress->cb += std::bind(&CSimpleJoinScreen::onChange, this, _1); inputAddress->cb += std::bind(&CSimpleJoinScreen::onChange, this, _1);
inputPort->cb += std::bind(&CSimpleJoinScreen::onChange, this, _1); inputPort->cb += std::bind(&CSimpleJoinScreen::onChange, this, _1);
inputPort->filters += std::bind(&CTextInput::numberFilter, _1, _2, 0, 65535); inputPort->filters += std::bind(&CTextInput::numberFilter, _1, _2, 0, 65535);
buttonOk = std::make_shared<CButton>(Point(26, 142), "MUBCHCK.DEF", CGI->generaltexth->zelp[560], std::bind(&CSimpleJoinScreen::connectToServer, this), EShortcut::GLOBAL_ACCEPT); buttonOk = std::make_shared<CButton>(Point(26, 142), AnimationPath::builtin("MUBCHCK.DEF"), CGI->generaltexth->zelp[560], std::bind(&CSimpleJoinScreen::connectToServer, this), EShortcut::GLOBAL_ACCEPT);
inputAddress->giveFocus(); inputAddress->giveFocus();
} }
inputAddress->setText(host ? CServerHandler::localhostAddress : CSH->getHostAddress(), true); inputAddress->setText(host ? CServerHandler::localhostAddress : CSH->getHostAddress(), true);
inputPort->setText(std::to_string(CSH->getHostPort()), true); inputPort->setText(std::to_string(CSH->getHostPort()), true);
buttonCancel = std::make_shared<CButton>(Point(142, 142), "MUBCANC.DEF", CGI->generaltexth->zelp[561], std::bind(&CSimpleJoinScreen::leaveScreen, this), EShortcut::GLOBAL_CANCEL); buttonCancel = std::make_shared<CButton>(Point(142, 142), AnimationPath::builtin("MUBCANC.DEF"), CGI->generaltexth->zelp[561], std::bind(&CSimpleJoinScreen::leaveScreen, this), EShortcut::GLOBAL_CANCEL);
statusBar = CGStatusBar::create(std::make_shared<CPicture>(background->getSurface(), Rect(7, 186, 218, 18), 7, 186)); statusBar = CGStatusBar::create(std::make_shared<CPicture>(background->getSurface(), Rect(7, 186, 218, 18), 7, 186));
} }
@ -601,7 +601,7 @@ CLoadingScreen::CLoadingScreen()
for(int i = 0; i < blocksAmount; ++i) for(int i = 0; i < blocksAmount; ++i)
{ {
progressBlocks.push_back(std::make_shared<CAnimImage>(conf["name"].String(), i, 0, posx + i * blockSize, posy)); progressBlocks.push_back(std::make_shared<CAnimImage>(AnimationPath::fromJson(conf["name"]), i, 0, posx + i * blockSize, posy));
progressBlocks.back()->deactivate(); progressBlocks.back()->deactivate();
progressBlocks.back()->visible = false; progressBlocks.back()->visible = false;
} }
@ -626,24 +626,24 @@ void CLoadingScreen::tick(uint32_t msPassed)
} }
} }
std::string CLoadingScreen::getBackground() ImagePath CLoadingScreen::getBackground()
{ {
std::string fname = "loadbar"; ImagePath fname = ImagePath::builtin("loadbar");
const auto & conf = CMainMenuConfig::get().getConfig()["loading"]; const auto & conf = CMainMenuConfig::get().getConfig()["loading"];
if(conf.isStruct()) if(conf.isStruct())
{ {
if(conf["background"].isVector()) if(conf["background"].isVector())
return RandomGeneratorUtil::nextItem(conf["background"].Vector(), CRandomGenerator::getDefault())->String(); return ImagePath::fromJson(*RandomGeneratorUtil::nextItem(conf["background"].Vector(), CRandomGenerator::getDefault()));
if(conf["background"].isString()) if(conf["background"].isString())
return conf["background"].String(); return ImagePath::fromJson(conf["background"]);
return fname; return fname;
} }
if(conf.isVector() && !conf.Vector().empty()) if(conf.isVector() && !conf.Vector().empty())
return RandomGeneratorUtil::nextItem(conf.Vector(), CRandomGenerator::getDefault())->String(); return ImagePath::fromJson(*RandomGeneratorUtil::nextItem(conf.Vector(), CRandomGenerator::getDefault()));
return fname; return fname;
} }

View File

@ -185,7 +185,7 @@ class CLoadingScreen : virtual public CWindowObject, virtual public Load::Progre
{ {
std::vector<std::shared_ptr<CAnimImage>> progressBlocks; std::vector<std::shared_ptr<CAnimImage>> progressBlocks;
std::string getBackground(); ImagePath getBackground();
public: public:
CLoadingScreen(); CLoadingScreen();

View File

@ -26,7 +26,7 @@ CreditsScreen::CreditsScreen(Rect rect)
pos.h = rect.h; pos.h = rect.h;
setRedrawParent(true); setRedrawParent(true);
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE; OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
auto textFile = CResourceHandler::get()->load(ResourceID("DATA/CREDITS.TXT"))->readAll(); auto textFile = CResourceHandler::get()->load(ResourcePath("DATA/CREDITS.TXT"))->readAll();
std::string text((char *)textFile.first.get(), textFile.second); std::string text((char *)textFile.first.get(), textFile.second);
size_t firstQuote = text.find('\"') + 1; size_t firstQuote = text.find('\"') + 1;
text = text.substr(firstQuote, text.find('\"', firstQuote) - firstQuote); text = text.substr(firstQuote, text.find('\"', firstQuote) - firstQuote);

View File

@ -94,7 +94,7 @@ MapTileStorage::MapTileStorage(size_t capacity)
{ {
} }
void MapTileStorage::load(size_t index, const std::string & filename, EImageBlitMode blitMode) void MapTileStorage::load(size_t index, const AnimationPath & filename, EImageBlitMode blitMode)
{ {
auto & terrainAnimations = animations[index]; auto & terrainAnimations = animations[index];
@ -247,7 +247,7 @@ uint8_t MapRendererRoad::checksum(IMapRendererContext & context, const int3 & co
MapRendererBorder::MapRendererBorder() MapRendererBorder::MapRendererBorder()
{ {
emptyFill = std::make_unique<Canvas>(Point(32,32)); emptyFill = std::make_unique<Canvas>(Point(32,32));
animation = std::make_unique<CAnimation>("EDG"); animation = std::make_unique<CAnimation>(AnimationPath::builtin("EDG"));
animation->preload(); animation->preload();
} }
@ -309,9 +309,9 @@ uint8_t MapRendererBorder::checksum(IMapRendererContext & context, const int3 &
MapRendererFow::MapRendererFow() MapRendererFow::MapRendererFow()
{ {
fogOfWarFullHide = std::make_unique<CAnimation>("TSHRC"); fogOfWarFullHide = std::make_unique<CAnimation>(AnimationPath::builtin("TSHRC"));
fogOfWarFullHide->preload(); fogOfWarFullHide->preload();
fogOfWarPartialHide = std::make_unique<CAnimation>("TSHRE"); fogOfWarPartialHide = std::make_unique<CAnimation>(AnimationPath::builtin("TSHRE"));
fogOfWarPartialHide->preload(); fogOfWarPartialHide->preload();
for(size_t i = 0; i < fogOfWarFullHide->size(); ++i) for(size_t i = 0; i < fogOfWarFullHide->size(); ++i)
@ -387,7 +387,7 @@ std::shared_ptr<CAnimation> MapRendererObjects::getBaseAnimation(const CGObjectI
return getAnimation(info->animationFile, generateMovementGroups); return getAnimation(info->animationFile, generateMovementGroups);
} }
std::shared_ptr<CAnimation> MapRendererObjects::getAnimation(const std::string & filename, bool generateMovementGroups) std::shared_ptr<CAnimation> MapRendererObjects::getAnimation(const AnimationPath & filename, bool generateMovementGroups)
{ {
auto it = animations.find(filename); auto it = animations.find(filename);
@ -422,7 +422,7 @@ std::shared_ptr<CAnimation> MapRendererObjects::getFlagAnimation(const CGObjectI
{ {
assert(dynamic_cast<const CGHeroInstance *>(obj) != nullptr); assert(dynamic_cast<const CGHeroInstance *>(obj) != nullptr);
assert(obj->tempOwner.isValidPlayer()); assert(obj->tempOwner.isValidPlayer());
return getAnimation(heroFlags[obj->tempOwner.getNum()], true); return getAnimation(AnimationPath::builtin(heroFlags[obj->tempOwner.getNum()]), true);
} }
if(obj->ID == Obj::BOAT) if(obj->ID == Obj::BOAT)
@ -557,10 +557,10 @@ uint8_t MapRendererObjects::checksum(IMapRendererContext & context, const int3 &
} }
MapRendererOverlay::MapRendererOverlay() MapRendererOverlay::MapRendererOverlay()
: imageGrid(IImage::createFromFile("debug/grid", EImageBlitMode::ALPHA)) : imageGrid(IImage::createFromFile(ImagePath::builtin("debug/grid"), EImageBlitMode::ALPHA))
, imageBlocked(IImage::createFromFile("debug/blocked", EImageBlitMode::ALPHA)) , imageBlocked(IImage::createFromFile(ImagePath::builtin("debug/blocked"), EImageBlitMode::ALPHA))
, imageVisitable(IImage::createFromFile("debug/visitable", EImageBlitMode::ALPHA)) , imageVisitable(IImage::createFromFile(ImagePath::builtin("debug/visitable"), EImageBlitMode::ALPHA))
, imageSpellRange(IImage::createFromFile("debug/spellRange", EImageBlitMode::ALPHA)) , imageSpellRange(IImage::createFromFile(ImagePath::builtin("debug/spellRange"), EImageBlitMode::ALPHA))
{ {
} }
@ -616,7 +616,7 @@ uint8_t MapRendererOverlay::checksum(IMapRendererContext & context, const int3 &
} }
MapRendererPath::MapRendererPath() MapRendererPath::MapRendererPath()
: pathNodes(new CAnimation("ADAG")) : pathNodes(new CAnimation(AnimationPath::builtin("ADAG")))
{ {
pathNodes->preload(); pathNodes->preload();
} }

View File

@ -9,6 +9,8 @@
*/ */
#pragma once #pragma once
#include "../../lib/filesystem/ResourcePath.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
class int3; class int3;
@ -30,7 +32,7 @@ class MapTileStorage
public: public:
explicit MapTileStorage(size_t capacity); explicit MapTileStorage(size_t capacity);
void load(size_t index, const std::string & filename, EImageBlitMode blitMode); void load(size_t index, const AnimationPath & filename, EImageBlitMode blitMode);
std::shared_ptr<IImage> find(size_t fileIndex, size_t rotationIndex, size_t imageIndex); std::shared_ptr<IImage> find(size_t fileIndex, size_t rotationIndex, size_t imageIndex);
}; };
@ -69,13 +71,13 @@ public:
class MapRendererObjects class MapRendererObjects
{ {
std::unordered_map<std::string, std::shared_ptr<CAnimation>> animations; std::map<AnimationPath, std::shared_ptr<CAnimation>> animations;
std::shared_ptr<CAnimation> getBaseAnimation(const CGObjectInstance * obj); std::shared_ptr<CAnimation> getBaseAnimation(const CGObjectInstance * obj);
std::shared_ptr<CAnimation> getFlagAnimation(const CGObjectInstance * obj); std::shared_ptr<CAnimation> getFlagAnimation(const CGObjectInstance * obj);
std::shared_ptr<CAnimation> getOverlayAnimation(const CGObjectInstance * obj); std::shared_ptr<CAnimation> getOverlayAnimation(const CGObjectInstance * obj);
std::shared_ptr<CAnimation> getAnimation(const std::string & filename, bool generateMovementGroups); std::shared_ptr<CAnimation> getAnimation(const AnimationPath & filename, bool generateMovementGroups);
std::shared_ptr<IImage> getImage(IMapRendererContext & context, const CGObjectInstance * obj, const std::shared_ptr<CAnimation> & animation) const; std::shared_ptr<IImage> getImage(IMapRendererContext & context, const CGObjectInstance * obj, const std::shared_ptr<CAnimation> & animation) const;

View File

@ -28,7 +28,7 @@ MapViewCache::MapViewCache(const std::shared_ptr<MapViewModel> & model)
: model(model) : model(model)
, cachedLevel(0) , cachedLevel(0)
, mapRenderer(new MapRenderer()) , mapRenderer(new MapRenderer())
, iconsStorage(new CAnimation("VwSymbol")) , iconsStorage(new CAnimation(AnimationPath::builtin("VwSymbol")))
, intermediate(new Canvas(Point(32, 32))) , intermediate(new Canvas(Point(32, 32)))
, terrain(new Canvas(model->getCacheDimensionsPixels())) , terrain(new Canvas(model->getCacheDimensionsPixels()))
, terrainTransition(new Canvas(model->getPixelsVisibleDimensions())) , terrainTransition(new Canvas(model->getPixelsVisibleDimensions()))

View File

@ -22,7 +22,7 @@ std::shared_ptr<IImage> CAnimation::getFromExtraDef(std::string filename)
size_t pos = filename.find(':'); size_t pos = filename.find(':');
if (pos == -1) if (pos == -1)
return nullptr; return nullptr;
CAnimation anim(filename.substr(0, pos)); CAnimation anim(AnimationPath::builtinTODO(filename.substr(0, pos)));
pos++; pos++;
size_t frame = atoi(filename.c_str()+pos); size_t frame = atoi(filename.c_str()+pos);
size_t group = 0; size_t group = 0;
@ -144,7 +144,7 @@ void CAnimation::exportBitmaps(const boost::filesystem::path& path) const
return; return;
} }
boost::filesystem::path actualPath = path / "SPRITES" / name; boost::filesystem::path actualPath = path / "SPRITES" / name.getName();
boost::filesystem::create_directories(actualPath); boost::filesystem::create_directories(actualPath);
size_t counter = 0; size_t counter = 0;
@ -179,16 +179,15 @@ void CAnimation::init()
source[defEntry.first].resize(defEntry.second); source[defEntry.first].resize(defEntry.second);
} }
ResourceID resID(std::string("SPRITES/") + name, EResType::TEXT); if (vstd::contains(graphics->imageLists, name.getName()))
initFromJson(graphics->imageLists[name.getName()]);
if (vstd::contains(graphics->imageLists, resID.getName())) auto jsonResource = name.toType<EResType::TEXT>();
initFromJson(graphics->imageLists[resID.getName()]); auto configList = CResourceHandler::get()->getResourcesWithName(jsonResource);
auto configList = CResourceHandler::get()->getResourcesWithName(resID);
for(auto & loader : configList) for(auto & loader : configList)
{ {
auto stream = loader->load(resID); auto stream = loader->load(jsonResource);
std::unique_ptr<ui8[]> textData(new ui8[stream->getSize()]); std::unique_ptr<ui8[]> textData(new ui8[stream->getSize()]);
stream->read(textData.get(), stream->getSize()); stream->read(textData.get(), stream->getSize());
@ -200,28 +199,21 @@ void CAnimation::init()
void CAnimation::printError(size_t frame, size_t group, std::string type) const void CAnimation::printError(size_t frame, size_t group, std::string type) const
{ {
logGlobal->error("%s error: Request for frame not present in CAnimation! File name: %s, Group: %d, Frame: %d", type, name, group, frame); logGlobal->error("%s error: Request for frame not present in CAnimation! File name: %s, Group: %d, Frame: %d", type, name.getOriginalName(), group, frame);
} }
CAnimation::CAnimation(std::string Name): CAnimation::CAnimation(const AnimationPath & Name):
name(Name), name(boost::starts_with(Name.getName(), "SPRITES") ? Name : Name.addPrefix("SPRITES/")),
preloaded(false), preloaded(false),
defFile() defFile()
{ {
size_t dotPos = name.find_last_of('.'); if(CResourceHandler::get()->existsResource(name))
if ( dotPos!=-1 )
name.erase(dotPos);
std::transform(name.begin(), name.end(), name.begin(), toupper);
ResourceID resource(std::string("SPRITES/") + name, EResType::ANIMATION);
if(CResourceHandler::get()->existsResource(resource))
defFile = std::make_shared<CDefFile>(name); defFile = std::make_shared<CDefFile>(name);
init(); init();
if(source.empty()) if(source.empty())
logAnim->error("Animation %s failed to load", Name); logAnim->error("Animation %s failed to load", Name.getOriginalName());
} }
CAnimation::CAnimation(): CAnimation::CAnimation():
@ -238,13 +230,13 @@ void CAnimation::duplicateImage(const size_t sourceGroup, const size_t sourceFra
{ {
if(!source.count(sourceGroup)) if(!source.count(sourceGroup))
{ {
logAnim->error("Group %d missing in %s", sourceGroup, name); logAnim->error("Group %d missing in %s", sourceGroup, name.getName());
return; return;
} }
if(source[sourceGroup].size() <= sourceFrame) if(source[sourceGroup].size() <= sourceFrame)
{ {
logAnim->error("Frame [%d %d] missing in %s", sourceGroup, sourceFrame, name); logAnim->error("Frame [%d %d] missing in %s", sourceGroup, sourceFrame, name.getName());
return; return;
} }
@ -253,7 +245,7 @@ void CAnimation::duplicateImage(const size_t sourceGroup, const size_t sourceFra
if(clone.getType() == JsonNode::JsonType::DATA_NULL) if(clone.getType() == JsonNode::JsonType::DATA_NULL)
{ {
std::string temp = name+":"+std::to_string(sourceGroup)+":"+std::to_string(sourceFrame); std::string temp = name.getName()+":"+std::to_string(sourceGroup)+":"+std::to_string(sourceFrame);
clone["file"].String() = temp; clone["file"].String() = temp;
} }

View File

@ -10,6 +10,7 @@
#pragma once #pragma once
#include "../../lib/GameConstants.h" #include "../../lib/GameConstants.h"
#include "../../lib/filesystem/ResourcePath.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
class JsonNode; class JsonNode;
@ -29,7 +30,7 @@ private:
std::map<size_t, std::map<size_t, std::shared_ptr<IImage> > > images; std::map<size_t, std::map<size_t, std::shared_ptr<IImage> > > images;
//animation file name //animation file name
std::string name; AnimationPath name;
bool preloaded; bool preloaded;
@ -53,7 +54,7 @@ private:
std::shared_ptr<IImage> getFromExtraDef(std::string filename); std::shared_ptr<IImage> getFromExtraDef(std::string filename);
public: public:
CAnimation(std::string Name); CAnimation(const AnimationPath & Name);
CAnimation(); CAnimation();
~CAnimation(); ~CAnimation();

View File

@ -110,14 +110,14 @@ SDL_Surface * BitmapHandler::loadBitmapFromDir(std::string path, std::string fna
logGlobal->warn("Call to loadBitmap with void fname!"); logGlobal->warn("Call to loadBitmap with void fname!");
return nullptr; return nullptr;
} }
if (!CResourceHandler::get()->existsResource(ResourceID(path + fname, EResType::IMAGE))) if (!CResourceHandler::get()->existsResource(ResourcePath(path + fname, EResType::IMAGE)))
{ {
return nullptr; return nullptr;
} }
SDL_Surface * ret=nullptr; SDL_Surface * ret=nullptr;
auto readFile = CResourceHandler::get()->load(ResourceID(path + fname, EResType::IMAGE))->readAll(); auto readFile = CResourceHandler::get()->load(ResourcePath(path + fname, EResType::IMAGE))->readAll();
if (isPCX(readFile.first.get())) if (isPCX(readFile.first.get()))
{//H3-style PCX {//H3-style PCX

View File

@ -24,7 +24,7 @@ class CFileCache
static const int cacheSize = 50; //Max number of cached files static const int cacheSize = 50; //Max number of cached files
struct FileData struct FileData
{ {
ResourceID name; AnimationPath name;
size_t size; size_t size;
std::unique_ptr<ui8[]> data; std::unique_ptr<ui8[]> data;
@ -34,7 +34,7 @@ class CFileCache
std::copy(data.get(), data.get() + size, ret.get()); std::copy(data.get(), data.get() + size, ret.get());
return ret; return ret;
} }
FileData(ResourceID name_, size_t size_, std::unique_ptr<ui8[]> data_): FileData(AnimationPath name_, size_t size_, std::unique_ptr<ui8[]> data_):
name{std::move(name_)}, name{std::move(name_)},
size{size_}, size{size_},
data{std::move(data_)} data{std::move(data_)}
@ -43,7 +43,7 @@ class CFileCache
std::deque<FileData> cache; std::deque<FileData> cache;
public: public:
std::unique_ptr<ui8[]> getCachedFile(ResourceID rid) std::unique_ptr<ui8[]> getCachedFile(AnimationPath rid)
{ {
for(auto & file : cache) for(auto & file : cache)
{ {
@ -97,7 +97,7 @@ static bool colorsSimilar (const SDL_Color & lhs, const SDL_Color & rhs)
return std::abs(diffR) < threshold && std::abs(diffG) < threshold && std::abs(diffB) < threshold && std::abs(diffA) < threshold; return std::abs(diffR) < threshold && std::abs(diffG) < threshold && std::abs(diffB) < threshold && std::abs(diffA) < threshold;
} }
CDefFile::CDefFile(std::string Name): CDefFile::CDefFile(const AnimationPath & Name):
data(nullptr), data(nullptr),
palette(nullptr) palette(nullptr)
{ {
@ -124,7 +124,7 @@ CDefFile::CDefFile(std::string Name):
{0, 0, 0, 64 } // shadow border below selection ( used in battle def's ) {0, 0, 0, 64 } // shadow border below selection ( used in battle def's )
}; };
data = animationCache.getCachedFile(ResourceID(std::string("SPRITES/") + Name, EResType::ANIMATION)); data = animationCache.getCachedFile(Name);
palette = std::unique_ptr<SDL_Color[]>(new SDL_Color[256]); palette = std::unique_ptr<SDL_Color[]>(new SDL_Color[256]);
int it = 0; int it = 0;

View File

@ -10,6 +10,7 @@
#pragma once #pragma once
#include "../../lib/vcmi_endian.h" #include "../../lib/vcmi_endian.h"
#include "../../lib/filesystem/ResourcePath.h"
class IImageLoader; class IImageLoader;
struct SDL_Color; struct SDL_Color;
@ -39,7 +40,7 @@ private:
std::unique_ptr<SDL_Color[]> palette; std::unique_ptr<SDL_Color[]> palette;
public: public:
CDefFile(std::string Name); CDefFile(const AnimationPath & Name);
~CDefFile(); ~CDefFile();
//load frame as SDL_Surface //load frame as SDL_Surface

View File

@ -44,7 +44,7 @@ Graphics * graphics = nullptr;
void Graphics::loadPaletteAndColors() void Graphics::loadPaletteAndColors()
{ {
auto textFile = CResourceHandler::get()->load(ResourceID("DATA/PLAYERS.PAL"))->readAll(); auto textFile = CResourceHandler::get()->load(ResourcePath("DATA/PLAYERS.PAL"))->readAll();
std::string pals((char*)textFile.first.get(), textFile.second); std::string pals((char*)textFile.first.get(), textFile.second);
int startPoint = 24; //beginning byte; used to read int startPoint = 24; //beginning byte; used to read
@ -62,7 +62,7 @@ void Graphics::loadPaletteAndColors()
} }
} }
auto stream = CResourceHandler::get()->load(ResourceID("config/NEUTRAL.PAL")); auto stream = CResourceHandler::get()->load(ResourcePath("config/NEUTRAL.PAL"));
CBinaryReader reader(stream.get()); CBinaryReader reader(stream.get());
for(int i=0; i<32; ++i) for(int i=0; i<32; ++i)
@ -102,10 +102,10 @@ void Graphics::initializeBattleGraphics()
allConfigs.insert(allConfigs.begin(), ModScope::scopeBuiltin()); allConfigs.insert(allConfigs.begin(), ModScope::scopeBuiltin());
for(auto & mod : allConfigs) for(auto & mod : allConfigs)
{ {
if(!CResourceHandler::get(mod)->existsResource(ResourceID("config/battles_graphics.json"))) if(!CResourceHandler::get(mod)->existsResource(ResourcePath("config/battles_graphics.json")))
continue; continue;
const JsonNode config(mod, ResourceID("config/battles_graphics.json")); const JsonNode config(mod, ResourcePath("config/battles_graphics.json"));
//initialization of AC->def name mapping //initialization of AC->def name mapping
if(!config["ac_mapping"].isNull()) if(!config["ac_mapping"].isNull())
@ -204,7 +204,7 @@ void Graphics::blueToPlayersAdv(SDL_Surface * sur, PlayerColor player)
void Graphics::loadFonts() void Graphics::loadFonts()
{ {
const JsonNode config(ResourceID("config/fonts.json")); const JsonNode config(ResourcePath("config/fonts.json"));
const JsonVector & bmpConf = config["bitmap"].Vector(); const JsonVector & bmpConf = config["bitmap"].Vector();
const JsonNode & ttfConf = config["trueType"]; const JsonNode & ttfConf = config["trueType"];
@ -228,7 +228,7 @@ void Graphics::loadFonts()
void Graphics::loadErmuToPicture() void Graphics::loadErmuToPicture()
{ {
//loading ERMU to picture //loading ERMU to picture
const JsonNode config(ResourceID("config/ERMU_to_picture.json")); const JsonNode config(ResourcePath("config/ERMU_to_picture.json"));
int etp_idx = 0; int etp_idx = 0;
for(const JsonNode &etp : config["ERMU_to_picture"].Vector()) { for(const JsonNode &etp : config["ERMU_to_picture"].Vector()) {
int idx = 0; int idx = 0;
@ -279,16 +279,14 @@ void Graphics::initializeImageLists()
addImageListEntries(CGI->skills()); addImageListEntries(CGI->skills());
} }
std::shared_ptr<CAnimation> Graphics::getAnimation(const std::string & path) std::shared_ptr<CAnimation> Graphics::getAnimation(const AnimationPath & path)
{ {
ResourceID animationPath(path, EResType::ANIMATION); if (cachedAnimations.count(path) != 0)
return cachedAnimations.at(path);
if (cachedAnimations.count(animationPath.getName()) != 0) auto newAnimation = std::make_shared<CAnimation>(path);
return cachedAnimations.at(animationPath.getName());
auto newAnimation = std::make_shared<CAnimation>(animationPath.getName());
newAnimation->preload(); newAnimation->preload();
cachedAnimations[animationPath.getName()] = newAnimation; cachedAnimations[path] = newAnimation;
return newAnimation; return newAnimation;
} }

View File

@ -11,6 +11,7 @@
#include "../lib/GameConstants.h" #include "../lib/GameConstants.h"
#include "../lib/Color.h" #include "../lib/Color.h"
#include "../lib/filesystem/ResourcePath.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
@ -42,10 +43,10 @@ class Graphics
void loadFonts(); void loadFonts();
void initializeImageLists(); void initializeImageLists();
std::map<std::string, std::shared_ptr<CAnimation>> cachedAnimations; std::map<AnimationPath, std::shared_ptr<CAnimation>> cachedAnimations;
public: public:
std::shared_ptr<CAnimation> getAnimation(const std::string & path); std::shared_ptr<CAnimation> getAnimation(const AnimationPath & path);
//Fonts //Fonts
static const int FONTS_NUMBER = 9; static const int FONTS_NUMBER = 9;

View File

@ -9,6 +9,8 @@
*/ */
#pragma once #pragma once
#include "../../lib/filesystem/ResourcePath.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
class PlayerColor; class PlayerColor;
@ -84,8 +86,8 @@ public:
virtual ~IImage(); virtual ~IImage();
/// loads image from specified file. Returns 0-sized images on failure /// loads image from specified file. Returns 0-sized images on failure
static std::shared_ptr<IImage> createFromFile( const std::string & path ); static std::shared_ptr<IImage> createFromFile( const ImagePath & path );
static std::shared_ptr<IImage> createFromFile( const std::string & path, EImageBlitMode mode ); static std::shared_ptr<IImage> createFromFile( const ImagePath & path, EImageBlitMode mode );
/// temporary compatibility method. Creates IImage from existing SDL_Surface /// temporary compatibility method. Creates IImage from existing SDL_Surface
/// Surface will be shared, called must still free it with SDL_FreeSurface /// Surface will be shared, called must still free it with SDL_FreeSurface

View File

@ -24,7 +24,7 @@
#include <SDL_surface.h> #include <SDL_surface.h>
void CBitmapFont::loadModFont(const std::string & modName, const ResourceID & resource) void CBitmapFont::loadModFont(const std::string & modName, const ResourcePath & resource)
{ {
if (!CResourceHandler::get(modName)->existsResource(resource)) if (!CResourceHandler::get(modName)->existsResource(resource))
{ {
@ -72,7 +72,7 @@ void CBitmapFont::loadModFont(const std::string & modName, const ResourceID & re
CBitmapFont::CBitmapFont(const std::string & filename): CBitmapFont::CBitmapFont(const std::string & filename):
maxHeight(0) maxHeight(0)
{ {
ResourceID resource("data/" + filename, EResType::BMP_FONT); ResourcePath resource("data/" + filename, EResType::BMP_FONT);
loadModFont("core", resource); loadModFont("core", resource);

View File

@ -12,7 +12,7 @@
#include "../render/IFont.h" #include "../render/IFont.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
class ResourceID; class ResourcePath;
VCMI_LIB_NAMESPACE_END VCMI_LIB_NAMESPACE_END
class CBitmapFont : public IFont class CBitmapFont : public IFont
@ -31,7 +31,7 @@ class CBitmapFont : public IFont
std::unordered_map<CodePoint, BitmapChar> chars; std::unordered_map<CodePoint, BitmapChar> chars;
uint32_t maxHeight; uint32_t maxHeight;
void loadModFont(const std::string & modName, const ResourceID & resource); void loadModFont(const std::string & modName, const ResourcePath & resource);
void renderCharacter(SDL_Surface * surface, const BitmapChar & character, const ColorRGBA & color, int &posX, int &posY) const; void renderCharacter(SDL_Surface * surface, const BitmapChar & character, const ColorRGBA & color, int &posX, int &posY) const;
void renderText(SDL_Surface * surface, const std::string & data, const ColorRGBA & color, const Point & pos) const override; void renderText(SDL_Surface * surface, const std::string & data, const ColorRGBA & color, const Point & pos) const override;

View File

@ -98,7 +98,7 @@ void CBitmapHanFont::renderText(SDL_Surface * surface, const std::string & data,
CBitmapHanFont::CBitmapHanFont(const JsonNode &config): CBitmapHanFont::CBitmapHanFont(const JsonNode &config):
fallback(new CBitmapFont(config["fallback"].String())), fallback(new CBitmapFont(config["fallback"].String())),
data(CResourceHandler::get()->load(ResourceID("data/" + config["name"].String(), EResType::OTHER))->readAll()), data(CResourceHandler::get()->load(ResourcePath("data/" + config["name"].String(), EResType::OTHER))->readAll()),
size((size_t)config["size"].Float()) size((size_t)config["size"].Float())
{ {
// basic tests to make sure that fonts are OK // basic tests to make sure that fonts are OK

View File

@ -24,7 +24,7 @@
std::pair<std::unique_ptr<ui8[]>, ui64> CTrueTypeFont::loadData(const JsonNode & config) std::pair<std::unique_ptr<ui8[]>, ui64> CTrueTypeFont::loadData(const JsonNode & config)
{ {
std::string filename = "Data/" + config["file"].String(); std::string filename = "Data/" + config["file"].String();
return CResourceHandler::get()->load(ResourceID(filename, EResType::TTF_FONT))->readAll(); return CResourceHandler::get()->load(ResourcePath(filename, EResType::TTF_FONT))->readAll();
} }
TTF_Font * CTrueTypeFont::loadFont(const JsonNode &config) TTF_Font * CTrueTypeFont::loadFont(const JsonNode &config)

View File

@ -24,14 +24,14 @@
class SDLImageLoader; class SDLImageLoader;
std::shared_ptr<IImage> IImage::createFromFile( const std::string & path ) std::shared_ptr<IImage> IImage::createFromFile( const ImagePath & path )
{ {
return createFromFile(path, EImageBlitMode::ALPHA); return createFromFile(path, EImageBlitMode::ALPHA);
} }
std::shared_ptr<IImage> IImage::createFromFile( const std::string & path, EImageBlitMode mode ) std::shared_ptr<IImage> IImage::createFromFile( const ImagePath & path, EImageBlitMode mode )
{ {
return std::shared_ptr<IImage>(new SDLImage(path, mode)); return std::shared_ptr<IImage>(new SDLImage(path.getName(), mode));
} }
std::shared_ptr<IImage> IImage::createFromSurface( SDL_Surface * source ) std::shared_ptr<IImage> IImage::createFromSurface( SDL_Surface * source )

View File

@ -89,7 +89,7 @@ void CButton::addOverlay(std::shared_ptr<CIntObject> newOverlay)
update(); update();
} }
void CButton::addImage(std::string filename) void CButton::addImage(const AnimationPath & filename)
{ {
imageNames.push_back(filename); imageNames.push_back(filename);
} }
@ -232,7 +232,7 @@ void CButton::hover (bool on)
} }
} }
CButton::CButton(Point position, const std::string &defName, const std::pair<std::string, std::string> &help, CFunctionList<void()> Callback, EShortcut key, bool playerColoredButton): CButton::CButton(Point position, const AnimationPath &defName, const std::pair<std::string, std::string> &help, CFunctionList<void()> Callback, EShortcut key, bool playerColoredButton):
CKeyShortcut(key), CKeyShortcut(key),
callback(Callback) callback(Callback)
{ {
@ -357,7 +357,7 @@ void CToggleBase::addCallback(std::function<void(bool)> function)
callback += function; callback += function;
} }
CToggleButton::CToggleButton(Point position, const std::string &defName, const std::pair<std::string, std::string> &help, CToggleButton::CToggleButton(Point position, const AnimationPath &defName, const std::pair<std::string, std::string> &help,
CFunctionList<void(bool)> callback, EShortcut key, bool playerColoredButton): CFunctionList<void(bool)> callback, EShortcut key, bool playerColoredButton):
CButton(position, defName, help, 0, key, playerColoredButton), CButton(position, defName, help, 0, key, playerColoredButton),
CToggleBase(callback) CToggleBase(callback)

View File

@ -12,6 +12,7 @@
#include "../gui/CIntObject.h" #include "../gui/CIntObject.h"
#include "../render/EFont.h" #include "../render/EFont.h"
#include "../../lib/FunctionList.h" #include "../../lib/FunctionList.h"
#include "../../lib/filesystem/ResourcePath.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
class Rect; class Rect;
@ -36,7 +37,7 @@ public:
HIGHLIGHTED=3 HIGHLIGHTED=3
}; };
protected: protected:
std::vector<std::string> imageNames;//store list of images that can be used by this button std::vector<AnimationPath> imageNames;//store list of images that can be used by this button
size_t currentImage; size_t currentImage;
ButtonState state;//current state of button from enum ButtonState state;//current state of button from enum
@ -72,7 +73,7 @@ public:
void addOverlay(std::shared_ptr<CIntObject> newOverlay); void addOverlay(std::shared_ptr<CIntObject> newOverlay);
void addTextOverlay(const std::string & Text, EFonts font, ColorRGBA color); void addTextOverlay(const std::string & Text, EFonts font, ColorRGBA color);
void addImage(std::string filename); void addImage(const AnimationPath & filename);
void addHoverText(ButtonState state, std::string text); void addHoverText(ButtonState state, std::string text);
void setImageOrder(int state1, int state2, int state3, int state4); void setImageOrder(int state1, int state2, int state3, int state4);
@ -84,7 +85,7 @@ public:
bool isHighlighted(); bool isHighlighted();
/// Constructor /// Constructor
CButton(Point position, const std::string & defName, const std::pair<std::string, std::string> & help, CButton(Point position, const AnimationPath & defName, const std::pair<std::string, std::string> & help,
CFunctionList<void()> Callback = 0, EShortcut key = {}, bool playerColoredButton = false ); CFunctionList<void()> Callback = 0, EShortcut key = {}, bool playerColoredButton = false );
/// Appearance modifiers /// Appearance modifiers
@ -145,7 +146,7 @@ class CToggleButton : public CButton, public CToggleBase
void setEnabled(bool enabled) override; void setEnabled(bool enabled) override;
public: public:
CToggleButton(Point position, const std::string &defName, const std::pair<std::string, std::string> &help, CToggleButton(Point position, const AnimationPath &defName, const std::pair<std::string, std::string> &help,
CFunctionList<void(bool)> Callback = 0, EShortcut key = {}, bool playerColoredButton = false ); CFunctionList<void(bool)> Callback = 0, EShortcut key = {}, bool playerColoredButton = false );
void clickPressed(const Point & cursorPosition) override; void clickPressed(const Point & cursorPosition) override;

View File

@ -89,7 +89,7 @@ void CCommanderArtPlace::createImage()
if(ourArt) if(ourArt)
imageIndex = ourArt->artType->getIconIndex(); imageIndex = ourArt->artType->getIconIndex();
image = std::make_shared<CAnimImage>("artifact", imageIndex); image = std::make_shared<CAnimImage>(AnimationPath::builtin("artifact"), imageIndex);
if(!ourArt) if(!ourArt)
image->disable(); image->disable();
} }
@ -247,11 +247,11 @@ void CHeroArtPlace::createImage()
else if(ourArt) else if(ourArt)
imageIndex = ourArt->artType->getIconIndex(); imageIndex = ourArt->artType->getIconIndex();
image = std::make_shared<CAnimImage>("artifact", imageIndex); image = std::make_shared<CAnimImage>(AnimationPath::builtin("artifact"), imageIndex);
if(!ourArt) if(!ourArt)
image->disable(); image->disable();
selection = std::make_shared<CAnimImage>("artifact", ArtifactID::ART_SELECTION); selection = std::make_shared<CAnimImage>(AnimationPath::builtin("artifact"), ArtifactID::ART_SELECTION);
selection->disable(); selection->disable();
} }

View File

@ -42,7 +42,7 @@ CArtifactsOfHeroBackpack::CArtifactsOfHeroBackpack(const Point & position)
for(int i = 0; i < visibleCapacityMax; i++) for(int i = 0; i < visibleCapacityMax; i++)
{ {
auto artifactSlotBackground = std::make_shared<CPicture>("heroWindow/artifactSlotEmpty", auto artifactSlotBackground = std::make_shared<CPicture>( ImagePath::builtin("heroWindow/artifactSlotEmpty"),
Point(slotSizeWithMargin * (i % HERO_BACKPACK_WINDOW_SLOT_COLUMNS), slotSizeWithMargin * (i / HERO_BACKPACK_WINDOW_SLOT_COLUMNS))); Point(slotSizeWithMargin * (i % HERO_BACKPACK_WINDOW_SLOT_COLUMNS), slotSizeWithMargin * (i / HERO_BACKPACK_WINDOW_SLOT_COLUMNS)));
backpackSlotsBackgrounds.emplace_back(artifactSlotBackground); backpackSlotsBackgrounds.emplace_back(artifactSlotBackground);

View File

@ -86,8 +86,8 @@ void CArtifactsOfHeroBase::init(
artPlace->leftClickCallback = lClickCallback; artPlace->leftClickCallback = lClickCallback;
artPlace->rightClickCallback = rClickCallback; artPlace->rightClickCallback = rClickCallback;
} }
leftBackpackRoll = std::make_shared<CButton>(Point(379, 364), "hsbtns3.def", CButton::tooltip(), [scrollHandler]() { scrollHandler(-1); }, EShortcut::MOVE_LEFT); leftBackpackRoll = std::make_shared<CButton>(Point(379, 364), AnimationPath::builtin("hsbtns3.def"), CButton::tooltip(), [scrollHandler]() { scrollHandler(-1); }, EShortcut::MOVE_LEFT);
rightBackpackRoll = std::make_shared<CButton>(Point(632, 364), "hsbtns5.def", CButton::tooltip(), [scrollHandler]() { scrollHandler(+1); }, EShortcut::MOVE_RIGHT); rightBackpackRoll = std::make_shared<CButton>(Point(632, 364), AnimationPath::builtin("hsbtns5.def"), CButton::tooltip(), [scrollHandler]() { scrollHandler(+1); }, EShortcut::MOVE_RIGHT);
leftBackpackRoll->block(true); leftBackpackRoll->block(true);
rightBackpackRoll->block(true); rightBackpackRoll->block(true);
} }

View File

@ -102,7 +102,7 @@ void CComponent::init(Etype Type, int Subtype, int Val, ESize imageSize, EFonts
} }
} }
const std::vector<std::string> CComponent::getFileName() std::vector<AnimationPath> CComponent::getFileName()
{ {
static const std::string primSkillsArr [] = {"PSKIL32", "PSKIL32", "PSKIL42", "PSKILL"}; static const std::string primSkillsArr [] = {"PSKIL32", "PSKIL32", "PSKIL42", "PSKILL"};
static const std::string secSkillsArr [] = {"SECSK32", "SECSK32", "SECSKILL", "SECSK82"}; static const std::string secSkillsArr [] = {"SECSK32", "SECSK32", "SECSKILL", "SECSK82"};
@ -115,9 +115,9 @@ const std::vector<std::string> CComponent::getFileName()
static const std::string heroArr [] = {"PortraitsSmall", "PortraitsSmall", "PortraitsSmall", "PortraitsLarge"}; static const std::string heroArr [] = {"PortraitsSmall", "PortraitsSmall", "PortraitsSmall", "PortraitsLarge"};
static const std::string flagArr [] = {"CREST58", "CREST58", "CREST58", "CREST58"}; static const std::string flagArr [] = {"CREST58", "CREST58", "CREST58", "CREST58"};
auto gen = [](const std::string * arr) auto gen = [](const std::string * arr) -> std::vector<AnimationPath>
{ {
return std::vector<std::string>(arr, arr + 4); return { AnimationPath::builtin(arr[0]), AnimationPath::builtin(arr[1]), AnimationPath::builtin(arr[2]), AnimationPath::builtin(arr[3]) };
}; };
switch(compType) switch(compType)
@ -131,12 +131,12 @@ const std::vector<std::string> CComponent::getFileName()
case spell: return gen(spellsArr); case spell: return gen(spellsArr);
case morale: return gen(moraleArr); case morale: return gen(moraleArr);
case luck: return gen(luckArr); case luck: return gen(luckArr);
case building: return std::vector<std::string>(4, (*CGI->townh)[subtype]->town->clientInfo.buildingsIcons); case building: return std::vector<AnimationPath>(4, (*CGI->townh)[subtype]->town->clientInfo.buildingsIcons);
case hero: return gen(heroArr); case hero: return gen(heroArr);
case flag: return gen(flagArr); case flag: return gen(flagArr);
} }
assert(0); assert(0);
return std::vector<std::string>(); return {};
} }
size_t CComponent::getIndex() size_t CComponent::getIndex()
@ -251,7 +251,7 @@ std::string CComponent::getSubtitleInternal()
return ""; return "";
} }
void CComponent::setSurface(std::string defName, int imgPos) void CComponent::setSurface(const AnimationPath & defName, int imgPos)
{ {
OBJECT_CONSTRUCTION_CUSTOM_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CUSTOM_CAPTURING(255-DISPOSE);
image = std::make_shared<CAnimImage>(defName, imgPos); image = std::make_shared<CAnimImage>(defName, imgPos);

View File

@ -11,7 +11,7 @@
#include "../gui/CIntObject.h" #include "../gui/CIntObject.h"
#include "../render/EFont.h" #include "../render/EFont.h"
#include "../../lib/filesystem/ResourcePath.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
@ -45,8 +45,8 @@ private:
std::vector<std::shared_ptr<CLabel>> lines; std::vector<std::shared_ptr<CLabel>> lines;
size_t getIndex(); size_t getIndex();
const std::vector<std::string> getFileName(); std::vector<AnimationPath> getFileName();
void setSurface(std::string defName, int imgPos); void setSurface(const AnimationPath & defName, int imgPos);
std::string getSubtitleInternal(); std::string getSubtitleInternal();
void init(Etype Type, int Subtype, int Val, ESize imageSize, EFonts font = FONT_SMALL); void init(Etype Type, int Subtype, int Val, ESize imageSize, EFonts font = FONT_SMALL);

View File

@ -421,7 +421,7 @@ CGarrisonSlot::CGarrisonSlot(CGarrisonInt * Owner, int x, int y, SlotID IID, EGa
pos.x += x; pos.x += x;
pos.y += y; pos.y += y;
std::string imgName = owner->smallIcons ? "cprsmall" : "TWCRPORT"; AnimationPath imgName = AnimationPath::builtin(owner->smallIcons ? "cprsmall" : "TWCRPORT");
creatureImage = std::make_shared<CAnimImage>(graphics->getAnimation(imgName), 0); creatureImage = std::make_shared<CAnimImage>(graphics->getAnimation(imgName), 0);
creatureImage->disable(); creatureImage->disable();

View File

@ -271,7 +271,7 @@ void CWindowWithArtifacts::artifactMoved(const ArtifactLocation & srcLoc, const
{ {
if(artSetPtr->isActive()) if(artSetPtr->isActive())
{ {
CCS->curh->dragAndDropCursor("artifact", pickedArtInst->artType->getIconIndex()); CCS->curh->dragAndDropCursor(AnimationPath::builtin("artifact"), pickedArtInst->artType->getIconIndex());
if(srcLoc.isHolder(hero) || !std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroKingdom>>) if(srcLoc.isHolder(hero) || !std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroKingdom>>)
artSetPtr->markPossibleSlots(pickedArtInst, hero->tempOwner == LOCPLINT->playerID); artSetPtr->markPossibleSlots(pickedArtInst, hero->tempOwner == LOCPLINT->playerID);
} }

View File

@ -155,7 +155,7 @@ void ComboBox::DropDown::setItem(const void * item)
GH.windows().popWindows(1); GH.windows().popWindows(1);
} }
ComboBox::ComboBox(Point position, const std::string & defName, const std::pair<std::string, std::string> & help, const JsonNode & dropDownDescriptor, EShortcut key, bool playerColoredButton): ComboBox::ComboBox(Point position, const AnimationPath & defName, const std::pair<std::string, std::string> & help, const JsonNode & dropDownDescriptor, EShortcut key, bool playerColoredButton):
CButton(position, defName, help, 0, key, playerColoredButton) CButton(position, defName, help, 0, key, playerColoredButton)
{ {
addCallback([&, dropDownDescriptor]() addCallback([&, dropDownDescriptor]()

View File

@ -54,7 +54,7 @@ class ComboBox : public CButton
void setItem(const void *); void setItem(const void *);
public: public:
ComboBox(Point position, const std::string & defName, const std::pair<std::string, std::string> & help, const JsonNode & dropDownDescriptor, EShortcut key = {}, bool playerColoredButton = false); ComboBox(Point position, const AnimationPath & defName, const std::pair<std::string, std::string> & help, const JsonNode & dropDownDescriptor, EShortcut key = {}, bool playerColoredButton = false);
//define this callback to fill input vector with data for the combo box //define this callback to fill input vector with data for the combo box
std::function<void(std::vector<const void *> &)> onConstructItems; std::function<void(std::vector<const void *> &)> onConstructItems;

View File

@ -38,7 +38,7 @@ void CreatureCostBox::createItems(TResources res)
TResources::nziterator iter(res); TResources::nziterator iter(res);
while(iter.valid()) while(iter.valid())
{ {
ImagePtr image = std::make_shared<CAnimImage>("RESOURCE", iter->resType); ImagePtr image = std::make_shared<CAnimImage>(AnimationPath::builtin("RESOURCE"), iter->resType);
LabelPtr text = std::make_shared<CLabel>(15, 43, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, "0"); LabelPtr text = std::make_shared<CLabel>(15, 43, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, "0");
resources.insert(std::make_pair(iter->resType, std::make_pair(text, image))); resources.insert(std::make_pair(iter->resType, std::make_pair(text, image)));

View File

@ -42,15 +42,15 @@ CPicture::CPicture(std::shared_ptr<IImage> image, const Point & position)
pos.h = bg->height(); pos.h = bg->height();
} }
CPicture::CPicture( const std::string &bmpname, int x, int y ) CPicture::CPicture( const ImagePath &bmpname, int x, int y )
: CPicture(bmpname, Point(x,y)) : CPicture(bmpname, Point(x,y))
{} {}
CPicture::CPicture( const std::string &bmpname ) CPicture::CPicture( const ImagePath & bmpname )
: CPicture(bmpname, Point(0,0)) : CPicture(bmpname, Point(0,0))
{} {}
CPicture::CPicture( const std::string &bmpname, const Point & position ) CPicture::CPicture( const ImagePath & bmpname, const Point & position )
: bg(IImage::createFromFile(bmpname)) : bg(IImage::createFromFile(bmpname))
, visible(true) , visible(true)
, needRefresh(false) , needRefresh(false)
@ -113,7 +113,7 @@ void CPicture::colorize(PlayerColor player)
bg->playerColored(player); bg->playerColored(player);
} }
CFilledTexture::CFilledTexture(std::string imageName, Rect position): CFilledTexture::CFilledTexture(const ImagePath & imageName, Rect position):
CIntObject(0, position.topLeft()), CIntObject(0, position.topLeft()),
texture(IImage::createFromFile(imageName)) texture(IImage::createFromFile(imageName))
{ {
@ -142,7 +142,7 @@ void CFilledTexture::showAll(Canvas & to)
} }
} }
FilledTexturePlayerColored::FilledTexturePlayerColored(std::string imageName, Rect position) FilledTexturePlayerColored::FilledTexturePlayerColored(const ImagePath & imageName, Rect position)
: CFilledTexture(imageName, position) : CFilledTexture(imageName, position)
{ {
} }
@ -171,7 +171,7 @@ void FilledTexturePlayerColored::playerColored(PlayerColor player)
texture->adjustPalette(filters[player.getNum()], 0); texture->adjustPalette(filters[player.getNum()], 0);
} }
CAnimImage::CAnimImage(const std::string & name, size_t Frame, size_t Group, int x, int y, ui8 Flags): CAnimImage::CAnimImage(const AnimationPath & name, size_t Frame, size_t Group, int x, int y, ui8 Flags):
frame(Frame), frame(Frame),
group(Group), group(Group),
flags(Flags) flags(Flags)
@ -307,7 +307,7 @@ bool CAnimImage::isPlayerColored() const
return player.has_value(); return player.has_value();
} }
CShowableAnim::CShowableAnim(int x, int y, std::string name, ui8 Flags, ui32 frameTime, size_t Group, uint8_t alpha): CShowableAnim::CShowableAnim(int x, int y, const AnimationPath & name, ui8 Flags, ui32 frameTime, size_t Group, uint8_t alpha):
anim(std::make_shared<CAnimation>(name)), anim(std::make_shared<CAnimation>(name)),
group(Group), group(Group),
frame(0), frame(0),
@ -448,7 +448,7 @@ void CShowableAnim::setDuration(int durationMs)
frameTimeTotal = durationMs/(last - first); frameTimeTotal = durationMs/(last - first);
} }
CCreatureAnim::CCreatureAnim(int x, int y, std::string name, ui8 flags, ECreatureAnimType type): CCreatureAnim::CCreatureAnim(int x, int y, const AnimationPath & name, ui8 flags, ECreatureAnimType type):
CShowableAnim(x, y, name, flags, 100, size_t(type)) // H3 uses 100 ms per frame, irregardless of battle speed settings CShowableAnim(x, y, name, flags, 100, size_t(type)) // H3 uses 100 ms per frame, irregardless of battle speed settings
{ {
xOffset = 0; xOffset = 0;

View File

@ -11,6 +11,7 @@
#include "../gui/CIntObject.h" #include "../gui/CIntObject.h"
#include "../battle/BattleConstants.h" #include "../battle/BattleConstants.h"
#include "../../lib/filesystem/ResourcePath.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
class Rect; class Rect;
@ -49,9 +50,9 @@ public:
CPicture(std::shared_ptr<IImage> image, const Rect &SrcRext, int x = 0, int y = 0); //wrap subrect of given surface CPicture(std::shared_ptr<IImage> image, const Rect &SrcRext, int x = 0, int y = 0); //wrap subrect of given surface
/// Loads image from specified file name /// Loads image from specified file name
CPicture(const std::string & bmpname); CPicture(const ImagePath & bmpname);
CPicture(const std::string & bmpname, const Point & position); CPicture(const ImagePath & bmpname, const Point & position);
CPicture(const std::string & bmpname, int x, int y); CPicture(const ImagePath & bmpname, int x, int y);
/// set alpha value for whole surface. Note: may be messed up if surface is shared /// set alpha value for whole surface. Note: may be messed up if surface is shared
/// 0=transparent, 255=opaque /// 0=transparent, 255=opaque
@ -71,7 +72,7 @@ protected:
Rect imageArea; Rect imageArea;
public: public:
CFilledTexture(std::string imageName, Rect position); CFilledTexture(const ImagePath & imageName, Rect position);
CFilledTexture(std::shared_ptr<IImage> image, Rect position, Rect imageArea); CFilledTexture(std::shared_ptr<IImage> image, Rect position, Rect imageArea);
void showAll(Canvas & to) override; void showAll(Canvas & to) override;
@ -80,7 +81,7 @@ public:
class FilledTexturePlayerColored : public CFilledTexture class FilledTexturePlayerColored : public CFilledTexture
{ {
public: public:
FilledTexturePlayerColored(std::string imageName, Rect position); FilledTexturePlayerColored(const ImagePath & imageName, Rect position);
void playerColored(PlayerColor player); void playerColored(PlayerColor player);
}; };
@ -105,7 +106,7 @@ private:
public: public:
bool visible; bool visible;
CAnimImage(const std::string & name, size_t Frame, size_t Group=0, int x=0, int y=0, ui8 Flags=0); CAnimImage(const AnimationPath & name, size_t Frame, size_t Group=0, int x=0, int y=0, ui8 Flags=0);
CAnimImage(std::shared_ptr<CAnimation> Anim, size_t Frame, size_t Group=0, int x=0, int y=0, ui8 Flags=0); CAnimImage(std::shared_ptr<CAnimation> Anim, size_t Frame, size_t Group=0, int x=0, int y=0, ui8 Flags=0);
CAnimImage(std::shared_ptr<CAnimation> Anim, size_t Frame, Rect targetPos, size_t Group=0, ui8 Flags=0); CAnimImage(std::shared_ptr<CAnimation> Anim, size_t Frame, Rect targetPos, size_t Group=0, ui8 Flags=0);
~CAnimImage(); ~CAnimImage();
@ -166,7 +167,7 @@ public:
//Set per-surface alpha, 0 = transparent, 255 = opaque //Set per-surface alpha, 0 = transparent, 255 = opaque
void setAlpha(ui32 alphaValue); void setAlpha(ui32 alphaValue);
CShowableAnim(int x, int y, std::string name, ui8 flags, ui32 frameTime, size_t Group=0, uint8_t alpha = UINT8_MAX); CShowableAnim(int x, int y, const AnimationPath & name, ui8 flags, ui32 frameTime, size_t Group=0, uint8_t alpha = UINT8_MAX);
~CShowableAnim(); ~CShowableAnim();
//set animation to group or part of group //set animation to group or part of group
@ -213,6 +214,6 @@ public:
//clear queue and set animation to this sequence //clear queue and set animation to this sequence
void clearAndSet(ECreatureAnimType type); void clearAndSet(ECreatureAnimType type);
CCreatureAnim(int x, int y, std::string name, ui8 flags = 0, ECreatureAnimType = ECreatureAnimType::HOLDING); CCreatureAnim(int x, int y, const AnimationPath & name, ui8 flags = 0, ECreatureAnimType = ECreatureAnimType::HOLDING);
}; };

View File

@ -126,7 +126,7 @@ CHeroArea::CHeroArea(int x, int y, const CGHeroInstance * _hero)
pos.h = 64; pos.h = 64;
if(hero) if(hero)
portrait = std::make_shared<CAnimImage>("PortraitsLarge", hero->portrait); portrait = std::make_shared<CAnimImage>(AnimationPath::builtin("PortraitsLarge"), hero->portrait);
} }
void CHeroArea::clickPressed(const Point & cursorPosition) void CHeroArea::clickPressed(const Point & cursorPosition)
@ -201,7 +201,7 @@ CMinorResDataBar::CMinorResDataBar()
pos.x = 7; pos.x = 7;
pos.y = 575; pos.y = 575;
background = std::make_shared<CPicture>("KRESBAR.bmp"); background = std::make_shared<CPicture>(ImagePath::builtin("KRESBAR.bmp"));
background->colorize(LOCPLINT->playerID); background->colorize(LOCPLINT->playerID);
pos.w = background->pos.w; pos.w = background->pos.w;
@ -233,7 +233,7 @@ void CArmyTooltip::init(const InfoAboutArmy &army)
continue; continue;
} }
icons.push_back(std::make_shared<CAnimImage>("CPRSMALL", slot.second.type->getIconIndex(), 0, slotsPos[slot.first.getNum()].x, slotsPos[slot.first.getNum()].y)); icons.push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("CPRSMALL"), slot.second.type->getIconIndex(), 0, slotsPos[slot.first.getNum()].x, slotsPos[slot.first.getNum()].y));
std::string subtitle; std::string subtitle;
if(army.army.isDetailed) if(army.army.isDetailed)
@ -276,7 +276,7 @@ CArmyTooltip::CArmyTooltip(Point pos, const CArmedInstance * army):
void CHeroTooltip::init(const InfoAboutHero & hero) void CHeroTooltip::init(const InfoAboutHero & hero)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
portrait = std::make_shared<CAnimImage>("PortraitsLarge", hero.portrait, 0, 3, 2); portrait = std::make_shared<CAnimImage>(AnimationPath::builtin("PortraitsLarge"), hero.portrait, 0, 3, 2);
if(hero.details) if(hero.details)
{ {
@ -286,8 +286,8 @@ void CHeroTooltip::init(const InfoAboutHero & hero)
labels.push_back(std::make_shared<CLabel>(158, 98, FONT_TINY, ETextAlignment::CENTER, Colors::WHITE, std::to_string(hero.details->mana))); labels.push_back(std::make_shared<CLabel>(158, 98, FONT_TINY, ETextAlignment::CENTER, Colors::WHITE, std::to_string(hero.details->mana)));
morale = std::make_shared<CAnimImage>("IMRL22", hero.details->morale + 3, 0, 5, 74); morale = std::make_shared<CAnimImage>(AnimationPath::builtin("IMRL22"), hero.details->morale + 3, 0, 5, 74);
luck = std::make_shared<CAnimImage>("ILCK22", hero.details->luck + 3, 0, 5, 91); luck = std::make_shared<CAnimImage>(AnimationPath::builtin("ILCK22"), hero.details->luck + 3, 0, 5, 91);
} }
} }
@ -314,7 +314,7 @@ CInteractableHeroTooltip::CInteractableHeroTooltip(Point pos, const CGHeroInstan
void CInteractableHeroTooltip::init(const InfoAboutHero & hero) void CInteractableHeroTooltip::init(const InfoAboutHero & hero)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
portrait = std::make_shared<CAnimImage>("PortraitsLarge", hero.portrait, 0, 3, 2); portrait = std::make_shared<CAnimImage>(AnimationPath::builtin("PortraitsLarge"), hero.portrait, 0, 3, 2);
title = std::make_shared<CLabel>(66, 2, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, hero.name); title = std::make_shared<CLabel>(66, 2, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, hero.name);
if(hero.details) if(hero.details)
@ -325,8 +325,8 @@ void CInteractableHeroTooltip::init(const InfoAboutHero & hero)
labels.push_back(std::make_shared<CLabel>(158, 98, FONT_TINY, ETextAlignment::CENTER, Colors::WHITE, std::to_string(hero.details->mana))); labels.push_back(std::make_shared<CLabel>(158, 98, FONT_TINY, ETextAlignment::CENTER, Colors::WHITE, std::to_string(hero.details->mana)));
morale = std::make_shared<CAnimImage>("IMRL22", hero.details->morale + 3, 0, 5, 74); morale = std::make_shared<CAnimImage>(AnimationPath::builtin("IMRL22"), hero.details->morale + 3, 0, 5, 74);
luck = std::make_shared<CAnimImage>("ILCK22", hero.details->luck + 3, 0, 5, 91); luck = std::make_shared<CAnimImage>(AnimationPath::builtin("ILCK22"), hero.details->luck + 3, 0, 5, 91);
} }
} }
@ -337,17 +337,17 @@ void CTownTooltip::init(const InfoAboutTown & town)
//order of icons in def: fort, citadel, castle, no fort //order of icons in def: fort, citadel, castle, no fort
size_t fortIndex = town.fortLevel ? town.fortLevel - 1 : 3; size_t fortIndex = town.fortLevel ? town.fortLevel - 1 : 3;
fort = std::make_shared<CAnimImage>("ITMCLS", fortIndex, 0, 105, 31); fort = std::make_shared<CAnimImage>(AnimationPath::builtin("ITMCLS"), fortIndex, 0, 105, 31);
assert(town.tType); assert(town.tType);
size_t iconIndex = town.tType->clientInfo.icons[town.fortLevel > 0][town.built >= CGI->settings()->getInteger(EGameSettings::TOWNS_BUILDINGS_PER_TURN_CAP)]; size_t iconIndex = town.tType->clientInfo.icons[town.fortLevel > 0][town.built >= CGI->settings()->getInteger(EGameSettings::TOWNS_BUILDINGS_PER_TURN_CAP)];
build = std::make_shared<CAnimImage>("itpt", iconIndex, 0, 3, 2); build = std::make_shared<CAnimImage>(AnimationPath::builtin("itpt"), iconIndex, 0, 3, 2);
if(town.details) if(town.details)
{ {
hall = std::make_shared<CAnimImage>("ITMTLS", town.details->hallLevel, 0, 67, 31); hall = std::make_shared<CAnimImage>(AnimationPath::builtin("ITMTLS"), town.details->hallLevel, 0, 67, 31);
if(town.details->goldIncome) if(town.details->goldIncome)
{ {
@ -355,18 +355,18 @@ void CTownTooltip::init(const InfoAboutTown & town)
std::to_string(town.details->goldIncome)); std::to_string(town.details->goldIncome));
} }
if(town.details->garrisonedHero) //garrisoned hero icon if(town.details->garrisonedHero) //garrisoned hero icon
garrisonedHero = std::make_shared<CPicture>("TOWNQKGH", 149, 76); garrisonedHero = std::make_shared<CPicture>(ImagePath::builtin("TOWNQKGH"), 149, 76);
if(town.details->customRes)//silo is built if(town.details->customRes)//silo is built
{ {
if(town.tType->primaryRes == EGameResID::WOOD_AND_ORE )// wood & ore if(town.tType->primaryRes == EGameResID::WOOD_AND_ORE )// wood & ore
{ {
res1 = std::make_shared<CAnimImage>("SMALRES", GameResID(EGameResID::WOOD), 0, 7, 75); res1 = std::make_shared<CAnimImage>(AnimationPath::builtin("SMALRES"), GameResID(EGameResID::WOOD), 0, 7, 75);
res2 = std::make_shared<CAnimImage>("SMALRES", GameResID(EGameResID::ORE), 0, 7, 88); res2 = std::make_shared<CAnimImage>(AnimationPath::builtin("SMALRES"), GameResID(EGameResID::ORE), 0, 7, 88);
} }
else else
{ {
res1 = std::make_shared<CAnimImage>("SMALRES", town.tType->primaryRes, 0, 7, 81); res1 = std::make_shared<CAnimImage>(AnimationPath::builtin("SMALRES"), town.tType->primaryRes, 0, 7, 81);
} }
} }
} }
@ -399,18 +399,18 @@ void CInteractableTownTooltip::init(const InfoAboutTown & town)
//order of icons in def: fort, citadel, castle, no fort //order of icons in def: fort, citadel, castle, no fort
size_t fortIndex = town.fortLevel ? town.fortLevel - 1 : 3; size_t fortIndex = town.fortLevel ? town.fortLevel - 1 : 3;
fort = std::make_shared<CAnimImage>("ITMCLS", fortIndex, 0, 105, 31); fort = std::make_shared<CAnimImage>(AnimationPath::builtin("ITMCLS"), fortIndex, 0, 105, 31);
assert(town.tType); assert(town.tType);
size_t iconIndex = town.tType->clientInfo.icons[town.fortLevel > 0][town.built >= CGI->settings()->getInteger(EGameSettings::TOWNS_BUILDINGS_PER_TURN_CAP)]; size_t iconIndex = town.tType->clientInfo.icons[town.fortLevel > 0][town.built >= CGI->settings()->getInteger(EGameSettings::TOWNS_BUILDINGS_PER_TURN_CAP)];
build = std::make_shared<CAnimImage>("itpt", iconIndex, 0, 3, 2); build = std::make_shared<CAnimImage>(AnimationPath::builtin("itpt"), iconIndex, 0, 3, 2);
title = std::make_shared<CLabel>(66, 2, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, town.name); title = std::make_shared<CLabel>(66, 2, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, town.name);
if(town.details) if(town.details)
{ {
hall = std::make_shared<CAnimImage>("ITMTLS", town.details->hallLevel, 0, 67, 31); hall = std::make_shared<CAnimImage>(AnimationPath::builtin("ITMTLS"), town.details->hallLevel, 0, 67, 31);
if(town.details->goldIncome) if(town.details->goldIncome)
{ {
@ -418,18 +418,18 @@ void CInteractableTownTooltip::init(const InfoAboutTown & town)
std::to_string(town.details->goldIncome)); std::to_string(town.details->goldIncome));
} }
if(town.details->garrisonedHero) //garrisoned hero icon if(town.details->garrisonedHero) //garrisoned hero icon
garrisonedHero = std::make_shared<CPicture>("TOWNQKGH", 149, 76); garrisonedHero = std::make_shared<CPicture>(ImagePath::builtin("TOWNQKGH"), 149, 76);
if(town.details->customRes)//silo is built if(town.details->customRes)//silo is built
{ {
if(town.tType->primaryRes == EGameResID::WOOD_AND_ORE )// wood & ore if(town.tType->primaryRes == EGameResID::WOOD_AND_ORE )// wood & ore
{ {
res1 = std::make_shared<CAnimImage>("SMALRES", GameResID(EGameResID::WOOD), 0, 7, 75); res1 = std::make_shared<CAnimImage>(AnimationPath::builtin("SMALRES"), GameResID(EGameResID::WOOD), 0, 7, 75);
res2 = std::make_shared<CAnimImage>("SMALRES", GameResID(EGameResID::ORE), 0, 7, 88); res2 = std::make_shared<CAnimImage>(AnimationPath::builtin("SMALRES"), GameResID(EGameResID::ORE), 0, 7, 88);
} }
else else
{ {
res1 = std::make_shared<CAnimImage>("SMALRES", town.tType->primaryRes, 0, 7, 81); res1 = std::make_shared<CAnimImage>(AnimationPath::builtin("SMALRES"), town.tType->primaryRes, 0, 7, 81);
} }
} }
} }
@ -492,7 +492,7 @@ void MoraleLuckBox::set(const AFactionMember * node)
else else
imageName = morale ? "IMRL42" : "ILCK42"; imageName = morale ? "IMRL42" : "ILCK42";
image = std::make_shared<CAnimImage>(imageName, bonusValue + 3); image = std::make_shared<CAnimImage>(AnimationPath::builtin(imageName), bonusValue + 3);
image->moveBy(Point(pos.w/2 - image->pos.w/2, pos.h/2 - image->pos.h/2));//center icon image->moveBy(Point(pos.w/2 - image->pos.w/2, pos.h/2 - image->pos.h/2));//center icon
} }

View File

@ -27,10 +27,10 @@ RadialMenuItem::RadialMenuItem(const std::string & imageName, const std::string
{ {
OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE; OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
inactiveImage = std::make_shared<CPicture>("radialMenu/itemInactive", Point(0, 0)); inactiveImage = std::make_shared<CPicture>(ImagePath::builtin("radialMenu/itemInactive"), Point(0, 0));
selectedImage = std::make_shared<CPicture>("radialMenu/itemEmpty", Point(0, 0)); selectedImage = std::make_shared<CPicture>(ImagePath::builtin("radialMenu/itemEmpty"), Point(0, 0));
iconImage = std::make_shared<CPicture>("radialMenu/" + imageName, Point(0, 0)); iconImage = std::make_shared<CPicture>(ImagePath::builtin("radialMenu/" + imageName), Point(0, 0));
pos = selectedImage->pos; pos = selectedImage->pos;
selectedImage->setEnabled(false); selectedImage->setEnabled(false);
@ -56,7 +56,7 @@ RadialMenu::RadialMenu(const Point & positionToCenter, const std::vector<RadialM
for (auto const & item : menuConfig) for (auto const & item : menuConfig)
addItem(item.itemPosition, item.enabled, item.imageName, item.hoverText, item.callback); addItem(item.itemPosition, item.enabled, item.imageName, item.hoverText, item.callback);
statusBar = CGStatusBar::create(-80, -100, "radialMenu/statusBar"); statusBar = CGStatusBar::create(-80, -100, ImagePath::builtin("radialMenu/statusBar"));
for(const auto & item : items) for(const auto & item : items)
pos = pos.include(item->pos); pos = pos.include(item->pos);

View File

@ -178,7 +178,7 @@ CSlider::CSlider(Point position, int totalw, std::function<void(int)> Moved, int
if(style == BROWN) if(style == BROWN)
{ {
std::string name = getOrientation() == Orientation::HORIZONTAL ? "IGPCRDIV.DEF" : "OVBUTN2.DEF"; AnimationPath name = AnimationPath::builtin(getOrientation() == Orientation::HORIZONTAL ? "IGPCRDIV.DEF" : "OVBUTN2.DEF");
//NOTE: this images do not have "blocked" frames. They should be implemented somehow (e.g. palette transform or something...) //NOTE: this images do not have "blocked" frames. They should be implemented somehow (e.g. palette transform or something...)
left = std::make_shared<CButton>(Point(), name, CButton::tooltip()); left = std::make_shared<CButton>(Point(), name, CButton::tooltip());
@ -191,9 +191,9 @@ CSlider::CSlider(Point position, int totalw, std::function<void(int)> Moved, int
} }
else else
{ {
left = std::make_shared<CButton>(Point(), getOrientation() == Orientation::HORIZONTAL ? "SCNRBLF.DEF" : "SCNRBUP.DEF", CButton::tooltip()); left = std::make_shared<CButton>(Point(), AnimationPath::builtin(getOrientation() == Orientation::HORIZONTAL ? "SCNRBLF.DEF" : "SCNRBUP.DEF"), CButton::tooltip());
right = std::make_shared<CButton>(Point(), getOrientation() == Orientation::HORIZONTAL ? "SCNRBRT.DEF" : "SCNRBDN.DEF", CButton::tooltip()); right = std::make_shared<CButton>(Point(), AnimationPath::builtin(getOrientation() == Orientation::HORIZONTAL ? "SCNRBRT.DEF" : "SCNRBDN.DEF"), CButton::tooltip());
slider = std::make_shared<CButton>(Point(), "SCNRBSL.DEF", CButton::tooltip()); slider = std::make_shared<CButton>(Point(), AnimationPath::builtin("SCNRBSL.DEF"), CButton::tooltip());
} }
slider->actOnDown = true; slider->actOnDown = true;
slider->soundDisabled = true; slider->soundDisabled = true;

View File

@ -419,7 +419,7 @@ CGStatusBar::CGStatusBar(std::shared_ptr<CIntObject> background_, EFonts Font, E
autoRedraw = false; autoRedraw = false;
} }
CGStatusBar::CGStatusBar(int x, int y, std::string name, int maxw) CGStatusBar::CGStatusBar(int x, int y, const ImagePath & name, int maxw)
: CLabel(x, y, FONT_SMALL, ETextAlignment::CENTER) : CLabel(x, y, FONT_SMALL, ETextAlignment::CENTER)
, enteringText(false) , enteringText(false)
{ {
@ -503,7 +503,7 @@ CTextInput::CTextInput(const Rect & Pos, EFonts font, const CFunctionList<void(c
#endif #endif
} }
CTextInput::CTextInput(const Rect & Pos, const Point & bgOffset, const std::string & bgName, const CFunctionList<void(const std::string &)> & CB) CTextInput::CTextInput(const Rect & Pos, const Point & bgOffset, const ImagePath & bgName, const CFunctionList<void(const std::string &)> & CB)
:cb(CB), CFocusable(std::make_shared<CKeyboardFocusListener>(this)) :cb(CB), CFocusable(std::make_shared<CKeyboardFocusListener>(this))
{ {
pos += Pos.topLeft(); pos += Pos.topLeft();

View File

@ -14,6 +14,7 @@
#include "../render/Colors.h" #include "../render/Colors.h"
#include "../render/EFont.h" #include "../render/EFont.h"
#include "../../lib/FunctionList.h" #include "../../lib/FunctionList.h"
#include "../../lib/filesystem/ResourcePath.h"
class IImage; class IImage;
class CSlider; class CSlider;
@ -124,7 +125,7 @@ class CGStatusBar : public CLabel, public std::enable_shared_from_this<CGStatusB
bool enteringText; bool enteringText;
CGStatusBar(std::shared_ptr<CIntObject> background_, EFonts Font = FONT_SMALL, ETextAlignment Align = ETextAlignment::CENTER, const ColorRGBA & Color = Colors::WHITE); CGStatusBar(std::shared_ptr<CIntObject> background_, EFonts Font = FONT_SMALL, ETextAlignment Align = ETextAlignment::CENTER, const ColorRGBA & Color = Colors::WHITE);
CGStatusBar(int x, int y, std::string name, int maxw = -1); CGStatusBar(int x, int y, const ImagePath & name, int maxw = -1);
//make CLabel API private //make CLabel API private
using CLabel::getText; using CLabel::getText;
@ -223,7 +224,7 @@ public:
void setHelpText(const std::string &); void setHelpText(const std::string &);
CTextInput(const Rect & Pos, EFonts font, const CFunctionList<void(const std::string &)> & CB); CTextInput(const Rect & Pos, EFonts font, const CFunctionList<void(const std::string &)> & CB);
CTextInput(const Rect & Pos, const Point & bgOffset, const std::string & bgName, const CFunctionList<void(const std::string &)> & CB); CTextInput(const Rect & Pos, const Point & bgOffset, const ImagePath & bgName, const CFunctionList<void(const std::string &)> & CB);
CTextInput(const Rect & Pos, std::shared_ptr<IImage> srf); CTextInput(const Rect & Pos, std::shared_ptr<IImage> srf);
void clickPressed(const Point & cursorPosition) override; void clickPressed(const Point & cursorPosition) override;

View File

@ -263,7 +263,7 @@ bool CBuildingRect::receiveEvent(const Point & position, int eventType) const
} }
CDwellingInfoBox::CDwellingInfoBox(int centerX, int centerY, const CGTownInstance * Town, int level) CDwellingInfoBox::CDwellingInfoBox(int centerX, int centerY, const CGTownInstance * Town, int level)
: CWindowObject(RCLICK_POPUP, "CRTOINFO", Point(centerX, centerY)) : CWindowObject(RCLICK_POPUP, ImagePath::builtin("CRTOINFO"), Point(centerX, centerY))
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
background->colorize(Town->tempOwner); background->colorize(Town->tempOwner);
@ -282,7 +282,7 @@ CDwellingInfoBox::CDwellingInfoBox(int centerX, int centerY, const CGTownInstanc
auto res = static_cast<EGameResID>(i); auto res = static_cast<EGameResID>(i);
if(creature->getRecruitCost(res)) if(creature->getRecruitCost(res))
{ {
resPicture.push_back(std::make_shared<CAnimImage>("RESOURCE", i, 0, 0, 0)); resPicture.push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("RESOURCE"), i, 0, 0, 0));
resAmount.push_back(std::make_shared<CLabel>(0,0, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, std::to_string(creature->getRecruitCost(res)))); resAmount.push_back(std::make_shared<CLabel>(0,0, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, std::to_string(creature->getRecruitCost(res))));
} }
} }
@ -310,13 +310,13 @@ CHeroGSlot::CHeroGSlot(int x, int y, int updown, const CGHeroInstance * h, HeroS
pos.h = 64; pos.h = 64;
upg = updown; upg = updown;
portrait = std::make_shared<CAnimImage>("PortraitsLarge", 0, 0, 0, 0); portrait = std::make_shared<CAnimImage>(AnimationPath::builtin("PortraitsLarge"), 0, 0, 0, 0);
portrait->visible = false; portrait->visible = false;
flag = std::make_shared<CAnimImage>("CREST58", 0, 0, 0, 0); flag = std::make_shared<CAnimImage>(AnimationPath::builtin("CREST58"), 0, 0, 0, 0);
flag->visible = false; flag->visible = false;
selection = std::make_shared<CAnimImage>("TWCRPORT", 1, 0); selection = std::make_shared<CAnimImage>(AnimationPath::builtin("TWCRPORT"), 1, 0);
selection->visible = false; selection->visible = false;
set(h); set(h);
@ -981,9 +981,8 @@ void CCastleBuildings::enterTownHall()
void CCastleBuildings::openMagesGuild() void CCastleBuildings::openMagesGuild()
{ {
std::string mageGuildBackground; auto mageGuildBackground = LOCPLINT->castleInt->town->town->clientInfo.guildBackground;
mageGuildBackground = LOCPLINT->castleInt->town->town->clientInfo.guildBackground; GH.windows().createAndPushWindow<CMageGuildScreen>(LOCPLINT->castleInt, mageGuildBackground);
GH.windows().createAndPushWindow<CMageGuildScreen>(LOCPLINT->castleInt,mageGuildBackground);
} }
void CCastleBuildings::openTownHall() void CCastleBuildings::openTownHall()
@ -1009,7 +1008,7 @@ CCreaInfo::CCreaInfo(Point position, const CGTownInstance * Town, int Level, boo
ui32 creatureID = town->creatures[level].second.back(); ui32 creatureID = town->creatures[level].second.back();
creature = CGI->creh->objects[creatureID]; creature = CGI->creh->objects[creatureID];
picture = std::make_shared<CAnimImage>("CPRSMALL", creature->getIconIndex(), 0, 8, 0); picture = std::make_shared<CAnimImage>(AnimationPath::builtin("CPRSMALL"), creature->getIconIndex(), 0, 8, 0);
std::string value; std::string value;
if(showAvailable) if(showAvailable)
@ -1109,14 +1108,14 @@ CTownInfo::CTownInfo(int posX, int posY, const CGTownInstance * Town, bool townH
if(townHall) if(townHall)
{ {
buildID = 10 + town->hallLevel(); buildID = 10 + town->hallLevel();
picture = std::make_shared<CAnimImage>("ITMTL.DEF", town->hallLevel()); picture = std::make_shared<CAnimImage>(AnimationPath::builtin("ITMTL.DEF"), town->hallLevel());
} }
else else
{ {
buildID = 6 + town->fortLevel(); buildID = 6 + town->fortLevel();
if(buildID == 6) if(buildID == 6)
return;//FIXME: suspicious statement, fix or comment return;//FIXME: suspicious statement, fix or comment
picture = std::make_shared<CAnimImage>("ITMCL.DEF", town->fortLevel()-1); picture = std::make_shared<CAnimImage>(AnimationPath::builtin("ITMCL.DEF"), town->fortLevel()-1);
} }
building = town->town->buildings.at(BuildingID(buildID)); building = town->town->buildings.at(BuildingID(buildID));
pos = picture->pos; pos = picture->pos;
@ -1154,7 +1153,7 @@ CCastleInterface::CCastleInterface(const CGTownInstance * Town, const CGTownInst
addUsedEvents(KEYBOARD); addUsedEvents(KEYBOARD);
builds = std::make_shared<CCastleBuildings>(town); builds = std::make_shared<CCastleBuildings>(town);
panel = std::make_shared<CPicture>("TOWNSCRN", 0, builds->pos.h); panel = std::make_shared<CPicture>(ImagePath::builtin("TOWNSCRN"), 0, builds->pos.h);
panel->colorize(LOCPLINT->playerID); panel->colorize(LOCPLINT->playerID);
pos.w = panel->pos.w; pos.w = panel->pos.w;
pos.h = builds->pos.h + panel->pos.h; pos.h = builds->pos.h + panel->pos.h;
@ -1167,12 +1166,12 @@ CCastleInterface::CCastleInterface(const CGTownInstance * Town, const CGTownInst
heroes = std::make_shared<HeroSlots>(town, Point(241, 387), Point(241, 483), garr, true); heroes = std::make_shared<HeroSlots>(town, Point(241, 387), Point(241, 483), garr, true);
title = std::make_shared<CLabel>(85, 387, FONT_MEDIUM, ETextAlignment::TOPLEFT, Colors::WHITE, town->getNameTranslated()); title = std::make_shared<CLabel>(85, 387, FONT_MEDIUM, ETextAlignment::TOPLEFT, Colors::WHITE, town->getNameTranslated());
income = std::make_shared<CLabel>(195, 443, FONT_SMALL, ETextAlignment::CENTER); income = std::make_shared<CLabel>(195, 443, FONT_SMALL, ETextAlignment::CENTER);
icon = std::make_shared<CAnimImage>("ITPT", 0, 0, 15, 387); icon = std::make_shared<CAnimImage>(AnimationPath::builtin("ITPT"), 0, 0, 15, 387);
exit = std::make_shared<CButton>(Point(744, 544), "TSBTNS", CButton::tooltip(CGI->generaltexth->tcommands[8]), [&](){close();}, EShortcut::GLOBAL_RETURN); exit = std::make_shared<CButton>(Point(744, 544), AnimationPath::builtin("TSBTNS"), CButton::tooltip(CGI->generaltexth->tcommands[8]), [&](){close();}, EShortcut::GLOBAL_RETURN);
exit->setImageOrder(4, 5, 6, 7); exit->setImageOrder(4, 5, 6, 7);
auto split = std::make_shared<CButton>(Point(744, 382), "TSBTNS", CButton::tooltip(CGI->generaltexth->tcommands[3]), [&]() auto split = std::make_shared<CButton>(Point(744, 382), AnimationPath::builtin("TSBTNS"), CButton::tooltip(CGI->generaltexth->tcommands[3]), [&]()
{ {
garr->splitClick(); garr->splitClick();
heroes->splitClicked(); heroes->splitClicked();
@ -1182,11 +1181,11 @@ CCastleInterface::CCastleInterface(const CGTownInstance * Town, const CGTownInst
Rect barRect(9, 182, 732, 18); Rect barRect(9, 182, 732, 18);
auto statusbarBackground = std::make_shared<CPicture>(panel->getSurface(), barRect, 9, 555); auto statusbarBackground = std::make_shared<CPicture>(panel->getSurface(), barRect, 9, 555);
statusbar = CGStatusBar::create(statusbarBackground); statusbar = CGStatusBar::create(statusbarBackground);
resdatabar = std::make_shared<CResDataBar>("ARESBAR", 3, 575, 37, 3, 84, 78); resdatabar = std::make_shared<CResDataBar>(ImagePath::builtin("ARESBAR"), 3, 575, 37, 3, 84, 78);
townlist = std::make_shared<CTownList>(3, Rect(Point(743, 414), Point(48, 128)), Point(1,16), Point(0, 32), LOCPLINT->localState->getOwnedTowns().size() ); townlist = std::make_shared<CTownList>(3, Rect(Point(743, 414), Point(48, 128)), Point(1,16), Point(0, 32), LOCPLINT->localState->getOwnedTowns().size() );
townlist->setScrollUpButton( std::make_shared<CButton>( Point(744, 414), "IAM014", CButton::tooltipLocalized("core.help.306"))); townlist->setScrollUpButton( std::make_shared<CButton>( Point(744, 414), AnimationPath::builtin("IAM014"), CButton::tooltipLocalized("core.help.306")));
townlist->setScrollDownButton( std::make_shared<CButton>( Point(744, 526), "IAM015", CButton::tooltipLocalized("core.help.307"))); townlist->setScrollDownButton( std::make_shared<CButton>( Point(744, 526), AnimationPath::builtin("IAM015"), CButton::tooltipLocalized("core.help.307")));
if(from) if(from)
townlist->select(from); townlist->select(from);
@ -1277,7 +1276,7 @@ void CCastleInterface::recreateIcons()
hall = std::make_shared<CTownInfo>(80, 413, town, true); hall = std::make_shared<CTownInfo>(80, 413, town, true);
fort = std::make_shared<CTownInfo>(122, 413, town, false); fort = std::make_shared<CTownInfo>(122, 413, town, false);
fastArmyPurchase = std::make_shared<CButton>(Point(122, 413), "itmcl.def", CButton::tooltip(), [&](){ builds->enterToTheQuickRecruitmentWindow(); }); fastArmyPurchase = std::make_shared<CButton>(Point(122, 413), AnimationPath::builtin("itmcl.def"), CButton::tooltip(), [&](){ builds->enterToTheQuickRecruitmentWindow(); });
fastArmyPurchase->setImageOrder(town->fortLevel() - 1, town->fortLevel() - 1, town->fortLevel() - 1, town->fortLevel() - 1); fastArmyPurchase->setImageOrder(town->fortLevel() - 1, town->fortLevel() - 1, town->fortLevel() - 1, town->fortLevel() - 1);
fastArmyPurchase->setAnimateLonelyFrame(true); fastArmyPurchase->setAnimateLonelyFrame(true);
@ -1351,9 +1350,9 @@ CHallInterface::CBuildingBox::CBuildingBox(int x, int y, const CGTownInstance *
}; };
icon = std::make_shared<CAnimImage>(town->town->clientInfo.buildingsIcons, building->bid, 0, 2, 2); icon = std::make_shared<CAnimImage>(town->town->clientInfo.buildingsIcons, building->bid, 0, 2, 2);
header = std::make_shared<CAnimImage>("TPTHBAR", panelIndex[static_cast<int>(state)], 0, 1, 73); header = std::make_shared<CAnimImage>(AnimationPath::builtin("TPTHBAR"), panelIndex[static_cast<int>(state)], 0, 1, 73);
if(iconIndex[static_cast<int>(state)] >=0) if(iconIndex[static_cast<int>(state)] >=0)
mark = std::make_shared<CAnimImage>("TPTHCHK", iconIndex[static_cast<int>(state)], 0, 136, 56); mark = std::make_shared<CAnimImage>(AnimationPath::builtin("TPTHCHK"), iconIndex[static_cast<int>(state)], 0, 136, 56);
name = std::make_shared<CLabel>(75, 81, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, building->getNameTranslated()); name = std::make_shared<CLabel>(75, 81, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, building->getNameTranslated());
//todo: add support for all possible states //todo: add support for all possible states
@ -1405,7 +1404,7 @@ CHallInterface::CHallInterface(const CGTownInstance * Town):
statusbar = CGStatusBar::create(statusbarBackground); statusbar = CGStatusBar::create(statusbarBackground);
title = std::make_shared<CLabel>(399, 12, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, town->town->buildings.at(BuildingID(town->hallLevel()+BuildingID::VILLAGE_HALL))->getNameTranslated()); title = std::make_shared<CLabel>(399, 12, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, town->town->buildings.at(BuildingID(town->hallLevel()+BuildingID::VILLAGE_HALL))->getNameTranslated());
exit = std::make_shared<CButton>(Point(748, 556), "TPMAGE1.DEF", CButton::tooltip(CGI->generaltexth->hcommands[8]), [&](){close();}, EShortcut::GLOBAL_RETURN); exit = std::make_shared<CButton>(Point(748, 556), AnimationPath::builtin("TPMAGE1.DEF"), CButton::tooltip(CGI->generaltexth->hcommands[8]), [&](){close();}, EShortcut::GLOBAL_RETURN);
auto & boxList = town->town->clientInfo.hallSlots; auto & boxList = town->town->clientInfo.hallSlots;
boxes.resize(boxList.size()); boxes.resize(boxList.size());
@ -1440,7 +1439,7 @@ CHallInterface::CHallInterface(const CGTownInstance * Town):
} }
CBuildWindow::CBuildWindow(const CGTownInstance *Town, const CBuilding * Building, EBuildingState state, bool rightClick): CBuildWindow::CBuildWindow(const CGTownInstance *Town, const CBuilding * Building, EBuildingState state, bool rightClick):
CStatusbarWindow(PLAYER_COLORED | (rightClick ? RCLICK_POPUP : 0), "TPUBUILD"), CStatusbarWindow(PLAYER_COLORED | (rightClick ? RCLICK_POPUP : 0), ImagePath::builtin("TPUBUILD")),
town(Town), town(Town),
building(Building) building(Building)
{ {
@ -1480,11 +1479,11 @@ CBuildWindow::CBuildWindow(const CGTownInstance *Town, const CBuilding * Buildin
tooltipNo.appendTextID("core.genrltxt.596"); tooltipNo.appendTextID("core.genrltxt.596");
tooltipNo.replaceTextID(building->getNameTextID()); tooltipNo.replaceTextID(building->getNameTextID());
buy = std::make_shared<CButton>(Point(45, 446), "IBUY30", CButton::tooltip(tooltipYes.toString()), [&](){ buyFunc(); }, EShortcut::GLOBAL_ACCEPT); buy = std::make_shared<CButton>(Point(45, 446), AnimationPath::builtin("IBUY30"), CButton::tooltip(tooltipYes.toString()), [&](){ buyFunc(); }, EShortcut::GLOBAL_ACCEPT);
buy->setBorderColor(Colors::METALLIC_GOLD); buy->setBorderColor(Colors::METALLIC_GOLD);
buy->block(state!=EBuildingState::ALLOWED || LOCPLINT->playerID != town->tempOwner); buy->block(state!=EBuildingState::ALLOWED || LOCPLINT->playerID != town->tempOwner);
cancel = std::make_shared<CButton>(Point(290, 445), "ICANCEL", CButton::tooltip(tooltipNo.toString()), [&](){ close();}, EShortcut::GLOBAL_CANCEL); cancel = std::make_shared<CButton>(Point(290, 445), AnimationPath::builtin("ICANCEL"), CButton::tooltip(tooltipNo.toString()), [&](){ close();}, EShortcut::GLOBAL_CANCEL);
cancel->setBorderColor(Colors::METALLIC_GOLD); cancel->setBorderColor(Colors::METALLIC_GOLD);
} }
} }
@ -1589,7 +1588,7 @@ CFortScreen::CFortScreen(const CGTownInstance * town):
title = std::make_shared<CLabel>(400, 12, FONT_BIG, ETextAlignment::CENTER, Colors::WHITE, fortBuilding->getNameTranslated()); title = std::make_shared<CLabel>(400, 12, FONT_BIG, ETextAlignment::CENTER, Colors::WHITE, fortBuilding->getNameTranslated());
std::string text = boost::str(boost::format(CGI->generaltexth->fcommands[6]) % fortBuilding->getNameTranslated()); std::string text = boost::str(boost::format(CGI->generaltexth->fcommands[6]) % fortBuilding->getNameTranslated());
exit = std::make_shared<CButton>(Point(748, 556), "TPMAGE1", CButton::tooltip(text), [&](){ close(); }, EShortcut::GLOBAL_RETURN); exit = std::make_shared<CButton>(Point(748, 556), AnimationPath::builtin("TPMAGE1"), CButton::tooltip(text), [&](){ close(); }, EShortcut::GLOBAL_RETURN);
std::vector<Point> positions = std::vector<Point> positions =
{ {
@ -1637,16 +1636,16 @@ CFortScreen::CFortScreen(const CGTownInstance * town):
statusbar = CGStatusBar::create(statusbarBackground); statusbar = CGStatusBar::create(statusbarBackground);
} }
std::string CFortScreen::getBgName(const CGTownInstance * town) ImagePath CFortScreen::getBgName(const CGTownInstance * town)
{ {
ui32 fortSize = static_cast<ui32>(town->creatures.size()); ui32 fortSize = static_cast<ui32>(town->creatures.size());
if(fortSize > GameConstants::CREATURES_PER_TOWN && town->creatures.back().second.empty()) if(fortSize > GameConstants::CREATURES_PER_TOWN && town->creatures.back().second.empty())
fortSize--; fortSize--;
if(fortSize == GameConstants::CREATURES_PER_TOWN) if(fortSize == GameConstants::CREATURES_PER_TOWN)
return "TPCASTL7"; return ImagePath::builtin("TPCASTL7");
else else
return "TPCASTL8"; return ImagePath::builtin("TPCASTL8");
} }
void CFortScreen::creaturesChangedEventHandler() void CFortScreen::creaturesChangedEventHandler()
@ -1673,7 +1672,7 @@ CFortScreen::RecruitArea::RecruitArea(int posX, int posY, const CGTownInstance *
addUsedEvents(SHOW_POPUP); addUsedEvents(SHOW_POPUP);
icons = std::make_shared<CPicture>("TPCAINFO", 261, 3); icons = std::make_shared<CPicture>(ImagePath::builtin("TPCAINFO"), 261, 3);
if(getMyBuilding() != nullptr) if(getMyBuilding() != nullptr)
{ {
@ -1766,8 +1765,8 @@ void CFortScreen::RecruitArea::showPopupWindow(const Point & cursorPosition)
GH.windows().createAndPushWindow<CStackWindow>(getMyCreature(), true); GH.windows().createAndPushWindow<CStackWindow>(getMyCreature(), true);
} }
CMageGuildScreen::CMageGuildScreen(CCastleInterface * owner,std::string imagem) CMageGuildScreen::CMageGuildScreen(CCastleInterface * owner, const ImagePath & imagename)
: CStatusbarWindow(BORDERED, imagem) : CStatusbarWindow(BORDERED, imagename)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@ -1781,7 +1780,7 @@ CMageGuildScreen::CMageGuildScreen(CCastleInterface * owner,std::string imagem)
auto statusbarBackground = std::make_shared<CPicture>(background->getSurface(), barRect, 7, 556); auto statusbarBackground = std::make_shared<CPicture>(background->getSurface(), barRect, 7, 556);
statusbar = CGStatusBar::create(statusbarBackground); statusbar = CGStatusBar::create(statusbarBackground);
exit = std::make_shared<CButton>(Point(748, 556), "TPMAGE1.DEF", CButton::tooltip(CGI->generaltexth->allTexts[593]), [&](){ close(); }, EShortcut::GLOBAL_RETURN); exit = std::make_shared<CButton>(Point(748, 556), AnimationPath::builtin("TPMAGE1.DEF"), CButton::tooltip(CGI->generaltexth->allTexts[593]), [&](){ close(); }, EShortcut::GLOBAL_RETURN);
static const std::vector<std::vector<Point> > positions = static const std::vector<std::vector<Point> > positions =
{ {
@ -1800,7 +1799,7 @@ CMageGuildScreen::CMageGuildScreen(CCastleInterface * owner,std::string imagem)
if(i<owner->town->mageGuildLevel() && owner->town->spells[i].size()>j) if(i<owner->town->mageGuildLevel() && owner->town->spells[i].size()>j)
spells.push_back(std::make_shared<Scroll>(positions[i][j], CGI->spellh->objects[owner->town->spells[i][j]])); spells.push_back(std::make_shared<Scroll>(positions[i][j], CGI->spellh->objects[owner->town->spells[i][j]]));
else else
emptyScrolls.push_back(std::make_shared<CAnimImage>("TPMAGES.DEF", 1, 0, positions[i][j].x, positions[i][j].y)); emptyScrolls.push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("TPMAGES.DEF"), 1, 0, positions[i][j].x, positions[i][j].y));
} }
} }
} }
@ -1812,7 +1811,7 @@ CMageGuildScreen::Scroll::Scroll(Point position, const CSpell *Spell)
addUsedEvents(LCLICK | SHOW_POPUP | HOVER); addUsedEvents(LCLICK | SHOW_POPUP | HOVER);
pos += position; pos += position;
image = std::make_shared<CAnimImage>("SPELLSCR", spell->id); image = std::make_shared<CAnimImage>(AnimationPath::builtin("SPELLSCR"), spell->id);
pos = image->pos; pos = image->pos;
} }
@ -1836,7 +1835,7 @@ void CMageGuildScreen::Scroll::hover(bool on)
} }
CBlacksmithDialog::CBlacksmithDialog(bool possible, CreatureID creMachineID, ArtifactID aid, ObjectInstanceID hid): CBlacksmithDialog::CBlacksmithDialog(bool possible, CreatureID creMachineID, ArtifactID aid, ObjectInstanceID hid):
CStatusbarWindow(PLAYER_COLORED, "TPSMITH") CStatusbarWindow(PLAYER_COLORED, ImagePath::builtin("TPSMITH"))
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@ -1845,7 +1844,7 @@ CBlacksmithDialog::CBlacksmithDialog(bool possible, CreatureID creMachineID, Art
auto statusbarBackground = std::make_shared<CPicture>(background->getSurface(), barRect, 8, pos.h - 26); auto statusbarBackground = std::make_shared<CPicture>(background->getSurface(), barRect, 8, pos.h - 26);
statusbar = CGStatusBar::create(statusbarBackground); statusbar = CGStatusBar::create(statusbarBackground);
animBG = std::make_shared<CPicture>("TPSMITBK", 64, 50); animBG = std::make_shared<CPicture>(ImagePath::builtin("TPSMITBK"), 64, 50);
animBG->needRefresh = true; animBG->needRefresh = true;
const CCreature * creature = CGI->creh->objects[creMachineID]; const CCreature * creature = CGI->creh->objects[creMachineID];
@ -1869,13 +1868,13 @@ CBlacksmithDialog::CBlacksmithDialog(bool possible, CreatureID creMachineID, Art
title = std::make_shared<CLabel>(165, 28, FONT_BIG, ETextAlignment::CENTER, Colors::YELLOW, titleString.toString()); title = std::make_shared<CLabel>(165, 28, FONT_BIG, ETextAlignment::CENTER, Colors::YELLOW, titleString.toString());
costText = std::make_shared<CLabel>(165, 218, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->jktexts[43]); costText = std::make_shared<CLabel>(165, 218, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->jktexts[43]);
costValue = std::make_shared<CLabel>(165, 292, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, costString); costValue = std::make_shared<CLabel>(165, 292, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, costString);
buy = std::make_shared<CButton>(Point(42, 312), "IBUY30.DEF", CButton::tooltip(buyText.toString()), [&](){ close(); }, EShortcut::GLOBAL_ACCEPT); buy = std::make_shared<CButton>(Point(42, 312), AnimationPath::builtin("IBUY30.DEF"), CButton::tooltip(buyText.toString()), [&](){ close(); }, EShortcut::GLOBAL_ACCEPT);
cancel = std::make_shared<CButton>(Point(224, 312), "ICANCEL.DEF", CButton::tooltip(cancelText.toString()), [&](){ close(); }, EShortcut::GLOBAL_CANCEL); cancel = std::make_shared<CButton>(Point(224, 312), AnimationPath::builtin("ICANCEL.DEF"), CButton::tooltip(cancelText.toString()), [&](){ close(); }, EShortcut::GLOBAL_CANCEL);
if(possible) if(possible)
buy->addCallback([=](){ LOCPLINT->cb->buyArtifact(LOCPLINT->cb->getHero(hid),aid); }); buy->addCallback([=](){ LOCPLINT->cb->buyArtifact(LOCPLINT->cb->getHero(hid),aid); });
else else
buy->block(true); buy->block(true);
costIcon = std::make_shared<CAnimImage>("RESOURCE", GameResID(EGameResID::GOLD), 0, 148, 244); costIcon = std::make_shared<CAnimImage>(AnimationPath::builtin("RESOURCE"), GameResID(EGameResID::GOLD), 0, 148, 244);
} }

View File

@ -355,7 +355,7 @@ class CFortScreen : public CStatusbarWindow
std::shared_ptr<CMinorResDataBar> resdatabar; std::shared_ptr<CMinorResDataBar> resdatabar;
std::shared_ptr<CButton> exit; std::shared_ptr<CButton> exit;
std::string getBgName(const CGTownInstance * town); ImagePath getBgName(const CGTownInstance * town);
public: public:
CFortScreen(const CGTownInstance * town); CFortScreen(const CGTownInstance * town);
@ -385,7 +385,7 @@ class CMageGuildScreen : public CStatusbarWindow
std::shared_ptr<CMinorResDataBar> resdatabar; std::shared_ptr<CMinorResDataBar> resdatabar;
public: public:
CMageGuildScreen(CCastleInterface * owner,std::string image); CMageGuildScreen(CCastleInterface * owner, const ImagePath & image);
}; };
/// The blacksmith window where you can buy available in town war machine /// The blacksmith window where you can buy available in town war machine

View File

@ -118,7 +118,7 @@ void CCommanderSkillIcon::clickPressed(const Point & cursorPosition)
callback(); callback();
} }
static std::string skillToFile(int skill, int level, bool selected) static ImagePath skillToFile(int skill, int level, bool selected)
{ {
// FIXME: is this a correct hadling? // FIXME: is this a correct hadling?
// level 0 = skill not present, use image with "no" suffix // level 0 = skill not present, use image with "no" suffix
@ -156,24 +156,24 @@ static std::string skillToFile(int skill, int level, bool selected)
if (selected) if (selected)
sufix += "="; //level-up highlight sufix += "="; //level-up highlight
return file + sufix + ".bmp"; return ImagePath::builtin(file + sufix + ".bmp");
} }
CStackWindow::CWindowSection::CWindowSection(CStackWindow * parent, std::string backgroundPath, int yOffset) CStackWindow::CWindowSection::CWindowSection(CStackWindow * parent, const ImagePath & backgroundPath, int yOffset)
: parent(parent) : parent(parent)
{ {
pos.y += yOffset; pos.y += yOffset;
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
if(!backgroundPath.empty()) if(!backgroundPath.empty())
{ {
background = std::make_shared<CPicture>("stackWindow/" + backgroundPath); background = std::make_shared<CPicture>(backgroundPath);
pos.w = background->pos.w; pos.w = background->pos.w;
pos.h = background->pos.h; pos.h = background->pos.h;
} }
} }
CStackWindow::ActiveSpellsSection::ActiveSpellsSection(CStackWindow * owner, int yOffset) CStackWindow::ActiveSpellsSection::ActiveSpellsSection(CStackWindow * owner, int yOffset)
: CWindowSection(owner, "spell-effects", yOffset) : CWindowSection(owner, ImagePath::builtin("stackWindow/spell-effects"), yOffset)
{ {
static const Point firstPos(6, 2); // position of 1st spell box static const Point firstPos(6, 2); // position of 1st spell box
static const Point offset(54, 0); // offset of each spell box from previous static const Point offset(54, 0); // offset of each spell box from previous
@ -205,7 +205,7 @@ CStackWindow::ActiveSpellsSection::ActiveSpellsSection(CStackWindow * owner, int
int duration = battleStack->getBonusLocalFirst(Selector::source(BonusSource::SPELL_EFFECT,effect))->turnsRemain; int duration = battleStack->getBonusLocalFirst(Selector::source(BonusSource::SPELL_EFFECT,effect))->turnsRemain;
boost::replace_first(spellText, "%d", std::to_string(duration)); boost::replace_first(spellText, "%d", std::to_string(duration));
spellIcons.push_back(std::make_shared<CAnimImage>("SpellInt", effect + 1, 0, firstPos.x + offset.x * printed, firstPos.y + offset.y * printed)); spellIcons.push_back(std::make_shared<CAnimImage>(AnimationPath::builtin("SpellInt"), effect + 1, 0, firstPos.x + offset.x * printed, firstPos.y + offset.y * printed));
clickableAreas.push_back(std::make_shared<LRClickableAreaWText>(Rect(firstPos + offset * printed, Point(50, 38)), spellText, spellText)); clickableAreas.push_back(std::make_shared<LRClickableAreaWText>(Rect(firstPos + offset * printed, Point(50, 38)), spellText, spellText));
if(++printed >= 8) // interface limit reached if(++printed >= 8) // interface limit reached
break; break;
@ -214,7 +214,7 @@ CStackWindow::ActiveSpellsSection::ActiveSpellsSection(CStackWindow * owner, int
} }
CStackWindow::BonusLineSection::BonusLineSection(CStackWindow * owner, size_t lineIndex) CStackWindow::BonusLineSection::BonusLineSection(CStackWindow * owner, size_t lineIndex)
: CWindowSection(owner, "bonus-effects", 0) : CWindowSection(owner, ImagePath::builtin("stackWindow/bonus-effects"), 0)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@ -240,7 +240,7 @@ CStackWindow::BonusLineSection::BonusLineSection(CStackWindow * owner, size_t li
} }
CStackWindow::BonusesSection::BonusesSection(CStackWindow * owner, int yOffset, std::optional<size_t> preferredSize): CStackWindow::BonusesSection::BonusesSection(CStackWindow * owner, int yOffset, std::optional<size_t> preferredSize):
CWindowSection(owner, "", yOffset) CWindowSection(owner, {}, yOffset)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@ -262,7 +262,7 @@ CStackWindow::BonusesSection::BonusesSection(CStackWindow * owner, int yOffset,
} }
CStackWindow::ButtonsSection::ButtonsSection(CStackWindow * owner, int yOffset) CStackWindow::ButtonsSection::ButtonsSection(CStackWindow * owner, int yOffset)
: CWindowSection(owner, "button-panel", yOffset) : CWindowSection(owner, ImagePath::builtin("stackWindow/button-panel"), yOffset)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@ -277,7 +277,7 @@ CStackWindow::ButtonsSection::ButtonsSection(CStackWindow * owner, int yOffset)
{ {
LOCPLINT->showYesNoDialog(CGI->generaltexth->allTexts[12], onDismiss, nullptr); LOCPLINT->showYesNoDialog(CGI->generaltexth->allTexts[12], onDismiss, nullptr);
}; };
dismiss = std::make_shared<CButton>(Point(5, 5),"IVIEWCR2.DEF", CGI->generaltexth->zelp[445], onClick, EShortcut::HERO_DISMISS); dismiss = std::make_shared<CButton>(Point(5, 5),AnimationPath::builtin("IVIEWCR2.DEF"), CGI->generaltexth->zelp[445], onClick, EShortcut::HERO_DISMISS);
} }
if(parent->info->upgradeInfo && !parent->info->commander) if(parent->info->upgradeInfo && !parent->info->commander)
@ -314,9 +314,9 @@ CStackWindow::ButtonsSection::ButtonsSection(CStackWindow * owner, int yOffset)
LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[314], resComps); LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[314], resComps);
} }
}; };
auto upgradeBtn = std::make_shared<CButton>(Point(221 + (int)buttonIndex * 40, 5), "stackWindow/upgradeButton", CGI->generaltexth->zelp[446], onClick); auto upgradeBtn = std::make_shared<CButton>(Point(221 + (int)buttonIndex * 40, 5), AnimationPath::builtin("stackWindow/upgradeButton"), CGI->generaltexth->zelp[446], onClick);
upgradeBtn->addOverlay(std::make_shared<CAnimImage>("CPRSMALL", VLC->creh->objects[upgradeInfo.info.newID[buttonIndex]]->getIconIndex())); upgradeBtn->addOverlay(std::make_shared<CAnimImage>(AnimationPath::builtin("CPRSMALL"), VLC->creh->objects[upgradeInfo.info.newID[buttonIndex]]->getIconIndex()));
if(buttonsToCreate == 1) // single upgrade avaialbe if(buttonsToCreate == 1) // single upgrade avaialbe
upgradeBtn->assignedKey = EShortcut::RECRUITMENT_UPGRADE; upgradeBtn->assignedKey = EShortcut::RECRUITMENT_UPGRADE;
@ -341,17 +341,17 @@ CStackWindow::ButtonsSection::ButtonsSection(CStackWindow * owner, int yOffset)
}; };
std::string tooltipText = "vcmi.creatureWindow." + btnIDs[buttonIndex]; std::string tooltipText = "vcmi.creatureWindow." + btnIDs[buttonIndex];
parent->switchButtons[buttonIndex] = std::make_shared<CButton>(Point(302 + (int)buttonIndex*40, 5), "stackWindow/upgradeButton", CButton::tooltipLocalized(tooltipText), onSwitch); parent->switchButtons[buttonIndex] = std::make_shared<CButton>(Point(302 + (int)buttonIndex*40, 5), AnimationPath::builtin("stackWindow/upgradeButton"), CButton::tooltipLocalized(tooltipText), onSwitch);
parent->switchButtons[buttonIndex]->addOverlay(std::make_shared<CAnimImage>("stackWindow/switchModeIcons", buttonIndex)); parent->switchButtons[buttonIndex]->addOverlay(std::make_shared<CAnimImage>(AnimationPath::builtin("stackWindow/switchModeIcons"), buttonIndex));
} }
parent->switchButtons[parent->activeTab]->disable(); parent->switchButtons[parent->activeTab]->disable();
} }
exit = std::make_shared<CButton>(Point(382, 5), "hsbtns.def", CGI->generaltexth->zelp[447], [=](){ parent->close(); }, EShortcut::GLOBAL_RETURN); exit = std::make_shared<CButton>(Point(382, 5), AnimationPath::builtin("hsbtns.def"), CGI->generaltexth->zelp[447], [=](){ parent->close(); }, EShortcut::GLOBAL_RETURN);
} }
CStackWindow::CommanderMainSection::CommanderMainSection(CStackWindow * owner, int yOffset) CStackWindow::CommanderMainSection::CommanderMainSection(CStackWindow * owner, int yOffset)
: CWindowSection(owner, "commander-bg", yOffset) : CWindowSection(owner, ImagePath::builtin("stackWindow/commander-bg"), yOffset)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@ -360,7 +360,7 @@ CStackWindow::CommanderMainSection::CommanderMainSection(CStackWindow * owner, i
return Point(10 + 80 * (index%3), 20 + 80 * (index/3)); return Point(10 + 80 * (index%3), 20 + 80 * (index/3));
}; };
auto getSkillImage = [this](int skillIndex) -> std::string auto getSkillImage = [this](int skillIndex)
{ {
bool selected = ((parent->selectedSkill == skillIndex) && parent->info->levelupInfo ); bool selected = ((parent->selectedSkill == skillIndex) && parent->info->levelupInfo );
return skillToFile(skillIndex, parent->info->commander->secondarySkills[skillIndex], selected); return skillToFile(skillIndex, parent->info->commander->secondarySkills[skillIndex], selected);
@ -413,7 +413,7 @@ CStackWindow::CommanderMainSection::CommanderMainSection(CStackWindow * owner, i
if(parent->info->levelupInfo) if(parent->info->levelupInfo)
{ {
abilitiesBackground = std::make_shared<CPicture>("stackWindow/commander-abilities.png"); abilitiesBackground = std::make_shared<CPicture>(ImagePath::builtin("stackWindow/commander-abilities.png"));
abilitiesBackground->moveBy(Point(0, pos.h)); abilitiesBackground->moveBy(Point(0, pos.h));
size_t abilitiesCount = boost::range::count_if(parent->info->levelupInfo->skills, [](ui32 skillID) size_t abilitiesCount = boost::range::count_if(parent->info->levelupInfo->skills, [](ui32 skillID)
@ -447,8 +447,8 @@ CStackWindow::CommanderMainSection::CommanderMainSection(CStackWindow * owner, i
abilities = std::make_shared<CListBox>(onCreate, Point(38, 3+pos.h), Point(63, 0), 6, abilitiesCount); abilities = std::make_shared<CListBox>(onCreate, Point(38, 3+pos.h), Point(63, 0), 6, abilitiesCount);
leftBtn = std::make_shared<CButton>(Point(10, pos.h + 6), "hsbtns3.def", CButton::tooltip(), [=](){ abilities->moveToPrev(); }, EShortcut::MOVE_LEFT); leftBtn = std::make_shared<CButton>(Point(10, pos.h + 6), AnimationPath::builtin("hsbtns3.def"), CButton::tooltip(), [=](){ abilities->moveToPrev(); }, EShortcut::MOVE_LEFT);
rightBtn = std::make_shared<CButton>(Point(411, pos.h + 6), "hsbtns5.def", CButton::tooltip(), [=](){ abilities->moveToNext(); }, EShortcut::MOVE_RIGHT); rightBtn = std::make_shared<CButton>(Point(411, pos.h + 6), AnimationPath::builtin("hsbtns5.def"), CButton::tooltip(), [=](){ abilities->moveToNext(); }, EShortcut::MOVE_RIGHT);
if(abilitiesCount <= 6) if(abilitiesCount <= 6)
{ {
@ -505,7 +505,7 @@ CStackWindow::MainSection::MainSection(CStackWindow * owner, int yOffset, bool s
if(parent->info->owner && parent->info->stackNode->hasBonusOfType(BonusType::SIEGE_WEAPON)) if(parent->info->owner && parent->info->stackNode->hasBonusOfType(BonusType::SIEGE_WEAPON))
dmgMultiply += parent->info->owner->getPrimSkillLevel(PrimarySkill::ATTACK); dmgMultiply += parent->info->owner->getPrimSkillLevel(PrimarySkill::ATTACK);
icons = std::make_shared<CPicture>("stackWindow/icons", 117, 32); icons = std::make_shared<CPicture>(ImagePath::builtin("stackWindow/icons"), 117, 32);
const CStack * battleStack = parent->info->stack; const CStack * battleStack = parent->info->stack;
@ -556,7 +556,7 @@ CStackWindow::MainSection::MainSection(CStackWindow * owner, int yOffset, bool s
if(parent->info->commander) if(parent->info->commander)
{ {
const CCommanderInstance * commander = parent->info->commander; const CCommanderInstance * commander = parent->info->commander;
expRankIcon = std::make_shared<CAnimImage>("PSKIL42", 4, 0, pos.x, pos.y); expRankIcon = std::make_shared<CAnimImage>(AnimationPath::builtin("PSKIL42"), 4, 0, pos.x, pos.y);
auto area = std::make_shared<LRClickableAreaWTextComp>(Rect(pos.x, pos.y, 44, 44), CComponent::experience); auto area = std::make_shared<LRClickableAreaWTextComp>(Rect(pos.x, pos.y, 44, 44), CComponent::experience);
expArea = area; expArea = area;
@ -568,7 +568,7 @@ CStackWindow::MainSection::MainSection(CStackWindow * owner, int yOffset, bool s
} }
else else
{ {
expRankIcon = std::make_shared<CAnimImage>("stackWindow/levels", stack->getExpRank(), 0, pos.x, pos.y); expRankIcon = std::make_shared<CAnimImage>(AnimationPath::builtin("stackWindow/levels"), stack->getExpRank(), 0, pos.x, pos.y);
expArea = std::make_shared<LRClickableAreaWText>(Rect(pos.x, pos.y, 44, 44)); expArea = std::make_shared<LRClickableAreaWText>(Rect(pos.x, pos.y, 44, 44));
expArea->text = parent->generateStackExpDescription(); expArea->text = parent->generateStackExpDescription();
} }
@ -586,14 +586,14 @@ CStackWindow::MainSection::MainSection(CStackWindow * owner, int yOffset, bool s
auto art = parent->info->stackNode->getArt(ArtifactPosition::CREATURE_SLOT); auto art = parent->info->stackNode->getArt(ArtifactPosition::CREATURE_SLOT);
if(art) if(art)
{ {
parent->stackArtifactIcon = std::make_shared<CAnimImage>("ARTIFACT", art->artType->getIconIndex(), 0, pos.x, pos.y); parent->stackArtifactIcon = std::make_shared<CAnimImage>(AnimationPath::builtin("ARTIFACT"), art->artType->getIconIndex(), 0, pos.x, pos.y);
parent->stackArtifactHelp = std::make_shared<LRClickableAreaWTextComp>(Rect(pos, Point(44, 44)), CComponent::artifact); parent->stackArtifactHelp = std::make_shared<LRClickableAreaWTextComp>(Rect(pos, Point(44, 44)), CComponent::artifact);
parent->stackArtifactHelp->type = art->artType->getId(); parent->stackArtifactHelp->type = art->artType->getId();
if(parent->info->owner) if(parent->info->owner)
{ {
parent->stackArtifactButton = std::make_shared<CButton>( parent->stackArtifactButton = std::make_shared<CButton>(
Point(pos.x - 2 , pos.y + 46), "stackWindow/cancelButton", Point(pos.x - 2 , pos.y + 46), AnimationPath::builtin("stackWindow/cancelButton"),
CButton::tooltipLocalized("vcmi.creatureWindow.returnArtifact"), [=]() CButton::tooltipLocalized("vcmi.creatureWindow.returnArtifact"), [=]()
{ {
parent->removeStackArtifact(ArtifactPosition::CREATURE_SLOT); parent->removeStackArtifact(ArtifactPosition::CREATURE_SLOT);
@ -604,14 +604,14 @@ CStackWindow::MainSection::MainSection(CStackWindow * owner, int yOffset, bool s
} }
std::string CStackWindow::MainSection::getBackgroundName(bool showExp, bool showArt) ImagePath CStackWindow::MainSection::getBackgroundName(bool showExp, bool showArt)
{ {
if(showExp && showArt) if(showExp && showArt)
return "info-panel-2"; return ImagePath::builtin("stackWindow/info-panel-2");
else if(showExp || showArt) else if(showExp || showArt)
return "info-panel-1"; return ImagePath::builtin("stackWindow/info-panel-1");
else else
return "info-panel-0"; return ImagePath::builtin("stackWindow/info-panel-0");
} }
void CStackWindow::MainSection::addStatLabel(EStat index, int64_t value1, int64_t value2) void CStackWindow::MainSection::addStatLabel(EStat index, int64_t value1, int64_t value2)
@ -882,7 +882,7 @@ void CStackWindow::setSelection(si32 newSkill, std::shared_ptr<CCommanderSkillIc
return CGI->generaltexth->znpc00[152 + (12 * skillIndex) + (info->commander->secondarySkills[skillIndex] * 2)]; return CGI->generaltexth->znpc00[152 + (12 * skillIndex) + (info->commander->secondarySkills[skillIndex] * 2)];
}; };
auto getSkillImage = [this](int skillIndex) -> std::string auto getSkillImage = [this](int skillIndex)
{ {
bool selected = ((selectedSkill == skillIndex) && info->levelupInfo ); bool selected = ((selectedSkill == skillIndex) && info->levelupInfo );
return skillToFile(skillIndex, info->commander->secondarySkills[skillIndex], selected); return skillToFile(skillIndex, info->commander->secondarySkills[skillIndex], selected);

View File

@ -10,6 +10,7 @@
#pragma once #pragma once
#include "../../lib/bonuses/Bonus.h" #include "../../lib/bonuses/Bonus.h"
#include "../../lib/filesystem/ResourcePath.h"
#include "../widgets/MiscWidgets.h" #include "../widgets/MiscWidgets.h"
#include "CWindowObject.h" #include "CWindowObject.h"
@ -48,7 +49,7 @@ class CStackWindow : public CWindowObject
{ {
std::string name; std::string name;
std::string description; std::string description;
std::string imagePath; ImagePath imagePath;
}; };
class CWindowSection : public CIntObject class CWindowSection : public CIntObject
@ -58,7 +59,7 @@ class CStackWindow : public CWindowObject
protected: protected:
CStackWindow * parent; CStackWindow * parent;
public: public:
CWindowSection(CStackWindow * parent, std::string backgroundPath, int yOffset); CWindowSection(CStackWindow * parent, const ImagePath & backgroundPath, int yOffset);
}; };
class ActiveSpellsSection : public CWindowSection class ActiveSpellsSection : public CWindowSection
@ -138,7 +139,7 @@ class CStackWindow : public CWindowObject
void addStatLabel(EStat index, int64_t value1, int64_t value2); void addStatLabel(EStat index, int64_t value1, int64_t value2);
void addStatLabel(EStat index, int64_t value); void addStatLabel(EStat index, int64_t value);
static std::string getBackgroundName(bool showExp, bool showArt); static ImagePath getBackgroundName(bool showExp, bool showArt);
std::array<std::string, 8> statNames; std::array<std::string, 8> statNames;
std::array<std::string, 8> statFormats; std::array<std::string, 8> statFormats;

View File

@ -24,7 +24,7 @@ CHeroBackpackWindow::CHeroBackpackWindow(const CGHeroInstance * hero)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
stretchedBackground = std::make_shared<CFilledTexture>("DIBOXBCK", Rect(0, 0, 410, 425)); stretchedBackground = std::make_shared<CFilledTexture>(ImagePath::builtin("DIBOXBCK"), Rect(0, 0, 410, 425));
pos.w = stretchedBackground->pos.w; pos.w = stretchedBackground->pos.w;
pos.h = stretchedBackground->pos.h; pos.h = stretchedBackground->pos.h;
center(); center();
@ -36,7 +36,7 @@ CHeroBackpackWindow::CHeroBackpackWindow(const CGHeroInstance * hero)
addCloseCallback(std::bind(&CHeroBackpackWindow::close, this)); addCloseCallback(std::bind(&CHeroBackpackWindow::close, this));
quitButton = std::make_shared<CButton>(Point(173, 385), "IOKAY32.def", CButton::tooltip(""), [this]() { close(); }, EShortcut::GLOBAL_RETURN); quitButton = std::make_shared<CButton>(Point(173, 385), AnimationPath::builtin("IOKAY32.def"), CButton::tooltip(""), [this]() { close(); }, EShortcut::GLOBAL_RETURN);
} }
void CHeroBackpackWindow::showAll(Canvas &to) void CHeroBackpackWindow::showAll(Canvas &to)

View File

@ -63,48 +63,48 @@ CHeroSwitcher::CHeroSwitcher(CHeroWindow * owner_, Point pos_, const CGHeroInsta
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
pos += pos_; pos += pos_;
image = std::make_shared<CAnimImage>("PortraitsSmall", hero->portrait); image = std::make_shared<CAnimImage>(AnimationPath::builtin("PortraitsSmall"), hero->portrait);
pos.w = image->pos.w; pos.w = image->pos.w;
pos.h = image->pos.h; pos.h = image->pos.h;
} }
CHeroWindow::CHeroWindow(const CGHeroInstance * hero) CHeroWindow::CHeroWindow(const CGHeroInstance * hero)
: CStatusbarWindow(PLAYER_COLORED, "HeroScr4") : CStatusbarWindow(PLAYER_COLORED, ImagePath::builtin("HeroScr4"))
{ {
auto & heroscrn = CGI->generaltexth->heroscrn; auto & heroscrn = CGI->generaltexth->heroscrn;
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
curHero = hero; curHero = hero;
banner = std::make_shared<CAnimImage>("CREST58", LOCPLINT->playerID.getNum(), 0, 606, 8); banner = std::make_shared<CAnimImage>(AnimationPath::builtin("CREST58"), LOCPLINT->playerID.getNum(), 0, 606, 8);
name = std::make_shared<CLabel>(190, 38, EFonts::FONT_BIG, ETextAlignment::CENTER, Colors::YELLOW); name = std::make_shared<CLabel>(190, 38, EFonts::FONT_BIG, ETextAlignment::CENTER, Colors::YELLOW);
title = std::make_shared<CLabel>(190, 65, EFonts::FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE); title = std::make_shared<CLabel>(190, 65, EFonts::FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE);
statusbar = CGStatusBar::create(7, 559, "ADROLLVR.bmp", 660); statusbar = CGStatusBar::create(7, 559, ImagePath::builtin("ADROLLVR.bmp"), 660);
quitButton = std::make_shared<CButton>(Point(609, 516), "hsbtns.def", CButton::tooltip(heroscrn[17]), [=](){ close(); }, EShortcut::GLOBAL_RETURN); quitButton = std::make_shared<CButton>(Point(609, 516), AnimationPath::builtin("hsbtns.def"), CButton::tooltip(heroscrn[17]), [=](){ close(); }, EShortcut::GLOBAL_RETURN);
if(settings["general"]["enableUiEnhancements"].Bool()) if(settings["general"]["enableUiEnhancements"].Bool())
{ {
questlogButton = std::make_shared<CButton>(Point(314, 429), "hsbtns4.def", CButton::tooltip(heroscrn[0]), [=](){ LOCPLINT->showQuestLog(); }, EShortcut::ADVENTURE_QUEST_LOG); questlogButton = std::make_shared<CButton>(Point(314, 429), AnimationPath::builtin("hsbtns4.def"), CButton::tooltip(heroscrn[0]), [=](){ LOCPLINT->showQuestLog(); }, EShortcut::ADVENTURE_QUEST_LOG);
backpackButton = std::make_shared<CButton>(Point(424, 429), "buttons/backpack", CButton::tooltipLocalized("vcmi.heroWindow.Backpack"), [=](){ createBackpackWindow(); }, EShortcut::HERO_BACKPACK); backpackButton = std::make_shared<CButton>(Point(424, 429), AnimationPath::builtin("buttons/backpack"), CButton::tooltipLocalized("vcmi.heroWindow.Backpack"), [=](){ createBackpackWindow(); }, EShortcut::HERO_BACKPACK);
dismissButton = std::make_shared<CButton>(Point(534, 429), "hsbtns2.def", CButton::tooltip(heroscrn[28]), [=](){ dismissCurrent(); }, EShortcut::HERO_DISMISS); dismissButton = std::make_shared<CButton>(Point(534, 429), AnimationPath::builtin("hsbtns2.def"), CButton::tooltip(heroscrn[28]), [=](){ dismissCurrent(); }, EShortcut::HERO_DISMISS);
} }
else else
{ {
dismissLabel = std::make_shared<CTextBox>(CGI->generaltexth->jktexts[8], Rect(370, 430, 65, 35), 0, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE); dismissLabel = std::make_shared<CTextBox>(CGI->generaltexth->jktexts[8], Rect(370, 430, 65, 35), 0, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE);
questlogLabel = std::make_shared<CTextBox>(CGI->generaltexth->jktexts[9], Rect(510, 430, 65, 35), 0, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE); questlogLabel = std::make_shared<CTextBox>(CGI->generaltexth->jktexts[9], Rect(510, 430, 65, 35), 0, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE);
dismissButton = std::make_shared<CButton>(Point(454, 429), "hsbtns2.def", CButton::tooltip(heroscrn[28]), [=](){ dismissCurrent(); }, EShortcut::HERO_DISMISS); dismissButton = std::make_shared<CButton>(Point(454, 429), AnimationPath::builtin("hsbtns2.def"), CButton::tooltip(heroscrn[28]), [=](){ dismissCurrent(); }, EShortcut::HERO_DISMISS);
questlogButton = std::make_shared<CButton>(Point(314, 429), "hsbtns4.def", CButton::tooltip(heroscrn[0]), [=](){ LOCPLINT->showQuestLog(); }, EShortcut::ADVENTURE_QUEST_LOG); questlogButton = std::make_shared<CButton>(Point(314, 429), AnimationPath::builtin("hsbtns4.def"), CButton::tooltip(heroscrn[0]), [=](){ LOCPLINT->showQuestLog(); }, EShortcut::ADVENTURE_QUEST_LOG);
} }
formations = std::make_shared<CToggleGroup>(0); formations = std::make_shared<CToggleGroup>(0);
formations->addToggle(0, std::make_shared<CToggleButton>(Point(481, 483), "hsbtns6.def", std::make_pair(heroscrn[23], heroscrn[29]), 0, EShortcut::HERO_TIGHT_FORMATION)); formations->addToggle(0, std::make_shared<CToggleButton>(Point(481, 483), AnimationPath::builtin("hsbtns6.def"), std::make_pair(heroscrn[23], heroscrn[29]), 0, EShortcut::HERO_TIGHT_FORMATION));
formations->addToggle(1, std::make_shared<CToggleButton>(Point(481, 519), "hsbtns7.def", std::make_pair(heroscrn[24], heroscrn[30]), 0, EShortcut::HERO_LOOSE_FORMATION)); formations->addToggle(1, std::make_shared<CToggleButton>(Point(481, 519), AnimationPath::builtin("hsbtns7.def"), std::make_pair(heroscrn[24], heroscrn[30]), 0, EShortcut::HERO_LOOSE_FORMATION));
if(hero->commander) if(hero->commander)
{ {
commanderButton = std::make_shared<CButton>(Point(317, 18), "buttons/commander", CButton::tooltipLocalized("vcmi.heroWindow.openCommander"), [&](){ commanderWindow(); }, EShortcut::HERO_COMMANDER); commanderButton = std::make_shared<CButton>(Point(317, 18), AnimationPath::builtin("buttons/commander"), CButton::tooltipLocalized("vcmi.heroWindow.openCommander"), [&](){ commanderWindow(); }, EShortcut::HERO_COMMANDER);
} }
//right list of heroes //right list of heroes
@ -113,7 +113,7 @@ CHeroWindow::CHeroWindow(const CGHeroInstance * hero)
//areas //areas
portraitArea = std::make_shared<LRClickableAreaWText>(Rect(18, 18, 58, 64)); portraitArea = std::make_shared<LRClickableAreaWText>(Rect(18, 18, 58, 64));
portraitImage = std::make_shared<CAnimImage>("PortraitsLarge", 0, 0, 19, 19); portraitImage = std::make_shared<CAnimImage>(AnimationPath::builtin("PortraitsLarge"), 0, 0, 19, 19);
for(int v = 0; v < GameConstants::PRIMARY_SKILLS; ++v) for(int v = 0; v < GameConstants::PRIMARY_SKILLS; ++v)
{ {
@ -127,7 +127,7 @@ CHeroWindow::CHeroWindow(const CGHeroInstance * hero)
primSkillValues.push_back(value); primSkillValues.push_back(value);
} }
auto primSkills = std::make_shared<CAnimation>("PSKIL42"); auto primSkills = std::make_shared<CAnimation>(AnimationPath::builtin("PSKIL42"));
primSkills->preload(); primSkills->preload();
primSkillImages.push_back(std::make_shared<CAnimImage>(primSkills, 0, 0, 32, 111)); primSkillImages.push_back(std::make_shared<CAnimImage>(primSkills, 0, 0, 32, 111));
primSkillImages.push_back(std::make_shared<CAnimImage>(primSkills, 1, 0, 102, 111)); primSkillImages.push_back(std::make_shared<CAnimImage>(primSkills, 1, 0, 102, 111));
@ -136,7 +136,7 @@ CHeroWindow::CHeroWindow(const CGHeroInstance * hero)
primSkillImages.push_back(std::make_shared<CAnimImage>(primSkills, 4, 0, 20, 230)); primSkillImages.push_back(std::make_shared<CAnimImage>(primSkills, 4, 0, 20, 230));
primSkillImages.push_back(std::make_shared<CAnimImage>(primSkills, 5, 0, 242, 111)); primSkillImages.push_back(std::make_shared<CAnimImage>(primSkills, 5, 0, 242, 111));
specImage = std::make_shared<CAnimImage>("UN44", 0, 0, 18, 180); specImage = std::make_shared<CAnimImage>(AnimationPath::builtin("UN44"), 0, 0, 18, 180);
specArea = std::make_shared<LRClickableAreaWText>(Rect(18, 180, 136, 42), CGI->generaltexth->heroscrn[27]); specArea = std::make_shared<LRClickableAreaWText>(Rect(18, 180, 136, 42), CGI->generaltexth->heroscrn[27]);
specName = std::make_shared<CLabel>(69, 205); specName = std::make_shared<CLabel>(69, 205);
@ -148,7 +148,7 @@ CHeroWindow::CHeroWindow(const CGHeroInstance * hero)
expValue = std::make_shared<CLabel>(68, 252); expValue = std::make_shared<CLabel>(68, 252);
manaValue = std::make_shared<CLabel>(211, 252); manaValue = std::make_shared<CLabel>(211, 252);
auto secSkills = std::make_shared<CAnimation>("SECSKILL"); auto secSkills = std::make_shared<CAnimation>(AnimationPath::builtin("SECSKILL"));
for(int i = 0; i < std::min<size_t>(hero->secSkills.size(), 8u); ++i) for(int i = 0; i < std::min<size_t>(hero->secSkills.size(), 8u); ++i)
{ {
Rect r = Rect(i%2 == 0 ? 18 : 162, 276 + 48 * (i/2), 136, 42); Rect r = Rect(i%2 == 0 ? 18 : 162, 276 + 48 * (i/2), 136, 42);
@ -194,7 +194,7 @@ void CHeroWindow::update(const CGHeroInstance * hero, bool redrawNeeded)
specImage->setFrame(curHero->type->imageIndex); specImage->setFrame(curHero->type->imageIndex);
specName->setText(curHero->type->getSpecialtyNameTranslated()); specName->setText(curHero->type->getSpecialtyNameTranslated());
tacticsButton = std::make_shared<CToggleButton>(Point(539, 483), "hsbtns8.def", std::make_pair(heroscrn[26], heroscrn[31]), 0, EShortcut::HERO_TOGGLE_TACTICS); tacticsButton = std::make_shared<CToggleButton>(Point(539, 483), AnimationPath::builtin("hsbtns8.def"), std::make_pair(heroscrn[26], heroscrn[31]), 0, EShortcut::HERO_TOGGLE_TACTICS);
tacticsButton->addHoverText(CButton::HIGHLIGHTED, CGI->generaltexth->heroscrn[25]); tacticsButton->addHoverText(CButton::HIGHLIGHTED, CGI->generaltexth->heroscrn[25]);
dismissButton->addHoverText(CButton::NORMAL, boost::str(boost::format(CGI->generaltexth->heroscrn[16]) % curHero->getNameTranslated() % curHero->type->heroClass->getNameTranslated())); dismissButton->addHoverText(CButton::NORMAL, boost::str(boost::format(CGI->generaltexth->heroscrn[16]) % curHero->getNameTranslated() % curHero->type->heroClass->getNameTranslated()));
@ -210,7 +210,7 @@ void CHeroWindow::update(const CGHeroInstance * hero, bool redrawNeeded)
boost::algorithm::replace_first(helpBox, "%s", CGI->generaltexth->allTexts[43]); boost::algorithm::replace_first(helpBox, "%s", CGI->generaltexth->allTexts[43]);
garr = std::make_shared<CGarrisonInt>(Point(15, 485), 8, Point(), curHero); garr = std::make_shared<CGarrisonInt>(Point(15, 485), 8, Point(), curHero);
auto split = std::make_shared<CButton>(Point(539, 519), "hsbtns9.def", CButton::tooltip(CGI->generaltexth->allTexts[256], helpBox), [&](){ garr->splitClick(); }); auto split = std::make_shared<CButton>(Point(539, 519), AnimationPath::builtin("hsbtns9.def"), CButton::tooltip(CGI->generaltexth->allTexts[256], helpBox), [&](){ garr->splitClick(); });
garr->addSplitBtn(split); garr->addSplitBtn(split);
} }
if(!arts) if(!arts)
@ -224,7 +224,7 @@ void CHeroWindow::update(const CGHeroInstance * hero, bool redrawNeeded)
listSelection.reset(); listSelection.reset();
if(serial >= 0) if(serial >= 0)
listSelection = std::make_shared<CPicture>("HPSYYY", 612, 33 + serial * 54); listSelection = std::make_shared<CPicture>(ImagePath::builtin("HPSYYY"), 612, 33 + serial * 54);
} }
//primary skills support //primary skills support

View File

@ -169,7 +169,7 @@ std::string InfoBoxAbstractHeroData::getNameText()
return ""; return "";
} }
std::string InfoBoxAbstractHeroData::getImageName(InfoBox::InfoSize size) AnimationPath InfoBoxAbstractHeroData::getImageName(InfoBox::InfoSize size)
{ {
//TODO: sizes //TODO: sizes
switch(size) switch(size)
@ -181,11 +181,11 @@ std::string InfoBoxAbstractHeroData::getImageName(InfoBox::InfoSize size)
case HERO_PRIMARY_SKILL: case HERO_PRIMARY_SKILL:
case HERO_MANA: case HERO_MANA:
case HERO_EXPERIENCE: case HERO_EXPERIENCE:
return "PSKIL32"; return AnimationPath::builtin("PSKIL32");
case HERO_SPECIAL: case HERO_SPECIAL:
return "UN32"; return AnimationPath::builtin("UN32");
case HERO_SECONDARY_SKILL: case HERO_SECONDARY_SKILL:
return "SECSK32"; return AnimationPath::builtin("SECSK32");
default: default:
assert(0); assert(0);
} }
@ -197,11 +197,11 @@ std::string InfoBoxAbstractHeroData::getImageName(InfoBox::InfoSize size)
case HERO_PRIMARY_SKILL: case HERO_PRIMARY_SKILL:
case HERO_MANA: case HERO_MANA:
case HERO_EXPERIENCE: case HERO_EXPERIENCE:
return "PSKIL42"; return AnimationPath::builtin("PSKIL42");
case HERO_SPECIAL: case HERO_SPECIAL:
return "UN44"; return AnimationPath::builtin("UN44");
case HERO_SECONDARY_SKILL: case HERO_SECONDARY_SKILL:
return "SECSKILL"; return AnimationPath::builtin("SECSKILL");
default: default:
assert(0); assert(0);
} }
@ -209,7 +209,7 @@ std::string InfoBoxAbstractHeroData::getImageName(InfoBox::InfoSize size)
default: default:
assert(0); assert(0);
} }
return ""; return {};
} }
std::string InfoBoxAbstractHeroData::getHoverText() std::string InfoBoxAbstractHeroData::getHoverText()
@ -437,7 +437,7 @@ size_t InfoBoxCustom::getImageIndex()
return imageIndex; return imageIndex;
} }
std::string InfoBoxCustom::getImageName(InfoBox::InfoSize size) AnimationPath InfoBoxCustom::getImageName(InfoBox::InfoSize size)
{ {
return imageName; return imageName;
} }
@ -457,7 +457,7 @@ void InfoBoxCustom::prepareMessage(std::string & text, std::shared_ptr<CComponen
} }
CKingdomInterface::CKingdomInterface() CKingdomInterface::CKingdomInterface()
: CWindowObject(PLAYER_COLORED | BORDERED, OVERVIEW_BACKGROUND) : CWindowObject(PLAYER_COLORED | BORDERED, ImagePath::builtin(OVERVIEW_BACKGROUND))
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
ui32 footerPos = OVERVIEW_SIZE * 116; ui32 footerPos = OVERVIEW_SIZE * 116;
@ -469,8 +469,8 @@ CKingdomInterface::CKingdomInterface()
generateMinesList(ownedObjects); generateMinesList(ownedObjects);
generateButtons(); generateButtons();
statusbar = CGStatusBar::create(std::make_shared<CPicture>("KSTATBAR", 10,pos.h - 45)); statusbar = CGStatusBar::create(std::make_shared<CPicture>(ImagePath::builtin("KSTATBAR"), 10,pos.h - 45));
resdatabar = std::make_shared<CResDataBar>("KRESBAR", 7, 111+footerPos, 29, 5, 76, 81); resdatabar = std::make_shared<CResDataBar>(ImagePath::builtin("KRESBAR"), 7, 111+footerPos, 29, 5, 76, 81);
} }
void CKingdomInterface::generateObjectsList(const std::vector<const CGObjectInstance * > &ownedObjects) void CKingdomInterface::generateObjectsList(const std::vector<const CGObjectInstance * > &ownedObjects)
@ -602,27 +602,27 @@ void CKingdomInterface::generateButtons()
ui32 footerPos = OVERVIEW_SIZE * 116; ui32 footerPos = OVERVIEW_SIZE * 116;
//Main control buttons //Main control buttons
btnHeroes = std::make_shared<CButton>(Point(748, 28+footerPos), "OVBUTN1.DEF", CButton::tooltip(CGI->generaltexth->overview[11], CGI->generaltexth->overview[6]), btnHeroes = std::make_shared<CButton>(Point(748, 28+footerPos), AnimationPath::builtin("OVBUTN1.DEF"), CButton::tooltip(CGI->generaltexth->overview[11], CGI->generaltexth->overview[6]),
std::bind(&CKingdomInterface::activateTab, this, 0), EShortcut::KINGDOM_HEROES_TAB); std::bind(&CKingdomInterface::activateTab, this, 0), EShortcut::KINGDOM_HEROES_TAB);
btnHeroes->block(true); btnHeroes->block(true);
btnTowns = std::make_shared<CButton>(Point(748, 64+footerPos), "OVBUTN6.DEF", CButton::tooltip(CGI->generaltexth->overview[12], CGI->generaltexth->overview[7]), btnTowns = std::make_shared<CButton>(Point(748, 64+footerPos), AnimationPath::builtin("OVBUTN6.DEF"), CButton::tooltip(CGI->generaltexth->overview[12], CGI->generaltexth->overview[7]),
std::bind(&CKingdomInterface::activateTab, this, 1), EShortcut::KINGDOM_TOWNS_TAB); std::bind(&CKingdomInterface::activateTab, this, 1), EShortcut::KINGDOM_TOWNS_TAB);
btnExit = std::make_shared<CButton>(Point(748,99+footerPos), "OVBUTN1.DEF", CButton::tooltip(CGI->generaltexth->allTexts[600]), btnExit = std::make_shared<CButton>(Point(748,99+footerPos), AnimationPath::builtin("OVBUTN1.DEF"), CButton::tooltip(CGI->generaltexth->allTexts[600]),
std::bind(&CKingdomInterface::close, this), EShortcut::GLOBAL_RETURN); std::bind(&CKingdomInterface::close, this), EShortcut::GLOBAL_RETURN);
btnExit->setImageOrder(3, 4, 5, 6); btnExit->setImageOrder(3, 4, 5, 6);
//Object list control buttons //Object list control buttons
dwellTop = std::make_shared<CButton>(Point(733, 4), "OVBUTN4.DEF", CButton::tooltip(), [&](){ dwellingsList->moveToPos(0);}); dwellTop = std::make_shared<CButton>(Point(733, 4), AnimationPath::builtin("OVBUTN4.DEF"), CButton::tooltip(), [&](){ dwellingsList->moveToPos(0);});
dwellBottom = std::make_shared<CButton>(Point(733, footerPos+2), "OVBUTN4.DEF", CButton::tooltip(), [&](){ dwellingsList->moveToPos(-1); }); dwellBottom = std::make_shared<CButton>(Point(733, footerPos+2), AnimationPath::builtin("OVBUTN4.DEF"), CButton::tooltip(), [&](){ dwellingsList->moveToPos(-1); });
dwellBottom->setImageOrder(2, 3, 4, 5); dwellBottom->setImageOrder(2, 3, 4, 5);
dwellUp = std::make_shared<CButton>(Point(733, 24), "OVBUTN4.DEF", CButton::tooltip(), [&](){ dwellingsList->moveToPrev(); }); dwellUp = std::make_shared<CButton>(Point(733, 24), AnimationPath::builtin("OVBUTN4.DEF"), CButton::tooltip(), [&](){ dwellingsList->moveToPrev(); });
dwellUp->setImageOrder(4, 5, 6, 7); dwellUp->setImageOrder(4, 5, 6, 7);
dwellDown = std::make_shared<CButton>(Point(733, footerPos-18), "OVBUTN4.DEF", CButton::tooltip(), [&](){ dwellingsList->moveToNext(); }); dwellDown = std::make_shared<CButton>(Point(733, footerPos-18), AnimationPath::builtin("OVBUTN4.DEF"), CButton::tooltip(), [&](){ dwellingsList->moveToNext(); });
dwellDown->setImageOrder(6, 7, 8, 9); dwellDown->setImageOrder(6, 7, 8, 9);
} }
@ -677,7 +677,7 @@ void CKingdomInterface::artifactRemoved(const ArtifactLocation& artLoc)
CKingdHeroList::CKingdHeroList(size_t maxSize) CKingdHeroList::CKingdHeroList(size_t maxSize)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
title = std::make_shared<CPicture>("OVTITLE",16,0); title = std::make_shared<CPicture>(ImagePath::builtin("OVTITLE"),16,0);
title->colorize(LOCPLINT->playerID); title->colorize(LOCPLINT->playerID);
heroLabel = std::make_shared<CLabel>(150, 10, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->overview[0]); heroLabel = std::make_shared<CLabel>(150, 10, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->overview[0]);
skillsLabel = std::make_shared<CLabel>(500, 10, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->overview[1]); skillsLabel = std::make_shared<CLabel>(500, 10, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->overview[1]);
@ -711,14 +711,14 @@ std::shared_ptr<CIntObject> CKingdHeroList::createHeroItem(size_t index)
} }
else else
{ {
return std::make_shared<CAnimImage>("OVSLOT", (index-2) % picCount ); return std::make_shared<CAnimImage>(AnimationPath::builtin("OVSLOT"), (index-2) % picCount );
} }
} }
CKingdTownList::CKingdTownList(size_t maxSize) CKingdTownList::CKingdTownList(size_t maxSize)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
title = std::make_shared<CPicture>("OVTITLE", 16, 0); title = std::make_shared<CPicture>(ImagePath::builtin("OVTITLE"), 16, 0);
title->colorize(LOCPLINT->playerID); title->colorize(LOCPLINT->playerID);
townLabel = std::make_shared<CLabel>(146, 10,FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->overview[3]); townLabel = std::make_shared<CLabel>(146, 10,FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->overview[3]);
garrHeroLabel = std::make_shared<CLabel>(375, 10, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->overview[4]); garrHeroLabel = std::make_shared<CLabel>(375, 10, FONT_MEDIUM, ETextAlignment::CENTER, Colors::WHITE, CGI->generaltexth->overview[4]);
@ -758,14 +758,14 @@ std::shared_ptr<CIntObject> CKingdTownList::createTownItem(size_t index)
if(index < townsList.size()) if(index < townsList.size())
return std::make_shared<CTownItem>(townsList[index]); return std::make_shared<CTownItem>(townsList[index]);
else else
return std::make_shared<CAnimImage>("OVSLOT", (index-2) % picCount ); return std::make_shared<CAnimImage>(AnimationPath::builtin("OVSLOT"), (index-2) % picCount );
} }
CTownItem::CTownItem(const CGTownInstance * Town) CTownItem::CTownItem(const CGTownInstance * Town)
: town(Town) : town(Town)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
background = std::make_shared<CAnimImage>("OVSLOT", 6); background = std::make_shared<CAnimImage>(AnimationPath::builtin("OVSLOT"), 6);
name = std::make_shared<CLabel>(74, 8, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, town->getNameTranslated()); name = std::make_shared<CLabel>(74, 8, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, town->getNameTranslated());
income = std::make_shared<CLabel>( 190, 60, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, std::to_string(town->dailyIncome()[EGameResID::GOLD])); income = std::make_shared<CLabel>( 190, 60, FONT_SMALL, ETextAlignment::CENTER, Colors::WHITE, std::to_string(town->dailyIncome()[EGameResID::GOLD]));
@ -777,7 +777,7 @@ CTownItem::CTownItem(const CGTownInstance * Town)
size_t iconIndex = town->town->clientInfo.icons[town->hasFort()][town->builded >= CGI->settings()->getInteger(EGameSettings::TOWNS_BUILDINGS_PER_TURN_CAP)]; size_t iconIndex = town->town->clientInfo.icons[town->hasFort()][town->builded >= CGI->settings()->getInteger(EGameSettings::TOWNS_BUILDINGS_PER_TURN_CAP)];
picture = std::make_shared<CAnimImage>("ITPT", iconIndex, 0, 5, 6); picture = std::make_shared<CAnimImage>(AnimationPath::builtin("ITPT"), iconIndex, 0, 5, 6);
openTown = std::make_shared<LRClickableAreaOpenTown>(Rect(5, 6, 58, 64), town); openTown = std::make_shared<LRClickableAreaOpenTown>(Rect(5, 6, 58, 64), town);
for(size_t i=0; i<town->creatures.size(); i++) for(size_t i=0; i<town->creatures.size(); i++)
@ -819,7 +819,7 @@ public:
ArtSlotsTab() ArtSlotsTab()
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
background = std::make_shared<CAnimImage>("OVSLOT", 4); background = std::make_shared<CAnimImage>(AnimationPath::builtin("OVSLOT"), 4);
pos = background->pos; pos = background->pos;
for(int i=0; i<9; i++) for(int i=0; i<9; i++)
arts.push_back(std::make_shared<CHeroArtPlace>(Point(269+i*48, 66))); arts.push_back(std::make_shared<CHeroArtPlace>(Point(269+i*48, 66)));
@ -837,10 +837,10 @@ public:
BackpackTab() BackpackTab()
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
background = std::make_shared<CAnimImage>("OVSLOT", 5); background = std::make_shared<CAnimImage>(AnimationPath::builtin("OVSLOT"), 5);
pos = background->pos; pos = background->pos;
btnLeft = std::make_shared<CButton>(Point(269, 66), "HSBTNS3", CButton::tooltip(), 0); btnLeft = std::make_shared<CButton>(Point(269, 66), AnimationPath::builtin("HSBTNS3"), CButton::tooltip(), 0);
btnRight = std::make_shared<CButton>(Point(675, 66), "HSBTNS5", CButton::tooltip(), 0); btnRight = std::make_shared<CButton>(Point(675, 66), AnimationPath::builtin("HSBTNS5"), CButton::tooltip(), 0);
for(int i=0; i<8; i++) for(int i=0; i<8; i++)
arts.push_back(std::make_shared<CHeroArtPlace>(Point(294+i*48, 66))); arts.push_back(std::make_shared<CHeroArtPlace>(Point(294+i*48, 66)));
} }
@ -905,7 +905,7 @@ CHeroItem::CHeroItem(const CGHeroInstance * Hero)
std::string hover = CGI->generaltexth->overview[13+it]; std::string hover = CGI->generaltexth->overview[13+it];
std::string overlay = CGI->generaltexth->overview[8+it]; std::string overlay = CGI->generaltexth->overview[8+it];
auto button = std::make_shared<CToggleButton>(Point(364+(int)it*112, 46), "OVBUTN3", CButton::tooltip(hover, overlay), 0); auto button = std::make_shared<CToggleButton>(Point(364+(int)it*112, 46), AnimationPath::builtin("OVBUTN3"), CButton::tooltip(hover, overlay), 0);
button->addTextOverlay(CGI->generaltexth->allTexts[stringID[it]], FONT_SMALL, Colors::YELLOW); button->addTextOverlay(CGI->generaltexth->allTexts[stringID[it]], FONT_SMALL, Colors::YELLOW);
artButtons->addToggle((int)it, button); artButtons->addToggle((int)it, button);
} }
@ -915,7 +915,7 @@ CHeroItem::CHeroItem(const CGHeroInstance * Hero)
garr = std::make_shared<CGarrisonInt>(Point(6, 78), 4, Point(), hero, nullptr, true, true); garr = std::make_shared<CGarrisonInt>(Point(6, 78), 4, Point(), hero, nullptr, true, true);
portrait = std::make_shared<CAnimImage>("PortraitsLarge", hero->portrait, 0, 5, 6); portrait = std::make_shared<CAnimImage>(AnimationPath::builtin("PortraitsLarge"), hero->portrait, 0, 5, 6);
heroArea = std::make_shared<CHeroArea>(5, 6, hero); heroArea = std::make_shared<CHeroArea>(5, 6, hero);
name = std::make_shared<CLabel>(73, 7, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, hero->getNameTranslated()); name = std::make_shared<CLabel>(73, 7, FONT_SMALL, ETextAlignment::TOPLEFT, Colors::WHITE, hero->getNameTranslated());

View File

@ -103,7 +103,7 @@ public:
//methods that generate values for displaying //methods that generate values for displaying
virtual std::string getValueText()=0; virtual std::string getValueText()=0;
virtual std::string getNameText()=0; virtual std::string getNameText()=0;
virtual std::string getImageName(InfoBox::InfoSize size)=0; virtual AnimationPath getImageName(InfoBox::InfoSize size)=0;
virtual std::string getHoverText()=0; virtual std::string getHoverText()=0;
virtual size_t getImageIndex()=0; virtual size_t getImageIndex()=0;
@ -124,7 +124,7 @@ public:
std::string getValueText() override; std::string getValueText() override;
std::string getNameText() override; std::string getNameText() override;
std::string getImageName(InfoBox::InfoSize size) override; AnimationPath getImageName(InfoBox::InfoSize size) override;
std::string getHoverText() override; std::string getHoverText() override;
size_t getImageIndex() override; size_t getImageIndex() override;
@ -166,7 +166,7 @@ class InfoBoxCustom : public IInfoBoxData
public: public:
std::string valueText; std::string valueText;
std::string nameText; std::string nameText;
std::string imageName; AnimationPath imageName;
std::string hoverText; std::string hoverText;
size_t imageIndex; size_t imageIndex;
@ -174,7 +174,7 @@ public:
std::string getValueText() override; std::string getValueText() override;
std::string getNameText() override; std::string getNameText() override;
std::string getImageName(InfoBox::InfoSize size) override; AnimationPath getImageName(InfoBox::InfoSize size) override;
std::string getHoverText() override; std::string getHoverText() override;
size_t getImageIndex() override; size_t getImageIndex() override;
@ -194,7 +194,7 @@ public:
std::string getValueText() override; std::string getValueText() override;
std::string getNameText() override; std::string getNameText() override;
std::string getImageName(InfoBox::InfoSize size) override; AnimationPath getImageName(InfoBox::InfoSize size) override;
std::string getHoverText() override; std::string getHoverText() override;
size_t getImageIndex() override; size_t getImageIndex() override;
}; };

View File

@ -79,7 +79,7 @@ void CMessage::init()
{ {
for(int i=0; i<PlayerColor::PLAYER_LIMIT_I; i++) for(int i=0; i<PlayerColor::PLAYER_LIMIT_I; i++)
{ {
dialogBorders[i] = std::make_unique<CAnimation>("DIALGBOX"); dialogBorders[i] = std::make_unique<CAnimation>(AnimationPath::builtin("DIALGBOX"));
dialogBorders[i]->preload(); dialogBorders[i]->preload();
for(int j=0; j < dialogBorders[i]->size(0); j++) for(int j=0; j < dialogBorders[i]->size(0); j++)
@ -92,7 +92,7 @@ void CMessage::init()
} }
} }
background = IImage::createFromFile("DIBOXBCK.BMP", EImageBlitMode::OPAQUE); background = IImage::createFromFile(ImagePath::builtin("DIBOXBCK.BMP"), EImageBlitMode::OPAQUE);
} }
void CMessage::dispose() void CMessage::dispose()

View File

@ -28,7 +28,7 @@
#include "../../lib/StartInfo.h" #include "../../lib/StartInfo.h"
CPuzzleWindow::CPuzzleWindow(const int3 & GrailPos, double discoveredRatio) CPuzzleWindow::CPuzzleWindow(const int3 & GrailPos, double discoveredRatio)
: CWindowObject(PLAYER_COLORED | BORDERED, "PUZZLE"), : CWindowObject(PLAYER_COLORED | BORDERED, ImagePath::builtin("PUZZLE")),
grailPos(GrailPos), grailPos(GrailPos),
currentAlpha(ColorRGBA::ALPHA_OPAQUE) currentAlpha(ColorRGBA::ALPHA_OPAQUE)
{ {
@ -36,14 +36,14 @@ CPuzzleWindow::CPuzzleWindow(const int3 & GrailPos, double discoveredRatio)
CCS->soundh->playSound(soundBase::OBELISK); CCS->soundh->playSound(soundBase::OBELISK);
quitb = std::make_shared<CButton>(Point(670, 538), "IOK6432.DEF", CButton::tooltip(CGI->generaltexth->allTexts[599]), std::bind(&CPuzzleWindow::close, this), EShortcut::GLOBAL_RETURN); quitb = std::make_shared<CButton>(Point(670, 538), AnimationPath::builtin("IOK6432.DEF"), CButton::tooltip(CGI->generaltexth->allTexts[599]), std::bind(&CPuzzleWindow::close, this), EShortcut::GLOBAL_RETURN);
quitb->setBorderColor(Colors::METALLIC_GOLD); quitb->setBorderColor(Colors::METALLIC_GOLD);
mapView = std::make_shared<PuzzleMapView>(Point(8,9), Point(591, 544), grailPos); mapView = std::make_shared<PuzzleMapView>(Point(8,9), Point(591, 544), grailPos);
logo = std::make_shared<CPicture>("PUZZLOGO", 607, 3); logo = std::make_shared<CPicture>(ImagePath::builtin("PUZZLOGO"), 607, 3);
title = std::make_shared<CLabel>(700, 95, FONT_BIG, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[463]); title = std::make_shared<CLabel>(700, 95, FONT_BIG, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[463]);
resDataBar = std::make_shared<CResDataBar>("ARESBAR.bmp", 3, 575, 32, 2, 85, 85); resDataBar = std::make_shared<CResDataBar>(ImagePath("ARESBAR.bmp"), 3, 575, 32, 2, 85, 85);
int faction = LOCPLINT->cb->getStartInfo()->playerInfos.find(LOCPLINT->playerID)->second.castle; int faction = LOCPLINT->cb->getStartInfo()->playerInfos.find(LOCPLINT->playerID)->second.castle;

View File

@ -49,7 +49,7 @@ void CQuestLabel::showAll(Canvas & to)
CMultiLineLabel::showAll (to); CMultiLineLabel::showAll (to);
} }
CQuestIcon::CQuestIcon (const std::string &defname, int index, int x, int y) : CQuestIcon::CQuestIcon (const AnimationPath &defname, int index, int x, int y) :
CAnimImage(defname, index, 0, x, y) CAnimImage(defname, index, 0, x, y)
{ {
addUsedEvents(LCLICK); addUsedEvents(LCLICK);
@ -87,7 +87,7 @@ void CQuestMinimap::addQuestMarks (const QuestInfo * q)
onMapViewMoved(Rect(), tile.z); onMapViewMoved(Rect(), tile.z);
auto pic = std::make_shared<CQuestIcon>("VwSymbol.def", 3, offset.x, offset.y); auto pic = std::make_shared<CQuestIcon>(AnimationPath::builtin("VwSymbol.def"), 3, offset.x, offset.y);
pic->moveBy (Point ( -pic->pos.w/2, -pic->pos.h/2)); pic->moveBy (Point ( -pic->pos.w/2, -pic->pos.h/2));
pic->callback = std::bind (&CQuestMinimap::iconClicked, this); pic->callback = std::bind (&CQuestMinimap::iconClicked, this);
@ -117,7 +117,7 @@ void CQuestMinimap::showAll(Canvas & to)
} }
CQuestLog::CQuestLog (const std::vector<QuestInfo> & Quests) CQuestLog::CQuestLog (const std::vector<QuestInfo> & Quests)
: CWindowObject(PLAYER_COLORED | BORDERED, "questDialog"), : CWindowObject(PLAYER_COLORED | BORDERED, ImagePath::builtin("questDialog")),
questIndex(0), questIndex(0),
currentQuest(nullptr), currentQuest(nullptr),
hideComplete(false), hideComplete(false),
@ -128,9 +128,9 @@ CQuestLog::CQuestLog (const std::vector<QuestInfo> & Quests)
minimap = std::make_shared<CQuestMinimap>(Rect(12, 12, 169, 169)); minimap = std::make_shared<CQuestMinimap>(Rect(12, 12, 169, 169));
// TextBox have it's own 4 pixel padding from top at least for English. To achieve 10px from both left and top only add 6px margin // TextBox have it's own 4 pixel padding from top at least for English. To achieve 10px from both left and top only add 6px margin
description = std::make_shared<CTextBox>("", Rect(205, 18, 385, DESCRIPTION_HEIGHT_MAX), CSlider::BROWN, FONT_MEDIUM, ETextAlignment::TOPLEFT, Colors::WHITE); description = std::make_shared<CTextBox>("", Rect(205, 18, 385, DESCRIPTION_HEIGHT_MAX), CSlider::BROWN, FONT_MEDIUM, ETextAlignment::TOPLEFT, Colors::WHITE);
ok = std::make_shared<CButton>(Point(539, 398), "IOKAY.DEF", CGI->generaltexth->zelp[445], std::bind(&CQuestLog::close, this), EShortcut::GLOBAL_ACCEPT); ok = std::make_shared<CButton>(Point(539, 398), AnimationPath::builtin("IOKAY.DEF"), CGI->generaltexth->zelp[445], std::bind(&CQuestLog::close, this), EShortcut::GLOBAL_ACCEPT);
// Both button and lable are shifted to -2px by x and y to not make them actually look like they're on same line with quests list and ok button // Both button and lable are shifted to -2px by x and y to not make them actually look like they're on same line with quests list and ok button
hideCompleteButton = std::make_shared<CToggleButton>(Point(10, 396), "sysopchk.def", CButton::tooltipLocalized("vcmi.questLog.hideComplete"), std::bind(&CQuestLog::toggleComplete, this, _1)); hideCompleteButton = std::make_shared<CToggleButton>(Point(10, 396), AnimationPath::builtin("sysopchk.def"), CButton::tooltipLocalized("vcmi.questLog.hideComplete"), std::bind(&CQuestLog::toggleComplete, this, _1));
hideCompleteLabel = std::make_shared<CLabel>(46, 398, FONT_MEDIUM, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->translate("vcmi.questLog.hideComplete.hover")); hideCompleteLabel = std::make_shared<CLabel>(46, 398, FONT_MEDIUM, ETextAlignment::TOPLEFT, Colors::WHITE, CGI->generaltexth->translate("vcmi.questLog.hideComplete.hover"));
slider = std::make_shared<CSlider>(Point(166, 195), 191, std::bind(&CQuestLog::sliderMoved, this, _1), QUEST_COUNT, 0, 0, Orientation::VERTICAL, CSlider::BROWN); slider = std::make_shared<CSlider>(Point(166, 195), 191, std::bind(&CQuestLog::sliderMoved, this, _1), QUEST_COUNT, 0, 0, Orientation::VERTICAL, CSlider::BROWN);
slider->setPanningStep(32); slider->setPanningStep(32);

View File

@ -54,7 +54,7 @@ class CQuestIcon : public CAnimImage
public: public:
std::function<void()> callback; //TODO: merge with other similar classes? std::function<void()> callback; //TODO: merge with other similar classes?
CQuestIcon(const std::string &defname, int index, int x=0, int y=0); CQuestIcon(const AnimationPath & defname, int index, int x=0, int y=0);
void clickPressed(const Point & cursorPosition) override; void clickPressed(const Point & cursorPosition) override;
void showAll(Canvas & to) override; void showAll(Canvas & to) override;

View File

@ -93,7 +93,7 @@ public:
} spellsorter; } spellsorter;
CSpellWindow::CSpellWindow(const CGHeroInstance * _myHero, CPlayerInterface * _myInt, bool openOnBattleSpells): CSpellWindow::CSpellWindow(const CGHeroInstance * _myHero, CPlayerInterface * _myInt, bool openOnBattleSpells):
CWindowObject(PLAYER_COLORED, "SpelBack"), CWindowObject(PLAYER_COLORED, ImagePath::builtin("SpelBack")),
battleSpellsOnly(openOnBattleSpells), battleSpellsOnly(openOnBattleSpells),
selectedTab(4), selectedTab(4),
currentPage(0), currentPage(0),
@ -166,23 +166,23 @@ CSpellWindow::CSpellWindow(const CGHeroInstance * _myHero, CPlayerInterface * _m
//numbers of spell pages computed //numbers of spell pages computed
leftCorner = std::make_shared<CPicture>("SpelTrnL.bmp", 97, 77); leftCorner = std::make_shared<CPicture>(ImagePath::builtin("SpelTrnL.bmp"), 97, 77);
rightCorner = std::make_shared<CPicture>("SpelTrnR.bmp", 487, 72); rightCorner = std::make_shared<CPicture>(ImagePath::builtin("SpelTrnR.bmp"), 487, 72);
spellIcons = std::make_shared<CAnimation>("Spells"); spellIcons = std::make_shared<CAnimation>(AnimationPath::builtin("Spells"));
schoolTab = std::make_shared<CAnimImage>("SpelTab", selectedTab, 0, 524, 88); schoolTab = std::make_shared<CAnimImage>(AnimationPath::builtin("SpelTab"), selectedTab, 0, 524, 88);
schoolPicture = std::make_shared<CAnimImage>("Schools", 0, 0, 117, 74); schoolPicture = std::make_shared<CAnimImage>(AnimationPath::builtin("Schools"), 0, 0, 117, 74);
schoolBorders[0] = std::make_shared<CAnimation>("SplevA.def"); schoolBorders[0] = std::make_shared<CAnimation>(AnimationPath::builtin("SplevA.def"));
schoolBorders[1] = std::make_shared<CAnimation>("SplevF.def"); schoolBorders[1] = std::make_shared<CAnimation>(AnimationPath::builtin("SplevF.def"));
schoolBorders[2] = std::make_shared<CAnimation>("SplevW.def"); schoolBorders[2] = std::make_shared<CAnimation>(AnimationPath::builtin("SplevW.def"));
schoolBorders[3] = std::make_shared<CAnimation>("SplevE.def"); schoolBorders[3] = std::make_shared<CAnimation>(AnimationPath::builtin("SplevE.def"));
for(auto item : schoolBorders) for(auto item : schoolBorders)
item->preload(); item->preload();
mana = std::make_shared<CLabel>(435, 426, FONT_SMALL, ETextAlignment::CENTER, Colors::YELLOW, std::to_string(myHero->mana)); mana = std::make_shared<CLabel>(435, 426, FONT_SMALL, ETextAlignment::CENTER, Colors::YELLOW, std::to_string(myHero->mana));
statusBar = CGStatusBar::create(7, 569, "Spelroll.bmp"); statusBar = CGStatusBar::create(7, 569, ImagePath::builtin("Spelroll.bmp"));
interactiveAreas.push_back(std::make_shared<InteractiveArea>( Rect( 479 + pos.x, 405 + pos.y, 36, 56), std::bind(&CSpellWindow::fexitb, this), 460, this)); interactiveAreas.push_back(std::make_shared<InteractiveArea>( Rect( 479 + pos.x, 405 + pos.y, 36, 56), std::bind(&CSpellWindow::fexitb, this), 460, this));
interactiveAreas.push_back(std::make_shared<InteractiveArea>( Rect( 221 + pos.x, 405 + pos.y, 36, 56), std::bind(&CSpellWindow::fbattleSpellsb, this), 453, this)); interactiveAreas.push_back(std::make_shared<InteractiveArea>( Rect( 221 + pos.x, 405 + pos.y, 36, 56), std::bind(&CSpellWindow::fbattleSpellsb, this), 453, this));

View File

@ -87,22 +87,22 @@ void CTradeWindow::CTradeableItem::setID(int newID)
} }
} }
std::string CTradeWindow::CTradeableItem::getFilename() AnimationPath CTradeWindow::CTradeableItem::getFilename()
{ {
switch(type) switch(type)
{ {
case RESOURCE: case RESOURCE:
return "RESOURCE"; return AnimationPath::builtin("RESOURCE");
case PLAYER: case PLAYER:
return "CREST58"; return AnimationPath::builtin("CREST58");
case ARTIFACT_TYPE: case ARTIFACT_TYPE:
case ARTIFACT_PLACEHOLDER: case ARTIFACT_PLACEHOLDER:
case ARTIFACT_INSTANCE: case ARTIFACT_INSTANCE:
return "artifact"; return AnimationPath::builtin("artifact");
case CREATURE: case CREATURE:
return "TWCRPORT"; return AnimationPath::builtin("TWCRPORT");
default: default:
return ""; return {};
} }
} }
@ -317,7 +317,7 @@ void CTradeWindow::CTradeableItem::setArtInstance(const CArtifactInstance *art)
setID(-1); setID(-1);
} }
CTradeWindow::CTradeWindow(std::string bgName, const IMarket *Market, const CGHeroInstance *Hero, EMarketMode Mode): CTradeWindow::CTradeWindow(const ImagePath & bgName, const IMarket *Market, const CGHeroInstance *Hero, EMarketMode Mode):
CWindowObject(PLAYER_COLORED, bgName), CWindowObject(PLAYER_COLORED, bgName),
market(Market), market(Market),
hero(Hero), hero(Hero),
@ -616,23 +616,23 @@ void CTradeWindow::artifactSelected(CHeroArtPlace *slot)
selectionChanged(true); selectionChanged(true);
} }
std::string CMarketplaceWindow::getBackgroundForMode(EMarketMode mode) ImagePath CMarketplaceWindow::getBackgroundForMode(EMarketMode mode)
{ {
switch(mode) switch(mode)
{ {
case EMarketMode::RESOURCE_RESOURCE: case EMarketMode::RESOURCE_RESOURCE:
return "TPMRKRES.bmp"; return ImagePath::builtin("TPMRKRES.bmp");
case EMarketMode::RESOURCE_PLAYER: case EMarketMode::RESOURCE_PLAYER:
return "TPMRKPTS.bmp"; return ImagePath::builtin("TPMRKPTS.bmp");
case EMarketMode::CREATURE_RESOURCE: case EMarketMode::CREATURE_RESOURCE:
return "TPMRKCRS.bmp"; return ImagePath::builtin("TPMRKCRS.bmp");
case EMarketMode::RESOURCE_ARTIFACT: case EMarketMode::RESOURCE_ARTIFACT:
return "TPMRKABS.bmp"; return ImagePath::builtin("TPMRKABS.bmp");
case EMarketMode::ARTIFACT_RESOURCE: case EMarketMode::ARTIFACT_RESOURCE:
return "TPMRKASS.bmp"; return ImagePath::builtin("TPMRKASS.bmp");
} }
assert(0); assert(0);
return ""; return {};
} }
CMarketplaceWindow::CMarketplaceWindow(const IMarket * Market, const CGHeroInstance * Hero, EMarketMode Mode) CMarketplaceWindow::CMarketplaceWindow(const IMarket * Market, const CGHeroInstance * Hero, EMarketMode Mode)
@ -685,14 +685,14 @@ CMarketplaceWindow::CMarketplaceWindow(const IMarket * Market, const CGHeroInsta
initItems(false); initItems(false);
initItems(true); initItems(true);
ok = std::make_shared<CButton>(Point(516, 520), "IOK6432.DEF", CGI->generaltexth->zelp[600], [&](){ close(); }, EShortcut::GLOBAL_RETURN); ok = std::make_shared<CButton>(Point(516, 520), AnimationPath::builtin("IOK6432.DEF"), CGI->generaltexth->zelp[600], [&](){ close(); }, EShortcut::GLOBAL_RETURN);
deal = std::make_shared<CButton>(Point(307, 520), "TPMRKB.DEF", CGI->generaltexth->zelp[595], [&](){ makeDeal(); } ); deal = std::make_shared<CButton>(Point(307, 520), AnimationPath::builtin("TPMRKB.DEF"), CGI->generaltexth->zelp[595], [&](){ makeDeal(); } );
deal->block(true); deal->block(true);
if(sliderNeeded) if(sliderNeeded)
{ {
slider = std::make_shared<CSlider>(Point(231, 490), 137, std::bind(&CMarketplaceWindow::sliderMoved, this, _1), 0, 0, 0, Orientation::HORIZONTAL); slider = std::make_shared<CSlider>(Point(231, 490), 137, std::bind(&CMarketplaceWindow::sliderMoved, this, _1), 0, 0, 0, Orientation::HORIZONTAL);
max = std::make_shared<CButton>(Point(229, 520), "IRCBTNS.DEF", CGI->generaltexth->zelp[596], [&](){ setMax(); }); max = std::make_shared<CButton>(Point(229, 520), AnimationPath::builtin("IRCBTNS.DEF"), CGI->generaltexth->zelp[596], [&](){ setMax(); });
max->block(true); max->block(true);
} }
else else
@ -740,15 +740,15 @@ CMarketplaceWindow::CMarketplaceWindow(const IMarket * Market, const CGHeroInsta
int specialOffset = mode == EMarketMode::ARTIFACT_RESOURCE ? 35 : 0; //in selling artifacts mode we need to move res-res and art-res buttons down int specialOffset = mode == EMarketMode::ARTIFACT_RESOURCE ? 35 : 0; //in selling artifacts mode we need to move res-res and art-res buttons down
if(printButtonFor(EMarketMode::RESOURCE_PLAYER)) if(printButtonFor(EMarketMode::RESOURCE_PLAYER))
buttons.push_back(std::make_shared<CButton>(Point(18, 520),"TPMRKBU1.DEF", CGI->generaltexth->zelp[612], [&](){ setMode(EMarketMode::RESOURCE_PLAYER);})); buttons.push_back(std::make_shared<CButton>(Point(18, 520),AnimationPath::builtin("TPMRKBU1.DEF"), CGI->generaltexth->zelp[612], [&](){ setMode(EMarketMode::RESOURCE_PLAYER);}));
if(printButtonFor(EMarketMode::RESOURCE_RESOURCE)) if(printButtonFor(EMarketMode::RESOURCE_RESOURCE))
buttons.push_back(std::make_shared<CButton>(Point(516, 450 + specialOffset),"TPMRKBU5.DEF", CGI->generaltexth->zelp[605], [&](){ setMode(EMarketMode::RESOURCE_RESOURCE);})); buttons.push_back(std::make_shared<CButton>(Point(516, 450 + specialOffset),AnimationPath::builtin("TPMRKBU5.DEF"), CGI->generaltexth->zelp[605], [&](){ setMode(EMarketMode::RESOURCE_RESOURCE);}));
if(printButtonFor(EMarketMode::CREATURE_RESOURCE)) if(printButtonFor(EMarketMode::CREATURE_RESOURCE))
buttons.push_back(std::make_shared<CButton>(Point(516, 485),"TPMRKBU4.DEF", CGI->generaltexth->zelp[599], [&](){ setMode(EMarketMode::CREATURE_RESOURCE);})); buttons.push_back(std::make_shared<CButton>(Point(516, 485),AnimationPath::builtin("TPMRKBU4.DEF"), CGI->generaltexth->zelp[599], [&](){ setMode(EMarketMode::CREATURE_RESOURCE);}));
if(printButtonFor(EMarketMode::RESOURCE_ARTIFACT)) if(printButtonFor(EMarketMode::RESOURCE_ARTIFACT))
buttons.push_back(std::make_shared<CButton>(Point(18, 450 + specialOffset),"TPMRKBU2.DEF", CGI->generaltexth->zelp[598], [&](){ setMode(EMarketMode::RESOURCE_ARTIFACT);})); buttons.push_back(std::make_shared<CButton>(Point(18, 450 + specialOffset),AnimationPath::builtin("TPMRKBU2.DEF"), CGI->generaltexth->zelp[598], [&](){ setMode(EMarketMode::RESOURCE_ARTIFACT);}));
if(printButtonFor(EMarketMode::ARTIFACT_RESOURCE)) if(printButtonFor(EMarketMode::ARTIFACT_RESOURCE))
buttons.push_back(std::make_shared<CButton>(Point(18, 485),"TPMRKBU3.DEF", CGI->generaltexth->zelp[613], [&](){ setMode(EMarketMode::ARTIFACT_RESOURCE);})); buttons.push_back(std::make_shared<CButton>(Point(18, 485),AnimationPath::builtin("TPMRKBU3.DEF"), CGI->generaltexth->zelp[613], [&](){ setMode(EMarketMode::ARTIFACT_RESOURCE);}));
updateTraderText(); updateTraderText();
} }
@ -1076,7 +1076,7 @@ void CMarketplaceWindow::updateTraderText()
} }
CAltarWindow::CAltarWindow(const IMarket * Market, const CGHeroInstance * Hero, EMarketMode Mode) CAltarWindow::CAltarWindow(const IMarket * Market, const CGHeroInstance * Hero, EMarketMode Mode)
: CTradeWindow((Mode == EMarketMode::CREATURE_EXP ? "ALTARMON.bmp" : "ALTRART2.bmp"), Market, Hero, Mode) : CTradeWindow(ImagePath::builtin(Mode == EMarketMode::CREATURE_EXP ? "ALTARMON.bmp" : "ALTRART2.bmp"), Market, Hero, Mode)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@ -1093,10 +1093,10 @@ CAltarWindow::CAltarWindow(const IMarket * Market, const CGHeroInstance * Hero,
new CTextBox(CGI->generaltexth->allTexts[480], Rect(320, 56, 256, 40), 0, FONT_SMALL, ETextAlignment::CENTER, Colors::YELLOW); new CTextBox(CGI->generaltexth->allTexts[480], Rect(320, 56, 256, 40), 0, FONT_SMALL, ETextAlignment::CENTER, Colors::YELLOW);
slider = std::make_shared<CSlider>(Point(231, 481), 137, std::bind(&CAltarWindow::sliderMoved, this, _1), 0, 0, 0, Orientation::HORIZONTAL); slider = std::make_shared<CSlider>(Point(231, 481), 137, std::bind(&CAltarWindow::sliderMoved, this, _1), 0, 0, 0, Orientation::HORIZONTAL);
max = std::make_shared<CButton>(Point(147, 520), "IRCBTNS.DEF", CGI->generaltexth->zelp[578], std::bind(&CSlider::scrollToMax, slider)); max = std::make_shared<CButton>(Point(147, 520), AnimationPath::builtin("IRCBTNS.DEF"), CGI->generaltexth->zelp[578], std::bind(&CSlider::scrollToMax, slider));
sacrificedUnits.resize(GameConstants::ARMY_SIZE, 0); sacrificedUnits.resize(GameConstants::ARMY_SIZE, 0);
sacrificeAll = std::make_shared<CButton>(Point(393, 520), "ALTARMY.DEF", CGI->generaltexth->zelp[579], std::bind(&CAltarWindow::SacrificeAll,this)); sacrificeAll = std::make_shared<CButton>(Point(393, 520), AnimationPath::builtin("ALTARMY.DEF"), CGI->generaltexth->zelp[579], std::bind(&CAltarWindow::SacrificeAll,this));
initItems(true); initItems(true);
mimicCres(); mimicCres();
@ -1108,9 +1108,9 @@ CAltarWindow::CAltarWindow(const IMarket * Market, const CGHeroInstance * Hero,
//%s's Creatures //%s's Creatures
labels.push_back(std::make_shared<CLabel>(302, 423, FONT_SMALL, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[478])); labels.push_back(std::make_shared<CLabel>(302, 423, FONT_SMALL, ETextAlignment::CENTER, Colors::YELLOW, CGI->generaltexth->allTexts[478]));
sacrificeAll = std::make_shared<CButton>(Point(393, 520), "ALTFILL.DEF", CGI->generaltexth->zelp[571], std::bind(&CAltarWindow::SacrificeAll,this)); sacrificeAll = std::make_shared<CButton>(Point(393, 520), AnimationPath::builtin("ALTFILL.DEF"), CGI->generaltexth->zelp[571], std::bind(&CAltarWindow::SacrificeAll,this));
sacrificeAll->block(hero->artifactsInBackpack.empty() && hero->artifactsWorn.empty()); sacrificeAll->block(hero->artifactsInBackpack.empty() && hero->artifactsWorn.empty());
sacrificeBackpack = std::make_shared<CButton>(Point(147, 520), "ALTEMBK.DEF", CGI->generaltexth->zelp[570], std::bind(&CAltarWindow::SacrificeBackpack,this)); sacrificeBackpack = std::make_shared<CButton>(Point(147, 520), AnimationPath::builtin("ALTEMBK.DEF"), CGI->generaltexth->zelp[570], std::bind(&CAltarWindow::SacrificeBackpack,this));
sacrificeBackpack->block(hero->artifactsInBackpack.empty()); sacrificeBackpack->block(hero->artifactsInBackpack.empty());
arts = std::make_shared<CArtifactsOfHeroAltar>(Point(-365, -12)); arts = std::make_shared<CArtifactsOfHeroAltar>(Point(-365, -12));
@ -1119,7 +1119,7 @@ CAltarWindow::CAltarWindow(const IMarket * Market, const CGHeroInstance * Hero,
initItems(true); initItems(true);
initItems(false); initItems(false);
artIcon = std::make_shared<CAnimImage>("ARTIFACT", 0, 0, 281, 442); artIcon = std::make_shared<CAnimImage>(AnimationPath::builtin("ARTIFACT"), 0, 0, 281, 442);
artIcon->disable(); artIcon->disable();
} }
@ -1130,20 +1130,20 @@ CAltarWindow::CAltarWindow(const IMarket * Market, const CGHeroInstance * Hero,
statusBar = CGStatusBar::create(std::make_shared<CPicture>(background->getSurface(), Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26)); statusBar = CGStatusBar::create(std::make_shared<CPicture>(background->getSurface(), Rect(8, pos.h - 26, pos.w - 16, 19), 8, pos.h - 26));
ok = std::make_shared<CButton>(Point(516, 520), "IOK6432.DEF", CGI->generaltexth->zelp[568], [&](){ close();}, EShortcut::GLOBAL_RETURN); ok = std::make_shared<CButton>(Point(516, 520), AnimationPath::builtin("IOK6432.DEF"), CGI->generaltexth->zelp[568], [&](){ close();}, EShortcut::GLOBAL_RETURN);
deal = std::make_shared<CButton>(Point(269, 520), "ALTSACR.DEF", CGI->generaltexth->zelp[585], std::bind(&CAltarWindow::makeDeal,this)); deal = std::make_shared<CButton>(Point(269, 520), AnimationPath::builtin("ALTSACR.DEF"), CGI->generaltexth->zelp[585], std::bind(&CAltarWindow::makeDeal,this));
if(Mode == EMarketMode::CREATURE_EXP) if(Mode == EMarketMode::CREATURE_EXP)
{ {
auto changeMode = std::make_shared<CButton>(Point(516, 421), "ALTART.DEF", CGI->generaltexth->zelp[580], std::bind(&CTradeWindow::setMode,this, EMarketMode::ARTIFACT_EXP)); auto changeMode = std::make_shared<CButton>(Point(516, 421), AnimationPath::builtin("ALTART.DEF"), CGI->generaltexth->zelp[580], std::bind(&CTradeWindow::setMode,this, EMarketMode::ARTIFACT_EXP));
if(Hero->getAlignment() == ::EAlignment::EVIL) if(Hero->getAlignment() == ::EAlignment::EVIL)
changeMode->block(true); changeMode->block(true);
buttons.push_back(changeMode); buttons.push_back(changeMode);
} }
else if(Mode == EMarketMode::ARTIFACT_EXP) else if(Mode == EMarketMode::ARTIFACT_EXP)
{ {
auto changeMode = std::make_shared<CButton>(Point(516, 421), "ALTSACC.DEF", CGI->generaltexth->zelp[572], std::bind(&CTradeWindow::setMode,this, EMarketMode::CREATURE_EXP)); auto changeMode = std::make_shared<CButton>(Point(516, 421), AnimationPath::builtin("ALTSACC.DEF"), CGI->generaltexth->zelp[572], std::bind(&CTradeWindow::setMode,this, EMarketMode::CREATURE_EXP));
if(Hero->getAlignment() == ::EAlignment::GOOD) if(Hero->getAlignment() == ::EAlignment::GOOD)
changeMode->block(true); changeMode->block(true);
buttons.push_back(changeMode); buttons.push_back(changeMode);

Some files were not shown because too many files have changed in this diff Show More