|
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 u
Length: 13709 (0x358d) Types: TextFile Names: »update.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Empire.V/V1.1/EMPSUBS/update.c«
#define D_UPDATE #define D_NATSTAT #define D_SECTDES #define D_NEWSVERBS #define D_PLGSTAGES #define D_NATSTR #define D_SCTSTR #define D_DCHRSTR #define D_ICHRSTR #define D_NSCSTR #define D_FILES #include "empdef.h" update(x, y, selup) int x, y, selup; { register int i, q, iwork; char *dp, *xytoa(); int dt, shipper, prdtyp, prdcst; short dx, dy; int thresh, plgue, sectowner; int amt, unit, funit, tunit, pkgs; int verbose, quiet, wthr, sctdes; double workforce, work, cashout, movease, dtemp; struct ichrstr *ip; double ceil(); sectowner = sect.sct_owned; getnat(sectowner); cashout = 0; verbose = selup & UP_VERBOSE; quiet = selup & UP_QUIET; if( sect.sct_lstup == 0 ) return(0); if( sect.sct_lstup <= curup ) goto X160; sect.sct_lstup = curup; return(1); X160: workforce = (sect.sct_civil + (sect.sct_milit * .2)) / 100. + 1.e-6; if( workforce >= 1.e-4 ) goto X240; X232: return(0); X240: dt = curup - sect.sct_lstup; if( (selup & UP_TIME) == 0 ) goto X310; iwork = dt * workforce; if( iwork >= 0 ) goto X402; iwork = 077777; goto X402; X310: dt = (dt < 128) ? dt : 128; iwork = dt * workforce; if( iwork < 1 ) goto X232; dt = ceil(iwork / workforce); X402: if( owner != 0 ) goto X434; if( (selup & UP_ALL) != 0 ) goto X434; if( iwork < 24 ) goto X232; iwork >>= 1; dt >>= 1; X434: work = iwork; sctdes = sect.sct_desig; pkgs = dchr[sctdes].d_pkg; prdtyp = (int)dchr[sctdes].d_ptyp; prdcst = ichr[prdtyp].i_prdct; wthr = wethr(x, y, 0); if( wthr >= 630 ) goto X732; if( owner == 0 ) goto X732; if( nstat == STAT_GOD ) goto X732; if( sect.sct_desig == S_SANCT ) goto X732; if( sect.sct_desig == S_CAPIT ) goto X732; q = (640 - wthr < 50) ? 640 - wthr : 50; printf("%d%% hurricane damage in %d, %d!\n", q, x, y); sectdam(q); nreport(cnum, N_SCT_STORM, 0); X732: if( sect.sct_effic >= 100 ) goto X1116; q = (iwork > 100 - sect.sct_effic) ? 100 - sect.sct_effic : iwork; cashout += q; if( wthr <= 700 ) goto X1042; sect.sct_effic += q; goto X1116; X1042: if( wthr <= 650 ) goto X1116; if( owner == 0 ) goto X1116; if( quiet != 0 ) goto X1116; printf("Bad weather delays construction in %d,%d\n", x, y); X1116: q = sect.sct_civil * dt; if( sctdes != S_URBAN ) goto X1256; q = (sect.sct_ore > q / 100) ? q / 100 : sect.sct_ore; q = max127(sect.sct_civil + q) - sect.sct_civil; sect.sct_ore -= q; sect.sct_civil += q; goto X1372; X1256: if( sctdes != S_BSPAN ) goto X1310; sect.sct_civil -= (q / 400); goto X1372; X1310: sect.sct_civil = max127(sect.sct_civil + ((sect.sct_civil > 31 && sect.sct_civil < 97) ? q / 200 : q / 400)); X1372: sect.sct_mobil = max127(sect.sct_mobil + dt); sect.sct_lstup += dt; cashout += (((sect.sct_milit>>5) * dt)>>3); if( (sect.sct_p_stage & 0177) > PLG_HEALTHY ) { if( dt > sect.sct_p_time ) { sect.sct_p_time = 0; } else { sect.sct_p_time -= dt; } switch(sect.sct_p_stage) { case PLG_DYING: dtemp = dt / (sect.sct_p_time + dt + 1.); if( dtemp <= .9 ) goto X1610; dtemp = .9; X1610: q = (sect.sct_civil + sect.sct_milit) * dtemp; if( owner == 0 ) goto X1676; printf("%d citizens died of PLAGUE in %d,%d\n", q, x, y) ; goto X1762; X1676: sprintf(fmtbuf,"%d citizens died of plague in %s", q, xytoa(x, y, (int)sect.sct_owned)); wu(0, sect.sct_owned, fmtbuf); getnat(sectowner); X1762: nreport(sect.sct_owned, N_DIE_PLAGUE, 0); sect.sct_civil -= sect.sct_civil * dtemp; sect.sct_milit -= sect.sct_milit * dtemp; break; case PLG_INFECT: if( owner == 0 ) break; printf("%d,%d battling PLAGUE\n", x, y); break; case PLG_INCUBATE: if( (sect.sct_p_time & 0177) > 0 ) break; if( owner == 0 ) goto X2234; printf("Outbreak of PLAGUE in %d,%d\n", x, y); goto X2316; X2234: sprintf(fmtbuf,"Outbreak of plague in %s", xytoa(x, y, (int)sect.sct_owned)); wu(0, sect.sct_owned, fmtbuf); getnat(sectowner); X2316: nreport(sect.sct_owned, N_OUT_PLAGUE, 0); break; case PLG_EXPOSED: sprintf(fmtbuf,"%s gets the plague in %s", nat.nat_cnam, xytoa(x, y, 0)); wu(cnum, 0, fmtbuf); getnat(sectowner); sect.sct_p_time = 0; break; } if( (sect.sct_p_time & 0177) == 0 ) { sect.sct_p_stage--; sect.sct_p_time = ((rand()>>2) & 037) + 32; } } else { dtemp = (sect.sct_civil + sect.sct_milit) / 254.; dtemp *= (nat.nat_t_level + sect.sct_ore + 100.); dtemp /= (nat.nat_r_level + sect.sct_effic + sect.sct_mobil + 100.); if( dtemp - 1. > (rand() % 32768)/100 ) { sect.sct_p_stage = PLG_EXPOSED; } } plgue = sect.sct_p_stage; q = dchr[sctdes].d_mcst; q &= 0377; movease = 1000. / ((q * 80) + 21 - sect.sct_effic); dp = §.sct_c_use; i = 0; goto X4270; X2734: if( sctdes != S_XCHNG ) goto X2756; if( i < 2 ) goto X2756; goto X4316; X2756: if( (*(dp + i) & 017) != 0 ) goto X2776; goto X4266; X2776: if( 02 != *(dp + i) ) goto X3016; goto X4266; X3016: dx = (*(dp + i)<<12); dx = (dx>>14) + x; dy = (*(dp + i)<<14); dy = (dy>>14) + y; thresh = (*(dp + i)>>1) & 0170; dtemp = (movease / ip->i_lbs) * (sect.sct_mobil / 2); q = (thresh < *(§.sct_civil + i)) ? *(§.sct_civil + i) - thresh : 0; q = (dtemp < q) ? dtemp : q; if( q > 0 ) goto X3260; goto X4266; X3260: funit = ip->i_pkg[pkgs]; amt = funit * q; shipper = sect.sct_owned; putsect(x, y); if( getsect(dx, dy, UP_NONE) == -1 ) goto X3404; if( shipper == sect.sct_owned ) goto X3612; if( sect.sct_chkpt != 0 ) goto X3612; X3404: if( owner != 0 ) goto X3430; if( shipper != cnum ) goto X3502; if( quiet != 0 ) goto X3502; X3430: printf("%s delivery walkout between %d,%d & %d,%d\n", ip->i_name, x, y, dx, dy); X3502: amt = 0; goto X4154; X3512: if( sect.sct_desig != S_GMINE ) goto X3532; if( sctdes != S_GMINE ) goto X3552; X3532: if( sect.sct_desig == S_GMINE ) goto X3622; if( sctdes != S_GMINE ) goto X3622; X3552: if( owner == 0 ) goto X3502; if( quiet != 0 ) goto X3502; printf("Ore mover's union dispute in %d,%d\n", dx, dy); goto X3502; X3612: if( ip->i_mnem == 'o' ) goto X3512; X3622: tunit = ip->i_pkg[dchr[sect.sct_desig].d_pkg]; if( (amt / tunit) + *(§.sct_civil + i) <= 127 ) goto X4012; if( owner == 0 ) goto X3766; if( verbose == 0 ) goto X3766; printf("Delivery backlog (%s) -- %d,%d to %d,%d\n", ip->i_name, x, y, dx , dy); X3766: amt = (127 - *(§.sct_civil + i)) * tunit; X4012: unit = (funit == tunit) ? funit : funit * tunit; amt = (amt / unit) * unit; *(§.sct_civil + i) += (amt / tunit); if( plgue != PLG_INFECT ) goto X4136; if( sect.sct_p_stage != 0 ) goto X4136; sect.sct_p_stage = PLG_EXPOSED; X4136: putsect(dx, dy); X4154: getsect(x, y, UP_NONE); q = amt / funit; *(§.sct_civil + i) -= q; sect.sct_mobil = sect.sct_mobil - ((ip->i_lbs / movease) * q); X4266: i++; X4270: ip = &ichr[i + 12]; if( ip->i_mnem == '\0' ) goto X4316; goto X2734; X4316: if( sect.sct_effic >= 60 ) goto X4332; goto X6440; X4332: if( broke == 0 ) goto X4344; goto X6440; X4344: i = sect.sct_prdct; switch( sctdes ) { case S_BANK: q = 18; q = ichr[q].i_pkg[pkgs]; cashout -= ((((long)sect.sct_gold * q * dt) >> 3) & 017777); break; case S_CAPIT: case S_RADAR: case S_WETHR: cashout += dt; break; case S_TECH: case S_RSRCH: cashout += dt; i = i / prdcst; if( i != 0 ) goto X4604; goto X5136; X4604: if( owner == 0 ) goto X4666; if( quiet != 0 ) goto X4666; printf("%s made in %d, %d\n", ichr[prdtyp].i_name, x, y); X4666: if( sctdes != S_TECH ) goto X4716; nat.nat_t_level += i; goto X4734; X4716: nat.nat_r_level += i; X4734: putnat(sectowner); goto X5136; case S_ARMSF: case S_AMMOF: case S_AIRPT: i = (127 - *(§.sct_civil + prdtyp - 12) > i / prdcst) ? i / prdcst : 127 - *(§.sct_civil + prdtyp - 12); if( i == 0 ) goto X5116; if( owner == 0 ) goto X5116; if( quiet != 0 ) goto X5116; printf("%s built in %d,%d\n", ichr[prdtyp].i_name, x, y); X5116: *(§.sct_civil + prdtyp - 12) += i; X5136: sect.sct_prdct -= prdcst * i; cashout += prdcst * i; case S_HARBR: case S_BHEAD: q = (sect.sct_ore > (sect.sct_effic * iwork / 100) ) ? sect.sct_effic * iwork / 100 : sect.sct_ore; if( 127 >= sect.sct_prdct + q ) goto X5350; if( owner == 0 ) goto X5334; if( quiet != 0 ) goto X5334; printf("Production bottleneck in %d,%d\n", x, y); X5334: q = 127 - sect.sct_prdct; X5350: sect.sct_ore -= q; sect.sct_prdct += q; if( sect.sct_contr != 0 ) { cashout -= ((sect.sct_contr / 100.) * ichr[prdtyp].i_bid) * sect.sct_prdct; sect.sct_prdct = 0; } break; case S_GMINE: i = (127 - sect.sct_gold > (i / prdcst)) ? i / prdcst : 127 - sect.sct_gold; sect.sct_gold += i; sect.sct_prdct -= (prdcst * i); cashout += (prdcst * i); q = (sect.sct_ore > sect.sct_effic * iwork / 100) ? sect.sct_effic * iwork / 100 : sect.sct_ore; if( sect.sct_prdct + q <= 127 ) goto X5706; if( owner == 0 ) goto X5672; if( quiet != 0 ) goto X5672; printf("production overflow in %d,%d\n", x, y); X5672: q = 127 - sect.sct_prdct; X5706: sect.sct_ore -= q; sect.sct_prdct += q; if( sect.sct_contr == 0 ) goto X6030; cashout -= ((sect.sct_contr / 100.) * ichr[prdtyp].i_bid) * sect.sct_prdct; sect.sct_prdct = 0; X6030: q = (sect.sct_gmin > sect.sct_gmin * iwork / 100) ? sect.sct_gmin * iwork / 100 : sect.sct_gmin; sect.sct_ore += q; sect.sct_gmin -= (q>>1); if( owner == 0 ) break; if( sect.sct_gmin != 0 ) break; if( quiet != 0 ) break; printf("Out of ore in %d,%d\n", x, y); break; case S_MINE: /* q = (float)sect.sct_miner * sect.sct_effic * iwork / 1.e4; */ q=(int)(((float)sect.sct_miner * (float)sect.sct_effic * (float)iwork) / (10000.0)); /**** printf("q= %d min %f eff %f iwork %d\n",(int)q,(float)sect.sct_miner,(float)sect.sct_effic, (int)iwork); **** */ /* **** printf("work is %g\n",work); **** */ if( 127 >= sect.sct_ore + q ) goto X6332; if( owner == 0 ) goto X6316; if( quiet != 0 ) goto X6316; printf("Ore ready to move in %d,%d\n", x, y); X6316: q = 127 - sect.sct_ore; X6332: sect.sct_ore += q; if( sect.sct_contr == 0 ) break; cashout -= ((sect.sct_contr / 100.) * ichr[prdtyp].i_bid) * sect.sct_ore; sect.sct_ore = 0; } X6440: if( owner == 0 || nstat == STAT_GOD ) { nat.nat_money -= cashout; putnat(sectowner); } else { dolcost += cashout; } return(1); }