diff --git a/resources/maps/AfricaThumb.png b/resources/maps/AfricaThumb.png new file mode 100644 index 000000000..f29b3e4fa Binary files /dev/null and b/resources/maps/AfricaThumb.png differ diff --git a/resources/maps/AsiaThumb.png b/resources/maps/AsiaThumb.png new file mode 100644 index 000000000..50f0670f0 Binary files /dev/null and b/resources/maps/AsiaThumb.png differ diff --git a/resources/maps/BlackSeaThumb.png b/resources/maps/BlackSeaThumb.png new file mode 100644 index 000000000..e3cceae92 Binary files /dev/null and b/resources/maps/BlackSeaThumb.png differ diff --git a/resources/maps/BritanniaThumb.png b/resources/maps/BritanniaThumb.png new file mode 100644 index 000000000..b9e1ea5b6 Binary files /dev/null and b/resources/maps/BritanniaThumb.png differ diff --git a/resources/maps/EuropeThumb.png b/resources/maps/EuropeThumb.png new file mode 100644 index 000000000..775a8a187 Binary files /dev/null and b/resources/maps/EuropeThumb.png differ diff --git a/resources/maps/GatewayToTheAtlanticThumb.png b/resources/maps/GatewayToTheAtlanticThumb.png new file mode 100644 index 000000000..fd1cc90b1 Binary files /dev/null and b/resources/maps/GatewayToTheAtlanticThumb.png differ diff --git a/resources/maps/MarsThumb.png b/resources/maps/MarsThumb.png new file mode 100644 index 000000000..96c745af6 Binary files /dev/null and b/resources/maps/MarsThumb.png differ diff --git a/resources/maps/MenaThumb.png b/resources/maps/MenaThumb.png new file mode 100644 index 000000000..a3869c538 Binary files /dev/null and b/resources/maps/MenaThumb.png differ diff --git a/resources/maps/NorthAmericaThumb.png b/resources/maps/NorthAmericaThumb.png new file mode 100644 index 000000000..b84a6043d Binary files /dev/null and b/resources/maps/NorthAmericaThumb.png differ diff --git a/resources/maps/OceaniaThumb.png b/resources/maps/OceaniaThumb.png new file mode 100644 index 000000000..c885acd34 Binary files /dev/null and b/resources/maps/OceaniaThumb.png differ diff --git a/resources/maps/SouthAmericaThumb.png b/resources/maps/SouthAmericaThumb.png new file mode 100644 index 000000000..e0e460feb Binary files /dev/null and b/resources/maps/SouthAmericaThumb.png differ diff --git a/resources/maps/WorldMapThumb.png b/resources/maps/WorldMapThumb.png new file mode 100644 index 000000000..7382d5709 Binary files /dev/null and b/resources/maps/WorldMapThumb.png differ diff --git a/src/client/utilities/Maps.ts b/src/client/utilities/Maps.ts index f209ad794..d2112ddca 100644 --- a/src/client/utilities/Maps.ts +++ b/src/client/utilities/Maps.ts @@ -1,15 +1,15 @@ -import world from "../../../resources/maps/WorldMap.png"; -import oceania from "../../../resources/maps/Oceania.png"; -import europe from "../../../resources/maps/Europe.png"; -import mena from "../../../resources/maps/Mena.png"; -import northAmerica from "../../../resources/maps/NorthAmerica.png"; -import southAmerica from "../../../resources/maps/SouthAmerica.png"; -import blackSea from "../../../resources/maps/BlackSea.png"; -import africa from "../../../resources/maps/Africa.png"; -import asia from "../../../resources/maps/Asia.png"; -import mars from "../../../resources/maps/Mars.png"; -import britannia from "../../../resources/maps/Britannia.png"; -import gatewayToTheAtlantic from "../../../resources/maps/GatewayToTheAtlantic.png"; +import world from "../../../resources/maps/WorldMapThumb.png"; +import oceania from "../../../resources/maps/OceaniaThumb.png"; +import europe from "../../../resources/maps/EuropeThumb.png"; +import mena from "../../../resources/maps/MenaThumb.png"; +import northAmerica from "../../../resources/maps/NorthAmericaThumb.png"; +import southAmerica from "../../../resources/maps/SouthAmericaThumb.png"; +import blackSea from "../../../resources/maps/BlackSeaThumb.png"; +import africa from "../../../resources/maps/AfricaThumb.png"; +import asia from "../../../resources/maps/AsiaThumb.png"; +import mars from "../../../resources/maps/MarsThumb.png"; +import britannia from "../../../resources/maps/BritanniaThumb.png"; +import gatewayToTheAtlantic from "../../../resources/maps/GatewayToTheAtlanticThumb.png"; import { GameMapType } from "../../core/game/Game"; diff --git a/src/scripts/TerrainMapGenerator.ts b/src/scripts/TerrainMapGenerator.ts index 53f50f5dd..05dc6694e 100644 --- a/src/scripts/TerrainMapGenerator.ts +++ b/src/scripts/TerrainMapGenerator.ts @@ -1,7 +1,7 @@ -import { decodePNGFromStream } from "pureimage"; -import path from "path"; -import fs from "fs/promises"; -import { createReadStream } from "fs"; +import { decodePNGFromStream, Bitmap } from "pureimage"; +//import path from "path"; +//import fs from "fs/promises"; +//import { createReadStream } from "fs"; import { Readable } from "stream"; const min_island_size = 30; @@ -26,7 +26,7 @@ class Terrain { export async function generateMap( imageBuffer: Buffer, removeSmall = true, -): Promise<{ map: Uint8Array; miniMap: Uint8Array }> { +): Promise<{ map: Uint8Array; miniMap: Uint8Array; thumb: Bitmap }> { const stream = Readable.from(imageBuffer); const img = await decodePNGFromStream(stream); @@ -66,10 +66,12 @@ export async function generateMap( processOcean(terrain); const miniTerrain = await createMiniMap(terrain); + const thumb = await createMapThumbnail(miniTerrain); return { map: packTerrain(terrain), miniMap: packTerrain(miniTerrain), + thumb: thumb, }; } @@ -326,3 +328,69 @@ function getNeighborCoords(x: number, y: number, map: Terrain[][]): Coord[] { } return coords; } + +async function createMapThumbnail(map: Terrain[][]): Promise { + console.log("creating thumbnail"); + const bitmap = new Bitmap(map.length, map[0].length); + for (let x = 0; x < bitmap.width; x++) { + for (let y = 0; y < bitmap.height; y++) { + const rgba = getThumbnailColor(map[x][y]); + bitmap.setPixelRGBA_i(x, y, rgba.r, rgba.g, rgba.b, rgba.a); + } + } + return bitmap; +} + +function getThumbnailColor(t: Terrain): { + r: number; + g: number; + b: number; + a: number; +} { + if (t.type === TerrainType.Water) { + //shoreline water + if (t.shoreline) return { r: 100, g: 143, b: 255, a: 0 }; + //all other water + const waterAdjRGB: number = 11 - Math.min(t.magnitude / 2, 10) - 10; + return { + r: Math.max(70 + waterAdjRGB, 0), + g: Math.max(132 + waterAdjRGB, 0), + b: Math.max(180 + waterAdjRGB, 0), + a: 0, + }; + } + //shoreline land + if (t.shoreline) { + return { r: 204, g: 203, b: 158, a: 255 }; + } + let adjRGB: number; + switch (true) { + //plains + case t.magnitude < 10: + adjRGB = 220 - 2 * t.magnitude; + return { + r: 190, + g: adjRGB, + b: 138, + a: 255, + }; + //highlands + case t.magnitude < 20: + adjRGB = 2 * t.magnitude; + return { + r: 200 + adjRGB, + g: 183 + adjRGB, + b: 138 + adjRGB, + a: 255, + }; + //mountains + case t.magnitude >= 20: + adjRGB = Math.floor(230 + t.magnitude / 2); + return { + r: adjRGB, + g: adjRGB, + b: adjRGB, + a: 255, + }; + } +} diff --git a/src/scripts/generateTerrainMaps.ts b/src/scripts/generateTerrainMaps.ts index 69c72ca63..6d3b927a5 100644 --- a/src/scripts/generateTerrainMaps.ts +++ b/src/scripts/generateTerrainMaps.ts @@ -1,6 +1,8 @@ +import { encodePNGToStream } from "pureimage"; import { generateMap } from "./TerrainMapGenerator.js"; import path from "path"; import fs from "fs/promises"; +import { WriteStream, createWriteStream } from "fs"; const maps = [ "Africa", @@ -13,6 +15,7 @@ const maps = [ "Oceania", "NorthAmerica", "SouthAmerica", + "Britannia", "GatewayToTheAtlantic", ]; @@ -26,7 +29,7 @@ async function loadTerrainMaps() { map + ".png", ); const imageBuffer = await fs.readFile(mapPath); - const { map: mainMap, miniMap } = await generateMap(imageBuffer); + const { map: mainMap, miniMap, thumb } = await generateMap(imageBuffer); const outputPath = path.join( process.cwd(), @@ -40,10 +43,21 @@ async function loadTerrainMaps() { "maps", map + "Mini.bin", ); + const thumbOutputPath = path.join( + process.cwd(), + "resources", + "maps", + map + "Thumb.png", + ); + const thumbOutStream: WriteStream = createWriteStream( + thumbOutputPath, + "binary", + ); await Promise.all([ fs.writeFile(outputPath, mainMap), fs.writeFile(miniOutputPath, miniMap), + encodePNGToStream(thumb, thumbOutStream), ]); }), );