#include #include "../../config.h" #include "../../joystick/joystick.h" #include "../../random/prng.h" #include "invaders2.h" void procCannon(Cannon * cn, pixel * shot) { static unsigned char mv = 0; if (mv++ >= CANNON_SPEED) { mv = 0; if (JOYISLEFT) { if (cn->pos < (NUM_COLS - 1)) { cn->pos++; } } else if (JOYISRIGHT) { if (cn->pos > 0) { --cn->pos; } } else if (JOYISFIRE) { if (cn->ready) { shot->x = cn->pos; shot->y = NUM_ROWS - 3; cn->ready = 0; } } } } static unsigned char areAtBorder(Invaders * iv) { unsigned char y; for (y = SPACESHIP_LINE + 1; y <= GUARD_LINE; ++y) { if (getInvaderPixel(iv, NUM_COLS - 1, y) || getInvaderPixel(iv, 0, y)) { return 1; } } return 0; } void procInvaders(Invaders * iv, pixel *st) { static unsigned char mv = 0; if (mv++ >= iv->speed) { mv = 0; if (areAtBorder(iv) && !(iv->isEdged)) { iv->pos.y++; iv->direction = -iv->direction; iv->isEdged = 1; } else { iv->pos.x += iv->direction; iv->isEdged = 0; } } unsigned char i, y; unsigned char spos = random8() % UNUM_COLS; if (random8() < SHOOTING_RATE) { for (i = 0; i < MAX_SHOTS; ++i) { if (st[i].y >= NUM_ROWS) { for (y = GUARD_LINE; y > SPACESHIP_LINE; --y) { if (getInvaderPixel(iv, spos, y) != 0) { st[i].x = spos; st[i].y = y + 1; return; } } } } //for SHOTS } } void procShots(Invaders * iv, Player * pl, Cannon * cn, Spaceship * sc, unsigned char *guards, pixel *st, pixel * shot) { unsigned char i; static unsigned char cmv = 0, imv = 0; if (cmv >= CANNON_SHOOTING_SPEED) { cmv = 0; if (!(cn->ready)) { if (shot->y > 0) { shot->y--; } else { cn->ready = 1; } } } if (imv >= INVADER_SHOOTING_SPEED) { imv = 0; for (i = MAX_SHOTS; i--;) { if (st[i].y < NUM_ROWS) { st[i].y++; } } } cmv++; imv++; /****************************************************************/ /* TESTE OB GETROFFEN */ /****************************************************************/ // USER CANNON unsigned char tmp; if (!(cn->ready)) { for (i = MAX_SHOTS; i--;) { if (shot->x == st[i].x && shot->y == st[i].y) { st[i].x = 255; st[i].y = 255; cn->ready = 1; goto invader_shots; } } //GUARDS if ((tmp = getGuardPixel(guards, shot->x, shot->y))) { --tmp; setGuardPixel(guards, shot->x, shot->y, tmp); cn->ready = 1; goto invader_shots; } //INVADER if ((tmp = getInvaderPixel(iv, shot->x, shot->y))) { --tmp; setInvaderPixel(iv, shot->x, shot->y, tmp); if (tmp == 0) { iv->speedinc++; if (iv->speedinc == SPEED_INC_RATE) { iv->speedinc = 0; iv->speed -= SPEED_INC_VALUE; } pl->points += POINTS_FOR_KILL; } else { pl->points += POINTS_FOR_HIT; } cn->ready = 1; goto invader_shots; } //SPACESHIP if (shot->y == SPACESHIP_LINE) { if ((shot->x <= sc->pos) && (shot->x >= sc->pos - 1)) { sc->pos = NO_SPACESHIP; pl->points += POINTS_FOR_SPACESHIP; cn->ready = 1; goto invader_shots; } } } invader_shots: for (i = 0; i < MAX_SHOTS; ++i) { if ((tmp = getGuardPixel(guards, st[i].x, st[i].y))) { --tmp; setGuardPixel(guards, st[i].x, st[i].y, tmp); st[i].x = 255; st[i].y = 255; } if (st[i].y == (NUM_ROWS - 2)) { if (st[i].x == cn->pos) { pl->lives--; st[i].x = 255; st[i].y = 255; } } } } void procSpaceship(Spaceship * sc) { unsigned char const rnd1 = random8(); unsigned char const rnd2 = random8(); static unsigned char sct = 0; if (sc->pos == NO_SPACESHIP) { if ((rnd1 == 73) && (rnd2 >= 200)) { sc->pos = NUM_COLS; sct = 0; } } else { if (sct++ == SPACESHIP_SPEED) { sct = 0; if (sc->pos > 0) { sc->pos--; } else { sc->pos = NO_SPACESHIP; } } } } unsigned char getStatus(Invaders * iv) { unsigned char x, y; // did invaders reached earth? for (x = NUM_COLS; x--;) { if (getInvaderPixel(iv, x, GUARD_LINE + 1)) { return 2; } } // any invaders left? for (x = MAX_INVADER_WIDTH; x--;) { for (y = MAX_INVADER_HEIGHT; y--;) { if (iv->map[x][y]) { return 0; // yes } } } // if we reach here, level was cleared \o/ return 1; }