diff --git a/src/sys/ags.cpp b/src/sys/ags.cpp index 262b057..8ae3c11 100644 --- a/src/sys/ags.cpp +++ b/src/sys/ags.cpp @@ -225,7 +225,6 @@ AGS::AGS(const Config& config, const GameId& game_id) : game_id(game_id) // CG表示 cg_dest = std::nullopt; - get_palette = extract_palette = extract_cg = true; palette_bank = -1; // マウスカーソル diff --git a/src/sys/ags.h b/src/sys/ags.h index 640ffe0..6109b28 100644 --- a/src/sys/ags.h +++ b/src/sys/ags.h @@ -50,6 +50,12 @@ struct CG { SDL_Palette* palette() const { return surface_->format->palette; } }; +enum CgFlags { + CG_EXTRACT_CG = 1, + CG_EXTRACT_PALETTE = 2, + CG_GET_PALETTE = 4, +}; + class AGS { protected: @@ -77,11 +83,11 @@ private: SDL_Cursor* hCursor[10]; // AGS - CG load_gm3(const std::vector& data, int transparent); // Intruder -桜屋敷の探索- - CG load_vsp2l(const std::vector& data, int transparent); // Little Vampire - CG load_gl3(const std::vector& data, bool set_palette, int transparent); - CG load_pms(int page, const std::vector& data, bool set_palette, int transparent); - CG load_vsp(const std::vector& data, bool set_palette, int transparent); + CG load_gm3(const std::vector& data, int transparent, uint8_t flags); // Intruder -桜屋敷の探索- + CG load_vsp2l(const std::vector& data, int transparent, uint8_t flags); // Little Vampire + CG load_gl3(const std::vector& data, bool set_palette, int transparent, uint8_t flags); + CG load_pms(int page, const std::vector& data, bool set_palette, int transparent, uint8_t flags); + CG load_vsp(const std::vector& data, bool set_palette, int transparent, uint8_t flags); 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[]); @@ -103,9 +109,9 @@ public: void update_screen(); - void load_cg(int page, int transparent); + void load_cg(int page, int transparent, uint8_t flags); // Decodes a CG without drawing it, but still updates the palette. - CG load_cg_surface(int page, int transparent = -1); + CG load_cg_surface(int page, int transparent, uint8_t flags); // Returns an ACG page bytes, without decoding it. std::vector load_cg_data(int page) { return acg.load(page); } void blit_cg(int dest, CG& cg, const SDL_Rect* src, int dx, int dy); @@ -161,7 +167,7 @@ public: menu_w[index - 1].frame = frame; } - void load_cursor(int page); + void load_cursor(int page, uint8_t flags); void select_cursor(); void translate_mouse_coords(int* x, int* y); @@ -213,9 +219,6 @@ public: // CG表示 std::optional cg_dest; - bool get_palette; - bool extract_palette; - bool extract_cg; std::unordered_set censor_list; std::unordered_set ignore_palette; int palette_bank; diff --git a/src/sys/ags_cursor.cpp b/src/sys/ags_cursor.cpp index d3728e5..37d53e2 100644 --- a/src/sys/ags_cursor.cpp +++ b/src/sys/ags_cursor.cpp @@ -10,7 +10,7 @@ extern SDL_Window* g_window; extern SDL_Renderer* g_renderer; -void AGS::load_cursor(int page) +void AGS::load_cursor(int page, uint8_t flags) { // カーソルCGをロードする auto j_backup = cg_dest; @@ -19,7 +19,7 @@ void AGS::load_cursor(int page) cg_dest = {0, 0}; dest_screen = 1; - load_cg(page, -1); + load_cg(page, -1, flags); cg_dest = j_backup; dest_screen = dest; diff --git a/src/sys/ags_draw.cpp b/src/sys/ags_draw.cpp index 8626459..b8e19dd 100644 --- a/src/sys/ags_draw.cpp +++ b/src/sys/ags_draw.cpp @@ -31,7 +31,7 @@ void mosaic(SDL_Surface* sf) { } // namespace -CG AGS::load_cg_surface(int page, int transparent) +CG AGS::load_cg_surface(int page, int transparent, uint8_t flags) { if (bmp_prefix) { WARNING("not implemented"); @@ -41,42 +41,42 @@ CG AGS::load_cg_surface(int page, int transparent) if (data.empty()) return CG(); - bool set_palette = extract_palette && !ignore_palette.count(page); + bool set_palette = (flags & CG_EXTRACT_PALETTE) && !ignore_palette.count(page); CG cg; switch (game_id.sys_ver) { case 1: switch (game_id.game) { case GameId::BUNKASAI: case GameId::GAKUEN_SENKI: - cg = load_vsp(data, set_palette, transparent); + cg = load_vsp(data, set_palette, transparent, flags); break; case GameId::INTRUDER: - // cg = load_gm3(data, transparent); - cg = load_vsp(data, set_palette, transparent); // 暫定 + // cg = load_gm3(data, transparent, flags); + cg = load_vsp(data, set_palette, transparent, flags); // 暫定 break; case GameId::LITTLE_VAMPIRE: - cg = load_vsp2l(data, transparent); + cg = load_vsp2l(data, transparent, flags); break; default: - cg = load_gl3(data, set_palette, transparent); + cg = load_gl3(data, set_palette, transparent, flags); break; } break; case 2: if (game_id.is(GameId::AYUMI_PROTO)) { // あゆみちゃん物語 PROTO - cg = load_gl3(data, set_palette, transparent); + cg = load_gl3(data, set_palette, transparent, flags); } else if (game_id.is(GameId::AYUMI_FD) || game_id.is(GameId::AYUMI_HINT)) { // あゆみちゃん物語 - cg = load_vsp(data, set_palette, transparent); + cg = load_vsp(data, set_palette, transparent, flags); } else if (game_id.is_sdps()) { // Super D.P.S - cg = load_pms(page, data, set_palette, transparent); + cg = load_pms(page, data, set_palette, transparent, flags); } else { if(data[0x8] == 0) { - cg = load_vsp(data, set_palette, transparent); + cg = load_vsp(data, set_palette, transparent, flags); } else { - cg = load_pms(page, data, set_palette, transparent); + cg = load_pms(page, data, set_palette, transparent, flags); } } break; @@ -84,10 +84,10 @@ CG AGS::load_cg_surface(int page, int transparent) if(data[0x8] == 0) { if (game_id.is(GameId::FUNNYBEE_FD) || game_id.is(GameId::FUNNYBEE_CD)) set_palette = !ignore_palette.count(page); - cg = load_vsp(data, set_palette, transparent); + cg = load_vsp(data, set_palette, transparent, flags); } else { set_palette = set_palette || game_id.is(GameId::FUNNYBEE_CD); - cg = load_pms(page, data, set_palette, transparent); + cg = load_pms(page, data, set_palette, transparent, flags); } break; } @@ -119,9 +119,9 @@ void AGS::blit_cg(int dest, CG& cg, const SDL_Rect* src, int dx, int dy) } } -void AGS::load_cg(int page, int transparent) +void AGS::load_cg(int page, int transparent, uint8_t flags) { - CG cg = load_cg_surface(page, transparent); + CG cg = load_cg_surface(page, transparent, flags); if (!cg) return; @@ -132,7 +132,7 @@ void AGS::load_cg(int page, int transparent) cg_dest = std::nullopt; } - if (extract_cg) + if (flags & CG_EXTRACT_CG) blit_cg(dest_screen, cg, NULL, cg.x, cg.y); } diff --git a/src/sys/ags_gl3.cpp b/src/sys/ags_gl3.cpp index 4991420..cda29b1 100644 --- a/src/sys/ags_gl3.cpp +++ b/src/sys/ags_gl3.cpp @@ -7,7 +7,7 @@ #include "ags.h" #include -CG AGS::load_gl3(const std::vector& data, bool set_palette, int transparent) +CG AGS::load_gl3(const std::vector& data, bool set_palette, int transparent, uint8_t flags) { // ヘッダ取得 uint16 tmp = (data[0x30] | (data[0x31] << 8)) - 0x8000; @@ -23,7 +23,7 @@ CG AGS::load_gl3(const std::vector& data, bool set_palette, int transpa } // パレット取得 - if(get_palette) { + if (flags & CG_GET_PALETTE) { SDL_Color colors[16]; for(int i = 0; i < 16; i++) { uint8_t b = (data[i * 3 + 0] & 0xf) * 0x11; diff --git a/src/sys/ags_gm3.cpp b/src/sys/ags_gm3.cpp index c511757..5c088ca 100644 --- a/src/sys/ags_gm3.cpp +++ b/src/sys/ags_gm3.cpp @@ -7,7 +7,7 @@ #include "ags.h" #include -CG AGS::load_gm3(const std::vector& data, int transparent) +CG AGS::load_gm3(const std::vector& data, int transparent, uint8_t flags) { // ヘッダ取得 uint16 tmp = (data[0x30] | (data[0x31] << 8)) - 0x8000; diff --git a/src/sys/ags_pms.cpp b/src/sys/ags_pms.cpp index 6570186..89e4149 100644 --- a/src/sys/ags_pms.cpp +++ b/src/sys/ags_pms.cpp @@ -8,7 +8,7 @@ #include "game_id.h" #include -CG AGS::load_pms(int page, const std::vector& data, bool set_palette, int transparent) +CG AGS::load_pms(int page, const std::vector& data, bool set_palette, int transparent, uint8_t flags) { // ヘッダ取得 int sx = data[0x0] | (data[0x1] << 8); @@ -19,7 +19,7 @@ CG AGS::load_pms(int page, const std::vector& data, bool set_palette, i int height = ey - sy + 1; uint16_t mask = data[0xa] | (data[0xb] << 8); - if(get_palette) { + if (flags & CG_GET_PALETTE) { SDL_Color colors[256]; int p = 0x20; for(int i = 0; i < 16; i++) { diff --git a/src/sys/ags_vsp.cpp b/src/sys/ags_vsp.cpp index 635a558..5c035c8 100644 --- a/src/sys/ags_vsp.cpp +++ b/src/sys/ags_vsp.cpp @@ -26,7 +26,7 @@ void trim(CG& cg, int w, int h) } // namespace -CG AGS::load_vsp(const std::vector& data, bool set_palette, int transparent) +CG AGS::load_vsp(const std::vector& data, bool set_palette, int transparent, uint8_t flags) { // ヘッダ取得 int sx = data[0] | (data[1] << 8); @@ -47,7 +47,7 @@ CG AGS::load_vsp(const std::vector& data, bool set_palette, int transpa } // パレット取得 - if(get_palette && transparent != 101) { + if ((flags & CG_GET_PALETTE) && transparent != 101) { int p = 0x0a; SDL_Color colors[16]; for(int i = 0; i < 16; i++) { diff --git a/src/sys/ags_vsp2l.cpp b/src/sys/ags_vsp2l.cpp index 76b9c3a..ebadf23 100644 --- a/src/sys/ags_vsp2l.cpp +++ b/src/sys/ags_vsp2l.cpp @@ -7,7 +7,7 @@ #include "ags.h" #include -CG AGS::load_vsp2l(const std::vector& data, int transparent) +CG AGS::load_vsp2l(const std::vector& data, int transparent, uint8_t flags) { // ヘッダ取得 int sx = data[0] | (data[1] << 8); diff --git a/src/sys/nact.cpp b/src/sys/nact.cpp index 9797a13..270686e 100644 --- a/src/sys/nact.cpp +++ b/src/sys/nact.cpp @@ -33,7 +33,8 @@ NACT::NACT(const Config& config, const GameId& game_id) game_id(game_id), encoding(Encoding::create(game_id.encoding)), strings(config.get_strings(encoding.get(), game_id.language == ENGLISH)), - seed(SDL_GetTicks()) + seed(SDL_GetTicks()), + cg_flags(CG_GET_PALETTE | CG_EXTRACT_PALETTE | CG_EXTRACT_CG) { platform_initialize(); diff --git a/src/sys/nact.h b/src/sys/nact.h index 59ba0bf..fcb6890 100644 --- a/src/sys/nact.h +++ b/src/sys/nact.h @@ -133,6 +133,9 @@ protected: Box box[20]; void draw_box(int index); + uint8_t cg_flags; + void load_cg(int page, int transparent); + struct MenuItem { uint16_t addr; uint8_t verb; diff --git a/src/sys/nact_gakuenking.cpp b/src/sys/nact_gakuenking.cpp index c160a1a..0a96a3e 100644 --- a/src/sys/nact_gakuenking.cpp +++ b/src/sys/nact_gakuenking.cpp @@ -241,7 +241,7 @@ private: void load_cg_to_work_screen(int page) { int saved = ags->dest_screen; ags->dest_screen = WORK_SCREEN; - ags->load_cg(page, -1); + load_cg(page, -1); ags->dest_screen = saved; } @@ -623,7 +623,7 @@ private: CG load_map_sheet(int page) { if (page == 0) return CG(); - CG cg = ags->load_cg_surface(page, TRANSPARENT_COLOR); + CG cg = ags->load_cg_surface(page, TRANSPARENT_COLOR, cg_flags); if (!cg) ERROR("map resource error: CG page %d not available", page); return cg; @@ -1202,7 +1202,7 @@ private: load_cg_to_work_screen(230); // Save the part of the display CG 208 overwrites. ags->copy_screen(0, WORK_SCREEN, 16, 192, 367, 294, 0, 48); - ags->load_cg(208, -1); + load_cg(208, -1); VAR_TROOP_COUNT_FULL = VAR_TROOP_COUNT; draw_troop_counts(); diff --git a/src/sys/nact_sys1.cpp b/src/sys/nact_sys1.cpp index 1910745..874444f 100644 --- a/src/sys/nact_sys1.cpp +++ b/src/sys/nact_sys1.cpp @@ -339,7 +339,7 @@ void NACT_Sys1::cmd_g() TRACE("G %d:", page); - ags->load_cg(page, -1); + load_cg(page, -1); } void NACT_Sys1::cmd_l() @@ -392,7 +392,7 @@ void NACT_Sys1::cmd_u() TRACE("U %d,%d:", page, transparent); - ags->load_cg(page, transparent); + load_cg(page, transparent); } void NACT_Sys1::cmd_y() @@ -543,9 +543,9 @@ public: void opening() override { mako->play_music(4); - ags->load_cg(3, -1); + load_cg(3, -1); WAIT(2000); - ags->load_cg(38, -1); + load_cg(38, -1); cmd_a(); draw_box(0); } @@ -559,12 +559,12 @@ public: void opening() override { mako->set_cd_track(1, 1); - ags->load_cg(302, -1); + load_cg(302, -1); WAIT(3000); - ags->load_cg(303, -1); + load_cg(303, -1); WAIT(3000); mako->play_music(1); - ags->load_cg(304, -1); + load_cg(304, -1); WAIT(4000); } @@ -575,7 +575,7 @@ public: page = (page == 3) ? 94 : page; if (enable_graphics) - ags->load_cg(page, -1); + load_cg(page, -1); } void cmd_y() override { @@ -629,7 +629,7 @@ public: if (param != 30 && (param < 34 || param > 46)) { if (enable_graphics) { - ags->load_cg(param + 250, -1); + load_cg(param + 250, -1); } } @@ -642,13 +642,13 @@ public: // Originally this would have loaded Image 296, the party status bar, to screen 1 for future reference. However, due to trouble with // the palette, I decided to load it before using each subcommand, instead. /*ags->dest_screen = 1; - ags->load_cg(296, -1); + load_cg(296, -1); ags->dest_screen = 0;*/ } else if (param == 30) { // Load party status bar to screen 1. ags->dest_screen = 1; - ags->load_cg(296, -1); + load_cg(296, -1); ags->dest_screen = 0; // Draw Wataru's icon. @@ -661,7 +661,7 @@ public: // Load party status bar to screen 1. ags->dest_screen = 1; - ags->load_cg(296, -1); + load_cg(296, -1); ags->dest_screen = 0; // Draw a blank party icon to init or clear the party box. @@ -673,7 +673,7 @@ public: // Load party status bar to screen 1. ags->dest_screen = 1; - ags->load_cg(296, -1); + load_cg(296, -1); ags->dest_screen = 0; // Draw a party member's icon to the party bar. @@ -694,9 +694,9 @@ public: : NACT_Sys1(config, game_id) {} void opening() override { - ags->load_cg(77, -1); + load_cg(77, -1); WAIT(1667); - ags->load_cg(74, -1); + load_cg(74, -1); } void cmd_g() override { @@ -704,7 +704,7 @@ public: TRACE("G %d:", page); page = (page == 97) ? 96 : (page == 98) ? 97 : page; - ags->load_cg(page, -1); + load_cg(page, -1); if (page == 94) WAIT(400); if (page == 81 || page == 82) @@ -716,7 +716,7 @@ public: int transparent = sco.getd(); TRACE("U %d,%d:", page, transparent); - ags->load_cg(page, 11); + load_cg(page, 11); if (page == 5) WAIT(400); } @@ -781,7 +781,7 @@ public: // 矢印を消去する if (map_page) { - ags->load_cg(map_page, -1); + load_cg(map_page, -1); if (paint_x) { ags->paint(paint_x, paint_y * 2, 2 + 16); } @@ -806,8 +806,8 @@ public: ags->box_fill(0, 0, 0, 640, 400, 0); } else { // Restore the screen - ags->load_cg(74, 8); - ags->load_cg(81, -1); + load_cg(74, 8); + load_cg(81, -1); map_page = 81; } } else if (cmd == 3) { @@ -838,9 +838,9 @@ public: void opening() override { mako->play_music(2); - ags->load_cg(1, -1); + load_cg(1, -1); WAIT(3000); - ags->load_cg(81, -1); + load_cg(81, -1); } void cmd_y() override { @@ -880,12 +880,12 @@ public: switch (cmd) { case 130: WAIT(2000); - ags->load_cg(180, -1); + load_cg(180, -1); WAIT(2000); draw_box(0); ags->dest_screen = 1; - ags->load_cg(173, -1); + load_cg(173, -1); ags->dest_screen = 0; ags->gcopy(0x1ecd, 0x3a2a, 8, 60, 3); WAIT(667); @@ -1017,7 +1017,7 @@ public: // slowest). Not available in the Hint Disk. break; case 20: - ags->load_cg(param, -1); + load_cg(param, -1); break; default: exec_y(cmd, param); diff --git a/src/sys/nact_sys2.cpp b/src/sys/nact_sys2.cpp index 3814a15..8bf917d 100644 --- a/src/sys/nact_sys2.cpp +++ b/src/sys/nact_sys2.cpp @@ -445,7 +445,7 @@ void NACT_Sys2::cmd_g() page--; } } - ags->load_cg(page, -1); + load_cg(page, -1); if (game_id.is(GameId::DALK_HINT)) { if(page == 3) { @@ -632,7 +632,7 @@ void NACT_Sys2::cmd_u() TRACE("U %d,%d:", page, transparent); - ags->load_cg(page, transparent); + load_cg(page, transparent); } void NACT_Sys2::cmd_v() diff --git a/src/sys/nact_sys3.cpp b/src/sys/nact_sys3.cpp index e7408cc..b537732 100644 --- a/src/sys/nact_sys3.cpp +++ b/src/sys/nact_sys3.cpp @@ -250,7 +250,7 @@ void NACT_Sys3::cmd_g() TRACE("G %d:", page); - ags->load_cg(page, -1); + load_cg(page, -1); } void NACT_Sys3::cmd_h() @@ -622,7 +622,7 @@ void NACT_Sys3::cmd_u() if (game_id.is_rance4x()) { transparent = (transparent == 28) ? 12 : transparent; } - ags->load_cg(page, transparent); + load_cg(page, transparent); } void NACT_Sys3::cmd_v() @@ -806,12 +806,14 @@ void NACT_Sys3::exec_y(int cmd, int param) ags->fade_out(param * 16 * 1000 / 60, cmd == 43); break; case 45: - ags->extract_palette = param ? true : false; + if (param) { + cg_flags |= CG_EXTRACT_PALETTE; + } else { + cg_flags &= ~CG_EXTRACT_PALETTE; + } break; case 46: - ags->get_palette = (param & 4) ? true : false; - ags->extract_palette = (param & 2) ? true : false; - ags->extract_cg = (param & 1) ? true : false; + cg_flags = param & 7; break; case 60: ags->scroll = param - 400; @@ -840,7 +842,7 @@ void NACT_Sys3::exec_y(int cmd, int param) mouse_sence = param; break; case 72: - ags->load_cursor(param); + ags->load_cursor(param, cg_flags); break; case 73: ags->cursor_index = param; diff --git a/src/sys/nact_window.cpp b/src/sys/nact_window.cpp index 3898cdd..a3b743e 100644 --- a/src/sys/nact_window.cpp +++ b/src/sys/nact_window.cpp @@ -94,3 +94,8 @@ void NACT::draw_box(int index) ags->box_line(ags->dest_screen, b.sx, b.sy, b.ex, b.ey, b.color); } } + +void NACT::load_cg(int page, int transparent) +{ + ags->load_cg(page, transparent, cg_flags); +}