Subversion Repositories battle

[/] [trunk/] [Battle/] [CannonNPC.cpp] - Rev 171

Compare with Previous | Blame | View Log

#include "SDL/SDL.h"

#include "Gameplay.h"

#include "Projectile.h"

#include "CannonNPC.h"

#define CANNON_W        0
#define CANNON_NW       1
#define CANNON_N        2
#define CANNON_NE       3
#define CANNON_E        4
#define CANNON_W_D      5
#define CANNON_NW_D     6
#define CANNON_N_D      7
#define CANNON_NE_D     8
#define CANNON_E_D      9

CannonNPC::CannonNPC() : NPC() {
        is_stationary = true;

        frame_w = 52;
        frame_h = 36;

        frames = 5;

        frame_idle = CANNON_N;

        frame_dead = 0;

        sprites = Main::graphics->npc_cannon;
        
        position->w = frame_w;
        position->h = frame_h;

        last_position->w = frame_w;
        last_position->h = frame_h;

        hitpoints = 50;

        frame_first = CANNON_W;
        frame_last = CANNON_E;
}

void CannonNPC::process() {
        if(!is_dead && hitpoints <= 0) {
                is_dead = true;
                dead_start = Gameplay::frame;
        }
        if(is_dead && (Gameplay::frame - dead_start >= 30)) {
                done = true;
        }

        if(hitpoints <= 25 && current_sprite <= CANNON_E) {
                current_sprite += frames;
                frame_first = CANNON_W_D;
                frame_last = CANNON_E_D;
        }

        if(Gameplay::frame % 60 == 0) {
                cycle_sprite_updown(frame_first, frame_last);
        }

        if(Gameplay::frame % 20 == 0) {
                shoot();
        }
}

void CannonNPC::reset() {
        if(move_direction == -1) {
                set_sprite(CANNON_W);
        } else {
                set_sprite(CANNON_E);
        }

}

void CannonNPC::shoot() {
        Projectile * pr;
        SDL_Rect * clip_weapon;

        clip_weapon = new SDL_Rect();
        clip_weapon->x = 0;
        clip_weapon->y = 0;
        clip_weapon->w = 8;
        clip_weapon->h = 8;

        pr = new Projectile(Main::graphics->weapons, clip_weapon);
        pr->owner = NULL;

        pr->damage = 10;
        
        pr->speedx = 0;
        pr->speedy = 0;

        pr->max_distance = 500;

        switch(current_sprite) {
                case CANNON_W:
                case CANNON_W_D:
                        pr->speedx = -10;
                        pr->position->x = position->x - 8;
                        pr->position->y = position->y + 22;
                        break;
                case CANNON_NW:
                case CANNON_NW_D:
                        pr->speedx = -7;
                        pr->speedy = -7;
                        pr->position->x = position->x - 2;
                        pr->position->y = position->y + 2;
                        break;
                case CANNON_N:
                case CANNON_N_D:
                        pr->speedy = -10;
                        pr->position->x = position->x + 22;
                        pr->position->y = position->y;
                        break;
                case CANNON_NE:
                case CANNON_NE_D:
                        pr->speedx = 7;
                        pr->speedy = -7;
                        pr->position->x = position->x + position->w - 8;
                        pr->position->y = position->y + 2;
                        break;
                case CANNON_E:
                case CANNON_E_D:
                        pr->speedx = 10;
                        pr->position->x = position->x + position->w - 8;
                        pr->position->y = position->y + 22;
                        break;
        }
        
        Gameplay::instance->add_object(pr);
}

void CannonNPC::hit_player_side(Player * p) {
        if(p->damage(10)) {
                Main::audio->play(SND_HIT, position->x);
        }
}

void CannonNPC::hit_player_top_bottom(Player * p) {
        if(p->damage(10)) {
                Main::audio->play(SND_HIT, position->x);
        }
}

Compare with Previous | Blame