dos-vga-arena-shooter-game/game.c

667 lines
15 KiB
C
Raw Normal View History

#include <stddef.h>
2024-02-15 13:34:50 +00:00
#include <stdio.h>
2024-02-20 11:48:12 +00:00
#include <math.h>
#include <conio.h>
2024-02-21 21:25:00 +00:00
#include <stdlib.h>
#include <time.h>
2024-02-15 13:34:50 +00:00
2024-02-24 12:36:18 +00:00
#include "sprites.h"
2024-02-20 13:00:13 +00:00
#include "system/vga.h"
#include "system/keyboard.h"
#include "system/mouse_io.h"
#include "system/pc_stuff.h"
2024-02-21 13:25:55 +00:00
2024-02-15 13:34:50 +00:00
#include "bmpload.h"
2024-02-20 17:51:59 +00:00
#include "const.h"
#include "arena.h"
2024-02-21 13:25:55 +00:00
#include "movement.h"
#include "combat.h"
2024-02-26 23:12:39 +00:00
#include "game.h"
2024-02-28 17:50:57 +00:00
#include "spawn.h"
#include "powerup.h"
2024-02-15 01:15:55 +00:00
2024-02-15 13:34:50 +00:00
struct BMPImage spritesheetImage;
struct VGAColor vgaColors[256];
struct MouseStatus mouseStatus;
2024-02-21 13:25:55 +00:00
struct RabbitPosition rabbitPosition = {
.rabbitPosition = { 60, 60 },
2024-02-26 23:12:39 +00:00
.rabbitLimits = {
{ 20, 20 },
{ (ARENA_WIDTH_TILES - 1) * TILE_SIZE - 2, (ARENA_HEIGHT_TILES - 1) * TILE_SIZE - 2 }
},
2024-02-21 13:25:55 +00:00
.mousePosition = { 0, 0 },
.rabbitVelocity = { 0, 0 },
.mouseDotPosition = { 0, 0 }
};
2024-02-21 21:25:00 +00:00
struct EnemyPosition enemyPosition[ENEMY_MAX_COUNT];
2024-02-21 13:25:55 +00:00
struct BulletPosition rabbitBulletPosition[RABBIT_BULLET_LIMIT];
2024-02-25 21:59:04 +00:00
struct BulletPosition enemyBulletPosition[ENEMY_BULLET_LIMIT];
2024-02-21 13:25:55 +00:00
struct RabbitWeaponry rabbitWeaponry;
2024-02-27 01:40:05 +00:00
struct PlayerPowerup playerPowerup;
2024-02-21 13:25:55 +00:00
struct GlobalGameState globalGameState = {
.spawnCooldown = 0,
.difficulty = 0,
.kills = 0,
2024-03-04 22:38:03 +00:00
.coins = 0,
.health = RABBIT_HEALTH_MAX,
.maxHealth = RABBIT_HEALTH_MAX,
.healthGainPerKill = 1,
.damageUpgradeLevel = 0,
.healthUpgradeLevel = 0,
.healthGainUpgradeLevel = 0
};
2024-02-21 13:25:55 +00:00
void setupRabbitBullets() {
2024-02-21 21:25:00 +00:00
int i;
2024-02-21 13:25:55 +00:00
for (i = 0; i < RABBIT_BULLET_LIMIT; ++i) {
rabbitBulletPosition[i].isActive = 0;
rabbitBulletPosition[i].willBeInactive = 0;
}
rabbitWeaponry.cooldown = 0;
2024-02-27 13:16:16 +00:00
rabbitWeaponry.currentWeapon = WEAPON_TYPE_SINGLE_SHOT_GUN;
rabbitWeaponry.currentWeaponRemainingRounds = 0;
2024-03-04 22:38:03 +00:00
rabbitWeaponry.damage = 1;
2024-02-21 13:25:55 +00:00
}
2024-02-27 01:40:05 +00:00
void setupPowerup() {
playerPowerup.x = 100;
playerPowerup.y = 100;
playerPowerup.cooldown = determinePowerupCooldownTime(globalGameState.difficulty);
2024-02-27 13:16:16 +00:00
playerPowerup.type = POWERUP_TYPE_SHOTGUN;
2024-02-27 01:40:05 +00:00
playerPowerup.isActive = 0;
}
2024-02-25 21:59:04 +00:00
void setupEnemyBullets() {
int i;
for (i = 0; i < ENEMY_BULLET_LIMIT; ++i) {
enemyBulletPosition[i].isActive = 0;
enemyBulletPosition[i].willBeInactive = 0;
}
}
2024-02-21 21:25:00 +00:00
void setupEnemies() {
int i;
for (i = 0; i < ENEMY_MAX_COUNT; ++i) {
enemyPosition[i].isActive = 0;
enemyPosition[i].willBeInactive = 0;
}
}
void setupEnemySprites() {
buildCompiledSprite(
&sprite_enemy,
2024-02-21 21:25:00 +00:00
&enemy,
SPRITE_ENEMY_WIDTH,
SPRITE_ENEMY_HEIGHT,
SPRITE_ENEMY_OFFSET_X,
SPRITE_ENEMY_OFFSET_Y
2024-02-21 21:25:00 +00:00
);
2024-02-25 21:59:04 +00:00
buildCompiledSprite(
&sprite_bullet,
&enemyBullet,
SPRITE_BULLET_WIDTH,
SPRITE_BULLET_HEIGHT,
SPRITE_BULLET_OFFSET_X,
SPRITE_BULLET_OFFSET_Y
);
2024-02-21 21:25:00 +00:00
}
2024-02-16 02:18:15 +00:00
void setupRabbitSprites() {
buildCompiledSprite(
&sprite_rabbit,
2024-02-16 02:18:15 +00:00
&rabbit,
SPRITE_RABBIT_WIDTH,
SPRITE_RABBIT_HEIGHT,
SPRITE_RABBIT_OFFSET_X,
SPRITE_RABBIT_OFFSET_Y
2024-02-16 02:18:15 +00:00
);
2024-02-20 11:48:12 +00:00
buildCompiledSprite(
&sprite_mouse,
2024-02-20 11:48:12 +00:00
&mouse,
SPRITE_MOUSE_WIDTH,
SPRITE_MOUSE_HEIGHT,
SPRITE_MOUSE_OFFSET_X,
SPRITE_MOUSE_OFFSET_Y
2024-02-20 11:48:12 +00:00
);
buildCompiledSprite(
&sprite_bullet,
2024-02-21 13:25:55 +00:00
&bullet,
SPRITE_BULLET_WIDTH,
SPRITE_BULLET_HEIGHT,
SPRITE_BULLET_OFFSET_X,
SPRITE_BULLET_OFFSET_Y
2024-02-21 13:25:55 +00:00
);
}
2024-02-16 02:18:15 +00:00
2024-02-27 01:40:05 +00:00
void setupPowerupSprites() {
buildCompiledSprite(
&sprite_shotgun,
&shotgun,
SPRITE_SHOTGUN_WIDTH,
SPRITE_SHOTGUN_HEIGHT,
SPRITE_SHOTGUN_OFFSET_X,
SPRITE_SHOTGUN_OFFSET_Y
);
2024-02-27 13:16:16 +00:00
buildCompiledSprite(
2024-03-02 01:40:51 +00:00
&sprite_beam,
&beam,
SPRITE_BEAM_WIDTH,
SPRITE_BEAM_HEIGHT,
SPRITE_BEAM_OFFSET_X,
SPRITE_BEAM_OFFSET_Y
2024-02-27 13:16:16 +00:00
);
2024-02-27 01:40:05 +00:00
}
2024-02-20 17:39:28 +00:00
void renderMouse() {
2024-02-21 13:25:55 +00:00
mouse.x = rabbitPosition.mousePosition[0];
mouse.y = rabbitPosition.mousePosition[1];
drawCompiledSprite(&mouse);
2024-03-04 22:38:03 +00:00
mouse.x = rabbitPosition.mouseDotPosition[0];
mouse.y = rabbitPosition.mouseDotPosition[1];
drawCompiledSprite(&mouse);
2024-02-20 11:48:12 +00:00
}
void renderRabbit() {
2024-02-21 13:25:55 +00:00
rabbit.x = rabbitPosition.rabbitPosition[0];
rabbit.y = rabbitPosition.rabbitPosition[1];
drawCompiledSprite(&rabbit);
2024-02-16 02:18:15 +00:00
}
2024-02-21 21:25:00 +00:00
void renderEnemies() {
int i;
for (i = 0; i < ENEMY_MAX_COUNT; ++i) {
if (!enemyPosition[i].isActive) continue;
enemy.x = enemyPosition[i].enemyPosition[0];
enemy.y = enemyPosition[i].enemyPosition[1];
drawCompiledSprite(&enemy);
2024-02-21 21:25:00 +00:00
}
}
2024-02-21 13:25:55 +00:00
void renderRabbitBullets() {
char i;
2024-02-16 02:18:15 +00:00
2024-02-21 13:25:55 +00:00
for (i = 0; i < RABBIT_BULLET_LIMIT; ++i) {
if (!rabbitBulletPosition[i].isActive) continue;
2024-02-16 02:18:15 +00:00
2024-02-21 13:25:55 +00:00
bullet.x = rabbitBulletPosition[i].x;
bullet.y = rabbitBulletPosition[i].y;
drawCompiledSprite(&bullet);
2024-02-16 02:18:15 +00:00
}
}
2024-02-25 21:59:04 +00:00
void renderEnemyBullets() {
char i;
for (i = 0; i < ENEMY_BULLET_LIMIT; ++i) {
if (!enemyBulletPosition[i].isActive) continue;
enemyBullet.x = enemyBulletPosition[i].x;
enemyBullet.y = enemyBulletPosition[i].y;
drawCompiledSprite(&enemyBullet);
}
}
2024-02-27 01:40:05 +00:00
void renderPowerup() {
2024-03-02 01:40:51 +00:00
struct CompiledSpriteRender *which;
2024-02-27 13:16:16 +00:00
if (!playerPowerup.isActive) return;
2024-02-27 01:40:05 +00:00
2024-02-27 13:16:16 +00:00
switch (playerPowerup.type) {
case POWERUP_TYPE_SHOTGUN:
2024-03-02 01:40:51 +00:00
which = &shotgun;
2024-02-27 13:16:16 +00:00
break;
2024-03-02 01:40:51 +00:00
case POWERUP_TYPE_BEAM_WEAPON:
which = &beam;
2024-02-27 13:16:16 +00:00
break;
}
2024-03-02 01:40:51 +00:00
which->x = playerPowerup.x;
which->y = playerPowerup.y;
drawCompiledSprite(which);
2024-02-27 13:16:16 +00:00
}
void drawOnlyArenaForSprite(struct CompiledSpriteRender *sprite) {
getSpriteBounds(sprite, &bounds);
drawOnlyArena(&bounds);
2024-02-27 01:40:05 +00:00
}
2024-02-20 11:48:12 +00:00
void drawOnlyMouseArena() {
2024-02-21 13:25:55 +00:00
mouse.x = rabbitPosition.oldMousePosition[0];
mouse.y = rabbitPosition.oldMousePosition[1];
2024-02-27 13:16:16 +00:00
drawOnlyArenaForSprite(&mouse);
2024-02-20 17:39:28 +00:00
2024-03-04 22:38:03 +00:00
mouse.x = rabbitPosition.oldMouseDotPosition[0];
mouse.y = rabbitPosition.oldMouseDotPosition[1];
drawOnlyArenaForSprite(&mouse);
2024-02-20 11:48:12 +00:00
}
void drawOnlyRabbitArena() {
2024-02-21 13:25:55 +00:00
rabbit.x = rabbitPosition.oldRabbitPosition[0];
rabbit.y = rabbitPosition.oldRabbitPosition[1];
2024-02-27 13:16:16 +00:00
drawOnlyArenaForSprite(&rabbit);
}
void drawOnlyPowerupArena() {
2024-03-02 01:40:51 +00:00
struct CompiledSpriteRender *which;
2024-02-27 13:16:16 +00:00
if (!playerPowerup.isActive) return;
switch (playerPowerup.type) {
case POWERUP_TYPE_SHOTGUN:
2024-03-02 01:40:51 +00:00
which = &shotgun;
2024-02-27 13:16:16 +00:00
break;
2024-03-02 01:40:51 +00:00
case POWERUP_TYPE_BEAM_WEAPON:
which = &beam;
2024-02-27 13:16:16 +00:00
break;
}
2024-03-02 01:40:51 +00:00
which->x = playerPowerup.x;
which->y = playerPowerup.y;
drawOnlyArenaForSprite(which);
2024-02-27 13:16:16 +00:00
if (playerPowerup.willBeInactive) {
playerPowerup.isActive = 0;
}
2024-02-20 11:48:12 +00:00
}
2024-02-21 21:25:00 +00:00
void drawOnlyEnemiesArena() {
int i;
for (i = 0; i < ENEMY_MAX_COUNT; ++i) {
if (!enemyPosition[i].isActive) continue;
enemy.x = enemyPosition[i].oldEnemyPosition[0];
enemy.y = enemyPosition[i].oldEnemyPosition[1];
2024-02-27 13:16:16 +00:00
drawOnlyArenaForSprite(&enemy);
2024-02-21 21:25:00 +00:00
if (enemyPosition[i].willBeInactive) {
enemyPosition[i].isActive = 0;
2024-02-21 21:25:00 +00:00
}
}
}
2024-02-21 13:25:55 +00:00
void drawOnlyRabbitBulletArena() {
int i;
for (i = 0; i < RABBIT_BULLET_LIMIT; ++i) {
if (!rabbitBulletPosition[i].isActive) continue;
bullet.x = rabbitBulletPosition[i].oldX;
bullet.y = rabbitBulletPosition[i].oldY;
2024-02-27 13:16:16 +00:00
drawOnlyArenaForSprite(&bullet);
2024-02-21 13:25:55 +00:00
if (rabbitBulletPosition[i].willBeInactive) {
rabbitBulletPosition[i].isActive = 0;
}
}
}
2024-02-25 21:59:04 +00:00
void drawOnlyEnemyBulletArena() {
int i;
for (i = 0; i < ENEMY_BULLET_LIMIT; ++i) {
if (!enemyBulletPosition[i].isActive) continue;
enemyBullet.x = enemyBulletPosition[i].oldX;
enemyBullet.y = enemyBulletPosition[i].oldY;
2024-02-27 13:16:16 +00:00
drawOnlyArenaForSprite(&enemyBullet);
2024-02-25 21:59:04 +00:00
if (enemyBulletPosition[i].willBeInactive) {
enemyBulletPosition[i].isActive = 0;
}
}
}
2024-02-21 21:25:00 +00:00
int setupGame() {
2024-02-15 13:34:50 +00:00
FILE *fh;
2024-02-15 01:15:55 +00:00
installKeyboardHandler();
2024-02-15 13:34:50 +00:00
initializeDrawBuffer();
2024-03-01 12:55:01 +00:00
buildDifficultyBands();
buildHitPointRages();
setupWallSprites();
2024-02-16 02:18:15 +00:00
setupRabbitSprites();
2024-02-21 13:25:55 +00:00
setupRabbitBullets();
2024-02-27 13:16:16 +00:00
setupEnemies();
setupEnemyBullets();
2024-02-21 21:25:00 +00:00
setupEnemySprites();
2024-02-27 13:16:16 +00:00
setupPowerup();
2024-02-27 01:40:05 +00:00
setupPowerupSprites();
2024-02-15 13:34:50 +00:00
setVideoMode(VIDEO_MODE_VGA_256);
2024-02-29 02:07:35 +00:00
setVGAColors(palette, PALETTE_COLOR_COUNT);
2024-02-15 01:15:55 +00:00
2024-02-20 11:48:12 +00:00
activateMouse(&mouseStatus);
2024-02-16 02:18:15 +00:00
buildArena();
2024-02-21 13:25:55 +00:00
clearArenaRedrawRequests();
2024-02-15 13:34:50 +00:00
2024-02-21 21:25:00 +00:00
srand(time(NULL));
return 0;
}
void handleMovement() {
handleRabbitMovement(
&rabbitPosition,
&keyboardKeydownState
);
2024-02-25 21:59:04 +00:00
handleEnemyMovement(
enemyPosition,
&rabbitPosition
);
captureAndLimitMousePosition(
&rabbitPosition,
&mouseStatus
);
calculateTargetAngle(
&rabbitPosition
);
}
void handleCombat() {
2024-02-26 12:52:59 +00:00
int didHitRabbit;
if (mouseStatus.leftButtonDown) {
2024-02-27 13:16:16 +00:00
if (attemptToFireRabbitBullet(
&rabbitPosition,
&rabbitWeaponry,
rabbitBulletPosition
2024-02-27 13:16:16 +00:00
)) {
fireCurrentWeaponOnce(
&rabbitWeaponry
);
2024-02-27 13:16:16 +00:00
}
}
2024-02-25 21:59:04 +00:00
attemptToFireEnemyBullets(
enemyPosition,
enemyBulletPosition,
2024-02-26 12:52:59 +00:00
&rabbitPosition,
2024-02-28 17:50:57 +00:00
globalGameState.difficulty
2024-02-25 21:59:04 +00:00
);
advanceRabbitBullets(
rabbitBulletPosition,
&rabbitWeaponry
);
2024-02-25 21:59:04 +00:00
advanceEnemyBullets(
enemyBulletPosition
);
2024-02-25 20:48:19 +00:00
buildCollisionGrids(
rabbitBulletPosition,
2024-02-26 12:52:59 +00:00
enemyBulletPosition,
2024-02-25 20:48:19 +00:00
&rabbitPosition,
2024-02-27 13:16:16 +00:00
enemyPosition,
&playerPowerup
2024-02-25 20:48:19 +00:00
);
2024-02-26 12:52:59 +00:00
didHitRabbit = handleRabbitToEnemyCollisions(
&rabbitPosition,
enemyPosition
);
2024-02-26 12:52:59 +00:00
if (didHitRabbit) {
globalGameState.health -= ENEMY_COLLISION_DAMAGE * didHitRabbit;
2024-02-26 12:52:59 +00:00
}
didHitRabbit = handleEnemyBulletToRabbitCollisions(
enemyBulletPosition,
&rabbitPosition
);
if (didHitRabbit) {
globalGameState.health -= ENEMY_BULLET_DAMAGE * didHitRabbit;
2024-02-26 12:52:59 +00:00
}
handleRabbitBulletToEnemyCollisions(
rabbitBulletPosition,
2024-03-04 22:38:03 +00:00
enemyPosition,
&rabbitWeaponry
);
2024-02-27 13:16:16 +00:00
if (handleRabbitToPowerupCollision(&rabbitPosition, &playerPowerup)) {
playerPowerup.willBeInactive = 1;
2024-03-02 01:40:51 +00:00
rabbitWeaponry.currentWeapon = playerPowerup.type;
rabbitWeaponry.currentWeaponRemainingRounds = determineWeaponRounds(globalGameState.difficulty);
2024-02-27 13:16:16 +00:00
}
}
void handleRedraw() {
drawOnlyRabbitArena();
drawOnlyEnemiesArena();
drawOnlyMouseArena();
drawOnlyRabbitBulletArena();
2024-02-25 21:59:04 +00:00
drawOnlyEnemyBulletArena();
2024-02-27 13:16:16 +00:00
drawOnlyPowerupArena();
redrawArena();
2024-02-27 01:40:05 +00:00
renderPowerup();
renderRabbit();
renderEnemies();
renderMouse();
renderRabbitBullets();
2024-02-25 21:59:04 +00:00
renderEnemyBullets();
}
/*
2024-02-21 21:25:00 +00:00
double speedCalcs[200];
int currentSpeedCalc = 0;
double averageSpeedCalc;
clock_t startTime;
*/
2024-02-21 21:25:00 +00:00
2024-03-04 22:38:03 +00:00
struct PriorStats {
int kills;
int health;
int remainingRounds;
int coins;
int damageUpgradeAvailable;
int healthUpgradeAvailable;
int healthGainUpgradeAvailable;
} priorStats = {
.kills = -1,
.health = -1,
.remainingRounds = -1,
.coins = -1,
.damageUpgradeAvailable = -1,
.healthUpgradeAvailable = -1,
.healthGainUpgradeAvailable = -1
};
struct UpgradesAvailable {
char damage;
char health;
char healthGain;
} upgradesAvailable = {
.damage = 0,
.health = 0,
.healthGain = 0,
};
void calculateUpgradesAvailable() {
if (globalGameState.damageUpgradeLevel < 3) {
upgradesAvailable.damage = globalGameState.coins >= damageUpgradeCosts[globalGameState.damageUpgradeLevel];
} else {
upgradesAvailable.damage = 0;
}
if (globalGameState.healthUpgradeLevel < 3) {
upgradesAvailable.health = globalGameState.coins >= healthUpgradeCosts[globalGameState.healthUpgradeLevel];
} else {
upgradesAvailable.health = 0;
}
if (globalGameState.healthGainUpgradeLevel < 3) {
upgradesAvailable.healthGain = globalGameState.coins >= healthGainUpgradeCosts[globalGameState.healthGainUpgradeLevel];
} else {
upgradesAvailable.healthGain = 0;
}
}
void redrawGameStats() {
char buffer[20];
if (priorStats.kills != globalGameState.kills) {
sprintf(buffer, "Hit: %d", globalGameState.kills);
renderStringToDrawBuffer(buffer, 1, 0, 210, 20);
priorStats.kills = globalGameState.kills;
}
if (priorStats.health != globalGameState.health) {
sprintf(buffer, "Health: %d ", globalGameState.health);
renderStringToDrawBuffer(buffer, 1, 0, 210, 30);
priorStats.health = globalGameState.health;
}
if (priorStats.remainingRounds != rabbitWeaponry.currentWeaponRemainingRounds) {
sprintf(buffer, "Rnds: %d ", rabbitWeaponry.currentWeaponRemainingRounds);
renderStringToDrawBuffer(buffer, 1, 0, 210, 40);
priorStats.remainingRounds = rabbitWeaponry.currentWeaponRemainingRounds;
}
if (priorStats.coins != globalGameState.coins) {
sprintf(buffer, "Coins: %d ", globalGameState.coins);
renderStringToDrawBuffer(buffer, 1, 0, 210, 50);
priorStats.coins = globalGameState.coins;
}
if (priorStats.damageUpgradeAvailable != upgradesAvailable.damage) {
if (upgradesAvailable.damage) {
sprintf(buffer, "[P] Dmg up");
} else {
sprintf(buffer, " ");
}
renderStringToDrawBuffer(buffer, 1, 0, 210, 100);
priorStats.damageUpgradeAvailable = upgradesAvailable.damage;
}
if (priorStats.healthUpgradeAvailable != upgradesAvailable.health) {
if (upgradesAvailable.health) {
sprintf(buffer, "[O] Health up");
} else {
sprintf(buffer, " ");
}
renderStringToDrawBuffer(buffer, 1, 0, 210, 110);
priorStats.healthUpgradeAvailable = upgradesAvailable.health;
}
if (priorStats.healthGainUpgradeAvailable != upgradesAvailable.healthGain) {
if (upgradesAvailable.healthGain) {
sprintf(buffer, "[I] HGain up");
} else {
sprintf(buffer, " ");
}
renderStringToDrawBuffer(buffer, 1, 0, 210, 120);
priorStats.healthGainUpgradeAvailable = upgradesAvailable.healthGain;
}
}
2024-02-21 21:25:00 +00:00
int main(void) {
2024-02-24 12:36:18 +00:00
byte *drawBuffer;
2024-02-21 21:25:00 +00:00
int keepRunning = 1;
int i;
2024-02-21 21:25:00 +00:00
2024-02-26 12:52:59 +00:00
char buffer[20];
2024-02-21 21:25:00 +00:00
if (setupGame()) return 1;
2024-02-24 12:36:18 +00:00
drawBuffer = getDrawBuffer();
2024-02-16 02:18:15 +00:00
while (keepRunning) {
readMouse(&mouseStatus);
populateKeyboardKeydownState();
2024-02-21 13:25:55 +00:00
2024-02-28 17:50:57 +00:00
maybeSpawnEnemy(
&globalGameState,
enemyPosition,
&rabbitPosition
);
2024-02-25 20:48:19 +00:00
handleCombat();
2024-03-04 22:38:03 +00:00
handleRedraw();
handleEnemyKills(
enemyPosition,
&globalGameState,
2024-03-01 12:55:01 +00:00
&playerPowerup,
&rabbitWeaponry
);
2024-03-04 22:38:03 +00:00
handleMovement();
2024-02-26 12:52:59 +00:00
2024-03-04 22:38:03 +00:00
calculateUpgradesAvailable();
redrawGameStats();
if (keyboardKeydownState.KEY_P && upgradesAvailable.damage) {
globalGameState.coins -= damageUpgradeCosts[globalGameState.damageUpgradeLevel];
globalGameState.damageUpgradeLevel++;
rabbitWeaponry.damage++;
}
if (keyboardKeydownState.KEY_O && upgradesAvailable.health) {
globalGameState.coins -= healthUpgradeCosts[globalGameState.healthUpgradeLevel];
globalGameState.healthUpgradeLevel++;
globalGameState.maxHealth += HEALTH_UPGRADE_GAIN;
globalGameState.health = globalGameState.maxHealth;
}
if (keyboardKeydownState.KEY_I && upgradesAvailable.healthGain) {
globalGameState.coins -= healthGainUpgradeCosts[globalGameState.healthGainUpgradeLevel];
globalGameState.healthGainUpgradeLevel++;
globalGameState.healthGainPerKill++;
}
2024-02-20 13:20:35 +00:00
waitStartVbl();
2024-02-15 13:34:50 +00:00
copyDrawBufferToDisplay();
2024-02-25 21:59:04 +00:00
2024-02-15 13:34:50 +00:00
waitEndVbl();
2024-02-16 02:18:15 +00:00
2024-02-20 17:39:28 +00:00
if (keyboardKeydownState.KEY_ESC) { keepRunning = 0; }
2024-02-15 01:15:55 +00:00
}
2024-02-16 02:18:15 +00:00
freeBMP(&spritesheetImage);
setVideoMode(VIDEO_MODE_80x25_TEXT);
uninstallKeyboardHandler();
/*
2024-02-21 21:25:00 +00:00
averageSpeedCalc = 0;
for (currentSpeedCalc = 0; currentSpeedCalc < 200; ++currentSpeedCalc) {
averageSpeedCalc += speedCalcs[currentSpeedCalc];
}
averageSpeedCalc /= 200;
fprintf(stderr, "average: %f\n", averageSpeedCalc);
*/
2024-02-21 13:25:55 +00:00
2024-02-15 13:34:50 +00:00
return 0;
2024-02-15 01:15:55 +00:00
}