diff --git a/main.c b/main.c index 531faa1..921cf18 100755 --- a/main.c +++ b/main.c @@ -248,7 +248,8 @@ typedef struct #define SFG_MENU_ITEM_PLAY 2 #define SFG_MENU_ITEM_LOAD 3 #define SFG_MENU_ITEM_SOUND 4 -#define SFG_MENU_ITEM_EXIT 5 +#define SFG_MENU_ITEM_SHEAR 5 +#define SFG_MENU_ITEM_EXIT 6 #define SFG_MENU_ITEM_NONE 255 @@ -295,8 +296,16 @@ struct uint8_t selectedLevel; ///< Level to play selected in the main menu. uint8_t antiSpam; ///< Prevents log message spamming. - uint8_t soundSettings; /**< Sound settings: LSB says whether SFX is on, - second LSB says whether music is on. */ + uint8_t settings; /**< Dynamic game settings (can be changed at runtime), + bit meaning: + + MSB -------- LSB + |||| + |||\_ sound (SFX) + ||\__ music + |\___ shearing + \____ freelook (shearing not sliding back) */ + uint8_t blink; ///< Says whether blinkg is currently on or off. } SFG_game; @@ -324,9 +333,6 @@ struct uint8_t ammo[SFG_AMMO_TOTAL]; - uint8_t freeLook; /**< If on, the vertical looking (shear) does - not automatically shear back. This is mainly - for mouse control. */ uint8_t cards; /**< Lowest 3 bits say which access cards have been taken., the next 3 bits say which cards should be blinking in the HUD. */ @@ -460,7 +466,7 @@ uint8_t SFG_random() void SFG_playGameSound(uint8_t soundIndex, uint8_t volume) { - if (!(SFG_game.soundSettings & 0x01)) + if (!(SFG_game.settings & 0x01)) return; uint8_t mask = 0x01 << soundIndex; @@ -1458,7 +1464,7 @@ void SFG_init() SFG_game.antiSpam = 0; - SFG_game.soundSettings = 0xff; + SFG_game.settings = 0xff; SFG_enableMusic(1); SFG_LOG("computing average texture colors") @@ -1513,7 +1519,6 @@ void SFG_init() SFG_game.lastFrameTimeMs = SFG_getTimeMs(); SFG_game.selectedMenuItem = 0; SFG_game.selectedLevel = 0; - SFG_player.freeLook = 0; #if SFG_START_LEVEL == 0 SFG_setGameState(SFG_GAME_STATE_MENU); @@ -2624,7 +2629,8 @@ void SFG_gameStepPlaying() int8_t shearing = 0; if (SFG_keyJustPressed(SFG_KEY_TOGGLE_FREELOOK)) - SFG_player.freeLook = !SFG_player.freeLook; + SFG_game.settings = + (~SFG_game.settings & 0x08) | (SFG_game.settings & ~0x08); #if SFG_PREVIEW_MODE == 0 if ( @@ -2760,89 +2766,61 @@ void SFG_gameStepPlaying() else if (SFG_keyJustPressed(SFG_KEY_PREVIOUS_WEAPON)) SFG_playerRotateWeapon(0); + uint8_t shearingOn = SFG_game.settings & 0x04; + if (SFG_keyIsDown(SFG_KEY_A)) { - if (SFG_keyIsDown(SFG_KEY_UP)) + if (shearingOn) // A + U/D: shearing (if on) { - SFG_player.camera.shear = - RCL_min(SFG_CAMERA_MAX_SHEAR_PIXELS, - SFG_player.camera.shear + SFG_CAMERA_SHEAR_STEP_PER_FRAME); + if (SFG_keyIsDown(SFG_KEY_UP)) + { + SFG_player.camera.shear = + RCL_min(SFG_CAMERA_MAX_SHEAR_PIXELS, + SFG_player.camera.shear + SFG_CAMERA_SHEAR_STEP_PER_FRAME); - shearing = 1; - } - else if (SFG_keyIsDown(SFG_KEY_DOWN)) - { - SFG_player.camera.shear = - RCL_max(-1 * SFG_CAMERA_MAX_SHEAR_PIXELS, - SFG_player.camera.shear - SFG_CAMERA_SHEAR_STEP_PER_FRAME); + shearing = 1; + } + else if (SFG_keyIsDown(SFG_KEY_DOWN)) + { + SFG_player.camera.shear = + RCL_max(-1 * SFG_CAMERA_MAX_SHEAR_PIXELS, + SFG_player.camera.shear - SFG_CAMERA_SHEAR_STEP_PER_FRAME); - shearing = 1; + shearing = 1; + } } if (!SFG_keyIsDown(SFG_KEY_C)) - { + { // A + L/R: strafing if (SFG_keyIsDown(SFG_KEY_LEFT)) strafe = -1; else if (SFG_keyIsDown(SFG_KEY_RIGHT)) strafe = 1; } - else - { - if (SFG_keyJustPressed(SFG_KEY_LEFT) || SFG_keyJustPressed(SFG_KEY_A)) - SFG_playerRotateWeapon(0); - else if (SFG_keyJustPressed(SFG_KEY_RIGHT) || - SFG_keyJustPressed(SFG_KEY_B)) - SFG_playerRotateWeapon(1); - } } - else + + if (SFG_keyIsDown(SFG_KEY_C)) // C + AL/BR: weapon switching { - if (!SFG_keyIsDown(SFG_KEY_C)) + if (SFG_keyJustPressed(SFG_KEY_LEFT) || SFG_keyJustPressed(SFG_KEY_A)) + SFG_playerRotateWeapon(0); + else if (SFG_keyJustPressed(SFG_KEY_RIGHT) || SFG_keyJustPressed(SFG_KEY_B)) + SFG_playerRotateWeapon(1); + } + else if (!SFG_keyIsDown(SFG_KEY_A)) // L/R: turning + { + if (SFG_keyIsDown(SFG_KEY_LEFT)) { - if (SFG_keyIsDown(SFG_KEY_LEFT)) - { - SFG_player.camera.direction -= SFG_PLAYER_TURN_UNITS_PER_FRAME; - recomputeDirection = 1; - } - else if (SFG_keyIsDown(SFG_KEY_RIGHT)) - { - SFG_player.camera.direction += SFG_PLAYER_TURN_UNITS_PER_FRAME; - recomputeDirection = 1; - } - } - else - { - if (SFG_keyJustPressed(SFG_KEY_LEFT) || - SFG_keyJustPressed(SFG_KEY_A)) - SFG_playerRotateWeapon(0); - else if (SFG_keyJustPressed(SFG_KEY_RIGHT) || - SFG_keyJustPressed(SFG_KEY_B)) - SFG_playerRotateWeapon(1); - } - - int16_t mouseX, mouseY; - - SFG_getMouseOffset(&mouseX,&mouseY); - - if (mouseX != 0 || mouseY != 0) - { - SFG_player.camera.direction += - (mouseX * SFG_MOUSE_SENSITIVITY_HORIZONTAL) / 128; - - if (SFG_player.freeLook) - SFG_player.camera.shear = - RCL_max(RCL_min( - SFG_player.camera.shear - (mouseY * SFG_MOUSE_SENSITIVITY_VERTICAL) - / 128, - SFG_CAMERA_MAX_SHEAR_PIXELS), - -1 * SFG_CAMERA_MAX_SHEAR_PIXELS); - + SFG_player.camera.direction -= SFG_PLAYER_TURN_UNITS_PER_FRAME; recomputeDirection = 1; } + else if (SFG_keyIsDown(SFG_KEY_RIGHT)) + { + SFG_player.camera.direction += SFG_PLAYER_TURN_UNITS_PER_FRAME; + recomputeDirection = 1; + } + } - if (recomputeDirection) - SFG_recomputePLayerDirection(); - + if (!SFG_keyIsDown(SFG_KEY_A) || !shearingOn) // U/D: movement if (SFG_keyIsDown(SFG_KEY_UP)) { moveOffset.x += SFG_player.direction.x; @@ -2859,8 +2837,30 @@ void SFG_gameStepPlaying() bobbing = 1; #endif } + + int16_t mouseX, mouseY; + + SFG_getMouseOffset(&mouseX,&mouseY); + + if (mouseX != 0) // mouse turning + { + SFG_player.camera.direction += + (mouseX * SFG_MOUSE_SENSITIVITY_HORIZONTAL) / 128; + + recomputeDirection = 1; } + if ((mouseY != 0) && shearingOn) // mouse shearing + SFG_player.camera.shear = + RCL_max(RCL_min( + SFG_player.camera.shear - + (mouseY * SFG_MOUSE_SENSITIVITY_VERTICAL) / 128, + SFG_CAMERA_MAX_SHEAR_PIXELS), + -1 * SFG_CAMERA_MAX_SHEAR_PIXELS); + + if (recomputeDirection) + SFG_recomputePLayerDirection(); + if (SFG_keyIsDown(SFG_KEY_STRAFE_LEFT)) strafe = -1; else if (SFG_keyIsDown(SFG_KEY_STRAFE_RIGHT)) @@ -2892,7 +2892,7 @@ void SFG_gameStepPlaying() (SFG_player.verticalSpeed - SFG_GRAVITY_SPEED_INCREASE_PER_FRAME); #endif - if (!shearing && SFG_player.camera.shear != 0 && !SFG_player.freeLook) + if (!shearing && SFG_player.camera.shear != 0 && !(SFG_game.settings & 0x08)) { // gradually shear back to zero @@ -3228,20 +3228,30 @@ void SFG_gameStepMenu() case SFG_MENU_ITEM_SOUND: SFG_LOG("sound changed"); - SFG_game.soundSettings++; + SFG_game.settings = + (SFG_game.settings & ~0x03) | ((SFG_game.settings + 1) & 0x03); + SFG_playGameSound(3,64); - if ((SFG_game.soundSettings & 0x02) != - ((SFG_game.soundSettings - 1) & 0x02)) - { - if (SFG_game.soundSettings & 0x02) - SFG_enableMusic(1); - else - SFG_enableMusic(0); - } - + if ((SFG_game.settings & 0x02) != + ((SFG_game.settings - 1) & 0x02)) + SFG_enableMusic(SFG_game.settings & 0x02); break; + case SFG_MENU_ITEM_SHEAR: + { + uint8_t current = (SFG_game.settings >> 2) & 0x03; + + current++; + + if (current == 2) // option that doesn't make sense, skip + current++; + + SFG_game.settings = + (SFG_game.settings & ~0x0c) | ((current & 0x03) << 2); + break; + } + default: break; } @@ -3739,7 +3749,8 @@ void SFG_drawMenu() SFG_drawText(text,drawX,y,SFG_FONT_SIZE_MEDIUM,textColor,0,0); - if ((item == SFG_MENU_ITEM_PLAY || item == SFG_MENU_ITEM_SOUND) && + if ((item == SFG_MENU_ITEM_PLAY || item == SFG_MENU_ITEM_SOUND + || item == SFG_MENU_ITEM_SHEAR) && ((i != SFG_game.selectedMenuItem) || SFG_game.blink)) { uint32_t x = @@ -3748,13 +3759,19 @@ void SFG_drawMenu() uint8_t c = 93; if (item == SFG_MENU_ITEM_PLAY) - SFG_drawNumber((SFG_game.selectedLevel + 1),x,y,SFG_FONT_SIZE_MEDIUM,c); + SFG_drawNumber(SFG_game.selectedLevel + 1,x,y,SFG_FONT_SIZE_MEDIUM,c); + else if (item == SFG_MENU_ITEM_SHEAR) + { + uint8_t n = (SFG_game.settings >> 2) & 0x03; + + SFG_drawNumber(n == 3 ? 2 : n,x,y,SFG_FONT_SIZE_MEDIUM,c); + } else { char settingText[3] = " "; - settingText[0] = (SFG_game.soundSettings & 0x01) ? 'S' : ' '; - settingText[1] = (SFG_game.soundSettings & 0x02) ? 'M' : ' '; + settingText[0] = (SFG_game.settings & 0x01) ? 'S' : ' '; + settingText[1] = (SFG_game.settings & 0x02) ? 'M' : ' '; SFG_drawText(settingText,x,y,SFG_FONT_SIZE_MEDIUM,c,0,0); } diff --git a/texts.h b/texts.h index 05e2b8b..71f6abb 100644 --- a/texts.h +++ b/texts.h @@ -21,6 +21,7 @@ SFG_PROGRAM_MEMORY char *SFG_menuItemTexts[] = "play level", "load", "sound", + "shear", "exit" };