diff --git a/bin/data/cmclient-5.grf b/bin/data/cmclient-5.grf index 7b9e799f8e..098becc177 100644 Binary files a/bin/data/cmclient-5.grf and b/bin/data/cmclient-5.grf differ diff --git a/grf/cmclient/gencmclientgrf.py b/grf/cmclient/gencmclientgrf.py index 9d101812b0..859145b712 100644 --- a/grf/cmclient/gencmclientgrf.py +++ b/grf/cmclient/gencmclientgrf.py @@ -11,11 +11,17 @@ toolbar_png = grf.ImageFile('sprites/toolbar.png') gen.add_sprite(grf.FileSprite(toolbar_png, 0, 0, 20, 14), grf.FileSprite(toolbar_png, 32, 0, 40, 40, zoom=grf.ZOOM_2X)) -gen.add_sprite(grf.FileSprite(toolbar_png, 0, 44, 12, 10)) - +sprite = lambda *args, **kw: gen.add_sprite(grf.FileSprite(toolbar_png, *args, **kw)) +sprite( 0, 44, 12, 10) # hq button icon for i in range(3): for j in range(4): - gen.add_sprite(grf.FileSprite(toolbar_png, 66 + 20 * j, 44 + 11 * i, 10, 10)) + sprite(66 + 20 * j, 44 + 11 * i, 10, 10) +sprite( 0, 82, 11, 11) +sprite(12, 82, 11, 11) +sprite(24, 82, 11, 11) +# sprite( 0, 67, 11, 11) +# sprite(12, 67, 11, 11) +# sprite(24, 67, 11, 11) innerhl_png = grf.ImageFile('sprites/innerhighlight00.png') sprite = lambda *args, **kw: gen.add_sprite(grf.FileSprite(innerhl_png, *args, **kw)) diff --git a/grf/cmclient/grf.py b/grf/cmclient/grf.py index 199d231a9f..8932950ba9 100644 --- a/grf/cmclient/grf.py +++ b/grf/cmclient/grf.py @@ -10,6 +10,7 @@ to_spectra = lambda r, g, b: spectra.rgb(float(r) / 255., float(g) / 255., float # working with DOS palette only PALETTE = (0, 0, 255, 16, 16, 16, 32, 32, 32, 48, 48, 48, 64, 64, 64, 80, 80, 80, 100, 100, 100, 116, 116, 116, 132, 132, 132, 148, 148, 148, 168, 168, 168, 184, 184, 184, 200, 200, 200, 216, 216, 216, 232, 232, 232, 252, 252, 252, 52, 60, 72, 68, 76, 92, 88, 96, 112, 108, 116, 132, 132, 140, 152, 156, 160, 172, 176, 184, 196, 204, 208, 220, 48, 44, 4, 64, 60, 12, 80, 76, 20, 96, 92, 28, 120, 120, 64, 148, 148, 100, 176, 176, 132, 204, 204, 168, 72, 44, 4, 88, 60, 20, 104, 80, 44, 124, 104, 72, 152, 132, 92, 184, 160, 120, 212, 188, 148, 244, 220, 176, 64, 0, 4, 88, 4, 16, 112, 16, 32, 136, 32, 52, 160, 56, 76, 188, 84, 108, 204, 104, 124, 220, 132, 144, 236, 156, 164, 252, 188, 192, 252, 208, 0, 252, 232, 60, 252, 252, 128, 76, 40, 0, 96, 60, 8, 116, 88, 28, 136, 116, 56, 156, 136, 80, 176, 156, 108, 196, 180, 136, 68, 24, 0, 96, 44, 4, 128, 68, 8, 156, 96, 16, 184, 120, 24, 212, 156, 32, 232, 184, 16, 252, 212, 0, 252, 248, 128, 252, 252, 192, 32, 4, 0, 64, 20, 8, 84, 28, 16, 108, 44, 28, 128, 56, 40, 148, 72, 56, 168, 92, 76, 184, 108, 88, 196, 128, 108, 212, 148, 128, 8, 52, 0, 16, 64, 0, 32, 80, 4, 48, 96, 4, 64, 112, 12, 84, 132, 20, 104, 148, 28, 128, 168, 44, 28, 52, 24, 44, 68, 32, 60, 88, 48, 80, 104, 60, 104, 124, 76, 128, 148, 92, 152, 176, 108, 180, 204, 124, 16, 52, 24, 32, 72, 44, 56, 96, 72, 76, 116, 88, 96, 136, 108, 120, 164, 136, 152, 192, 168, 184, 220, 200, 32, 24, 0, 56, 28, 0, 72, 40, 4, 88, 52, 12, 104, 64, 24, 124, 84, 44, 140, 108, 64, 160, 128, 88, 76, 40, 16, 96, 52, 24, 116, 68, 40, 136, 84, 56, 164, 96, 64, 184, 112, 80, 204, 128, 96, 212, 148, 112, 224, 168, 128, 236, 188, 148, 80, 28, 4, 100, 40, 20, 120, 56, 40, 140, 76, 64, 160, 100, 96, 184, 136, 136, 36, 40, 68, 48, 52, 84, 64, 64, 100, 80, 80, 116, 100, 100, 136, 132, 132, 164, 172, 172, 192, 212, 212, 224, 40, 20, 112, 64, 44, 144, 88, 64, 172, 104, 76, 196, 120, 88, 224, 140, 104, 252, 160, 136, 252, 188, 168, 252, 0, 24, 108, 0, 36, 132, 0, 52, 160, 0, 72, 184, 0, 96, 212, 24, 120, 220, 56, 144, 232, 88, 168, 240, 128, 196, 252, 188, 224, 252, 16, 64, 96, 24, 80, 108, 40, 96, 120, 52, 112, 132, 80, 140, 160, 116, 172, 192, 156, 204, 220, 204, 240, 252, 172, 52, 52, 212, 52, 52, 252, 52, 52, 252, 100, 88, 252, 144, 124, 252, 184, 160, 252, 216, 200, 252, 244, 236, 72, 20, 112, 92, 44, 140, 112, 68, 168, 140, 100, 196, 168, 136, 224, 200, 176, 248, 208, 184, 255, 232, 208, 252, 60, 0, 0, 92, 0, 0, 128, 0, 0, 160, 0, 0, 196, 0, 0, 224, 0, 0, 252, 0, 0, 252, 80, 0, 252, 108, 0, 252, 136, 0, 252, 164, 0, 252, 192, 0, 252, 220, 0, 252, 252, 0, 204, 136, 8, 228, 144, 4, 252, 156, 0, 252, 176, 48, 252, 196, 100, 252, 216, 152, 8, 24, 88, 12, 36, 104, 20, 52, 124, 28, 68, 140, 40, 92, 164, 56, 120, 188, 72, 152, 216, 100, 172, 224, 92, 156, 52, 108, 176, 64, 124, 200, 76, 144, 224, 92, 224, 244, 252, 200, 236, 248, 180, 220, 236, 132, 188, 216, 88, 152, 172, 244, 0, 244, 245, 0, 245, 246, 0, 246, 247, 0, 247, 248, 0, 248, 249, 0, 249, 250, 0, 250, 251, 0, 251, 252, 0, 252, 253, 0, 253, 254, 0, 254, 255, 0, 255, 76, 24, 8, 108, 44, 24, 144, 72, 52, 176, 108, 84, 210, 146, 126, 252, 60, 0, 252, 84, 0, 252, 104, 0, 252, 124, 0, 252, 148, 0, 252, 172, 0, 252, 196, 0, 64, 0, 0, 255, 0, 0, 48, 48, 0, 64, 64, 0, 80, 80, 0, 255, 255, 0, 32, 68, 112, 36, 72, 116, 40, 76, 120, 44, 80, 124, 48, 84, 128, 72, 100, 144, 100, 132, 168, 216, 244, 252, 96, 128, 164, 68, 96, 140, 255, 255, 255) SAFE_COLORS = set(range(1, 0xD7)) +ALL_COLORS = set(range(256)) SPECTRA_PALETTE = {i:to_spectra(PALETTE[i * 3], PALETTE[i * 3 + 1], PALETTE[i * 3 + 2]) for i in range(256)} WATER_COLORS = set(range(0xF5, 0xFF)) @@ -28,9 +29,9 @@ def color_distance(c1, c2): (3 - rmean) * b * b) -def find_best_color(x): +def find_best_color(x, in_range=SAFE_COLORS): mj, md = 0, 1e100 - for j in SAFE_COLORS: + for j in in_range: c = SPECTRA_PALETTE[j] d = color_distance(x, c) if d < md: @@ -124,13 +125,18 @@ class ImageFile: return self._image img = Image.open(self.filename) assert (img.mode == 'P') # TODO - # pal = img.getpalette() - # if pal != PALETTE: - # remap = PaletteRemap() - # for i in range(256): - # remap.remap[i] = find_best_color(to_spectra(pal[3 * i], pal[3 * i + 1], pal[3 * i + 2])) - # self._image = remap.remap_image(img) - self._image = img + pal = tuple(img.getpalette()) + if pal != PALETTE: + print(f'Custom palette in file {self.filename}, converting...') + # for i in range(256): + # if tuple(pal[i * 3: i*3 + 3]) != PALETTE[i * 3: i*3 + 3]: + # print(i, pal[i * 3: i*3 + 3], PALETTE[i * 3: i*3 + 3]) + remap = PaletteRemap() + for i in ALL_COLORS: + remap.remap[i] = find_best_color(to_spectra(pal[3 * i], pal[3 * i + 1], pal[3 * i + 2]), in_range=ALL_COLORS) + self._image = remap.remap_image(img) + else: + self._image = img return self._image diff --git a/grf/cmclient/sprites/toolbar.png b/grf/cmclient/sprites/toolbar.png index 1a6f880080..08fb9cee49 100644 Binary files a/grf/cmclient/sprites/toolbar.png and b/grf/cmclient/sprites/toolbar.png differ diff --git a/src/citymania/cm_client_list_gui.cpp b/src/citymania/cm_client_list_gui.cpp index d73d163087..f953ef7f28 100644 --- a/src/citymania/cm_client_list_gui.cpp +++ b/src/citymania/cm_client_list_gui.cpp @@ -4,6 +4,7 @@ #include "../blitter/factory.hpp" #include "../company_base.h" +#include "../company_func.h" #include "../company_gui.h" #include "../console_func.h" #include "../debug.h" @@ -61,7 +62,7 @@ public: } void UpdateSize() { this->padding = ScaleGUITrad(3); - auto icon_size = GetSpriteSize(SPR_COMPANY_ICON); + auto icon_size = GetSpriteSize(CM_SPR_COMPANY_ICON); auto common_height = std::max(icon_size.height, FONT_HEIGHT_NORMAL); this->line_height = common_height + this->padding; this->text_offset_y = (common_height - FONT_HEIGHT_NORMAL) / 2; @@ -158,25 +159,37 @@ public: int y = this->box.y + this->padding; int x = this->box.x + this->padding; - auto text_left = x + GetSpriteSize(SPR_COMPANY_ICON).width + this->padding; + auto text_left = x + GetSpriteSize(CM_SPR_COMPANY_ICON).width + this->padding; auto text_right = this->box.x + this->box.width - 1 - this->padding; - std::vector> clients; + const std::pair STYLES[] = { + {TC_SILVER, PAL_NONE}, + {TC_ORANGE, CM_SPR_HOST2}, + {TC_WHITE , CM_SPR_PLAYER_W2}, + {TC_SILVER, CM_SPR_COMPANY_ICON}, + {TC_ORANGE, CM_SPR_COMPANY_ICON_HOST}, + {TC_WHITE , CM_SPR_COMPANY_ICON_PLAYER}, + }; + std::vector> clients; for (const NetworkClientInfo *ci : NetworkClientInfo::Iterate()) { - auto colour = TC_SILVER; - if (ci->client_id == _network_own_client_id) colour = TC_WHITE; - if (ci->client_id == CLIENT_ID_SERVER) colour = TC_ORANGE; - clients.emplace_back(ci->client_playas, ci->client_name, colour); + uint8 style = 0; + if (ci->client_id == _network_own_client_id) style = 2; + if (ci->client_id == CLIENT_ID_SERVER) style = 1; + if (Company::IsValidID(ci->client_playas)) style += 3; + clients.emplace_back(ci->client_playas, ci->client_name, style); + } std::sort(clients.begin(), clients.end()); - for (const auto &[playas, name, colour] : clients) { + for (const auto &[playas, name, style] : clients) { + auto [colour, icon] = STYLES[style]; SetDParamStr(0, name); // auto colour = TC_SILVER; // if (ci->client_id == _network_own_client_id) colour = TC_WHITE; // if (ci->client_id == CLIENT_ID_SERVER) colour = TC_ORANGE; DrawString(text_left, text_right, y + this->text_offset_y, STR_JUST_RAW_STRING, colour); - if (Company::IsValidID(playas)) - DrawCompanyIcon(playas, x, y + this->icon_offset_y); + + if (icon != PAL_NONE) DrawSprite(icon, COMPANY_SPRITE_COLOUR(playas), x, y + this->icon_offset_y); + // DrawCompanyIcon(playas, x, y + this->icon_offset_y); y += this->line_height; } diff --git a/src/table/sprites.h b/src/table/sprites.h index 600f95509d..c23776df8e 100644 --- a/src/table/sprites.h +++ b/src/table/sprites.h @@ -323,7 +323,10 @@ static const SpriteID CM_SPR_HOST1 = CM_SPR_PLAYER1 + 8; static const SpriteID CM_SPR_HOST2 = CM_SPR_PLAYER1 + 9; static const SpriteID CM_SPR_HOST3 = CM_SPR_PLAYER1 + 10; static const SpriteID CM_SPR_HOST4 = CM_SPR_PLAYER1 + 11; -static const SpriteID CM_SPR_INNER_HIGHLIGHT_BASE = CM_SPR_CITYMANIA_BASE + 17; +static const SpriteID CM_SPR_COMPANY_ICON = CM_SPR_PLAYER1 + 12; +static const SpriteID CM_SPR_COMPANY_ICON_HOST = CM_SPR_PLAYER1 + 13; +static const SpriteID CM_SPR_COMPANY_ICON_PLAYER = CM_SPR_PLAYER1 + 14; +static const SpriteID CM_SPR_INNER_HIGHLIGHT_BASE = CM_SPR_CITYMANIA_BASE + 20; static const SpriteID CM_SPR_IMG_COMPANY_CARGO = CM_SPR_INNER_HIGHLIGHT_BASE + 19; static const SpriteID CM_SPR_IMG_COMPANY_GOAL = CM_SPR_INNER_HIGHLIGHT_BASE + 20; static const SpriteID CM_SPR_IMG_HOUSE_NEW = CM_SPR_INNER_HIGHLIGHT_BASE + 21;