AGS: Refactor palette loading logic

This commit is contained in:
kichikuou
2025-02-09 11:06:37 +09:00
parent ec316da713
commit b1dfc57e9b
9 changed files with 51 additions and 64 deletions
-3
View File
@@ -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;
+7 -8
View File
@@ -8,6 +8,7 @@
#define _AGS_H_
#include <algorithm>
#include <unordered_set>
#include <vector>
#include <memory>
#include <stdio.h>
@@ -16,8 +17,6 @@
#include "dri.h"
#include <SDL_ttf.h>
#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<int> ignore_palette;
int palette_bank;
// マウスカーソル
+17 -12
View File
@@ -25,48 +25,53 @@ void AGS::load_cg(int page, int transparent)
std::vector<uint8_t> 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;
}
+2 -2
View File
@@ -7,7 +7,7 @@
#include "ags.h"
#include <string.h>
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);
}
+1 -1
View File
@@ -7,7 +7,7 @@
#include "ags.h"
#include <string.h>
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;
+19 -27
View File
@@ -8,7 +8,7 @@
#include "game_id.h"
#include <string.h>
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);
}
}
}
}
+3 -9
View File
@@ -8,7 +8,7 @@
#include "game_id.h"
#include <string.h>
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展開
+1 -1
View File
@@ -7,7 +7,7 @@
#include "ags.h"
#include <string.h>
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);
+1 -1
View File
@@ -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) {