diff --git a/gfx/entities/shadowMine.png b/gfx/entities/shadowMine.png new file mode 100644 index 0000000..d018b85 Binary files /dev/null and b/gfx/entities/shadowMine.png differ diff --git a/src/battle/mine.c b/src/battle/mine.c index a873375..0f0f4ff 100644 --- a/src/battle/mine.c +++ b/src/battle/mine.c @@ -23,29 +23,40 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. static void think(void); static void die(void); static void lookForFighters(void); +static void lookForPlayer(void); static void doSplashDamage(void); static SDL_Texture *mineWarning = NULL; static SDL_Texture *mineNormal = NULL; +static SDL_Texture *shadowMine = NULL; -Entity *spawnMine(void) +Entity *spawnMine(int type) { Entity *mine = spawnEntity(); - if (!mineNormal || !mineWarning) + if (!mineWarning) { + shadowMine = getTexture("gfx/entities/shadowMine.png"); mineNormal = getTexture("gfx/entities/mine.png"); mineWarning = getTexture("gfx/entities/mineWarning.png"); } - mine->type = ET_MINE; + STRNCPY(mine->name, "Mine", MAX_NAME_LENGTH); + mine->type = type; mine->health = mine->maxHealth = 1; mine->speed = 1; mine->systemPower = SYSTEM_POWER; - mine->texture = mineNormal; + mine->texture = (type == ET_MINE) ? mineNormal : shadowMine; mine->action = think; mine->die = die; - mine->flags = EF_TAKES_DAMAGE+EF_NO_PLAYER_TARGET; + mine->flags = EF_TAKES_DAMAGE+EF_NO_PLAYER_TARGET+EF_SHORT_RADAR_RANGE; + + if (type == ET_SHADOW_MINE) + { + mine->flags &= ~EF_NO_PLAYER_TARGET; + mine->speed = 100 + rand() % 100; + mine->speed *= 0.01; + } SDL_QueryTexture(mine->texture, NULL, NULL, &mine->w, &mine->h); @@ -54,7 +65,7 @@ Entity *spawnMine(void) static void think(void) { - self->texture = mineNormal; + self->texture = (self->type == ET_MINE) ? mineNormal : shadowMine; self->angle += 0.1; @@ -66,7 +77,14 @@ static void think(void) self->dx *= 0.99; self->dy *= 0.99; - lookForFighters(); + if (self->type == ET_MINE) + { + lookForFighters(); + } + else + { + lookForPlayer(); + } if (self->systemPower < SYSTEM_POWER && battle.stats[STAT_TIME] % 8 < 4) { @@ -101,6 +119,44 @@ static void lookForFighters(void) self->systemPower = SYSTEM_POWER; } +static void lookForPlayer(void) +{ + float dx, dy, norm; + int distance; + + if (player != NULL) + { + distance = getDistance(self->x, self->y, player->x, player->y); + + if (distance < SCREEN_WIDTH) + { + dx = player->x - self->x; + dy = player->y - self->y; + + norm = sqrt(dx * dx + dy * dy); + + dx /= norm; + dy /= norm; + + self->dx = dx * self->speed; + self->dy = dy * self->speed; + + if (distance <= TRIGGER_RANGE) + { + self->systemPower--; + + if (self->systemPower <= 0) + { + self->health = 0; + } + + return; + } + } + } + + self->systemPower = SYSTEM_POWER; +} static void die(void) { @@ -116,6 +172,8 @@ static void die(void) playBattleSound(SND_EXPLOSION_5, self->x, self->y); self->alive = ALIVE_DEAD; + + updateObjective(self->name, TT_DESTROY); } static void doSplashDamage(void) diff --git a/src/battle/mine.h b/src/battle/mine.h index 6c868fb..ea4c02b 100644 --- a/src/battle/mine.h +++ b/src/battle/mine.h @@ -31,6 +31,7 @@ extern int getDistance(int x1, int y1, int x2, int y2); extern void addMineExplosion(void); extern void damageFighter(Entity *e, int amount, long flags); extern void playBattleSound(int id, int x, int y); +extern void updateObjective(char *name, int type); extern Battle battle; extern Entity *player; diff --git a/src/battle/radar.c b/src/battle/radar.c index 2416325..cd5649c 100644 --- a/src/battle/radar.c +++ b/src/battle/radar.c @@ -88,7 +88,7 @@ void drawRadar(void) SDL_SetRenderDrawColor(app.renderer, 255, 255, 255, 255); } - if (e->type == ET_MINE || e->type == ET_JUMPGATE || (e->owner && e->owner->type == ET_JUMPGATE)) + if (e->type == ET_MINE || e->type == ET_SHADOW_MINE || e->type == ET_JUMPGATE || (e->owner && e->owner->type == ET_JUMPGATE)) { SDL_SetRenderDrawColor(app.renderer, 255, 255, 255, 255); } diff --git a/src/defs.h b/src/defs.h index eab351a..489a053 100644 --- a/src/defs.h +++ b/src/defs.h @@ -162,7 +162,8 @@ enum ET_COMPONENT_ENGINE, ET_CAPITAL_SHIP, ET_JUMPGATE, - ET_MINE + ET_MINE, + ET_SHADOW_MINE }; enum diff --git a/src/galaxy/mission.c b/src/galaxy/mission.c index 2a88127..a7f97b0 100644 --- a/src/galaxy/mission.c +++ b/src/galaxy/mission.c @@ -321,7 +321,8 @@ static void loadEntities(cJSON *node) break; case ET_MINE: - e = spawnMine(); + case ET_SHADOW_MINE: + e = spawnMine(type); break; default: diff --git a/src/galaxy/mission.h b/src/galaxy/mission.h index 5f53a20..90ddc91 100644 --- a/src/galaxy/mission.h +++ b/src/galaxy/mission.h @@ -58,7 +58,7 @@ extern void loadItems(cJSON *node); extern void loadLocations(cJSON *node); extern void loadSpawners(cJSON *node); extern void loadChallenge(Mission *mission, cJSON *node); -extern Entity *spawnMine(void); +extern Entity *spawnMine(int type); extern void activateNextWaypoint(void); extern Battle battle; diff --git a/src/system/lookup.c b/src/system/lookup.c index c276977..dcb24f2 100644 --- a/src/system/lookup.c +++ b/src/system/lookup.c @@ -46,6 +46,7 @@ void initLookups(void) addLookup("ET_JUMPGATE", ET_JUMPGATE); addLookup("ET_CAPITAL_SHIP", ET_CAPITAL_SHIP); addLookup("ET_MINE", ET_MINE); + addLookup("ET_SHADOW_MINE", ET_SHADOW_MINE); addLookup("EF_NO_KILL", EF_NO_KILL); addLookup("EF_DISABLED", EF_DISABLED);