more tests, tuning difficulty
This commit is contained in:
parent
64de129fc4
commit
6e15ee3d82
2
bin/test
2
bin/test
|
@ -1,4 +1,4 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
wmake clean && wmake test && dosbox-x -nolog test.exe
|
wmake clean && wmake test && dosbox-x -c 132x60 -nolog test.exe
|
||||||
|
|
||||||
|
|
22
combat.c
22
combat.c
|
@ -375,8 +375,6 @@ int handleEnemyBulletToRabbitCollisions(
|
||||||
return hitCount;
|
return hitCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define KNOCKBACK_DISTANCE (3)
|
|
||||||
|
|
||||||
void knockbackEnemy(
|
void knockbackEnemy(
|
||||||
struct EnemyPosition *enemy,
|
struct EnemyPosition *enemy,
|
||||||
int angle
|
int angle
|
||||||
|
@ -464,6 +462,8 @@ int handleRabbitToPowerupCollision(
|
||||||
struct RabbitPosition *rabbitPosition,
|
struct RabbitPosition *rabbitPosition,
|
||||||
struct PlayerPowerup *playerPowerup
|
struct PlayerPowerup *playerPowerup
|
||||||
) {
|
) {
|
||||||
|
struct CompiledSpriteRender *which;
|
||||||
|
|
||||||
if (!playerPowerup->isActive) return 0;
|
if (!playerPowerup->isActive) return 0;
|
||||||
|
|
||||||
rabbit.x = rabbitPosition->rabbitPosition[0];
|
rabbit.x = rabbitPosition->rabbitPosition[0];
|
||||||
|
@ -472,17 +472,17 @@ int handleRabbitToPowerupCollision(
|
||||||
|
|
||||||
switch (playerPowerup->type) {
|
switch (playerPowerup->type) {
|
||||||
case POWERUP_TYPE_SHOTGUN:
|
case POWERUP_TYPE_SHOTGUN:
|
||||||
shotgun.x = playerPowerup->x;
|
which = &shotgun;
|
||||||
shotgun.y = playerPowerup->y;
|
|
||||||
populateTargetCollision(&shotgun);
|
|
||||||
break;
|
break;
|
||||||
case POWERUP_TYPE_SHIELD_KILLER:
|
case POWERUP_TYPE_SHIELD_KILLER:
|
||||||
shieldKiller.x = playerPowerup->x;
|
which = &shieldKiller;
|
||||||
shieldKiller.y = playerPowerup->y;
|
|
||||||
populateTargetCollision(&shieldKiller);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
which->x = playerPowerup->x;
|
||||||
|
which->y = playerPowerup->y;
|
||||||
|
populateTargetCollision(which);
|
||||||
|
|
||||||
return isCollision();
|
return isCollision();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -507,7 +507,7 @@ void handleEnemyKills(
|
||||||
struct PlayerPowerup *playerPowerup,
|
struct PlayerPowerup *playerPowerup,
|
||||||
struct RabbitWeaponry *rabbitWeaponry
|
struct RabbitWeaponry *rabbitWeaponry
|
||||||
) {
|
) {
|
||||||
int i, hadKill, currentKillCount;
|
int i, currentKillCount;
|
||||||
|
|
||||||
currentKillCount = processEnemyKillStates(enemyPosition);
|
currentKillCount = processEnemyKillStates(enemyPosition);
|
||||||
|
|
||||||
|
@ -516,6 +516,7 @@ void handleEnemyKills(
|
||||||
|
|
||||||
globalGameState->kills += currentKillCount;
|
globalGameState->kills += currentKillCount;
|
||||||
|
|
||||||
|
if (currentKillCount > 0) {
|
||||||
processPowerupCooldown(
|
processPowerupCooldown(
|
||||||
playerPowerup,
|
playerPowerup,
|
||||||
globalGameState,
|
globalGameState,
|
||||||
|
@ -523,8 +524,7 @@ void handleEnemyKills(
|
||||||
currentKillCount
|
currentKillCount
|
||||||
);
|
);
|
||||||
|
|
||||||
if (hadKill) {
|
for (i = 0; i < MAX_DIFFICULTY; ++i) {
|
||||||
for (i = 0; i < 10; ++i) {
|
|
||||||
if (globalGameState->kills > difficultyBands[i]) {
|
if (globalGameState->kills > difficultyBands[i]) {
|
||||||
globalGameState->difficulty = i + 1;
|
globalGameState->difficulty = i + 1;
|
||||||
}
|
}
|
||||||
|
|
3
combat.h
3
combat.h
|
@ -52,7 +52,8 @@ int handleRabbitToPowerupCollision(
|
||||||
void handleEnemyKills(
|
void handleEnemyKills(
|
||||||
struct EnemyPosition enemyPosition[],
|
struct EnemyPosition enemyPosition[],
|
||||||
struct GlobalGameState *globalGameState,
|
struct GlobalGameState *globalGameState,
|
||||||
struct PlayerPowerup *playerPowerup
|
struct PlayerPowerup *playerPowerup,
|
||||||
|
struct RabbitWeaponry *rabbitWeaponry
|
||||||
);
|
);
|
||||||
|
|
||||||
void fireCurrentWeaponOnce(struct RabbitWeaponry*);
|
void fireCurrentWeaponOnce(struct RabbitWeaponry*);
|
||||||
|
|
61
const.c
61
const.c
|
@ -1,7 +1,30 @@
|
||||||
#include "system/vga.h"
|
#include "system/vga.h"
|
||||||
#include "const.h"
|
#include "const.h"
|
||||||
|
|
||||||
int difficultyBands[MAX_DIFFICULTY] = { 10, 20, 30, 50, 80, 130, 210, 340, 550, 890 };
|
int difficultyBands[MAX_DIFFICULTY];
|
||||||
|
int hitPointRanges[MAX_DIFFICULTY][4] = {
|
||||||
|
{ 1, 1, 1, 1 },
|
||||||
|
{ 1, 1, 1, 1 },
|
||||||
|
{ 1, 1, 1, 2 },
|
||||||
|
{ 1, 1, 1, 2 },
|
||||||
|
{ 1, 1, 2, 2 },
|
||||||
|
{ 1, 2, 2, 2 },
|
||||||
|
{ 1, 2, 2, 2 },
|
||||||
|
{ 1, 2, 2, 3 },
|
||||||
|
{ 1, 2, 2, 3 },
|
||||||
|
{ 1, 2, 3, 3 },
|
||||||
|
{ 1, 2, 3, 3 },
|
||||||
|
{ 1, 2, 3, 3 },
|
||||||
|
{ 1, 2, 3, 3 },
|
||||||
|
{ 1, 2, 3, 3 },
|
||||||
|
{ 1, 2, 3, 3 },
|
||||||
|
{ 1, 2, 3, 3 },
|
||||||
|
{ 1, 2, 3, 3 },
|
||||||
|
{ 1, 2, 3, 3 },
|
||||||
|
{ 1, 2, 3, 3 },
|
||||||
|
{ 1, 2, 3, 3 }
|
||||||
|
};
|
||||||
|
|
||||||
struct SpriteBounds bounds;
|
struct SpriteBounds bounds;
|
||||||
|
|
||||||
// TODO: centralize these outside of game.c
|
// TODO: centralize these outside of game.c
|
||||||
|
@ -12,3 +35,39 @@ struct CompiledSpriteRender rabbit,
|
||||||
enemyBullet,
|
enemyBullet,
|
||||||
shotgun,
|
shotgun,
|
||||||
shieldKiller;
|
shieldKiller;
|
||||||
|
|
||||||
|
void buildDifficultyBands() {
|
||||||
|
int i;
|
||||||
|
float current = BASE_KILLS;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_DIFFICULTY; ++i) {
|
||||||
|
difficultyBands[i] = (int)current;
|
||||||
|
current *= KILLS_NEEDED_FOR_NEXT_LEVEL_MULTIPLIER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void buildHitPointRages() {
|
||||||
|
int currentRange[4] = { 1, 1, 1, 1 };
|
||||||
|
int i, j, countOfCurrent = 0, tmp;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_DIFFICULTY; ++i) {
|
||||||
|
for (j = 0; j < 4; ++j) {
|
||||||
|
hitPointRanges[i][j] = currentRange[j];
|
||||||
|
}
|
||||||
|
|
||||||
|
countOfCurrent++;
|
||||||
|
if (countOfCurrent == 2) {
|
||||||
|
countOfCurrent = 0;
|
||||||
|
|
||||||
|
currentRange[3]++;
|
||||||
|
|
||||||
|
for (j = 3; j > 0; --j) {
|
||||||
|
if (currentRange[j] > currentRange[j - 1]) {
|
||||||
|
tmp = currentRange[j - 1];
|
||||||
|
currentRange[j - 1] = currentRange[j];
|
||||||
|
currentRange[j] = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
18
const.h
18
const.h
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
#define RABBIT_MOTION_DRAG (2)
|
#define RABBIT_MOTION_DRAG (2)
|
||||||
#define RABBIT_MOTION_ACCELERATION (5)
|
#define RABBIT_MOTION_ACCELERATION (5)
|
||||||
#define RABBIT_MOTION_MAX_SPEED (12)
|
#define RABBIT_MOTION_MAX_SPEED (10)
|
||||||
#define RABBIT_MOTION_VELOCITY_DECAY (5)
|
#define RABBIT_MOTION_VELOCITY_DECAY (5)
|
||||||
|
|
||||||
#define RABBIT_BULLET_LIMIT (9)
|
#define RABBIT_BULLET_LIMIT (9)
|
||||||
|
@ -55,9 +55,20 @@
|
||||||
#define POWERUP_RESPAWN_COOLDOWN_PER_LEVEL (10)
|
#define POWERUP_RESPAWN_COOLDOWN_PER_LEVEL (10)
|
||||||
|
|
||||||
#define SHOTGUN_ROUNDS_PER_LEVEL (25)
|
#define SHOTGUN_ROUNDS_PER_LEVEL (25)
|
||||||
#define MAX_DIFFICULTY (10)
|
#define MAX_DIFFICULTY (20)
|
||||||
|
#define BASE_KILLS (10)
|
||||||
|
#define KILLS_NEEDED_FOR_NEXT_LEVEL_MULTIPLIER (2.1)
|
||||||
|
|
||||||
|
#define WEAPON_TYPE_SINGLE_SHOT_GUN (0)
|
||||||
|
#define WEAPON_TYPE_SPREAD_SHOT_GUN (1)
|
||||||
|
|
||||||
|
#define POWERUP_TYPE_SHOTGUN (0)
|
||||||
|
#define POWERUP_TYPE_SHIELD_KILLER (1)
|
||||||
|
|
||||||
|
#define KNOCKBACK_DISTANCE (3)
|
||||||
|
|
||||||
extern int difficultyBands[];
|
extern int difficultyBands[];
|
||||||
|
extern int hitPointRanges[MAX_DIFFICULTY][4];
|
||||||
extern struct SpriteBounds bounds;
|
extern struct SpriteBounds bounds;
|
||||||
|
|
||||||
extern struct CompiledSpriteRender rabbit,
|
extern struct CompiledSpriteRender rabbit,
|
||||||
|
@ -68,4 +79,7 @@ extern struct CompiledSpriteRender rabbit,
|
||||||
shotgun,
|
shotgun,
|
||||||
shieldKiller;
|
shieldKiller;
|
||||||
|
|
||||||
|
void buildDifficultyBands();
|
||||||
|
void buildHitPointRages();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
#include "cutest-1.5/CuTest.h"
|
||||||
|
#include "const.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
void TestBuildDifficultyBands(CuTest *tc) {
|
||||||
|
buildDifficultyBands();
|
||||||
|
|
||||||
|
CuAssertIntEquals(tc, 10, difficultyBands[0]);
|
||||||
|
CuAssertIntEquals(tc, 21, difficultyBands[1]);
|
||||||
|
CuAssertIntEquals(tc, 44, difficultyBands[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestBuildHitPointRanges(CuTest *tc) {
|
||||||
|
buildHitPointRages();
|
||||||
|
|
||||||
|
CuAssertIntEquals(tc, 1, hitPointRanges[0][0]);
|
||||||
|
CuAssertIntEquals(tc, 1, hitPointRanges[1][0]);
|
||||||
|
CuAssertIntEquals(tc, 2, hitPointRanges[2][0]);
|
||||||
|
CuAssertIntEquals(tc, 1, hitPointRanges[2][3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
CuSuite *ConstGetSuite() {
|
||||||
|
CuSuite *suite = CuSuiteNew();
|
||||||
|
SUITE_ADD_TEST(suite, TestBuildDifficultyBands);
|
||||||
|
SUITE_ADD_TEST(suite, TestBuildHitPointRanges);
|
||||||
|
return suite;
|
||||||
|
}
|
8
game.c
8
game.c
|
@ -318,6 +318,9 @@ int setupGame() {
|
||||||
installKeyboardHandler();
|
installKeyboardHandler();
|
||||||
initializeDrawBuffer();
|
initializeDrawBuffer();
|
||||||
|
|
||||||
|
buildDifficultyBands();
|
||||||
|
buildHitPointRages();
|
||||||
|
|
||||||
setupWallSprites();
|
setupWallSprites();
|
||||||
setupRabbitSprites();
|
setupRabbitSprites();
|
||||||
setupRabbitBullets();
|
setupRabbitBullets();
|
||||||
|
@ -481,7 +484,8 @@ int main(void) {
|
||||||
handleEnemyKills(
|
handleEnemyKills(
|
||||||
enemyPosition,
|
enemyPosition,
|
||||||
&globalGameState,
|
&globalGameState,
|
||||||
&playerPowerup
|
&playerPowerup,
|
||||||
|
&rabbitWeaponry
|
||||||
);
|
);
|
||||||
|
|
||||||
sprintf(buffer, "Hit: %d", globalGameState.kills);
|
sprintf(buffer, "Hit: %d", globalGameState.kills);
|
||||||
|
@ -492,6 +496,8 @@ int main(void) {
|
||||||
renderStringToDrawBuffer(buffer, 1, 0, 210, 40);
|
renderStringToDrawBuffer(buffer, 1, 0, 210, 40);
|
||||||
sprintf(buffer, "Cool: %d ", playerPowerup.cooldown);
|
sprintf(buffer, "Cool: %d ", playerPowerup.cooldown);
|
||||||
renderStringToDrawBuffer(buffer, 1, 0, 210, 50);
|
renderStringToDrawBuffer(buffer, 1, 0, 210, 50);
|
||||||
|
sprintf(buffer, "Wpn: %d ", rabbitWeaponry.currentWeapon);
|
||||||
|
renderStringToDrawBuffer(buffer, 1, 0, 210, 60);
|
||||||
|
|
||||||
waitStartVbl();
|
waitStartVbl();
|
||||||
copyDrawBufferToDisplay();
|
copyDrawBufferToDisplay();
|
||||||
|
|
2
makefile
2
makefile
|
@ -1,5 +1,5 @@
|
||||||
obj = sprites.o game.o bmpload.o arena.o movement.o combat.o spawn.o const.o powerup.o
|
obj = sprites.o game.o bmpload.o arena.o movement.o combat.o spawn.o const.o powerup.o
|
||||||
test_obj = test.o spawn.o spawn_test.o powerup.o powerup_test.o const.o combat.o combat_test.o
|
test_obj = test.o spawn.o spawn_test.o powerup.o powerup_test.o const.o const_test.o combat.o combat_test.o
|
||||||
|
|
||||||
all: system/system.lib game.exe test .SYMBOLIC
|
all: system/system.lib game.exe test .SYMBOLIC
|
||||||
|
|
||||||
|
|
|
@ -18,18 +18,12 @@ struct RabbitPosition {
|
||||||
int mouseAngle;
|
int mouseAngle;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define WEAPON_TYPE_SINGLE_SHOT_GUN (0)
|
|
||||||
#define WEAPON_TYPE_SPREAD_SHOT_GUN (1)
|
|
||||||
|
|
||||||
struct RabbitWeaponry {
|
struct RabbitWeaponry {
|
||||||
char cooldown;
|
char cooldown;
|
||||||
char currentWeapon;
|
char currentWeapon;
|
||||||
int currentWeaponRemainingRounds;
|
int currentWeaponRemainingRounds;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define POWERUP_TYPE_SHOTGUN (0)
|
|
||||||
#define POWERUP_TYPE_SHIELD_KILLER (1)
|
|
||||||
|
|
||||||
struct PlayerPowerup {
|
struct PlayerPowerup {
|
||||||
int x, y;
|
int x, y;
|
||||||
int cooldown;
|
int cooldown;
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "game.h"
|
#include "game.h"
|
||||||
|
|
|
@ -11,16 +11,16 @@ void TestDeterminePowerupCooldownTime(CuTest *tc) {
|
||||||
srand(1);
|
srand(1);
|
||||||
|
|
||||||
CuAssertIntEquals(tc, 18, determinePowerupCooldownTime(0));
|
CuAssertIntEquals(tc, 18, determinePowerupCooldownTime(0));
|
||||||
CuAssertIntEquals(tc, 38, determinePowerupCooldownTime(1));
|
CuAssertIntEquals(tc, 25, determinePowerupCooldownTime(1));
|
||||||
CuAssertIntEquals(tc, 33, determinePowerupCooldownTime(2));
|
CuAssertIntEquals(tc, 81, determinePowerupCooldownTime(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestDetermineShotgunRounds(CuTest *tc) {
|
void TestDetermineShotgunRounds(CuTest *tc) {
|
||||||
srand(1);
|
srand(1);
|
||||||
|
|
||||||
CuAssertIntEquals(tc, 18, determineShotgunRounds(0));
|
CuAssertIntEquals(tc, 18, determineShotgunRounds(0));
|
||||||
CuAssertIntEquals(tc, 38, determineShotgunRounds(1));
|
CuAssertIntEquals(tc, 39, determineShotgunRounds(1));
|
||||||
CuAssertIntEquals(tc, 48, determineShotgunRounds(2));
|
CuAssertIntEquals(tc, 81, determineShotgunRounds(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
15
spawn.c
15
spawn.c
|
@ -17,21 +17,8 @@ struct SpawnPointRange spawnPointRanges[4] = {
|
||||||
{ .left = TILE_SIZE - 8, .width = TILE_SIZE, .top = TILE_SIZE * 4, .height = TILE_SIZE * 2 },
|
{ .left = TILE_SIZE - 8, .width = TILE_SIZE, .top = TILE_SIZE * 4, .height = TILE_SIZE * 2 },
|
||||||
};
|
};
|
||||||
|
|
||||||
int HIT_POINT_RANGES[10][4] = {
|
|
||||||
{ 1, 1, 1, 1 },
|
|
||||||
{ 1, 1, 1, 1 },
|
|
||||||
{ 1, 1, 1, 2 },
|
|
||||||
{ 1, 1, 1, 2 },
|
|
||||||
{ 1, 1, 2, 2 },
|
|
||||||
{ 1, 2, 2, 2 },
|
|
||||||
{ 1, 2, 2, 2 },
|
|
||||||
{ 1, 2, 2, 3 },
|
|
||||||
{ 1, 2, 2, 3 },
|
|
||||||
{ 1, 2, 3, 3 }
|
|
||||||
};
|
|
||||||
|
|
||||||
int determineEnemyHitPointCalculation(int difficulty, int roll) {
|
int determineEnemyHitPointCalculation(int difficulty, int roll) {
|
||||||
return HIT_POINT_RANGES[difficulty][roll];
|
return hitPointRanges[difficulty][roll];
|
||||||
}
|
}
|
||||||
|
|
||||||
void selectEnemySpawnLocation(
|
void selectEnemySpawnLocation(
|
||||||
|
|
9
test.c
9
test.c
|
@ -1,17 +1,26 @@
|
||||||
|
#include "const.h"
|
||||||
#include "cutest-1.5/CuTest.h"
|
#include "cutest-1.5/CuTest.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
CuSuite *SpawnGetSuite();
|
CuSuite *SpawnGetSuite();
|
||||||
CuSuite *PowerupGetSuite();
|
CuSuite *PowerupGetSuite();
|
||||||
CuSuite *CombatGetSuite();
|
CuSuite *CombatGetSuite();
|
||||||
|
CuSuite *ConstGetSuite();
|
||||||
|
|
||||||
|
void beforeAll() {
|
||||||
|
buildDifficultyBands();
|
||||||
|
}
|
||||||
|
|
||||||
int RunAllTests(void) {
|
int RunAllTests(void) {
|
||||||
CuString *output = CuStringNew();
|
CuString *output = CuStringNew();
|
||||||
CuSuite *suite = CuSuiteNew();
|
CuSuite *suite = CuSuiteNew();
|
||||||
|
|
||||||
|
beforeAll();
|
||||||
|
|
||||||
CuSuiteAddSuite(suite, SpawnGetSuite());
|
CuSuiteAddSuite(suite, SpawnGetSuite());
|
||||||
CuSuiteAddSuite(suite, PowerupGetSuite());
|
CuSuiteAddSuite(suite, PowerupGetSuite());
|
||||||
CuSuiteAddSuite(suite, CombatGetSuite());
|
CuSuiteAddSuite(suite, CombatGetSuite());
|
||||||
|
CuSuiteAddSuite(suite, ConstGetSuite());
|
||||||
|
|
||||||
CuSuiteRun(suite);
|
CuSuiteRun(suite);
|
||||||
CuSuiteSummary(suite, output);
|
CuSuiteSummary(suite, output);
|
||||||
|
|
Loading…
Reference in New Issue