|
|
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 i
Length: 8737 (0x2221)
Types: TextFile
Names: »init.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Ogre/init.c«
#include "ext.h"
static char a, b;
static int cp_set;
static int infantry_points, armor_points;
init_units(mark)
{
int i, j;
int unitcmp();
init_screen();
a = 10;
b = 10;
switch(mark) {
case 3:
armor_points = 10;
infantry_points = 18;
break;
case 5:
armor_points = 18;
infantry_points = 27;
break;
}
n_units = 0;
cp_set = FALSE;
while(armor_points > 0 || infantry_points > 0 || !cp_set) {
display(16, "left to place: %d armor, %d infantry%s",
armor_points, infantry_points,
(cp_set) ? "." : ", CP");
getunit();
}
/* sort the units so lower the i, the more valuable the unit. */
qsort( (char *) unit, n_units, sizeof(UNIT), unitcmp);
}
getunit()
{
char no_new, bad_char;
char olda, oldb;
char dir;
no_new = TRUE;
bad_char = FALSE;
movecur_hex(a, b);
while(no_new) {
olda = a;
oldb = b;
dir = getchar();
switch(dir) {
case RIGHT:
a--;
b--;
break;
case UPRIGHT:
a--;
break;
case DOWNRIGHT:
b--;
break;
case LEFT:
a++;
b++;
break;
case UPLEFT:
b++;
break;
case DOWNLEFT:
a++;
break;
case SIT:
break;
case CP:
if(cp_set) {
bad_char = TRUE;
}
else {
add_unit(a, b, dir);
no_new = FALSE;
cp_set = TRUE;
}
break;
case HVYTANK:
case MSLTANK:
case GEV:
if(occupied(a, b) || blocked(a, b) || armor_points == 0) {
bad_char = TRUE;
break;
}
add_unit(a, b, dir);
no_new = FALSE;
armor_points--;
break;
case '1':
if(occupied(a, b) || blocked(a, b) || infantry_points < 1) {
bad_char = TRUE;
break;
}
add_unit(a, b, dir);
no_new = FALSE;
infantry_points -= 1;
break;
case '2':
if(occupied(a, b) || blocked(a, b) || infantry_points < 2) {
bad_char = TRUE;
break;
}
add_unit(a, b, dir);
no_new = FALSE;
infantry_points -= 2;
break;
case INFANTRY:
case '3':
if(occupied(a, b) || blocked(a, b) || infantry_points < 3) {
bad_char = TRUE;
break;
}
add_unit(a, b, dir);
no_new = FALSE;
infantry_points -= 3;
break;
case HOWITZER:
if(occupied(a, b) || blocked(a, b) || armor_points <= 1) {
bad_char = TRUE;
break;
}
add_unit(a, b, dir);
no_new = FALSE;
armor_points -= 2;
break;
default:
bad_char = TRUE;
break;
}
if(off_obstructed(a, b) ||
bad_char)
{
a = olda;
b = oldb;
bad_char = FALSE;
}
else {
movecur_hex(a, b);
}
}
}
add_unit(a, b, c)
char a, b, c;
{
int i;
i = n_units;
n_units++;
switch(c) {
case CP:
unit[i].type = CP;
unit[i].attack = 0;
unit[i].range = 0;
unit[i].defend = 0;
unit[i].movement = 0;
break;
case HVYTANK:
unit[i].type = HVYTANK;
unit[i].attack = 4;
unit[i].range = 2;
unit[i].defend = 3;
unit[i].movement = 3;
break;
case MSLTANK:
unit[i].type = MSLTANK;
unit[i].attack = 3;
unit[i].range = 4;
unit[i].defend = 2;
unit[i].movement = 2;
break;
case GEV:
unit[i].type = GEV;
unit[i].attack = 2;
unit[i].range = 2;
unit[i].defend = 2;
unit[i].movement = 4;
break;
case HOWITZER:
unit[i].type = HOWITZER;
unit[i].attack = 6;
unit[i].range = 8;
unit[i].defend = 1;
unit[i].movement = 0;
break;
case INFANTRY:
case '3':
unit[i].type = INFANTRY;
unit[i].attack = 3;
unit[i].range = 1;
unit[i].defend = 1;
unit[i].movement = 2;
break;
case '1':
unit[i].type = INFANTRY;
unit[i].attack = 1;
unit[i].range = 1;
unit[i].defend = 1;
unit[i].movement = 2;
break;
case '2':
unit[i].type = INFANTRY;
unit[i].attack = 2;
unit[i].range = 1;
unit[i].defend = 1;
unit[i].movement = 2;
break;
}
unit[i].range_to_ogre = 0;
unit[i].fired = 0;
unit[i].status = OK;
unit[i].moves_left = 0;
unit[i].l_hex = a;
unit[i].r_hex = b;
disp_unit(i);
}
occupied(a, b)
char a,b;
{
int i;
for(i = 0; i < n_units; i++)
if(unit[i].status != DESTROYED &&
unit[i].l_hex == a &&
unit[i].r_hex == b) return(TRUE);
return(FALSE);
}
init_ogre(mark)
{
ogre.l_hex = rand() % 7 + 22; /* 22 - 28 */
ogre.r_hex = 50 - ogre.l_hex;
switch(mark) {
case 3:
ogre.treads = 45;
ogre.init_treads = 45;
ogre.movement = 3;
ogre.missiles = 2;
ogre.main_bats = 1;
ogre.sec_bats = 4;
ogre.ap = 8;
break;
case 5:
ogre.treads = 60;
ogre.init_treads = 60;
ogre.movement = 3;
ogre.missiles = 5;
ogre.main_bats = 2;
ogre.sec_bats = 6;
ogre.ap = 10;
break;
}
disp_ogre();
}
unitcmp(u1, u2)
UNIT *u1, *u2;
{
int cmp;
switch(u1 -> type) {
case CP:
switch(u2 -> type) {
case CP:
cmp = 0;
break;
default:
cmp = -1;
break;
}
break;
case HOWITZER:
switch(u2 -> type) {
case CP:
cmp = 1;
break;
case HOWITZER:
cmp = 0;
break;
default:
cmp = -1;
break;
}
break;
case HVYTANK:
switch(u2 -> type) {
case CP:
case HOWITZER:
cmp = 1;
break;
case HVYTANK:
cmp = 0;
break;
default:
cmp = -1;
break;
}
break;
case MSLTANK:
switch(u2 -> type) {
case CP:
case HOWITZER:
case HVYTANK:
cmp = 1;
break;
case MSLTANK:
cmp = 0;
break;
default:
cmp = -1;
break;
}
break;
case GEV:
switch(u2 -> type) {
case INFANTRY:
cmp = -1;
break;
case GEV:
cmp = 0;
break;
default:
cmp = 1;
break;
}
break;
case INFANTRY:
switch(u2 -> type) {
case INFANTRY:
cmp = 0;
break;
default:
cmp = 1;
break;
}
break;
}
return(cmp);
}