From 30a0c90633d99d1261be804b691cc84d259c1d1a Mon Sep 17 00:00:00 2001 From: ketmar Date: Sat, 17 Mar 2012 13:15:00 +0200 Subject: [PATCH] alot of code changed; first try to move level loader out of C engine; not working yet --- asm/awlogic.awa | 10 +- asm/defs/globals.awa | 24 +-- asm/defs/rst.awa | 14 +- asm/defs/tvars.awa | 2 + asm/game.awa | 48 +++-- asm/game/dodie.awa | 2 +- asm/game/frame_common.awa | 6 +- asm/game/use/apple.awa | 1 + asm/game/use/dynamite.awa | 1 + asm/game/use/key.awa | 1 + asm/game/use/rocket.awa | 1 + asm/game/use/vial.awa | 2 + asm/game/utils.awa | 1 + asm/imports/globals.awa | 24 +-- asm/imports/rst.awa | 9 +- asm/imports/tvars.awa | 2 + asm/items/items.awa | 58 +++++++ src/game.h => asm/loaders.awa | 15 +- asm/loaders/avishlevel.awa | 133 ++++++++++++++ asm/mapscripts/level01.awa | 13 +- asm/title.awa | 2 +- src/awish.c | 9 +- src/game.c | 394 +++++++++++++++++++----------------------- src/game.h | 7 +- src/title.c | 2 +- src/vm.c | 7 +- src/vm_gamelabels.h | 31 ++-- src/vm_gamelabelsdef.c | 31 ++-- src/vm_gamelabelsinit.c | 31 ++-- 29 files changed, 540 insertions(+), 341 deletions(-) copy src/game.h => asm/loaders.awa (79%) create mode 100644 asm/loaders/avishlevel.awa diff --git a/asm/awlogic.awa b/asm/awlogic.awa index a799bcd..4225dd9 100644 --- a/asm/awlogic.awa +++ b/asm/awlogic.awa @@ -12,9 +12,10 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +public: entry_main_init public: entry_title -public: entry_item -public: game_restart_level +public: entry_game_initialize +public: entry_game_restart_level include: defs.awa include: title.awa @@ -24,3 +25,8 @@ include: utils.awa include: maininit.awa include: getcode.awa + +include: loaders.awa + + +; entry_room_onunload will be called (if preset) before unloading current room data diff --git a/asm/defs/globals.awa b/asm/defs/globals.awa index 1a8f34f..be0300c 100644 --- a/asm/defs/globals.awa +++ b/asm/defs/globals.awa @@ -18,11 +18,6 @@ defevar: rst_result defevar: goobers -defevar: level_code_ofs -defevar: level_code_len -defevar: max_level -defevar: start_level -defevar: game_state /* keyboard flags */ defevar: key_quit, key_start, key_restart @@ -33,17 +28,24 @@ defevar: key_take, key_use, key_minimap defevar: key_fall_cheat, key_walk_cheat defevar: key_plev_cheat, key_nlev_cheat -/* map dimensions */ +/* misc info */ +defevar: max_level +defevar: start_level +defevar: game_state + +/* current level */ +defevar: cur_level +/* level info */ +defevar: level_code_ofs, level_code_len +defevar: item_name_ofs, item_name_len +defevar: level_backpic +/* map dimensions; better don't change */ defevar: map_width, map_height -/* view port dimensions */ +/* view port dimensions (can't be changed) */ defevar: vis_width, vis_height /* view port start */ defevar: scr_x, scr_y -/* current level */ -defevar: cur_level /* must be public global 'cause engine needs it */ defevar: prof_item ; id of the item professor carrying - -defevar: room_script_tid ; tid of the room local script diff --git a/asm/defs/rst.awa b/asm/defs/rst.awa index 8fa632d..ad8d74d 100644 --- a/asm/defs/rst.awa +++ b/asm/defs/rst.awa @@ -19,7 +19,15 @@ econst: FRST_ML_TITLE = 1 ; mainloop: title econst: FRST_ML_GAME = 2 ; mainloop: game econst: FRST_MINIMAP = 3 ; enter 'minimap' mode -econst: FRST_LOAD_LEVEL = 10 ; arg1: level number +; FRST_OPEN_LEVEL_FILE: calls unload callbacks, closes previous level, opens new, loads level scripts +econst: FRST_OPEN_LEVEL_FILE = 10 ; arg: level number (0..max); rst_result: success flag (>0: success; level file size) +econst: FRST_GET_LEVEL_DATA_SIZE = 11 ; rst_result: -1 or size of level data +econst: FRST_GET_LEVEL_LOADER = 12 ; rst_result: -1 or address of custom loader +econst: FRST_GET_LEVEL_INITER = 13 ; rst_result: -1 or address of custom loader +econst: FRST_GET_LEVEL_FILE_BYTE = 14 ; arg: offset; unsigned +econst: FRST_GET_LEVEL_FILE_WORD = 15 ; arg: offset; signed +econst: FRST_SET_LEVEL_SIZE = 16 ; arg1: width, arg2: height (call this before setting tiles) +econst: FRST_SET_LEVEL_NAME = 17 ; arg1: pos(<0: in level data; pos=(-pos)-1); arg2 (if present) name length, else asiiz econst: FRST_GET_MAX_THREADS = 100 econst: FRST_GET_MAX_THREAD_ID = 101 @@ -31,5 +39,5 @@ econst: FRST_SET_SEED_H = 203 econst: FRST_SET_SEED_L = 204 -econst: FRST_DEBUG_PRINT_STR = 600 ; arg1: string offset (arg2: length, else asciiz) -econst: FRST_DEBUG_PRINT_NUM = 601 ; arg1..arg2: num +econst: FRST_DEBUG_PRINT_STR = 600 ; arg1: string offset (arg2: length, else asciiz) +econst: FRST_DEBUG_PRINT_NUM = 601 ; arg1..arg2: num diff --git a/asm/defs/tvars.awa b/asm/defs/tvars.awa index bda523f..e2fa63c 100644 --- a/asm/defs/tvars.awa +++ b/asm/defs/tvars.awa @@ -25,6 +25,8 @@ defetvar: pos_tx, pos_ty ; pixel offset from the current map tile defetvar: animated defetvar: afirst_frame, alast_frame, aframe +deftvar: prof_dir ; used everywhere (PDIR_XXX) + ; for items deftvar: activated deftvar: fall_count diff --git a/asm/game.awa b/asm/game.awa index 84f3026..1479ef7 100644 --- a/asm/game.awa +++ b/asm/game.awa @@ -12,8 +12,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -deftvar: prof_dir ; used everywhere (PDIR_XXX) - ; used in fanchecks deftvar: game_fan_left_v ; have left working fan? deftvar: game_fan_right_v ; have right working fan? @@ -62,14 +60,25 @@ game_load_level: mul [cur_level], [level_code_len], [level_code_ofs] add [level_code_ofs], level_codes ; - rst FRST_LOAD_LEVEL, [cur_level] - jne quit_program, [rst_result], 0 + psh avish_level_loader + rst FRST_GET_LEVEL_LOADER + jlt .no_custom_loader, [rst_result], 0 + drp + psh [rst_result] +.no_custom_loader: + psh [cur_level] + bsr ; call level loader + ; call local initializer (if any) + rst FRST_GET_LEVEL_INITER + jlt .no_custom_init, [rst_result], 0 + bsr [rst_result] +.no_custom_init: ; bsr prof_fix_position ret -entry_game_start: +entry_game_initialize: rst FRST_ML_GAME set [cur_level], [start_level] /* @@ -79,14 +88,13 @@ entry_game_start: set [cur_level], 12 */ -game_restart_level: +entry_game_restart_level: rst FRST_ML_GAME bsr clear_stack bsr kill_all_threads ; set [game_state], GAME_STATE_STARTED brk - set [game_state], GAME_STATE_PLAYING ; set [key_quit], 0 set [key_start], 0 @@ -110,30 +118,14 @@ game_restart_level: set [pos_ty], 0 set [prof_item], 0 set [monster_tid], -666 + ; set [spr_item], -1 + set [item_name_ofs], 0 + set [item_name_len], 0 ; bsr game_load_level - ; - // move first item to player -/* - set [126], [pos_y] - sub [126], 9 - set pos_x, [pos_x], 1 - set pos_y, [126], 1 -*/ - ; - // set lift -/* - psh [pos_x] - psh 1 - add - ; - psh [pos_y] - psh 0 - sub - ; - msf 7 -*/ + set [game_state], GAME_STATE_PLAYING + brk ; give all threads a chance to initialize themselves ; jmp game_facing_loop_w2f diff --git a/asm/game/dodie.awa b/asm/game/dodie.awa index 1c7dc78..4346764 100644 --- a/asm/game/dodie.awa +++ b/asm/game/dodie.awa @@ -66,7 +66,7 @@ proc: game_wait_and_restart jmp .waitrestart ; .dorestart: - jmp game_restart_level + jmp entry_game_restart_level endp: game_wait_and_restart diff --git a/asm/game/frame_common.awa b/asm/game/frame_common.awa index c7107af..03f0b2b 100644 --- a/asm/game/frame_common.awa +++ b/asm/game/frame_common.awa @@ -22,7 +22,7 @@ game_next_frame: jeq .noplc, [key_plev_cheat], 0 jle .noplc, [cur_level], 0 sub [cur_level], 1 - jmp game_restart_level + jmp entry_game_restart_level .noplc: jeq .nonlc, [key_nlev_cheat], 0 psh [cur_level] @@ -30,10 +30,10 @@ game_next_frame: sub 1 jge .nonlc add [cur_level], 1 - jmp game_restart_level + jmp entry_game_restart_level .nonlc: ; - jne game_restart_level, [key_restart], 0 + jne entry_game_restart_level, [key_restart], 0 ; brk ret diff --git a/asm/game/use/apple.awa b/asm/game/use/apple.awa index ceed32b..3253886 100644 --- a/asm/game/use/apple.awa +++ b/asm/game/use/apple.awa @@ -56,6 +56,7 @@ locals: .dx, .t set frozen, 0, [prof_item] ;set activated, 1, [prof_item] set [prof_item], 0 + bsr set_item_name_vars, [prof_item] .quit: ret endp: game_use_apple diff --git a/asm/game/use/dynamite.awa b/asm/game/use/dynamite.awa index d5ca490..2fd3d57 100644 --- a/asm/game/use/dynamite.awa +++ b/asm/game/use/dynamite.awa @@ -44,6 +44,7 @@ locals: .dx, .t set activated, 1, [prof_item] set item_id, ITEM_DYNAMITE, [prof_item] set [prof_item], 0 + bsr set_item_name_vars, [prof_item] ;;;.quit: ret endp: game_use_dynamite diff --git a/asm/game/use/key.awa b/asm/game/use/key.awa index feb8118..0952794 100644 --- a/asm/game/use/key.awa +++ b/asm/game/use/key.awa @@ -88,6 +88,7 @@ deflvar: .dx, .t ; don't change to locals! ; key should disappear now kil [prof_item] set [prof_item], 0 + bsr set_item_name_vars, [prof_item] set [spr_num], PSPR_STANDING ret ; diff --git a/asm/game/use/rocket.awa b/asm/game/use/rocket.awa index e8f7342..4b82178 100644 --- a/asm/game/use/rocket.awa +++ b/asm/game/use/rocket.awa @@ -53,6 +53,7 @@ deflvar: .dx, .t ; don't change to locals set activated, 1, [prof_item] set item_id, ITEM_ROCKET, [prof_item] set [prof_item], 0 + bsr set_item_name_vars, [prof_item] psh [pos_x] add [prof_dir] psh -666 diff --git a/asm/game/use/vial.awa b/asm/game/use/vial.awa index 00e08e2..13d34d4 100644 --- a/asm/game/use/vial.awa +++ b/asm/game/use/vial.awa @@ -59,6 +59,8 @@ locals: .f ; .quit: kil [prof_item] + set [prof_item], 0 + bsr set_item_name_vars, [prof_item] /* set spr_dir, DIR_LEFT, [prof_item] set pos_ty, 0, [prof_item] diff --git a/asm/game/utils.awa b/asm/game/utils.awa index dc82d46..3106848 100644 --- a/asm/game/utils.awa +++ b/asm/game/utils.awa @@ -186,6 +186,7 @@ arg: .profdir set [spr_num], PSPR_FACING bsr game_next_frame bsr game_next_frame + bsr set_item_name_vars, [prof_item] ret endp: game_do_pick diff --git a/asm/imports/globals.awa b/asm/imports/globals.awa index 988aa63..5862450 100644 --- a/asm/imports/globals.awa +++ b/asm/imports/globals.awa @@ -18,11 +18,6 @@ extern: defevar: rst_result extern: defevar: goobers -extern: defevar: level_code_ofs -extern: defevar: level_code_len -extern: defevar: max_level -extern: defevar: start_level -extern: defevar: game_state /* keyboard flags */ extern: defevar: key_quit, key_start, key_restart @@ -33,17 +28,24 @@ extern: defevar: key_take, key_use, key_minimap extern: defevar: key_fall_cheat, key_walk_cheat extern: defevar: key_plev_cheat, key_nlev_cheat -/* map dimensions */ +/* misc info */ +extern: defevar: max_level +extern: defevar: start_level +extern: defevar: game_state + +/* current level */ +extern: defevar: cur_level +/* level info */ +extern: defevar: level_code_ofs, level_code_len +extern: defevar: item_name_ofs, item_name_len +extern: defevar: level_backpic +/* map dimensions; better don't change */ extern: defevar: map_width, map_height -/* view port dimensions */ +/* view port dimensions (can't be changed) */ extern: defevar: vis_width, vis_height /* view port start */ extern: defevar: scr_x, scr_y -/* current level */ -extern: defevar: cur_level /* must be public global 'cause engine needs it */ extern: defevar: prof_item ; id of the item professor carrying - -extern: defevar: room_script_tid ; tid of the room local script diff --git a/asm/imports/rst.awa b/asm/imports/rst.awa index e7a4dc1..40caacf 100644 --- a/asm/imports/rst.awa +++ b/asm/imports/rst.awa @@ -17,7 +17,14 @@ extern: const: FRST_ML_TITLE extern: const: FRST_ML_GAME extern: const: FRST_MINIMAP -extern: const: FRST_LOAD_LEVEL +extern: const: FRST_OPEN_LEVEL_FILE +extern: const: FRST_GET_LEVEL_DATA_SIZE +extern: const: FRST_GET_LEVEL_LOADER +extern: const: FRST_GET_LEVEL_INITER +extern: const: FRST_GET_LEVEL_FILE_BYTE +extern: const: FRST_GET_LEVEL_FILE_WORD +extern: const: FRST_SET_LEVEL_SIZE +extern: const: FRST_SET_LEVEL_NAME extern: const: FRST_GET_MAX_THREADS extern: const: FRST_GET_MAX_THREAD_ID diff --git a/asm/imports/tvars.awa b/asm/imports/tvars.awa index 9e97929..15e09f6 100644 --- a/asm/imports/tvars.awa +++ b/asm/imports/tvars.awa @@ -25,6 +25,8 @@ extern: defetvar: pos_tx, pos_ty ; pixel offset from the current map tile extern: defetvar: animated extern: defetvar: afirst_frame, alast_frame, aframe +extern: deftvar: prof_dir ; used everywhere (PDIR_XXX) + ; for items extern: deftvar: activated extern: deftvar: fall_count diff --git a/asm/items/items.awa b/asm/items/items.awa index 9ed83e7..b65c3af 100644 --- a/asm/items/items.awa +++ b/asm/items/items.awa @@ -226,3 +226,61 @@ entry_item: bsr ; end + + +proc: set_item_name_vars +arg: .item_id +locals: .addr, .type + set [.addr], item_names +.loop: + rxc [.addr], [.type] + add [.addr], 1 + jeq .not_found, [.type], 255 + jne .bad_type, [.type], [.item_id] + ; found + set [item_name_ofs], [.addr] + set [item_name_len], -1 + ret +.bad_type: + rxc [.addr], [.type] + add [.addr], 1 + jeq .loop, [.type], 0 + jmp .bad_type +.not_found: + set [item_name_ofs], 0 + set [item_name_len], 0 + ret +endp: set_item_name_vars + +item_names: + db: ITEM_KEY + dz: "key" + ; + db: ITEM_FAN + dz: "fan" + ; + db: ITEM_DYNAMITE + dz: "bomb" + ; + db: ITEM_DRILL + dz: "drill" + ; + db: ITEM_UMBRELLA + dz: "umbrella" + ; + db: ITEM_HARRY + dz: "harry" + ; + db: ITEM_ROCKET + dz: "rocket" + ; + db: ITEM_APPLE + dz: "apple" + ; + db: ITEM_VIAL + dz: "vial" + ; + db: ITEM_GLOVES + dz: "gloves" + ; + db: 255 diff --git a/src/game.h b/asm/loaders.awa similarity index 79% copy from src/game.h copy to asm/loaders.awa index d63a87c..af67b58 100644 --- a/src/game.h +++ b/asm/loaders.awa @@ -12,17 +12,4 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef _GAME_H_ -#define _GAME_H_ - -#include "SDL.h" - - -extern void setMainLoopGame (void); - -extern int loadLevel (int lidx); - -extern void activateMinimap (void); - - -#endif +include: loaders/avishlevel.awa diff --git a/asm/loaders/avishlevel.awa b/asm/loaders/avishlevel.awa new file mode 100644 index 0000000..4bb37cd --- /dev/null +++ b/asm/loaders/avishlevel.awa @@ -0,0 +1,133 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +/* loader for the original Avish level format */ +/* warning: no checks are made, so don't try to load invalid levels! */ + +proc: avish_level_loader +arg: .level_idx +locals: .pos, .x, .y, .item_count +locals: .fframe, .lframe, .frame, .animated, .type, .tid + rst FRST_OPEN_LEVEL_FILE, [.level_idx] + ; set level name + rst FRST_GET_LEVEL_FILE_BYTE, 0 ; name length + rst FRST_SET_LEVEL_NAME, -2, [rst_result] + ; set level size + rst FRST_SET_LEVEL_SIZE, 44, 41 ; standard Avish level size + ; set backpic + rst FRST_GET_LEVEL_FILE_BYTE, 25 + set [level_backpic], [rst_result] + ; set prof position + rst FRST_GET_LEVEL_FILE_BYTE, 27 + set [pos_x], [rst_result] + rst FRST_GET_LEVEL_FILE_BYTE, 28 + set [pos_y], [rst_result] + ; set viewport position + rst FRST_GET_LEVEL_FILE_BYTE, 29 + set [pos_x], [rst_result] + rst FRST_GET_LEVEL_FILE_BYTE, 30 + set [pos_y], [rst_result] + ; + set [.pos], 31 + ; load background tiles + set [.x], 1 +.backtiles_col_loop: + set [.y], 0 +.backtiles_row_loop: + rst FRST_GET_LEVEL_FILE_BYTE, [.pos] + add [.pos], 1 + msb [.x], [.y], [rst_result] + add [.y], 1 + jlt .backtiles_row_loop, [.y], [map_height] + add [.x], 1 + jlt .backtiles_col_loop, [.y], [map_width] + ; load foreground tiles + set [.x], 1 +.foretiles_col_loop: + set [.y], 0 +.foretiles_row_loop: + rst FRST_GET_LEVEL_FILE_BYTE, [.pos] + add [.pos], 1 + msb [.x], [.y], [rst_result] + add [.y], 1 + jlt .foretiles_row_loop, [.y], [map_height] + add [.pos], 3 ; skip 3 unknown bytes + add [.x], 1 + jlt .foretiles_col_loop, [.y], [map_width] + ; load items + rst FRST_GET_LEVEL_FILE_BYTE, [.pos] + add [.pos], 1 + add [rst_result], 1, [.item_count] +.item_loop: + ; x + rst FRST_GET_LEVEL_FILE_BYTE, [.pos] + add [.pos], 1 + set [.x], [rst_result] + ; y + rst FRST_GET_LEVEL_FILE_BYTE, [.pos] + add [.pos], 1 + set [.y], [rst_result] + ; fframe + rst FRST_GET_LEVEL_FILE_BYTE, [.pos] + add [.pos], 1 + set [.fframe], [rst_result] + ; lframe + rst FRST_GET_LEVEL_FILE_BYTE, [.pos] + add [.pos], 1 + set [.lframe], [rst_result] + ; frame + rst FRST_GET_LEVEL_FILE_BYTE, [.pos] + add [.pos], 1 + set [.frame], [rst_result] + ; animated + rst FRST_GET_LEVEL_FILE_BYTE, [.pos] + add [.pos], 1 + set [.animated], [rst_result] + jne .item_anim_nofix, [.animated], 0 + set [.frame], [.fframe] +.item_anim_nofix: + ; skip 0xff + add [.pos], 1 + ; + ; skip 4 unknown bytes + add [.pos], 4 + ; item type + rst FRST_GET_LEVEL_FILE_BYTE, [.pos] + add [.pos], 1 + set [.type], [rst_result] + ; spawn and initialize item thread + new entry_item, [.tid] + set item_id, [.type], [.tid] + set animated, [.animated], [.tid] + set afirst_frame, [.fframe], [.tid] + set alast_frame, [.lframe], [.tid] + set aframe, [.frame], [.tid] + set spr_num, [.frame], [.tid] + jne .no_fix_aframe, [.type], ITEM_HARRY + sub [.pos], 6 + rst FRST_GET_LEVEL_FILE_BYTE, [.pos] + add [.pos], 6 + set aframe, [rst_result], [.tid] + set spr_num, [rst_result], [.tid] +.no_fix_aframe: + set pos_x, [.x], [.tid] + set pos_y, [.y], [.tid] + set spr_bank, BANK_ITEMS, [.tid] + set spr_dir, DIR_LEFT, [.tid] + ; + sub [.item_count], 1 + jgt .item_loop, [.item_count], 0 + ; + ret +endp: avish_level_loader diff --git a/asm/mapscripts/level01.awa b/asm/mapscripts/level01.awa index b3f2401..dd50a02 100644 --- a/asm/mapscripts/level01.awa +++ b/asm/mapscripts/level01.awa @@ -1,22 +1,21 @@ include: ../imports.awa -public: entry_local_room_script: +proc: entry_local_room_onload: ; move first item to player rst FRST_GET_RAND rst FRST_DEBUG_PRINT_NUM, [rst_result] rst FRST_DEBUG_PRINT_STR, -10 - + ; bsr first_to_me - - set [room_script_tid], -1 - end + ret +endp: entry_local_room_onload: -eproc: entry_local_room_script_unload +eproc: entry_local_room_script_onunload rst FRST_DEBUG_PRINT_STR, .msg_unloading ret .msg_unloading: dz: "MESSAGE: unloading map script.\n" -endp: entry_local_room_script_unload +endp: entry_local_room_script_onunload proc: first_to_me diff --git a/asm/title.awa b/asm/title.awa index 9a62245..5fef2bf 100644 --- a/asm/title.awa +++ b/asm/title.awa @@ -51,7 +51,7 @@ entry_title: jge .title_fadeout_loop, [title_phase], 0 .title_done: - jmp entry_game_start + jmp entry_game_initialize quit_program: end diff --git a/src/awish.c b/src/awish.c index bc172fa..a3addb6 100644 --- a/src/awish.c +++ b/src/awish.c @@ -209,12 +209,6 @@ static int awishRST (int tid, int opcode, int argc, int argv[], int *argp[]) { setMainLoopTitle(); } else if (argv[0] == CONST_FRST_ML_GAME) { setMainLoopGame(); - } else if (argv[0] == CONST_FRST_MINIMAP) { - activateMinimap(); - } else if (argv[0] == CONST_FRST_LOAD_LEVEL) { - // levelnum - if (vmLoadArgs(tid, 2, argv, argp, argc, argv, argp) != 0) fatal("out of args"); - vmGVars[GVAR_RST_RESULT] = loadLevel(argv[1]); } else if (argv[0] == CONST_FRST_GET_MAX_THREADS) { vmGVars[GVAR_RST_RESULT] = VM_MAX_THREADS; } else if (argv[0] == CONST_FRST_GET_MAX_THREAD_ID) { @@ -271,9 +265,10 @@ dolen: if (pos >= 0) { case 3: if (goobers) fprintf(stderr, "%d,%d", argv[1], argv[2]); break; } } else { + if (gameRSTCB) return gameRSTCB(tid, opcode, argc, argv, argp); fatal("invalid RST: %d", argv[0]); } - return 0; + return 0; // continue } diff --git a/src/game.c b/src/game.c index a51ef2e..4d5dbfb 100644 --- a/src/game.c +++ b/src/game.c @@ -33,8 +33,10 @@ extern int goobers; //////////////////////////////////////////////////////////////////////////////// -#define MAP_WIDTH (44) -#define MAP_HEIGHT (41) +VMRSTCB gameRSTCB = NULL; + + +//////////////////////////////////////////////////////////////////////////////// #define VIS_WIDTH (15) #define VIS_HEIGHT (17) #define VIS_X (10) @@ -42,55 +44,16 @@ extern int goobers; //////////////////////////////////////////////////////////////////////////////// -static const char *itemNames[] = { - "", - "key", - "fan", - "dynamite", - "drill", - "umbrella", - "monster", - "rocket", - "apple", - "vial", - "gloves" -}; - - -enum { - ITEM_NOTHING, - ITEM_KEY, - ITEM_FAN, - ITEM_DYNAMITE, - ITEM_DRILL, - ITEM_UMBRELLA, - ITEM_HARRY, - ITEM_ROCKET, - ITEM_APPLE, - ITEM_VIAL, - ITEM_GLOVES, - ITEM_MAX -}; - - -typedef struct { - int type; // 0: inactive - int x, y; // in map - int frame; // animation frame - int fframe, lframe; // first and last anim frame - int animated; - int tid; -} Item; - - -//////////////////////////////////////////////////////////////////////////////// +static int mapWidth; +static int mapHeight; static int curLevel; static char levelname[257]; static int lnamex; static int levelback; -static Uint8 bmap[MAP_HEIGHT][MAP_WIDTH]; -static Uint8 fmap[MAP_HEIGHT][MAP_WIDTH]; -static Uint8 xflags[MAP_WIDTH]; +static Uint8 *levelData = NULL; +static int levelDataSize = 0; +static Uint8 *bmap = NULL, *fmap = NULL; +static Uint8 *xflags = NULL; static int fkeys[10]; static int inMinimap; @@ -133,46 +96,6 @@ static void setGameKeysGVars (void) { //////////////////////////////////////////////////////////////////////////////// -#define ROOM_SCRIPTS_MARK " room script labels starts here " - - -static void loadMapScript (ResFile *resfile) { - VMLabelInfo *l; - int csz, tid; - // - vmGVars[GVAR_ROOM_SCRIPT_TID] = -1; - l = vmLabelAddMark(ROOM_SCRIPTS_MARK); - l->value = vmCodeSize; - if ((csz = loadCodeFile(resfile, vmCodeSize, 94+curLevel)) > 1) { - VMLabelInfo *l = vmFindLabel("entry_local_room_script"); - // - if (l != NULL && l->type == LB_CODE) { - vmCodeSize += csz; - tid = vmNewThread(l->value); - vmGVars[GVAR_ROOM_SCRIPT_TID] = tid; - if (goobers) fprintf(stderr, "local room script loaded and initialized\n"); - } - } -} - - -static void unloadMapScript (void) { - VMLabelInfo *l; - // - while ((l = vmFindMark(ROOM_SCRIPTS_MARK)) != NULL) { - VMLabelInfo *ucl = vmFindLabel("entry_local_room_script_unload"); - // - if (ucl != NULL && ucl->type == LB_CODE) { - vmExecuteBSR(0, ucl->value, 0); - } - // - vmCodeSize = l->value; - vmFreeLabelsUntilMark(ROOM_SCRIPTS_MARK); - } -} - - -//////////////////////////////////////////////////////////////////////////////// #define SECRET (42) //#define SECRET (0) @@ -491,13 +414,6 @@ error: } -// CODE_GAME_RESTART_LEVEL -// GVAR_GAME_STATE -// CONST_GAME_STATE_DEAD -// CONST_GAME_STATE_COMPLETE -// CONST_GAME_STATE_STARTED -// CONST_GAME_STATE_PLAYING -// GVAR_CUR_LEVEL static inline int isGameStopped (void) { return vmGVars[GVAR_GAME_STATE] == CONST_GAME_STATE_DEAD || @@ -506,7 +422,7 @@ static inline int isGameStopped (void) { static void demoCB (void) { - if (vmGVars[GVAR_GAME_STATE] == CONST_GAME_STATE_STARTED) unloadMapScript(); + //if (vmGVars[GVAR_GAME_STATE] == CONST_GAME_STATE_STARTED) unloadMapScript(); // switch (demorecmode) { case -666: // prepare to load demo @@ -517,7 +433,7 @@ static void demoCB (void) { demorecmode = -2; // fallthru case 666: // prepare to save demo - vmSetPC(0, CODE_GAME_RESTART_LEVEL); + vmSetPC(0, CODE_ENTRY_GAME_RESTART_LEVEL); vmGVars[GVAR_CUR_LEVEL] = curLevel; vmGVars[GVAR_GAME_STATE] = -1; // invalid state if (demorecmode > 0) { @@ -669,133 +585,38 @@ static void frmGameKey (SDL_KeyboardEvent *key) { //////////////////////////////////////////////////////////////////////////////// -static int loadLevelInternal (ResFile *resfile, int lidx) { - Uint8 *lvl; - int sz, res = -1, pos; - static Item items[256]; - static int itemCount; - static int scrX, scrY; - static int profX, profY; - char buf[64]; - // - unloadMapScript(); - // - message[0] = 0; - // - vmGVars[GVAR_MAP_WIDTH] = MAP_WIDTH; - vmGVars[GVAR_MAP_HEIGHT] = MAP_HEIGHT; - vmGVars[GVAR_VIS_WIDTH] = VIS_WIDTH; - vmGVars[GVAR_VIS_HEIGHT] = VIS_HEIGHT; - // - if ((lvl = loadResFile(resfile, lidx+9, &sz)) == NULL) return -1; - if (sz < 3700) goto quit; - if (lvl[0] > 25) goto quit; - memset(levelname, 0, sizeof(levelname)); - if (lvl[0] > 0) memcpy(levelname, lvl+1, lvl[0]); - lnamex = (320-strlen(levelname)*8)/2; - sprintf(buf, "%d", lidx+1); - while (lnamex+strlen(levelname)*8+strlen(buf)*8+6*8 > 320) lnamex -= 8; - levelback = lvl[26]; - if (levelback < 1 || levelback > 7) levelback = 1; - profX = lvl[27]; - profY = lvl[28]; - vmSetTVar(0, TVAR_POS_X, profX); - vmSetTVar(0, TVAR_POS_Y, profY); - scrX = lvl[29]; - scrY = lvl[30]; if (scrY > 0) --scrY; - vmGVars[GVAR_SCR_X] = scrX; - vmGVars[GVAR_SCR_Y] = scrY; - pos = 31; - memset(bmap, 0, sizeof(bmap)); - memset(fmap, 0, sizeof(fmap)); - memset(xflags, 0, sizeof(xflags)); - for (int x = 1; x < MAP_WIDTH; ++x) { - for (int y = 0; y < MAP_HEIGHT; ++y) { - bmap[y][x] = lvl[pos++]; - } - } - for (int x = 1; x < MAP_WIDTH; ++x) { - for (int y = 0; y < MAP_HEIGHT; ++y) { - fmap[y][x] = lvl[pos++]; - } - pos += 3; // skip unknown bytes - } - // - itemCount = lvl[pos++]+1; // at least one item is always here - for (int f = 0; f < itemCount; ++f) { - int tid; - // - items[f].x = lvl[pos++]; - items[f].y = lvl[pos++]; - items[f].fframe = lvl[pos++]; - items[f].lframe = lvl[pos++]; - items[f].frame = lvl[pos++]; - items[f].animated = lvl[pos++]; - if (!items[f].animated) items[f].frame = items[f].fframe; - ++pos; // 0xff - pos += 4; // dunno - items[f].type = lvl[pos++]; - ++pos; // dunno - // spawn thread - tid = vmNewThread(CODE_ENTRY_ITEM); - if (tid < 0) goto quit; - vmSetTVar(tid, TVAR_ITEM_ID, items[f].type); - vmSetTVar(tid, TVAR_ANIMATED, items[f].animated); - vmSetTVar(tid, TVAR_AFIRST_FRAME, items[f].fframe); - vmSetTVar(tid, TVAR_ALAST_FRAME, items[f].lframe); - vmSetTVar(tid, TVAR_AFRAME, items[f].frame); - if (items[f].type == 6) vmSetTVar(tid, TVAR_AFRAME, lvl[pos-6]); - vmSetTVar(tid, TVAR_POS_X, items[f].x); - vmSetTVar(tid, TVAR_POS_Y, items[f].y); - vmSetTVar(tid, TVAR_POS_TX, 0); - vmSetTVar(tid, TVAR_POS_TY, 0); - vmSetTVar(tid, TVAR_SPR_BANK, CONST_BANK_ITEMS); - vmSetTVar(tid, TVAR_SPR_NUM, items[f].frame); - vmSetTVar(tid, TVAR_SPR_DIR, 0); - } - curLevel = lidx; - inMinimap = 0; - doSave = 0; - res = 0; - // - loadMapScript(resfile); - // -quit: - free(lvl); - return res; -} - - -//////////////////////////////////////////////////////////////////////////////// static inline Uint8 fgTile (int x, int y) { - return (x >= 0 && y >= 0 && x < MAP_WIDTH && y < MAP_HEIGHT) ? fmap[y][x]&0x0f : 0; + return (x >= 0 && y >= 0 && x < mapWidth && y < mapHeight) ? fmap[y*mapWidth+x] : 0; } static inline Uint8 bgTile (int x, int y) { - if (y == -666) return (x >= 0 && x < MAP_WIDTH) ? xflags[x] : 0; - return (x >= 0 && y >= 0 && x < MAP_WIDTH && y < MAP_HEIGHT) ? bmap[y][x]&0x0f : 0; + if (y == -666) return (x >= 0 && x < mapWidth) ? xflags[x] : 0; + return (x >= 0 && y >= 0 && x < mapWidth && y < mapHeight) ? bmap[y*mapWidth+x] : 0; } -static int mapGet (int tid, int fg, int x, int y) { - return fg ? fgTile(x, y) : bgTile(x, y); +static inline void setFGTile (int x, int y, Uint8 tile) { + if (x >= 0 && y >= 0 && x < mapWidth && y < mapHeight) fmap[y*mapWidth+x] = tile; } -static inline void setFGTile (int x, int y, Uint8 tile) { - if (x >= 0 && y >= 0 && x < MAP_WIDTH && y < MAP_HEIGHT) fmap[y][x] = (fmap[y][x]&0xf0)|(tile&0x0f); +static inline void setBGTile (int x, int y, Uint8 tile) { + if (y == -666 && x >= 0 && x < mapWidth) xflags[x] = tile; + if (x >= 0 && y >= 0 && x < mapWidth && y < mapHeight) bmap[y*mapWidth+x] = tile; } -static inline void setBGTile (int x, int y, Uint8 tile) { - if (y == -666 && x >= 0 && x < MAP_WIDTH) xflags[x] = tile; - if (x >= 0 && y >= 0 && x < MAP_WIDTH && y < MAP_HEIGHT) bmap[y][x] = (bmap[y][x]&0xf0)|(tile&0x0f); +static int mapGet (int tid, int fg, int x, int y) { + if (fmap != NULL) return fg ? fgTile(x, y) : bgTile(x, y); + return 0; } static void mapSet (int tid, int fg, int x, int y, int tile) { - if (fg) setFGTile(x, y, tile); else setBGTile(x, y, tile); + if (fmap != NULL) { + if (fg) setFGTile(x, y, tile); else setBGTile(x, y, tile); + } } @@ -815,8 +636,8 @@ static void levelDrawMap (SDL_Surface *frame) { } } } else { - for (int dy = 0; dy < MAP_HEIGHT; ++dy) { - for (int dx = 1; dx < MAP_WIDTH; ++dx) { + for (int dy = 0; dy < mapHeight; ++dy) { + for (int dx = 1; dx < mapWidth; ++dx) { Uint8 b = bgTile(dx, dy), f = fgTile(dx, dy), t = 8; // if (f == 0) { @@ -826,6 +647,8 @@ static void levelDrawMap (SDL_Surface *frame) { } if (banks[CONST_BANK_MAP_TILES].spr[t][0]) { blitSurface2x(frame, VIS_X+dx*6, VIS_Y+dy*4, banks[CONST_BANK_MAP_TILES].spr[t][0]); + } else { + blitSurface2x(frame, VIS_X+dx*6, VIS_Y+dy*4, banks[CONST_BANK_MAP_TILES].spr[0][0]); } } } @@ -876,7 +699,7 @@ static void levelDrawSprites (SDL_Surface *frame) { for (int f = 1; f < VM_MAX_THREADS; ++f) { if (vmIsThreadAlive(f) && !vmIsSuspendedThread(f)) { int i = vmGetTVar(f, TVAR_ITEM_ID); - if (i > 0 && i < ITEM_MAX) { + if (i > 0 && i <= 255) { SDL_Surface *sf = banks[CONST_BANK_MAP_ITEMS].spr[i][0]; int x = vmGetTVar(f, TVAR_POS_X); int y = vmGetTVar(f, TVAR_POS_Y); @@ -893,6 +716,7 @@ static void levelDrawCode (SDL_Surface *frame) { int pos = vmGVars[GVAR_LEVEL_CODE_OFS], len = vmGVars[GVAR_LEVEL_CODE_LEN], x; char buf[128]; // + if (len > 255) len = 255; if (pos < 0 || len < 1 || pos+len > vmCodeSize) return; x = 320-len*8; sprintf(buf, "%d", curLevel); @@ -901,6 +725,15 @@ static void levelDrawCode (SDL_Surface *frame) { } +static void levelDrawItemName (SDL_Surface *frame) { + int pos = vmGVars[GVAR_ITEM_NAME_OFS], len = vmGVars[GVAR_ITEM_NAME_LEN], x = 0; + // + if (pos < 0) return; + if (len < 0 || len > 32) len = 32; + for (; len > 0 && pos < vmCodeSize && vmCode[pos]; x += 8, ++pos, --len) drawChar(frame, vmCode[pos], x, 0, 3); +} + + static void levelDrawMisc (SDL_Surface *frame) { if (demorecmode < 0) { if (SDL_GetTicks()%1000 < 500) drawChar(frame, 'R', 0, 8, 3); @@ -946,8 +779,6 @@ static void drawSpriteBank (SDL_Surface *frame, SpriteBank *bank) { static void frmGameDraw (SDL_Surface *frame) { SDL_Rect rc; - char buf[8]; - int pi; // if (vmPaused && doSave) { if (doSave < 0) { @@ -962,15 +793,23 @@ static void frmGameDraw (SDL_Surface *frame) { SDL_SetClipRect(frame, NULL); // if (curLevel >= 0) { + char buf[8]; + //int pi; + // if (!inMinimap) { + int levelback = vmGVars[GVAR_LEVEL_BACKPIC]; + // + if (levelback < 1 || levelback > 7) levelback = 1; blitSurface(frame, 0, 0, backs[levelback]); } else { blitSurface(frame, 0, 0, backs[1]); } drawString(frame, levelname, lnamex, 0, 0x76); + levelDrawItemName(frame); levelDrawCode(frame); levelDrawMisc(frame); // + /* pi = vmGVars[GVAR_PROF_ITEM]; if (vmIsThreadAlive(pi) && vmIsSuspendedThread(pi)) { pi = vmGetTVar(pi, TVAR_ITEM_ID); @@ -978,6 +817,7 @@ static void frmGameDraw (SDL_Surface *frame) { drawString(frame, itemNames[pi], 0, 0, 1); } } + */ // sprintf(buf, "%d", curLevel+1); drawString(frame, buf, 320-strlen(buf)*8, 0, 1); @@ -1010,13 +850,64 @@ static void frmGameDraw (SDL_Surface *frame) { //////////////////////////////////////////////////////////////////////////////// -int loadLevel (int lidx) { +#define ROOM_SCRIPTS_MARK " room script labels starts here " + + +static void loadMapScript (ResFile *resfile) { + VMLabelInfo *l; + int csz; + // + l = vmLabelAddMark(ROOM_SCRIPTS_MARK); + l->value = vmCodeSize; + if ((csz = loadCodeFile(resfile, vmCodeSize, 94+curLevel)) > 1) { + vmCodeSize += csz; + } +} + + +static void unloadMapScript (void) { + VMLabelInfo *l, *ucl; + // + while ((l = vmFindMark(ROOM_SCRIPTS_MARK)) != NULL) { + ucl = vmFindLabel("entry_local_room_script_onunload"); + if (ucl != NULL && ucl->type == LB_CODE) vmExecuteBSR(0, ucl->value, 0); + vmCodeSize = l->value; + vmFreeLabelsUntilMark(ROOM_SCRIPTS_MARK); + } + // + ucl = vmFindLabel("entry_room_onunload"); + if (ucl != NULL && ucl->type == LB_CODE) vmExecuteBSR(0, ucl->value, 0); +} + + +//////////////////////////////////////////////////////////////////////////////// +static int loadLevelInternal (ResFile *resfile, int lidx) { + message[0] = 0; + unloadMapScript(); + // + vmGVars[GVAR_VIS_WIDTH] = VIS_WIDTH; + vmGVars[GVAR_VIS_HEIGHT] = VIS_HEIGHT; + vmGVars[GVAR_ITEM_NAME_OFS] = 0; + vmGVars[GVAR_ITEM_NAME_LEN] = 0; + levelname[0] = 0; + levelback = 1; + // + if (levelData != NULL) free(levelData); levelData = NULL; levelDataSize = 0; + if (bmap != NULL) free(bmap); bmap = NULL; + if (fmap != NULL) free(fmap); fmap = NULL; + if (xflags != NULL) free(xflags); xflags = NULL; + // + curLevel = -1; if (lidx < 0 || lidx > 73) return -1; - return loadLevelInternal(&resfile, lidx); + if ((levelData = loadResFile(resfile, lidx+9, &levelDataSize)) == NULL) return -1; + curLevel = lidx; + loadMapScript(resfile); + return levelDataSize; } -void activateMinimap (void) { +//////////////////////////////////////////////////////////////////////////////// +static void activateMinimap (void) { inMinimap = 1; vmPaused = 1; doSave = 0; @@ -1024,9 +915,86 @@ void activateMinimap (void) { //////////////////////////////////////////////////////////////////////////////// +static int gameRST (int tid, int opcode, int argc, int argv[], int *argp[]) { + if (argv[0] == CONST_FRST_MINIMAP) { + activateMinimap(); + } else if (argv[0] == CONST_FRST_OPEN_LEVEL_FILE) { + // levelnum + //if (vmLoadArgs(tid, 2, argv, argp, argc, argv, argp) != 0) fatal("out of args"); + if (argc < 2) fatal("out of args in FRST_LOAD_LEVEL"); + vmGVars[GVAR_RST_RESULT] = loadLevelInternal(&resfile, argv[1]); + if (goobers) fprintf(stderr, "FRST_OPEN_LEVEL_FILE(%d): %d\n", argv[1], vmGVars[GVAR_RST_RESULT]); + } else if (argv[0] == CONST_FRST_GET_LEVEL_DATA_SIZE) { + vmGVars[GVAR_RST_RESULT] = levelDataSize; + } else if (argv[0] == CONST_FRST_GET_LEVEL_LOADER) { + VMLabelInfo *ucl = vmFindLabel("entry_local_room_loader"); + // + vmGVars[GVAR_RST_RESULT] = (ucl != NULL && ucl->type == LB_CODE) ? ucl->value : -1; + } else if (argv[0] == CONST_FRST_GET_LEVEL_INITER) { + VMLabelInfo *ucl = vmFindLabel("entry_local_room_onload"); + // + vmGVars[GVAR_RST_RESULT] = (ucl != NULL && ucl->type == LB_CODE) ? ucl->value : -1; + } else if (argv[0] == CONST_FRST_GET_LEVEL_FILE_BYTE) { + if (argc < 2) fatal("out of args in FRST_GET_LEVEL_FILE_BYTE"); + if (argv[1] < 0 || argv[1] >= levelDataSize) fatal("invalid offset in FRST_GET_LEVEL_FILE_BYTE: %d", argv[1]); + vmGVars[GVAR_RST_RESULT] = levelData[argv[1]]; + } else if (argv[0] == CONST_FRST_GET_LEVEL_FILE_WORD) { + if (argc < 2) fatal("out of args in FRST_GET_LEVEL_FILE_WORD"); + if (argv[1] < 0 || argv[1]+1 >= levelDataSize) fatal("invalid offset in FRST_GET_LEVEL_FILE_WORD: %d", argv[1]); + vmGVars[GVAR_RST_RESULT] = levelData[argv[1]+1]; + vmGVars[GVAR_RST_RESULT] <<= 8; + vmGVars[GVAR_RST_RESULT] |= levelData[argv[1]]; + if (vmGVars[GVAR_RST_RESULT] >= 32768) vmGVars[GVAR_RST_RESULT] -= 65536; + } else if (argv[0] == CONST_FRST_SET_LEVEL_SIZE) { + if (argc != 3) fatal("out of args in FRST_SET_LEVEL_SIZE"); + if (argv[1] < 1 || argv[1] > 32700 || argv[2] < 1 || argv[2] > 32700) fatal("invalid dimensions in FRST_SET_LEVEL_SIZE: %dx%d", argv[1], argv[2]); + if (bmap != NULL) free(bmap); bmap = NULL; + if (fmap != NULL) free(fmap); fmap = NULL; + if (xflags != NULL) free(xflags); xflags = NULL; + fmap = calloc(1, argv[1]*argv[2]); if (fmap == NULL) fatal("out of memory in FRST_SET_LEVEL_SIZE"); + bmap = calloc(1, argv[1]*argv[2]); if (bmap == NULL) fatal("out of memory in FRST_SET_LEVEL_SIZE"); + xflags = calloc(1, argv[1]); if (xflags == NULL) fatal("out of memory in FRST_SET_LEVEL_SIZE"); + vmGVars[GVAR_MAP_WIDTH] = argv[1]; + vmGVars[GVAR_MAP_HEIGHT] = argv[2]; + } else if (argv[0] == CONST_FRST_SET_LEVEL_NAME) { + int pos = 0, len = sizeof(levelname)-1, lp = 0; + char buf[32]; + // + switch (argc) { + case 1: fatal("out of args in FRST_SET_LEVEL_NAME"); + case 2: pos = argv[1]; break; + case 3: pos = argv[1]; len = argv[2]; break; + } + memset(levelname, 0, sizeof(levelname)); + if (len > sizeof(levelname)-1) len = sizeof(levelname)-1; + if (pos > 0) { + while (len > 0 && pos < vmCodeSize && vmCode[pos]) { + levelname[lp++] = vmCode[pos++]; + --len; + } + } else { + pos = 0-pos+1; + while (len > 0 && pos < levelDataSize && levelData[pos]) { + levelname[lp++] = levelData[pos++]; + --len; + } + } + lnamex = (320-strlen(levelname)*8)/2; + sprintf(buf, "%d", curLevel+1); + while (lnamex+strlen(levelname)*8+strlen(buf)*8+6*8 > 320) lnamex -= 8; + } else { + if (gameRSTCB) return gameRSTCB(tid, opcode, argc, argv, argp); + fatal("invalid RST: %d", argv[0]); + } + return 0; // continue +} + + +//////////////////////////////////////////////////////////////////////////////// void setMainLoopGame (void) { frameCB = frmGameDraw; keyCB = frmGameKey; + gameRSTCB = gameRST; beforeVMCB = demoCB; vmMapGetCB = mapGet; vmMapSetCB = mapSet; diff --git a/src/game.h b/src/game.h index d63a87c..ff4389c 100644 --- a/src/game.h +++ b/src/game.h @@ -17,12 +17,13 @@ #include "SDL.h" +#include "vm.h" -extern void setMainLoopGame (void); -extern int loadLevel (int lidx); +extern VMRSTCB gameRSTCB; // argv[0] is ALWAYS fid + -extern void activateMinimap (void); +extern void setMainLoopGame (void); #endif diff --git a/src/title.c b/src/title.c index 202c367..f86247b 100644 --- a/src/title.c +++ b/src/title.c @@ -26,7 +26,6 @@ #include "game.h" - static void scrDrawCrashMask (SDL_Surface *frame, int phase) { if (phase <= 0) { SDL_Rect dst; @@ -72,6 +71,7 @@ static void frmTitleKey (SDL_KeyboardEvent *key) { void setMainLoopTitle (void) { frameCB = frmTitleDraw; keyCB = frmTitleKey; + gameRSTCB = NULL; beforeVMCB = NULL; vmMapGetCB = NULL; vmMapSetCB = NULL; diff --git a/src/vm.c b/src/vm.c index 54d17c2..e6f37cd 100644 --- a/src/vm.c +++ b/src/vm.c @@ -26,6 +26,9 @@ #define SECRET (42) +// should be enough for everyone! +#define MAX_INST_COUNT (1000000) + //extern int goobers; @@ -776,7 +779,7 @@ void vmExecuteAll (void) { // vmExecuted[t] = 1; runned = 1; - for (f = 1000000; f >= 0; --f) { + for (f = MAX_INST_COUNT; f >= 0; --f) { int res = vmExecuteOne(t); // if (res < 0) { @@ -807,7 +810,7 @@ int vmExecuteBSR (int tid, int pc, int maxinst) { opc = vmThreads[tid].pc; vmPush(tid, -666666); vmThreads[tid].pc = pc; - if (maxinst == 0) maxinst = 1000000; + if (maxinst == 0) maxinst = MAX_INST_COUNT; for (;;) { int res = vmExecuteOne(tid); // diff --git a/src/vm_gamelabels.h b/src/vm_gamelabels.h index 10681bf..ab40263 100644 --- a/src/vm_gamelabels.h +++ b/src/vm_gamelabels.h @@ -1,5 +1,4 @@ extern int CODE_ENTRY_GET_LEVEL_CODE; -extern int CODE_ENTRY_MAIN_INIT; extern int GVAR_TITLE_PHASE; extern int TVAR_AFRAME; extern int TVAR_ALAST_FRAME; @@ -14,15 +13,22 @@ extern int TVAR_SPR_DIR; extern int TVAR_SPR_NUM; extern int TVAR_SPR_BANK; extern int TVAR_ITEM_ID; -extern int GVAR_ROOM_SCRIPT_TID; extern int GVAR_PROF_ITEM; -extern int GVAR_CUR_LEVEL; extern int GVAR_SCR_Y; extern int GVAR_SCR_X; extern int GVAR_VIS_HEIGHT; extern int GVAR_VIS_WIDTH; extern int GVAR_MAP_HEIGHT; extern int GVAR_MAP_WIDTH; +extern int GVAR_LEVEL_BACKPIC; +extern int GVAR_ITEM_NAME_LEN; +extern int GVAR_ITEM_NAME_OFS; +extern int GVAR_LEVEL_CODE_LEN; +extern int GVAR_LEVEL_CODE_OFS; +extern int GVAR_CUR_LEVEL; +extern int GVAR_GAME_STATE; +extern int GVAR_START_LEVEL; +extern int GVAR_MAX_LEVEL; extern int GVAR_KEY_NLEV_CHEAT; extern int GVAR_KEY_PLEV_CHEAT; extern int GVAR_KEY_WALK_CHEAT; @@ -37,11 +43,6 @@ extern int GVAR_KEY_LEFT; extern int GVAR_KEY_RESTART; extern int GVAR_KEY_START; extern int GVAR_KEY_QUIT; -extern int GVAR_GAME_STATE; -extern int GVAR_START_LEVEL; -extern int GVAR_MAX_LEVEL; -extern int GVAR_LEVEL_CODE_LEN; -extern int GVAR_LEVEL_CODE_OFS; extern int GVAR_GOOBERS; extern int GVAR_RST_RESULT; extern int CONST_BANK_IM_PROF; @@ -64,10 +65,18 @@ extern int CONST_FRST_GET_SEED_H; extern int CONST_FRST_GET_RAND; extern int CONST_FRST_GET_MAX_THREAD_ID; extern int CONST_FRST_GET_MAX_THREADS; -extern int CONST_FRST_LOAD_LEVEL; +extern int CONST_FRST_SET_LEVEL_NAME; +extern int CONST_FRST_SET_LEVEL_SIZE; +extern int CONST_FRST_GET_LEVEL_FILE_WORD; +extern int CONST_FRST_GET_LEVEL_FILE_BYTE; +extern int CONST_FRST_GET_LEVEL_INITER; +extern int CONST_FRST_GET_LEVEL_LOADER; +extern int CONST_FRST_GET_LEVEL_DATA_SIZE; +extern int CONST_FRST_OPEN_LEVEL_FILE; extern int CONST_FRST_MINIMAP; extern int CONST_FRST_ML_GAME; extern int CONST_FRST_ML_TITLE; -extern int CODE_GAME_RESTART_LEVEL; -extern int CODE_ENTRY_ITEM; +extern int CODE_ENTRY_GAME_RESTART_LEVEL; +extern int CODE_ENTRY_GAME_INITIALIZE; extern int CODE_ENTRY_TITLE; +extern int CODE_ENTRY_MAIN_INIT; diff --git a/src/vm_gamelabelsdef.c b/src/vm_gamelabelsdef.c index 4fd7de2..9093763 100644 --- a/src/vm_gamelabelsdef.c +++ b/src/vm_gamelabelsdef.c @@ -1,5 +1,4 @@ int CODE_ENTRY_GET_LEVEL_CODE; -int CODE_ENTRY_MAIN_INIT; int GVAR_TITLE_PHASE; int TVAR_AFRAME; int TVAR_ALAST_FRAME; @@ -14,15 +13,22 @@ int TVAR_SPR_DIR; int TVAR_SPR_NUM; int TVAR_SPR_BANK; int TVAR_ITEM_ID; -int GVAR_ROOM_SCRIPT_TID; int GVAR_PROF_ITEM; -int GVAR_CUR_LEVEL; int GVAR_SCR_Y; int GVAR_SCR_X; int GVAR_VIS_HEIGHT; int GVAR_VIS_WIDTH; int GVAR_MAP_HEIGHT; int GVAR_MAP_WIDTH; +int GVAR_LEVEL_BACKPIC; +int GVAR_ITEM_NAME_LEN; +int GVAR_ITEM_NAME_OFS; +int GVAR_LEVEL_CODE_LEN; +int GVAR_LEVEL_CODE_OFS; +int GVAR_CUR_LEVEL; +int GVAR_GAME_STATE; +int GVAR_START_LEVEL; +int GVAR_MAX_LEVEL; int GVAR_KEY_NLEV_CHEAT; int GVAR_KEY_PLEV_CHEAT; int GVAR_KEY_WALK_CHEAT; @@ -37,11 +43,6 @@ int GVAR_KEY_LEFT; int GVAR_KEY_RESTART; int GVAR_KEY_START; int GVAR_KEY_QUIT; -int GVAR_GAME_STATE; -int GVAR_START_LEVEL; -int GVAR_MAX_LEVEL; -int GVAR_LEVEL_CODE_LEN; -int GVAR_LEVEL_CODE_OFS; int GVAR_GOOBERS; int GVAR_RST_RESULT; int CONST_BANK_IM_PROF; @@ -64,10 +65,18 @@ int CONST_FRST_GET_SEED_H; int CONST_FRST_GET_RAND; int CONST_FRST_GET_MAX_THREAD_ID; int CONST_FRST_GET_MAX_THREADS; -int CONST_FRST_LOAD_LEVEL; +int CONST_FRST_SET_LEVEL_NAME; +int CONST_FRST_SET_LEVEL_SIZE; +int CONST_FRST_GET_LEVEL_FILE_WORD; +int CONST_FRST_GET_LEVEL_FILE_BYTE; +int CONST_FRST_GET_LEVEL_INITER; +int CONST_FRST_GET_LEVEL_LOADER; +int CONST_FRST_GET_LEVEL_DATA_SIZE; +int CONST_FRST_OPEN_LEVEL_FILE; int CONST_FRST_MINIMAP; int CONST_FRST_ML_GAME; int CONST_FRST_ML_TITLE; -int CODE_GAME_RESTART_LEVEL; -int CODE_ENTRY_ITEM; +int CODE_ENTRY_GAME_RESTART_LEVEL; +int CODE_ENTRY_GAME_INITIALIZE; int CODE_ENTRY_TITLE; +int CODE_ENTRY_MAIN_INIT; diff --git a/src/vm_gamelabelsinit.c b/src/vm_gamelabelsinit.c index 7e136c1..70f56fd 100644 --- a/src/vm_gamelabelsinit.c +++ b/src/vm_gamelabelsinit.c @@ -1,5 +1,4 @@ CODE_ENTRY_GET_LEVEL_CODE = vmFindPC("entry_get_level_code"); - CODE_ENTRY_MAIN_INIT = vmFindPC("entry_main_init"); GVAR_TITLE_PHASE = vmFindGVarIndex("title_phase"); TVAR_AFRAME = vmFindTVarIndex("aframe"); TVAR_ALAST_FRAME = vmFindTVarIndex("alast_frame"); @@ -14,15 +13,22 @@ TVAR_SPR_NUM = vmFindTVarIndex("spr_num"); TVAR_SPR_BANK = vmFindTVarIndex("spr_bank"); TVAR_ITEM_ID = vmFindTVarIndex("item_id"); - GVAR_ROOM_SCRIPT_TID = vmFindGVarIndex("room_script_tid"); GVAR_PROF_ITEM = vmFindGVarIndex("prof_item"); - GVAR_CUR_LEVEL = vmFindGVarIndex("cur_level"); GVAR_SCR_Y = vmFindGVarIndex("scr_y"); GVAR_SCR_X = vmFindGVarIndex("scr_x"); GVAR_VIS_HEIGHT = vmFindGVarIndex("vis_height"); GVAR_VIS_WIDTH = vmFindGVarIndex("vis_width"); GVAR_MAP_HEIGHT = vmFindGVarIndex("map_height"); GVAR_MAP_WIDTH = vmFindGVarIndex("map_width"); + GVAR_LEVEL_BACKPIC = vmFindGVarIndex("level_backpic"); + GVAR_ITEM_NAME_LEN = vmFindGVarIndex("item_name_len"); + GVAR_ITEM_NAME_OFS = vmFindGVarIndex("item_name_ofs"); + GVAR_LEVEL_CODE_LEN = vmFindGVarIndex("level_code_len"); + GVAR_LEVEL_CODE_OFS = vmFindGVarIndex("level_code_ofs"); + GVAR_CUR_LEVEL = vmFindGVarIndex("cur_level"); + GVAR_GAME_STATE = vmFindGVarIndex("game_state"); + GVAR_START_LEVEL = vmFindGVarIndex("start_level"); + GVAR_MAX_LEVEL = vmFindGVarIndex("max_level"); GVAR_KEY_NLEV_CHEAT = vmFindGVarIndex("key_nlev_cheat"); GVAR_KEY_PLEV_CHEAT = vmFindGVarIndex("key_plev_cheat"); GVAR_KEY_WALK_CHEAT = vmFindGVarIndex("key_walk_cheat"); @@ -37,11 +43,6 @@ GVAR_KEY_RESTART = vmFindGVarIndex("key_restart"); GVAR_KEY_START = vmFindGVarIndex("key_start"); GVAR_KEY_QUIT = vmFindGVarIndex("key_quit"); - GVAR_GAME_STATE = vmFindGVarIndex("game_state"); - GVAR_START_LEVEL = vmFindGVarIndex("start_level"); - GVAR_MAX_LEVEL = vmFindGVarIndex("max_level"); - GVAR_LEVEL_CODE_LEN = vmFindGVarIndex("level_code_len"); - GVAR_LEVEL_CODE_OFS = vmFindGVarIndex("level_code_ofs"); GVAR_GOOBERS = vmFindGVarIndex("goobers"); GVAR_RST_RESULT = vmFindGVarIndex("rst_result"); CONST_BANK_IM_PROF = vmFindConst("bank_im_prof"); @@ -64,10 +65,18 @@ CONST_FRST_GET_RAND = vmFindConst("frst_get_rand"); CONST_FRST_GET_MAX_THREAD_ID = vmFindConst("frst_get_max_thread_id"); CONST_FRST_GET_MAX_THREADS = vmFindConst("frst_get_max_threads"); - CONST_FRST_LOAD_LEVEL = vmFindConst("frst_load_level"); + CONST_FRST_SET_LEVEL_NAME = vmFindConst("frst_set_level_name"); + CONST_FRST_SET_LEVEL_SIZE = vmFindConst("frst_set_level_size"); + CONST_FRST_GET_LEVEL_FILE_WORD = vmFindConst("frst_get_level_file_word"); + CONST_FRST_GET_LEVEL_FILE_BYTE = vmFindConst("frst_get_level_file_byte"); + CONST_FRST_GET_LEVEL_INITER = vmFindConst("frst_get_level_initer"); + CONST_FRST_GET_LEVEL_LOADER = vmFindConst("frst_get_level_loader"); + CONST_FRST_GET_LEVEL_DATA_SIZE = vmFindConst("frst_get_level_data_size"); + CONST_FRST_OPEN_LEVEL_FILE = vmFindConst("frst_open_level_file"); CONST_FRST_MINIMAP = vmFindConst("frst_minimap"); CONST_FRST_ML_GAME = vmFindConst("frst_ml_game"); CONST_FRST_ML_TITLE = vmFindConst("frst_ml_title"); - CODE_GAME_RESTART_LEVEL = vmFindPC("game_restart_level"); - CODE_ENTRY_ITEM = vmFindPC("entry_item"); + CODE_ENTRY_GAME_RESTART_LEVEL = vmFindPC("entry_game_restart_level"); + CODE_ENTRY_GAME_INITIALIZE = vmFindPC("entry_game_initialize"); CODE_ENTRY_TITLE = vmFindPC("entry_title"); + CODE_ENTRY_MAIN_INIT = vmFindPC("entry_main_init"); -- 2.11.4.GIT