diff --git a/TODO.txt b/TODO.txt index 6334ade..5f0f80a 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,21 +1,8 @@ general: -- try to make z-buffer 3 line instead of 1D, possibly like this (to keep - performance): - - at compile time selct X = power of 2 closest to vertical resolution - (or something like that) - - in pixel funct do something like - if (pixel->y % X == 0 && pixel->y != 0) - write to z-buffer -- let player start with 100 HP, but allow for collecting a higher amount, e.g. - up to 150. -- Add blinking: - - In menu, the selected level number should blink to indicate it can be - changed. - - Near locked door the specific unlocking card should blink on the HUD bar. - - Add setting SFG_BLINK_PERIOD to control blinking speed. - try to remove the debug flag (-g1) from compiler and see if it decreases size - port to GB Meta +- add enemy moving/dying sound - sounds (music?) - level 2D map (with revealing, bitmap), special key for quick displaying map - save/load (optional) @@ -64,6 +51,9 @@ level ideas: has to slowly kill, which means he has to first get rid of the other monsters. +- ceiling with "holes" through which sky (background) can be seen -- can be done + by having the ceiling texture set transparent and then alternating ceiling and + no ceiling - boss level: skyscraper top, player goes upwards in a spiral along the OUTSIDE side of the skyscraper - two levels could partially overlap, e.g. level one, a city, could overlap @@ -141,6 +131,7 @@ bugs: done: - add headbob +- add blinking - make zBuffer 8bit only? - texture coords of floor walls should start from the floor? NO, CAUSES ISSUES - vertical visual noise when standing on elevator @@ -161,4 +152,15 @@ done: check collisions for both player and monsters against this array (elevate these squares for collisions only) -- will also be faster - more level prop items +- let player start with 100 HP, but allow for collecting a higher amount, e.g. + up to 150. +- limit maximum ammo amounts +scratched: +- try to make z-buffer 3 line instead of 1D, possibly like this (to keep + performance): + - at compile time selct X = power of 2 closest to vertical resolution + (or something like that) + - in pixel funct do something like + if (pixel->y % X == 0 && pixel->y != 0) + write to z-buffer diff --git a/assets/levelY.gif b/assets/levelY.gif new file mode 100644 index 0000000..a73ba26 Binary files /dev/null and b/assets/levelY.gif differ diff --git a/constants.h b/constants.h index 84f0610..35b03b0 100644 --- a/constants.h +++ b/constants.h @@ -114,7 +114,12 @@ /** Maximum player health. */ -#define SFG_PLAYER_MAX_HEALTH 100 +#define SFG_PLAYER_MAX_HEALTH 150 + +/** + Start health of player. +*/ +#define SFG_PLAYER_START_HEALTH 100 /** At which value health indicator shows a warning (red color). @@ -166,6 +171,10 @@ #define SFG_AMMO_INCREASE_ROCKETS 5 #define SFG_AMMO_INCREASE_PLASMA 8 +#define SFG_AMMO_MAX_BULLETS 200 +#define SFG_AMMO_MAX_ROCKETS 100 +#define SFG_AMMO_MAX_PLASMA 150 + /** Duration of story text (intro/outro) in ms. */ @@ -355,6 +364,8 @@ #define SFG_HUD_BORDER_INDICATOR_DURATION_FRAMES 1 #endif +#define SFG_BLINK_PERIOD_FRAMES (SFG_BLINK_PERIOD / SFG_MS_PER_FRAME) + #define SFG_HUD_BAR_HEIGHT \ (SFG_FONT_CHARACTER_SIZE * SFG_FONT_SIZE_MEDIUM + SFG_HUD_MARGIN * 2 + 1) diff --git a/main.c b/main.c index 75df9ce..59d53d8 100755 --- a/main.c +++ b/main.c @@ -1119,7 +1119,7 @@ void SFG_initPlayer() SFG_player.lastHurtFrame = SFG_game.frame; SFG_player.lastItemTakenFrame = SFG_game.frame; - SFG_player.health = SFG_PLAYER_MAX_HEALTH; + SFG_player.health = SFG_PLAYER_START_HEALTH; SFG_player.cards = 0; @@ -2479,7 +2479,7 @@ void SFG_gameStepPlaying() return; } - int8_t recomputeDirection = 0; + int8_t recomputeDirection = SFG_currentLevel.frameStart == SFG_game.frame; RCL_Vector2D moveOffset; @@ -2877,21 +2877,33 @@ void SFG_gameStepPlaying() switch (e->type) { case SFG_LEVEL_ELEMENT_HEALTH: - SFG_playerChangeHealth(SFG_HEALTH_KIT_VALUE); + if (SFG_player.health < SFG_PLAYER_MAX_HEALTH) + SFG_playerChangeHealth(SFG_HEALTH_KIT_VALUE); + else + eliminate = 0; break; - + +#define addAmmo(type) \ + if (SFG_player.ammo[SFG_AMMO_##type] < SFG_AMMO_MAX_##type) \ + SFG_player.ammo[SFG_AMMO_##type] = RCL_min(SFG_AMMO_MAX_##type,\ + SFG_player.ammo[SFG_AMMO_##type] + SFG_AMMO_INCREASE_##type);\ + else\ + eliminate = 0; + case SFG_LEVEL_ELEMENT_BULLETS: - SFG_player.ammo[SFG_AMMO_BULLETS] += SFG_AMMO_INCREASE_BULLETS; + addAmmo(BULLETS) break; case SFG_LEVEL_ELEMENT_ROCKETS: - SFG_player.ammo[SFG_AMMO_ROCKETS] += SFG_AMMO_INCREASE_ROCKETS; + addAmmo(ROCKETS) break; case SFG_LEVEL_ELEMENT_PLASMA: - SFG_player.ammo[SFG_AMMO_PLASMA] += SFG_AMMO_INCREASE_PLASMA; + addAmmo(PLASMA) break; +#undef addAmmo + case SFG_LEVEL_ELEMENT_CARD0: case SFG_LEVEL_ELEMENT_CARD1: case SFG_LEVEL_ELEMENT_CARD2: @@ -3562,7 +3574,9 @@ void SFG_drawMenu() SFG_drawText(text,drawX,y,SFG_FONT_SIZE_MEDIUM,textColor,0,0); - if (item == SFG_MENU_ITEM_PLAY) + if (item == SFG_MENU_ITEM_PLAY && + (((i != SFG_game.selectedMenuItem) || + (SFG_game.frame / SFG_BLINK_PERIOD_FRAMES) % 2))) SFG_drawNumber((SFG_game.selectedLevel + 1), drawX + SFG_characterSize(SFG_FONT_SIZE_MEDIUM) * (textLen + 1), y,SFG_FONT_SIZE_MEDIUM,93); diff --git a/settings.h b/settings.h index 5b54e53..2020210 100644 --- a/settings.h +++ b/settings.h @@ -189,12 +189,17 @@ */ #define SFG_BACKGROUND_BLUR 0 +/** + Defines the period, in ms, of things that blink, such as text. +*/ +#define SFG_BLINK_PERIOD 500 + //------ developer/debug settings ------ /** Developer cheat for having infinite ammo in all weapons. */ -#define SFG_INFINITE_AMMO 1 +#define SFG_INFINITE_AMMO 0 /** Developer cheat for immortality.