mirror of
https://github.com/kichikuou/system3-sdl2.git
synced 2026-09-22 22:58:12 +03:00
AGS: Refactor palette loading logic
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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展開
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user