diff --git a/Mods/vcmi/Content/Sprites/stackWindow/bonus-effects.png b/Mods/vcmi/Content/Sprites/stackWindow/bonus-effects.png deleted file mode 100644 index 67fe2ce82..000000000 Binary files a/Mods/vcmi/Content/Sprites/stackWindow/bonus-effects.png and /dev/null differ diff --git a/Mods/vcmi/Content/Sprites/stackWindow/button-panel.png b/Mods/vcmi/Content/Sprites/stackWindow/button-panel.png deleted file mode 100644 index 7e0f999cb..000000000 Binary files a/Mods/vcmi/Content/Sprites/stackWindow/button-panel.png and /dev/null differ diff --git a/Mods/vcmi/Content/Sprites/stackWindow/commander-abilities.png b/Mods/vcmi/Content/Sprites/stackWindow/commander-abilities.png deleted file mode 100644 index 42c4b885e..000000000 Binary files a/Mods/vcmi/Content/Sprites/stackWindow/commander-abilities.png and /dev/null differ diff --git a/Mods/vcmi/Content/Sprites/stackWindow/commander-bg.png b/Mods/vcmi/Content/Sprites/stackWindow/commander-bg.png deleted file mode 100644 index e6deb4f25..000000000 Binary files a/Mods/vcmi/Content/Sprites/stackWindow/commander-bg.png and /dev/null differ diff --git a/Mods/vcmi/Content/Sprites/stackWindow/info-panel-0.png b/Mods/vcmi/Content/Sprites/stackWindow/info-panel-0.png deleted file mode 100644 index 7ed9b53b0..000000000 Binary files a/Mods/vcmi/Content/Sprites/stackWindow/info-panel-0.png and /dev/null differ diff --git a/Mods/vcmi/Content/Sprites/stackWindow/info-panel-1.png b/Mods/vcmi/Content/Sprites/stackWindow/info-panel-1.png deleted file mode 100644 index 5b09f5cac..000000000 Binary files a/Mods/vcmi/Content/Sprites/stackWindow/info-panel-1.png and /dev/null differ diff --git a/Mods/vcmi/Content/Sprites/stackWindow/info-panel-2.png b/Mods/vcmi/Content/Sprites/stackWindow/info-panel-2.png deleted file mode 100644 index 06b1db944..000000000 Binary files a/Mods/vcmi/Content/Sprites/stackWindow/info-panel-2.png and /dev/null differ diff --git a/Mods/vcmi/Content/Sprites/stackWindow/spell-effects.png b/Mods/vcmi/Content/Sprites/stackWindow/spell-effects.png deleted file mode 100644 index 268da2a52..000000000 Binary files a/Mods/vcmi/Content/Sprites/stackWindow/spell-effects.png and /dev/null differ diff --git a/client/render/AssetGenerator.cpp b/client/render/AssetGenerator.cpp index 868af0946..329d26e97 100644 --- a/client/render/AssetGenerator.cpp +++ b/client/render/AssetGenerator.cpp @@ -18,6 +18,7 @@ #include "../render/ColorFilter.h" #include "../render/IRenderHandler.h" #include "../render/CAnimation.h" +#include "../render/Colors.h" #include "../lib/filesystem/Filesystem.h" #include "../lib/GameSettings.h" @@ -51,6 +52,15 @@ void AssetGenerator::initialize() imageFiles[ImagePath::builtin("SpelTabNone.png")] = [this](){ return createSpellTabNone();}; + imageFiles[ImagePath::builtin("stackWindow/info-panel-0.png")] = [this](){ return createCreatureInfoPanel(2);}; + imageFiles[ImagePath::builtin("stackWindow/info-panel-1.png")] = [this](){ return createCreatureInfoPanel(3);}; + imageFiles[ImagePath::builtin("stackWindow/info-panel-2.png")] = [this](){ return createCreatureInfoPanel(4);}; + imageFiles[ImagePath::builtin("stackWindow/bonus-effects.png")] = [this](){ return createCreatureInfoPanelElement(BONUS_EFFECTS);}; + imageFiles[ImagePath::builtin("stackWindow/spell-effects.png")] = [this](){ return createCreatureInfoPanelElement(SPELL_EFFECTS);}; + imageFiles[ImagePath::builtin("stackWindow/button-panel.png")] = [this](){ return createCreatureInfoPanelElement(BUTTON_PANEL);}; + imageFiles[ImagePath::builtin("stackWindow/commander-bg.png")] = [this](){ return createCreatureInfoPanelElement(COMMANDER_BACKGROUND);}; + imageFiles[ImagePath::builtin("stackWindow/commander-abilities.png")] = [this](){ return createCreatureInfoPanelElement(COMMANDER_ABILITIES);}; + for (PlayerColor color(0); color < PlayerColor::PLAYER_LIMIT; ++color) imageFiles[ImagePath::builtin("DialogBoxBackground_" + color.toString())] = [this, color](){ return createPlayerColoredBackground(color);}; @@ -535,3 +545,123 @@ AssetGenerator::AnimationLayoutMap AssetGenerator::createAdventureMapButton(cons return layout; } + +AssetGenerator::CanvasPtr AssetGenerator::createCreatureInfoPanel(int boxesAmount) const +{ + auto locator = ImageLocator(ImagePath::builtin("DiBoxBck"), EImageBlitMode::OPAQUE); + std::shared_ptr img = ENGINE->renderHandler().loadImage(locator); + + Point size(438, 187); + + auto image = ENGINE->renderHandler().createImage(size, CanvasScalingPolicy::IGNORE); + Canvas canvas = image->getCanvas(); + + for (int y = 0; y < size.y; y += img->height()) + for (int x = 0; x < size.x; x += img->width()) + canvas.draw(img, Point(x, y), Rect(0, 0, std::min(img->width(), size.x - x), std::min(img->height(), size.y - y))); + + Rect r(4, 40, 102, 132); + canvas.drawColor(r, Colors::BLACK); + canvas.drawBorder(r, Colors::YELLOW); + + const ColorRGBA rectangleColor = ColorRGBA(0, 0, 0, 75); + const ColorRGBA rectangleColorRed = ColorRGBA(32, 0, 0, 150); + const ColorRGBA borderColor = ColorRGBA(128, 100, 75); + + r = Rect(60, 3, 315, 21); + canvas.drawColorBlended(r, rectangleColor); + canvas.drawBorder(r, borderColor); + + for(int i = 0; i < 8; i++) + { + Rect r(114, 30 + i * 19, 24, 20); + canvas.drawColorBlended(r, rectangleColor); + canvas.drawBorder(r, borderColor); + r.x += 23; + r.w = 173; + canvas.drawColorBlended(r, rectangleColor); + canvas.drawBorder(r, borderColor); + } + + std::vector redRects = { + Rect(319, 30, 45, 45), + Rect(373, 30, 45, 45) + }; + std::vector darkRects = {}; + + if(boxesAmount == 3) + { + redRects.push_back(Rect(347, 108, 45, 45)); + darkRects.push_back(Rect(347, 156, 45, 19)); + } + else if(boxesAmount == 4) + { + redRects.push_back(Rect(319, 108, 45, 45)); + redRects.push_back(Rect(373, 108, 45, 45)); + darkRects.push_back(Rect(319, 156, 45, 19)); + darkRects.push_back(Rect(373, 156, 45, 19)); + } + + for(auto & rect : darkRects) + { + canvas.drawColorBlended(rect, rectangleColor); + canvas.drawBorder(rect, borderColor); + } + for(auto & rect : redRects) + { + canvas.drawColorBlended(rect, rectangleColorRed); + canvas.drawBorder(rect, borderColor); + } + + return image; +} + +AssetGenerator::CanvasPtr AssetGenerator::createCreatureInfoPanelElement(CreatureInfoPanelElement element) const +{ + auto locator = ImageLocator(ImagePath::builtin("DiBoxBck"), EImageBlitMode::OPAQUE); + std::shared_ptr img = ENGINE->renderHandler().loadImage(locator); + + std::map size { + {BONUS_EFFECTS, Point(438, 59)}, + {SPELL_EFFECTS, Point(438, 42)}, + {BUTTON_PANEL, Point(438, 43)}, + {COMMANDER_BACKGROUND, Point(438, 177)}, + {COMMANDER_ABILITIES, Point(438, 59)} + }; + + auto image = ENGINE->renderHandler().createImage(size[element], CanvasScalingPolicy::IGNORE); + Canvas canvas = image->getCanvas(); + + for (int y = 0; y < size[element].y; y += img->height()) + for (int x = 0; x < size[element].x; x += img->width()) + canvas.draw(img, Point(x, y), Rect(0, 0, std::min(img->width(), size[element].x - x), std::min(img->height(), size[element].y - y))); + + const ColorRGBA rectangleColor = ColorRGBA(0, 0, 0, 75); + const ColorRGBA rectangleColorRed = ColorRGBA(32, 0, 0, 150); + const ColorRGBA borderColor = ColorRGBA(128, 100, 75); + + switch (element) + { + case BONUS_EFFECTS: + for(int i = 0; i < 2; i++) + { + Rect r(4 + i * 208, 0, 54, 54); + canvas.drawColorBlended(r, rectangleColorRed); + canvas.drawBorder(r, borderColor); + r = Rect(61 + i * 208, 0, 144, 54); + canvas.drawColorBlended(r, rectangleColor); + canvas.drawBorder(r, borderColor); + } + break; + case SPELL_EFFECTS: + break; + case BUTTON_PANEL: + break; + case COMMANDER_BACKGROUND: + break; + case COMMANDER_ABILITIES: + break; + } + + return image; +} diff --git a/client/render/AssetGenerator.h b/client/render/AssetGenerator.h index bb2f500c7..b66b53305 100644 --- a/client/render/AssetGenerator.h +++ b/client/render/AssetGenerator.h @@ -54,6 +54,9 @@ private: CanvasPtr createChroniclesCampaignImages(int chronicle) const; CanvasPtr createPaletteShiftedImage(const AnimationPath & source, const std::vector & animation, int frameIndex, int paletteShiftCounter) const; CanvasPtr createAdventureMapButtonClear(const PlayerColor & player) const; + CanvasPtr createCreatureInfoPanel(int boxesAmount) const; + enum CreatureInfoPanelElement{ BONUS_EFFECTS, SPELL_EFFECTS, BUTTON_PANEL, COMMANDER_BACKGROUND, COMMANDER_ABILITIES }; + CanvasPtr createCreatureInfoPanelElement(CreatureInfoPanelElement element) const; AnimationLayoutMap createAdventureMapButton(const ImagePath & overlay); void createPaletteShiftedSprites();