From 840a3b0d576af18cc9c8aeb1d67d00698d474710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miloslav=20=C4=8C=C3=AD=C5=BE?= Date: Sun, 23 Feb 2020 11:45:32 +0100 Subject: [PATCH] Tune constants --- constants.h | 6 +++--- main.c | 42 ++++++++++++++++++++++++------------------ 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/constants.h b/constants.h index b388b4e..c732e49 100644 --- a/constants.h +++ b/constants.h @@ -24,7 +24,7 @@ /** How quickly player moves, in squares per second. */ -#define SFG_PLAYER_MOVE_SPEED 10 +#define SFG_PLAYER_MOVE_SPEED 7 /** Gravity acceleration in squares / (second^2). @@ -86,7 +86,7 @@ Distance at which level elements (sprites) collide, in RCL_Unit (1024 per square). */ -#define SFG_ELEMENT_COLLISION_DISTANCE 2500 +#define SFG_ELEMENT_COLLISION_RADIUS 1500 /** Height, in RCL_Units, at which collisions happen with level elements @@ -98,7 +98,7 @@ Distance at which explosion does damage and throws away the player and monsters, in RCL_Units. */ -#define SFG_EXPLOSION_DISTANCE 2048 +#define SFG_EXPLOSION_RADIUS 2048 /** How much damage triggers a barrel explosion. diff --git a/main.c b/main.c index 4c8d145..12a9abd 100755 --- a/main.c +++ b/main.c @@ -1102,7 +1102,10 @@ RCL_Unit SFG_ceilingHeightAt(int16_t x, int16_t y) SFG_game.frameTime - SFG_currentLevel.timeStart); } -void SFG_getLevelElementSprite( // TODO: this is just for items -- rename? +/** + Gets sprite (image and sprite size) for given item. +*/ +void SFG_getItemSprite( uint8_t elementType, uint8_t *spriteIndex, uint8_t *spriteSize) { *spriteSize = 0; @@ -1134,7 +1137,10 @@ void SFG_getLevelElementSprite( // TODO: this is just for items -- rename? } } -uint8_t SFG_levelElementCollides(uint8_t elementType) // TODO: better name? +/** + Says whether given item type collides, i.e. stops player from moving. +*/ +uint8_t SFG_itemCollides(uint8_t elementType) { return elementType == SFG_LEVEL_ELEMENT_BARREL || @@ -1243,7 +1249,7 @@ void SFG_setAndInitLevel(const SFG_Level *level) if (e->type == SFG_LEVEL_ELEMENT_TELEPORT) SFG_currentLevel.teleportCount++; - if (SFG_levelElementCollides(e->type)) + if (SFG_itemCollides(e->type)) SFG_setItemCollisionMapBit(e->coords[0],e->coords[1],1); } else @@ -1628,7 +1634,7 @@ void SFG_createExplosion(RCL_Unit x, RCL_Unit y, RCL_Unit z) uint8_t damage = SFG_getDamageValue(SFG_WEAPON_FIRE_TYPE_FIREBALL); - if (SFG_pushPlayerAway(x,y,SFG_EXPLOSION_DISTANCE)) + if (SFG_pushPlayerAway(x,y,SFG_EXPLOSION_RADIUS)) SFG_playerChangeHealth(-1 * damage); for (uint16_t i = 0; i < SFG_currentLevel.monsterRecordCount; ++i) @@ -1647,7 +1653,7 @@ void SFG_createExplosion(RCL_Unit x, RCL_Unit y, RCL_Unit z) if (SFG_taxicabDistance( SFG_MONSTER_COORD_TO_RCL_UNITS(monster->coords[0]), SFG_MONSTER_COORD_TO_RCL_UNITS(monster->coords[1]),monsterHeight, - x,y,z) <= SFG_EXPLOSION_DISTANCE) + x,y,z) <= SFG_EXPLOSION_RADIUS) { SFG_monsterChangeHealth(monster, -1 * SFG_getDamageValue(SFG_WEAPON_FIRE_TYPE_FIREBALL)); @@ -1679,7 +1685,7 @@ void SFG_createExplosion(RCL_Unit x, RCL_Unit y, RCL_Unit z) SFG_floorHeightAt(element.coords[0],element.coords[1]); if (SFG_taxicabDistance( - x,y,z,elementX,elementY,elementHeight) <= SFG_EXPLOSION_DISTANCE) + x,y,z,elementX,elementY,elementHeight) <= SFG_EXPLOSION_RADIUS) { SFG_explodeBarrel(i,elementX,elementY,elementHeight); i--; @@ -1996,7 +2002,7 @@ static inline uint8_t SFG_elementCollides( { return SFG_taxicabDistance(pointX,pointY,pointZ,elementX,elementY,elementHeight) - <= SFG_ELEMENT_COLLISION_DISTANCE; + <= SFG_ELEMENT_COLLISION_RADIUS; } /** @@ -2739,7 +2745,8 @@ void SFG_gameStepPlaying() uint8_t collidesWithTeleport = 0; - // items: + /* item collisions with player (only those that don't stop player's movement + -- these are handled differently, via itemCollisionMap): */ for (int16_t i = 0; i < SFG_currentLevel.itemRecordCount; ++i) // ^ has to be int16_t (signed) { @@ -2755,15 +2762,14 @@ void SFG_gameStepPlaying() ePos.x = SFG_ELEMENT_COORD_TO_RCL_UNITS(e->coords[0]); ePos.y = SFG_ELEMENT_COORD_TO_RCL_UNITS(e->coords[1]); - if ( - SFG_elementCollides( - SFG_player.camera.position.x, - SFG_player.camera.position.y, - SFG_player.camera.height, - ePos.x, - ePos.y, - SFG_floorHeightAt(e->coords[0],e->coords[1]) - ) + if (!SFG_itemCollides(e->type) && + SFG_elementCollides( + SFG_player.camera.position.x, + SFG_player.camera.position.y, + SFG_player.camera.height, + ePos.x, + ePos.y, + SFG_floorHeightAt(e->coords[0],e->coords[1])) ) { uint8_t eliminate = 1; @@ -3636,7 +3642,7 @@ void SFG_draw() uint8_t spriteIndex; uint8_t spriteSize; - SFG_getLevelElementSprite(e.type,&spriteIndex,&spriteSize); + SFG_getItemSprite(e.type,&spriteIndex,&spriteSize); RCL_PixelInfo p = RCL_mapToScreen(