|
|
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: 5498 (0x157a)
Types: TextFile
Names: »assa.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Empire.V/V1.1/COMMANDS/assa.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_MCHRSTR
#define D_FILES
#include "empdef.h"
#include <stdio.h>
assa()
{
register at, vt, odds;
char *xytoa();
int aship, vnum, dam;
short dx, dy;
double vloss, aloss, vd, dsq, vrng, landgun(), tfact();
if( sargs(argp[1]) == -1 ) return(SYN_RETURN);
if( getsect(lx, ly, UP_ALL) == -1 ||
sect.sct_desig == S_WATER ||
sect.sct_desig == S_SANCT ||
sect.sct_desig == S_MOUNT ) {
printf("Don't bother...");
return(SYN_RETURN);
}
vnum = sect.sct_owned;
if( vnum == 0 ) goto X174;
if( trechk(cnum, vnum, SEAATT) == -1 ) return(FAIL_RETURN);
X174:
sprintf(fmtbuf,"Assault sector %d, %d from ship #", lx, ly);
aship = getshno(argp[2], fmtbuf, &ship);
if( aship == -1 ) goto X264;
if( cnum == ship.shp_own ) goto X274;
X264:
printf("Not yours");
return(SYN_RETURN);
X274:
dx = xwrap(ship.shp_xp - lx);
dy = ywrap(ship.shp_yp - ly);
if( dx*dx + dy*dy <= 1 ) goto X374;
printf("You'll have to get there first...");
return(FAIL_RETURN);
X374:
if( mchr[ship.shp_type].m_milit == 0 ) goto X420;
if( ship.shp_crew != 0 ) goto X444;
X420:
printf("No military on ship #%d", aship);
return(FAIL_RETURN);
X444:
if( wethr(lx, ly, 0) >= 700 ) goto X534;
printf("Barometer @%.0f; Seas too rough to assault...", wethr(lx, ly, 0));
return(SYN_RETURN);
X534:
if( sect.sct_owned != 0 ) goto X574;
if( sect.sct_milit != 0 ) goto X574;
printf("Sector %d, %d is undefended, (a piece of cake)\n", lx, ly);
goto X700;
X574:
printf("Sector %d, %d is a %d%% %s with approx. %d military.\n", lx, ly,round(sect.sct_effic, 10), dchr[sect.sct_desig].d_name, round(sect.sct_milit, 10));
X700:
sprintf(fmtbuf,"Number of troops in assault? (max %d) ", ship.shp_crew);
at = onearg(argp[3], fmtbuf);
at = (at < ship.shp_crew) ? at : ship.shp_crew;
if( at == 0 ) return(FAIL_RETURN);
ship.shp_crew -= at;
putship(aship, &ship);
vd = ((dchr[sect.sct_desig].d_dstr / 2.) + (-1.)) * (sect.sct_effic / 100.) + 1.;
vt = sect.sct_milit * vd;
odds = (at * 32767.) / (at + vt + vt);
printf("Your success odds are %.1f%%\n", odds / 327.67);
sigsave();
if( vnum == 0 ) goto X1264;
sprintf(fmtbuf,"Country #%d assaulted you @%s", cnum, xytoa(lx, ly, vnum));
wu(0, vnum, fmtbuf);
X1264:
vloss = aloss = 0;
if( vt != 0 ) goto X1306;
goto X2132;
X1306:
if( sect.sct_dfend != 0 ) goto X1320;
goto X2132;
X1320:
dx = sect.sct_dfend<<8;
dx = (dx>>12) + lx;
dy = sect.sct_dfend<<12;
dy = (dy>>12) + ly;
dsq = dx*dx + dy*dy;
getsect(dx, dy, UP_NONE);
vrng = tfact(vnum, (float)((sect.sct_guns < 7) ? sect.sct_guns : 7) * sect.sct_effic * .01);
if( owner == 0 ) goto X1760;
if( sect.sct_desig != S_FORTR ) goto X1760;
if( sect.sct_shell == 0 ) goto X1760;
if( dsq > vrng*vrng ) goto X1760;
printf("▶07◀Incoming shell!▶07◀\n");
nreport(vnum, N_FIRE_BACK, cnum);
sect.sct_shell--;
putsect(dx, dy);
dam = shelldam(landgun(sect.sct_effic, seadef(ship.shp_type)));
shipdam(&ship, dam);
putship(aship, &ship);
if( ship.shp_own != 0 ) goto X1734;
odds = 0;
X1734:
odds = (((rand() % 32768) / 100000.) + .6) * odds;
X1760:
getsect(lx, ly, UP_NONE);
goto X2132;
X2002:
printf("!");
vloss += 1. / vd;
vt--;
goto X2132;
X2042:
if( at <= 0 ) goto X2136;
if( rand() % 32768 <= 20000 ) goto X2074;
fflush(stdout);
sleep(1);
X2074:
if( odds >= rand() % 32768 ) goto X2002;
printf("@");
aloss += 1.;
at--;
X2132:
if( vt > 0 ) goto X2042;
X2136:
if( at <= vt ) goto X2460;
printf("You have taken sector %d, %d\n", lx, ly);
if( vnum == 0 ) goto X2264;
sprintf(fmtbuf,"& lost %.1f taking %s\n", aloss, xytoa(lx, ly, vnum));
wu(0, vnum, fmtbuf);
X2264:
nreport(cnum, N_WON_SECT, vnum);
sect.sct_owned = cnum;
sect.sct_lstup = curup;
sect.sct_milit = at;
sect.sct_chkpt = sect.sct_dfend = 0;
if( sect.sct_desig != S_CAPIT ) goto X2566;
getnat(vnum);
if( lx != nat.nat_xcap - capx ) goto X2566;
if( ly != nat.nat_ycap - capy ) goto X2566;
printf("which happens to be %s's capital!\n", nat.nat_cnam);
sect.sct_desig = S_FORTR;
nat.nat_stat = STAT_NOCAP;
putnat(vnum);
goto X2566;
X2460:
printf("You have been defeated!\n");
sprintf(fmtbuf," & lost %.1f", aloss);
wu(0, vnum, fmtbuf);
nreport(cnum, N_SCT_LOSE, vnum);
sect.sct_milit = vt / vd;
X2566:
printf("Casualties :\nYours... %.1f\n", aloss);
printf("Theirs.. %.1f\n", vloss);
putsect(lx, ly);
ntused = (ntused + (aloss + vloss) * .15) + .5;
return(NORM_RETURN);
}