billr@saab.CNA.TEK.COM (Bill Randle) (03/06/90)
Submitted-by: Adam Bryant <adb@cs.bu.edu> Posting-number: Volume 9, Issue 32 Archive-name: conquer4/Patch9 Patch-To: conquer4: Volume 6, Issue 83-96 [[Here is the latest and hopefully last patch to conquer version 4. [But, hey, didn't I say that with patch number 8?] Now, I hope I can finally get all my effort into version 5. Anyway, don't have to much time to say much about it, but in summary: - this patch enhances god powers and fixes a number of errors in god routines. - this patch takes care of a number of bug fixes, most especially the grouped troops bug. - this patch fixes a number of bugs with the trading code thanks to Charles C. Fu. - I believe that this is a much cleaner version than any of the proceeding ones... and the feel seems a bit better as well. Enjoy, adam]] #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of shell archive." # Contents: patches09 # Wrapped by billr@saab on Mon Mar 5 08:47:55 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'patches09' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'patches09'\" else echo shar: Extracting \"'patches09'\" \(62540 characters\) sed "s/^X//" >'patches09' <<'END_OF_FILE' X*** opatchlevel.h Sat Mar 3 15:27:42 1990 X--- patchlevel.h Sat Mar 3 15:27:52 1990 X*************** X*** 1 **** X! #define PATCHLEVEL 8 X--- 1 ---- X! #define PATCHLEVEL 9 X*** onotes.v4 Sat Mar 3 15:27:42 1990 X--- notes.v4 Sat Mar 3 15:27:52 1990 X*************** X*** 314,319 **** X--- 314,383 ---- X defend mode this way; even when they had marched too far). X 255. allow recombination of troops with same status and same type X unless the type is TRADED or ON_BOARD. X+ ===4.0 patch number eight released => 4.8 =============================== X+ 256. made sure that minor leaders lived before becoming major leaders. X+ 257. fixed major bug on not resetting status of moved grouped unit. X+ 258. set a grouped movement to be equal to the movement of the leader. X+ 259. added missing return to commands.c (1341) [Paul Waterman] X+ 260. made sure only to ask for splitting warships when warships are there. X+ 261. no longer ask to split ships that are not in fleet. X+ 262. allow god to manipulate a fleet up for trade. X+ 263. fixed bug that -1 population may accidently be set by god. X+ 264. fixed bug that caused missetting of gold/jewel value by god. X+ 265. allow god to manipulate an army that is up for trade. X+ 266. added check to assure that navies do not carry invalid troops. X+ 267. added check for onboard armies to be sure they were actually on fleets. X+ 268. reformated the bottom of the display on the read message display. X+ 269. made sure that stones had the designation of '?' to allow them to work. X+ 270. increased reduction on movement in desert for DERVISH to avoid confusion. X+ 271. made sure that blank input would not be taken on redesignate owner. X+ 272. fiddled and diddled (sorry Johnny!) with the charity change check. X+ 273. fixed bug with providing movement to unmovable when having ROADS power. X+ 274. added ifdef's around srand declarations for ANSI compilers. [C. Fu] X+ 275. removed error message for people relocation. too common an occurance. X+ 276. allow naval battles along shore. [Charles C. Fu] X+ 277. prevent sailors or marines from retreating. [Charles C. Fu] X+ 278. redid the retreat code... made the test much simpler. X+ 279. slight adjustment to ONMAP macro [Charles C. Fu] X+ 280. keep random value of army sizes the same for when seen. [Charles C. Fu] X+ 281. keep random value of ship sizes the same when seen. [Charles C. Fu] X+ 282. keep random value of people in sector the same. [Charles C. Fu] X+ 283. do not allow navies to pass into impassible land [partial fix: C. Fu] X+ 284. make it harder to unload armies in enemy cities [Charles C. Fu] X+ 285. make it harder to load armies in enemy cities [Charles C. Fu] X+ 286. fixed mistype "P_ASOLD" => "P_ATYPE" npc.c [Charles C. Fu] X+ 287. check for division by zero with metals cost for troops X+ 288. make NPC pay metal for troops. [Charles C. Fu] X+ 289. have NPC nations adjust tax rates as appropriate. [Charles C. Fu] X+ 290. give rebel nations a tax rate of 10. [Charles C. Fu] X+ 291. extend view of tradeing list for long screens [Charles C. Fu] X+ 292. refresh() added to end of trade input routine [Charles C. Fu] X+ 293. do not process invalid country is takeback [Charles C. Fu] X+ 294. cause trade to fail for destroyed army or fleet. [Charles C. Fu] X+ 295. fixed mistype which prevented sale of land. [Charles C. Fu] X+ {Darn!, My sabotage was caught! :-) adam} X+ 296. fixed missetting of curntn which blocked ship trades [Charles C. Fu] X+ {Foiled Again! :-) Actually that code predated curntn use, so X+ we were bound to miss some in the conversion, adam} X+ 297. fixed bug with returning bids to losing nations [Charles C. Fu] X+ 298. let land trades fail during trade, not before [Charles C. Fu] (whatever) X+ 299. convert to doubles for calculation of treasury overflow. [C. Fu] X+ 300. relocated adjustment to MARCHer movment when changing statuses. X+ 301. added in a routine to give the items up for trade to a nation if X+ it captures a nations capitol. [David Soleno] X+ 302. fixed error messages generated by the orc takeover routine. X+ 303. made the rules file be read in from the default directory. X+ 304. made spell point gain for MONST powers additive. X+ 305. put a 25% cap on user defined charity. X+ 306. adjusted the combat routine to separate naval and army combat checks. X+ 307. added in a check to assure that combining overlarge fleets is checked. X+ 308. verified input checks in various locations in report.c. X+ 309. made god adjustment of ships to allow keeping of previous values on '\n'. X+ 310. gave god the ability to adjust army unit types. X+ 311. gave god the ability to adjust army move values. X+ 312. gave god the ability to adjust navy move values. X+ 313. fixed bug in reporting side during newspaper for naval battles. X+ 314. gave god the ability to adjust an army status. X X ------------------------------------------------------------------------- X | 2.0 POSSIBLE SHORT-TERM ENHANCEMENTS/FIXES FOR CONQUER V5 | X*** oREADME Sat Mar 3 15:27:38 1990 X--- README Sat Mar 3 15:27:53 1990 X*************** X*** 94,99 **** X--- 94,106 ---- X unreferenced symbol errors occur, try adding "-ltermcap" after X the "-lcurses" line in the makefile. X X+ Note2: With some versions of 'make' the SHELL environment variable is X+ read to determine under what shell jobs should be spawned. The X+ Makefile for conquer was written with '/bin/sh' in mind, so if X+ any "command not found" errors appear, doing a: X+ setenv SHELL /bin/sh X+ before typing 'make', might alleviate the problem. X+ X ----------------------------------------------------------- X V administration instructions X ----------------------------------------------------------- X*************** X*** 109,115 **** X -a add new player X -x execute program X -d DIR to use play different game X- -p print a map X -r SCENARIO read map while making a new world X uses SCENARIO.ele, SCENARIO.veg, & SCENARIO.nat X X--- 116,121 ---- X*** odata.h Sat Mar 3 15:27:39 1990 X--- data.h Sat Mar 3 15:27:53 1990 X*************** X*** 581,587 **** X X /* magic macro: returns TRUE if the nation has that power*/ X #define magic(NATION,POWER) ((ntn[NATION].powers&(POWER))!=0) X! #define ONMAP(x,y) (x>=0 && y>=0 && x<MAPX && y<MAPY) X X #ifndef HILIGHT X #define standout() X--- 581,587 ---- X X /* magic macro: returns TRUE if the nation has that power*/ X #define magic(NATION,POWER) ((ntn[NATION].powers&(POWER))!=0) X! #define ONMAP(x,y) ((x)>=0 && (y)>=0 && (x)<MAPX && (y)<MAPY) X X #ifndef HILIGHT X #define standout() X*************** X*** 610,616 **** X #define check() checkout(__FILE__,__LINE__) X #endif DEBUG X X! #define GOLDTHRESH 10 /* min ratio of gold:jewels */ X X #define SALT "aa" /* seed for crypt() encryption */ X X--- 610,616 ---- X #define check() checkout(__FILE__,__LINE__) X #endif DEBUG X X! #define GOLDTHRESH 10L /* min ratio of gold:jewels */ X X #define SALT "aa" /* seed for crypt() encryption */ X X*** oadmin.c Sat Mar 3 15:27:39 1990 X--- admin.c Sat Mar 3 15:27:53 1990 X*************** X*** 53,59 **** X--- 53,61 ---- X int geteuid(), getuid(), setuid(), realuser, l; X register int i,j; X char *name; X+ #ifndef __STDC__ X void srand(); X+ #endif X int getopt(); X long time(); X /* mflag = make world, a=add player, x=execute, p=print */ X*** oextcmds.c Sat Mar 3 15:27:40 1990 X--- extcmds.c Sat Mar 3 15:27:54 1990 X*************** X*** 178,192 **** X errormsg("Uh, sir. Aren't we doing that already?"); X return; X } X- /* eliminate half starting movement if start out on march */ X- if( P_ASTAT==MARCH && new_stat!=MARCH ) { X- if(P_AMOVE<(curntn->maxmove * *(unitmove+(P_ATYPE%UTYPE)))/50){ X- errormsg("That troop has gone too far to stop marching"); X- return; X- } X- P_AMOVE-=(curntn->maxmove * *(unitmove+(P_ATYPE%UTYPE)))/50; X- AADJMOV; X- } X if(new_stat == SCOUT) { X if(( P_ATYPE != A_SCOUT )&&( P_ASOLD >= 25)) { X errormsg("Need less than 25 men to scout"); X--- 178,183 ---- X*************** X*** 232,237 **** X--- 223,238 ---- X errormsg("Sorry, but you can't rule in that sector"); X return; X } X+ } X+ X+ /* eliminate half starting movement if start out on march */ X+ if( P_ASTAT==MARCH && new_stat!=MARCH ) { X+ if(P_AMOVE<(curntn->maxmove * *(unitmove+(P_ATYPE%UTYPE)))/50){ X+ errormsg("That troop has gone too far to stop marching"); X+ return; X+ } X+ P_AMOVE-=(curntn->maxmove * *(unitmove+(P_ATYPE%UTYPE)))/50; X+ AADJMOV; X } X X /* location dependent statuses make armies stay in place */ X*** orandeven.c Sat Mar 3 15:27:43 1990 X--- randeven.c Sat Mar 3 15:27:54 1990 X*************** X*** 207,212 **** X--- 207,213 ---- X ntn[new].powers= ntn[target].powers; X ntn[new].tships= 0; X ntn[new].tsctrs = split; X+ ntn[new].tax_rate = 10; X X /* first check first letter of name */ X if( markok(toupper(ntn[new].name[0]),FALSE) ) X*** ocexecute.c Sat Mar 3 15:27:39 1990 X--- cexecute.c Sat Mar 3 15:27:55 1990 X*************** X*** 197,203 **** X back into your capitol */ X if((sct[x][y].owner!=country)&&(country!=0)) { X sct[curntn->capx][curntn->capy].people+=armynum; X- fprintf(stderr,"ERROR: <%s> told to put %d civilians in sector %d,%d not owned - placed in capitol\n",curntn->name,armynum,x,y); X break; X } X sct[x][y].people=armynum; X--- 197,202 ---- X*************** X*** 206,212 **** X /* if you dont own it, put people in your capitol */ X if((sct[x][y].owner!=country)&&(country!=0)) { X sct[curntn->capx][curntn->capy].people+=armynum; X- fprintf(stderr,"SACIV3: <%s> told to put %d civilians in sector %d,%d not owned - placed in capitol\n",curntn->name,armynum,x,y); X } X else X { X--- 205,210 ---- X*************** X*** 258,264 **** X case DESTRY: X sct[ntn[armynum].capx][ntn[armynum].capy].owner=savectry; X country=armynum; X! destroy(country); X country=savectry; X break; X case CHG_MGK: X--- 256,262 ---- X case DESTRY: X sct[ntn[armynum].capx][ntn[armynum].capy].owner=savectry; X country=armynum; X! if (isupdate) destroy(country); X country=savectry; X break; X case CHG_MGK: X*** oforms.c Sat Mar 3 15:27:40 1990 X--- forms.c Sat Mar 3 15:27:55 1990 X*************** X*** 579,595 **** X intval = get_number(); X if (intval < 0) { X break; X! } else if( intval > 100 ) X errormsg("ERROR - invalid charity rate"); X /* this will protect from both underflow and overflow */ X! else if((int)curntn->popularity + 2*(intval - (int)curntn->charity)>100) X! errormsg("ERROR - you may not increase charity that much"); X! else if((int)curntn->popularity + 2*(intval - (int)curntn->charity)<0) X! errormsg("ERROR - you may not decrease charity that much"); X! else { X! curntn->popularity += (unsigned char) 2*(intval - (int) curntn->charity); X! curntn->charity = intval; X! NADJNTN; X } X break; X case '5': /* terror */ X--- 579,607 ---- X intval = get_number(); X if (intval < 0) { X break; X! } else if( intval > 100 ) { X errormsg("ERROR - invalid charity rate"); X+ } else if (intval > 25) { X+ errormsg("You are kidding, right?"); X /* this will protect from both underflow and overflow */ X! } else if(intval > curntn->charity) { X! if (2 * (intval - (int)curntn->charity) + (int) curntn->popularity > 100) { X! errormsg("ERROR - you may not increase charity that much"); X! } else { X! curntn->popularity += (unsigned char) 2*(intval - (int) curntn->charity); X! curntn->charity = intval; X! NADJNTN; X! NADJNTN2; X! } X! } else { X! if (2 * (intval - (int)curntn->charity) < - (int) curntn->popularity) { X! errormsg("ERROR - you may not decrease charity that much"); X! } else { X! curntn->popularity += (unsigned char) 2*(intval - (int) curntn->charity); X! curntn->charity = intval; X! NADJNTN; X! NADJNTN2; X! } X } X break; X case '5': /* terror */ X*** omisc.c Sat Mar 3 15:27:41 1990 X--- misc.c Sat Mar 3 15:27:55 1990 X*************** X*** 886,891 **** X--- 886,894 ---- X /* advertise */ X fprintf(fnews,"1.\tCapitol of %s sacked by %s\n",ntn[cntry].name,ntn[nation].name); X X+ /* Remove goods from trade board */ X+ fixtrade(cntry); X+ X /* first give all prizes to the conquerer */ X if(curntn->tgold > 0) { /* all gold */ X ntn[nation].tgold += curntn->tgold; X*************** X*** 1088,1096 **** X } /* switch */ X } /* for */ X X! if((magic(cntry,DERVISH)==1) ||(magic(cntry,DESTROYER)==1)) { X! veg_cost[ ICE ] = 1; X! veg_cost[ DESERT ] = 1; X } X X for( j = 0; ele[j] != '0'; j++ ) { X--- 1091,1099 ---- X } /* switch */ X } /* for */ X X! if(magic(cntry,DERVISH) || magic(cntry,DESTROYER)) { X! veg_cost[ ICE ] = 0; X! veg_cost[ DESERT ] = 0; X } X X for( j = 0; ele[j] != '0'; j++ ) { X*** oreports.c Sat Mar 3 15:27:43 1990 X--- reports.c Sat Mar 3 15:27:55 1990 X*************** X*** 143,149 **** X continue; X } X #ifdef TRADE X! if(P_ASTAT==TRADED) { X errormsg("May not change traded army"); X continue; X } X--- 143,149 ---- X continue; X } X #ifdef TRADE X! if(isgod==FALSE && P_ASTAT==TRADED) { X errormsg("May not change traded army"); X continue; X } X*************** X*** 154,160 **** X ypos++; X clrtoeol(); X #ifdef OGOD X! if(isgod==TRUE) mvaddstr(ypos++,0,"GOD OPTIONS: 6) LOCATION 7) SOLDIERS"); X clrtoeol(); X #endif OGOD X ypos++; X--- 154,160 ---- X ypos++; X clrtoeol(); X #ifdef OGOD X! if(isgod==TRUE) mvaddstr(ypos++,0,"GOD OPTIONS: 6) LOCATION 7) SOLDIERS 8) MOVE 9) UNITTYPE 0) STATUS "); X clrtoeol(); X #endif OGOD X ypos++; X*************** X*** 272,283 **** X mvaddstr(ypos++,0,"What is the New Total Soldiers: "); X refresh(); X men = get_number(); X! if (men>0) { X P_ASOLD=men; X AADJMEN; X } X } X break; X #endif OGOD X default: X errormsg("Invalid Input"); X--- 272,328 ---- X mvaddstr(ypos++,0,"What is the New Total Soldiers: "); X refresh(); X men = get_number(); X! if (men>=0) { X P_ASOLD=men; X AADJMEN; X } X } X break; X+ case '8': X+ if (isgod == TRUE) { X+ mvaddstr(ypos, 0, "What is the new movement value?"); X+ refresh(); X+ men = get_number(); X+ X+ if (men >=0 && men <= 100) { X+ P_AMOVE = men; X+ } X+ } X+ break; X+ case '9': X+ if (isgod == TRUE) { X+ mvaddstr(ypos++, 0, "Change unit type; Normal 0-26, Leader 27-44, Monster 45-59"); X+ mvaddstr(ypos++, 0, "[MajorHackEH?] New Type is? "); X+ refresh(); X+ men = get_number(); X+ X+ if (men < 0 || men > MAXMONSTER) break; X+ if (men > 44) men += TWOUTYPE; X+ else if (men > NOUNITTYPES) men += UTYPE; X+ X+ P_ATYPE = men; X+ } X+ break; X+ case '0': X+ if (isgod == TRUE) { X+ mvprintw(ypos++, 0, "1) Mar 2) Sct 3) Garr 4) Trade 5) Mil 6) Fly 7) Def 8) MDef 9) Att 10) MAtt"); X+ mvprintw(ypos++, 0, "11) Genrl 12) Sort 13) Sieg 14) Sgd 15) Onb 16) Rule 17+) Group (leader-=17)"); X+ mvaddstr(ypos++, 0, "Set what status? "); X+ refresh(); X+ men = get_number(); X+ X+ if (men < 0 || men > NUMSTATUS+MAXARM) X+ break; X+ if (men >= NUMSTATUS) { X+ i = curntn->arm[men-NUMSTATUS].unittyp; X+ if (i < MINLEADER || i >= MINMONSTER) { X+ errormsg("There is no such leader to group under"); X+ break; X+ } X+ } X+ P_ASTAT = men; X+ } X+ break; X #endif OGOD X default: X errormsg("Invalid Input"); X*************** X*** 585,593 **** X clrtoeol(); X refresh(); X nvynum = get_number(); X! if(nvynum<0) break; X #ifdef TRADE X! if (curntn->nvy[nvynum].commodity==TRADED) { X errormsg("Sorry - That Navy is up for trade"); X continue; X } X--- 630,638 ---- X clrtoeol(); X refresh(); X nvynum = get_number(); X! if(nvynum<0) continue; X #ifdef TRADE X! if (isgod == FALSE && curntn->nvy[nvynum].commodity==TRADED) { X errormsg("Sorry - That Navy is up for trade"); X continue; X } X*************** X*** 599,605 **** X mvaddstr(ypos++,0,"OPTIONS: 1) TRANSFER / MERGE, 2) SPLIT NAVY, 3) DISBAND NAVY"); X clrtoeol(); X #ifdef OGOD X! if(isgod==TRUE) mvaddstr(ypos++,0,"GOD OPTIONS: 4) ADJUST SHIPS, 5) LOCATION, 6) CREW"); X ypos++; X clrtoeol(); X #endif OGOD X--- 644,650 ---- X mvaddstr(ypos++,0,"OPTIONS: 1) TRANSFER / MERGE, 2) SPLIT NAVY, 3) DISBAND NAVY"); X clrtoeol(); X #ifdef OGOD X! if(isgod==TRUE) mvaddstr(ypos++,0,"GOD OPTIONS: 4) ADJUST SHIPS, 5) LOCATION, 6) CREW 7) MOVE"); X ypos++; X clrtoeol(); X #endif OGOD X*************** X*** 630,635 **** X--- 675,699 ---- X errormsg("Sorry -- One of the two Armies must be unloaded"); X } X else if((newx==P_NXLOC)&&(newy==P_NYLOC)) { X+ /* first check sizes */ X+ for(i=N_LIGHT;i<=N_HEAVY;i++) { X+ if (P_NGAL(i) + SHIPS(curntn->nvy[newnavy].galleys,i) > N_MASK) { X+ i = (-1); X+ break; X+ } X+ if (P_NMER(i) + SHIPS(curntn->nvy[newnavy].merchant,i) > N_MASK) { X+ i = (-1); X+ break; X+ } X+ if (P_NWAR(i) + SHIPS(curntn->nvy[newnavy].warships,i) > N_MASK) { X+ i = (-1); X+ break; X+ } X+ } X+ if (i == (-1)) { X+ errormsg("That would cause you to have too many ships of one type"); X+ break; X+ } X crew = flthold(nvynum)*P_NCREW; X people = fltmhold(nvynum)*P_NPEOP; X crew += flthold(newnavy)*curntn->nvy[newnavy].crew; X*************** X*** 691,699 **** X curntn->nvy[navy].people=P_NPEOP; X curntn->nvy[navy].smove=P_NMOVE; X X mvaddstr(LINES-2,0,"Do you wish to separate warships from remainder of fleet?"); X refresh(); X! if(getch()=='y') { X curntn->nvy[navy].warships=P_NWSHP; X P_NWSHP=0; X NADJWAR; X--- 755,764 ---- X curntn->nvy[navy].people=P_NPEOP; X curntn->nvy[navy].smove=P_NMOVE; X X+ if (P_NWSHP != 0) X mvaddstr(LINES-2,0,"Do you wish to separate warships from remainder of fleet?"); X refresh(); X! if(P_NWSHP!=0 && getch()=='y') { X curntn->nvy[navy].warships=P_NWSHP; X P_NWSHP=0; X NADJWAR; X*************** X*** 715,720 **** X--- 780,786 ---- X break; X } X for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) { X+ if (P_NWAR(shipsize) == 0) continue; X mvprintw(ypos,0,"How Many %s Warships To Split?",fltstr[shipsize]); X clrtoeol(); X refresh(); X*************** X*** 724,729 **** X--- 790,796 ---- X (void) addwships(navy,shipsize,newnavy); X } X for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) { X+ if (P_NMER(shipsize) == 0) continue; X mvprintw(ypos,0,"How Many %s Merchants To Split?",fltstr[shipsize]); X clrtoeol(); X refresh(); X*************** X*** 733,738 **** X--- 800,806 ---- X (void) addmships(navy,shipsize,newnavy); X } X for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) { X+ if (P_NGAL(shipsize) == 0) continue; X mvprintw(ypos,0,"How Many %s Galleys To Split?",fltstr[shipsize]); X clrtoeol(); X refresh(); X*************** X*** 791,822 **** X case '4': X if (isgod==TRUE) { X /* ADJUST SHIPS */ X- P_NWSHP=0; X- P_NMSHP=0; X- P_NGSHP=0; X for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) { X! mvprintw(ypos,0,"How Many %s Warships?",fltstr[shipsize]); X clrtoeol(); X refresh(); X newnavy = get_number(); X! if(newnavy>N_MASK||newnavy<0) newnavy=0; X! (void) NADD_WAR(newnavy); X } X for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) { X! mvprintw(ypos,0,"How Many %s Merchants?",fltstr[shipsize]); X clrtoeol(); X refresh(); X newnavy = get_number(); X! if(newnavy>N_MASK||newnavy<0) newnavy=0; X! (void) NADD_MER(newnavy); X } X for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) { X! mvprintw(ypos,0,"How Many %s Galleys?",fltstr[shipsize]); X clrtoeol(); X refresh(); X newnavy = get_number(); X! if(newnavy>N_MASK||newnavy<0) newnavy=0; X! (void) NADD_GAL(newnavy); X } X NADJWAR; X NADJMER; X--- 859,908 ---- X case '4': X if (isgod==TRUE) { X /* ADJUST SHIPS */ X for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) { X! mvprintw(ypos,0,"How Many %s Warships? [%d] ", X! fltstr[shipsize],P_NWAR(shipsize)); X clrtoeol(); X refresh(); X newnavy = get_number(); X! if (newnavy < 0 || newnavy > N_MASK) continue; X! newnavy -= P_NWAR(shipsize); X! if (newnavy > 0) { X! (void) NADD_WAR(newnavy); X! } else if (newnavy < 0) { X! newnavy = -newnavy; X! (void) NSUB_WAR(newnavy); X! } X } X for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) { X! mvprintw(ypos,0,"How Many %s Merchants? [%d] ", X! fltstr[shipsize], P_NMER(shipsize)); X clrtoeol(); X refresh(); X newnavy = get_number(); X! if(newnavy>N_MASK||newnavy<0) continue; X! newnavy -= P_NMER(shipsize); X! if (newnavy > 0) { X! (void) NADD_MER(newnavy); X! } else if (newnavy < 0) { X! newnavy = -newnavy; X! (void) NSUB_MER(newnavy); X! } X } X for(shipsize=N_LIGHT;shipsize<=N_HEAVY;shipsize++) { X! mvprintw(ypos,0,"How Many %s Galleys? [%d]", X! fltstr[shipsize], P_NGAL(shipsize)); X clrtoeol(); X refresh(); X newnavy = get_number(); X! if(newnavy>N_MASK||newnavy<0) continue; X! newnavy -= P_NGAL(shipsize); X! if (newnavy > 0) { X! (void) NADD_GAL(newnavy); X! } else if (newnavy < 0) { X! newnavy = -newnavy; X! (void) NSUB_GAL(newnavy); X! } X } X NADJWAR; X NADJMER; X*************** X*** 850,855 **** X--- 936,951 ---- X if (crew>=0 && crew<=SHIPCREW) { X P_NCREW = crew; X NADJCRW; X+ } X+ } X+ break; X+ case '7': X+ if (isgod == TRUE) { X+ mvaddstr(ypos, 0, "Set what move value? "); X+ refresh(); X+ newnavy = get_number(); X+ if (newnavy <= 100 && newnavy >= 0) { X+ P_NMOVE = newnavy; X } X } X break; X*** ocombat.c Sat Mar 3 15:27:39 1990 X--- combat.c Sat Mar 3 15:27:56 1990 X*************** X*** 37,42 **** X--- 37,47 ---- X int dnation; /*one nation defending in this fight*/ X int count=0; /*number of armies or navies in sector*/ X X+ /* indicators of naval or army combat */ X+ #define COMBAT_X 0 X+ #define COMBAT_A 1 X+ #define COMBAT_N 2 X+ X /************************************************************************/ X /* COMBAT() run all combat on the map */ X /* for each sector, determine if armies in with attack mode */ X*************** X*** 45,51 **** X combat() X { X register int i,j; X! char **fought; /* TRUE if already fought in sctr */ X int temp,ctry; X int initialized=FALSE; /* TRUE if arrays initialized */ X short armynum,nvynum; X--- 50,56 ---- X combat() X { X register int i,j; X! char **fought; /* SET: if already fought in sctr */ X int temp,ctry; X int initialized=FALSE; /* TRUE if arrays initialized */ X short armynum,nvynum; X*************** X*** 60,66 **** X /*for each nation, if in attack mode run a check*/ X X /* no sectors have been fought in yet */ X! for(i=0;i<MAPX;i++) for(j=0;j<MAPY;j++) fought[i][j]=FALSE; X X for(ctry=NTOTAL-1;ctry>0;ctry--) if(isactive(ntn[ctry].active)) { X X--- 65,71 ---- X /*for each nation, if in attack mode run a check*/ X X /* no sectors have been fought in yet */ X! for(i=0;i<MAPX;i++) for(j=0;j<MAPY;j++) fought[i][j]=COMBAT_X; X X for(ctry=NTOTAL-1;ctry>0;ctry--) if(isactive(ntn[ctry].active)) { X X*************** X*** 72,83 **** X if((aptr->sold>0) X &&(aptr->stat>=ATTACK) X &&(aptr->stat<=SORTIE||aptr->stat>=NUMSTATUS) X! &&(!fought[aptr->xloc][aptr->yloc])){ X X /* someone can initiate combat in xspot,yspot */ X xspot=aptr->xloc; X yspot=aptr->yloc; X! fought[xspot][yspot]=TRUE; X X /*initialize matrix*/ X if( !initialized ) { X--- 77,88 ---- X if((aptr->sold>0) X &&(aptr->stat>=ATTACK) X &&(aptr->stat<=SORTIE||aptr->stat>=NUMSTATUS) X! &&(!(fought[aptr->xloc][aptr->yloc]&COMBAT_A))){ X X /* someone can initiate combat in xspot,yspot */ X xspot=aptr->xloc; X yspot=aptr->yloc; X! fought[xspot][yspot]|=COMBAT_A; X X /*initialize matrix*/ X if( !initialized ) { X*************** X*** 131,142 **** X /*navy combat*/ X for(j=0;j<MAXNAVY;j++) X if((nptr->nvy[j].warships!=0) X! &&(fought[nptr->nvy[j].xloc][nptr->nvy[j].yloc]==0) X! &&(sct[nptr->nvy[j].xloc][nptr->nvy[j].yloc].altitude==WATER)){ X X xspot=nptr->nvy[j].xloc; X yspot=nptr->nvy[j].yloc; X! fought[xspot][yspot]=1; X X /*initialize matrix*/ X if( !initialized ){ X--- 136,146 ---- X /*navy combat*/ X for(j=0;j<MAXNAVY;j++) X if((nptr->nvy[j].warships!=0) X! &&(!(fought[nptr->nvy[j].xloc][nptr->nvy[j].yloc]&COMBAT_N))) { X X xspot=nptr->nvy[j].xloc; X yspot=nptr->nvy[j].yloc; X! fought[xspot][yspot]|=COMBAT_N; X X /*initialize matrix*/ X if( !initialized ){ X*************** X*** 156,166 **** X if(isactive(ntn[country].active)) X for(nvynum=0;nvynum<MAXNAVY;nvynum++) X if((NWSHP+NMSHP+NGSHP!=0) X! &&(abs(NXLOC-xspot)<=2) X! &&(abs(NYLOC-yspot)<=2) X! &&(sct[NXLOC][NYLOC].altitude==WATER) X &&(count<MGKNUM)) { X! fought[NXLOC][NYLOC]=1; X if((country!=ctry) X &&(nptr->dstatus[country]>HOSTILE)){ X valid=TRUE; X--- 160,171 ---- X if(isactive(ntn[country].active)) X for(nvynum=0;nvynum<MAXNAVY;nvynum++) X if((NWSHP+NMSHP+NGSHP!=0) X! &&(((NXLOC==xspot) && (NYLOC==yspot)) || X! (sct[NXLOC][NYLOC].altitude==WATER X! &&(abs(NXLOC-xspot)<=2) X! &&(abs(NYLOC-yspot)<=2))) X &&(count<MGKNUM)) { X! fought[NXLOC][NYLOC]|=COMBAT_N; X if((country!=ctry) X &&(nptr->dstatus[country]>HOSTILE)){ X valid=TRUE; X*************** X*** 804,817 **** X X for(cnum=0;cnum<count;cnum++) if(owner[cnum]>(-1)){ X if( unitnum != (-1) ) cnum=unitnum; X! if((side[cnum]==ATKR)&&(retreatside==ATKR)){ X! ntn[owner[cnum]].arm[unit[cnum]].xloc = retreatx; X! ntn[owner[cnum]].arm[unit[cnum]].yloc = retreaty; X } X- else if((side[cnum]==DFND)&&(retreatside==DFND)){ X- ntn[owner[cnum]].arm[unit[cnum]].xloc = retreatx; X- ntn[owner[cnum]].arm[unit[cnum]].yloc = retreaty; X- } X if( unitnum != (-1) ) return; X } X } X--- 809,824 ---- X X for(cnum=0;cnum<count;cnum++) if(owner[cnum]>(-1)){ X if( unitnum != (-1) ) cnum=unitnum; X! if(side[cnum] == retreatside){ X! if ((ntn[owner[cnum]].arm[unit[cnum]].unittyp==A_MARINES)|| X! (ntn[owner[cnum]].arm[unit[cnum]].unittyp==A_SAILOR)){ X! ntn[owner[cnum]].arm[unit[cnum]].sold *= 85; X! ntn[owner[cnum]].arm[unit[cnum]].sold /= 100; X! } else { X! ntn[owner[cnum]].arm[unit[cnum]].xloc = retreatx; X! ntn[owner[cnum]].arm[unit[cnum]].yloc = retreaty; X! } X } X if( unitnum != (-1) ) return; X } X } X*************** X*** 868,875 **** X * galley crew 2 X * merchant crew 4 X * soldiers onboard: X! * SAILOR/ARCHER 3/4 X! * MARINE 1/3 X * others 4/3 X */ X for(j=0;j<count;j++) if(owner[j]!=(-1)){ X--- 875,882 ---- X * galley crew 2 X * merchant crew 4 X * soldiers onboard: X! * SAILOR/ARCHER 3/4 X! * MARINE 1/3 X * others 4/3 X */ X for(j=0;j<count;j++) if(owner[j]!=(-1)){ X*************** X*** 959,967 **** X /* calculate capture percentages */ X /* X * This formula produces: X! * 0% capture for 1:100 odds X * 2% capture for 1:10 odds X! * 15% capture for 1:1 odds X * 60% capture for 10:1 odds X * 100% capture for >60:1 odds X * with linear progression between each. X--- 966,974 ---- X /* calculate capture percentages */ X /* X * This formula produces: X! * 0% capture for 1:100 odds X * 2% capture for 1:10 odds X! * 15% capture for 1:1 odds X * 60% capture for 10:1 odds X * 100% capture for >60:1 odds X * with linear progression between each. X*************** X*** 1240,1249 **** X k=0; X for(i=0;i<j;i++) if(owner[j]==owner[i]) k=1; X if(k==0) { X! if(side[i]==DFND) X fprintf(fnews,", attacker %s",ntn[owner[j]].name); X! else if(side[i]==ATKR) X fprintf(fnews,", defender %s",ntn[owner[j]].name); X } X } X fprintf(fnews,"\n"); X--- 1247,1257 ---- X k=0; X for(i=0;i<j;i++) if(owner[j]==owner[i]) k=1; X if(k==0) { X! if(side[j]==ATKR) X fprintf(fnews,", attacker %s",ntn[owner[j]].name); X! else if(side[j]==DFND) X fprintf(fnews,", defender %s",ntn[owner[j]].name); X+ else fprintf(fnews,", neutral %s",ntn[owner[j]].name); X } X } X fprintf(fnews,"\n"); X*** omove.c Sat Mar 3 15:27:41 1990 X--- move.c Sat Mar 3 15:27:56 1990 X*************** X*** 63,68 **** X--- 63,72 ---- X } else { /*army*/ X mvprintw(LINES-4,0,"ARMY %d: ",armynum); X clrtoeol(); X+ if (P_ASTAT>=NUMSTATUS) { X+ groupmen = P_ASTAT - NUMSTATUS; X+ P_AMOVE = curntn->arm[groupmen].smove; X+ } X if(P_AMOVE==0){ X errormsg("That Unit is Not Able to Move"); X redraw=DONE; X*************** X*** 74,81 **** X if(P_ASTAT>=NUMSTATUS) { X mvprintw(LINES-4,10,"Member of Army Group %d!! Continue? ",P_ASTAT-NUMSTATUS); X refresh(); X! if( getch() == 'y' ) P_ASTAT=ATTACK; X! else { X redraw=DONE; X armornvy=AORN; X return; X--- 78,87 ---- X if(P_ASTAT>=NUMSTATUS) { X mvprintw(LINES-4,10,"Member of Army Group %d!! Continue? ",P_ASTAT-NUMSTATUS); X refresh(); X! if( getch() == 'y' ) { X! P_ASTAT=ATTACK; X! AADJSTAT; X! } else { X redraw=DONE; X armornvy=AORN; X return; X*************** X*** 261,267 **** X valid=FALSE; X xcurs=oldxcurs; X ycurs=oldycurs; X! } else if(movecost[XREAL][YREAL] >= 0){ X /* LAND OF SOME TYPE */ X valid=FALSE; X /* check for nearby water */ X--- 267,274 ---- X valid=FALSE; X xcurs=oldxcurs; X ycurs=oldycurs; X! } else if(movecost[XREAL][YREAL] >= 0 X! || movecost[XREAL][YREAL] == -2){ X /* LAND OF SOME TYPE */ X valid=FALSE; X /* check for nearby water */ X*** oupdate.c Sat Mar 3 15:27:45 1990 X--- update.c Sat Mar 3 15:27:59 1990 X*************** X*** 27,32 **** X--- 27,42 ---- X int **attr; /* sector attractiveness */ X long **newpop; /* storage for old population */ X X+ long X+ dtol(d) double d; X+ { X+ char tempstr[BIGLTH]; X+ long l; X+ sprintf(tempstr,"%-60.0lf",d); X+ sscanf(tempstr,"%ld",&l); X+ return(l); X+ } X+ X /****************************************************************/ X /* UPDATE() - updates the whole world */ X /****************************************************************/ X*************** X*** 625,631 **** X if(rand()%100 < 30) { /* new leader takes over */ X x++; X for(armynum=0;armynum<MAXARM;armynum++) X! if(P_ATYPE == x) break; X if( armynum<MAXARM) { X P_ATYPE=x-1; X P_ASOLD= *(unitminsth+(x-1)%UTYPE); X--- 635,641 ---- X if(rand()%100 < 30) { /* new leader takes over */ X x++; X for(armynum=0;armynum<MAXARM;armynum++) X! if(P_ATYPE == x && P_ASOLD > 0) break; X if( armynum<MAXARM) { X P_ATYPE=x-1; X P_ASOLD= *(unitminsth+(x-1)%UTYPE); X*************** X*** 699,706 **** X ntn[country].spellpts+=3; X } X if(magic(country,MA_MONST)==TRUE) ntn[country].spellpts+=2; X! else if(magic(country,AV_MONST)==TRUE) ntn[country].spellpts+=1; X! else if((magic(country,MI_MONST)==TRUE) X &&( rand()%2==0)) ntn[country].spellpts+=1; X } X free(attr); X--- 709,716 ---- X ntn[country].spellpts+=3; X } X if(magic(country,MA_MONST)==TRUE) ntn[country].spellpts+=2; X! if(magic(country,AV_MONST)==TRUE) ntn[country].spellpts+=1; X! if((magic(country,MI_MONST)==TRUE) X &&( rand()%2==0)) ntn[country].spellpts+=1; X } X free(attr); X*************** X*** 1212,1221 **** X &&( A->stat<NUMSTATUS )) X A->stat=FLIGHT; X X! if((magic(country,ROADS)==1) X &&(sct[AX][AY].owner!=country)){ X if(A->smove>7) A->smove-=4; X! else A->smove=4; X } X X if((magic(country,SAPPER)==1) X--- 1222,1231 ---- X &&( A->stat<NUMSTATUS )) X A->stat=FLIGHT; X X! if((magic(country,ROADS)==TRUE) X &&(sct[AX][AY].owner!=country)){ X if(A->smove>7) A->smove-=4; X! else if (A->smove>4) A->smove=4; X } X X if((magic(country,SAPPER)==1) X*************** X*** 1411,1417 **** X tempflt = (float) curntn->tfood * (100-curntn->spoilrate); X curntn->tfood = (long) (tempflt / 100.0); X X! if(curntn->tgold > GOLDTHRESH*curntn->jewels){ X /* buy jewels off commodities board */ X xx=curntn->tgold-GOLDTHRESH*curntn->jewels; X if (ispc(curntn->active)) { X--- 1421,1427 ---- X tempflt = (float) curntn->tfood * (100-curntn->spoilrate); X curntn->tfood = (long) (tempflt / 100.0); X X! if((0.0+curntn->tgold) - GOLDTHRESH*(0.0+curntn->jewels) > 0.0){ X /* buy jewels off commodities board */ X xx=curntn->tgold-GOLDTHRESH*curntn->jewels; X if (ispc(curntn->active)) { X*************** X*** 1419,1429 **** X fprintf(fm,"Message from Conquer\n\n"); X fprintf(fm,"Gold imbalance forced your treasury to purchase\n"); X fprintf(fm,"%ld jewels for %ld gold talons to compensate.\n", X! xx/GODPRICE*GODJEWL,xx); X mailclose(country); X } X } X! curntn->jewels += (xx/GODPRICE*GODJEWL); X curntn->tgold -= xx; X } X X--- 1429,1440 ---- X fprintf(fm,"Message from Conquer\n\n"); X fprintf(fm,"Gold imbalance forced your treasury to purchase\n"); X fprintf(fm,"%ld jewels for %ld gold talons to compensate.\n", X! dtol((double)xx*GODJEWL/GODPRICE) X! ,xx); X mailclose(country); X } X } X! curntn->jewels += dtol((double)xx*GODJEWL/GODPRICE); X curntn->tgold -= xx; X } X X*** ocommands.c Sat Mar 3 15:27:39 1990 X--- commands.c Sat Mar 3 15:28:00 1990 X*************** X*** 189,195 **** X mvaddstr(LINES-3,7,"What nation owner:"); X refresh(); X x = get_country(); X! if (x<NTOTAL) sptr->owner=x; X reset_god(); X return; X case 'p': X--- 189,195 ---- X mvaddstr(LINES-3,7,"What nation owner:"); X refresh(); X x = get_country(); X! if (x>0 && x<NTOTAL) sptr->owner=x; X reset_god(); X return; X case 'p': X*************** X*** 200,206 **** X } X mvaddstr(LINES-3,7,"new population for sector: "); X refresh(); X! sptr->people = (long) get_number(); X reset_god(); X return; X case 't': X--- 200,208 ---- X } X mvaddstr(LINES-3,7,"new population for sector: "); X refresh(); X! metal = get_number(); X! if (metal <= (-1)) return; X! sptr->people = metal; X reset_god(); X return; X case 't': X*************** X*** 222,228 **** X mvaddstr(LINES-1,7,"new sector value: "); X refresh(); X x = get_number(); X! if(x<100 && x>=0) X if(y>END_MINE) { X sptr->jewels = (char)x; X sptr->metal = 0; X--- 224,230 ---- X mvaddstr(LINES-1,7,"new sector value: "); X refresh(); X x = get_number(); X! if(x<100 && x>0) { X if(y>END_MINE) { X sptr->jewels = (char)x; X sptr->metal = 0; X*************** X*** 230,235 **** X--- 232,241 ---- X sptr->metal = (char)x; X sptr->jewels = 0; X } X+ } else { X+ sptr->jewels = 0; X+ sptr->metal = 0; X+ } X } else { X sptr->jewels=0; X sptr->metal=0; X*************** X*** 1119,1126 **** X if(strncmp(line,"END",3)==0) contd=TRUE; X } X standout(); X! mvaddstr(LINES-3,(COLS/2)-22,"HIT ANY KEY TO CONTINUE"); X! mvaddstr(LINES-2,(COLS/2)-22,"HIT RETURN TO DELETE MESSAGE"); X standend(); X refresh(); X inpch=getch(); X--- 1125,1132 ---- X if(strncmp(line,"END",3)==0) contd=TRUE; X } X standout(); X! mvaddstr(LINES-3,(COLS/2)-13,"HIT ANY KEY TO CONTINUE"); X! mvaddstr(LINES-2,(COLS/2)-16,"HIT RETURN TO DELETE MESSAGE"); X standend(); X refresh(); X inpch=getch(); X*** odata.c Sat Mar 3 15:27:39 1990 X--- data.c Sat Mar 3 15:28:01 1990 X*************** X*** 93,99 **** X 100,50,100,50,250,125, X 250,50,500,100,250,125, X 50, 50, 50, 75, 75, X! 100, 50, 150, 150, 150, X 175, 150, 500, 500, 1000 X }; X X--- 93,99 ---- X 100,50,100,50,250,125, X 250,50,500,100,250,125, X 50, 50, 50, 75, 75, X! 75, 50, 150, 150, 150, X 175, 150, 500, 500, 1000 X }; X X*************** X*** 262,268 **** X /* 0 0 0 0 0 0 */ X /* a value of x means any designation is possible */ X /* fwbcwmhpgcfshfrwdpbcpstgponpmldpllpiopshmtpbcltismasspdsgridp*/ X! char *tg_stype="xffffttttffffffffffftxlxllttuuctcccfffxxtccmmmmmmmm$$$$$$$$$$0"; X char *tg_value="13335157911433442331131135734567789123937571111111111111111110"; X X char *tg_name[] = { X--- 262,268 ---- X /* 0 0 0 0 0 0 */ X /* a value of x means any designation is possible */ X /* fwbcwmhpgcfshfrwdpbcpstgponpmldpllpiopshmtpbcltismasspdsgridp*/ X! char *tg_stype="xffffttttffffffffffftxlxllttuuctcccfff?xtccmmmmmmmm$$$$$$$$$$0"; X char *tg_value="13335157911433442331131135734567789123937571111111111111111110"; X X char *tg_name[] = { X*** omagic.c Sat Mar 3 15:27:40 1990 X--- magic.c Sat Mar 3 15:28:01 1990 X*************** X*** 628,636 **** X } X } else { X if (ntn[i].race==ORC) X! mvaddstr((*count)++,0," Wrong Race"); X! else mvaddstr((*count)++,0," That Nation is Outside Your Influence"); X } X } X return(done); X } X--- 628,638 ---- X } X } else { X if (ntn[i].race==ORC) X! mvaddstr((*count)++,0," That Nation is Outside Your Influence"); X! else mvaddstr((*count)++,0," Wrong Race"); X } X+ refresh(); X+ sleep(2); X } X return(done); X } X*** omain.c Sat Mar 3 15:27:41 1990 X--- main.c Sat Mar 3 15:28:02 1990 X*************** X*** 61,67 **** X int geteuid(), getuid(), setuid(); X register int i,j; X char name[NAMELTH+1],filename[FILELTH]; X! void srand(),init_hasseen(),mapprep(); X int getopt(); X char passwd[PASSLTH+1]; X long time(); X--- 61,70 ---- X int geteuid(), getuid(), setuid(); X register int i,j; X char name[NAMELTH+1],filename[FILELTH]; X! #ifdef __STDC__ X! void srand(); X! #endif X! void init_hasseen(),mapprep(); X int getopt(); X char passwd[PASSLTH+1]; X long time(); X*************** X*** 1119,1125 **** X mvprintw(nfound2*2+count,COLS-20,"%s: %d men ",ntn[i].name,enemy); X else if(magic(i,THE_VOID)==TRUE) X mvprintw(nfound2*2+count,COLS-20,"%s: ?? men ",ntn[i].name); X! else mvprintw(nfound2*2+count,COLS-20,"%s: %ld men ",ntn[i].name,(enemy*(rand()%60+70)/100)); X count++; X } X enemy=0; X--- 1122,1132 ---- X mvprintw(nfound2*2+count,COLS-20,"%s: %d men ",ntn[i].name,enemy); X else if(magic(i,THE_VOID)==TRUE) X mvprintw(nfound2*2+count,COLS-20,"%s: ?? men ",ntn[i].name); X! else { X! srand(i*17+enemy+TURN*3); X! mvprintw(nfound2*2+count,COLS-20,"%s: %ld men ",ntn[i].name,(enemy*(rand()%60+70)/100)); X! srand((unsigned) time((long *) 0)); X! } X count++; X } X enemy=0; X*************** X*** 1137,1143 **** X mvprintw(nfound2*2+count,COLS-20,"%s: %d ships",ntn[i].name,enemy); X else if(magic(i,THE_VOID)==TRUE) X mvprintw(nfound2*2+count,COLS-20,"%s: ?? ships",ntn[i].name); X! else mvprintw(nfound2*2+count,COLS-20,"%s: %ld ships",ntn[i].name,(enemy*(rand()%60+70)/100)); X count++; X } X } X--- 1144,1154 ---- X mvprintw(nfound2*2+count,COLS-20,"%s: %d ships",ntn[i].name,enemy); X else if(magic(i,THE_VOID)==TRUE) X mvprintw(nfound2*2+count,COLS-20,"%s: ?? ships",ntn[i].name); X! else { X! srand(i*17+enemy+TURN*3); X! mvprintw(nfound2*2+count,COLS-20,"%s: %ld ships",ntn[i].name,(enemy*(rand()%60+70)/100)); X! srand((unsigned) time((long *) 0)); X! } X count++; X } X } X*************** X*** 1177,1184 **** X X if((sptr->owner==country)||(country==0)||(magic(country,NINJA)==TRUE)) X mvprintw(LINES-9,COLS-20,"people: %6d",sptr->people); X! else X! mvprintw(LINES-9,COLS-20,"people: %6d",sptr->people*(rand()%60+70)/100); X clrtoeol(); X if((sptr->owner==country) X ||(sptr->owner==0) X--- 1188,1198 ---- X X if((sptr->owner==country)||(country==0)||(magic(country,NINJA)==TRUE)) X mvprintw(LINES-9,COLS-20,"people: %6d",sptr->people); X! else { X! srand(country*17+TURN*3+sptr->people); X! mvprintw(LINES-9,COLS-20,"people: %6d",sptr->people*(rand()%60+70)/100); X! srand((unsigned) time((long *) 0)); X! } X clrtoeol(); X if((sptr->owner==country) X ||(sptr->owner==0) X*** onpc.c Sat Mar 3 15:27:42 1990 X--- npc.c Sat Mar 3 15:28:02 1990 X*************** X*** 487,493 **** X for(armynum=1;armynum<MAXARM;armynum++) if(P_ASOLD>0){ X /* move army back if too far out */ X ok = 0; X! if (P_ASOLD < MINLEADER && P_ASOLD!=A_MILITIA) { X curntn->tmil += P_ASOLD; X } X for(x=(int)P_AXLOC-3;x<=(int)P_AXLOC+3;x++) X--- 487,493 ---- X for(armynum=1;armynum<MAXARM;armynum++) if(P_ASOLD>0){ X /* move army back if too far out */ X ok = 0; X! if (P_ATYPE < MINLEADER && P_ASOLD!=A_MILITIA) { X curntn->tmil += P_ASOLD; X } X for(x=(int)P_AXLOC-3;x<=(int)P_AXLOC+3;x++) X*************** X*** 562,567 **** X--- 562,568 ---- X X /*too few soldiers on garrison*/ X /*diff is number to change mil in cap (>0)*/ X+ if (*(u_enmetal + (P_ATYPE%UTYPE)) > 0) X diff = (long) min(ideal-P_ASOLD,(int) (curntn->metals / *(u_enmetal + (P_ATYPE%UTYPE)))); X X diff=(long) min((int) diff, sct[curntn->capx][curntn->capy].people/2L); X*************** X*** 636,641 **** X--- 637,643 ---- X &&( P_ATYPE<MINLEADER ) X &&( P_ASOLD < TAKESECTOR ) X &&( curntn->tgold > 0 ) X+ &&(curntn->metals >= (TAKESECTOR+20-P_ASOLD)* *(u_enmetal + (P_ATYPE%UTYPE))) X &&( fort_val(&sct[P_AXLOC][P_AYLOC]) > 0) X &&( sct[P_AXLOC][P_AYLOC].owner == country )) { X #ifdef DEBUG X*************** X*** 647,652 **** X--- 649,655 ---- X else curntn->tgold-=(TAKESECTOR+20-P_ASOLD)* X *(u_encost + (P_ATYPE%UTYPE)); X curntn->tmil += TAKESECTOR+20-P_ASOLD; X+ curntn->metals -= ((TAKESECTOR+20-P_ASOLD)* *(u_enmetal + (P_ATYPE%UTYPE))); X P_ASOLD = TAKESECTOR+20; X } X X*************** X*** 1160,1165 **** X--- 1163,1177 ---- X X if( curntn->tgold > curntn->tciv ) curntn->charity=10; X else curntn->charity=0; X+ if( (curntn->tsctrs < 20) || (curntn->score < 20) ) { X+ if( curntn->tax_rate < 10 ) X+ curntn->tax_rate = 10; X+ } else { X+ curntn->tax_rate = (int)min((int)(curntn->prestige/5),(int)((curntn->popularity+curntn->terror+3*curntn->charity)/10)); X+ curntn->tax_rate = (int)min(curntn->tax_rate,20); X+ if(curntn->tax_rate < 4) X+ curntn->tax_rate = 4; X+ } X X /* INTELLIGENT SECTOR REDESIGNATION */ X /* note that only redesignate pc's if not designated yet */ X*** otrade.c Sat Mar 3 15:27:44 1990 X--- trade.c Sat Mar 3 15:28:03 1990 X*************** X*** 51,57 **** X #ifdef ADMIN X char *tradefail[NUMPRODUCTS] = { "lack of gold", "lack of food", X "lack of metal", "lack of jewels", "land not owned", X! "no available armies", "no available navies"}; X #endif ADMIN X #ifdef CONQUER X /* Use this when you wish to bid something */ X--- 51,58 ---- X #ifdef ADMIN X char *tradefail[NUMPRODUCTS] = { "lack of gold", "lack of food", X "lack of metal", "lack of jewels", "land not owned", X! "unavailable or destroyed armies", X! "unavailable or destoryed navies"}; X #endif ADMIN X #ifdef CONQUER X /* Use this when you wish to bid something */ X*************** X*** 145,151 **** X lvar2[holdint], X commodities[type2[holdint]]); X } X! if (count>16) { X standout(); X mvaddstr(LINES-2,30,"Hit Any Key to Continue"); X standend(); X--- 146,152 ---- X lvar2[holdint], X commodities[type2[holdint]]); X } X! if (count>LINES-8) { X standout(); X mvaddstr(LINES-2,30,"Hit Any Key to Continue"); X standend(); X*************** X*** 571,576 **** X--- 572,578 ---- X } X } X mvprintw((*count)++,0," JUST ENTERED %c so food value is %d", entered,temp); X+ refresh(); X return(temp); X } X X*************** X*** 659,664 **** X--- 661,667 ---- X int cntry,item,isup,extint; X long longval; X { X+ if (cntry == -1) return; X switch(item) X { X case TDGOLD: X*************** X*** 722,727 **** X--- 725,731 ---- X case TDARMY: X /* find army number for cntry2 */ X /* give army to cntry2 */ X+ if(ntn[cntry1].arm[extra].sold <= 0) return -1; X while(unitnum==(-1)&&unitcount<MAXARM) { X if (ntn[cntry2].arm[unitcount].sold<=0) { X /* give army to cntry2 */ X*************** X*** 743,748 **** X--- 747,755 ---- X break; X case TDSHIP: X /* give navy to cntry1 */ X+ if(!(ntn[cntry1].nvy[extra].merchant!=0 X+ && ntn[cntry1].nvy[extra].warships!=0 X+ && ntn[cntry1].nvy[extra].galleys!=0) ) return -1; X while(unitnum==(-1)&&unitcount<MAXARM){ X if ((int)ntn[cntry2].nvy[unitcount].merchant+ntn[cntry2].nvy[unitcount].warships+ntn[cntry2].nvy[unitcount].galleys == 0) { X /* give navy to cntry2 */ X*************** X*** 787,793 **** X returnval=longval; X break; X case TDLAND: X! if (cntry2!=sct[(int)longval][extint].owner) X returnval=(long)tofood( &sct[(int)longval][extint],cntry1); X break; X case TDARMY: X--- 794,800 ---- X returnval=longval; X break; X case TDLAND: X! if (cntry2 == sct[(int)longval][extint].owner) X returnval=(long)tofood( &sct[(int)longval][extint],cntry1); X break; X case TDARMY: X*************** X*** 795,800 **** X--- 802,808 ---- X returnval=armyvalue(cntry2,extint); X break; X case TDSHIP: X+ curntn = &ntn[cntry2]; X if (flthold(extint)>0) X returnval = (long)flthold(extint); X break; X*************** X*** 976,982 **** X whobuy[type1[itemnum]]=natn[itemnum]; X } else { X /* return bid */ X! takeback(whobuy[itemnum], X type2[type1[itemnum]], X lvar1[itemnum],(int)lvar2[itemnum],FALSE); X } X--- 984,990 ---- X whobuy[type1[itemnum]]=natn[itemnum]; X } else { X /* return bid */ X! takeback(natn[itemnum], X type2[type1[itemnum]], X lvar1[itemnum],(int)lvar2[itemnum],FALSE); X } X*************** X*** 995,1000 **** X--- 1003,1009 ---- X for (count=0;count<itemnum;count++) { X if (deal[count]==SELL) { X /* adjust the displayed value */ X+ if (type1[count] != TDLAND) X lvar1[count]=gettval(0,natn[count],type1[count],lvar1[count],extra[count]); X /* keep unsold items up for sale */ X if(lvar1[count]>=0) fprintf(tfile,"%d %d %d %d %ld %ld %d\n", deal[count], natn[count],type1[count],type2[count],lvar1[count],lvar2[count],extra[count]); X*************** X*** 1013,1018 **** X--- 1022,1029 ---- X ntn[whobuy[count]].name,ntn[natn[count]].name,tradefail[type2[count]]); X /* place it on the list for next turn */ X /* adjust the displayed value */ X+ /* let land fail during trade */ X+ if (type1[count] != TDLAND) X lvar1[count]=gettval(0,natn[count],type1[count],lvar1[count],extra[count]); X if(lvar1[count]>=0) fprintf(tfile,"%d %d %d %d %ld %ld %d\n", SELL, natn[count],type1[count],type2[count],lvar1[count],lvar2[count],extra[count]); X } else { X*************** X*** 1026,1031 **** X--- 1037,1108 ---- X } X } X fclose(tfile); X+ } X+ X+ /* remove a nations items from the trading board */ X+ void X+ fixtrade (cntry) X+ int cntry; X+ { X+ FILE *tfile; X+ int holdint, notopen=FALSE; X+ int type1[MAXITM], type2[MAXITM], deal[MAXITM], extra[MAXITM]; X+ int natn[MAXITM], itemnum, getland(), gettrade(), checkland(); X+ long lvar1[MAXITM], lvar2[MAXITM], armyvalue(); X+ void setaside(), takeback(); X+ X+ /* open trading file */ X+ if ((tfile=fopen(tradefile,"r")) == NULL ) { X+ notopen=TRUE; X+ } X+ itemnum = 0; X+ X+ /* read in all of the data */ X+ while (notopen==FALSE && !feof(tfile)) X+ { X+ if (fscanf(tfile,"%d %d %d %d %ld %ld %d\n",&deal[itemnum], X+ &natn[itemnum],&type1[itemnum],&type2[itemnum], X+ &lvar1[itemnum],&lvar2[itemnum],&extra[itemnum]) == 7){ X+ if (deal[itemnum]==NOSALE) { X+ /* remove item from sales list */ X+ deal[type1[itemnum]]=NOSALE; X+ } else if (deal[itemnum]==SELL) { X+ itemnum++; X+ } X+ } X+ } X+ if (notopen==FALSE) fclose(tfile); X+ X+ /* go through list of commodities */ X+ X+ for ( holdint=0; holdint<itemnum; holdint++) X+ { X+ if ( deal[holdint]==SELL ) X+ { X+ X+ if ( natn[holdint] == cntry ) X+ { X+ /* remove it from market */ X+ X+ if ( (tfile = fopen(tradefile,"a+"))==NULL) X+ { X+ printf("Error opening file for trading"); X+ abrt(); X+ } X+ X+ fprintf(tfile, "%d %d %d %d %ld %ld %d\n", X+ NOSALE, natn[holdint], holdint, 0, 0L, 0L, 0); X+ X+ fclose(tfile); X+ X+ takeback( natn[holdint], type1[holdint], lvar1[holdint], X+ extra[holdint], FALSE); X+ X+ } /* natn == cntry */ X+ X+ } /* SELL order */ X+ X+ } /* loop through commodities */ X } X #endif ADMIN X #endif TRADE X*** ocheck.c Sat Mar 3 15:27:39 1990 X--- check.c Sat Mar 3 15:28:03 1990 X*************** X*** 18,29 **** X register struct s_nation *nptr; X register int i; X register int country; X struct army *a; X X for( country = 0; country < NTOTAL; country++ ) { X nptr = &ntn[country]; X X! if(nptr->active == 0) continue; X if( nptr->metals < 0.0 ) { X fprintf( stderr, "file %s: line %d: nation[%d] metal = %ld\n", X __file__, __line__, country, nptr->metals ); X--- 18,30 ---- X register struct s_nation *nptr; X register int i; X register int country; X+ int j, k; X struct army *a; X X for( country = 0; country < NTOTAL; country++ ) { X nptr = &ntn[country]; X X! if(country !=0 && nptr->active == 0) continue; X if( nptr->metals < 0.0 ) { X fprintf( stderr, "file %s: line %d: nation[%d] metal = %ld\n", X __file__, __line__, country, nptr->metals ); X*************** X*** 54,68 **** X __file__, __line__, country, i, a->yloc ); X a->yloc = 0; X } X if( a->stat != ONBOARD && sct[a->xloc][a->yloc].altitude==WATER ) { X fprintf( stderr, "file %s: line %d: nation[%d] army[%d] loc=%d,%d (water) men=%d\n", X __file__,__line__,country,i,a->xloc,a->yloc,a->sold); X a->sold = 0; X } X! if( a->stat == ONBOARD && a->smove != 0) { X! /* don't echo since this is still getting */ X! /* set some place someplace I can't find yet */ X! a->smove = 0; X } X } /* for */ X X--- 55,101 ---- X __file__, __line__, country, i, a->yloc ); X a->yloc = 0; X } X+ if( a->stat == ONBOARD) { X+ if (a->smove != 0) { X+ fprintf( stderr, "file %s: line %d: nation[%d] army[%d] onboard move = %d\n", X+ __file__, __line__, country, i, a->smove ); X+ a->smove = 0; X+ } X+ k = 0; X+ for (j = 0; j < MAXNAVY; j++) { X+ if (nptr->nvy[j].warships == 0 X+ && nptr->nvy[j].merchant == 0 X+ && nptr->nvy[j].galleys == 0) X+ continue; X+ if (nptr->nvy[j].armynum == i) { X+ k = 1; X+ } X+ } X+ if (k == 0) { X+ fprintf(stderr, "files %s: line %d: nation[%d] army[%d] onboard nothing\n", X+ __file__,__line__,country,i); X+ a->stat = DEFEND; X+ } X+ } X if( a->stat != ONBOARD && sct[a->xloc][a->yloc].altitude==WATER ) { X fprintf( stderr, "file %s: line %d: nation[%d] army[%d] loc=%d,%d (water) men=%d\n", X __file__,__line__,country,i,a->xloc,a->yloc,a->sold); X a->sold = 0; X } X! } /* for */ X! X! for( i = 0; i < MAXNAVY; i++ ) { X! if (nptr->nvy[i].warships == 0 X! && nptr->nvy[i].merchant == 0 X! && nptr->nvy[i].galleys == 0) X! continue; X! if (nptr->nvy[i].armynum != MAXARM) { X! a = &(nptr->arm[nptr->nvy[i].armynum]); X! if (a->sold == 0 || a->stat != ONBOARD) { X! fprintf(stderr, "file %s: line %d: nation[%d] navy[%d] carrying invalid troop\n", X! __file__,__line__,country,i); X! nptr->nvy[i].armynum = MAXARM; X! } X } X } /* for */ X X*** onavy.c Sat Mar 3 15:27:42 1990 X--- navy.c Sat Mar 3 15:28:03 1990 X*************** X*** 423,430 **** X } X P_ASTAT=DEFEND; X P_NARMY=MAXARM; X! if ((sct[XREAL][YREAL].designation!=DCITY X! && sct[XREAL][YREAL].designation!=DCAPITOL) X || P_NMOVE < N_CITYCOST) { X P_NMOVE=0; X } else { X--- 423,433 ---- X } X P_ASTAT=DEFEND; X P_NARMY=MAXARM; X! if (!((sct[XREAL][YREAL].designation==DCITY X! || sct[XREAL][YREAL].designation==DCAPITOL) X! && (sct[XREAL][YREAL].owner==country X! || (!ntn[sct[XREAL][YREAL].owner].dstatus[country]!=UNMET X! && ntn[sct[XREAL][YREAL].owner].dstatus[country]<=NEUTRAL))) X || P_NMOVE < N_CITYCOST) { X P_NMOVE=0; X } else { X*************** X*** 495,502 **** X P_ASTAT=ONBOARD; X P_AMOVE=0; X P_NARMY=armynum; X! if ((sct[XREAL][YREAL].designation!=DCITY X! && sct[XREAL][YREAL].designation!=DCAPITOL) X || P_NMOVE < N_CITYCOST) { X P_NMOVE=0; X } else { X--- 498,508 ---- X P_ASTAT=ONBOARD; X P_AMOVE=0; X P_NARMY=armynum; X! if (!((sct[XREAL][YREAL].designation==DCITY X! || sct[XREAL][YREAL].designation==DCAPITOL) X! && (sct[XREAL][YREAL].owner==country X! || (!ntn[sct[XREAL][YREAL].owner].dstatus[country]!=UNMET X! && ntn[sct[XREAL][YREAL].owner].dstatus[country]<=NEUTRAL))) X || P_NMOVE < N_CITYCOST) { X P_NMOVE=0; X } else { X*** otxt3 Sat Mar 3 15:27:44 1990 X--- txt3 Sat Mar 3 15:28:04 1990 X*************** X*** 1,25 **** X! MAGIC POWERS X X! Magic powers differentiate your nation from all the other nations in the X! world. There are three types of powers - truly MAGICAL powers, which X! usually involve summoning or spell use, CIVILIAN powers, which are related X! to civilization and trade, and MILITARY powers, which measure your ability X! to make war. X X! All nations start with at least one power (based on race or class) and can X! purchase additional powers by expending jewels. On the Magic Screen ('M'), X! if you have enough jewels, you will be asked if you wish to buy a magic X power. X! X! The magic screen also permits you to see what powers you have, and to X! takeover ORC nations if you are an ORC nation with the appropriate powers. X END X! HOW TO GET MAGIC X X! Magic powers cost jewels to obtain; the chance to obtain a power is based on X! your nations magic ability. The formulae for this is to take two to the X! power of the sum of the number of powers you have from that type and half X! the number of other powers times your base value: X X jewel cost for civilian power = Base * 2**( #mgk/2 + #civ + #mil/2 ) X X--- 1,25 ---- X! MAGIC POWERS X X! Magic powers differentiate your nation from all the other nations in the X! world. There are three types of powers - truly MAGICAL powers, which usually X! involve summoning or spell use, CIVILIAN powers, which are related to civili- X! zation and trade, and MILITARY powers, which measure your ability to make X! war. X X! All nations start with at least one power (based on race or class) and can X! purchase additional powers by expending jewels. On the Magic Screen ('M'), X! if you have enough jewels, you will be asked if you wish to buy a magic X power. X! X! The magic screen also permits you to see what powers you have, and to take- X! over ORC nations if you are an ORC nation with the appropriate powers. X END X! HOW TO GET MAGIC X X! Magic powers cost jewels to obtain; the cost to obtain a power is based on X! your nations magic ability. The formulae for this is to take two to the X! power of the sum of the number of powers you have from that type and half the X! number of other powers times your base value: X X jewel cost for civilian power = Base * 2**( #mgk/2 + #civ + #mil/2 ) X X*************** X*** 102,145 **** X Enhance Attack -- 30% increase in attack at a cost of 1 spell pt / 300 men X Enhance Defense -- 30% increase in defense at a cost of 1 spell pt / 300 men X X! All of the above spells except summoning have an effect area of one army X! unit and a duration of one turn. Flight and the Combat Enhancements each X! cause the unit to lose one movement point due to the change in status. X END X! SUMMONED MONSTERS X X! A monster unit represents one monster, but is the equivalent in combat of an X army of the given number of men. When summoned, they appear in your Capitol, X! and are yours to command until you disband them or can not afford to pay X! their per/turn jewel cost *and* 5x that cost in gold. Monsters may be X! wounded in combat as can normal army units. Wounded monsters have a percent X chance of dying based on the percent damage taken (a dragon (1000 men) taking X! 200 equivalent men of damage has a 20% chance of dying). Next turn, however X! its strength will be fully restored (1000 men again). A number of the X! monsters will also have the ability of flight. X X! Spell points can accumulate from turn to turn, but there is a 25% chance X! that half your unused spell points disappear each turn... this gives you X! some incentive to use them. X END X SUMMONED MONSTER TYPES X X spell combat jewels power X points bonus move men turn prerequisites X! SPIRIT 2 +0 x1 50 1000 X! ASSASSIN 2 +20 x1 50 400 NINJA X! EFREET 2 +10 x1.5 50 400 DERVISH X! GARGOYLE 2 +10 x1 75 450 MI_MONST X! WRAITH 2 +10 x1 75 450 VAMPIRE X! HERO 2 +0 x1 100 200 WARRIOR X! CENTAUR 2 +10 x1.5 50 200 CAVALRY X! GIANT 5 +0 x1 150 2100 X! SUPERHERO 5 +15 x1 150 450 WARLORD X! MUMMY 5 +15 x1 150 1000 VAMPIRE X! ELEMENTAL 5 +5 x1.5 175 1900 SORCERER X! MINOTAUR 5 +20 x1 150 2100 DESTROYER X! DEMON 10 +50 x1 500 6000 DESTROYER X! BALROG 10 +40 x1.5 500 6000 WIZARD & VAMPIRE X! DRAGON 15 +50 x2 1000 10000 MA_MONST & WIZARD X END X DONE X--- 102,162 ---- X Enhance Attack -- 30% increase in attack at a cost of 1 spell pt / 300 men X Enhance Defense -- 30% increase in defense at a cost of 1 spell pt / 300 men X X! All of the above spells except summoning have an effect area of one army unit X! and a duration of one turn. Flight and the Combat Enhancements each cause X! the unit to lose one movement point due to the change in status. X END X! SUMMONED MONSTERS X X! A monster unit represents one monster, but is the equivalent in combat of an X army of the given number of men. When summoned, they appear in your Capitol, X! and are yours to command until you disband them or can not afford to pay X! their per/turn jewel cost *and* 5x that cost in gold. Monsters may be X! wounded in combat as can normal army units. Wounded monsters have a percent X chance of dying based on the percent damage taken (a dragon (1000 men) taking X! 200 equivalent men of damage has a 20% chance of dying). Next turn, however X! its strength will be fully restored (1000 men again). A number of the mon- X! sters will also have the ability of flight. X X! Spell points can accumulate from turn to turn, but there is a 25% chance that X! half your unused spell points disappear each turn.... This gives you some X! incentive to use them. X END X SUMMONED MONSTER TYPES X X spell combat jewels power X points bonus move men turn prerequisites X! Spirit 2 +0 x1 50 1000 X! Assasin 2 +20 x1 50 400 NINJA X! Efreet 2 +10 x1.5 50 400 DERVISH X! Gargoyl 2 +10 x1 75 450 MI_MONST X! Wraith 2 +10 x1 75 450 VAMPIRE X! Hero 2 +0 x1 75 200 WARLORD X! Centaur 2 +10 x1.5 50 200 CAVALRY X! Giant 5 +0 x1 150 2100 X! Suphero 5 +15 x1 150 450 WARRIOR X! Mummy 5 +15 x1 150 1000 VAMPIRE X! Elmentl 5 +5 x1.5 175 1900 SORCERER X! Mintaur 5 +20 x1 150 2100 DESTROYER X! Daemon 10 +50 x1 500 6000 DESTROYER X! Balrog 10 +40 x1.5 500 6000 WIZARD & VAMPIRE X! Dragon 15 +50 x2 1000 10000 MA_MONST & WIZARD X! END X! FURTHER RESTRICTIONS ON ACQUIRING MAGIC X! X! Note: This applies only to powers acquired during the course of the game and X! not to innate powers of nations. Further, extra random powers bought by new X! nations are considered to be bought on their first turn as their first X! action. X! X! God only: KNOWALL X! Orc only: MI_MONST, AV_MONST, MA_MONST, BREEDER X! PC only: ARMOR, AVIAN, SAPPER, X! DEMOCRACY, NINJA, ROADS, SAILOR, SLAVER, X! SUMMON, WYZARD, SORCEROR X! Forbidden to Dwarves: SUMMON, WYZARD, SORCEROR X! Forbidden to Elves: DESTROYER, VAMPIRE, MINER X! Forbidden to Orcs: RELIGION, CAVALRY X! Forbidden to NPC's: CAVALRY X END X DONE X*** ospew.c Sat Mar 3 15:27:43 1990 X--- spew.c Sat Mar 3 15:28:05 1990 X*************** X*** 95,106 **** X int n; X FILE *fp; X { X! char *fname; X char main_class[20]; X int i; X HowMany = n; X X! fname = DEFFILE; X InFile = fopen( fname, "r" ); X if( InFile == NULL ){ X fprintf( stderr, "Can\'t open: %s\n", fname ); X--- 95,107 ---- X int n; X FILE *fp; X { X! char fname[BIGLTH]; X char main_class[20]; X int i; X HowMany = n; X X! /* read in only the rules file in defaultdir */ X! sprintf(fname, "%s/%s", DEFAULTDIR, DEFFILE); X InFile = fopen( fname, "r" ); X if( InFile == NULL ){ X fprintf( stderr, "Can\'t open: %s\n", fname ); X END_OF_FILE if test 62540 -ne `wc -c <'patches09'`; then echo shar: \"'patches09'\" unpacked with wrong size! fi # end of 'patches09' fi echo shar: End of shell archive. exit 0