123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588 |
- #ifndef _SFG_CONSTANTS_H
- #define _SFG_CONSTANTS_H
- #define SFG_PLAYER_MOVE_SPEED 7
- #define SFG_GRAVITY_ACCELERATION 30
- #define SFG_PLAYER_JUMP_SPEED 5
- #define SFG_MELEE_RANGE 1600
- #define SFG_PROJECTILE_SPAWN_OFFSET 256
- #define SFG_PLAYER_MELEE_ANGLE 512
- #define SFG_MOVING_WALL_SPEED 1024
- #define SFG_DOOR_OPEN_SPEED 2048
- #define SFG_CANT_SAVE 255
- #define SFG_LEVEL_ELEMENT_ACTIVE_DISTANCE (12 * 1024)
- #define SFG_AI_FPS 4
- #define SFG_AI_RANDOM_CHANGE_PROBABILITY 40
- #define SFG_ELEMENT_COLLISION_RADIUS 1800
- #define SFG_ELEMENT_COLLISION_HEIGHT 1024
- #define SFG_EXPLOSION_RADIUS 2000
- #define SFG_EXPLOSION_PUSH_AWAY_DISTANCE 1023
- #define SFG_BARREL_EXPLOSION_DAMAGE_THRESHOLD 3
- #define SFG_PLAYER_MAX_HEALTH 125
- #define SFG_PLAYER_START_HEALTH 100
- #define SFG_PLAYER_HEALTH_WARNING_LEVEL 20
- #define SFG_HEALTH_KIT_VALUE 20
- #define SFG_DAMAGE_RANDOMNESS 64
- #define SFG_MONSTER_COLLISION_HEIGHT 1024
- #define SFG_KEY_REPEAT_DELAY 500
- #define SFG_KEY_REPEAT_PERIOD 150
- #define SFG_PROJECTILE_SPREAD_ANGLE 100
- #define SFG_MAX_MONSTERS 64
- #define SFG_MAX_PROJECTILES 12
- #define SFG_MAX_DOORS 32
- #define SFG_AMMO_BULLETS 0
- #define SFG_AMMO_ROCKETS 1
- #define SFG_AMMO_PLASMA 2
- #define SFG_AMMO_TOTAL 3
- #define SFG_AMMO_NONE SFG_AMMO_TOTAL
- #define SFG_AMMO_INCREASE_BULLETS 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
- #define SFG_STORYTEXT_DURATION 15000
- #define SFG_LOSE_ANIMATION_DURATION 2000
- #define SFG_WIN_ANIMATION_DURATION 2500
- #define SFG_LEVEL_START_DURATION 1500
- #define SFG_BASE_SPRITE_SIZE RCL_UNITS_PER_SQUARE
- #define SFG_DEFAULT_SETTINGS 0x03
- #define SFG_GAME_RESOLUTION_X \
- (SFG_SCREEN_RESOLUTION_X / SFG_RESOLUTION_SCALEDOWN)
- #define SFG_GAME_RESOLUTION_Y \
- (SFG_SCREEN_RESOLUTION_Y / SFG_RESOLUTION_SCALEDOWN)
- #define SFG_MS_PER_FRAME (1000 / SFG_FPS) // ms per frame with target FPS
- #if SFG_MS_PER_FRAME == 0
- #undef SFG_MS_PER_FRAME
- #define SFG_MS_PER_FRAME 1
- #endif
- #define SFG_KEY_REPEAT_DELAY_FRAMES \
- (SFG_KEY_REPEAT_DELAY / SFG_MS_PER_FRAME)
- #if SFG_KEY_REPEAT_DELAY_FRAMES == 0
- #undef SFG_KEY_REPEAT_DELAY_FRAMES
- #define SFG_KEY_REPEAT_DELAY_FRAMES 1
- #endif
- #define SFG_KEY_REPEAT_PERIOD_FRAMES \
- (SFG_KEY_REPEAT_PERIOD / SFG_MS_PER_FRAME)
- #if SFG_KEY_REPEAT_PERIOD_FRAMES == 0
- #undef SFG_KEY_REPEAT_PERIOD_FRAMES
- #define SFG_KEY_REPEAT_PERIOD_FRAMES 1
- #endif
- #define SFG_WEAPON_IMAGE_SCALE \
- (SFG_GAME_RESOLUTION_X / (SFG_TEXTURE_SIZE * 5))
- #if SFG_WEAPON_IMAGE_SCALE == 0
- #undef SFG_WEAPON_IMAGE_SCALE
- #define SFG_WEAPON_IMAGE_SCALE 1
- #endif
- #define SFG_WEAPONBOB_OFFSET_PIXELS \
- (SFG_WEAPONBOB_OFFSET * SFG_WEAPON_IMAGE_SCALE)
- #define SFG_WEAPON_IMAGE_POSITION_X \
- (SFG_GAME_RESOLUTION_X / 2 - (SFG_WEAPON_IMAGE_SCALE * SFG_TEXTURE_SIZE) / 2)
- #if SFG_GAME_RESOLUTION_Y > 70
- #define SFG_WEAPON_IMAGE_POSITION_Y \
- (SFG_GAME_RESOLUTION_Y - (SFG_WEAPON_IMAGE_SCALE * SFG_TEXTURE_SIZE))
- #elif SFG_GAME_RESOLUTION_Y > 50
- #define SFG_WEAPON_IMAGE_POSITION_Y (SFG_GAME_RESOLUTION_Y \
- - ((SFG_WEAPON_IMAGE_SCALE * 3 * SFG_TEXTURE_SIZE) / 4))
- #else
- #define SFG_WEAPON_IMAGE_POSITION_Y \
- (SFG_GAME_RESOLUTION_Y - SFG_TEXTURE_SIZE / 2)
- #endif
- #define SFG_PLAYER_TURN_UNITS_PER_FRAME \
- ((SFG_PLAYER_TURN_SPEED * RCL_UNITS_PER_SQUARE) / (360 * SFG_FPS))
- #if SFG_PLAYER_TURN_UNITS_PER_FRAME == 0
- #undef SFG_PLAYER_TURN_UNITS_PER_FRAME
- #define SFG_PLAYER_TURN_UNITS_PER_FRAME 1
- #endif
- #define SFG_PLAYER_MOVE_UNITS_PER_FRAME \
- ((SFG_PLAYER_MOVE_SPEED * RCL_UNITS_PER_SQUARE) / SFG_FPS)
- #if SFG_PLAYER_MOVE_UNITS_PER_FRAME == 0
- #undef SFG_PLAYER_MOVE_UNITS_PER_FRAME
- #define SFG_PLAYER_MOVE_UNITS_PER_FRAME 1
- #endif
- #define SFG_GRAVITY_SPEED_INCREASE_PER_FRAME \
- ((SFG_GRAVITY_ACCELERATION * RCL_UNITS_PER_SQUARE) / (SFG_FPS * SFG_FPS))
- #if SFG_GRAVITY_SPEED_INCREASE_PER_FRAME == 0
- #undef SFG_GRAVITY_SPEED_INCREASE_PER_FRAME
- #define SFG_GRAVITY_SPEED_INCREASE_PER_FRAME 1
- #endif
- #define SFG_PLAYER_JUMP_OFFSET_PER_FRAME \
- (((SFG_PLAYER_JUMP_SPEED * RCL_UNITS_PER_SQUARE) / SFG_FPS) \
- - SFG_GRAVITY_SPEED_INCREASE_PER_FRAME / 2)
-
- #if SFG_PLAYER_JUMP_OFFSET_PER_FRAME == 0
- #undef SFG_PLAYER_JUMP_OFFSET_PER_FRAME
- #define SFG_PLAYER_JUMP_OFFSET_PER_FRAME 1
- #endif
- #define SFG_HEADBOB_FRAME_INCREASE_PER_FRAME \
- (SFG_HEADBOB_SPEED / SFG_FPS)
- #if SFG_HEADBOB_FRAME_INCREASE_PER_FRAME == 0
- #undef SFG_HEADBOB_FRAME_INCREASE_PER_FRAME
- #define SFG_HEADBOB_FRAME_INCREASE_PER_FRAME 1
- #endif
- #define SFG_HEADBOB_ENABLED (SFG_HEADBOB_SPEED > 0 && SFG_HEADBOB_OFFSET > 0)
- #define SFG_CAMERA_SHEAR_STEP_PER_FRAME \
- ((SFG_GAME_RESOLUTION_Y * SFG_CAMERA_SHEAR_SPEED) / SFG_FPS)
- #if SFG_CAMERA_SHEAR_STEP_PER_FRAME == 0
- #undef SFG_CAMERA_SHEAR_STEP_PER_FRAME
- #define SFG_CAMERA_SHEAR_STEP_PER_FRAME 1
- #endif
- #define SFG_CAMERA_MAX_SHEAR_PIXELS \
- ((SFG_CAMERA_MAX_SHEAR * SFG_GAME_RESOLUTION_Y) / 1024)
- #define SFG_FONT_SIZE_SMALL \
- (SFG_GAME_RESOLUTION_X / (SFG_FONT_CHARACTER_SIZE * 50))
- #if SFG_FONT_SIZE_SMALL == 0
- #undef SFG_FONT_SIZE_SMALL
- #define SFG_FONT_SIZE_SMALL 1
- #endif
- #define SFG_FONT_SIZE_MEDIUM \
- (SFG_GAME_RESOLUTION_X / (SFG_FONT_CHARACTER_SIZE * 30))
- #if SFG_FONT_SIZE_MEDIUM == 0
- #undef SFG_FONT_SIZE_MEDIUM
- #define SFG_FONT_SIZE_MEDIUM 1
- #endif
- #define SFG_FONT_SIZE_BIG \
- (SFG_GAME_RESOLUTION_X / (SFG_FONT_CHARACTER_SIZE * 18))
- #if SFG_FONT_SIZE_BIG == 0
- #undef SFG_FONT_SIZE_BIG
- #define SFG_FONT_SIZE_BIG 1
- #endif
- #define SFG_Z_BUFFER_SIZE SFG_GAME_RESOLUTION_X
- #define SFG_WALL_HEIGHT_STEP (RCL_UNITS_PER_SQUARE / 4)
- #define SFG_CEILING_MAX_HEIGHT\
- (16 * RCL_UNITS_PER_SQUARE - RCL_UNITS_PER_SQUARE / 2 )
- #define SFG_DOOR_UP_DOWN_MASK 0x20
- #define SFG_DOOR_LOCK(doorRecord) ((doorRecord) >> 6)
- #define SFG_DOOR_VERTICAL_POSITION_MASK 0x1f
- #define SFG_DOOR_HEIGHT_STEP (RCL_UNITS_PER_SQUARE / 0x1f)
- #define SFG_DOOR_INCREMENT_PER_FRAME \
- (SFG_DOOR_OPEN_SPEED / (SFG_DOOR_HEIGHT_STEP * SFG_FPS))
- #if SFG_DOOR_INCREMENT_PER_FRAME == 0
- #undef SFG_DOOR_INCREMENT_PER_FRAME
- #define SFG_DOOR_INCREMENT_PER_FRAME 1
- #endif
- #define SFG_MAX_ITEMS SFG_MAX_LEVEL_ELEMENTS
- #define SFG_MAX_SPRITE_SIZE SFG_GAME_RESOLUTION_X
- #define SFG_MAP_PIXEL_SIZE (SFG_GAME_RESOLUTION_Y / SFG_MAP_SIZE)
- #if SFG_MAP_PIXEL_SIZE == 0
- #undef SFG_MAP_PIXEL_SIZE
- #define SFG_MAP_PIXEL_SIZE 1
- #endif
- #define SFG_AI_UPDATE_FRAME_INTERVAL \
- (SFG_FPS / SFG_AI_FPS)
- #if SFG_AI_UPDATE_FRAME_INTERVAL == 0
- #undef SFG_AI_UPDATE_FRAME_INTERVAL
- #define SFG_AI_UPDATE_FRAME_INTERVAL 1
- #endif
- #define SFG_SPRITE_ANIMATION_FRAME_DURATION \
- (SFG_FPS / SFG_SPRITE_ANIMATION_SPEED)
- #if SFG_SPRITE_ANIMATION_FRAME_DURATION == 0
- #undef SFG_SPRITE_ANIMATION_FRAME_DURATION
- #define SFG_SPRITE_ANIMATION_FRAME_DURATION 1
- #endif
- #define SFG_HUD_MARGIN (SFG_GAME_RESOLUTION_X / 40)
- #define SFG_HUD_BORDER_INDICATOR_WIDTH_PIXELS \
- (SFG_GAME_RESOLUTION_Y / SFG_HUD_BORDER_INDICATOR_WIDTH)
- #define SFG_HUD_BORDER_INDICATOR_DURATION_FRAMES \
- (SFG_HUD_BORDER_INDICATOR_DURATION / SFG_MS_PER_FRAME)
- #if SFG_HUD_BORDER_INDICATOR_DURATION_FRAMES == 0
- #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)
- #define SFG_MONSTER_ATTACK_MELEE 0
- #define SFG_MONSTER_ATTACK_FIREBALL 1
- #define SFG_MONSTER_ATTACK_BULLET 2
- #define SFG_MONSTER_ATTACK_FIREBALL_BULLET 3
- #define SFG_MONSTER_ATTACK_PLASMA 4
- #define SFG_MONSTER_ATTACK_EXPLODE 5
- #define SFG_MONSTER_ATTACK_FIREBALL_PLASMA 6
- #define SFG_MONSTER_ATTRIBUTE(attackType,aggressivity0to255,health0to255,spriteSize0to3) \
- ((uint16_t) ( \
- attackType | \
- ((aggressivity0to255 / 8) << 3) | \
- (spriteSize0to3 << 8) | \
- ((health0to255 / 4) << 10)))
- #define SFG_GET_MONSTER_ATTACK_TYPE(monsterNumber) \
- (SFG_monsterAttributeTable[monsterNumber] & 0x0007)
- #define SFG_GET_MONSTER_AGGRESSIVITY(monsterNumber) \
- (((SFG_monsterAttributeTable[monsterNumber] >> 3) & 0x1F) * 8)
- #define SFG_GET_MONSTER_SPRITE_SIZE(monsterNumber) \
- ((SFG_monsterAttributeTable[monsterNumber] >> 8) & 0x03)
- #define SFG_GET_MONSTER_MAX_HEALTH(monsterNumber) \
- (((SFG_monsterAttributeTable[monsterNumber] >> 10) & 0x3F) * 4)
- uint16_t SFG_monsterAttributeTable[SFG_MONSTERS_TOTAL] =
- {
- SFG_MONSTER_ATTRIBUTE(SFG_MONSTER_ATTACK_FIREBALL,40,61,2),
- SFG_MONSTER_ATTRIBUTE(SFG_MONSTER_ATTACK_FIREBALL_BULLET,90,170,3),
- SFG_MONSTER_ATTRIBUTE(SFG_MONSTER_ATTACK_MELEE,255,40,1),
- SFG_MONSTER_ATTRIBUTE(SFG_MONSTER_ATTACK_PLASMA,56,92,1),
- SFG_MONSTER_ATTRIBUTE(SFG_MONSTER_ATTACK_FIREBALL_PLASMA,128,255,3),
- SFG_MONSTER_ATTRIBUTE(SFG_MONSTER_ATTACK_BULLET,32,23,0),
- SFG_MONSTER_ATTRIBUTE(SFG_MONSTER_ATTACK_EXPLODE,255,36,1)
- };
- #define SFG_WEAPON_KNIFE 0
- #define SFG_WEAPON_SHOTGUN 1
- #define SFG_WEAPON_MACHINE_GUN 2
- #define SFG_WEAPON_ROCKET_LAUNCHER 3
- #define SFG_WEAPON_PLASMAGUN 4
- #define SFG_WEAPON_SOLUTION 5
- #define SFG_WEAPONS_TOTAL 6
- #define SFG_WEAPON_ATTRIBUTE(fireType,projectileCount,fireCooldownMs) \
- ((uint8_t) (fireType | ((projectileCount - 1) << 2) | ((fireCooldownMs / (SFG_MS_PER_FRAME * 16)) << 4)))
- #define SFG_GET_WEAPON_FIRE_TYPE(weaponNumber) \
- (SFG_weaponAttributeTable[weaponNumber] & 0x03)
- #define SFG_GET_WEAPON_FIRE_COOLDOWN_FRAMES(weaponNumber) \
- ((SFG_weaponAttributeTable[weaponNumber] >> 4) * 16)
- #define SFG_GET_WEAPON_PROJECTILE_COUNT(weaponNumber) \
- (((SFG_weaponAttributeTable[weaponNumber] >> 2) & 0x03) + 1)
- #define SFG_MIN_WEAPON_COOLDOWN_FRAMES 8
- #define SFG_WEAPON_FIRE_TYPE_MELEE 0
- #define SFG_WEAPON_FIRE_TYPE_BULLET 1
- #define SFG_WEAPON_FIRE_TYPE_FIREBALL 2
- #define SFG_WEAPON_FIRE_TYPE_PLASMA 3
- #define SFG_WEAPON_FIRE_TYPES_TOTAL 4
- static const uint8_t SFG_weaponAttributeTable[SFG_WEAPONS_TOTAL] =
- {
- SFG_WEAPON_ATTRIBUTE(SFG_WEAPON_FIRE_TYPE_MELEE,1,650),
- SFG_WEAPON_ATTRIBUTE(SFG_WEAPON_FIRE_TYPE_BULLET,2,1250),
- SFG_WEAPON_ATTRIBUTE(SFG_WEAPON_FIRE_TYPE_BULLET,1,700),
- SFG_WEAPON_ATTRIBUTE(SFG_WEAPON_FIRE_TYPE_FIREBALL,1,850),
- SFG_WEAPON_ATTRIBUTE(SFG_WEAPON_FIRE_TYPE_PLASMA,1,550),
- SFG_WEAPON_ATTRIBUTE(SFG_WEAPON_FIRE_TYPE_PLASMA,4,1050)
- };
- static const uint8_t SFG_attackDamageTable[SFG_WEAPON_FIRE_TYPES_TOTAL] =
- {
- 4,
- 8,
- 24,
- 18
- };
- #define SFG_PROJECTILE_EXPLOSION 0
- #define SFG_PROJECTILE_FIREBALL 1
- #define SFG_PROJECTILE_PLASMA 2
- #define SFG_PROJECTILE_DUST 3
- #define SFG_PROJECTILE_BULLET 4
- #define SFG_PROJECTILE_NONE 255
- #define SFG_PROJECTILES_TOTAL 5
- #define SFG_PROJECTILE_ATTRIBUTE(speedSquaresPerSec,timeToLiveMs) \
- ((uint8_t) \
- ((((speedSquaresPerSec / 4 == 0) && (speedSquaresPerSec != 0)) ? 1 : speedSquaresPerSec / 4) | \
- ((timeToLiveMs / (8 * SFG_MS_PER_FRAME)) << 3)))
- #define SFG_GET_PROJECTILE_SPEED_UPF(projectileNumber) \
- (((SFG_projectileAttributeTable[projectileNumber] & 0x07) * 4 * RCL_UNITS_PER_SQUARE) / SFG_FPS)
- #define SFG_GET_PROJECTILE_FRAMES_TO_LIVE(projectileNumber) \
- ((SFG_projectileAttributeTable[projectileNumber] >> 3) * 8)
- #define LOW_FPS (SFG_FPS < 24) ///< low FPS needs low speeds, because collisions
- static const uint8_t SFG_projectileAttributeTable[SFG_PROJECTILES_TOTAL] =
- {
- SFG_PROJECTILE_ATTRIBUTE(0,400),
- SFG_PROJECTILE_ATTRIBUTE(10,1000),
- #if LOW_FPS
- SFG_PROJECTILE_ATTRIBUTE(17,500),
- #else
- SFG_PROJECTILE_ATTRIBUTE(18,500),
- #endif
- SFG_PROJECTILE_ATTRIBUTE(0,450),
- #if LOW_FPS
- SFG_PROJECTILE_ATTRIBUTE(17,1000)
- #else
- SFG_PROJECTILE_ATTRIBUTE(28,1000)
- #endif
- };
- #undef LOW_FPS
- #endif // guard
|