diff --git a/src/sys/ags.cpp b/src/sys/ags.cpp index 483a2e3..f921590 100644 --- a/src/sys/ags.cpp +++ b/src/sys/ags.cpp @@ -227,9 +227,6 @@ AGS::AGS(const Config& config, const GameId& game_id) : game_id(game_id), dirty( // CG表示 set_cg_dest = false; cg_dest_x = cg_dest_y = 0; - for(int i = 0; i < MAX_CG; i++) { - extract_palette_cg[i] = true; - } get_palette = extract_palette = extract_cg = true; palette_bank = -1; diff --git a/src/sys/ags.h b/src/sys/ags.h index 5fa1905..b060c40 100644 --- a/src/sys/ags.h +++ b/src/sys/ags.h @@ -8,6 +8,7 @@ #define _AGS_H_ #include +#include #include #include #include @@ -16,8 +17,6 @@ #include "dri.h" #include -#define MAX_CG 10000 - inline uint32* surface_line(SDL_Surface* surface, int y) { return (uint32*)((uint8*)surface->pixels + surface->pitch * y); @@ -54,12 +53,12 @@ private: SDL_Cursor* hCursor[10]; // AGS - void load_gm3(uint8* data, int page, int transparent); // Intruder -桜屋敷の探索- - void load_vsp2l(uint8* data, int page, int transparent); // Little Vampire - void load_gl3(uint8* data, int page, int transparent); - void load_pms(uint8* data, int page, int transparent); + void load_gm3(uint8* data, int transparent); // Intruder -桜屋敷の探索- + void load_vsp2l(uint8* data, int transparent); // Little Vampire + void load_gl3(uint8* data, bool set_palette, int transparent); + void load_pms(uint8* data, bool set_palette, int transparent); void load_bmp(const char* file_name); // あゆみちゃん物語 フルカラー実写版 - void load_vsp(uint8* data, int page, int transparent); + void load_vsp(uint8* data, bool set_palette, int transparent); void draw_char(int dest, int dest_x, int dest_y, uint16 code, TTF_Font* font, uint8 color); void draw_char_antialias(int dest, int dest_x, int dest_y, uint16 code, TTF_Font* font, uint8 color, uint8 cache[]); @@ -192,7 +191,7 @@ public: bool get_palette; bool extract_palette; bool extract_cg; - bool extract_palette_cg[MAX_CG]; + std::unordered_set ignore_palette; int palette_bank; // マウスカーソル diff --git a/src/sys/ags_draw.cpp b/src/sys/ags_draw.cpp index 7b0712b..cf997e3 100644 --- a/src/sys/ags_draw.cpp +++ b/src/sys/ags_draw.cpp @@ -25,48 +25,53 @@ void AGS::load_cg(int page, int transparent) std::vector data = acg.load(page); if (data.empty()) return; + + bool set_palette = extract_palette && !ignore_palette.count(page); + switch (game_id.sys_ver) { case 1: switch (game_id.game) { case GameId::BUNKASAI: case GameId::GAKUEN: - load_vsp(data.data(), page, transparent); + load_vsp(data.data(), set_palette, transparent); break; case GameId::INTRUDER: - // load_gm3(data.data(), page, transparent); - load_vsp(data.data(), page, transparent); // 暫定 + // load_gm3(data.data(), transparent); + load_vsp(data.data(), set_palette, transparent); // 暫定 break; case GameId::LITTLE_VAMPIRE: - load_vsp2l(data.data(), page, transparent); + load_vsp2l(data.data(), transparent); break; default: - load_gl3(data.data(), page, transparent); + load_gl3(data.data(), set_palette, transparent); break; } break; case 2: if (game_id.is(GameId::AYUMI_PROTO)) { // あゆみちゃん物語 PROTO - load_gl3(data.data(), page, transparent); + load_gl3(data.data(), set_palette, transparent); } else if (game_id.is(GameId::AYUMI_FD) || game_id.is(GameId::AYUMI_HINT)) { // あゆみちゃん物語 - load_vsp(data.data(), page, transparent); + load_vsp(data.data(), set_palette, transparent); } else if (game_id.is_sdps()) { // Super D.P.S - load_pms(data.data(), page, transparent); + load_pms(data.data(), set_palette, transparent); } else { if(data[0x8] == 0) { - load_vsp(data.data(), page, transparent); + load_vsp(data.data(), set_palette, transparent); } else { - load_pms(data.data(), page, transparent); + load_pms(data.data(), set_palette, transparent); } } break; case 3: if(data[0x8] == 0) { - load_vsp(data.data(), page, transparent); + if (game_id.is(GameId::FUNNYBEE_FD) || game_id.is(GameId::FUNNYBEE_CD)) + set_palette = !ignore_palette.count(page); + load_vsp(data.data(), set_palette, transparent); } else { - load_pms(data.data(), page, transparent); + load_pms(data.data(), set_palette || game_id.is(GameId::FUNNYBEE_CD), transparent); } break; } diff --git a/src/sys/ags_gl3.cpp b/src/sys/ags_gl3.cpp index 15bd092..fb497db 100644 --- a/src/sys/ags_gl3.cpp +++ b/src/sys/ags_gl3.cpp @@ -7,7 +7,7 @@ #include "ags.h" #include -void AGS::load_gl3(uint8* data, int page, int transparent) +void AGS::load_gl3(uint8* data, bool set_palette, int transparent) { // ヘッダ取得 uint16 tmp = (data[0x30] | (data[0x31] << 8)) - 0x8000; @@ -42,7 +42,7 @@ void AGS::load_gl3(uint8* data, int page, int transparent) } // パレット展開 - if(extract_palette && extract_palette_cg[page]) { + if (set_palette) { SDL_SetPaletteColors(screen_palette, program_palette->colors + base, base, 16); } diff --git a/src/sys/ags_gm3.cpp b/src/sys/ags_gm3.cpp index c0fe065..a2ce54a 100644 --- a/src/sys/ags_gm3.cpp +++ b/src/sys/ags_gm3.cpp @@ -7,7 +7,7 @@ #include "ags.h" #include -void AGS::load_gm3(uint8* data, int page, int transparent) +void AGS::load_gm3(uint8* data, int transparent) { // ヘッダ取得 uint16 tmp = (data[0x30] | (data[0x31] << 8)) - 0x8000; diff --git a/src/sys/ags_pms.cpp b/src/sys/ags_pms.cpp index 88e336f..bb396ce 100644 --- a/src/sys/ags_pms.cpp +++ b/src/sys/ags_pms.cpp @@ -8,7 +8,7 @@ #include "game_id.h" #include -void AGS::load_pms(uint8* data, int page, int transparent) +void AGS::load_pms(uint8* data, bool set_palette, int transparent) { // ヘッダ取得 int sx = data[0x0] | (data[0x1] << 8); @@ -63,34 +63,26 @@ void AGS::load_pms(uint8* data, int page, int transparent) } // パレット展開 - if (game_id.sys_ver == 3) { - if ((extract_palette && extract_palette_cg[page]) || game_id.is(GameId::FUNNYBEE_CD)) { - if (game_id.is_rance4x() || game_id.is(GameId::HASHIRIONNA2)) { - // 上下16色は展開しない - for(int i = 1; i < 15; i++) { - if (!(mask & 1 << i)) { - SDL_SetPaletteColors(screen_palette, program_palette->colors + i * 16, i * 16, 16); - } - } - } else if (game_id.is(GameId::MUGEN) && transparent != -1) { - // Uコマンドでは上下32色は展開しない - for(int i = 2; i < 14; i++) { - if (!(mask & 1 << i)) { - SDL_SetPaletteColors(screen_palette, program_palette->colors + i * 16, i * 16, 16); - } - } - } else { - for(int i = 0; i < 16; i++) { - if (!(mask & 1 << i)) { - SDL_SetPaletteColors(screen_palette, program_palette->colors + i * 16, i * 16, 16); - } + if (set_palette) { + if (game_id.is_rance4x() || game_id.is(GameId::HASHIRIONNA2)) { + // 上下16色は展開しない + for(int i = 1; i < 15; i++) { + if (!(mask & 1 << i)) { + SDL_SetPaletteColors(screen_palette, program_palette->colors + i * 16, i * 16, 16); } } - } - } else if(extract_palette && extract_palette_cg[page]) { - for(int i = 0; i < 16; i++) { - if (!(mask & 1 << i)) { - SDL_SetPaletteColors(screen_palette, program_palette->colors + i * 16, i * 16, 16); + } else if (game_id.is(GameId::MUGEN) && transparent != -1) { + // Uコマンドでは上下32色は展開しない + for(int i = 2; i < 14; i++) { + if (!(mask & 1 << i)) { + SDL_SetPaletteColors(screen_palette, program_palette->colors + i * 16, i * 16, 16); + } + } + } else { + for(int i = 0; i < 16; i++) { + if (!(mask & 1 << i)) { + SDL_SetPaletteColors(screen_palette, program_palette->colors + i * 16, i * 16, 16); + } } } } diff --git a/src/sys/ags_vsp.cpp b/src/sys/ags_vsp.cpp index 818876c..b715453 100644 --- a/src/sys/ags_vsp.cpp +++ b/src/sys/ags_vsp.cpp @@ -8,7 +8,7 @@ #include "game_id.h" #include -void AGS::load_vsp(uint8* data, int page, int transparent) +void AGS::load_vsp(uint8* data, bool set_palette, int transparent) { // ヘッダ取得 int sx = data[0] | (data[1] << 8); @@ -51,14 +51,8 @@ void AGS::load_vsp(uint8* data, int page, int transparent) } // パレット展開 - if (game_id.is(GameId::FUNNYBEE_FD) || game_id.is(GameId::FUNNYBEE_CD)) { - if(extract_palette_cg[page]) { - SDL_SetPaletteColors(screen_palette, program_palette->colors + base, base, 16); - } - } else { - if(extract_palette && extract_palette_cg[page]) { - SDL_SetPaletteColors(screen_palette, program_palette->colors + base, base, 16); - } + if (set_palette) { + SDL_SetPaletteColors(screen_palette, program_palette->colors + base, base, 16); } // VSP展開 diff --git a/src/sys/ags_vsp2l.cpp b/src/sys/ags_vsp2l.cpp index de0a5d1..3d60ba3 100644 --- a/src/sys/ags_vsp2l.cpp +++ b/src/sys/ags_vsp2l.cpp @@ -7,7 +7,7 @@ #include "ags.h" #include -void AGS::load_vsp2l(uint8* data, int page, int transparent) +void AGS::load_vsp2l(uint8* data, int transparent) { // ヘッダ取得 int sx = data[0] | (data[1] << 8); diff --git a/src/sys/nact_sys3.cpp b/src/sys/nact_sys3.cpp index b96f03b..9425965 100644 --- a/src/sys/nact_sys3.cpp +++ b/src/sys/nact_sys3.cpp @@ -779,7 +779,7 @@ void NACT_Sys3::cmd_y() tvar_index = param; break; case 10: - ags->extract_palette_cg[param] = false; + ags->ignore_palette.insert(param); break; case 13: if(param == 0 || param == 1) {