|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T a
Length: 3882 (0xf2a)
Types: TextFile
Names: »airstrike.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Midway/airstrike.c«
char version[] = "%W%";
#include "externs.h"
airstrike() /* launch computer searches, strikes, recover. */
{
int enemy;
int send;
int type;
register int n;
struct squadron *planes;
char buf[36];
enemy = goodbogey(0);
for (n=0; n < MAXSHIPS; n++) {
if (n == JAPANESE) enemy = goodbogey(JAPANESE);
if (n != player && shiplist[n].hits && shiplist[n].torps) {
if (shiplist[n].type != CV || planesize(Japanese(n) ? japscouts : amscouts) < 7) {
if (shiplist[n].tbf) {
planes = catapult(n, 1, SCOUT);
planes -> course = rnd(8);
}
}
/* strike! */
if (shiplist[n].type == CV || shiplist[n].type == FT) {
if (enemy) {
if (!shiplist[n].launching) {
if (range(shiplist[enemy - 1].row, shiplist[enemy - 1].col, shiplist[n].row, shiplist[n].col) < Fuel[TBF]*5) {
shiplist[n].launching = 1;
}
}
switch (shiplist[n].launching++) {
case 0:
case 4:
shiplist[n].launching = 0;
send = 0;
break;
case 1:
if (shiplist[n].f4f > 10)
send = shiplist[n].f4f/2 + 1;
else
send = shiplist[n].f4f;
type = F4F;
break;
case 2:
if (shiplist[n].sbd > 20)
send = shiplist[n].sbd/2;
else
send = shiplist[n].sbd;
type = SBD;
break;
case 3:
if (shiplist[n].tbf > 15)
send = shiplist[n].tbf/2;
else
send = shiplist[n].tbf;
type = TBF;
break;
}
if (send) {
planes = catapult(n, send, type);
planes -> course = enemy - 1;
if (Japanese(n) == Japanese(player)) {
sprintf(buf, "%s launching planes", shiplist[n].name);
inform(buf, 0);
}
}
}
}
}
}
}
newbogey(boat)
int boat;
{
register int n;
char buf[32];
if (!sighted[boat]) {
for (n = boat; n < MAXSHIPS && shiplist[n].flagship == boat; n++)
sighted[n] = 1;
if (Japanese(boat) == Japanese(player)) {
if (boat == shiplist[player].flagship)
inform("Enemy scout plane overhead!", 0);
} else {
sprintf(buf, "%s %s sighted", describe[shiplist[boat].type], shiplist[boat].name);
inform(buf, 0);
inform("@ %d, %d", boat + 1);
}
}
}
struct squadron *catapult(from, size, type)
int from, size, type;
{
register struct squadron *temp;
temp = (struct squadron *) calloc(1, sizeof(*temp));
if(!temp) {
perror("the first calloc in catapult");
kill(getpid(), 3);
}
if (Japanese(from)) {
if (type == SCOUT) {
if (japscouts) japscouts -> previous = temp;
temp -> s_next = japscouts;
japscouts = temp;
type = TBF;
} else {
if (japanese) japanese -> previous = temp;
temp -> s_next = japanese;
japanese = temp;
}
} else {
if (type == SCOUT) {
if (amscouts) amscouts -> previous = temp;
temp -> s_next = amscouts;
amscouts = temp;
type = TBF;
} else {
if (american) american -> previous = temp;
temp -> s_next = american;
american = temp;
}
}
temp -> row = shiplist[from].row;
temp -> col = shiplist[from].col;
temp -> from = from;
temp -> type = type;
temp -> planes = size;
temp -> fuel = Fuel[type];
/* the rest zeros */
switch (type) {
case TBF:
shiplist[from].tbf -= size;
break;
case SBD:
shiplist[from].sbd -= size;
break;
case F4F:
shiplist[from].f4f -= size;
break;
}
return(temp);
}
goodbogey(ship) /* finds best bogey ~ 20% type, 20% newness */
int ship; /* rest range */
{
register int *table;
register int score, bestscore = -1;
register int jerry, best = 0;
table = Japanese(ship) ? amtable : japtable;
for (jerry = 0; table[jerry] < MAXSHIPS; jerry++) {
if (sighted[table[jerry]] && shiplist[table[jerry]].hits && shiplist[table[jerry]].torps) {
score = FT - shiplist[jerry].type;
if (score > bestscore) {
bestscore = score;
best = table[jerry] + 1;
}
}
}
return(best);
}