|
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 n
Length: 31857 (0x7c71) Types: TextFile Names: »newlogin.c.orig«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Conquer/newlogin.c.orig«
/*conquer : Copyright (c) 1988 by Ed Barlow. * I spent a long time writing this code & I hope that you respect this. * I give permission to alter the code, but not to copy or redistribute * it without my explicit permission. If you alter the code, * please document changes and send me a copy, so all can have it. * This code, to the best of my knowledge works well, but it is my first * 'C' program and should be treated as such. I disclaim any * responsibility for the codes actions (use at your own risk). I guess * I am saying "Happy gaming", and am trying not to get sued in the process. * Ed */ /*create a new login for a new player*/ #include <ctype.h> #include "newlogin.h" #include "header.h" #include "data.h" extern int pwater; /* percent water in world (0-100) */ extern FILE *fexe, *fopen(); extern short country; int numleaders; /* Teraform the area around somebodies capitol */ /* this gives everybody some chance of success */ void teraform( x,y,range, chance ) int x,y; int range,chance; { int i,j; switch(curntn->race) { case DWARF: sct[x][y].altitude=MOUNTAIN; for(i=x-range;i<=x+range;i++) for(j=y-range;j<=y+range;j++) if((i!=x)&&(j!=y)&&(ONMAP(i,j)) &&(sct[i][j].altitude!=WATER)){ if (rand()%3==0) sct[i][j].altitude=MOUNTAIN; else sct[i][j].altitude=HILL; if( rand()%100 < chance ) getmetal( &sct[i][j] ); } return; case ELF: sct[x][y].vegetation = FOREST; for(i=x-range;i<=x+range;i++) for(j=y-range;j<=y+range;j++) if((i!=x)&&(j!=y)&&(ONMAP(i,j)) &&(sct[i][j].altitude!=WATER)) { if (rand()%3==0) sct[i][j].vegetation=FOREST; else sct[i][j].vegetation=WOOD; if( rand()%100 < chance ) getjewel( &sct[i][j] ); } return; case ORC: sct[x][y].altitude=MOUNTAIN; for(i=x-range;i<=x+range;i++) for(j=y-range;j<=y+range;j++) if((i!=x)&&(j!=y)&&(ONMAP(i,j)) &&(sct[i][j].altitude!=WATER)) { if (rand()%3==0) sct[i][j].altitude=MOUNTAIN; else sct[i][j].altitude=HILL; if( rand()%100 < chance ) { if(rand()%2==0) getmetal( &sct[i][j] ); else getjewel( &sct[i][j] ); } } return; case HUMAN: sct[x][y].altitude = CLEAR; for(i=x-range;i<=x+range;i++) for(j=y-range;j<=y+range;j++) if((i!=x)&&(j!=y)&&(ONMAP(i,j)) &&(sct[i][j].altitude!=WATER)) { if (rand()%2==0) sct[x][y].altitude = CLEAR; if (rand()%2==0) sct[i][j].vegetation=WOOD; else sct[i][j].vegetation=GOOD; if( rand()%100 < chance ) { if (rand()%2==0) getmetal( &sct[i][j] ); else getjewel( &sct[i][j] ); } } return; } } void mailtopc(string) char *string; { int ctry; for( ctry=0; ctry<NTOTAL; ctry++){ if((ctry==0)||(ispc(ntn[ctry].active))){ mailopen(ctry); fprintf(fm,"%s",string); mailclose(); } } } void newlogin() { /* use points to create empire, add if late starter*/ int points; char tempc[10]; int n; int valid=TRUE; /*valid==FALSE means continue loop*/ int temp; int more=TRUE; /*0 if add another player*/ int loop; long x; char tempo[8],strin[80]; char passwd[PASSLTH+1],*getpass(); register i; printf("\nPreparing to add player\n"); while(more==TRUE) { points=MAXPTS; country=0; /*find valid nation number type*/ for(i=1;i<NTOTAL;i++) if(ntn[i].active==INACTIVE) { country=i; curntn = &ntn[country]; break; } printf("first valid nation id is %d\n",country); if(country==0) { beep(); printf("error, cant add new nation\n"); return; } /* open output for future printing*/ sprintf(tempc,"%s%d",exefile,i); if ((fexe=fopen(tempc,"w"))==NULL) { beep(); printf("error opening %s\n",tempc); exit(FAIL); } valid=FALSE; /*get name*/ while(valid==FALSE) { valid=TRUE; printf("\nwhat name would you like your nation to have:"); gets(curntn->name); if((strlen(curntn->name)<=1) ||(strlen(curntn->name)>NAMELTH)){ printf("\ninvalid name"); valid=FALSE; } /*check if already used*/ if((strcmp(curntn->name,"god")==0) ||(strcmp(curntn->name,"unowned")==0)){ printf("\nname already used"); valid=FALSE; } for(i=1;i<NTOTAL;i++) if((i!=country)&&(strcmp(ntn[i].name,curntn->name)==0)) { printf("\nname already used"); valid=FALSE; } } valid=FALSE; while(valid==FALSE) { /* password routine */ strncpy(passwd,getpass("Enter national password (remember this!):"),PASSLTH); strncpy(curntn->passwd,getpass("Please reenter password:"),PASSLTH); if((strlen(passwd)<2) ||(strncmp(curntn->passwd,passwd,PASSLTH)!=0)){ beep(); printf("\ninvalid user password\n"); } else valid=TRUE; } strncpy(curntn->passwd,crypt(passwd,SALT),PASSLTH); /*get your name*/ valid=FALSE; while(valid==FALSE) { valid=TRUE; printf("\nEnter the name of your country's leader (Groo, The Ed, Gandalf...)"); printf("\n\t(maximum %d characters):",LEADERLTH); gets(tempc); if((strlen(tempc)>LEADERLTH)||(strlen(tempc)<2)) { beep(); printf("\ninvalid name (too short or long)"); valid=FALSE; } else strcpy(curntn->leader,tempc); } valid=FALSE; while(valid==FALSE) { valid=TRUE; printf("\nwhat race would you like to be:"); printf("\n\tchoose (d)warf,(e)lf,(o)rc,(h)uman:"); scanf("%1s",tempo); switch(tempo[0]) { case 'd': printf("\ndwarf chosen\n"); /*MINER POWER INATE TO DWARVES*/ printf("Dwarves have MINING skills\n"); curntn->powers=MINER; x=MINER; CHGMGK; points -= getclass(DWARF); curntn->race=DWARF; curntn->tgold=NLDGOLD; curntn->tfood=NLDFOOD; curntn->jewels=NLDJEWEL; curntn->metals=NLDMETAL; curntn->tciv= NLDCIVIL; curntn->tmil= NLDMILIT; curntn->repro= NLDREPRO; curntn->maxmove= NLDMMOVE; curntn->aplus= NLDAPLUS; curntn->dplus= NLDDPLUS; curntn->location=RANDOM; points-=startcost(); break; case 'e': printf("\nelf chosen\n"); printf("Elves are magically cloaked (VOID power)\n"); curntn->powers=THE_VOID; x=THE_VOID; CHGMGK; points -= getclass(ELF); curntn->race=ELF; curntn->tgold=NLEGOLD; curntn->tfood=NLEFOOD; curntn->jewels=NLEJEWEL; curntn->metals=NLEMETAL; curntn->tciv=NLECIVIL; curntn->tmil=NLEMILIT; curntn->repro=NLEREPRO; curntn->maxmove=NLEMMOVE; curntn->aplus=NLEAPLUS; curntn->dplus=NLEDPLUS; curntn->location=FAIR; points-=startcost(); break; case 'o': printf("\norc chosen\n"); /*MINOR MONSTER POWER INATE TO ORCS*/ printf("your leader is a monster!\n"); curntn->powers=MI_MONST; x=MI_MONST; CHGMGK; points -= getclass(ORC); curntn->race=ORC; curntn->tgold=NLOGOLD; curntn->tfood=NLOFOOD; curntn->jewels=NLOJEWEL; curntn->metals=NLOMETAL; curntn->tciv=NLOCIVIL; curntn->tmil=NLOMILIT; curntn->repro=NLOREPRO; curntn->maxmove=NLOMMOVE; curntn->aplus=NLOAPLUS; curntn->dplus=NLODPLUS; curntn->location=RANDOM; points-=startcost(); break; case 'h': printf("\nhuman chosen\n"); curntn->race=HUMAN; printf("Humans have the combat skill of a WARRIOR\n"); curntn->powers = WARRIOR; x=WARRIOR; CHGMGK; points -= getclass(HUMAN); curntn->tgold=NLHGOLD; curntn->tfood=NLHFOOD; curntn->jewels=NLHJEWEL; curntn->metals=NLHMETAL; curntn->tciv=NLHCIVIL; curntn->tmil=NLHMILIT; curntn->repro=NLHREPRO; curntn->maxmove=NLHMMOVE; curntn->aplus=NLHAPLUS; curntn->dplus=NLHDPLUS; curntn->location=RANDOM; points-=startcost(); break; default: printf("\ninvalid race\n "); valid=0; } } valid=FALSE; if( curntn->race == ORC ) { /* orcs are always evil */ valid=TRUE; curntn->active=PC_EVIL; } while(valid==FALSE) { valid=TRUE; printf("\nplease enter alignment ((g)ood,(n)eutral,(e)vil): "); scanf("%1s",tempo); switch(tempo[0]) { case 'g': curntn->active=PC_GOOD; break; case 'n': curntn->active=PC_NEUTRAL; break; case 'e': curntn->active=PC_EVIL; break; default : printf("\nsorry - please enter alignment ((g)ood,(n)eutral,(e)vil): "); valid=FALSE; break; } } valid = npctype(curntn->active); printf("ok... alignment is %s\n",allignment[valid]); /* get nation mark */ valid=FALSE; curntn->mark= (*curntn->name); printf("\ntesting first letter of name (%c) for nation mark...",curntn->mark); if( markok(curntn->mark, TRUE)==TRUE ) curntn->mark= curntn->mark; else if( islower(curntn->mark) && markok( toupper(curntn->mark), TRUE )==TRUE ) curntn->mark= toupper(curntn->mark); else if( isupper(curntn->mark) && markok( tolower(curntn->mark) , TRUE)==TRUE ) curntn->mark= tolower(curntn->mark); else while(TRUE) { printf("\nplease enter new national mark (for maps):"); printf("\n This can be any of the following:"); for (tempc[0]='!';tempc[0]<='~';tempc[0]++) { if( markok( tempc[0], FALSE ) ) printf(" %c",tempc[0]); } printf("\n"); scanf("%1s",tempc); if( markok( tempc[0], TRUE ) ){ curntn->mark=(*tempc); printf("\nvalid..."); break; } } printf("mark currently is %c\n",curntn->mark); while(points>0) { printf("\n\nwhat would you like to buy with your remaining %d points\n\n",points); printf("\t1. population (%ld/pt):\t\tnow have %ld civilians\n",NLPOP,curntn->tciv); printf("\t2. more gold talons ($%ld/pt):\tnow have %ld gold talons\n",NLGOLD,curntn->tgold); printf("\t3. better location (%d pt):\t\tlocation is now is %c\n",NLLOCCOST,curntn->location); printf("\t4. more soldiers (%ld/pt):\t\tnow have %ld soldiers\n",NLSOLD,curntn->tmil); if( curntn->race != ORC ){ printf("\t5. better attack (%d%%/pt):\t\tnow is +%d\n ",NLATTACK,curntn->aplus); printf("\t6. better defence (%d%%/pt):\t\tnow is +%d\n",NLDEFENCE,curntn->dplus); printf("\t7. higher reproduction (+%d%%/%d pt):\trate is now %d%%/year\n",NLREPRO,NLREPCOST,curntn->repro); printf("\t8. higher movement (%d/pt): \t\tnow move %d sectors\n",NLMOVE,curntn->maxmove); } else { printf("\t5. better attack (%d%%/pt):\t\tnow is +%d\n ",NLATTACK/2,curntn->aplus); printf("\t6. better defence (%d%%/pt):\t\tnow is +%d\n",NLDEFENCE/2,curntn->dplus); printf("\t7. higher reproduction (+%d%%/%d pt):\trate is now %d%%/year\n",NLREPRO_ORC,NLREPCOST,curntn->repro); } printf("\t9. double raw resources (%ld pts): \tfood now %ld\n",NLDBLCOST*curntn->tfood/NLHFOOD,curntn->tfood); printf("\t \tjewels now %ld\n",curntn->jewels); printf("\t \tmetals now %ld\n",curntn->metals); printf("\t10. additional random magic power (%d pts)\n",NLMAGIC); printf("\t11. additional %d leaders (%d pts)\tnation has %d %ss\n",NLEADER,NLEADPT,numleaders,unittype[getleader(curntn->class)%UTYPE]); printf("\nWhat option to buy:"); if(scanf("%d",&n)==1) switch(n) { case 1: printf("additional population costs 1 pt per %d\n",NLPOP); printf("how many points to spend on population:"); scanf("%d",&temp); putchar('\n'); if(points <= 0) { printf("Purchase aborted..."); } if(points >= temp) { points -= temp; curntn->tciv+=temp*NLPOP; } else printf("You dont have enough points left"); break; case 2: printf("you now have $%ld gold talons\n",curntn->tgold); printf("and can buy more at $%ld per point\n",NLGOLD); printf("how many points to spend on added gold talons:"); scanf("%d",&temp); putchar('\n'); if(points<=0) { printf("Purchase aborted...."); } else if(points>=temp) { points-=temp; curntn->tgold+=temp*NLGOLD; } else printf("You dont have enough points left"); break; case 3: if(curntn->location==GREAT) break; if(points>=NLLOCCOST) { points -=NLLOCCOST; if(curntn->location==RANDOM){ curntn->location=FAIR; } else if(curntn->location==FAIR){ curntn->location=GREAT; } } else { printf("Too Few Points Left..."); break; } break; case 4: printf("you start with %ld soldiers\n",curntn->tmil); printf("additional military costs 1 / %d\n",NLSOLD); printf("how many points to spend?"); scanf("%d",&temp); putchar('\n'); if (points <= 0) { printf("Purchase aborted..."); } else if(points >= temp) { points -= temp; curntn->tmil+=temp*NLSOLD; } else printf("You dont have enough points left"); break; case 5: printf("now have %d percent attack bonus\n",curntn->aplus); if(curntn->race == ORC ) { printf("orcs cost additional for combat bonuses\n"); printf("an additional %d percent per point\n",NLATTACK/2); } else printf("an additional %d percent per point\n",NLATTACK); printf("how many points do you wish to spend?"); scanf("%d",&temp); putchar('\n'); if(points <= 0) { printf("Purchase aborted..."); } else if(points >= temp) { points -= temp; if(curntn->race == ORC ) curntn->aplus+=temp*NLATTACK/2; else curntn->aplus+=temp*NLATTACK; } else printf("You dont have enough points left"); break; case 6: if(magic(country,VAMPIRE)==1) { printf("you have vampire power and cant add to combat bonus\n"); break; } printf("now have %d percent defence bonus\n",curntn->dplus); if(curntn->race == ORC ) { printf("orcs cost additional for combat bonuses\n"); printf("an additional %d percent per point\n",NLDEFENCE/2); } else printf("an additional %d percent per point\n",NLDEFENCE); printf("how many points do you wish to spend?"); scanf("%d",&temp); putchar('\n'); if(points <= 0) { printf("Purchase aborted..."); } else if(points >= temp) { points -= temp; if(curntn->race == ORC ) curntn->dplus+=temp*NLDEFENCE/2; else curntn->dplus+=temp*NLDEFENCE; } else printf("You dont have enough points left"); break; case 7: if(curntn->race==ORC) printf("repro rate costs %d points per %d percent per year\n",NLREPCOST,NLREPRO_ORC); else printf("repro rate costs %d points per %d percent per year\n",NLREPCOST,NLREPRO); printf("you now have %d percent\n",curntn->repro); if((curntn->race!=ORC) &&(curntn->repro>=10)){ printf("you have the maximum rate"); break; } else if(curntn->repro>=14){ printf("you have the maximum rate"); break; } printf("how many purchasing points to spend?:"); scanf("%d",&temp); putchar('\n'); if(temp < points) { printf("You don't have enough points left"); } else if (temp < 0) { printf("Negative, huh? Who you trying to kid?"); } else if (temp%NLREPCOST != 0) { printf("You must spend in multiples of %d",NLREPCOST); } else { if(curntn->race != ORC) { temp = temp/NLREPCOST*NLREPRO; if(curntn->repro+temp > 10) { printf("That exceeds the 10% limit"); } else { points -= (temp*NLREPCOST/NLREPRO); curntn->repro += temp; } } else { temp = temp/NLREPCOST*NLREPRO_ORC; if(curntn->repro+temp > 14) { printf("That exceeds the 14% limit"); } else { points -= (temp*NLREPCOST/NLREPRO_ORC); curntn->repro += temp; } } } break; case 8: if(curntn->race == ORC ) { printf("orcs cant add to movement\n"); break; } printf("additional movement costs 1 per +%d sct/turn\n",NLMOVE); printf("you start with a rate of %d\n",curntn->maxmove); printf("you now have a rate of %d\n",curntn->maxmove+NLMOVE); putchar('\n'); if(points >= 1) { points -= 1; curntn->maxmove+=NLMOVE; } else printf("You dont have enough points left"); break; case 9: printf("doubling raw materials\n"); if((curntn->tfood<800000L) &&(points >=NLDBLCOST*curntn->tfood/NLHFOOD)) { points-=NLDBLCOST*curntn->tfood/NLHFOOD; curntn->tfood*=2; curntn->jewels*=2; curntn->metals*=2; } else printf("sorry\n"); break; case 10: printf("choosing basic magic at %d point cost\n",NLMAGIC); printf("log in and read the magic screen to be informed of your powers\n"); if(points >0) { points-=NLMAGIC; loop=0; while(loop==0) if((x=getmagic((rand()%M_MGK+M_MIL)))!=0){ CHGMGK; loop=1; } } else printf("sorry not enough points\n"); break; case 11: /* check if not more than 1/2 armies will be leaders */ if( numleaders + NLEADER > MAXARM/2 ) { printf("\tsorry... that would give you too many leaders\n"); break; } if( points >= NLEADPT ) { printf("\tadding %d leaders for %d points\n",NLEADER,NLEADPT); numleaders += NLEADER; points -= NLEADPT; } else printf("sorry not enough points\n"); break; default: printf("invalid option - hit return"); scanf("%*s"); } else scanf("%*s"); } check(); printnat(); printf("\nhit 'y' if OK?"); getchar(); if(getchar()!='y'){ curntn->active=INACTIVE; getchar(); curntn->powers=0; printf("\n OK, nation deleted\n"); printf("\nhit return to add another nation"); printf("\nhit any other key to continue?"); if(getchar()=='\n') more=TRUE; else more=FALSE; putchar('\n'); fclose(fexe); } else { place(-1,-1); getchar(); printf("\nNation is now added to world"); printf("\nhit return to add another nation"); printf("\nhit any other key to continue?"); if(getchar()=='\n') more=TRUE; else more=FALSE; putchar('\n'); att_setup(country); /* setup values ntn attributes */ fclose(fexe); sprintf(strin,"NOTICE: Nation %s added to world on turn %d\n",curntn->name,TURN); mailtopc(strin); /* cannot clear until after placement and initializing */ curntn->powers=0; } } att_base(); /* calculate base nation attributes */ writedata(); } void printnat() { int i; i=country; printf("about to print stats for nation %d\n\n",i); printf("name is .........%s\n",ntn[i].name); printf("leader is .......%s\n",ntn[i].leader); printf("total sctrs .....%d\n",ntn[i].tsctrs); printf("class is ........%s\n",*(Class+ntn[i].class)); printf("mark is .........%c\n",ntn[i].mark); printf("race is .........%c\n",ntn[i].race); printf("attack plus is ..+%d\n",ntn[i].aplus); printf("defence plus is .+%d\n",ntn[i].dplus); printf("gold talons......%ld\n",ntn[i].tgold); printf("maxmove is ......%d sctrs\n",ntn[i].maxmove); printf("jewels is .......%ld\n",ntn[i].jewels); printf("# military ......%ld\n",ntn[i].tmil); printf("# civilians .....%ld\n",ntn[i].tciv); printf("repro is ........%d percent\n",ntn[i].repro); printf("total metal .....%ld\n",ntn[i].metals); printf("total food ......%ld\n",ntn[i].tfood); printf("total ships .....%d\n",ntn[i].tships); printf("total leaders ...%d\n",numleaders); } /*****************************************************************/ /* PLACE(): put nation on the map. Fill out army structures too */ /*****************************************************************/ void place(xloc,yloc) int xloc,yloc; /* if not -1,-1 should place in this spot */ { int placed=0,armysize=100; short armynum=0; long people; int x,y,i,j,temp,t; int n=0, leadtype; long soldsleft; /* soldiers left to place */ if( xloc != -1 && yloc != -1 && is_habitable(xloc,yloc)) { placed=1; x = xloc; y = yloc; } switch(curntn->location) { case OOPS: while((placed == 0)&&(n++<2000)){ if(ispc(curntn->active)){ x = (rand()%(MAPX-8))+4; y = (rand()%(MAPY-8))+4; } else { x = (rand()%(MAPX-2))+1; y = (rand()%(MAPY-2))+1; } if(is_habitable(x,y)) placed=1; for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++) if(sct[i][j].owner!=0) placed=0; temp=0; for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++) if(sct[i][j].altitude==WATER) temp++; if(temp>=7) placed=0; } teraform( x,y,1,25 ); break; case RANDOM: while ((placed == 0)&&(n++<2000)){ if(ispc(curntn->active)){ if(MAPX>12){ x = rand()%(MAPX-12)+6; y = rand()%(MAPY-12)+6; } else { x = rand()%(MAPX-8)+4; y = rand()%(MAPY-8)+4; } if(is_habitable(x,y)) placed=1; /*important that no countries near*/ for(i=x-2;i<=x+2;i++) for(j=y-2;j<=y+2;j++) if((isntn(ntn[sct[i][j].owner].active)) &&(sct[i][j].owner!=0)) placed=0; } else { x = (rand()%(MAPX-6))+3; y = (rand()%(MAPY-6))+3; if(is_habitable(x,y)) placed=1; /*important that no countries near*/ for(i=x-2;i<=x+2;i++) for(j=y-2;j<=y+2;j++) if((isntn(ntn[sct[i][j].owner].active)) &&(sct[i][j].owner!=0)) placed=0; } temp=0; for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++) if(sct[i][j].altitude==WATER) temp++; if(temp>=7) placed=0; for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++) if(sct[i][j].owner!=0) placed=0; } teraform( x,y,1,40 ); break; case FAIR: while ((placed == 0)&&(n++<2000)) { if(ispc(curntn->active)){ if(MAPX>24) { x = rand()%(MAPX-24)+12; y = rand()%(MAPY-24)+12; } else { x = rand()%(MAPX-14)+7; y = rand()%(MAPY-14)+7; } } else { x = rand()%(MAPX-10)+5; y = rand()%(MAPY-10)+5; } if(!is_habitable(x,y)) continue; if(tofood( &sct[x][y],country)<DESFOOD) continue; placed=1; for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++) if(sct[i][j].owner!=0) placed=0; if(pwater>50) { temp=0; for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++) if(sct[i][j].altitude==WATER) temp++; if(temp>=7) placed=0; /*important that no countries near*/ for(i=x-3;i<=x+3;i++) for(j=y-3;j<=y+3;j++){ if((isntn(ntn[sct[i][j].owner].active)) &&(sct[i][j].owner!=0)) placed=0; } } else { temp=0; for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++) if(sct[i][j].altitude==WATER) temp++; if(temp>=5) placed=0; /*important that no countries near*/ for(i=x-3;i<=x+3;i++) for(j=y-3;j<=y+3;j++){ if((isntn(ntn[sct[i][j].owner].active)) &&(sct[i][j].owner!=0)) placed=0; } } } teraform( x,y,1,65 ); break; case GREAT: placed = 0; while ((placed == 0) && (n++<2000)){ if(ispc(curntn->active)){ if (MAPX>40){ x = rand()%(MAPX-40)+20; y = rand()%(MAPY-40)+20; }else{ x = rand()%(MAPX-18)+9; y = rand()%(MAPY-18)+9; } if(is_habitable(x,y)) placed=1; /*important that no countries near*/ for(i=x-4;i<=x+4;i++) for(j=y-4;j<=y+4;j++){ if((isntn(ntn[sct[i][j].owner].active)) &&( sct[i][j].owner!=0)) placed=0; } } else { if(MAPX>24){ x = rand()%(MAPX-24)+12; y = rand()%(MAPY-24)+12; }else { x = rand()%(MAPX-12)+6; y = rand()%(MAPY-12)+6; } if(is_habitable(x,y)) placed=1; /*important that no countries near*/ for(i=x-2;i<=x+2;i++) for(j=y-2;j<=y+2;j++){ if((isntn(ntn[sct[i][j].owner].active)) &&(sct[i][j].owner!=0)) placed=0; } } for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++) if(sct[i][j].owner!=0) placed=0; temp=0; /*if any water within 2 sectors placed = 0*/ for(i=x-2;i<=x+2;i++) for(j=y-2;j<=y+2;j++) if(tofood( &sct[x][y],country)<=0) temp++; if( pwater>50 ) { if(temp>=18) placed=0; } else { if(temp>=15) placed=0; } } teraform( x,y,1,100 ); } /*done with one try*/ if(placed==1) { curntn->capx = x; curntn->capy = y; sct[x][y].designation=DCAPITOL; sct[x][y].tradegood=rand()%(END_KNOWLEDGE-END_SPOILRATE)+END_SPOILRATE+1; sct[x][y].jewels=0; sct[x][y].metal=0; sct[x][y].owner=country; sct[x][y].people=curntn->tciv; sct[x][y].fortress=5; /* put all military into armies of armysize */ armysize = (TAKESECTOR*12)/10; if(armysize<100) armysize=100; /* cant have more than 50% leaders */ if( MAXARM < numleaders * 2 ) numleaders = MAXARM / 2; armynum=0; soldsleft = curntn->tmil; P_ASOLD = curntn->tmil/MILINCAP; soldsleft-=P_ASOLD; P_ATYPE=defaultunit(country); P_ASTAT=GARRISON; P_AMOVE=0; P_AXLOC=curntn->capx; P_AYLOC=curntn->capy; armynum++; armysize = max( armysize, soldsleft / (MAXARM-numleaders-1)); /* give you your leaders */ leadtype = getleader(curntn->class); P_ATYPE = leadtype-1; /* This is the national leader */ P_ASOLD = *(unitminsth+((leadtype-1)%UTYPE)); P_AXLOC = curntn->capx; P_AYLOC = curntn->capy; P_ASTAT = DEFEND; P_AMOVE = 2*curntn->maxmove; armynum++; numleaders--; while ((armynum < MAXARM)&&(numleaders>0)) { P_ATYPE=leadtype; P_ASOLD= *(unitminsth+(leadtype%UTYPE)); P_AXLOC=curntn->capx; P_AYLOC=curntn->capy; P_ASTAT=DEFEND; P_AMOVE=2*curntn->maxmove; armynum++; numleaders--; } /* give you the rest of your armies */ while((armynum < MAXARM)&&(soldsleft >0)) { P_ATYPE=defaultunit(country); if(soldsleft >= armysize){ P_ASOLD=armysize; soldsleft -=armysize; } else { P_ASOLD=soldsleft ; soldsleft=0; } P_AXLOC=curntn->capx; P_AYLOC=curntn->capy; P_ASTAT=DEFEND; P_AMOVE=curntn->maxmove; armynum++; } if(soldsleft >0) { curntn->arm[0].sold += soldsleft; curntn->arm[0].unittyp = A_INFANTRY; } /* give you some terain to start with: pc nations get more*/ if ((isnotpc(curntn->active))&&(curntn->location==GREAT)) t=1; else if (isnotpc(curntn->active)) t=1; else if (curntn->location==OOPS) t=0; else if (curntn->location==RANDOM) t=0; else if (curntn->location==FAIR) t=1; else if (curntn->location==GREAT) t=2; else printf("error"); if( t==1 ) people = sct[x][y].people / 12; else if( t==2 ) people = sct[x][y].people / 18; curntn->tsctrs=1; for(i=x-t;i<=x+t;i++) for(j=y-t;j<=y+t;j++) if((tofood( &sct[i][j],country)>=DESFOOD) &&(sct[i][j].owner==0) &&(is_habitable(i,j)==TRUE) &&(sct[i][j].people==0)) { curntn->tsctrs++; sct[i][j].owner=country; sct[i][j].designation=DFARM; sct[i][j].people=people; sct[x][y].people-=people; } } else { if(curntn->location==OOPS) printf("ERROR\n"); else if(curntn->location==RANDOM) { printf("RANDOM PLACE FAILED, TRYING TO PLACE AGAIN\n"); curntn->location=OOPS; place(-1,-1); } else if(curntn->location==FAIR) { printf("FAIR PLACE FAILED, TRYING AGAIN - adding %d people to nation\n",NLPOP); /*give back one point -> NLPOP people*/ curntn->tciv+=NLPOP; curntn->location=RANDOM; place(-1,-1); } else if(curntn->location==GREAT) { printf("GOOD PLACE FAILED, TRYING AGAIN - adding %d people to nation\n",NLPOP); /*give back one point -> NLPOP people*/ curntn->tciv+=NLPOP; curntn->location=FAIR; place(-1,-1); } } } /*get class routine*/ /* return the number of points needed */ int getclass(race) { short chk=FALSE; short tmp; while(chk==FALSE){ printf("what type of nation would you like to be\n"); if(race!=ORC){ printf("1. king (Humans, Dwarves, and Elves)\n"); printf("2. emperor (Humans, Dwarves, and Elves)\n"); } if((race!=ORC)&&(race!=DWARF)){ printf("3. wizard (Humans and Elves)..................Cost = %d Points\n",2*NLMAGIC); printf("\tWizards have WYZARD and SUMMON powers. \n"); } if(race==HUMAN){ printf("4. theocracy (Humans Only).......................Cost = %d Points\n",NLMAGIC); printf("\tTheocracies have RELIGION power. \n"); } if((race==HUMAN)||(race==ORC)||(race==DWARF)){ printf("5. pirate (No Elves)..........................Cost = %d Points\n",NLMAGIC); printf("\tPirates have SAILOR power\n"); } if((race==ELF)||(race==HUMAN)){ printf("6. trader (Humans & Elves Only)...............Cost = %d Points\n",NLMAGIC); printf("\tTraders have URBAN power\n"); } if(race==HUMAN) { printf("7. warlord (No Elves)..........................Cost = %d Point\n",((int)(2*NLMAGIC*8/10))); printf("\tHuman Warlords get CAPTAIN, and WARLORD powers\n"); } else if((race==ORC)||(race==DWARF)) { printf("7. warlord (No Elves)..........................Cost = %d Points\n",((int)(3*NLMAGIC*8/10))); printf("\tWarlords get WARRIOR, CAPTAIN, and WARLORD powers\n"); } if( race==ORC) { printf("8. demon (Orcs Only).........................Cost = %d Points\n",4*NLMAGIC/3); printf("\tDemons have DESTROYER power\n"); printf("9. dragon (Orcs Only).........................Cost = %d Points\n",((int)(3*NLMAGIC*7/10))); printf("\tDragons have MINOR, AVERAGE, and MAJOR MONSTER powers\n"); printf("10. shadow (Orcs Only)........................Cost = %d Points\n",NLMAGIC); printf("\tShadows have VOID power\n"); } printf("\tinput:"); scanf("%hd",&tmp); if((tmp>C_NPC)&&(tmp<=C_END)) { if((race==HUMAN)&&((tmp<=C_WARLORD))) chk=TRUE; else if((race==DWARF)&&((tmp<C_WIZARD)||(tmp==C_PIRATE)||(tmp==C_WARLORD))) chk=TRUE; else if((race==ELF)&&((tmp==C_TRADER)||(tmp<=C_WIZARD))) chk=TRUE; else if((race==ORC)&&((tmp==C_PIRATE)||(tmp>=C_WARLORD))) chk=TRUE; else printf("bad input \n\n\n"); } else { printf("\tinvalid input\n\n\n"); getchar(); } } curntn->class=tmp; return( doclass( tmp, TRUE ) ); } int doclass( tmp, isupd ) short tmp; int isupd; /* true if update, false if interactive */ { short i; long x; /* determine number of leaders you want */ if((tmp == C_TRADER) || (tmp <= C_WIZARD)) numleaders = 5; else numleaders = 7; switch(tmp){ case C_WIZARD: curntn->powers |= SUMMON; x=SUMMON; if( isupd ) CHGMGK; curntn->powers |= WYZARD; x=WYZARD; if( isupd ) CHGMGK; return(2*NLMAGIC); case C_PRIEST: curntn->powers|=RELIGION; x=RELIGION; if( isupd ) CHGMGK; return(NLMAGIC); case C_PIRATE: curntn->powers|=SAILOR; x=SAILOR; if( isupd ) CHGMGK; return(NLMAGIC); case C_TRADER: curntn->powers|=URBAN; x=URBAN; if( isupd ) CHGMGK; return(NLMAGIC); case C_WARLORD: i=0; if(magic(country,WARRIOR)!=TRUE){ curntn->powers|=WARRIOR; x=WARRIOR; if( isupd ) CHGMGK; i++; } if(magic(country,CAPTAIN)!=TRUE){ curntn->powers|=CAPTAIN; x=CAPTAIN; if( isupd ) CHGMGK; i++; } if(magic(country,WARLORD)!=TRUE){ curntn->powers|=WARLORD; x=WARLORD; if( isupd ) CHGMGK; i++; } return((int)(i*NLMAGIC*8/10)); /* 20% discount applied */ case C_DEMON: curntn->powers|=DESTROYER; x=DESTROYER; if( isupd ) CHGMGK; return((int)(4*NLMAGIC/3)); case C_DRAGON: curntn->powers|=MI_MONST; x=MI_MONST; if( isupd ) CHGMGK; curntn->powers|=AV_MONST; x=AV_MONST; if( isupd ) CHGMGK; curntn->powers|=MA_MONST; x=MA_MONST; if( isupd ) CHGMGK; return((int)(3*NLMAGIC*7/10)); /* 30% discount applied */ case C_SHADOW: curntn->powers|=THE_VOID; x=THE_VOID; if( isupd ) CHGMGK; return(NLMAGIC); default: return(0); } } int startcost() /* cant be used for npc nations yet!!! see below */ { float points; /* points */ points = ((float)curntn->tciv)/NLPOP; points += ((float)curntn->tgold)/NLGOLD; points += ((float)curntn->tmil)/NLSOLD; if(curntn->race==ORC) { points += ((float)curntn->repro)*NLREPCOST/(NLREPRO_ORC); points += ((float)curntn->aplus*2)/NLATTACK; points += ((float)curntn->dplus*2)/NLDEFENCE; } else { points += ((float)curntn->aplus)/NLATTACK; points += ((float)curntn->dplus)/NLDEFENCE; points += ((float)curntn->repro)*NLREPCOST/NLREPRO; } points += ((float)curntn->maxmove)/NLMOVE; if(curntn->location==FAIR) points += NLLOCCOST; else if(curntn->location==GREAT) points += 2*NLLOCCOST; /* points+=NLDBLCOST*curntn->tfood/NLHFOOD; */ points -= (TURN-1) / LATESTART; /* extra points if you start late */ if( TURN > 1 ) printf("point cost for nation %d is %.2f (bonus for latestart is %f)\n",country,points,(float) (TURN-1)/LATESTART); points += 1.0; /* round up */ return((int) points); }