Move CG display flags to NACT

This commit is contained in:
kichikuou
2026-09-02 11:41:24 +09:00
parent 8a12fc50e7
commit 4a58251afd
16 changed files with 90 additions and 77 deletions
-1
View File
@@ -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;
// マウスカーソル
+14 -11
View File
@@ -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<uint8_t>& data, int transparent); // Intruder -桜屋敷の探索-
CG load_vsp2l(const std::vector<uint8_t>& data, int transparent); // Little Vampire
CG load_gl3(const std::vector<uint8_t>& data, bool set_palette, int transparent);
CG load_pms(int page, const std::vector<uint8_t>& data, bool set_palette, int transparent);
CG load_vsp(const std::vector<uint8_t>& data, bool set_palette, int transparent);
CG load_gm3(const std::vector<uint8_t>& data, int transparent, uint8_t flags); // Intruder -桜屋敷の探索-
CG load_vsp2l(const std::vector<uint8_t>& data, int transparent, uint8_t flags); // Little Vampire
CG load_gl3(const std::vector<uint8_t>& data, bool set_palette, int transparent, uint8_t flags);
CG load_pms(int page, const std::vector<uint8_t>& data, bool set_palette, int transparent, uint8_t flags);
CG load_vsp(const std::vector<uint8_t>& 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<uint8_t> 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<SDL_Point> cg_dest;
bool get_palette;
bool extract_palette;
bool extract_cg;
std::unordered_set<int> censor_list;
std::unordered_set<int> ignore_palette;
int palette_bank;
+2 -2
View File
@@ -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;
+17 -17
View File
@@ -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);
}
+2 -2
View File
@@ -7,7 +7,7 @@
#include "ags.h"
#include <string.h>
CG AGS::load_gl3(const std::vector<uint8_t>& data, bool set_palette, int transparent)
CG AGS::load_gl3(const std::vector<uint8_t>& 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<uint8_t>& 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;
+1 -1
View File
@@ -7,7 +7,7 @@
#include "ags.h"
#include <string.h>
CG AGS::load_gm3(const std::vector<uint8_t>& data, int transparent)
CG AGS::load_gm3(const std::vector<uint8_t>& data, int transparent, uint8_t flags)
{
// ヘッダ取得
uint16 tmp = (data[0x30] | (data[0x31] << 8)) - 0x8000;
+2 -2
View File
@@ -8,7 +8,7 @@
#include "game_id.h"
#include <string.h>
CG AGS::load_pms(int page, const std::vector<uint8_t>& data, bool set_palette, int transparent)
CG AGS::load_pms(int page, const std::vector<uint8_t>& 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<uint8_t>& 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++) {
+2 -2
View File
@@ -26,7 +26,7 @@ void trim(CG& cg, int w, int h)
} // namespace
CG AGS::load_vsp(const std::vector<uint8_t>& data, bool set_palette, int transparent)
CG AGS::load_vsp(const std::vector<uint8_t>& 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<uint8_t>& 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++) {
+1 -1
View File
@@ -7,7 +7,7 @@
#include "ags.h"
#include <string.h>
CG AGS::load_vsp2l(const std::vector<uint8_t>& data, int transparent)
CG AGS::load_vsp2l(const std::vector<uint8_t>& data, int transparent, uint8_t flags)
{
// ヘッダ取得
int sx = data[0] | (data[1] << 8);
+2 -1
View File
@@ -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();
+3
View File
@@ -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;
+3 -3
View File
@@ -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();
+25 -25
View File
@@ -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);
+2 -2
View File
@@ -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()
+9 -7
View File
@@ -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;
+5
View File
@@ -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);
}