|
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 m
Length: 6183 (0x1827) Types: TextFile Names: »map.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Ogre/map.c«
/* These routines implement all functions associated with the map and display thereof. (Thanks to Bob Hood of Rice for coming up with the x-y and range algorithms.) Michael Caplinger, Rice University, March 1982. */ #include "ext.h" #include <ctype.h> /* Initialize the map display, at the beginning of the game. */ init_screen() { int a, b; char row, col; tc_setup(); clear_screen(); for(a = 1; a <= 28; a++) { for(b = 1; b <= 28; b++) { if(!off_map(a, b)) { disp_hex(a, b, '.'); } } } disp_craters(); } /* Convert a left and right hex pair (eg, the hex 2015 has an l_hex of 20 and an r_hex of 15) to x-y screen coordinates. */ to_xy(lhex, rhex, row, col) char lhex, rhex, *row, *col; { *row = (lhex - rhex) + 7; *col = 50 - (lhex + rhex); } /* Check to see if an lr pair is off the map. */ off_map(a, b) char a, b; { char row, col; to_xy(a, b, &row, &col); if(col < 0 || col > 38 || row < 0 || row > 14) return(TRUE); else return(FALSE); } /* Check to see if an lr pair is off the obstructed area of the map. */ off_obstructed(a, b) char a, b; { char row, col; to_xy(a, b, &row, &col); if(col < 10 || col > 38 || row < 0 || row > 14) return(TRUE); else return(FALSE); } /* Display a character at a given hex. */ disp_hex(a, b, c) char a, b, c; { char row, col; to_xy(a, b, &row, &col); movecur(row, col * 2 + 1); putchar(c); } /* Display the contents of a hex. If more than one item is in a hex, the following precedence applies: 1) Ogre 2) Defending units (by value) 3) Craters (not that anything can be in a crater hex.) */ update_hex(a, b) char a, b; { int i; if(ogre.l_hex == a && ogre.r_hex == b) { disp_ogre(); return; } for(i = 0; i < n_units; i++) if(unit[i].l_hex == a && unit[i].r_hex == b && unit[i].status != DESTROYED) { disp_unit(i); return; } if(blocked(a, b)) { disp_hex(a, b, '*'); return; } disp_hex(a, b, '.'); } /* Display the ith unit. */ disp_unit(i) int i; { char a, b; a = unit[i].l_hex; b = unit[i].r_hex; switch(unit[i].status) { case OK: switch(unit[i].type) { case INFANTRY: disp_hex(a, b, '0' + unit[i].attack); break; default: disp_hex(a, b, unit[i].type); break; } break; case DISABLED: disp_hex(a, b, tolower(unit[i].type)); break; case DESTROYED: disp_hex(a, b, '.'); break; } } /* Display the Ogre. */ disp_ogre(i) int i; { char a, b; a = ogre.l_hex; b = ogre.r_hex; disp_hex(a, b, 'O'); } /* Move the cursor to the specified hex on the screen. */ movecur_hex(a, b) char a, b; { char row, col; to_xy(a, b, &row, &col); movecur(row, col * 2 + 1); } /* Point at the ith unit with the cursor. */ movecur_unit(i) int i; { movecur_hex(unit[i].l_hex, unit[i].r_hex); } #define ABS(i) (((i) < 0) ? -(i) : (i)) #define BIGINT 32767 /* Calculate the range between 2 hexes. */ range(a1, b1, a2, b2) char a1, b1, a2, b2; { char diff1, diff2, temp; int subrange[3]; int min, i; int rangesum; diff1 = a1 - b1; diff2 = a2 - b2; subrange[0] = ABS(a1 - a2); subrange[1] = ABS(b1 - b2); subrange[2] = ABS(diff1 - diff2); min = 0; for(i = 1; i < 3; i++) if(subrange[i] < subrange[min]) min = i; rangesum = subrange[min]; temp = subrange[min]; subrange[min] = subrange[2]; subrange[2] = temp; min = 0; for(i = 1; i < 2; i++) if(subrange[i] < subrange[min]) min = i; rangesum += subrange[min]; return(rangesum); } /* This is a hardwired set of craters, taken from the paper game's map. */ static struct { char l_hex; char r_hex; } craters[] = { 17, 16, 19, 13, 13, 18, 14, 15, 13, 15, 15, 10, 9, 15, 10, 12, 7, 14, 11, 10, 14, 7, 12, 6, 7, 10, 8, 6, 4, 9, 9, 4, 9, 3, }; #define NCRATERS (sizeof(craters) / 2 * sizeof(char)) /* Determine if a hex has a crater. */ blocked(a, b) char a, b; { int i; for(i = 0; i < NCRATERS; i++) if(craters[i].l_hex == a && craters[i].r_hex == b) return(TRUE); return(FALSE); } /* Display the craters. */ disp_craters() { int i; for(i = 0; i < NCRATERS; i++) disp_hex(craters[i].l_hex, craters[i].r_hex, '*'); } #include <stdio.h> describe_action(action, i) char *action; int i; { switch(unit[i].type) { case HOWITZER: display(16, "%s howitzer (%d/%d D%d M%d)", action, unit[i].attack, unit[i].range, unit[i].defend, unit[i].moves_left); break; case MSLTANK: display(16, "%s missile tank (%d/%d D%d M%d)", action, unit[i].attack, unit[i].range, unit[i].defend, unit[i].moves_left); break; case GEV: display(16, "%s GEV (%d/%d D%d M%d)", action, unit[i].attack, unit[i].range, unit[i].defend, unit[i].moves_left); break; case HVYTANK: display(16, "%s heavy tank (%d/%d D%d M%d)", action, unit[i].attack, unit[i].range, unit[i].defend, unit[i].moves_left); break; case INFANTRY: display(16, "%s infantry (%d/%d D%d M%d)", action, unit[i].attack, unit[i].range, unit[i].defend, unit[i].moves_left); break; } } display(line, format, args) int line; char *format; int args; { movecur(line, 0); eeol(); _doprnt(format, &args, stdout); } display_xy(line, col, format, args) int line, col; char *format; int args; { movecur(line, col); eeol(); _doprnt(format, &args, stdout); }