Files
mathwars/Enemies.cpp
2017-10-13 08:11:07 +02:00

137 lines
4.1 KiB
C++

#include "Enemies.h"
#include "api.h"
#define MAX_ENEMIES 5
struct Enemy {
float x, y, by, fn;
int m1, m2;
int state;
int type;
};
Enemy enemies[MAX_ENEMIES];
int enemyTimer = 0;
int kills = 0;
int wave = 5;
int betweenWaves = 300;
int generations = 0;
int table[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
bool visited[8] = { false, false, false, false, false, false, false, false };
int tableSize = 8;
void ResetEnemies() {
enemyTimer = 0;
kills = 0;
generations = 0;
tableSize = 8;
for (int i = 0; i < 8; i++) { table[i] = i; visited[i] = false; }
for (int i = 0; i < MAX_ENEMIES; i++) {
enemies[i].x = enemies[i].y = enemies[i].by = -1;
enemies[i].fn = 0;
enemies[i].state = 0;
enemies[i].type = rand() % 2;
}
}
Enemies::Enemies() {
ResetEnemies();
RegisterMessage("CheckEnemyHit", this);
RegisterMessage("ResetEnemies", this);
}
void GenerateNewEnemy() {
if (generations >= 16) return;
enemyTimer = 60 + SDL_max(60 - (kills), 0);
for (int i = 0; i < MAX_ENEMIES; i++) {
if (enemies[i].y == -1) {
generations++;
enemies[i].by = enemies[i].y = 20 + rand() % 230;
enemies[i].fn = 0;
enemies[i].x = 480;
enemies[i].m1 = 1 + wave; // (rand() % (3 + SDL_min(int(SDL_floor(kills / 5.0f)), 4)));
int num = rand() % tableSize;
/*char peiv[10]; itoa(table[num], peiv, 10);
SDL_Log(peiv);*/
enemies[i].m2 = 2 + table[num];
if (visited[table[num]]) { tableSize--; if (num < tableSize) table[num] = table[tableSize]; } else { visited[table[num]] = true; }
enemies[i].state = 0;
enemies[i].type = rand() % 2;
return;
}
}
}
void Enemies::Update() {
if (betweenWaves > 0) {
betweenWaves--;
if (betweenWaves < 240) {
char waveText[7] = "WAVE 0"; waveText[5] = wave + 48;
Print(200, 120, waveText, 255, 255, 255);
}
} else {
enemyTimer--;
if (enemyTimer <= 0) GenerateNewEnemy();
for (int i = 0; i < MAX_ENEMIES; i++) {
if (enemies[i].y > -1) {
enemies[i].fn += (0.01f + kills*0.0025f);
enemies[i].y = enemies[i].by + SDL_sinf(enemies[i].fn)*10.0f;
enemies[i].x -= (0.5f + kills*0.02f);
if (enemies[i].state == 0 && enemies[i].x <= 100) {
SendMessage("CreateNewLaser", enemies[i].x, enemies[i].y, 40, 125, 1);
Blink();
SendMessage("HeroHit");
enemyTimer = 400;
for (int j = 0; j < MAX_ENEMIES; j++) {
if (enemies[j].y < 135) { enemies[j].state = 10; }
else { enemies[j].state = -10; }
enemies[j].m1 = enemies[j].m2 = 0;
}
//betweenWaves = 420; ResetEnemies();
}
if (enemies[i].state != 0) enemies[i].x -= 1.0f;
if (enemies[i].state > 0) enemies[i].y -= 1.0f;
if (enemies[i].state < 0) enemies[i].y += 1.0f;
if (enemies[i].type == 0) {
Draw(enemies[i].x, enemies[i].y, 37, 64, 17, 13, enemies[i].state - SDL_cosf(enemies[i].fn)*10.0f);
}
else {
Draw(enemies[i].x, enemies[i].y, 54, 64, 21, 13, enemies[i].state - SDL_cosf(enemies[i].fn)*10.0f);
}
if (enemies[i].state == 0) {
PrintChar(enemies[i].x - 2, enemies[i].y - 10, enemies[i].m1 + 48, 0, 255, 0);
PrintChar(enemies[i].x + 5, enemies[i].y - 10, 'x', 128, 128, 128);
PrintChar(enemies[i].x + 12, enemies[i].y - 10, enemies[i].m2 + 48, 0, 255, 0);
}
if (enemies[i].x < -20) { enemies[i].x = enemies[i].y = -1; }
}
}
}
}
void CheckEnemyHit(int n1, int n2) {
for (int i = 0; i < MAX_ENEMIES; i++) {
if (enemies[i].y > -1) {
if (enemies[i].m1 * enemies[i].m2 == n1 * 10 + n2) {
SendMessage("CreateNewLaser", 40, 125, enemies[i].x, enemies[i].y, 0);
Blink();
kills++;
SendMessage("GenerateExplosion", enemies[i].x, enemies[i].y); //GenerateExplosion(enemies[i].x, enemies[i].y);
enemies[i].x = enemies[i].y = -1;
SendMessage("IncreaseScore", 100); //score += 100;
if (kills == 16) {
betweenWaves = 360; wave++; ResetEnemies();
}
}
}
}
}
void Enemies::ProcessMessage(const char* msg) {
if (msg == "CheckEnemyHit") {
int* params = GetMessageParams();
CheckEnemyHit(params[0], params[1]);
} else if (msg == "ResetEnemies") {
betweenWaves = 420; ResetEnemies();
}
}