diff --git a/assets/level4.gif b/assets/level4.gif index 5544a9f..ec26ad4 100644 Binary files a/assets/level4.gif and b/assets/level4.gif differ diff --git a/constants.h b/constants.h index 1fda361..5d9624b 100644 --- a/constants.h +++ b/constants.h @@ -477,10 +477,10 @@ uint16_t SFG_monsterAttributeTable[SFG_MONSTERS_TOTAL] = SFG_PROGRAM_MEMORY uint8_t SFG_weaponAttributeTable[SFG_WEAPONS_TOTAL] = { /* knife */ SFG_WEAPON_ATTRIBUTE(SFG_WEAPON_FIRE_TYPE_MELEE,1,650), - /* shotgun */ SFG_WEAPON_ATTRIBUTE(SFG_WEAPON_FIRE_TYPE_BULLET,2,1200), + /* shotgun */ SFG_WEAPON_ATTRIBUTE(SFG_WEAPON_FIRE_TYPE_BULLET,2,1400), /* m. gun */ SFG_WEAPON_ATTRIBUTE(SFG_WEAPON_FIRE_TYPE_BULLET,1,700), - /* r. laun. */ SFG_WEAPON_ATTRIBUTE(SFG_WEAPON_FIRE_TYPE_FIREBALL,1,900), - /* plasma */ SFG_WEAPON_ATTRIBUTE(SFG_WEAPON_FIRE_TYPE_PLASMA,1,550), + /* r. laun. */ SFG_WEAPON_ATTRIBUTE(SFG_WEAPON_FIRE_TYPE_FIREBALL,1,850), + /* plasma */ SFG_WEAPON_ATTRIBUTE(SFG_WEAPON_FIRE_TYPE_PLASMA,1,600), /* solution */ SFG_WEAPON_ATTRIBUTE(SFG_WEAPON_FIRE_TYPE_PLASMA,4,1050) }; @@ -488,7 +488,7 @@ SFG_PROGRAM_MEMORY uint8_t SFG_attackDamageTable[SFG_WEAPON_FIRE_TYPES_TOTAL] = { /* melee */ 7, /* bullet */ 10, - /* explostion (fireball) */ 13, + /* explostion (fireball) */ 17, /* plasma */ 17 }; diff --git a/game.h b/game.h index 7cb8d2f..9660a40 100755 --- a/game.h +++ b/game.h @@ -1707,6 +1707,17 @@ void SFG_playerChangeHealth(int8_t healthAdd) SFG_player.lastHurtFrame = SFG_game.frame; } +void SFG_playerChangeHealthWithMiltiplier(int8_t healthAdd) +{ + if (healthAdd < 0) + healthAdd = + RCL_min(-1, + (((RCL_Unit) healthAdd) * SFG_PLAYER_DAMAGE_MULTIPLIER) / + RCL_UNITS_PER_SQUARE); + + SFG_playerChangeHealth(healthAdd); +} + uint8_t SFG_distantSoundVolume(RCL_Unit x, RCL_Unit y, RCL_Unit z) { RCL_Unit distance = SFG_taxicabDistance(x,y,z, @@ -1819,7 +1830,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_PUSH_AWAY_DISTANCE)) - SFG_playerChangeHealth(-1 * damage); + SFG_playerChangeHealthWithMiltiplier(-1 * damage); for (uint16_t i = 0; i < SFG_currentLevel.monsterRecordCount; ++i) { @@ -2067,7 +2078,7 @@ void SFG_monsterPerformAI(SFG_MonsterRecord *monster) state = SFG_MONSTER_STATE_ATTACKING; - SFG_playerChangeHealth( + SFG_playerChangeHealthWithMiltiplier( -1 * SFG_getDamageValue(SFG_WEAPON_FIRE_TYPE_MELEE)); SFG_playGameSound(3,255); @@ -2081,10 +2092,7 @@ void SFG_monsterPerformAI(SFG_MonsterRecord *monster) SFG_TileDefinition tile = SFG_getMapTile(SFG_currentLevel.levelPointer,mX,mY,&properties); - SFG_createExplosion(mX * RCL_UNITS_PER_SQUARE, - mY * RCL_UNITS_PER_SQUARE, - SFG_TILE_FLOOR_HEIGHT(tile) * SFG_WALL_HEIGHT_STEP + - SFG_WALL_HEIGHT_STEP); + SFG_createExplosion(pX,pY,pZ); monster->health = 0; } @@ -2294,7 +2302,7 @@ void SFG_updateLevel() SFG_player.camera.height)) { eliminate = 1; - SFG_playerChangeHealth(-1 * SFG_getDamageValue(attackType)); + SFG_playerChangeHealthWithMiltiplier(-1 * SFG_getDamageValue(attackType)); } /* check collision with the map (we don't use SFG_floorCollisionHeightAt diff --git a/settings.h b/settings.h index 8ee8a23..3ce4870 100644 --- a/settings.h +++ b/settings.h @@ -26,7 +26,9 @@ integers and rounding errors can occur soon, so don't set this to extreme values (try to keep from 20 to 100). */ -#define SFG_FPS 60 +#ifndef SFG_FPS + #define SFG_FPS 60 +#endif /** On platforms with mouse this sets its horizontal sensitivity. 128 means 1 @@ -81,6 +83,14 @@ #define SFG_RESOLUTION_SCALEDOWN 1 #endif +/** + Multiplier, in RCL_Units (1024 == 1.0), of the damager player takes. This can + be used to balance difficulty. +*/ +#ifndef SFG_PLAYER_DAMAGE_MULTIPLIER + #define SFG_PLAYER_DAMAGE_MULTIPLIER 512 +#endif + /** Hint as to whether run in fullscreen, if the platform allows it. */ @@ -301,14 +311,14 @@ Developer cheat for having infinite ammo in all weapons. */ #ifndef SFG_INFINITE_AMMO - #define SFG_INFINITE_AMMO 1 + #define SFG_INFINITE_AMMO 0 #endif /** Developer cheat for immortality. */ #ifndef SFG_IMMORTAL - #define SFG_IMMORTAL 1 + #define SFG_IMMORTAL 0 #endif /** @@ -330,14 +340,14 @@ options is ignored, 1 means load level 1 etc. */ #ifndef SFG_START_LEVEL - #define SFG_START_LEVEL 6 + #define SFG_START_LEVEL 0 #endif /** Reveals whole level map from start. */ #ifndef SFG_REVEAL_MAP - #define SFG_REVEAL_MAP 1 + #define SFG_REVEAL_MAP 0 #endif /**