mirror of
https://github.com/kichikuou/system3-sdl2.git
synced 2026-10-02 20:08:10 +03:00
Implement game specific commands for Gakuen KING
This commit is contained in:
+10
-1
@@ -109,6 +109,11 @@ public:
|
||||
void update_screen();
|
||||
|
||||
void load_cg(int page, int transparent);
|
||||
// Decodes a CG without drawing it, but still updates the palette.
|
||||
CG load_cg_surface(int page, int transparent = -1);
|
||||
// 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);
|
||||
void set_cg_file(const char *file_name);
|
||||
|
||||
void load_censor_list(const char* fname);
|
||||
@@ -121,7 +126,11 @@ public:
|
||||
void fade_out(int duration_ms, bool white);
|
||||
void fade_in(int duration_ms);
|
||||
|
||||
void copy(int sx, int sy, int ex, int ey, int dx, int dy);
|
||||
void copy(int sx, int sy, int ex, int ey, int dx, int dy) {
|
||||
copy_screen(src_screen, dest_screen, sx, sy, ex, ey, dx, dy);
|
||||
}
|
||||
void copy_screen(int src, int dest, int sx, int sy, int ex, int ey, int dx, int dy,
|
||||
int transparent_color = -1);
|
||||
void gcopy(int gsc, int gde, int glx, int gly, int gsw);
|
||||
void paint(int x, int y, uint8 color);
|
||||
void draw_box(int index);
|
||||
|
||||
+45
-24
@@ -31,15 +31,15 @@ void mosaic(SDL_Surface* sf) {
|
||||
|
||||
} // namespace
|
||||
|
||||
void AGS::load_cg(int page, int transparent)
|
||||
CG AGS::load_cg_surface(int page, int transparent)
|
||||
{
|
||||
if (bmp_prefix) {
|
||||
WARNING("not implemented");
|
||||
return;
|
||||
return CG();
|
||||
}
|
||||
std::vector<uint8_t> data = acg.load(page);
|
||||
if (data.empty())
|
||||
return;
|
||||
return CG();
|
||||
|
||||
bool set_palette = extract_palette && !ignore_palette.count(page);
|
||||
CG cg;
|
||||
@@ -92,24 +92,12 @@ void AGS::load_cg(int page, int transparent)
|
||||
break;
|
||||
}
|
||||
|
||||
// J command
|
||||
if (cg_dest.has_value()) {
|
||||
cg.x = cg_dest->x;
|
||||
cg.y = cg_dest->y;
|
||||
cg_dest = std::nullopt;
|
||||
if (cg.surface()) {
|
||||
SDL_SetSurfacePalette(cg.surface(), screen_palette);
|
||||
if (censor_list.count(page))
|
||||
mosaic(cg.surface());
|
||||
}
|
||||
|
||||
if (extract_cg && cg.surface()) {
|
||||
SDL_SetSurfacePalette(cg.surface(), screen_palette);
|
||||
if (censor_list.count(page)) {
|
||||
mosaic(cg.surface());
|
||||
}
|
||||
SDL_Rect dstrect = { cg.x, cg.y, cg.width(), cg.height() };
|
||||
SDL_BlitSurface(cg.surface(), NULL, hBmpScreen[dest_screen], &dstrect);
|
||||
if (dest_screen == 0) {
|
||||
draw_screen(dstrect.x, dstrect.y, dstrect.w, dstrect.h);
|
||||
}
|
||||
}
|
||||
if (set_palette) {
|
||||
dirty_rect = {0, 0, screen_width, screen_height};
|
||||
#ifdef ENABLE_DEBUGGER
|
||||
@@ -117,20 +105,53 @@ void AGS::load_cg(int page, int transparent)
|
||||
g_debugger->on_palette_change();
|
||||
#endif
|
||||
}
|
||||
return cg;
|
||||
}
|
||||
|
||||
void AGS::copy(int sx, int sy, int ex, int ey, int dx, int dy)
|
||||
void AGS::blit_cg(int dest, CG& cg, const SDL_Rect* src, int dx, int dy)
|
||||
{
|
||||
if (!cg.surface())
|
||||
return;
|
||||
SDL_Rect dstrect = { dx, dy, src ? src->w : cg.width(), src ? src->h : cg.height() };
|
||||
SDL_BlitSurface(cg.surface(), src, hBmpScreen[dest], &dstrect);
|
||||
if (dest == 0) {
|
||||
draw_screen(dstrect.x, dstrect.y, dstrect.w, dstrect.h);
|
||||
}
|
||||
}
|
||||
|
||||
void AGS::load_cg(int page, int transparent)
|
||||
{
|
||||
CG cg = load_cg_surface(page, transparent);
|
||||
if (!cg)
|
||||
return;
|
||||
|
||||
// J command
|
||||
if (cg_dest.has_value()) {
|
||||
cg.x = cg_dest->x;
|
||||
cg.y = cg_dest->y;
|
||||
cg_dest = std::nullopt;
|
||||
}
|
||||
|
||||
if (extract_cg)
|
||||
blit_cg(dest_screen, cg, NULL, cg.x, cg.y);
|
||||
}
|
||||
|
||||
void AGS::copy_screen(int src, int dest, int sx, int sy, int ex, int ey, int dx, int dy, int transparent_color)
|
||||
{
|
||||
int width = ex - sx + 1;
|
||||
int height = ey - sy + 1;
|
||||
SDL_Rect srcrect = {sx, sy, width, height};
|
||||
SDL_Rect destrect = {dx, dy, width, height};
|
||||
|
||||
SDL_BlitSurface(hBmpScreen[src_screen], &srcrect, hBmpScreen[dest_screen], &destrect);
|
||||
SDL_Surface* src_surface = hBmpScreen[src];
|
||||
if (transparent_color >= 0)
|
||||
SDL_SetColorKey(src_surface, SDL_TRUE, transparent_color);
|
||||
SDL_BlitSurface(src_surface, &srcrect, hBmpScreen[dest], &destrect);
|
||||
if (transparent_color >= 0)
|
||||
SDL_SetColorKey(src_surface, SDL_FALSE, 0);
|
||||
|
||||
if(dest_screen == 0) {
|
||||
draw_screen(dx, dy, ex - sx + 1, ey - sy + 1);
|
||||
}
|
||||
if (dest == 0)
|
||||
draw_screen(dx, dy, width, height);
|
||||
}
|
||||
|
||||
void AGS::gcopy(int gsc, int gde, int glx, int gly, int gsw)
|
||||
|
||||
@@ -104,7 +104,14 @@ void AGS::init_windows()
|
||||
case 3: text_w[i].reset(24, 310, 183, 391, false, false); break;
|
||||
case 4: text_w[i].reset(464, 310, 623, 391, false, false); break;
|
||||
}
|
||||
menu_w[i].reset(416, 24, 591, 248, true, true);
|
||||
switch (i) {
|
||||
default:
|
||||
case 0: menu_w[i].reset(416, 24, 591, 248, true, true); break;
|
||||
case 1: menu_w[i].reset(32, 16, 191, 216, true, true); break;
|
||||
case 2: menu_w[i].reset(448, 16, 607, 216, true, true); break;
|
||||
case 3: menu_w[i].reset(32, 223, 191, 383, true, true); break;
|
||||
case 4: menu_w[i].reset(448, 223, 607, 383, true, true); break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
text_w[i].reset(8, 311, 623, 391, true, false);
|
||||
|
||||
+6
-9
@@ -513,18 +513,15 @@ void NACT::message(uint8_t first_byte)
|
||||
|
||||
void NACT::text_wait()
|
||||
{
|
||||
if (msgskip->skipping())
|
||||
return;
|
||||
|
||||
Uint32 dwTime = SDL_GetTicks() + text_wait_time;
|
||||
for(;;) {
|
||||
if(terminate) {
|
||||
return;
|
||||
}
|
||||
RND = get_key();
|
||||
if(RND && wait_keydown) {
|
||||
while (!terminate) {
|
||||
if (get_key(false) && wait_keydown)
|
||||
break;
|
||||
}
|
||||
if(dwTime <= SDL_GetTicks()) {
|
||||
if (dwTime <= SDL_GetTicks())
|
||||
break;
|
||||
}
|
||||
sys_sleep(16);
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -22,11 +22,11 @@
|
||||
|
||||
#define MAX_VERB 128
|
||||
#define MAX_OBJ 256
|
||||
#define MAX_VAR 512
|
||||
#define MAX_VAR 768 // Gakuen KING uses up to VAR737.
|
||||
#define MAX_STRVAR 10
|
||||
|
||||
#define TRACE(fmt, ...) if (config.trace) trace(fmt "\n", ##__VA_ARGS__)
|
||||
#define TRACE_UNIMPLEMENTED(fmt, ...) trace("Unimplemented command " fmt "\n", ##__VA_ARGS__)
|
||||
#define TRACE_UNIMPLEMENTED(fmt, ...) trace("Unimplemented command at %d:%04x " fmt "\n", sco.page(), sco.cmd_addr(), ##__VA_ARGS__)
|
||||
|
||||
class AGS;
|
||||
class MAKO;
|
||||
@@ -80,7 +80,7 @@ protected:
|
||||
void cmd_set_verbobj2();
|
||||
virtual void cmd_open_verb() = 0;
|
||||
|
||||
void cmd_a();
|
||||
virtual void cmd_a();
|
||||
virtual void cmd_b() { sco.unknown_command('B'); }
|
||||
virtual void cmd_d() { sco.unknown_command('D'); }
|
||||
virtual void cmd_e() { sco.unknown_command('E'); }
|
||||
@@ -146,7 +146,7 @@ protected:
|
||||
int menu_select(int num_items);
|
||||
void wait_after_open_menu();
|
||||
|
||||
uint8 get_key();
|
||||
uint8 get_key(bool notify_texthook = true);
|
||||
void wait_key_release(uint8_t mask = 0xff);
|
||||
|
||||
void get_cursor(int* x, int* y);
|
||||
|
||||
+1790
-109
File diff suppressed because it is too large
Load Diff
@@ -106,11 +106,12 @@ void NACT::process_next_event()
|
||||
handle_event(std::move(e));
|
||||
}
|
||||
|
||||
uint8 NACT::get_key()
|
||||
uint8 NACT::get_key(bool notify_texthook)
|
||||
{
|
||||
uint8 val = 0;
|
||||
|
||||
texthook_keywait();
|
||||
if (notify_texthook)
|
||||
texthook_keywait();
|
||||
|
||||
pump_events();
|
||||
|
||||
|
||||
@@ -58,6 +58,7 @@ public:
|
||||
: is_page_call(is_page_call), page(page), addr(addr) {}
|
||||
};
|
||||
const std::vector<StackFrame>& get_call_stack() const { return call_stack; }
|
||||
void set_call_stack(std::vector<StackFrame> frames) { call_stack = std::move(frames); }
|
||||
int write_instruction(int page, int addr, uint8_t op);
|
||||
|
||||
private:
|
||||
|
||||
+12
-9
@@ -1,18 +1,20 @@
|
||||
function(add_scenario_test system)
|
||||
set(TEST_DIR ${CMAKE_CURRENT_BINARY_DIR}/scenario/${system})
|
||||
function(add_scenario_test name game)
|
||||
set(TEST_DIR ${CMAKE_CURRENT_BINARY_DIR}/scenario/${name})
|
||||
file(MAKE_DIRECTORY ${TEST_DIR})
|
||||
configure_file(scenario/${system}/ADISK.DAT ${TEST_DIR}/ADISK.DAT COPYONLY)
|
||||
foreach(data ADISK.DAT ${ARGN})
|
||||
configure_file(scenario/${name}/${data} ${TEST_DIR}/${data} COPYONLY)
|
||||
endforeach()
|
||||
|
||||
add_test(
|
||||
NAME scenario_${system}
|
||||
NAME scenario_${name}
|
||||
COMMAND $<TARGET_FILE:system3>
|
||||
-gamedir ${TEST_DIR}
|
||||
-game ${system}_generic
|
||||
-game ${game}
|
||||
-encoding utf8
|
||||
-fontfile ${PROJECT_SOURCE_DIR}/resources/fonts/MTLc3m.ttf
|
||||
-texthook print
|
||||
)
|
||||
set_tests_properties(scenario_${system} PROPERTIES
|
||||
set_tests_properties(scenario_${name} PROPERTIES
|
||||
ENVIRONMENT "SDL_VIDEODRIVER=dummy;SDL_AUDIODRIVER=dummy"
|
||||
FAIL_REGULAR_EXPRESSION "\\[FAIL\\]"
|
||||
PASS_REGULAR_EXPRESSION "(^|[^0-9])0 tests failed"
|
||||
@@ -20,6 +22,7 @@ function(add_scenario_test system)
|
||||
)
|
||||
endfunction()
|
||||
|
||||
add_scenario_test(system1)
|
||||
add_scenario_test(system2)
|
||||
add_scenario_test(system3)
|
||||
add_scenario_test(system1 system1_generic)
|
||||
add_scenario_test(system2 system2_generic)
|
||||
add_scenario_test(system3 system3_generic)
|
||||
add_scenario_test(gakuen_king gakuen_king AMAP.DAT)
|
||||
|
||||
+2
-2
@@ -10,7 +10,7 @@ require [sys3c](https://github.com/kichikuou/sys3c). After installing sys3c
|
||||
and changing the scenario sources, regenerate it with:
|
||||
|
||||
```sh
|
||||
for system in system1 system2 system3; do
|
||||
(cd test/scenario/$system && sys3c)
|
||||
for dir in system1 system2 system3 gakuen_king; do
|
||||
(cd test/scenario/$dir && sys3c)
|
||||
done
|
||||
```
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Generate the synthetic AMAP.DAT used by the gakuen_king scenario test.
|
||||
|
||||
Each page is a 100x100 grid of 16-bit base cells. The cell value is derived
|
||||
from the coordinates:
|
||||
|
||||
tile = (x + y * 7 + page * 11) % 192 -> low byte, N's D03
|
||||
bit13 = 1 when (x + y) is odd -> N's D02 (blocked)
|
||||
bit14 = 1 when (x * y) % 3 == 0 -> N's D01
|
||||
|
||||
Bits 8-12 of the cell are left at 0; N derives D04 from the low byte anyway.
|
||||
|
||||
Usage:
|
||||
./make_amap.py && dri create AMAP.DAT page1.bin page2.bin
|
||||
"""
|
||||
|
||||
import struct
|
||||
|
||||
WIDTH = HEIGHT = 100
|
||||
PAGES = 2
|
||||
|
||||
|
||||
def cell(page, x, y):
|
||||
tile = (x + y * 7 + page * 11) % 192
|
||||
value = tile
|
||||
if (x + y) % 2:
|
||||
value |= 1 << 13
|
||||
if (x * y) % 3 == 0:
|
||||
value |= 1 << 14
|
||||
return value
|
||||
|
||||
|
||||
def main():
|
||||
for page in range(1, PAGES + 1):
|
||||
data = b"".join(
|
||||
struct.pack("<H", cell(page, x, y))
|
||||
for y in range(HEIGHT)
|
||||
for x in range(WIDTH)
|
||||
)
|
||||
with open(f"page{page}.bin", "wb") as f:
|
||||
f.write(data)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,135 @@
|
||||
; Map state tests. The only way a scenario can read the map back is
|
||||
; N x,y, so every check writes state and then reads it through N.
|
||||
;
|
||||
; The synthetic AMAP.DAT (see make_amap.py) stores
|
||||
; tile = (x + y * 7 + page * 11) % 192 -> N's D03
|
||||
; bit13 = 1 when (x + y) is odd -> N's D02
|
||||
; bit14 = 1 when (x * y) % 3 == 0 -> N's D01
|
||||
; and leaves bits 8-12 zero, so D04 = tile & 31.
|
||||
|
||||
Y 55, 1:
|
||||
|
||||
; --- base cells --------------------------------------------------------
|
||||
N 3, 4:
|
||||
{D01 \ 1: !tests_failed : tests_failed + 1! '[FAIL] base D01' R}
|
||||
{D02 \ 1: !tests_failed : tests_failed + 1! '[FAIL] base D02' R}
|
||||
{D03 \ 42: !tests_failed : tests_failed + 1! '[FAIL] base D03' R}
|
||||
{D04 \ 10: !tests_failed : tests_failed + 1! '[FAIL] base D04' R}
|
||||
|
||||
N 10, 20:
|
||||
{D01 \ 0: !tests_failed : tests_failed + 1! '[FAIL] walkable D01' R}
|
||||
{D02 \ 0: !tests_failed : tests_failed + 1! '[FAIL] walkable D02' R}
|
||||
{D03 \ 161: !tests_failed : tests_failed + 1! '[FAIL] walkable D03' R}
|
||||
{D04 \ 1: !tests_failed : tests_failed + 1! '[FAIL] walkable D04' R}
|
||||
|
||||
; --- layer priority ----------------------------------------------------
|
||||
; Z hides the base cell and reports itself as a wall.
|
||||
Z 3, 4, 12:
|
||||
N 3, 4:
|
||||
{D01 \ 1: !tests_failed : tests_failed + 1! '[FAIL] Z D01' R}
|
||||
{D02 \ 1: !tests_failed : tests_failed + 1! '[FAIL] Z D02' R}
|
||||
{D03 \ 12: !tests_failed : tests_failed + 1! '[FAIL] Z D03' R}
|
||||
{D04 \ 32: !tests_failed : tests_failed + 1! '[FAIL] Z D04' R}
|
||||
|
||||
W 3, 4, 77:
|
||||
N 3, 4:
|
||||
{D03 \ 77: !tests_failed : tests_failed + 1! '[FAIL] W over Z' R}
|
||||
{D04 \ 64: !tests_failed : tests_failed + 1! '[FAIL] W layer tag' R}
|
||||
|
||||
; 255 empties one cell of the layer only; N falls back to Z.
|
||||
W 3, 4, 255:
|
||||
N 3, 4:
|
||||
{D03 \ 12: !tests_failed : tests_failed + 1! '[FAIL] W 255 fallback' R}
|
||||
{D04 \ 32: !tests_failed : tests_failed + 1! '[FAIL] W 255 layer tag' R}
|
||||
|
||||
Z 3, 4, 255:
|
||||
N 3, 4:
|
||||
{D03 \ 42: !tests_failed : tests_failed + 1! '[FAIL] Z 255 fallback' R}
|
||||
{D04 \ 10: !tests_failed : tests_failed + 1! '[FAIL] Z 255 layer tag' R}
|
||||
|
||||
; Tile 0 is a real tile, not an empty cell.
|
||||
Z 3, 4, 0:
|
||||
N 3, 4:
|
||||
{D03 \ 0: !tests_failed : tests_failed + 1! '[FAIL] Z tile 0' R}
|
||||
{D04 \ 32: !tests_failed : tests_failed + 1! '[FAIL] Z tile 0 layer tag' R}
|
||||
Z 3, 4, 255:
|
||||
|
||||
; --- 254 clears the whole layer ---------------------------------------
|
||||
Z 20, 30, 100:
|
||||
Z 21, 30, 101:
|
||||
W 20, 30, 102:
|
||||
W 22, 30, 103:
|
||||
Z 0, 0, 254:
|
||||
N 21, 30:
|
||||
{D03 \ 50: !tests_failed : tests_failed + 1! '[FAIL] Z 254 clears layer' R}
|
||||
{D04 \ 18: !tests_failed : tests_failed + 1! '[FAIL] Z 254 layer tag' R}
|
||||
N 20, 30:
|
||||
{D03 \ 102: !tests_failed : tests_failed + 1! '[FAIL] Z 254 keeps W' R}
|
||||
W 0, 0, 254:
|
||||
N 20, 30:
|
||||
{D03 \ 49: !tests_failed : tests_failed + 1! '[FAIL] W 254 clears layer' R}
|
||||
{D04 \ 17: !tests_failed : tests_failed + 1! '[FAIL] W 254 layer tag' R}
|
||||
N 22, 30:
|
||||
{D03 \ 51: !tests_failed : tests_failed + 1! '[FAIL] W 254 clears whole layer' R}
|
||||
|
||||
; --- B builds a base cell ---------------------------------------------
|
||||
; N is not B's inverse: D04 is derived from D03, so writing D04 = 17
|
||||
; with D03 = 200 reads back as D04 = 8.
|
||||
!D01 : 1!
|
||||
!D02 : 0!
|
||||
!D03 : 200!
|
||||
!D04 : 17!
|
||||
B 50, 50:
|
||||
N 50, 50:
|
||||
{D01 \ 1: !tests_failed : tests_failed + 1! '[FAIL] B D01' R}
|
||||
{D02 \ 0: !tests_failed : tests_failed + 1! '[FAIL] B D02' R}
|
||||
{D03 \ 200: !tests_failed : tests_failed + 1! '[FAIL] B D03' R}
|
||||
{D04 \ 8: !tests_failed : tests_failed + 1! '[FAIL] B D04' R}
|
||||
|
||||
; --- Y 55 area switching ----------------------------------------------
|
||||
Z 3, 4, 12:
|
||||
W 5, 5, 99:
|
||||
Y 55, 2:
|
||||
N 3, 4:
|
||||
{D03 \ 53: !tests_failed : tests_failed + 1! '[FAIL] Y55 loads AMAP page' R}
|
||||
{D04 \ 21: !tests_failed : tests_failed + 1! '[FAIL] Y55 AMAP page D04' R}
|
||||
; (D03/D04 above would be 12/32 if the Z layer had survived.)
|
||||
{D02 \ 1: !tests_failed : tests_failed + 1! '[FAIL] Y55 AMAP page D02' R}
|
||||
; The W layer is cleared together with the Z layer.
|
||||
N 5, 5:
|
||||
{D03 \ 62: !tests_failed : tests_failed + 1! '[FAIL] Y55 clears W layer' R}
|
||||
{D04 \ 30: !tests_failed : tests_failed + 1! '[FAIL] Y55 W layer tag' R}
|
||||
|
||||
Z 3, 4, 12:
|
||||
Y 55, 2:
|
||||
N 3, 4:
|
||||
{D03 \ 53: !tests_failed : tests_failed + 1! '[FAIL] Y55 same id base map' R}
|
||||
{D04 \ 21: !tests_failed : tests_failed + 1! '[FAIL] Y55 same id clears Z' R}
|
||||
|
||||
Y 55, 1:
|
||||
N 3, 4:
|
||||
{D03 \ 42: !tests_failed : tests_failed + 1! '[FAIL] Y55 return base map' R}
|
||||
{D04 \ 10: !tests_failed : tests_failed + 1! '[FAIL] Y55 return D04' R}
|
||||
N 5, 5:
|
||||
{D03 \ 51: !tests_failed : tests_failed + 1! '[FAIL] Y55 return base map at 5,5' R}
|
||||
|
||||
W 0, 0, 254:
|
||||
|
||||
; --- display flags -----------------------------------------------------
|
||||
; These have no read-back command; only check that they run and do not
|
||||
; disturb the map data.
|
||||
Y 56, 0:
|
||||
Y 56, 1:
|
||||
Y 57, 0:
|
||||
Y 57, 1:
|
||||
Y 58, 27:
|
||||
Y 59, 1:
|
||||
Y 59, 0:
|
||||
Y 112, 0:
|
||||
N 3, 4:
|
||||
{D03 \ 42: !tests_failed : tests_failed + 1! '[FAIL] display flags kept map' R}
|
||||
|
||||
%0:
|
||||
|
||||
*default:
|
||||
EOF
|
||||
@@ -0,0 +1,81 @@
|
||||
; Save and load tests.
|
||||
;
|
||||
; L resumes right after the Q that wrote the file, so the round trip runs
|
||||
; part of this page twice. The W layer tells the two passes apart: a load
|
||||
; clears both map layers, and every other state the scenario can read is
|
||||
; either restored or unchanged.
|
||||
;
|
||||
; Failures recorded between Q and L are rolled back together with the rest
|
||||
; of the variables, so those checks are caught by the '[FAIL]' text in the
|
||||
; text hook output rather than by the counter.
|
||||
|
||||
\L_roundtrip:
|
||||
\L_partial_load:
|
||||
\L_bad_slots:
|
||||
%0:
|
||||
|
||||
*L_roundtrip:
|
||||
Y 55, 1:
|
||||
W 5, 5, 99:
|
||||
!VAR100 : 1234!
|
||||
!VAR700 : 4321!
|
||||
Q 1:
|
||||
!VAR101 : RND!
|
||||
N 5, 5:
|
||||
{D03 = 99:
|
||||
; First pass.
|
||||
{VAR101 \ 1: !tests_failed : tests_failed + 1! '[FAIL] Q RND' R}
|
||||
; Wreck everything the load has to bring back.
|
||||
!VAR100 : 0!
|
||||
!VAR700 : 0!
|
||||
Z 3, 4, 12:
|
||||
Y 55, 2:
|
||||
L 1:
|
||||
'[FAIL] L did not resume the saved position' R
|
||||
!tests_failed : tests_failed + 1!
|
||||
}
|
||||
|
||||
; Second pass, after the load.
|
||||
{VAR101 \ 0: !tests_failed : tests_failed + 1! '[FAIL] L RND' R}
|
||||
{VAR100 \ 1234: !tests_failed : tests_failed + 1! '[FAIL] L variable' R}
|
||||
{VAR700 \ 4321: !tests_failed : tests_failed + 1! '[FAIL] L high variable' R}
|
||||
{D03 \ 51: !tests_failed : tests_failed + 1! '[FAIL] L clears the W layer' R}
|
||||
N 3, 4:
|
||||
{D03 \ 42: !tests_failed : tests_failed + 1! '[FAIL] L restores the map area' R}
|
||||
{D04 \ 10: !tests_failed : tests_failed + 1! '[FAIL] L clears the Z layer' R}
|
||||
|
||||
\0:
|
||||
'[FAIL] label call stack lost by L' R
|
||||
!tests_failed : tests_failed + 1!
|
||||
|
||||
*L_partial_load:
|
||||
; Y 82,var reloads that one variable from the save file RND selects.
|
||||
!VAR614 : 111!
|
||||
!VAR615 : 222!
|
||||
!VAR616 : 333!
|
||||
Q 3:
|
||||
!VAR614 : 1!
|
||||
!VAR615 : 2!
|
||||
!VAR616 : 3!
|
||||
!RND : 3!
|
||||
Y 82, VAR615:
|
||||
{VAR615 \ 222: !tests_failed : tests_failed + 1! '[FAIL] Y82 value' R}
|
||||
{VAR614 \ 1: !tests_failed : tests_failed + 1! '[FAIL] Y82 wrote VAR614' R}
|
||||
{VAR616 \ 3: !tests_failed : tests_failed + 1! '[FAIL] Y82 wrote VAR616' R}
|
||||
; A file that does not exist zeroes the target instead.
|
||||
!RND : 20!
|
||||
Y 82, VAR616:
|
||||
{VAR616 \ 0: !tests_failed : tests_failed + 1! '[FAIL] Y82 missing file' R}
|
||||
\0:
|
||||
|
||||
*L_bad_slots:
|
||||
!RND : 0!
|
||||
L 20:
|
||||
{RND \ 255: !tests_failed : tests_failed + 1! '[FAIL] L missing slot' R}
|
||||
!RND : 0!
|
||||
Q 30:
|
||||
{RND \ 255: !tests_failed : tests_failed + 1! '[FAIL] Q invalid slot' R}
|
||||
\0:
|
||||
|
||||
*default:
|
||||
EOF
|
||||
@@ -0,0 +1,5 @@
|
||||
game = gakuen_king
|
||||
hed = test.hed
|
||||
variables = variables.txt
|
||||
encoding = utf8
|
||||
unicode = true
|
||||
@@ -0,0 +1,15 @@
|
||||
!tests_failed : 0!
|
||||
|
||||
; System3-sdl2 extension: draw ASCII as half-width characters so the
|
||||
; text-hook output is easy for CTest and humans to read.
|
||||
Y 240, 1:
|
||||
|
||||
%#map.adv:
|
||||
%#saveload.adv:
|
||||
|
||||
H 0, tests_failed: ' tests failed' R
|
||||
!RND : tests_failed!
|
||||
Y 255, 0:
|
||||
|
||||
*default:
|
||||
EOF
|
||||
@@ -0,0 +1,3 @@
|
||||
test.adv
|
||||
map.adv
|
||||
saveload.adv
|
||||
@@ -0,0 +1,768 @@
|
||||
RND
|
||||
D01
|
||||
D02
|
||||
D03
|
||||
D04
|
||||
D05
|
||||
D06
|
||||
D07
|
||||
D08
|
||||
D09
|
||||
D10
|
||||
D11
|
||||
D12
|
||||
D13
|
||||
D14
|
||||
D15
|
||||
D16
|
||||
D17
|
||||
D18
|
||||
D19
|
||||
D20
|
||||
U01
|
||||
U02
|
||||
U03
|
||||
U04
|
||||
U05
|
||||
U06
|
||||
U07
|
||||
U08
|
||||
U09
|
||||
U10
|
||||
U11
|
||||
U12
|
||||
U13
|
||||
U14
|
||||
U15
|
||||
U16
|
||||
U17
|
||||
U18
|
||||
U19
|
||||
U20
|
||||
B01
|
||||
B02
|
||||
B03
|
||||
B04
|
||||
B05
|
||||
B06
|
||||
B07
|
||||
B08
|
||||
B09
|
||||
B10
|
||||
B11
|
||||
B12
|
||||
B13
|
||||
B14
|
||||
B15
|
||||
B16
|
||||
M_X
|
||||
M_Y
|
||||
VAR59
|
||||
VAR60
|
||||
VAR61
|
||||
VAR62
|
||||
VAR63
|
||||
VAR64
|
||||
VAR65
|
||||
VAR66
|
||||
VAR67
|
||||
VAR68
|
||||
VAR69
|
||||
VAR70
|
||||
VAR71
|
||||
VAR72
|
||||
VAR73
|
||||
VAR74
|
||||
VAR75
|
||||
VAR76
|
||||
VAR77
|
||||
VAR78
|
||||
VAR79
|
||||
VAR80
|
||||
VAR81
|
||||
VAR82
|
||||
VAR83
|
||||
VAR84
|
||||
VAR85
|
||||
VAR86
|
||||
VAR87
|
||||
VAR88
|
||||
VAR89
|
||||
VAR90
|
||||
VAR91
|
||||
VAR92
|
||||
VAR93
|
||||
VAR94
|
||||
VAR95
|
||||
VAR96
|
||||
VAR97
|
||||
VAR98
|
||||
VAR99
|
||||
VAR100
|
||||
VAR101
|
||||
VAR102
|
||||
VAR103
|
||||
VAR104
|
||||
VAR105
|
||||
VAR106
|
||||
VAR107
|
||||
VAR108
|
||||
VAR109
|
||||
VAR110
|
||||
VAR111
|
||||
VAR112
|
||||
VAR113
|
||||
VAR114
|
||||
VAR115
|
||||
VAR116
|
||||
VAR117
|
||||
VAR118
|
||||
VAR119
|
||||
VAR120
|
||||
VAR121
|
||||
VAR122
|
||||
VAR123
|
||||
VAR124
|
||||
VAR125
|
||||
VAR126
|
||||
VAR127
|
||||
VAR128
|
||||
VAR129
|
||||
VAR130
|
||||
VAR131
|
||||
VAR132
|
||||
VAR133
|
||||
VAR134
|
||||
VAR135
|
||||
VAR136
|
||||
VAR137
|
||||
VAR138
|
||||
VAR139
|
||||
VAR140
|
||||
VAR141
|
||||
VAR142
|
||||
VAR143
|
||||
VAR144
|
||||
VAR145
|
||||
VAR146
|
||||
VAR147
|
||||
VAR148
|
||||
VAR149
|
||||
VAR150
|
||||
VAR151
|
||||
VAR152
|
||||
VAR153
|
||||
VAR154
|
||||
VAR155
|
||||
VAR156
|
||||
VAR157
|
||||
VAR158
|
||||
VAR159
|
||||
VAR160
|
||||
VAR161
|
||||
VAR162
|
||||
VAR163
|
||||
VAR164
|
||||
VAR165
|
||||
VAR166
|
||||
VAR167
|
||||
VAR168
|
||||
VAR169
|
||||
VAR170
|
||||
VAR171
|
||||
VAR172
|
||||
VAR173
|
||||
VAR174
|
||||
VAR175
|
||||
VAR176
|
||||
VAR177
|
||||
VAR178
|
||||
VAR179
|
||||
VAR180
|
||||
VAR181
|
||||
VAR182
|
||||
VAR183
|
||||
VAR184
|
||||
VAR185
|
||||
VAR186
|
||||
VAR187
|
||||
VAR188
|
||||
VAR189
|
||||
VAR190
|
||||
VAR191
|
||||
VAR192
|
||||
VAR193
|
||||
VAR194
|
||||
VAR195
|
||||
VAR196
|
||||
VAR197
|
||||
VAR198
|
||||
VAR199
|
||||
VAR200
|
||||
VAR201
|
||||
VAR202
|
||||
VAR203
|
||||
VAR204
|
||||
VAR205
|
||||
VAR206
|
||||
VAR207
|
||||
VAR208
|
||||
VAR209
|
||||
VAR210
|
||||
VAR211
|
||||
VAR212
|
||||
VAR213
|
||||
VAR214
|
||||
VAR215
|
||||
VAR216
|
||||
VAR217
|
||||
VAR218
|
||||
VAR219
|
||||
VAR220
|
||||
VAR221
|
||||
VAR222
|
||||
VAR223
|
||||
VAR224
|
||||
VAR225
|
||||
VAR226
|
||||
VAR227
|
||||
VAR228
|
||||
VAR229
|
||||
VAR230
|
||||
VAR231
|
||||
VAR232
|
||||
VAR233
|
||||
VAR234
|
||||
VAR235
|
||||
VAR236
|
||||
VAR237
|
||||
VAR238
|
||||
VAR239
|
||||
VAR240
|
||||
VAR241
|
||||
VAR242
|
||||
VAR243
|
||||
VAR244
|
||||
VAR245
|
||||
VAR246
|
||||
VAR247
|
||||
VAR248
|
||||
VAR249
|
||||
VAR250
|
||||
VAR251
|
||||
VAR252
|
||||
VAR253
|
||||
VAR254
|
||||
VAR255
|
||||
VAR256
|
||||
VAR257
|
||||
VAR258
|
||||
VAR259
|
||||
VAR260
|
||||
VAR261
|
||||
VAR262
|
||||
VAR263
|
||||
VAR264
|
||||
VAR265
|
||||
VAR266
|
||||
VAR267
|
||||
VAR268
|
||||
VAR269
|
||||
VAR270
|
||||
VAR271
|
||||
VAR272
|
||||
VAR273
|
||||
VAR274
|
||||
VAR275
|
||||
VAR276
|
||||
VAR277
|
||||
VAR278
|
||||
VAR279
|
||||
VAR280
|
||||
VAR281
|
||||
VAR282
|
||||
VAR283
|
||||
VAR284
|
||||
VAR285
|
||||
VAR286
|
||||
VAR287
|
||||
VAR288
|
||||
VAR289
|
||||
VAR290
|
||||
VAR291
|
||||
VAR292
|
||||
VAR293
|
||||
VAR294
|
||||
VAR295
|
||||
VAR296
|
||||
VAR297
|
||||
VAR298
|
||||
VAR299
|
||||
VAR300
|
||||
VAR301
|
||||
VAR302
|
||||
VAR303
|
||||
VAR304
|
||||
VAR305
|
||||
VAR306
|
||||
VAR307
|
||||
VAR308
|
||||
VAR309
|
||||
VAR310
|
||||
VAR311
|
||||
VAR312
|
||||
VAR313
|
||||
VAR314
|
||||
VAR315
|
||||
VAR316
|
||||
VAR317
|
||||
VAR318
|
||||
VAR319
|
||||
VAR320
|
||||
VAR321
|
||||
VAR322
|
||||
VAR323
|
||||
VAR324
|
||||
VAR325
|
||||
VAR326
|
||||
VAR327
|
||||
VAR328
|
||||
VAR329
|
||||
VAR330
|
||||
VAR331
|
||||
VAR332
|
||||
VAR333
|
||||
VAR334
|
||||
VAR335
|
||||
VAR336
|
||||
VAR337
|
||||
VAR338
|
||||
VAR339
|
||||
VAR340
|
||||
VAR341
|
||||
VAR342
|
||||
VAR343
|
||||
VAR344
|
||||
VAR345
|
||||
VAR346
|
||||
VAR347
|
||||
VAR348
|
||||
VAR349
|
||||
VAR350
|
||||
VAR351
|
||||
VAR352
|
||||
VAR353
|
||||
VAR354
|
||||
VAR355
|
||||
VAR356
|
||||
VAR357
|
||||
VAR358
|
||||
VAR359
|
||||
VAR360
|
||||
VAR361
|
||||
VAR362
|
||||
VAR363
|
||||
VAR364
|
||||
VAR365
|
||||
VAR366
|
||||
VAR367
|
||||
VAR368
|
||||
VAR369
|
||||
VAR370
|
||||
VAR371
|
||||
VAR372
|
||||
VAR373
|
||||
VAR374
|
||||
VAR375
|
||||
VAR376
|
||||
VAR377
|
||||
VAR378
|
||||
VAR379
|
||||
VAR380
|
||||
VAR381
|
||||
VAR382
|
||||
VAR383
|
||||
VAR384
|
||||
VAR385
|
||||
VAR386
|
||||
VAR387
|
||||
VAR388
|
||||
VAR389
|
||||
VAR390
|
||||
VAR391
|
||||
VAR392
|
||||
VAR393
|
||||
VAR394
|
||||
VAR395
|
||||
VAR396
|
||||
VAR397
|
||||
VAR398
|
||||
VAR399
|
||||
VAR400
|
||||
VAR401
|
||||
VAR402
|
||||
VAR403
|
||||
VAR404
|
||||
VAR405
|
||||
VAR406
|
||||
VAR407
|
||||
VAR408
|
||||
VAR409
|
||||
VAR410
|
||||
VAR411
|
||||
VAR412
|
||||
VAR413
|
||||
VAR414
|
||||
VAR415
|
||||
VAR416
|
||||
VAR417
|
||||
VAR418
|
||||
VAR419
|
||||
VAR420
|
||||
VAR421
|
||||
VAR422
|
||||
VAR423
|
||||
VAR424
|
||||
VAR425
|
||||
VAR426
|
||||
VAR427
|
||||
VAR428
|
||||
VAR429
|
||||
VAR430
|
||||
VAR431
|
||||
VAR432
|
||||
VAR433
|
||||
VAR434
|
||||
VAR435
|
||||
VAR436
|
||||
VAR437
|
||||
VAR438
|
||||
VAR439
|
||||
VAR440
|
||||
VAR441
|
||||
VAR442
|
||||
VAR443
|
||||
VAR444
|
||||
VAR445
|
||||
VAR446
|
||||
VAR447
|
||||
VAR448
|
||||
VAR449
|
||||
VAR450
|
||||
VAR451
|
||||
VAR452
|
||||
VAR453
|
||||
VAR454
|
||||
VAR455
|
||||
VAR456
|
||||
VAR457
|
||||
VAR458
|
||||
VAR459
|
||||
VAR460
|
||||
VAR461
|
||||
VAR462
|
||||
VAR463
|
||||
VAR464
|
||||
VAR465
|
||||
VAR466
|
||||
VAR467
|
||||
VAR468
|
||||
VAR469
|
||||
VAR470
|
||||
VAR471
|
||||
VAR472
|
||||
VAR473
|
||||
VAR474
|
||||
VAR475
|
||||
VAR476
|
||||
VAR477
|
||||
VAR478
|
||||
VAR479
|
||||
VAR480
|
||||
VAR481
|
||||
VAR482
|
||||
VAR483
|
||||
VAR484
|
||||
VAR485
|
||||
VAR486
|
||||
VAR487
|
||||
VAR488
|
||||
VAR489
|
||||
VAR490
|
||||
VAR491
|
||||
VAR492
|
||||
VAR493
|
||||
VAR494
|
||||
VAR495
|
||||
VAR496
|
||||
VAR497
|
||||
VAR498
|
||||
VAR499
|
||||
VAR500
|
||||
VAR501
|
||||
VAR502
|
||||
VAR503
|
||||
VAR504
|
||||
VAR505
|
||||
VAR506
|
||||
VAR507
|
||||
VAR508
|
||||
VAR509
|
||||
VAR510
|
||||
VAR511
|
||||
VAR512
|
||||
VAR513
|
||||
VAR514
|
||||
VAR515
|
||||
VAR516
|
||||
VAR517
|
||||
VAR518
|
||||
VAR519
|
||||
VAR520
|
||||
VAR521
|
||||
VAR522
|
||||
VAR523
|
||||
VAR524
|
||||
VAR525
|
||||
VAR526
|
||||
VAR527
|
||||
VAR528
|
||||
VAR529
|
||||
VAR530
|
||||
VAR531
|
||||
VAR532
|
||||
VAR533
|
||||
VAR534
|
||||
VAR535
|
||||
VAR536
|
||||
VAR537
|
||||
VAR538
|
||||
VAR539
|
||||
VAR540
|
||||
VAR541
|
||||
VAR542
|
||||
VAR543
|
||||
VAR544
|
||||
VAR545
|
||||
VAR546
|
||||
VAR547
|
||||
VAR548
|
||||
VAR549
|
||||
VAR550
|
||||
VAR551
|
||||
VAR552
|
||||
VAR553
|
||||
VAR554
|
||||
VAR555
|
||||
VAR556
|
||||
VAR557
|
||||
VAR558
|
||||
VAR559
|
||||
VAR560
|
||||
VAR561
|
||||
VAR562
|
||||
VAR563
|
||||
VAR564
|
||||
VAR565
|
||||
VAR566
|
||||
VAR567
|
||||
VAR568
|
||||
VAR569
|
||||
VAR570
|
||||
VAR571
|
||||
VAR572
|
||||
VAR573
|
||||
VAR574
|
||||
VAR575
|
||||
VAR576
|
||||
VAR577
|
||||
VAR578
|
||||
VAR579
|
||||
VAR580
|
||||
VAR581
|
||||
VAR582
|
||||
VAR583
|
||||
VAR584
|
||||
VAR585
|
||||
VAR586
|
||||
VAR587
|
||||
VAR588
|
||||
VAR589
|
||||
VAR590
|
||||
VAR591
|
||||
VAR592
|
||||
VAR593
|
||||
VAR594
|
||||
VAR595
|
||||
VAR596
|
||||
VAR597
|
||||
VAR598
|
||||
VAR599
|
||||
VAR600
|
||||
VAR601
|
||||
VAR602
|
||||
VAR603
|
||||
VAR604
|
||||
VAR605
|
||||
VAR606
|
||||
VAR607
|
||||
VAR608
|
||||
VAR609
|
||||
VAR610
|
||||
VAR611
|
||||
VAR612
|
||||
VAR613
|
||||
VAR614
|
||||
VAR615
|
||||
VAR616
|
||||
VAR617
|
||||
VAR618
|
||||
VAR619
|
||||
VAR620
|
||||
VAR621
|
||||
VAR622
|
||||
VAR623
|
||||
VAR624
|
||||
VAR625
|
||||
VAR626
|
||||
VAR627
|
||||
VAR628
|
||||
VAR629
|
||||
VAR630
|
||||
VAR631
|
||||
VAR632
|
||||
VAR633
|
||||
VAR634
|
||||
VAR635
|
||||
VAR636
|
||||
VAR637
|
||||
VAR638
|
||||
VAR639
|
||||
VAR640
|
||||
VAR641
|
||||
VAR642
|
||||
VAR643
|
||||
VAR644
|
||||
VAR645
|
||||
VAR646
|
||||
VAR647
|
||||
VAR648
|
||||
VAR649
|
||||
VAR650
|
||||
VAR651
|
||||
VAR652
|
||||
VAR653
|
||||
VAR654
|
||||
VAR655
|
||||
VAR656
|
||||
VAR657
|
||||
VAR658
|
||||
VAR659
|
||||
VAR660
|
||||
VAR661
|
||||
VAR662
|
||||
VAR663
|
||||
VAR664
|
||||
VAR665
|
||||
VAR666
|
||||
VAR667
|
||||
VAR668
|
||||
VAR669
|
||||
VAR670
|
||||
VAR671
|
||||
VAR672
|
||||
VAR673
|
||||
VAR674
|
||||
VAR675
|
||||
VAR676
|
||||
VAR677
|
||||
VAR678
|
||||
VAR679
|
||||
VAR680
|
||||
VAR681
|
||||
VAR682
|
||||
VAR683
|
||||
VAR684
|
||||
VAR685
|
||||
VAR686
|
||||
VAR687
|
||||
VAR688
|
||||
VAR689
|
||||
VAR690
|
||||
VAR691
|
||||
VAR692
|
||||
VAR693
|
||||
VAR694
|
||||
VAR695
|
||||
VAR696
|
||||
VAR697
|
||||
VAR698
|
||||
VAR699
|
||||
VAR700
|
||||
VAR701
|
||||
VAR702
|
||||
VAR703
|
||||
VAR704
|
||||
VAR705
|
||||
VAR706
|
||||
VAR707
|
||||
VAR708
|
||||
VAR709
|
||||
VAR710
|
||||
VAR711
|
||||
VAR712
|
||||
VAR713
|
||||
VAR714
|
||||
VAR715
|
||||
VAR716
|
||||
VAR717
|
||||
VAR718
|
||||
VAR719
|
||||
VAR720
|
||||
VAR721
|
||||
VAR722
|
||||
VAR723
|
||||
VAR724
|
||||
VAR725
|
||||
VAR726
|
||||
VAR727
|
||||
VAR728
|
||||
VAR729
|
||||
VAR730
|
||||
VAR731
|
||||
VAR732
|
||||
VAR733
|
||||
VAR734
|
||||
VAR735
|
||||
VAR736
|
||||
VAR737
|
||||
VAR738
|
||||
VAR739
|
||||
VAR740
|
||||
VAR741
|
||||
VAR742
|
||||
VAR743
|
||||
VAR744
|
||||
VAR745
|
||||
VAR746
|
||||
VAR747
|
||||
VAR748
|
||||
VAR749
|
||||
VAR750
|
||||
VAR751
|
||||
VAR752
|
||||
VAR753
|
||||
VAR754
|
||||
VAR755
|
||||
VAR756
|
||||
VAR757
|
||||
VAR758
|
||||
VAR759
|
||||
VAR760
|
||||
VAR761
|
||||
VAR762
|
||||
VAR763
|
||||
VAR764
|
||||
VAR765
|
||||
VAR766
|
||||
tests_failed
|
||||
Reference in New Issue
Block a user