X-Git-Url: https://git.distorted.org.uk/~mdw/newkind/blobdiff_plain/84bbd12316a7ed2130dd1b2f2bc860a11624c3f3..40471f009dde3bd859d4524bdaca45833e12a8b4:/swat.c diff --git a/swat.c b/swat.c index e687021..104277f 100644 --- a/swat.c +++ b/swat.c @@ -18,6 +18,7 @@ * Special Weapons And Tactics. */ +#include #include #include #include @@ -53,14 +54,14 @@ int ship_count[NO_OF_SHIPS + 1]; /* many */ int initial_flags[NO_OF_SHIPS + 1] = { 0, // NULL, - 0, // missile + FLG_TARGET, // missile 0, // coriolis FLG_SLOW | FLG_FLY_TO_PLANET, // escape - FLG_INACTIVE, // alloy - FLG_INACTIVE, // cargo - FLG_INACTIVE, // boulder - FLG_INACTIVE, // asteroid - FLG_INACTIVE, // rock + FLG_INACTIVE | FLG_TARGET, // alloy + FLG_INACTIVE | FLG_TARGET, // cargo + FLG_INACTIVE | FLG_TARGET, // boulder + FLG_INACTIVE | FLG_TARGET, // asteroid + FLG_INACTIVE | FLG_TARGET, // rock FLG_FLY_TO_PLANET | FLG_SLOW, // shuttle FLG_FLY_TO_PLANET | FLG_SLOW, // transporter 0, // cobra3 @@ -69,20 +70,20 @@ int initial_flags[NO_OF_SHIPS + 1] = FLG_SLOW, // anaconda FLG_SLOW, // hermit FLG_BOLD | FLG_POLICE, // viper - FLG_BOLD | FLG_ANGRY, // sidewinder - FLG_BOLD | FLG_ANGRY, // mamba - FLG_BOLD | FLG_ANGRY, // krait - FLG_BOLD | FLG_ANGRY, // adder - FLG_BOLD | FLG_ANGRY, // gecko - FLG_BOLD | FLG_ANGRY, // cobra1 - FLG_SLOW | FLG_ANGRY, // worm - FLG_BOLD | FLG_ANGRY, // cobra3 - FLG_BOLD | FLG_ANGRY, // asp2 - FLG_BOLD | FLG_ANGRY, // python - FLG_POLICE, // fer_de_lance - FLG_BOLD | FLG_ANGRY, // moray - FLG_BOLD | FLG_ANGRY, // thargoid - FLG_ANGRY, // thargon + FLG_BOLD | FLG_ANGRY | FLG_TARGET, // sidewinder + FLG_BOLD | FLG_ANGRY | FLG_TARGET, // mamba + FLG_BOLD | FLG_ANGRY | FLG_TARGET, // krait + FLG_BOLD | FLG_ANGRY | FLG_TARGET, // adder + FLG_BOLD | FLG_ANGRY | FLG_TARGET, // gecko + FLG_BOLD | FLG_ANGRY | FLG_TARGET, // cobra1 + FLG_SLOW | FLG_ANGRY | FLG_TARGET, // worm + FLG_BOLD | FLG_ANGRY | FLG_TARGET, // cobra3 + FLG_BOLD | FLG_ANGRY | FLG_TARGET, // asp2 + FLG_BOLD | FLG_ANGRY | FLG_TARGET, // python + FLG_POLICE, // fer_de_lance + FLG_BOLD | FLG_ANGRY | FLG_TARGET, // moray + FLG_BOLD | FLG_ANGRY | FLG_TARGET, // thargoid + FLG_ANGRY | FLG_TARGET, // thargon FLG_ANGRY, // constrictor FLG_POLICE | FLG_CLOAKED, // cougar 0 // dodec @@ -311,20 +312,27 @@ void make_angry (int un) type = universe[un].type; flags = universe[un].flags; - if (flags & FLG_INACTIVE) - return; - + if (flags & FLG_INACTIVE) { + universe[un].flags |= FLG_TACTICAL; + return; + } + if ((type == SHIP_CORIOLIS) || (type == SHIP_DODEC)) { universe[un].flags |= FLG_ANGRY; return; } - + + if (!(universe[un].flags & FLG_TARGET) && + (universe[1].type == SHIP_CORIOLIS || + universe[1].type == SHIP_DODEC)) + universe[1].flags |= FLG_ANGRY; + if (type > SHIP_ROCK) { universe[un].rotx = 4; universe[un].acceleration = 2; - universe[un].flags |= FLG_ANGRY; + universe[un].flags |= FLG_ANGRY | FLG_TACTICAL; } } @@ -348,7 +356,8 @@ void explode_object (int un) void check_target (int un, struct univ_object *flip) { struct univ_object *univ; - + char buf[80]; + univ = &universe[un]; if (in_target (univ->type, flip->location.x, flip->location.y, flip->location.z)) @@ -356,7 +365,9 @@ void check_target (int un, struct univ_object *flip) if ((missile_target == MISSILE_ARMED) && (univ->type >= 0)) { missile_target = un; - info_message ("Target Locked"); + sprintf(buf, "Target Locked (%s)", + ship_list[univ->type]->name); + info_message (buf); snd_play_sample (SND_BEEP); } @@ -459,7 +470,7 @@ void fire_missile (void) ns = &universe[newship]; ns->velocity = flight_speed * 2; - ns->flags = FLG_ANGRY; + ns->flags |= FLG_TACTICAL; ns->target = missile_target; if (universe[missile_target].type > SHIP_ROCK) @@ -573,7 +584,13 @@ void missile_tactics (int un) activate_ecm (0); return; } - } + } + + if ((rand255() < 16) && + (ship_count[SHIP_CORIOLIS] || ship_count[SHIP_DODEC])) { + activate_ecm(0); + return; + } nvec = unit_vector(&vec); direction = vector_dot_product (&nvec, &missile->rotmat[2]); @@ -678,7 +695,7 @@ void tactics (int un) if (rand255() > 200) { launch_enemy (un, SHIP_SIDEWINDER + (rand255() & 3), FLG_ANGRY | FLG_HAS_ECM, 113); - ship->flags |= FLG_INACTIVE; + ship->flags |= FLG_INACTIVE | FLG_TARGET; } return; @@ -690,7 +707,7 @@ void tactics (int un) if ((type == SHIP_THARGLET) && (ship_count[SHIP_THARGOID] == 0)) { - ship->flags = 0; + ship->flags &= FLG_TARGET | FLG_TACTICAL; ship->velocity /= 2; return; } @@ -705,7 +722,7 @@ void tactics (int un) { if (cmdr.legal_status >= 64) { - flags |= FLG_ANGRY; + flags |= FLG_ANGRY | FLG_TARGET; ship->flags = flags; } } @@ -765,11 +782,13 @@ void tactics (int un) (ship->missiles >= (rand255() & 31))) { ship->missiles--; + ship->flags |= FLG_TACTICAL; if (type == SHIP_THARGOID) launch_enemy (un, SHIP_THARGLET, FLG_ANGRY, ship->bravery); else { launch_enemy (un, SHIP_MISSILE, FLG_ANGRY, 126); + ship->flags |= FLG_HOSTILE; info_message ("INCOMING MISSILE"); } return; @@ -783,7 +802,7 @@ void tactics (int un) (ship_list[type]->laser_strength != 0)) { if (direction <= -0.917) - ship->flags |= FLG_FIRING | FLG_HOSTILE; + ship->flags |= FLG_FIRING | FLG_HOSTILE | FLG_TACTICAL; if (direction <= -0.972) { @@ -986,11 +1005,13 @@ void create_thargoid (void) newship = create_other_ship (SHIP_THARGOID); if (newship != -1) { - universe[newship].flags = FLG_ANGRY | FLG_HAS_ECM; + universe[newship].flags = FLG_ANGRY | FLG_HAS_ECM | FLG_TARGET; universe[newship].bravery = 113; if (rand255() > 64) - launch_enemy (newship, SHIP_THARGLET, FLG_ANGRY | FLG_HAS_ECM, 96); + launch_enemy (newship, SHIP_THARGLET, FLG_ANGRY | FLG_HAS_ECM, + 96); + in_battle = 1; } } @@ -1036,8 +1057,8 @@ void create_trader (void) if (rnd & 1) universe[newship].flags |= FLG_HAS_ECM; -// if (rnd & 2) -// universe[newship].flags |= FLG_ANGRY; + if (rnd > (type == SHIP_ANACONDA ? 250 : 220)) + universe[newship].flags |= FLG_ANGRY | FLG_TARGET; } } @@ -1064,12 +1085,24 @@ void create_lone_hunter (void) if (newship != -1) { - universe[newship].flags = FLG_ANGRY; + // universe[newship].flags = FLG_ANGRY; if ((rand255() > 200) || (type == SHIP_CONSTRICTOR)) universe[newship].flags |= FLG_HAS_ECM; universe[newship].bravery = ((rand255() * 2) | 64) & 127; - in_battle = 1; + if (type == SHIP_FER_DE_LANCE) { + if (rand255() > 160) + universe[newship].flags |= FLG_ANGRY | FLG_TARGET; + else { + universe[newship].rotmat[2].z = -1.0; + universe[newship].rotz = rand255() & 7; + rnd = rand255(); + universe[newship].velocity = (rnd & 31) | 16; + } + } + + if (universe[newship].flags & FLG_ANGRY) + in_battle = 1; } } @@ -1121,7 +1154,7 @@ void check_for_cops (void) if (newship != -1) { - universe[newship].flags = FLG_ANGRY; + universe[newship].flags |= FLG_ANGRY | FLG_TARGET; if (rand255() > 245) universe[newship].flags |= FLG_HAS_ECM; @@ -1173,7 +1206,7 @@ void check_for_others (void) newship = add_new_ship (type, x, y, z, rotmat, 0, 0); if (newship != -1) { - universe[newship].flags = FLG_ANGRY; + universe[newship].flags |= FLG_ANGRY | FLG_TARGET; if (rand255() > 245) universe[newship].flags |= FLG_HAS_ECM;