diff options
author | quou <quou@disroot.org> | 2024-10-02 18:47:37 +1000 |
---|---|---|
committer | quou <quou@disroot.org> | 2024-10-02 18:47:37 +1000 |
commit | 4d94823a1523db6dc218bdc0d86689616c13599d (patch) | |
tree | cfc6dc5bf3cbfff9c0a31b7939441d86116eff29 | |
parent | 911f57c63ec6de6fb5704c97130b65e676b2c16e (diff) |
Gun special
-rw-r--r-- | config.h | 1 | ||||
-rw-r--r-- | obj.h | 10 | ||||
-rw-r--r-- | player.c | 58 | ||||
-rw-r--r-- | world.c | 5 | ||||
-rw-r--r-- | world.h | 1 |
5 files changed, 75 insertions, 0 deletions
@@ -39,6 +39,7 @@ #define player_attack_frames 10 #define player_lunge_force (f1) #define player_slash_damage 1 +#define player_gun_damage 10 #define player_health 8 #define player_special_hits 4 #define player_hurt_freeze 4 @@ -45,6 +45,16 @@ void update_player( void ren_player(const Player* p, struct Renderer* r); typedef struct { + int x, y, w; + int life; +} Laser; + +void init_laser(Laser* l); +void activate_laser(Laser* l, int x, int y); +void update_laser(Laser* l); +void ren_laser(const Laser* l, struct Renderer* r); + +typedef struct { int x, y; int frame, anim; int bmp; @@ -178,6 +178,25 @@ void update_player_hurt(Player* p, World* w) { } } +void update_player_special(Player* p, const App* a, World* w) { + if (p->charge < player_special_hits) return; + if (!btn_just_pressed(a, btn_special)) return; + if (p->spec == special_gun) { + int sx; + Rect dz = { 0, 0, 500, 16 }; + if (p->face == face_left) + sx = (p->x >> fbits) - dz.w; + else + sx = (p->x >> fbits) + 16; + dz.x = sx; + dz.y = (p->y >> fbits); + inst_deathzone(w, &dz, 0, 0, player_gun_damage, 1, 1); + activate_laser(&w->laser, dz.x, dz.y); + w->freeze = 3; + } + p->charge = 0; +} + void update_player( Player* p, World* w, @@ -185,6 +204,7 @@ void update_player( const Map* map ) { update_player_move(p, app, w); + update_player_special(p, app, w); update_player_hurt(p, w); update_player_phys(p, map); update_player_anim(p); @@ -195,3 +215,41 @@ void ren_player(const Player* p, struct Renderer* r) { if (p->inv & 5) return; ren_map(r, p->x >> fbits, p->y >> fbits, &p->rect, b); } + +void init_laser(Laser* l) { + l->life = 0; +} + +void activate_laser(Laser* l, int x, int y) { + l->life = 10; + l->x = x; + l->y = y; +} + +void update_laser(Laser* l) { + l->life--; +} + +void ren_laser(const Laser* l, struct Renderer* r) { + const int h = 10; + const int hr = h - l->life; + const int hr2 = hr >> 1; + Rect re; + re.x = l->x; + re.y = l->y + hr2; + re.w = 500; + re.h = 10 - hr; + ren_rect(r, &re); + re.h = 1; + re.y = l->y - hr2; + ren_rect(r, &re); + re.h = 1; + re.y = l->y + h + hr2; + ren_rect(r, &re); + re.h = 1; + re.y = l->y - hr; + ren_rect(r, &re); + re.h = 1; + re.y = l->y + h + hr; + ren_rect(r, &re); +} @@ -8,6 +8,7 @@ void init_world(World* w) { w->frame = 0; w->freeze = 0; init_player(&w->player); + init_laser(&w->laser); } Particle* inst_particle( @@ -55,6 +56,8 @@ Deathzone* inst_deathzone( void update_world(World* w, const App* a) { int i; + if (w->laser.life) + update_laser(&w->laser); if (w->freeze) { w->freeze--; return; @@ -80,5 +83,7 @@ void ren_world(const World* w, struct Renderer* r) { ren_particle(&w->particles[i], r); for (i = 0; i < w->enemy_count; i++) ren_enemy(&w->enemies[i], r); + if (w->laser.life) + ren_laser(&w->laser, r); ren_hud(w, r); } @@ -17,6 +17,7 @@ typedef struct World { int particle_count, enemy_count; int deathzone_count; Player player; + Laser laser; Map map; int frame, freeze; } World; |