|
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: 9055 (0x235f) Types: TextFile Names: »atta.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Empire.V/V1.1/COMMANDS/atta.c«
#define D_UPDATE #define D_NATSTAT #define D_SECTDES #define D_NEWSVERBS #define D_TRTYCLAUSE #define D_NATSTR #define D_SCTSTR #define D_SHPSTR #define D_DCHRSTR #define D_ICHRSTR #define D_MCHRSTR #define D_FILES #include "empdef.h" #include <stdio.h> atta() { register i, nsects; char *xytoa(), *cname(), *getstri(); int vnum, vx, vy, defx, defy, vt, at; short x, y; int vd, tat, tats, odds, vdes, temp; int success, vmovcst, movcost, dam; double vloss, aloss, occper, q, vgun, tfact(), landgun(); struct { int u_x; int u_y; float u_q; int u_at; } unit[4]; if( sargs(argp[1]) == -1 || getsect(lx, ly, UP_ALL) == -1 ) return(SYN_RETURN); if( neigh(lx, ly, cnum, UP_NONE) != 0 ) goto X150; printf("You are not adjacent to %d,%d\n", lx, ly); return(FAIL_RETURN); X150: if( sect.sct_desig == S_WATER || sect.sct_desig == S_SANCT ) { printf("%d,%d is a %s!\n", lx, ly, dchr[sect.sct_desig].d_name); return(SYN_RETURN); } if( sect.sct_owned == 0 ) goto X302; if( trechk(cnum, sect.sct_owned, LANATT) != -1 ) goto X302; return(FAIL_RETURN); X302: vx = lx; vy = ly; vnum = sect.sct_owned; vdes = sect.sct_desig; vmovcst = dchr[vdes].d_mcst & 0377; vd = ((dchr[sect.sct_desig].d_dstr / 2.) + (-1.)) * sect.sct_effic + 100.; vt = (float)vd * sect.sct_milit * .01; printf("%d,%d is a %d%% %s with %d military or so.\n", vx, vy, round(sect.sct_effic, 10), dchr[sect.sct_desig].d_name, round(sect.sct_milit, 10)); defx = defy = 0; if( sect.sct_dfend == 0 ) goto X1056; x = sect.sct_dfend<<8; x = (x>>12) + vx; y = sect.sct_dfend<<12; y = (y>>12) + vy; getsect(x, y, UP_NONE); if( vnum != sect.sct_owned ) goto X1056; if( sect.sct_desig != S_FORTR ) goto X1056; if( sect.sct_shell == 0 ) goto X1056; if( (q = (sect.sct_guns < 7) ? sect.sct_guns : 7) <= 0. ) goto X1056; if( tfact(vnum, q) < (float)idist(x - vx, y - vy) ) goto X1056; defx = x; defy = y; X1056: nsects = tat = tats = 0; if( wethr(vx, vy, 0) >= 700 ) goto X1130; printf(" Inclement weather▶07◀...\n"); X1130: i = 0; X1132: x = dn[i][0] + vx; y = dn[i][1] + vy; if( getsect(x, y, UP_OWN ) != -1 ) goto X1232; goto X2212; X1232: if( owner != 0 ) goto X1244; goto X2212; X1244: if( dchr[sect.sct_desig].d_ostr >= 1 ) goto X1272; goto X2212; X1272: movcost = (dchr[sect.sct_desig].d_mcst & 0377) + (vmovcst<<1); temp = (sect.sct_mobil * 24)/ movcost; if( temp >= sect.sct_milit ) goto X1444; printf("The %d mobility units in %d,%d will only", sect.sct_mobil, x, y); printf(" support %d troops, \n", temp); goto X1506; X1444: temp = sect.sct_milit; X1506: if( sect.sct_civil == 0 && temp == sect.sct_milit ) { printf("One military will be left behind on watch in %d,%d\n", x, y); temp--; } if( temp > 0 ) goto X1520; printf("No troops available from %d,%d\n", x, y); goto X2212; X1520: printf("Number of troops from %s at %d,%d (max %d) : ", dchr[sect.sct_desig].d_name, x, y, temp); at = atopi(getstri("")); if( at != 0 ) goto X1622; goto X2212; X1622: getsect(x, y, UP_NONE); temp = (temp < sect.sct_milit) ? temp : sect.sct_milit; at = (at < temp) ? at : temp; tats += at; sect.sct_milit -= at; sect.sct_mobil -= (movcost * at) / 24; putsect(x, y); unit[nsects].u_x = x; unit[nsects].u_y = y; q = dchr[sect.sct_desig].d_ostr / 2.; q = ((q + (-1.)) * sect.sct_effic) / 100. + 1.; unit[nsects].u_q = q; at = at * q + .5; unit[nsects].u_at = at; nsects++; if( nsects != 1 ) goto X2204; sigsave(); X2204: tat += at; X2212: i++; if( i >= 4 ) goto X2226; goto X1132; X2226: if( nsects <= 0 ) goto X2240; if( tat > 0 ) goto X2330; X2240: sprintf(fmtbuf,"Country #%d considered attacking you @%s", cnum, xytoa(vx, vy, vnum)); wu(0, vnum, fmtbuf); printf("No troops in attack▶07◀...\n"); return(FAIL_RETURN); X2330: odds = (tat * 32767.) / (tat + vt); i = wethr(vx, vy, 0); if( i >= 730. ) goto X2434; odds = (i / 730.) * odds; X2434: printf("Your combat odds are %.1f%%\n", odds / 327.67); vloss = aloss = 0; if( defx != 0 ) goto X2514; goto X3114; X2514: getsect(defx, defy, UP_NONE); vgun = landgun(sect.sct_effic); sect.sct_shell--; putsect(defx, defy); i = (rand()>>2) % nsects; getsect(unit[i].u_x, unit[i].u_y, UP_NONE); dam = shelldam(vgun, landdef(sect.sct_desig)); sectdam(dam); putsect(unit[i].u_x, unit[i].u_y); tat = (1. - ((dam * .01) / nsects)) * tat; printf("▶07◀Incoming shell! %d%% damage done to %d,%d▶07◀\n", dam, unit[i].u_x, unit[i].u_y); nreport(vnum, N_FIRE_BACK, cnum); X3114: if( vdes == S_FORTR ) goto X3130; goto X3540; X3130: getsect(vx, vy, UP_NONE); if( sect.sct_guns == 0 ) goto X3540; if( sect.sct_shell == 0 ) goto X3540; sect.sct_shell--; putsect(vx, vy); i = rand() % nsects; vgun = landgun(sect.sct_effic); getsect(unit[i].u_x, unit[i].u_y, UP_NONE); dam = shelldam(vgun, landdef(sect.sct_desig)); sectdam(dam); putsect(unit[i].u_x, unit[i].u_y); tat = (1. - ((dam * .01) / nsects)) * tat; printf("▶07◀Incoming shell! %d%% damage done to %d,%d▶07◀\n", dam, unit[i].u_x, unit[i].u_y); nreport(vnum, N_FIRE_BACK, cnum); X3540: i = 0; X3542: i = i % nsects; if( unit[i].u_at > 0 ) goto X3574; goto X4224; X3574: if( odds <= rand() % 32768 ) goto X4102; vloss = (100. / vd) + vloss; printf("!"); if( --vt > 0 ) goto X4176; X3646: if( tat > vt ) goto X3662; goto X5060; X3662: success = 1; printf("You have captured %d,%d!\n", vx, vy); if( vnum == 0 ) goto X4016; sprintf(fmtbuf,"Country #%d lost %.1f troops defeating you @%s", cnum, aloss, xytoa(vx, vy, vnum)); wu(0, vnum, fmtbuf); X4016: nreport(cnum, N_WON_SECT, vnum); occper = tats - aloss; goto X4236; X4102: printf((--unit[i].u_at != 0) ? "@" : "*"); aloss = (1. / unit[i].u_q) + aloss; if( --tat <= 0 ) goto X3646; X4176: if( rand() % 32768 <= 26000 ) goto X4224; fflush(stdout); sleep(1); X4224: i++; goto X3542; X4236: occper = 127. / ((occper > 1.) ? occper : 1.); occper = (occper < 1.) ? occper : 1.; vt = 0; i = 0; goto X4612; X4306: temp = unit[i].u_at / unit[i].u_q; vt += temp * occper; printf("%.0f troops return to %d,%d\n", (1. - occper) * temp, unit[i].u_x, unit[i].u_y); getsect(unit[i].u_x, unit[i].u_y, UP_NONE); sect.sct_milit = ((1. - occper) * temp) + sect.sct_milit; putsect(unit[i].u_x, unit[i].u_y); i++; X4612: if( i < nsects ) goto X4306; printf("%d of your troops now occupy %d,%d\n", vt, vx, vy); if( vdes == S_CAPIT ) goto X4670; goto X5242; X4670: getnat(vnum); if( xwrap(vx + capx - nat.nat_xcap) != 0 ) goto X5242; if( ywrap(vy + capy - nat.nat_ycap) != 0 ) goto X5242; printf("You have captured %s's capital!\n", cname(vnum)); nat.nat_stat = STAT_NOCAP; nat.nat_btu = (nat.nat_btu > 1) ? nat.nat_btu : 1; putnat(vnum); goto X5242; X5060: success = 0; printf("You have been defeated!\n"); nreport(cnum, N_SCT_LOSE, vnum); vt = ((vt * 100.) / vd) + .9; if( vnum == 0 ) goto X5242; sprintf(fmtbuf,"Country #%d lost %.1f troops attacking you @%s", cnum, aloss, xytoa(vx, vy, vnum)); wu(0, vnum, fmtbuf); X5242: printf("Casualties :\nYours ... %.1f\n", aloss); printf("Theirs .. %.1f\n", vloss); printf("Papershuffling ... %.1f B.T.U\n", (aloss + vloss) * .15); ntused = ntused + (aloss + vloss) * .15 + .5; getsect(vx, vy, UP_NONE); if( success == 0 ) goto X5462; sect.sct_owned = cnum; sect.sct_lstup = curup; sect.sct_chkpt = sect.sct_dfend = 0; X5462: sect.sct_milit = vt; putsect(vx, vy); return(NORM_RETURN); }