|  | @@ -14,6 +14,7 @@
 | 
	
		
			
				|  |  |  #include "../render/IImage.h"
 | 
	
		
			
				|  |  |  #include "../render/IImageLoader.h"
 | 
	
		
			
				|  |  |  #include "../render/Canvas.h"
 | 
	
		
			
				|  |  | +#include "../render/ColorFilter.h"
 | 
	
		
			
				|  |  |  #include "../render/IRenderHandler.h"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #include "../lib/filesystem/Filesystem.h"
 | 
	
	
		
			
				|  | @@ -22,11 +23,13 @@ void AssetGenerator::generateAll()
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |  	createBigSpellBook();
 | 
	
		
			
				|  |  |  	createAdventureOptionsCleanBackground();
 | 
	
		
			
				|  |  | +	for (int i = 0; i < PlayerColor::PLAYER_LIMIT_I; ++i)
 | 
	
		
			
				|  |  | +		createPlayerColoredBackground(PlayerColor(i));
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void AssetGenerator::createAdventureOptionsCleanBackground()
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -	std::string filename = "data/AdventureOptionsBackgroundClear.bmp";
 | 
	
		
			
				|  |  | +	std::string filename = "data/AdventureOptionsBackgroundClear.png";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	if(CResourceHandler::get()->existsResource(ResourcePath(filename))) // overridden by mod, no generation
 | 
	
		
			
				|  |  |  		return;
 | 
	
	
		
			
				|  | @@ -35,9 +38,10 @@ void AssetGenerator::createAdventureOptionsCleanBackground()
 | 
	
		
			
				|  |  |  		return;
 | 
	
		
			
				|  |  |  	ResourcePath savePath(filename, EResType::IMAGE);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	auto res = ImagePath::builtin("ADVOPTBK");
 | 
	
		
			
				|  |  | +	auto locator = ImageLocator(ImagePath::builtin("ADVOPTBK"));
 | 
	
		
			
				|  |  | +	locator.scalingFactor = 1;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	std::shared_ptr<IImage> img = GH.renderHandler().loadImage(res, EImageBlitMode::OPAQUE);
 | 
	
		
			
				|  |  | +	std::shared_ptr<IImage> img = GH.renderHandler().loadImage(locator, EImageBlitMode::OPAQUE);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	Canvas canvas = Canvas(Point(575, 585), CanvasScalingPolicy::IGNORE);
 | 
	
		
			
				|  |  |  	canvas.draw(img, Point(0, 0), Rect(0, 0, 575, 585));
 | 
	
	
		
			
				|  | @@ -55,7 +59,7 @@ void AssetGenerator::createAdventureOptionsCleanBackground()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void AssetGenerator::createBigSpellBook()
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -	std::string filename = "data/SpellBookLarge.bmp";
 | 
	
		
			
				|  |  | +	std::string filename = "data/SpellBookLarge.png";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	if(CResourceHandler::get()->existsResource(ResourcePath(filename))) // overridden by mod, no generation
 | 
	
		
			
				|  |  |  		return;
 | 
	
	
		
			
				|  | @@ -64,9 +68,10 @@ void AssetGenerator::createBigSpellBook()
 | 
	
		
			
				|  |  |  		return;
 | 
	
		
			
				|  |  |  	ResourcePath savePath(filename, EResType::IMAGE);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	auto res = ImagePath::builtin("SpelBack");
 | 
	
		
			
				|  |  | +	auto locator = ImageLocator(ImagePath::builtin("SpelBack"));
 | 
	
		
			
				|  |  | +	locator.scalingFactor = 1;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	std::shared_ptr<IImage> img = GH.renderHandler().loadImage(res, EImageBlitMode::OPAQUE);
 | 
	
		
			
				|  |  | +	std::shared_ptr<IImage> img = GH.renderHandler().loadImage(locator, EImageBlitMode::OPAQUE);
 | 
	
		
			
				|  |  |  	Canvas canvas = Canvas(Point(800, 600), CanvasScalingPolicy::IGNORE);
 | 
	
		
			
				|  |  |  	// edges
 | 
	
		
			
				|  |  |  	canvas.draw(img, Point(0, 0), Rect(15, 38, 90, 45));
 | 
	
	
		
			
				|  | @@ -114,3 +119,84 @@ void AssetGenerator::createBigSpellBook()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	image->exportBitmap(*CResourceHandler::get("local")->getResourceName(savePath));
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void AssetGenerator::createPlayerColoredBackground(const PlayerColor & player)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	std::string filename = "data/DialogBoxBackground_" + player.toString() + ".png";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if(CResourceHandler::get()->existsResource(ResourcePath(filename))) // overridden by mod, no generation
 | 
	
		
			
				|  |  | +		return;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if(!CResourceHandler::get("local")->createResource(filename))
 | 
	
		
			
				|  |  | +		return;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	ResourcePath savePath(filename, EResType::IMAGE);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	auto locator = ImageLocator(ImagePath::builtin("DiBoxBck"));
 | 
	
		
			
				|  |  | +	locator.scalingFactor = 1;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	std::shared_ptr<IImage> texture = GH.renderHandler().loadImage(locator, EImageBlitMode::OPAQUE);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Color transform to make color of brown DIBOX.PCX texture match color of specified player
 | 
	
		
			
				|  |  | +	static const std::array<ColorFilter, PlayerColor::PLAYER_LIMIT_I> filters = {
 | 
	
		
			
				|  |  | +		ColorFilter::genRangeShifter(  0.25,  0,     0,     1.25, 0.00, 0.00 ), // red
 | 
	
		
			
				|  |  | +		ColorFilter::genRangeShifter(  0,     0,     0,     0.45, 1.20, 4.50 ), // blue
 | 
	
		
			
				|  |  | +		ColorFilter::genRangeShifter(  0.40,  0.27,  0.23,  1.10, 1.20, 1.15 ), // tan
 | 
	
		
			
				|  |  | +		ColorFilter::genRangeShifter( -0.27,  0.10, -0.27,  0.70, 1.70, 0.70 ), // green
 | 
	
		
			
				|  |  | +		ColorFilter::genRangeShifter(  0.47,  0.17, -0.27,  1.60, 1.20, 0.70 ), // orange
 | 
	
		
			
				|  |  | +		ColorFilter::genRangeShifter(  0.12, -0.1,   0.25,  1.15, 1.20, 2.20 ), // purple
 | 
	
		
			
				|  |  | +		ColorFilter::genRangeShifter( -0.13,  0.23,  0.23,  0.90, 1.20, 2.20 ), // teal
 | 
	
		
			
				|  |  | +		ColorFilter::genRangeShifter(  0.44,  0.15,  0.25,  1.00, 1.00, 1.75 )  // pink
 | 
	
		
			
				|  |  | +	};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	assert(player.isValidPlayer());
 | 
	
		
			
				|  |  | +	if (!player.isValidPlayer())
 | 
	
		
			
				|  |  | +	{
 | 
	
		
			
				|  |  | +		logGlobal->error("Unable to colorize to invalid player color %d!", static_cast<int>(player.getNum()));
 | 
	
		
			
				|  |  | +		return;
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	texture->adjustPalette(filters[player.getNum()], 0);
 | 
	
		
			
				|  |  | +	texture->exportBitmap(*CResourceHandler::get("local")->getResourceName(savePath));
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void AssetGenerator::createCombatUnitNumberWindow()
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	std::string filenameToSave = "data/combatUnitNumberWindow";
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	ResourcePath savePathDefault(filenameToSave + "Default.png", EResType::IMAGE);
 | 
	
		
			
				|  |  | +	ResourcePath savePathNeutral(filenameToSave + "Neutral.png", EResType::IMAGE);
 | 
	
		
			
				|  |  | +	ResourcePath savePathPositive(filenameToSave + "Positive.png", EResType::IMAGE);
 | 
	
		
			
				|  |  | +	ResourcePath savePathNegative(filenameToSave + "Negative.png", EResType::IMAGE);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if(CResourceHandler::get()->existsResource(savePathDefault)) // overridden by mod, no generation
 | 
	
		
			
				|  |  | +		return;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if(!CResourceHandler::get("local")->createResource(savePathDefault.getOriginalName() + ".png") ||
 | 
	
		
			
				|  |  | +	   !CResourceHandler::get("local")->createResource(savePathNeutral.getOriginalName() + ".png") ||
 | 
	
		
			
				|  |  | +	   !CResourceHandler::get("local")->createResource(savePathPositive.getOriginalName() + ".png") ||
 | 
	
		
			
				|  |  | +	   !CResourceHandler::get("local")->createResource(savePathNegative.getOriginalName() + ".png"))
 | 
	
		
			
				|  |  | +		return;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	auto locator = ImageLocator(ImagePath::builtin("CMNUMWIN"));
 | 
	
		
			
				|  |  | +	locator.scalingFactor = 1;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	std::shared_ptr<IImage> texture = GH.renderHandler().loadImage(locator, EImageBlitMode::OPAQUE);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	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 shifterNegative = ColorFilter::genRangeShifter( 0.f, 0.f, 0.f, 1.0f, 0.2f, 0.2f );
 | 
	
		
			
				|  |  | +	static const auto shifterNeutral  = ColorFilter::genRangeShifter( 0.f, 0.f, 0.f, 1.0f, 1.0f, 0.2f );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// do not change border color
 | 
	
		
			
				|  |  | +	static const int32_t ignoredMask = 1 << 26;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	texture->adjustPalette(shifterNormal, ignoredMask);
 | 
	
		
			
				|  |  | +	texture->exportBitmap(*CResourceHandler::get("local")->getResourceName(savePathDefault));
 | 
	
		
			
				|  |  | +	texture->adjustPalette(shifterPositive, ignoredMask);
 | 
	
		
			
				|  |  | +	texture->exportBitmap(*CResourceHandler::get("local")->getResourceName(savePathPositive));
 | 
	
		
			
				|  |  | +	texture->adjustPalette(shifterNegative, ignoredMask);
 | 
	
		
			
				|  |  | +	texture->exportBitmap(*CResourceHandler::get("local")->getResourceName(savePathNegative));
 | 
	
		
			
				|  |  | +	texture->adjustPalette(shifterNeutral, ignoredMask);
 | 
	
		
			
				|  |  | +	texture->exportBitmap(*CResourceHandler::get("local")->getResourceName(savePathNeutral));
 | 
	
		
			
				|  |  | +}
 |