From 5081aa5a6ae82edbb338ee5835bd135c57db5a9c Mon Sep 17 00:00:00 2001 From: stevenhowes <38082088+stevenhowes@users.noreply.github.com> Date: Sun, 21 Mar 2021 00:20:36 +0000 Subject: [PATCH] Enemies shoot back! --- !RunImage,ff8 | Bin 11592 -> 12096 bytes c/CTheEscape | 133 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 93 insertions(+), 40 deletions(-) diff --git a/!RunImage,ff8 b/!RunImage,ff8 index 2b4abf54a9639826a979ad3d18a9201da8254124..9961ba706fd2c693d4bbaf05161e2d05920b6bb0 100644 GIT binary patch delta 4549 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 KpaIY^(EkDVn1Im$ diff --git a/c/CTheEscape b/c/CTheEscape index 72bd757..b367700 100644 --- a/c/CTheEscape +++ b/c/CTheEscape @@ -55,6 +55,8 @@ struct NPC_s { int collideforce; int collidable; int explodenextframe; + int nextfire; + int fireinterval; }; struct Star_s { @@ -70,6 +72,7 @@ struct Player_s { unsigned char velocity; int nextidlesprite; int shields; + int nextshieldheal; int integrity; int remainingdistance; struct EntityLocation_s hitbox_bl; @@ -172,6 +175,51 @@ void intro() } } +void game_spawn_projectile(int id, int Px, int Py, int Vx, int Vy,enum sprite_e sprite, int damage) +{ + int i; + + if(id < 0) + { + for(i = 0; i < MAX_PROJECTILES; i++) + { + if(Projectiles[i].active == 0) + id = i; + } + } + + // If no velocity X specified we're targetting the player + if(Vx == 0) + { + int Xdistance = abs((Player.location.X + (Player.hitbox_tr.X/2)) - Px); + int Ydistance = abs((Player.location.Y + (Player.hitbox_tr.Y/2)) - Py); + int distance = sqrt((Xdistance^2) + (Ydistance^2)); + Vx = Xdistance / (distance / 10); + Vy = Ydistance / (distance / 10); + if(Player.location.X > Px) + Vx = 0 - Vx; + } + + // If it's too close to horizontal you can't dodge + if(Vy < 2) + id = -1; + + //If no free IDs then we go without + if(id >= 0) + { + Projectiles[id].location.X = Px; + Projectiles[id].location.Y = Py; + Projectiles[id].velocity.X = Vx; + Projectiles[id].velocity.Y = Vy; + Projectiles[id].active = 1; + Projectiles[id].sprite = sprite; + Projectiles[id].nextframe = tick + 10; + Projectiles[id].damage = damage; + Projectiles[id].collidable = 1; + } + +} + void game_draw_player() { draw_sprite(sprites[Player.sprite], Player.location.X, Player.location.Y); @@ -340,6 +388,8 @@ void game_respawn_npc(int id) NPCS[id].location.Y = DISPLAY_Y + (rand() % (DISPLAY_Y/2)); NPCS[id].npctype = rand() % (maxnpctype); NPCS[id].collidable = 1; + NPCS[id].fireinterval = 200; + NPCS[id].nextfire = tick + (rand() % 100); switch(NPCS[id].npctype) { case bigdurno: @@ -362,7 +412,7 @@ void game_respawn_npc(int id) NPCS[id].hitbox_bl.Y = 0; NPCS[id].hitbox_tr.X = 38; NPCS[id].hitbox_tr.Y = 56; - NPCS[id].collideforce = 30; + NPCS[id].collideforce = 50; break; }; } @@ -392,6 +442,13 @@ void game_tick_npcs() if((NPCS[i].location.X + NPCS[i].hitbox_bl.X) < 0) game_respawn_npc(i); + if(tick > NPCS[i].nextfire) + { + // Dont fire if off screen + if((NPCS[i].location.Y < DISPLAY_Y)) + game_spawn_projectile(-1,NPCS[i].location.X, NPCS[i].location.Y, 0, NPCS[i].velocity.Y, photon1, 30); + NPCS[i].nextfire = tick + NPCS[i].fireinterval; + } } } @@ -489,6 +546,32 @@ void game_collider_tick() } } } + + for(i = 0; i < MAX_PROJECTILES; i++) + { + if(!Projectiles[i].active) + continue; + if(!NPCS[i].collidable) + continue; + // Excuse this formatting + if( + game_hitbox_collide( + (Player.location.X + Player.hitbox_bl.X),(Player.location.Y + Player.hitbox_bl.Y), + (Player.hitbox_tr.X - Player.hitbox_bl.X),(Player.hitbox_tr.Y - Player.hitbox_bl.Y), + Projectiles[i].location.X,Projectiles[i].location.Y, + 10,10 + ) + ) + { + Projectiles[i].active = 0; + Player.shields -= Projectiles[i].damage; + if(Player.shields < 0) + { + Player.integrity += Player.shields; + Player.shields = 0; + } + } + } } int game_hitbox_collide(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) @@ -532,46 +615,7 @@ void game_projectiles_tick() } } -void game_spawn_projectile(int id,int Px,int Py, int Vx,int Vy,enum sprite_e sprite, int damage) -{ - int i; - - if(id < 0) - { - for(i = 0; i < MAX_PROJECTILES; i++) - { - if(Projectiles[i].active == 0) - id = i; - } - } - // If no velocity X specified we're targetting the player - if(Vx == 0) - { - int Xdistance = abs(Player.location.X - Px); - int Ydistance = abs(Player.location.Y - Py); - int distance = sqrt((Xdistance^2) + (Ydistance^2)); - Vx = Xdistance / (distance / 10); - Vy = Ydistance / (distance / 10); - if(Player.location.X > Px) - Vx = 0 - Vx; - } - - //If no free IDs then we go without - if(id >= 0) - { - Projectiles[id].location.X = Px; - Projectiles[id].location.Y = Py; - Projectiles[id].velocity.X = Vx; - Projectiles[id].velocity.Y = Vy; - Projectiles[id].active = 1; - Projectiles[id].sprite = sprite; - Projectiles[id].nextframe = tick + 10; - Projectiles[id].damage = damage; - Projectiles[id].collidable = 1; - } - -} void game_input_tick() { @@ -685,6 +729,15 @@ void game_setup() void game_tick_player() { Player.remainingdistance -= Player.velocity * (tick - lasttick); + + if(Player.shields < 100) + { + if(tick > Player.nextshieldheal) + { + Player.shields += 1; + Player.nextshieldheal = tick + 10; + } + } } void game_tick()