From 10129f20f86ad6389e6e5bcd227850350fccc977 Mon Sep 17 00:00:00 2001 From: ketmar Date: Sun, 25 Mar 2012 14:42:01 +0300 Subject: [PATCH] fixed game logic bug with jumping; fixed demo saving --- asm/game.awa | 1 + asm/game/falling.awa | 1 + asm/game/frame_common.awa | 3 ++- asm/game/jumps.awa | 6 +++-- asm/game/loops_main.awa | 1 + src/game.c | 64 ++++++++++++++++++++++++++++++----------------- 6 files changed, 50 insertions(+), 26 deletions(-) diff --git a/asm/game.awa b/asm/game.awa index b4a5723..7311bde 100644 --- a/asm/game.awa +++ b/asm/game.awa @@ -162,6 +162,7 @@ entry_game_restart_level: @@: ; set [game_state], GAME_STATE_PLAYING + set [game_want_key], 0 brk ; give all threads a chance to initialize themselves ; jmp game_facing_loop_w2f diff --git a/asm/game/falling.awa b/asm/game/falling.awa index 2fc2bab..9e3e1da 100644 --- a/asm/game/falling.awa +++ b/asm/game/falling.awa @@ -283,6 +283,7 @@ locals: .sy, .type, .tid, .tmp bsr game_can_jump jeq .bounce_turns, 0 bsr game_do_jump + drp jmp .nospecials .bounce_turns: ; one more tile up diff --git a/asm/game/frame_common.awa b/asm/game/frame_common.awa index 010dbfc..9870b08 100644 --- a/asm/game/frame_common.awa +++ b/asm/game/frame_common.awa @@ -16,6 +16,8 @@ game_next_frame: ;jeq .no_minimap, [key_minimap], 0 ;set [key_minimap], 0 ;rst FRST_MINIMAP + brk + set [game_want_key], 0 ;.no_minimap: jeq .nomenu, [key_escape], 0 ; show menu @@ -52,7 +54,6 @@ game_next_frame: ; jne entry_game_restart_level, [key_restart], 0 ; - brk ret .wingame: diff --git a/asm/game/jumps.awa b/asm/game/jumps.awa index aff04bb..8de900d 100644 --- a/asm/game/jumps.awa +++ b/asm/game/jumps.awa @@ -59,7 +59,7 @@ locals: .ptr, .dx, .dy endp: game_jump_animation -game_do_jump: +proc: game_do_jump bsr prof_allowed_move_in_dir bsr game_can_jump jeq .nojump, 0 @@ -68,5 +68,7 @@ game_do_jump: bsr game_jump_animation ; slide? bsr game_check_do_slide + ret 1 .nojump: - ret + ret 0 +endp: game_do_jump diff --git a/asm/game/loops_main.awa b/asm/game/loops_main.awa index d274df0..85a5c4a 100644 --- a/asm/game/loops_main.awa +++ b/asm/game/loops_main.awa @@ -242,6 +242,7 @@ game_lr_stand_loop: .nowc: jeq .nojump, [key_up], 0 bsr game_do_jump + jne game_lr_stand_loop, 0 ; do it all again if there were no jump ; returns? can't jump .nojump: jeq .noturnface, [key_down], 0 diff --git a/src/game.c b/src/game.c index 151c7e2..676bee5 100644 --- a/src/game.c +++ b/src/game.c @@ -29,6 +29,9 @@ #include "polymod.h" +#define DEMO_COMPRESSION 1 + + extern int goobers; @@ -83,12 +86,15 @@ static int fkeys[10]; static void setGameKeysGVars (void) { if (!vmGVars[GVAR_IN_MENU]) { - vmGVars[GVAR_KEY_LEFT] = gamekeys[0] ? 1 : 0; - vmGVars[GVAR_KEY_RIGHT] = gamekeys[1] ? 1 : 0; - vmGVars[GVAR_KEY_UP] = gamekeys[2] ? 1 : 0; - vmGVars[GVAR_KEY_DOWN] = gamekeys[3] ? 1 : 0; - vmGVars[GVAR_KEY_TAKE] = gamekeys[4] ? 1 : 0; - vmGVars[GVAR_KEY_USE] = gamekeys[5] ? 1 : 0; + if (vmGVars[GVAR_GAME_WANT_KEY]) { + // update 'action' gvars only when prof is idle + vmGVars[GVAR_KEY_LEFT] = gamekeys[0] ? 1 : 0; + vmGVars[GVAR_KEY_RIGHT] = gamekeys[1] ? 1 : 0; + vmGVars[GVAR_KEY_UP] = gamekeys[2] ? 1 : 0; + vmGVars[GVAR_KEY_DOWN] = gamekeys[3] ? 1 : 0; + vmGVars[GVAR_KEY_TAKE] = gamekeys[4] ? 1 : 0; + vmGVars[GVAR_KEY_USE] = gamekeys[5] ? 1 : 0; + } // //vmGVars[GVAR_KEY_MINIMAP] = gamekeys[6] ? 1 : 0; //vmGVars[GVAR_KEY_RESTART] = gamekeys[7] ? 1 : 0; @@ -300,29 +306,22 @@ static void demoAddByte (Uint8 b) { static Uint8 demoGetKeyState (void) { - return - ((gamekeys[0]?1:0)<<0) | - ((gamekeys[1]?1:0)<<1) | - ((gamekeys[2]?1:0)<<2) | - ((gamekeys[3]?1:0)<<3) | - ((gamekeys[4]?1:0)<<4) | - ((gamekeys[5]?1:0)<<5); + Uint8 res = 0; + // + for (int f = 0; f <= 5; ++f) res |= (gamekeys[f] ? (1< demoSize) { demoClear(); @@ -358,6 +361,16 @@ static void demoGetFrameData (void) { --demoKeyStateRepeats; // demoSetKeyState(demoPrevKeyState); +#else + if (demoPos+1 > demoSize) { + demoClear(); + demorecmode = 0; + if (goobers) fprintf(stderr, "demo complete\n"); + strcpy(message, "demo stopped"); + return; + } + demoSetKeyState(demoData[demoPos++]); +#endif } @@ -436,14 +449,13 @@ error: static inline int isGameStopped (void) { - return - vmGVars[GVAR_GAME_STATE] == CONST_GAME_STATE_DEAD || - vmGVars[GVAR_GAME_STATE] == CONST_GAME_STATE_COMPLETE; + return vmGVars[GVAR_GAME_STATE] != CONST_GAME_STATE_PLAYING; } static void demoCB (void) { //if (vmGVars[GVAR_GAME_STATE] == CONST_GAME_STATE_STARTED) unloadMapScript(); + static int fcnt = 0; // if (vmGVars[GVAR_SCR_X] != oldScrX || vmGVars[GVAR_SCR_Y] != oldScrY) { oldScrX = vmGVars[GVAR_SCR_X]; @@ -451,6 +463,7 @@ static void demoCB (void) { redrawLevel = 1; } // + ++fcnt; switch (demorecmode) { case -666: // prepare to load demo if (demoLoad() != 0) { @@ -478,12 +491,13 @@ static void demoCB (void) { } else { if (vmGVars[GVAR_GAME_WANT_KEY]) { ((demorecmode < 0) ? demoGetFrameData : demoAddFrameData)(); + //fprintf(stderr, "fcnt: %d; data: %u\n", fcnt, demoGetKeyState()); } } break; case -2: // waiting for 'game started' trigger case 2: // waiting for 'game started' trigger - if (vmGVars[GVAR_GAME_STATE] >= 0) { + if (vmGVars[GVAR_GAME_STATE] == CONST_GAME_STATE_STARTED) { if (goobers) fprintf(stderr, "demo %s started...\n", demorecmode<0?"replaying":"recording"); if (demorecmode < 0) { // replay @@ -495,6 +509,10 @@ static void demoCB (void) { demo_m_z = getSeedH(); } demorecmode = (demorecmode < 0) ? -1 : 1; + fcnt = 0; + } else if (vmGVars[GVAR_GAME_STATE] >= 0) { + demoClear(); + demorecmode = 0; } break; } -- 2.11.4.GIT