/* risky.c by Michiel Overtoom, 1987-1988 */ #include /* DOS routine defines */ #include /* defs used in resource header */ #include "obdefs.h" /* Objectdefinities voor GEM */ #include "gemdefs.h" /* Voor event multi */ #include "risk.h" /* button/dialoog identifiers (van RCS) */ #define HIDE_MOUSE graf_mouse(256,&junk) #define SHOW_MOUSE graf_mouse(257,&junk) #define NORMAL 1 #define SHOW 1 #define ENABLE 1 #define DISABLE 0 #define YES 1 #define NO 0 #define WAITEVENT (MU_MESAG|MU_BUTTON|MU_KEYBD) #define BUTTDOWN 1 #define ONEBUTTON 1 /* Muisvormen */ #define PIJL 0 #define BIJ 2 #define TRANSDIK 3 #define ATTACKDIK 7 #define VICTORYDIK 13 extern int contrl[],intin[], ptsin[],intout[], /* VDI binding tabellen */ ptsout[]; extern int charw,charh,boxw,boxh, /* Teken- en Schermgroottes */ xres,yres; extern int junk; /* Scratch var */ extern int handle; /* VDI's scherm handle */ int end_of_program; /* YES indien Quit gekozen */ int i,j; int workx,worky,workw,workh; /* Window Workspace afmetingen */ int deskx,desky,deskw,deskh; /* desktop afmetingen */ int pxy[10]; int trace; OBJECT *menutree; /* ---> Menutree */ extern OBJECT *dispmenu(); /* Toon menubar */ #define LANHEIGHT 4 #define LEGHEIGHT 6 int status; int landshow; int symshow; /* Werelddeel namen & aanwasgetallen */ #define MAXWDEEL 10 /* Max.Editsize werelddeel data */ char wnaam[MAXWDEEL][32]; int waanwas[MAXWDEEL]; char risnaam[80]; /* Aktueel speelveld filenaam */ /* Globals */ int nland; /* 0=leeg, n geeft laatste landindex aan */ char pi3[13]; /* Assoc bitmap */ char gebnaam[32]; /* gebiedsnaam null padded */ char om1[32]; /* Omschrijving */ char om2[32]; /* Omschrijving */ char om3[32]; /* Omschrijving */ char om4[32]; /* Omschrijving */ /* Data voor elk land: */ struct lands { char naam[32]; /* Landnaam, null padded */ int wdeel; /* Werelddeelnummer */ int legx,legy; /* Legerinfo x,y */ int lanx,lany; /* Landnaam x,y */ int npoly; /* Aantal polypunten */ int poly[64]; /* Max 31 polylines x,y (VDI format) */ int topol[8]; /* Max 8 topol links 0..7 */ }; #define MAXLAND 100 struct lands land[MAXLAND+1]; char ps[MAXLAND+1]; /* Bezetters van de landen */ int wd[7], /* Wereldeel hulptabel */ tel[7], /* Telling aanwas hulptabel */ nl[MAXLAND+1], /* Aantal legers in de landen */ alive[7], /* YES indien speler nog leeft */ ttot[7], /* Maximaal nog te transporteren */ comp[7], /* Type van de spelers 0mens 1,2atari */ sp, /* Huidige speler (aan beurt) */ ns; /* Aantal spelers */ char *bitmap; /* -> plaatje */ int dag,maand,jaar; /* Rondetellers */ extern char OFF[],POPWEG; /* Geluiden.... */ char KORTLAAG[34]={0,255,1,15,2,0,3,0,4,0,5,0,6,0,7,190,8,16, 9,0,10,0,11,0,12,14,13,9,14,14,15,14,0xFF,0}; char ZUIGKUS[34]={0,0,1,0,2,0,3,0,4,0,5,0,6,31,7,183,8,16, 9,16,10,16,11,112,12,0,13,4,14,14,15,14,0xFF,0}; char GALACTIC[34]={0,208,1,65,2,0,3,0,4,0,5,0,6,0,7,190,8,16, 9,15,10,15,11,22,12,1,13,14,14,14,15,14,0xFF,0}; char RINGMOD[34]={0,27,1,66,2,25,3,66,4,0,5,0,6,0,7,252,8,16, 9,16,10,15,11,80,12,1,13,14,14,14,15,14,0xFF,0}; main() { vdistuff(); rsrc_load("RISK.RSC"); menutree=dispmenu(MENUBAR); bitmap=(long *)Malloc(32008L); /* Buffer voor plaatje */ if (bitmap==0L) fout("Arggg... je hebt te|weinig geheugen!"); vst_alignment(handle,0,5,&junk,&junk); /* Globale text alignment */ fnieuw(); /* Zet hele speelveld op nulls */ strcpy(risnaam,""); /* Default speelveld */ defalts(); /* Instal nieuwe spel defaults */ opentopol(risnaam); /* Default risk speelveld laden */ fresh(); /* Beeld kompleet scherm af */ spellus(); /* Doe het spel */ Mfree(bitmap); /* Gooi bitmap weg */ v_clsvwk(handle); /* Sluit applikatie */ appl_exit(); } int multi() /* Michiel's Magnificent EventMulti lus */ { int land,event; int evb_bmx,evb_bmy,evb,keycode,clicks; int msgbuff[10]; end_of_program=NO; event=evnt_multi(WAITEVENT,2,ONEBUTTON,BUTTDOWN,0,0,0,0,0,0,0,0,0,0, msgbuff,0,0,&evb_bmx,&evb_bmy,&evb,&junk,&keycode,&clicks); wind_update(BEG_UPDATE); if (event&MU_MESAG) switch (msgbuff[0]) { case WM_CLOSED: end_of_program=YES; break; case MN_SELECTED: end_of_program=domenu(msgbuff[3],msgbuff[4]); break; } /* Muisbutton Message ? */ if (event&MU_BUTTON) { if (clicks==2) dubbelklik(evb_bmx,evb_bmy); else if (clicks==1) { if ((status!=10)&&(evb&BUTTDOWN)) { /* Drag start? */ if ((land=findland(evb_bmx,evb_bmy))== -1) Cconout(7); /* Drag error */ else voltooi_drag(evb_bmx,evb_bmy,land); } else klik(evb_bmx,evb_bmy); } } /* Einde button event */ /* Check een toetsenbord event */ if (event&MU_KEYBD) dokey(keycode); wind_update(END_UPDATE); /* Reaktiveer de menubalk */ return(end_of_program); /* geef YES terug indien Quit */ } /* Deze routine behandelt toetsaanslagen */ dokey(keycode) int keycode; { status=1; /* Skip naar volgende speler */ } /* Deze routine behandeld enkele kliks op bep. x,y */ klik(x,y) int x,y; { if (status==10) status=1; /* Indien in pauze, doorgaan */ } /* Deze routine behandeld dubbelkliks op bep. x,y */ dubbelklik(x,y) int x,y; { status=1; /* Altijd doorgaan */ } /* Zoekt het dichtbijzijnste land bij de muis. -1 is notfound */ /* Dit wordt nog beter met een polyline landcheck */ int findland(mx,my) int mx,my; { int xdis,ydis,mindist=9999,minland= -1; int i; for (i=1;i<=nland;i++) { xdis=land[i].legx-mx; if (xdis<0) xdis= -(xdis); ydis=land[i].legy-my; if (ydis<0) ydis= -(ydis); if ((xdis+ydis)25) return(-1); else return(minland); } /* Doe The Drag */ voltooi_drag(x,y,lnd) int x,y,lnd; { int dragx,dragy,dragw,dragh; int finx,finy,mousx,mousy; int doelland; dragx=land[lnd].legx; dragy=land[lnd].legy; graf_dragbox(16,8,dragx,dragy,0,0,640,400,&finx,&finy); /* Kijk waarop de muis losgelaten is */ graf_mkstate(&mousx,&mousy,&junk,&junk); if ((doelland=findland(mousx,mousy))== -1) { /* Niet boven een land? */ Cconout(7); return; } if (doelland!=lnd) /* Indien de landen verschillen */ interpreteer(lnd,doelland); else Cconout(7); } /* Een affaire tussen twee landen... */ interpreteer(src,dst) int src,dst; { if ((status!=3)&&(status!=4)) { fout("[Sysfout]|interpret() tijdens 3,4 status"); return; } if ((ps[src]-'0')!=sp) { spelfout("Je mag alleen","met je eigen", "legers spelen!!",src,dst); return; } /* Land is van speler */ if ((ps[dst]-'0')==sp) { /* Deze drag is een transport */ if (!adjacent(src,dst)) { spelfout("De gekozen landen","grenzen niet aan", "elkaar!!",src,dst); } else if (nl[src]<2) { Cconout(7); /* Valt niks te transporteren */ } else { if (!transport(src,dst)) return; status=4; /* Geslaagd transport, bump status */ } } else { if (status==4) { spelfout("Na een transport","kan je niet meer", "een aanval doen!!",src,dst); return; } if (adjacent(src,dst)) aanval(src,dst); else spelfout("De gekozen landen","grenzen niet", "aan elkaar!!",src,dst); } } /* Deze routine behandeld de keuzes uit het menu. */ domenu(title,item) int title,item; { int oudns; switch(item) { case DABOUT: dodialog(ABOUT,0,0); break; case FSAVE: savegame(); break; case FLOAD: loadgame(); fresh(); if ((status==3)||(status||4)) muisvorm(PIJL); else muisvorm(BIJ); if (comp[sp]!=0) muisvorm(BIJ); break; case FOPEN: opentopol(""); verdeel(); fresh(); break; case SSPEL: oudns=ns; if (!spelers()) break; if (oudns==ns) break; case SNIEUW: verdeel(); fresh(); status=0; break; case SGEEN: trace=SGEEN; menu_icheck(menutree,SGEEN,1); menu_icheck(menutree,SSNEL,0); menu_icheck(menutree,SLANG,0); break; case SSNEL: trace=SSNEL; menu_icheck(menutree,SGEEN,0); menu_icheck(menutree,SSNEL,1); menu_icheck(menutree,SLANG,0); break; case SLANG: trace=SLANG; menu_icheck(menutree,SGEEN,0); menu_icheck(menutree,SSNEL,0); menu_icheck(menutree,SLANG,1); break; case SLANDEN: menu_icheck(menutree,SLANDEN,0); landshow = landshow ? NO : YES; if (landshow) menu_icheck(menutree,SLANDEN,1); fresh(); break; case SSYMBOL: menu_icheck(menutree,SSYMBOL,0); symshow = symshow ? NO : YES; if (symshow) menu_icheck(menutree,SSYMBOL,1); fresh(); dispspelnr(); break; } menu_tnormal(menutree,title,NORMAL); return(item==FQUIT ? YES : NO); } /*********** Schoon alle schermveld variabelen (NEW operatie) */ fnieuw() { int i; blkfill(pi3,0,13); blkfill(gebnaam,0,32); blkfill(om1,0,32); blkfill(om2,0,32); blkfill(om3,0,32); blkfill(om4,0,32); blkfill(wnaam,0,32*10); blkfill(waanwas,0,sizeof(int)*10); for (i=1;i<=MAXLAND;i++) blkfill(&land[i],0,sizeof(struct lands)); nland=0; } /************** Default instellingen */ defalts() { int i; ns=3; for (i=1;i<=6;i++) comp[i]=0; comp[2]=1; comp[3]=2; trace=SLANG; menu_icheck(menutree,SGEEN,0); menu_icheck(menutree,SLANG,1); menu_icheck(menutree,SSNEL,0); landshow=YES; if (landshow) menu_icheck(menutree,SLANDEN,1); symshow=YES; if (symshow) menu_icheck(menutree,SSYMBOL,1); } spelers() { select(SPELERS,S1NIET); deselect(SPELERS,S1MENS); deselect(SPELERS,S1AG); deselect(SPELERS,S1PAS); select(SPELERS,S2NIET); deselect(SPELERS,S2MENS); deselect(SPELERS,S2AG); deselect(SPELERS,S2PAS); select(SPELERS,S3NIET); deselect(SPELERS,S3MENS); deselect(SPELERS,S3AG); deselect(SPELERS,S3PAS); select(SPELERS,S4NIET); deselect(SPELERS,S4MENS); deselect(SPELERS,S4AG); deselect(SPELERS,S4PAS); select(SPELERS,S5NIET); deselect(SPELERS,S5MENS); deselect(SPELERS,S5AG); deselect(SPELERS,S5PAS); select(SPELERS,S6NIET); deselect(SPELERS,S6MENS); deselect(SPELERS,S6AG); deselect(SPELERS,S6PAS); if (ns>0) { deselect(SPELERS,S1NIET); switch(comp[1]) { case 0: select(SPELERS,S1MENS); break; case 1: select(SPELERS,S1AG); break; case 2: select(SPELERS,S1PAS); break; } } if (ns>1) { deselect(SPELERS,S2NIET); switch(comp[2]) { case 0: select(SPELERS,S2MENS); break; case 1: select(SPELERS,S2AG); break; case 2: select(SPELERS,S2PAS); break; } } if (ns>2) { deselect(SPELERS,S3NIET); switch(comp[3]) { case 0: select(SPELERS,S3MENS); break; case 1: select(SPELERS,S3AG); break; case 2: select(SPELERS,S3PAS); break; } } if (ns>3) { deselect(SPELERS,S4NIET); switch(comp[4]) { case 0: select(SPELERS,S4MENS); break; case 1: select(SPELERS,S4AG); break; case 2: select(SPELERS,S4PAS); break; } } if (ns>4) { deselect(SPELERS,S5NIET); switch(comp[5]) { case 0: select(SPELERS,S5MENS); break; case 1: select(SPELERS,S5AG); break; case 2: select(SPELERS,S5PAS); break; } } if (ns>5) { deselect(SPELERS,S6NIET); switch(comp[6]) { case 0: select(SPELERS,S6MENS); break; case 1: select(SPELERS,S6AG); break; case 2: select(SPELERS,S6PAS); break; } } if (dodialog(SPELERS,0,0)==SAF) return(NO); ns=0; if (!selected(SPELERS,S1NIET)) { ns++; if (selected(SPELERS,S1MENS)) comp[ns]=0; if (selected(SPELERS,S1AG)) comp[ns]=1; if (selected(SPELERS,S1PAS)) comp[ns]=2; } if (!selected(SPELERS,S2NIET)) { ns++; if (selected(SPELERS,S2MENS)) comp[ns]=0; if (selected(SPELERS,S2AG)) comp[ns]=1; if (selected(SPELERS,S2PAS)) comp[ns]=2; } if (!selected(SPELERS,S3NIET)) { ns++; if (selected(SPELERS,S3MENS)) comp[ns]=0; if (selected(SPELERS,S3AG)) comp[ns]=1; if (selected(SPELERS,S3PAS)) comp[ns]=2; } if (!selected(SPELERS,S4NIET)) { ns++; if (selected(SPELERS,S4MENS)) comp[ns]=0; if (selected(SPELERS,S4AG)) comp[ns]=1; if (selected(SPELERS,S4PAS)) comp[ns]=2; } if (!selected(SPELERS,S5NIET)) { ns++; if (selected(SPELERS,S5MENS)) comp[ns]=0; if (selected(SPELERS,S5AG)) comp[ns]=1; if (selected(SPELERS,S5PAS)) comp[ns]=2; } if (!selected(SPELERS,S6NIET)) { ns++; if (selected(SPELERS,S6MENS)) comp[ns]=0; if (selected(SPELERS,S6AG)) comp[ns]=1; if (selected(SPELERS,S6PAS)) comp[ns]=2; } return(YES); } char *mnd[]={ "ERR","JAN","FEB","MRT", "APR","MEI","JUN","JUL", "AUG","SEP","OKT","NOV","DEC" }; char *bumpronde(ophogen) int ophogen; { static char tmp[20]; int ndag=rand()%10+1; if (ophogen) { dag+=ndag; if (dag>31) { dag-=31; maand++; if (maand>12) { maand=1; jaar++; } } } sprintf(tmp,"%2d %3s %4d",dag,mnd[maand],jaar); return(tmp); } bericht(s) char *s; { char t[80]; int i; vswr_mode(handle,1); vst_height(handle,LEGHEIGHT,&junk,&junk,&junk,&junk); sprintf(t,"%-31s",s); v_gtext(handle,640-11*8-31*8,3,t); } spellus() { verdeel(); updaall(); status=0; for(;;) { if ((status==3)||(status==4)||(status==10)) { if (multi()) break; /* Test op Quit */ } if (status==0) { sp=0; aanwas(); vswr_mode(handle,1); /* replace */ vst_height(handle,LEGHEIGHT,&junk,&junk,&junk,&junk); v_gtext(handle,640-11*8,10,bumpronde(YES)); status=1; } if (status==1) { sp++; dispspelnr(); if (sp>ns) status=0; else { switch (comp[sp]) { case 0: if (!alive[sp]) { status=1; break; } bericht("Dubbelklik -> volgende speler"); muisvorm(PIJL); status=3; break; case 1: case 2: muisvorm(BIJ); status=7; break; } } } if (status==7) { bericht("Computer speelt..."); if (comp[sp]==1) comput(); else computpas(); status=10; bericht("Pauze. (Klik of druk SPACE)"); } } } updaall() { int i; HIDE_MOUSE; for (i=1;i<=nland;i++) updacount(i); SHOW_MOUSE; } /* Teken een pijl van een land naar een ander */ pijl(src,dst,dikte) int src,dst,dikte; { long i,delay; int cnt; if (trace==SGEEN) return; if (dikte==VICTORYDIK) Dosound(RINGMOD); HIDE_MOUSE; fastsave(); /* Bewaar scherm */ if (trace==SLANG) cnt=5; else cnt=1; /* Snelle pijlen knipperen 1x */ /* Lanzame 3x aan en uit */ if (dikte==TRANSDIK) cnt=1; /* Transportpijlen 1 x */ vsl_ends(handle,0,1); vsl_width(handle,dikte); while(cnt) { vsl_color(handle,cnt&1); /* Wissel zwart<-->wit */ if (dikte!=VICTORYDIK) Dosound(ZUIGKUS); pxy[0]=land[src].legx; pxy[1]=land[src].legy; pxy[2]=land[dst].legx; pxy[3]=land[dst].legy; v_pline(handle,2,pxy); delay= (trace==SSNEL) ? 8000L : 20000L; /* Snelle pijl blijft */ /* korter staan. */ for (i=0L;i0) {left=YES; break;} } while(left); } /* Volgend werelddeel */ updaall(); /* Update alle legeraantallen */ /* Check of er al spelers dood zijn */ for (i=1;i<=ns;i++) alive[i]=NO; totalive=0; for (i=1;i<=nland;i++) alive[ps[i]-'0']=YES; for (i=1;i<=ns;i++) if (alive[i]) totalive++; if (totalive<2) fout("Het spel is afgelopen.|Kies 'Spel/Nieuw Spel'"); } long ticks; getclk() { asm("move.l $4ba,d0"); /* 200hz systemclock */ asm("move.l d0,_ticks"); } /* Zet random seed, aantal legers en verdeel de landen */ verdeel() { int i,x,r1,r2; int sor[MAXLAND+1]; Supexec(getclk); srand((int)ticks); for(i=1;i<=ns;i++) alive[i]=YES; /* Player alive */ for(i=1;i<=nland;i++) nl[i]=8+rand()/8000; /* Ken legers toe */ for(i=1;i<=nland;i++) sor[i]=i; for(i=1;i<=200;i++) { r1=1+rand()%nland; r2=1+rand()%nland; x=sor[r1]; sor[r1]=sor[r2]; /* Hutsel tabel */ sor[r2]=x; } for(i=1;i<=nland;i++) ps[sor[i]]='1'+i%ns; /* Ken landen toe */ } /* Transporteer legers van src naar dst. Interactief. */ int transport(src,dst) int src,dst; { int volume; /* #legers te transporteren */ if (ttot[sp]<=0) { /* Transport nog mogelijk? */ spelfout("Je hebt je maximum","getransporteert!!", "Nu eerst de anderen.",src,dst); return(NO); } zetint(TRANS,TBUDGET,ttot[sp]); /* Maak dialoog klaar */ switch(dodialog(TRANS,src,dst)) { /* Wat koos de gebruiker? */ case T0: return(NO); case T1: volume=1; break; case T2: volume=2; break; case T3: volume=3; break; case T4: volume=4; break; case T5: volume=5; break; case T6: volume=6; break; case T7: volume=7; break; case T8: volume=8; break; case T9: volume=9; break; case TALL: volume=nl[src]-1; break; /* Alles */ } if (volume>nl[src]-1) volume=nl[src]-1; /* Teveel? */ if (volume>ttot[sp]) volume=ttot[sp]; nl[src]-=volume; /* Verlaag de legers in het bronland */ nl[dst]+=volume; /* Verhoog ze daar waar ze heen gaan */ ttot[sp]-=volume; /* Trek van het totaal nog te doen af */ updacount(src); /* Werk bij op scherm */ updacount(dst); return(YES); /* Geslaagd transport. Aanvallen gaat niet meer*/ } /* Update de legercount van een land op het scherm. */ char symbols[]="? +*~!!!!!!"; updacount(landnr) int landnr; { char s[10]; register int cnt=nl[landnr]; strcpy(s,"x 000"); s[0]= symshow ? symbols[ps[landnr]-'0'] : ps[landnr]; while(cnt>=100) {s[2]++; cnt-=100;} /* Snelle itoa */ while(cnt>=10) {s[3]++; cnt-=10;} s[4]+=cnt; cnt=2; while((s[cnt]=='0')&&(cnt<4)) s[cnt++]='_'; /* Zero suppression */ vswr_mode(handle,1); /* replace mode */ vst_height(handle,LEGHEIGHT,&junk,&junk,&junk,&junk); v_gtext(handle,land[landnr].legx,land[landnr].legy,s); } /*********** Update de aktuele speler */ char *spstr="Speler X"; dispspelnr() { spstr[7]= symshow ? symbols[sp] : sp+'0'; vswr_mode(handle,1); /* replace */ vst_height(handle,LEGHEIGHT,&junk,&junk,&junk,&junk); v_gtext(handle,640-11*8,1,spstr); } /* Speleraanval */ aanval(src,dst) int src,dst; { int da,dv; int dn,dm; int cnt,win,volume; if (nl[src]<2) return(NO); /* Minstens 3 legers voor aanval nodig */ win=NO; while ((!win)&&(nl[src]>1)) { if (dodialog(AANVAL,src,dst)==ASTOP) break;/* Aftocht blazen? */ dn= (nl[src]<4) ? nl[src]-1 : 3; dm= (nl[dst]<3) ? nl[dst] : 3; dices(dn,dm,&da,&dv); nl[src]-=da; nl[dst]-=dv; updacount(src); updacount(dst); if (nl[dst]==0) { win=YES; break; } } if (win) { ps[dst]=sp+'0'; zettext(ZEGEVIER,ZAANTAL,""); dodialog(ZEGEVIER,src,dst); volume=getint(ZEGEVIER,ZAANTAL); if ((volume<1)||(volume>(nl[src]-1))) /* Teveel? */ volume=nl[src]-1; nl[dst]=volume; /* Verplaats legers */ nl[src]-=volume; updacount(src); updacount(dst); } } /* bepaal of twee landen aan elkaar grenzen */ int adjacent(a,b) int a,b; { for (i=0;i<=7;i++) if (land[a].topol[i]==b) return(YES); return(NO); } /* Roll the dices... */ dices(dn,dm,da,dv) int dn,dm,*da,*dv; { int di,dj,dp,dq,dr,dx,dy,dz; *da=0; *dv=0; di= (dm2 && dq1 && dp2 && dy1 && dxdx) { (*da)--; (*dv)++; } if (di<2) return; if (dq>dy) { (*da)--; (*dv)++; } if (di<3) return; if (dr<=dz) return; (*da--); (*dv)++; } comput() { int src,dst; int pot,part; int thuisblijvers,supermacht,bondgenoten,vriendlanden; int windrichting; for(src=1;src<=nland;src++) { /* Alle landen langs */ if (ps[src]!=('0'+sp)) continue; /* Is dit src niet van mij? */ if (nl[src]<5) continue; /* Minstens 5 legers??? */ /* Dit land is van mij. Spioneer bij de buren... */ supermacht=0; for (windrichting=0;windrichting<=7;windrichting++) { dst=land[src].topol[windrichting]; if (dst && ps[dst]!=ps[src]) supermacht=(supermacht>nl[dst]) ? supermacht : nl[dst]; } if (!supermacht) continue; /* Geen vijanden */ thuisblijvers=supermacht/2; /* Garandeer veiligheid */ if (thuisblijvers<5) thuisblijvers=5; /* Minstens 5 */ if (nl[src]=thuisblijvers) if (100*nl[src]/nl[dst]-90 > rand()/327) cattack(src,dst,thuisblijvers); } } /* Naar volgende land */ /* TRANSPORT */ for(src=1;src<=nland;src++) { /* Alle landen langs */ if (ps[src]!=('0'+sp)) continue; /* Is dit land niet van mij? */ /* Transport uit dit land */ bondgenoten=nl[src]; vriendlanden=1; supermacht=0; for (windrichting=0;windrichting<=7;windrichting++) { dst=land[src].topol[windrichting]; if (!dst) continue; if (ps[src]==ps[dst]) { bondgenoten+=nl[dst]; vriendlanden++; } else supermacht=(supermacht>nl[dst]) ? supermacht : nl[dst]; } if (vriendlanden==1) continue; /* Valt niks te transporteren */ if (supermacht==0) pot=nl[src]-1; /* Flink verhuizen indien geen vijanden*/ else { pot=nl[src]-bondgenoten/vriendlanden; if (pot<0) pot=0; } part=pot/(vriendlanden-1); if (part==0) continue; /* Niks te verdelen */ for (windrichting=0;windrichting<=7;windrichting++) { dst=land[src].topol[windrichting]; if (dst && (ps[src]==ps[dst])) { nl[dst]+=part; pijl(src,dst,TRANSDIK); updacount(dst); } } nl[src]-=(vriendlanden-1)*part; if (nl[src]<1) nl[src]=1; /* BUG: interger afronding */ updacount(src); } /* Volgende land */ } computpas() /* Passief computerspel ***INCORRECT ****/ { int src,dst; int dreiging,bondgenoten; int buur,windrichting; int kanonvlees; int supermacht; int vijandlanden; for(src=1;src<=nland;src++) { if (ps[src]!=('0'+sp)) continue; /* Is dit src niet van mij? */ for(windrichting=0;windrichting<=7;windrichting++) { dst=land[src].topol[windrichting]; if (dst==0) continue; supermacht=dreiging=0; /* Spioneer omgeving */ bondgenoten=nl[src]; vijandlanden=0; for(buur=0;buur<=7;buur++) { int dst; dst=land[src].topol[buur]; if (dst==0) continue; if (ps[dst]==('0'+sp)) { bondgenoten+=nl[dst]; } else { vijandlanden++; dreiging+=nl[dst]; if (nl[dst]>supermacht) supermacht=nl[dst]; } } if (dreiging>(bondgenoten*2)) { break; /* Forget it... */ } if (ps[dst]==('0'+sp)) continue; /* jezelf aanvallen == onzin */ /* Kijk hoeveel we kunnen missen */ kanonvlees=nl[src]-(dreiging/vijandlanden); if (kanonvlees<=2) continue; /* Het vlees is op... */ if (nl[src]>(supermacht/2)) cattack(src,dst,kanonvlees); } } for(src=1;src<=nland;src++) { /* Transport fase */ if (ps[src]!=('0'+sp)) continue; /* Is dit land niet van mij? */ for(windrichting=0;windrichting<=7;windrichting++) { dst=land[src].topol[windrichting]; if (dst==0) continue; if (ps[dst]!=('0'+sp)) continue; if (nl[src]<2) continue; if (ttot[src]<=0) continue; while(kwetsbaarheid(src,0)=MAXDEPTH) return(50); /* Nesting level. Neutraal */ bepaalmacht(land,VIJANDEN,&nvijand,&vijgrootste,&vijgem); bepaalmacht(land,VRIENDEN,&nvriend,&vrigrootste,&vrigem); if (nvijand==0) return(0); /* Niet kwetsbaar */ if (nvriend==0) return(100); /* Allemaal vijanden */ if (vrigem>vijgem) { /* Meer vrienden dan vijanden */ return(20); } else { /* Meer vijanden dan vrienden */ return(80); } } /* bepaalt van een land het aantal vijandlanden, de grootste en 't gemiddelde */ int bepaalmacht(lnd,mode,nstaten,grootste,gemid) int lnd,mode,*nstaten, *grootste,*gemid; { int i,totaal,dst; int nstat,groo,gem,tot; nstat = gem = groo = tot = 0; for (i=0;i<=7;i++) { dst=land[lnd].topol[i]; if (!dst) continue; if ((mode==VIJANDEN) ? (ps[lnd]!=ps[dst]):(ps[lnd]==ps[dst])){ nstat++; tot+=nl[dst]; if (nl[dst]>groo) groo=nl[dst]; } } if (nstat>0) gem=tot/nstat; *nstaten = nstat; *grootste = groo; *gemid = gemid; return(tot); } /* Computer valt daadwerkelijk aan */ cattack (src,dst,lmin) int src,dst,lmin; { int i,dn,dm,cnt; int da,dv; cnt=10; pijl(src,dst,ATTACKDIK); while ( (--cnt>0) && /* Max 10x aanvallen */ (nl[src]>=lmin) && /* Dodenlimiet nog niet overschreden ?*/ (nl[dst]>0) && /* Verdedigende legers aanwezig... */ (nl[src]>1) /* Sourcelegers aanvalsfaehig? */ ) { dn=3; dm=(nl[dst]<3) ? nl[dst] : 3; /* Then do it! */ dices(dn,dm,&da,&dv); nl[src]-=da; nl[dst]-=dv; updacount(src); updacount(dst); } if (nl[dst]==0) { /* Gewonnen? */ ps[dst]='0'+sp; i=nl[src]/2; /* Move de helft v/d legers */ nl[dst]=i; nl[src]-=i; pijl(src,dst,VICTORYDIK); /* Zeer dikke pijl */ Dosound(OFF); updacount(src); updacount(dst); } if (nl[src]<=0) nl[src]=1; } loadgame() { char gamenaam[80]; int fd; char oldris[80]; strcpy(oldris,risnaam); strcpy(gamenaam,"DEFAULT.SIT"); if (!filesel(".SIT",gamenaam)) return(NO); fd=Fopen(gamenaam,0); if (fd>0) { Fread(fd,80L,risnaam); Fread(fd,2L,&status); Fread(fd,2L,&sp); Fread(fd,2L,&ns); Fread(fd,51L,ps); Fread(fd,102L,nl); Fread(fd,14L,alive); Fread(fd,14L,comp); Fread(fd,2L,&dag); Fread(fd,2L,&maand); Fread(fd,2L,&jaar); Fclose(fd); if (strcmp(risnaam,oldris)==0) return; /* Heee.. er hoort een andere kaart bij */ opentopol(risnaam); } else fout("Niet gevonden"); } savegame() { char gamenaam[80]; int fd; strcpy(gamenaam,"DEFAULT.SIT"); if (!filesel(".SIT",gamenaam)) return(NO); fd=Fcreate(gamenaam,0); if (fd>0) { Fwrite(fd,80L,&risnaam); Fwrite(fd,2L,&status); Fwrite(fd,2L,&sp); Fwrite(fd,2L,&ns); Fwrite(fd,51L,ps); Fwrite(fd,102L,nl); Fwrite(fd,14L,alive); Fwrite(fd,14L,comp); Fwrite(fd,2L,&dag); Fwrite(fd,2L,&maand); Fwrite(fd,2L,&jaar); Fclose(fd); } else fout("Schrijffout (Disk vol?)"); } picload() { char s; int fd=Fopen(pi3,0); if (fd<0) { sprintf(s,"Gewenste tekening|%s onvindbaar!",pi3); fout(s); return(fd); } Fread(fd,34L,bitmap); Fread(fd,32000L,bitmap); Fclose(fd); } spelfout(s1,s2,s3,src,dst) char *s1,*s2,*s3; int src,dst; { zettext(SPELFOUT,SPF1,s1); zettext(SPELFOUT,SPF2,s2); zettext(SPELFOUT,SPF3,s3); dodialog(SPELFOUT,src,dst); } picdisp() { long *src=bitmap,*dst=Logbase(); int cnt=8000L; while(cnt--) *dst++= *src++; } /*********** Beeld alle gegevens af */ fresh() { int i; char s[80]; HIDE_MOUSE; if (*pi3) picdisp(); else form_dial(3,0,0,640,400,0,0,640,400); dispmenu(MENUBAR); vswr_mode(handle,1); /* Aktuele datum */ vst_height(handle,LEGHEIGHT,&junk,&junk,&junk,&junk); v_gtext(handle,640-11*8,10,bumpronde(NO)); dispspelnr(); /* Aktuele speler */ vsf_perimeter(handle,0); /* Niet omramen */ vsf_interior(handle,2); /* Gebruik vulpatronen, geen lijntjes */ vsf_style(handle,0); /* Een lege grijstoon */ for (i=1;i<=nland;i++) { /* de landvorm Polyline */ if (land[i].npoly) { vswr_mode(handle,4); /* Reverse transparante Overlay */ v_pline(handle,land[i].npoly,land[i].poly); } /* Landnaam */ if (landshow && land[i].lanx && land[i].lany) { vst_height(handle,LANHEIGHT,&junk,&junk,&junk,&junk); vswr_mode(handle,0); /* Domweg replacen */ v_gtext(handle,land[i].lanx,land[i].lany, land[i].naam); } /* Legersterkte aanduiding */ if (land[i].legx && land[i].legy) { updacount(i); } } SHOW_MOUSE; } int filesel(ext,defalt) char *defalt,*ext; /* Return NO voor CANCEL */ { char curdir[80],filenaam[80]; char f[100]; /* Full-named geselecteerde file */ int fd,i,exitbut; strcpy(curdir,"x:"); curdir[0]='A'+Dgetdrv(); Dgetpath(&curdir[2],0); strcat(curdir,"\\*"); strcat(curdir,ext); /* Maak D:\C\*.ext */ strcpy(filenaam,defalt); HIDE_MOUSE; fastsave(); SHOW_MOUSE; fsel_input(curdir,filenaam,&exitbut); HIDE_MOUSE; fastrest(); SHOW_MOUSE; if (exitbut!=1) return(NO); extensie(filenaam,ext); strcpy(f,curdir); /* Plak file achter directorynaam */ for (i=0;i31)) dag=1+rand()%30; if ((maand<1)||(maand>12)) maand=1+rand()%12; sscanf(om4,"%d",&jaar); if ((jaar<=0)||(jaar>2099)) jaar=1957+rand()%20; return(YES); } /* Doe een dialog, speciale versie met bitmap restore en muispos */ int dodialog(ident,src,dst) int ident,src,dst; { int dialx,dialy,dialw,dialh; int x,y,w,h; int exitbut; OBJECT *dialog; rsrc_gaddr(0,ident,&dialog); dialw=dialog[0].ob_width; dialh=dialog[0].ob_height; form_center(dialog,&x,&y,&w,&h); if ((src==0)&&(dst==0)) { dialx=x; dialy=y; } else { /* Centreer tussen twee landen */ dialx=(land[src].legx+land[dst].legx)/2-dialw/2; /* Maar hou 'm in het scherm */ if ((dialx+dialw)>630) dialx=630-dialw; if (dialx<10) dialx=10; /* Dialoog ONDER het zuidelijkste land... */ dialy=land[src].legy; if (land[dst].legy>dialy) dialy=land[dst].legy; dialy+=12; /* Indien van scherm af, er maar boven */ if ((dialy+dialh)>390) { dialy=land[src].legy; if (land[dst].legy