games@tekred.TEK.COM (06/17/88)
Submitted by: ihnp4!homxc!smile Comp.sources.games: Volume 4, Issue 44 Archive-name: conquer3/Part03 #! /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 archive 3 (of 8)." # Contents: FILESIZES help.txt misc.c # Wrapped by billr@saab on Thu Jun 16 09:39:57 1988 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f FILESIZES -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"FILESIZES\" else echo shar: Extracting \"FILESIZES\" \(917 characters\) sed "s/^X//" >FILESIZES <<'END_OF_FILESIZES' X lines words chars FILENAME X 58 538 2960 nations X 211 966 6885 Makefile X 550 4266 26815 help.txt X 337 2438 15481 README X 74 259 1789 run X 193 849 4886 man.page X 132 988 6342 header.h X 452 1655 13697 data.h X 67 326 1745 newlogin.h X 822 2105 24900 combat.c X 202 518 5059 cexecute.c X 290 715 6460 io.c X 175 644 4919 admin.c X 852 2170 22776 makeworld.c X 996 2446 28406 newlogin.c X 797 1968 21402 update.c X 847 1689 20241 magic.c X 1059 2439 28401 npc.c X 1120 3662 26322 misc.c X 781 2509 22037 randevent.c X 218 917 5939 data.c X 1027 2227 23192 commands.c X 558 1196 14869 forms.c X 846 1906 19741 main.c X 622 1261 15082 move.c X 519 1206 13951 reports.c X 357 762 9939 display.c X 197 485 3954 extcmds.c X 14359 43110 398190 total END_OF_FILESIZES if test 917 -ne `wc -c <FILESIZES`; then echo shar: \"FILESIZES\" unpacked with wrong size! fi # end of overwriting check fi if test -f help.txt -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"help.txt\" else echo shar: Extracting \"help.txt\" \(26815 characters\) sed "s/^X//" >help.txt <<'END_OF_help.txt' X CONQUER COMMAND HELP SCREEN X X MOVEMENT COMMANDS ADMINISTRATION X'h': move west 'a': army report 'p': pick item X'y': move north-west 'r': redesignate 'd': change display X'k': move north 'ctrl-L': redraw screen 'c': administration X'u': move north-east 'm': move selected unit '?': help screen X'l': move east 'A': adjust army 's': score X'n': move south-east 'f': fleet report 'B': budget status X'j': move south 'Z': move people 2 Sectors 'P': production stats X'b': move south west 'S': diplomacy status 'N': read newspaper X'J': scroll south 'Q': quit (saves changes) 'W': write message X'K': scroll north 'M': magic 'R': read messages X'L': scroll east 'C': construct X'H': scroll west 'D': draft 'ESC [1-5]': chg status X 'G': go to next army 'ESC +': combine 2 armies X 'F': go to next fleet 'ESC -': split army X 'g': group army report 'ESC /': split army in 2 XEND X Welcome to Conquer XVERSION X XCONQUER is a multi player computer game designed to run under the UNIX Xoperating system. In CONQUER, each player is the leader of a nation, Xcomposed of people (humans, orcs, elves, dwarves), resources, and land. XRulers customize their nation at creation by chosing their race and by giving Xtheir nation special powers (magic, combat factor, location, speed...) Xand resources (civilians, troops, iron, gold...). Play involves building, Xmoving, and controlling armies and navies, diplomacy with other players, Xand adjusting economic activity, which is primarily geared to the production Xof gold for your treasury. Iron is needed, however to build ships & armies, Xand food is needed to prevent revolts and keep people alive. X XCommand line format: conquer [-maxhps -nNAT -dDIR] X -h print this help text -n NTN run as nation NTN X -d DIR run on data in directory DIR -s print out scores XCommand line format: admin [-maxdp] X -a add new player -m make a world X -p print a map -x execute program X -d DIR run on data in directory DIR XIt is suggested that each player set up a shell alias for their game & nation XEND X THE WORLD X XThe Conquer world is very bloody, and a player needs skills at war gaming, Xdiplomacy, and building an economy to succeed. Rival races are constantly Xat war, and the world starts filled with player nations, random peoples X(lizard men in their cities of gold, barbarians, nomads, pirates, brigands), Xand both hostile and friendly computer controlled non player countries. XConquer can be played solitaire. The computer uses an highly intelligent Xmovement algorithm to run the armies and navies of these non player Xcountries (NPC), and has intelligent algorithms built in that control these Xnations diplomacy, construction, and economies. You can find NPCs allied with Xyou against a common enemy, but can also suddenly be stabbed in the Xback and find hostile NPC armies at your doorstep. XEND X CURSOR MOVEMENT X X NORTH X X (K) X y,7 k,8 u,9 X \ | / X \ | / X WEST (H) h,4 ---- 0 ---- l,6 (L) EAST X / | \ X / | \ X b,1 j,2 n,3 X (J) X X SOUTH X X Figures in parenthesis indicate scrolling X Note the numeric keypad OR vi keys can be used X X <cntrl>-L will redraw the screen XEND X WHAT IS WHAT IN THE WORLD X XThe world is composed of a 2 dimensional map of sectors, created by the Xcomputer at the beginning of the game. Each sector has about 10 unique Xcharacteristics (altitude, gold, vegetation...). X XSECTOR ELEVATIONS include: X ZMOUNTAIN ZHILL ZCLEAR X ZWATER ZPEAK XSECTOR VEGETATION XUninhabitable Areas (do not produce food and people simply do not like) X ZVOLCANO ZDESERT ZJUNGLE X ZTUNDRA ZICE ZSWAMP XInhabitable (people like, number is relative value of food production) X ZGOOD...9 ZFOREST...3 (4 ELF) ZLIGHT...6 X ZWOOD...7 ZBARREN...4 (3 ELF) X XCONQUER is designed so each race likes their appropriate terrain. Elves like Xwoods & forests, Humans like good & light vegetation, and Orcs and Dwarves Xlike hills and mountains. You can only redesignate inhabitable sector types. XEND X CONQUER COMMANDS -- lower case commands X X'a': army report: Gives an army's details & permits changing army status, X merging 2 armies, splitting armies, and disbanding armies X'c': administration: Report on nation status and then change name, password, X add to combat bonus, or (if god) destroy a nation. X'd': change display: Change display mode. Numbers in gold screens... are X relative values of the materials. X'f': fleet report: Report on the status of your fleets. X'g': group report: As army report, but display will only show those armies X in the current sector. X'm': move unit: move selected unit. The unit will stop when it runs out X of move points or runs into an army larger than it. X'p': pick item: allows you to select the next army or navy in the X sector. Other commands will operate on that unit. X'r': redesignate: you can change habitable sectors you own to other X designations. Towns require 500+ people & Capitols X require Towns. God can redesignate anything. X's': score: print out a screen showing the scores X'?': help screen: print out this help text XEND X CONQUER COMMANDS -- upper case commands pg. 1. X X'A': adjust army: The quick way to adjust the status of your armies. X'B': budget : ESTIMATE your nations budget statistics X'C': construct: If you have cash, you can build fortifications and X ships in your Towns. Ships can only be built in Towns X located on the water. X'D': draft: You may draft a quarter of the starting population from a X sector if it was a Town, and if you have the gold & iron. X'F': next fleet: Move cursor to your next fleet X'G': next army: Move cursor to your next army X'M': magic: Prints your magic powers & offers you the option to X purchase more (cost doubles each power). Monster Power X gives you the chance to take over NPC nations. XEND X CONQUER COMMANDS -- upper case commands pg. 2. X X'N': newspaper: Briefs you on world happenings. Note: News has 4 pages. X'P': production: ESTIMATE your nations production statistics X'S': diplomacy: Allow you to see and alter your diplomatic status. X'Q': quit: Save your move and quit the game. Note there is no X means supported to quit without saving your moves. X'R': read mail: Read mail messages X'W': write mail: Write mail messages X'Z': move people: Civilians can move between two of your sectors at a cost X of 50 per civilian. Civilians naturally move in the update. XEND X RACES OF THE WORLD X XORC 'O' Poor at combat but they reproduce like mad (they can go over X 10% reproduction ceiling). Orcs are lousy fighters and are X led by minor monsters (they start with MINOR MONSTER power). XELF 'E' Great at defense and quick, but few in numbers. They start X with VOID power, which is perhaps the most potent power in the X game, but which costs them an extra distribution point. XDWARF 'D' Dwarves are good at combat, but slow and few in numbers. They X start with MINER power, which allows them to quickly mine X iron/jewels, and thus build up their combat skills and powers. XHUMAN 'H' Humans start average at everything -- with reasonable numbers, X of people, and WARRIOR power, which gives them +10% in combat. X They have OK reproduction and good movement. XLIZARD 'L' (NPC only) An ancient race bound to their cities of gold XPIRATE 'P' (NPC only) Wandering pirates/brigands intent on plunder XNOMAD 'N' (NPC only) Will the wandering nomads tribes leave you alone? XBARBARIAN 'B' (NPC only) Indigenous natives XEND X POSSIBLE SECTOR DESIGNATIONS X XZMINE Produces 100*Iron*People Talons + Produces Iron Ores XZFARM Produces 100*Vegetation*People Talons + Produces Food XZGOLD Produces 100*Gold*People Talons + Produces Jewels XZCASTLE Fortified Cities of the Lizards (only) XZDEVASTATED devastated sector XZTOWN Towns and Capitols are the bases of your power and are XZCAPITOL the only places you can draft soldiers or construct ships. X Drafting only works if the sectors population is greater than your X total civilians divided by the quantity 16+(number of sectors)/2. X Towns give 750 talons per person and Capitols give 1000 talons per X person. Towns and Capitols cost more to redesignate. To capture a X Town or Capitol, you must be the only occupant when the world is X updated. X XThe minimum permissible vegetation to redesignate a sector is XDESFOOD. XEND X IRON, FOOD, AND GOLD X XFOOD: You MUST have enough food to feed your people... One civilian eats X one unit of food, and one soldier eats two units. If you run out of X food, half the difference of people in Towns die. Your Granary X will store 3x your civilian population in food. The remainder X is converted to gold talons at a rate of 1 per food point. XIRON: You need to have iron to draft new military, as per the unit types X section. One person produces one iron per point of mineral in X the sector per turn. An amount of Iron (based on the number of troops X you have) can be used to buy +1% in your nations attack or defense. XJEWELS: You can have a maximum of 10 talons debt for every jewel X point that you mined. After that point, you undergo a TAX REVOLT, X which has not yet been implemented. Thus gold can be negative to X a certain level. Jewels are also used in magic, and 100000 Jewels X will buy you one random new power (command M) (it doubles for each X power though). You can have 10 talons in the treasury for each jewel X (gold based economy). After that, your gold talons will be converted X to jewels at a 10:1 ratio. XEND X UNIT TYPES X X costs combat power X enlist maintain attack defend move iron prerequisites X XMILITIA $40 $10 -25 -25 0 0 XGOBLIN $70 $20 -15 -15 x1 80 MI_MONST XORC $90 $40 +0 +0 x1 80 MI_MONST XINFANTRY $90 $40 +0 +0 x1 100 XSAILOR $90 $40 +0 +0 0 100 XMARINES $90 $40 +25 +25 0 100 SAILOR XARCHER $90 $40 +0 +10 x1 100 ARCHER XURUK-HAI $120 $40 +5 +5 x1 150 AV_MONST XNINJA $130 $80 +20 +0 x1 150 NINJA XPHALANX $150 $60 +10 +10 x1 150 CAPTAIN XOLOG-HAI $200 $80 +15 +15 x1 150 BREEDER+AV_MONST XLEGION $200 $80 +20 +20 x1 150 WARLORD XDRAGOON $250 $100 +10 +10 x2 100 CAVALRY XMERCENARY $300 $100 +20 +15 x1 0 XTROLL $300 $120 +25 +15 x1 200 MA_MONST XEND X UNIT TYPES - CONTINUED X X costs combat power X enlist maintain attack defend move iron prerequisites X XELITE $300 $120 +20 +20 x1.3 200 STEEL XLT_CAVALRY $400 $200 +10 +10 x1.5 100 CAVALRY XCAVALRY $600 $250 +30 +30 x2 300 CAVALRY XCATAPULT $750 $300 -20 -20 x.5 1000 XSIEGE $750 $300 -20 -20 x.5 1000 XROC $700 $350 +20 +30 x1 300 AVIAN XKNIGHT $1000 $400 +50 +50 x2 600 ARMOR & CAVALRY XGRIFFON $1200 $500 +40 +50 x1.5 400 AVIAN XELEPHANT $1000 $400 +50 +50 x.5 600 DERVISH XEND X ADDITIONAL ADVANTAGES TO UNITS X XDragoons are cavalry that fight on foot as regular infantry (treat as inf) XArchers gain an additional +15%*(percent of cavalry/knight opponents) XArchers gain +15% defending & +5% attacking forts (no bonus vs cavalry also) XMercenaries don't deplete population when hired, but you can only have 1/2 X your normal troops in mercenaries. They cost their enlist cost to disband. XSeige_engines add +1%/20 men *TO WHOLE COMBAT* attacking fortress (max +30%) XCatapults add +1%/40 men *TO WHOLE COMBAT* in normal combat (max +10%). XCatapults add +1%/20 men *TO WHOLE COMBAT* when defending castle (max +10%). XCatapults have a % chance of damaging a fortress when attacking it XCavalry and Knights get -20% attacking or defending fortress. XKnights are heavy cavalry XPhalanx are infantry that get combat bonus *only* if in 500+ men units XLegionaires are infantry that get combat bonus *only* if in 1000+ men units XRoc and Griffon Troops fly and can ignore zones of control. XNinja act as scouts in that they are not effected by zones of control XMarines are the only units that can land by ship in unowned sectors XEND X SCORING & CHARACTER CLASSES XEach nation has a types (classe), which is choosen when it it is created, and Xwhich determines how Victory points are received. Some classes start with Xpowers and have a starting cost. Warlord/Monster powers get all the prerequisite Xpowers, and thus starting cost can varies. X X Per 1000 1000 100K 100K 100K Magic 10 Start X Sector People Troops Gold Jewels Iron Power Ship Cost Races Powers Xking 1 1 2 3 0 0 0 0 0 HDE None Xempire 1.5 0 0 0 0 0 0 0 0 HDE None Xwizard 0 2 1 0 3 5 20 0 2 HDE SUMMON Xpriest 1 1 0 0 3 0 7 0 2 H HEALER Xpirate 0 0 5 0 10 10 1 5 1 HO SAILOR Xtrader 1 1 0 0 1 1 1 8 2 ED URBAN Xwarlord 1 1 2 0 1 1 1 0 * HO WARLORD Xdemon 1 0 1 0 1 0 10 0 2 O DESTROYER Xdragon 0 0 0 10 20 0 0 0 2 O MA_MONST Xshadow 1 0 0 0 0 5 0 0 1 O VOID XNPC 1 1 0 0 1 1 1 0 0 HDEO None XEND X VIEWING THE WORLD X XWhen you log in, you will notice that you can only see a part of the Xworld. You must discover the world by getting certain magical powers, Xby taking land, or by moving armies and navies. The use of SCOUT armies Xis intended for this purpose. X XThe 'd' command allows you to change what you see on the map. You can Xalter the information in the sector and can change the type of sectors that Xare highlighted as follows: X Xinformation: (d)esignation, (r)ace, (m)ove cost, (p)eople, (D)efense X (f)ood, (c)ontour, (v)egetation, (i)ron, (n)ation mark, (j)old X Xhighlight options: X (o)wner (a)rmy (y)our Army (x)=none (M)ove left X XI have tried to make the use of these options clear and self explainatory. XEND X POSSIBLE ARMY STATUS X XMARCH :Marching doubles army movement at the expense of combat strength. XSCOUT :Scouts avoid any enemy, if possible, and can move through hostile X : armies, but must have less than 25 men per army and can not take X : even unowned land. They are useful to check out the map and X : to determine the enemy combat strength. You must draft scouts X : as you can not split scouts from an army. XATTACK :Armies in this mode can take owned sectors, initiate X : combat, and have they reasonable movement rates. XDEFEND :In this mode, can take owned sectors and have good defense X : and movement, but can not initiate combat. XGARRISON :This mode offers the strongest defense but is used only in Towns, X : Capitol, and castles. Garrisons may not move. X XNote: It takes the greater of 75 and total soldiers/150 men to take a sector. XYour attack bonus increases by 5% if you take over a non player country. XEND X SHIPS AND SHIP COSTS X X crew build cost maintain cost capacity XWarship 50 XWARSHPCOST XSHIPMAINT 0 XMerchant 50 XMERSHPCOST XSHIPMAINT XSHIPCP X XShips will now have crews - which, in addition to being drafted upon Xconstruction, represent the ships current level of damage and are replaced, Xin harbor, by using the construct ships command. Movement of Xa fleet is reduced if the crews are not full. Marine or Sailor Armies Xcan also be carried by navies with warships. Each fleet may carry one army Xin addition to any troops that are ferried - who dont count in combat. XMarines add to chances of success in shipboard combat. X XShips permit rapid relocation of armies & civilians to strategic points. Their Xmovement is 3x your nations maximum movement, and they only pay 1 move point Xper sector (coast lands), 4 in deep water, 4 in your harbor, and the min of X10 and all their remaining points points for non harbor coastlands. Naval Xcombat has not been adequately play tested, and Sailor units dont work. XEND X MAGIC POWERS XMagic powers differentiate your nation from all the other nations in the Xworld. There are three types of powers - truely MAGICAL powers, which Xusually involve summoning or spell use, CIVILIAN powers, which are related Xto civilization and trade, and MILITARY powers, which measure your ability Xto make war. All nations start with at least one power (based on race or Xclass) and can purchase additional powers by expending jewels. The formula Xfor this is to take two to the power of the sum of the number of powers you Xhave from that type and half the number of other powers times your base value: X Xjewel cost for civilian power = Base * 2**( #mgk/2 + #civ + #mil/2 ) X X type of power desired Xrace magical civilian military X elves - 50K 50K 50K X dwarves - 80K 40K 40K X humans - 100K 25K 50K X orcs - 100K 50K 25K X Xfor example a human with 1 of each power wanting a magic power would pay X 50* 2**(1+1/2+1/2)=200K jewels XEND X COMBAT TYPE POWERS X XWARRIOR +10% in combat, 1/2 Enlistment cost XCAPTAIN +10% in combat, Can have Phalanx Units XWARLORD +10% in combat, Can have Legionary Units XARCHER Able to get ARCHER units. XCAVALRY Able to get CAVALRY & DRAGOONS units. XSAPPER Catapult/Siege Engines @ 1/2 price and 1/2 iron. 1/2 maint. XARMOR With CAVALRY, can get knights; -3 Move (4 Min), +20 Defense XAVIAN Use roc and griffon units. XMONSTER POWERS If the Orc Takeover option is implemented, then X All monsters have a chance to takeover ORC NPCs for jewels. XMINOR MONST Army 0 fights at +20%. Can have ORC units. (ORCS ONLY) XAVERAGE MONST Army 0 fights at +20% (above MI_MONST) Can have X Uruk Hai Units. (ORCS ONLY) XMAJOR MONST Army 0 fights at +20% per level (above MI_MONST) X Can have Troll Units. (ORCS ONLY) XEND X CIVILIAN TYPE POWERS X XDERVISH Desert/ICE sectors => 1 move point, vegetation 6, +30% combat in X XDERVDESG redesignate desert/ice sectors. XHIDDEN Nobody can count troops in your armies on map. XARCHITECT Double strength forts, Double Town revenue. XHEALER +2 repro to 10% limit. excess repro adds to defense. (Not ORCS). XMINER (DWARVES) 2x iron and jewel production XURBAN +3% Birth Rate to 12% limit. remainder gives + to move (roads) XBREEDER +3% Birth Rate (ORCS ONLY) (to 13% limit). -10% combat. (no urban) X BREEDER and URBAN powers are mutually exclusive. XSTEEL Additional 2x Iron Production for MINERS. XNINJA Can have Ninja units. Spys show enemy troop/civilian strength X exactly (even voids) XSAILOR 1/2 price naval units. Can use marines. +10% ramming. XDEMOCRACY +10% in combat (moralle) +1 Move +1 repro All units eat double. XROADS +4 to move if unit starts in your nation. XSLAVER you gain 25% of the populace of *any* sector you take over XEND X MAGICAL TYPE POWERS X XTHE_VOID Nobody can see your sectors/armies (appear blank) XKNOWALL Know all troop strengths and see the whole map (except voids) XDESTROYER Vegetation in 3 sectors of Capitol = Desert. Act as Dervish. XVAMPIRE 35% of troops killed become yours, -35% in all combat, -2 Move, X 1/4 cost for soldier maintenance, can't add to combat bonus X Vampire Power causes all nations to go to jihad with you. XSUMMON gives 4 spell pts per turn... can summon monsters with them X Can also do spell research. 100K Jewels and 1M gold gives X a 20% chance of gaining +1 spell point per turn XWYZARD Gives +3 spell points. Must have SUMMON Power XSORCERER Gives +3 spell points. Must have SUMMON Power XEND X SUMMONED MONSTERS X XMonsters can be summoned via the magic menu if you have the SUMMON power. XA monster unit represents one monster, but is the equivalent in combat of an Xarmy of the given number of men. When summoned, they appear in your Capitol, Xand are yours to command until you disband them or can not afford to pay Xtheir per/turn jewel cost *and* 5x that cost in gold. Monsters may be Xwounded in combat as can normal army units. Wounded monsters have a percent Xchance of dying based on the percent damage taken (a dragon (1000 men) taking X200 equivalent men of damage has a 20% chance of dying). Next turn, however Xits strength will be fully restored (1000 men again). X XSpell points are accumulated by having the SUMMON/WYZARD/SORCERER power. XSpell points can accumulate from turn to turn, but there is a 25% chance Xthat half your unused spell points dissappear each turn... Gives you some Xincentive to use them. XEND X SUMMONED MONSTER TYPES X X spell combat jewels power X points bonus move men turn prerequisites XSPIRIT 2 +0 x1 50 1000 XASSASSIN 2 +20 x1 50 400 NINJA XDJINNI 2 +10 x1.5 50 400 DERVISH XGARGOYLE 2 +10 x1 75 450 MI_MONST XWRAITH 2 +10 x1 75 450 VAMPIRE XHERO 2 +0 x1 100 200 WARRIOR XCENTAUR 2 +10 x1.5 50 200 XGIANT 5 +0 x1 150 2100 XSUPERHERO 5 +15 x1 150 450 WARLORD XMUMMY 5 +15 x1 150 1050 VAMPIRE XELEMENTAL 5 +5 x1.5 175 1925 SORCERER XMINOTAUR 5 +20 x1 150 2100 DESTROYER XDEMON 10 +50 x1 500 6000 DESTROYER XBALROG 10 +40 x1.5 500 6000 WIZARD & VAMPIRE XDRAGON 15 +50 x2 1000 10000 MA_MONST & WIZARD XEND X NOTES ON COMBAT X XLosses per unit are inversely proportional to a units combat bonus. X XYou can expect to take several turns to reduce a large army, especially X on a Town or Capitol. NPC defenders will draft new troops each turn X XThe only method to take an occupied Town or Capitol is to be the the only X army in the sector when the combat is *over*. X XTHE NEXT PAGE IS THE COMBAT RESULTS TABLE X basically the attacker wants a high roll and the defender wants low. XEND X 6-1 5-1 4-1 3-1 2-1 3-2 5-4 1-1 4-5 2-3 1-2 1-3 1-4 1-5 1-6 X <--010 20% 40% 50% 60% 70% 80% 90% 100%100%100%110%120%120%130%130% X 010-020 20% 30% 40% 50% 50% 60% 60% 90% 90% 90% 100%110%110%110%120% X 020-030 20% 20% 30% 40% 40% 40% 50% 60% 80% 80% 100%110%100%110%110% X 030-040 20% 20% 30% 30% 40% 40% 50% 60% 70% 80% 90% 100%100%100%110% X 040-050 20% 20% 30% 30% 40% 40% 50% 60% 70% 70% 80% 90% 90% 100%110% XD 050-060 15% 20% 20% 30% 40% 40% 40% 60% 70% 70% 80% 90% 90% 90% 100% XI 060-070 10% 20% 20% 20% 30% 30% 40% 50% 60% 60% 80% 90% 90% 90% 100% XE 070-080 10% 10% 20% 20% 30% 30% 30% 50% 60% 60% 80% 90% 90% 90% 90% X 080-090 10% 10% 20% 20% 20% 30% 30% 40% 50% 50% 70% 80% 80% 80% 90% XR 090-100 10% 10% 10% 20% 20% 30% 30% 40% 50% 50% 60% 80% 80% 80% 90% XO 100-110 5% 10% 10% 10% 20% 20% 30% 40% 50% 50% 60% 70% 70% 70% 80% XL 110-120 5% 5% 10% 10% 20% 20% 30% 40% 50% 50% 60% 70% 70% 70% 80% XL 120-130 5% 5% 10% 10% 10% 20% 30% 30% 40% 40% 50% 70% 70% 70% 80% X 130-140 5% 5% 5% 10% 10% 20% 30% 30% 40% 40% 50% 70% 70% 70% 70% X 140-150 5% 0% 5% 5% 10% 20% 30% 30% 40% 40% 50% 60% 60% 60% 70% X 150-160 0% 0% 5% 5% 10% 20% 30% 30% 40% 40% 50% 50% 50% 50% 50% X 160-170 0% 0% 0% 5% 10% 20% 30% 20% 40% 40% 50% 50% 50% 50% 50% X 170-180 0% 0% 0% 0% 5% 10% 20% 20% 30% 40% 40% 40% 40% 40% 40% X 180-190 0% 0% 0% 0% 5% 10% 10% 20% 20% 30% 30% 30% 30% 40% 40% X 190+++ 0% 0% 0% 0% 5% 10% 10% 10% 20% 20% 30% 30% 30% 30% 40% XEND X FINAL HINTS & OTHER COSTS X XIt is important to initially have a reprorate of 9-10% and a move of ~8-9. XYou need about 1000 military to start - to take enough new land. XTake as much land as possible in the beginning. XMake sure your combat bonus stays respectable. XDiplomacy with non player nations is important as it determines if you get X attacked or not. Bribing NPCs is a good way to get some breathing room. X You waste your money if you are at war with them that turn. X X OTHER COSTS X X Designation Costs: $XDESCOST X Designation to Towns/Capitol: 20x$XDESCOST+$XDESCOST IRON X Fortification: $XFORTCOST*(2**Fort Level) X Bribe Nation: $XBRIBE/level X Move Civilians: $50/civilian XEND X OTHER NOTES X X The computer can move for players if they dont enter a turn and the XCMOVE variable is set before the program is compiled. This works well... Xfor a time. The Computer will NOT redesignate captured sectors for you. X XMercenaries must be paid a discharge fee equal to enlistcost when disbanded. X XIf you have too many people in a given non Town, non capitol sector, Xreproduction and production is halved for them. If you have a huge X(>10,000,000) number of people in a sector, they will not reproduce. XEND X OPTIONS OF YOUR VERSION X X Maximum Number of Armies Per Nation....XMAXARM X Maximum Number of Navies Per Nation....XMAXNAVY X Absolute Maximum Number of Nations.....XMAXNTN X Percentage of Water in the World.......XPWATER X Starting Points to buy your nation.....XMAXPTS X Map Size is............................XMAPX by XMAPY X Percentage of land that is mountains...XPMOUNT X Storm Percentage.......................XPSTORM X Cost for Orc Npc Takeover..............XTAKEPRICE X Average Number of Random Events........XNORANDEVENTS X Chance of Volcano Eruption.............XPVULCAN X X Lizards XLZARD System V XSYSV X Monsters XMONSTER Npc Cheat XCHEAT X Storms XSTORMS Volcanos XVULCANIZE X Npc Nations XNPC PC Automove XCMOVE X Random Events XRANEVENT Orc Takeovers XORCTAKE X Super God XOGOD XEND X ADDITIONAL OPTIONS X X Land Vision Range is..................XLANDSEE X Navy Vision Range is..................XNAVYSEE X Army Vision Range is..................XARMYSEE X X Taxation Rates: X Food tax per value point per person...XTAXFOOD X Jewel tax per jewel point per person..XTAXGOLD X Iron tax per iron point per person....XTAXIRON X Town tax per person...................XTAXCITY X Capitol tax per person................XTAXCAP X X 100% chance per XTOMUCHMINED iron mined of deplete iron mines. X 100% chance per XTOMUCHMINED jewels mined of deplete gold mines. X XFINDPERCENT% chance that new materials are found in a sector. X Maximum Sector Population is XTOMANYPEOPLE. X Ships hold XSHIPHOLD men. XEND XDONE END_OF_help.txt if test 26815 -ne `wc -c <help.txt`; then echo shar: \"help.txt\" unpacked with wrong size! fi # end of overwriting check fi if test -f misc.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"misc.c\" else echo shar: Extracting \"misc.c\" \(26322 characters\) sed "s/^X//" >misc.c <<'END_OF_misc.c' X/* Conquer: Copyright (c) 1988 by Edward M Barlow */ X#include <ctype.h> X#include <stdio.h> X#include "header.h" X#include "data.h" X Xextern FILE *fnews; X Xextern char *HVegcost; Xextern char *OVegcost; Xextern char *EVegcost; Xextern char *DVegcost; Xextern char *HElecost; Xextern char *OElecost; Xextern char *EElecost; Xextern char *DElecost; X X#ifdef SYSV Xchar *memset(); X#endif X X#ifdef CONQUER Xint Xmove_file( from, to ) Xregister char *from; Xregister char *to; X{ X if( unlink( to ) < 0 ) { X fprintf( stderr, "unlink( %s ) failed \n", to ); X sleep( 2 ); X return( -1 ); X } X X if( link( from, to ) < 0 ) { X fprintf( stderr, "link( %s, %s ) failed \n", from, to ); X sleep( 2 ); X return( -1 ); X } X X if( unlink( from ) < 0 ) { X fprintf( stderr, "unlink( %s ) failed \n", from ); X sleep( 2 ); X return( -1 ); X } X X return( 0 ); X} /* move_file() */ X#endif CONQUER X Xint Xmax( a, b ) Xregister int a; Xregister int b; X{ X return( (a > b) ? a : b ); X} X Xint Xmin( a, b ) Xregister int a; Xregister int b; X{ X return( (a < b) ? a : b ); X} X Xvoid Xverify_ntn( __file__, __line__ ) Xchar __file__[]; Xint __line__; X{ X register struct 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->tiron < 0.0 ) { X fprintf( stderr, "file %s: line %d: nation[%d] iron = %ld\n", X __file__, __line__, country, nptr->tiron ); X nptr->tiron = 0.0; X } X X if( nptr->jewels < 0 ) { X fprintf( stderr, "file %s: line %d: nation[%d] jewels = %ld\n", X __file__, __line__, country, nptr->jewels ); X nptr->jewels = 0.0; X } X X for( i = 0; i < MAXARM; i++ ) { X a = &nptr->arm[i]; X if( a->sold < 0 ) { X fprintf( stderr, "file %s: line %d: nation[%d] army[%d] sold = %d\n", X __file__, __line__, country, i, nptr->arm[i].sold ); X nptr->arm[i].sold = 0; X } X if( a->xloc < 0 || a->xloc >= MAPX ) { X fprintf( stderr, "file %s: line %d: nation[%d] army[%d] xlocation = %d\n", X __file__, __line__, country, i, nptr->arm[i].xloc ); X nptr->arm[i].xloc = 0; X } X if( a->yloc < 0 || a->yloc >= MAPY ) { X fprintf( stderr, "file %s: line %d: nation[%d] army[%d] ylocation = %d\n", X __file__, __line__, country, i, nptr->arm[i].yloc ); X nptr->arm[i].yloc = 0; X } X } /* for */ X X for( i = 0; i < NTOTAL; i++ ) { X if( nptr->dstatus[i] > JIHAD ) { X fprintf( stderr, "file %s: line %d: nation[%d] diplomatic status with %d = %d\n", X __file__, __line__, country, i, nptr->dstatus[i] ); X nptr->dstatus[i] = WAR; X } X if( nptr->dstatus[i] < UNMET ) { X fprintf( stderr, "file %s: line %d: nation[%d] diplomatic status with %d = %d\n", X __file__, __line__, country, i, nptr->dstatus[i] ); X nptr->dstatus[i] = UNMET; X } X } /* for */ X } /* for */ X} /* verify_ntn() */ X Xvoid Xverify_sct( __file__, __line__ ) Xchar __file__[]; Xint __line__; X{ X register struct s_sector *sptr; X register int x, y; X X for( x = 0; x < MAPX; x++ ) { X for( y = 0; y < MAPX; y++ ) { X sptr = &sct[x][y]; X X if( sptr->people < 0 ) { X fprintf( stderr, "file %s: line %d: sct[%d][%d].people = %d\n", __file__, __line__, x, y, sptr->people ); X if( sptr->people < -1*BIG ) X sptr->people = BIG; X else sptr->people = 0; X } X X if( sptr->owner != 0 && sptr->altitude == WATER ) { X fprintf( stderr, "file %s: line %d: sct[%d][%d].owner = %s (a water sector)\n",__file__,__line__, x, y, ntn[sptr->owner].name ); X sptr->owner = 0; X } X if( sptr->fortress > 12 ){ X fprintf( stderr, "file %s: line %d: sct[%d][%d].fortress = %d \n",__file__,__line__, x, y, sptr->fortress ); X sptr->fortress = 12; X } X } /* for */ X } /* for */ X} /* verify_sct() */ X Xvoid Xverifydata( __file__, __line__ ) Xchar __file__[]; Xint __line__; X{ X /* check for invalid values */ X verify_ntn( __file__, __line__ ); X verify_sct( __file__, __line__ ); X}/* verifydata() */ X Xint Xget_number() X{ X char ch; X int done=FALSE,count=0,xpos,ypos; X int sum=0; X X /* this routine totally redone to allow deleting */ X while(!done) { X ch=getch(); X if (isdigit(ch) && count<12) { X /* only print numbers to the screen */ X addch(ch); X refresh(); X sum *= 10L; X count++; X sum += (long)(ch-'0'); X } X else if ((ch=='\b' || ch=='\177')&&(count)) X { X /* only delete what was printed */ X getyx(stdscr,ypos,xpos); X move(ypos,--xpos); X addch(' '); X move(ypos,xpos); X refresh(); X sum /= 10L; X count--; X } X else if (ch=='\n') { X done=TRUE; X } X } X return( sum ); X} X X#define INFINITE 1000 X Xint bx; /* distination 'x' coordinate */ Xint by; /* destination 'y' coordinate */ Xint moving_country; /* country that is moving */ X X#define MAX_MOVE_UNITS 0x7f Xunsigned char history_reachp[ MAPX ][ MAPY ]; X X#if 1 Xint level; X#endif X X/* X * land_2reachp() X */ X Xint Xland_2reachp( ax, ay, move_points ) Xint ax; Xint ay; Xint move_points; X{ X register int i = 0; X int delta_x, delta_y; X int x_abs_delta, y_abs_delta; X int own; X int dx[ 8 ]; X int dy[ 8 ]; X X delta_x = bx - ax; X delta_y = by - ay; X X /* Have we got where we are going? */ X if( delta_x == 0 && delta_y == 0 ) { X return( 1 ); X } X X /* Any move points left? (optimization) */ X if( move_points == 0 ) { X return( 0 ); X } X X x_abs_delta = (delta_x < 0) ? -delta_x : delta_x; X y_abs_delta = (delta_y < 0) ? -delta_y : delta_y; X X /* couldn't reach if all moves cost 1 (optimization) */ X if( max( x_abs_delta, y_abs_delta ) > move_points ) { X return( 0 ); X } X X { X register int inc_x; X register int inc_y; X X inc_x = (delta_x < 0 ) ? -1 : 1; X inc_y = (delta_y < 0 ) ? -1 : 1; X X /*I HAVE CHANGED THIS CODE FROM THE ORIGINAL TO OPTIMIZE IT*/ X /*I think it should work well*/ X if( y_abs_delta == 0) { X /* try 'x' movements first */ X dx[i] = inc_x; dy[i++] = 0; X dx[i] = inc_x; dy[i++] = inc_y; X dx[i] = inc_x; dy[i++] = -inc_y; X dx[i] = 0; dy[i++] = inc_y; X dx[i] = 0; dy[i++] = -inc_y; X dx[i] = -inc_x; dy[i++] = inc_y; X dx[i] = -inc_x; dy[i++] = 0; X dx[i] = -inc_x; dy[i++] = -inc_y; X } else if( x_abs_delta == 0 ) { X /* try 'y' movements first */ X dx[i] = 0; dy[i++] = inc_y; X dx[i] = inc_x; dy[i++] = inc_y; X dx[i] = -inc_x; dy[i++] = inc_y; X dx[i] = inc_x; dy[i++] = 0; X dx[i] = -inc_x; dy[i++] = 0; X dx[i] = inc_x; dy[i++] = -inc_y; X dx[i] = 0; dy[i++] = -inc_y; X dx[i] = -inc_x; dy[i++] = -inc_y; X } else { /* x_abs_delta != 0, 0 != y_abs_delta */ X /* try diagonal movements first */ X dx[i] = inc_x; dy[i++] = inc_y; X X dx[i] = 0; dy[i++] = inc_y; X dx[i] = inc_x; dy[i++] = 0; X X dx[i] = -inc_x; dy[i++] = inc_y; X dx[i] = inc_x; dy[i++] = -inc_y; X X dx[i] = -inc_x; dy[i++] = 0; X dx[i] = 0; dy[i++] = -inc_y; X X dx[i] = -inc_x; dy[i++] = -inc_y; X } /* if */ X } /* block */ X X { X register int x, y; X register int new_mp; X X for( i = 0; i < 8; i++ ) { X if( (x = ax + dx[i]) < 0 || x >= MAPX ) X continue; X if( (y = ay + dy[i]) < 0 || y >= MAPY ) X continue; X X if( sct[x][y].altitude == PEAK) X continue; X if( sct[x][y].altitude == WATER) X continue; X X new_mp = move_points - movecost[ x ][ y ]; X if( new_mp < 0 ) X continue; X X /* X * If we have been to this sector before X * in fewer move points this path is not X * going to do any better. X */ X if( history_reachp[x][y] >= new_mp ) { X continue; X } X history_reachp[x][y] = new_mp; X X /* X * Test for a hostile army X */ X /* BUG: should engage if army is hostile but does not own sector */ X /* BUG: take into account THE_VOID, HIDDEN, and NINJA */ X /* BUG: NEUTRAL does not allow to pass */ X if( (own = sct[x][y].owner) > 0 && X ntn[own].dstatus[moving_country] >= WAR && X x != bx && y != by && X solds_in_sector( x, y, own ) > 0 ) { X continue; /* at war with the owner, may not pass */ X } X X level++; X if( land_2reachp( x, y, new_mp ) ) { X level--; X return( 1 ); X } /* if */ X level--; X } /* for */ X } /* block */ X return( 0 ); X} /* land_2reachp() */ X X/* X * land_reachp() X */ X#ifdef ADMIN Xint Xland_reachp( ax, ay, gx, gy, move_points, movee ) Xint ax; Xint ay; Xint gx; Xint gy; Xint move_points; Xint movee; X{ X int result; X X if( move_points >= MAX_MOVE_UNITS ) { X fprintf( stderr, "land_reachp(): move_points = %d\n", X move_points ); X X abrt(); X } X X /* Are we starting or ending in the water or on a peak? */ X if( sct[ax][ay].altitude == WATER || sct[ax][ay].altitude == PEAK ) X return( 0 ); X if( sct[gx][gy].altitude == WATER || sct[gx][gy].altitude == PEAK ) X return( 0 ); X X#ifdef SYSV X memset( history_reachp, 0, sizeof(history_reachp) ); X#else X bzero((char *) history_reachp,sizeof(history_reachp)); X#endif X X history_reachp[ax][ay] = move_points; X X bx = gx; X by = gy; X moving_country = movee; X X level = 1; X result = land_2reachp( ax, ay, move_points ); X return( result ); X} /* land_reachp() */ X#endif ADMIN X#ifdef ADMIN X/* X * water_2reachp() X */ X Xint Xwater_2reachp( ax, ay, move_points ) Xint ax; Xint ay; Xint move_points; X{ X register int i = 0; X int delta_x; X int delta_y; X int dx[ 8 ]; X int dy[ 8 ]; X X /* this path uses too many move units */ X if( move_points < 0 ) X return( 0 ); X X /* X * If we have been to this sector before in fewer move points X * this path is not going to do any better. X */ X if( history_reachp[ ax ][ ay ] <= move_points ) X return( 0 ); X X history_reachp[ ax ][ ay ] = move_points; X X delta_x = ax - bx; X delta_y = ay - by; X X /* Have we got where we are going? */ X if( delta_x == 0 && delta_y == 0 ) X return( 1 ); X X /* Have we run into ground, but not reached our destination? */ X if( sct[ax][ay].altitude != WATER ) X return( 0 ); X X /* Any move points left? (optimization) */ X if( move_points == 0 ) X return( 0 ); X X /* couldn't reach if all moves cost 1 (optimization) */ X if( max( abs( delta_x ), abs( delta_y ) ) > move_points ) X return( 0 ); X X /* BUG: test for an enemy navy */ X X { X register int inc_x; X register int inc_y; X X inc_x = (delta_x < 0 ) ? -1 : (delta_x > 0) ? 1 : 0; X inc_y = (delta_y < 0 ) ? -1 : (delta_y > 0) ? 1 : 0; X X if( abs(delta_x) > abs(delta_y) ) { X /* try 'x' movements first */ X dx[i] = inc_x; dy[i++] = 0; X dx[i] = inc_x; dy[i++] = inc_y; X dx[i] = inc_x; dy[i++] = -inc_y; X dx[i] = 0; dy[i++] = inc_y; X dx[i] = 0; dy[i++] = -inc_y; X dx[i] = -inc_x; dy[i++] = inc_y; X dx[i] = -inc_x; dy[i++] = 0; X dx[i] = -inc_x; dy[i++] = -inc_y; X } else { /* abs(delta_x) < abs(delta_y) */ X /* try 'y' movements first */ X dx[i] = 0; dy[i++] = inc_y; X dx[i] = inc_x; dy[i++] = inc_y; X dx[i] = -inc_x; dy[i++] = inc_y; X dx[i] = inc_x; dy[i++] = 0; X dx[i] = -inc_x; dy[i++] = 0; X dx[i] = inc_x; dy[i++] = -inc_y; X dx[i] = 0; dy[i++] = -inc_y; X dx[i] = -inc_x; dy[i++] = -inc_y; X } /* if */ X } /* block */ X X { X register int x, y; X register int new_mp; X X for( i = 0; i < 8; i++ ) { X if( (x = ax + dx[i]) < 0 || x >= MAPX ) X continue; X if( (y = ay + dy[i]) < 0 || y >= MAPY ) X continue; X X new_mp = move_points - 1; X if( new_mp < 0 ) X continue; X X if( water_2reachp( x, y, new_mp ) ) X return( 1 ); X } /* for */ X } /* block */ X X return( 0 ); X} /* water_2reachp() */ X#endif ADMIN X#ifdef 0 X/* X * water_reachp() X */ X Xint Xwater_reachp( ax, ay, gx, gy, move_points, movee ) Xint ax; Xint ay; Xint gx; Xint gy; Xint move_points; Xint movee; X{ X if( move_points >= MAX_MOVE_UNITS ) { X fprintf( stderr, "water_reachp(): move_points = %d\n", X move_points ); X X abrt(); X } X X#ifdef SYSV X memset(history_reachp, MAX_MOVE_UNITS, sizeof(history_reachp)); X#else X { register int i,j; X for (i=0; i < MAPX ; i++) X for (j=0; j < MAPY ; j++ ) X history_reachp [i] [j] = MAX_MOVE_UNITS ; X }/* eof memset replacement block */ X#endif X X history_reachp[ ax ][ ay ] = 0; X X bx = gx; X by = gy; X moving_country = movee; X X return( water_2reachp( ax, ay, move_points ) ); X} /* water_reachp() */ X#endif 0 X X/* X * solds_in_sector() X */ X Xint Xsolds_in_sector( x, y, country ) Xint x; Xint y; Xint country; X{ X register struct nation *nptr = &ntn[country]; X register int j; X register int total = 0; X X for( j = 0; j < MAXARM; j++ ) { X if( nptr->arm[j].sold == 0 ) X continue; X X if( nptr->arm[j].xloc == x && nptr->arm[j].yloc == y ) X total += nptr->arm[j].sold; X } X X return( total ); X} /* solds_in_sector() */ X#ifdef ADMIN X/* X * score_one() X */ X Xstruct wght { X int sectors; X int civilians; X int soldiers; X int gold; X int jewels; X int iron; X int magics; X int ships; X} weights[] = { X/* Per 2 1000 1000 100K 100K 100K Magic 10 */ X/* Races Sector People Soldiers Gold Jewels Iron Power Ship */ X/* NPC */ { 2, 1, 0, 0, 1, 1, 1, 0 }, X/* kingdom */ { 2, 1, 2, 3, 0, 0, 0, 0 }, X/* empire */ { 3, 0, 0, 0, 0, 0, 0, 0 }, X/* wizard */ { 0, 2, 1, 0, 3, 5, 20, 0 }, X/* theocracy */ { 2, 1, 0, 0, 3, 0, 7, 0 }, X/* pirate */ { 0, 0, 5, 0, 10, 10, 1, 5 }, X/* trader */ { 2, 1, 0, 0, 1, 1, 1, 8 }, X/* warlord */ { 2, 1, 2, 0, 1, 1, 1, 0 }, X/* demon */ { 2, 0, 1, 0, 1, 0, 10, 0 }, X/* dragon */ { 0, 0, 0, 10, 20, 0, 0, 0 }, X/* shadow */ { 2, 0, 0, 0, 0, 5, 0, 0 }, X/* miner */ { 0, 0, 5, 0, 10, 10, 1, 5 }, X}; X Xlong Xscore_one( country ) Xint country; X{ X register struct nation *nptr = &ntn[ country ]; X register long total = 0; X register struct wght *wght = &weights[ nptr-> class ]; X X total += wght->sectors * nptr->tsctrs / 2; X total += wght->civilians * nptr->tciv / 1000; X total += wght->soldiers * nptr->tmil / 1000; X if(nptr->tgold > 0 ) total += wght->gold * nptr->tgold / 100000; X total += wght->jewels * nptr->jewels / 100000; X total += wght->iron * nptr->tiron / 100000; X total += wght->magics * num_powers(country,M_MIL); X total += wght->magics * num_powers(country,M_CIV); X total += wght->magics * num_powers(country,M_MGK); X total += wght->ships * nptr->tships / 10; X X return( total ); X} /* score_one() */ X#endif ADMIN X/* X * print_accum() X */ X X /* max number of print_accum() calls in one printf() */ X#define MAX_BUFFER 4 X#define BUFFER_SIZE 20 X X/* X * is_habitable() X */ X Xint Xis_habitable( x, y ) Xint x; Xint y; X{ X if( sct[x][y].altitude==WATER ) return( 0 ); X if( sct[x][y].altitude==PEAK ) return( 0 ); X X if( tofood( sct[x][y].vegetation,sct[x][y].owner ) < DESFOOD) return(0); X X return( 1 ); X} X X#ifdef CONQUER Xint Xunits_in_sector(x,y,country) Xint x; Xint y; X{ Xint count=0; Xint armynum, nvynum; Xfor(armynum=0;armynum<MAXARM;armynum++) X if((ASOLD>0)&&(AXLOC==x)&&(AYLOC==y)) count++; Xfor(nvynum=0;nvynum<MAXNAVY;nvynum++) X if(((NWAR+NMER)!=0)&&(NXLOC==x)&&(NYLOC==y)) count++; Xreturn(count); X} X#endif CONQUER X Xint Xnum_powers(country,type) Xint country,type; X{ Xint count_magic=0; Xint try; Xlong start, end; Xswitch(type){ X case M_MGK: X start=S_MGK; X end=E_MGK; X break; X case M_CIV: X start=S_CIV; X end=E_CIV; X break; X case M_MIL: X start=S_MIL; X end=E_MIL; X break; X default: X printf("fatal error in num_powers"); X abrt(); X} Xfor( try = start; try < start+end; try++ ) X if( magic(country, powers[try] ) == 1 ) count_magic++; Xreturn(count_magic); X} X X/* returns food value of sector */ X/* 4 is limit of livable land */ Xtofood(vegetation,cntry) Xint cntry; Xregister char vegetation; X{ X int i=0; X int foodvalue; X#ifdef DERVDESG X if ((magic(cntry,DERVISH)||magic(cntry,DESTROYER)) X &&(vegetation==DESERT || vegetation==ICE)) return(6); X#endif DERVDESG X while( vegetation != *(veg+i) ) { X if( *(veg+i) == '0') break; X else i++; X } X foodvalue = *(vegfood+i); X if(ntn[cntry].race == ELF){ X if(vegetation == FOREST) foodvalue++; X else if(vegetation == BARREN) foodvalue--; X } X return( foodvalue ); X} X X/*jewel cost for civilian power = Base * 2**( #mgk/2 + #civ + #mil/2 ) */ X/*race magical civilian military */ X/* elves - 50K 50K 50K */ X/* dwarves - 80K 40K 40K */ X/* humans - 100K 25K 50K */ X/* orcs - 100K 50K 25K */ X X/* returns cost of magic power - returns -1 if invalid */ Xlong Xgetmgkcost(type,country) Xint type, country; X{ X int i; X long cost; X long base=50000L; X int npowers; X switch(type) { X case M_MGK: X if(ntn[country].race==DWARF) base=80000L; X else if(ntn[country].race==HUMAN) base=100000L; X else if(ntn[country].race==ORC) base=100000L; X npowers=num_powers(country,M_CIV)+num_powers(country,M_MIL)+1 X +2*num_powers(country,M_MGK); X npowers/=2; X break; X case M_CIV: X if(ntn[country].race==DWARF) base=40000L; X else if(ntn[country].race==HUMAN) base=25000L; X npowers=num_powers(country,M_MGK)+num_powers(country,M_MIL)+1 X +2*num_powers(country,M_CIV); X npowers/=2; X break; X case M_MIL: X if(ntn[country].race==DWARF) base=40000L; X else if(ntn[country].race==ORC) base=25000L; X npowers=num_powers(country,M_CIV)+num_powers(country,M_MGK)+1 X +2*num_powers(country,M_MIL); X npowers/=2; X break; X default: X return(-1); X } X cost = base; X for (i=1; i<npowers; i++) { X cost <<= 1; X if (cost > BIG) X return(BIG/2L); X } X return(cost); X} X Xint Xtodigit(character) Xregister int character; X{ X if( character >= '0' && character <= '9' ) X return( character - '0' ); X return( -1 ); X} X Xvoid Xprep(country) Xint country; X{ X short armynum,nvynum; X int save,i,j; X X /*set occ to 0*/ X for(i=0;i<MAPX;i++) for(j=0;j<MAPY;j++) occ[i][j]=0; X X save=country; X /*set occ to country of occupant army*/ X for(country=0;country<NTOTAL;country++) if(ntn[country].active!=0) { X for(armynum=0;armynum<MAXARM;armynum++){ X if((ASOLD>0)&&(ASTAT!=SCOUT)){ X if((occ[AXLOC][AYLOC]== 0) X ||(occ[AXLOC][AYLOC]== country)) X occ[AXLOC][AYLOC]= country; X else occ[AXLOC][AYLOC]= MAXNTN+5; X } X } X for(nvynum=0;nvynum<MAXNAVY;nvynum++){ X if(NWAR+NMER>0){ X if((occ[NXLOC][NYLOC]== 0) X ||(occ[NXLOC][NYLOC]== country)) X occ[NXLOC][NYLOC]= country; X else occ[NXLOC][NYLOC]= MAXNTN+5; X } X } X } X country=save; X} X X/*destroy nation--special case if capitol not owned by other nation*/ Xvoid Xdestroy(country) Xint country; X{ X short armynum, nvynum; X int i, x, y; X fprintf(fnews,"1.\tDESTROY NATION %s",ntn[country].name); X if(country!=sct[ntn[country].capx][ntn[country].capy].owner){ X fprintf(fnews,"\t(their capitol is owned by %s)\n",ntn[sct[ntn[country].capx][ntn[country].capy].owner].name); X /*get +5% to combat skill*/ X ntn[sct[ntn[country].capx][ntn[country].capy].owner].aplus+=5; X } X else fprintf(fnews,"\t(they own their capitol)\n"); X X ntn[country].active=0; X for(armynum=0;armynum<MAXARM;armynum++) if(ASOLD>0) { X if(ntn[sct[AXLOC][AYLOC].owner].race==ntn[country].race) X sct[AXLOC][AYLOC].people+=ASOLD; X ASOLD=0; X } X for(nvynum=0;nvynum<MAXNAVY;nvynum++) { X NMER=0; X NWAR=0; X } X for(i=0;i<MAXNTN;i++) { X ntn[i].dstatus[country]=UNMET; X ntn[country].dstatus[i]=UNMET; X } X X /*if take them you get their gold*/ X if(country!=sct[ntn[country].capx][ntn[country].capy].owner){ X if(ntn[country].tgold>0) ntn[sct[ntn[country].capx][ntn[country].capy].owner].tgold+=ntn[country].tgold; X if(ntn[country].jewels>0) ntn[sct[ntn[country].capx][ntn[country].capy].owner].jewels+=ntn[country].jewels; X if(ntn[country].tiron>0) ntn[sct[ntn[country].capx][ntn[country].capy].owner].tiron+=ntn[country].tiron; X if(ntn[country].tfood>0) ntn[sct[ntn[country].capx][ntn[country].capy].owner].tfood+=ntn[country].tfood; X } X X /*if god destroys then kill all population*/ X if(country==sct[ntn[country].capx][ntn[country].capy].owner){ X for(x=0;x<MAPX;x++) for(y=0;y<MAPY;y++) X if(sct[x][y].owner==country) { X sct[x][y].people=0; X sct[x][y].owner=0; X if(tofood(sct[x][y].vegetation,0)>=DESFOOD) X sct[x][y].designation=DNODESIG; X#ifdef DERVDESG X if((sct[x][y].vegetation==DESERT) X ||(sct[x][y].vegetation==ICE)) X sct[x][y].designation=sct[x][y].vegetation; X#endif DERVDESG X } X } X /*slowly take over and all people flee*/ X else if(ntn[sct[ntn[country].capx][ntn[country].capy].owner].race!=ntn[country].race){ X for(x=0;x<MAPX;x++) for(y=0;y<MAPY;y++) X if(sct[x][y].owner==country) { X /*all kinds of refugees to neighboring countries*/ X flee(x,y,1,0); X sct[x][y].people=0; X sct[x][y].owner=0; X if(tofood(sct[x][y].vegetation,0)>=DESFOOD) X sct[x][y].designation=DNODESIG; X#ifdef DERVDESG X if((sct[x][y].vegetation==DESERT) X ||(sct[x][y].vegetation==ICE)) X sct[x][y].designation=sct[x][y].vegetation; X#endif DERVDESG X } X } X /*else same race, so give all land to conqueror*/ X else { X for(x=0;x<MAPX;x++) for(y=0;y<MAPY;y++) X if(sct[x][y].owner==country){ X sct[x][y].owner=sct[ntn[country].capx][ntn[country].capy].owner; X if(tofood(sct[x][y].vegetation,0)>=DESFOOD) X sct[x][y].designation=DNODESIG; X#ifdef DERVDESG X if((sct[x][y].vegetation==DESERT) X ||(sct[x][y].vegetation==ICE)) X sct[x][y].designation=sct[x][y].vegetation; X#endif DERVDESG X } X } X return; X} X X#define ALPHA_SIZE 128 X X/*movecost contains movement cost unless water -1 or unenterable land (-2)*/ X/* if water and not ajacent to land will cost -4*/ Xvoid Xupdmove(race,country) Xint country; Xchar race; X{ X register struct s_sector *sptr; X register int i,j; X int x,y; X short veg_cost[ ALPHA_SIZE ]; X short ele_cost[ ALPHA_SIZE ]; X X for( j = 0; j < ALPHA_SIZE; j++ ) X veg_cost[j] = ele_cost[j] = -1; X X for( j = 0; veg[j] != '0'; j++ ) { X switch( race ) { X case ELF: X veg_cost[ veg[j] ] = todigit( EVegcost[j] ); X break; X case DWARF: X veg_cost[ veg[j] ] = todigit( DVegcost[j] ); X break; X case ORC: X veg_cost[ veg[j] ] = todigit( OVegcost[j] ); X break; X case HUMAN: X default: X veg_cost[ veg[j] ] = todigit( HVegcost[j] ); X break; X } /* switch */ X } /* for */ X X for( j = 0; ele[j] != '0'; j++ ) { X switch( race ) { X case ELF: X ele_cost[ ele[j] ] = todigit( EElecost[j] ); X break; X case DWARF: X ele_cost[ ele[j] ] = todigit( DElecost[j] ); X break; X case ORC: X ele_cost[ ele[j] ] = todigit( OElecost[j] ); X break; X case HUMAN: X default: X ele_cost[ ele[j] ] = todigit( HElecost[j] ); X break; X } /* switch */ X } /* for */ X X for(x=0;x<MAPX;x++) for(y=0;y<MAPX;y++){ X sptr = &sct[x][y]; X X if(race==GOD) movecost[x][y] = 0; X else X if(sptr->altitude==WATER) { X movecost[x][y] = -4; X for(i=x-1;i<=x+1;i++) for(j=y-1;j<=y+1;j++) X if( i>=0 && j>=0 && i<MAPX && j<MAPY) X if( sct[i][j].altitude != WATER) X movecost[x][y] = -1; X } else X if(((magic(country,DERVISH)==1) X ||(magic(country,DESTROYER)==1)) X &&((sptr->vegetation==ICE) X ||(sptr->vegetation==DESERT))) { X movecost[x][y] = 1; X } else { X if( veg_cost[ sptr->vegetation ] == -1 X || ele_cost[ sptr->altitude ] == -1 ) X movecost[x][y] = -2; X else X movecost[x][y] = veg_cost[ sptr->vegetation ] + ele_cost[ sptr->altitude ]; X } /* if */ X } /* for */ X} /* updmove() */ X Xspreadsheet(nation) Xint nation; X{ X register struct s_sector *sptr; X register struct nation *nptr; X long product; X long city_pop, cap_pop; X int x,y; X X nptr = &ntn[ nation ]; X X spread.revfood = spread.revjewels = spread.reviron = spread.revcap = spread.revcity = 0L; X spread.incity = spread.incap = spread.ingold = spread.infarm = spread.iniron = 0; X spread.food = nptr->tfood; X spread.gold = nptr->tgold; X spread.iron = nptr->tiron; X spread.jewels = nptr->jewels; X spread.sectors = 0; X spread.civilians = 0; X X for(x=0;x<MAPX;x++) for(y=0;y<MAPY;y++) { X sptr = &sct[x][y]; X if(sptr->owner!=nation) continue; X X /*update nation file for owner*/ X spread.sectors++; X spread.civilians += sptr->people; X X /*PRODUCE*/ X /*increase tmin based on mined stuff...*/ X if(sptr->designation==DMINE) { X spread.iniron += sptr->people; X product = sptr->iron * (long) sptr->people; X if(sptr->people>TOMANYPEOPLE) product/=2; X if(magic(sptr->owner,MINER)==1) product*=2; X if(magic(sptr->owner,STEEL)==1) product*=2; X spread.iron += product; X spread.reviron += product*TAXIRON/100L; X } X /*harvest food*/ X else if(sptr->designation==DFARM) { X spread.infarm += sptr->people; X product= (long)tofood(sptr->vegetation,sptr->owner) * (long) sptr->people; X if(sptr->people>TOMANYPEOPLE) product/=2; X X spread.food += product; X spread.revfood += product*TAXFOOD/100L; X } X /*gold mines produce gold*/ X else if(sptr->designation==DGOLDMINE) { X spread.ingold += sptr->people; X product = sptr->gold * (long) sptr->people; X X if(sptr->people>TOMANYPEOPLE) product/=2; X X if(magic(sptr->owner,MINER)==1) product*=2; X X spread.jewels += product; X spread.revjewels += product*TAXGOLD/100L; X } X else if(sptr->designation==DCAPITOL) { X /* it had better be your capitol */ X if((x!=nptr->capx)&&(y!=nptr->capy)) { X if(sct[nptr->capx][nptr->capy].designation != DCAPITOL){ X nptr->capx=x; X nptr->capy=y; X cap_pop = sptr->people; X city_pop = 0; X } else { X cap_pop = 0; X city_pop = sptr->people; X printf("changing %d %d to a town",x,y); X sptr->designation = DCITY; X } X } else { X city_pop = 0; X cap_pop = sptr->people; X } X spread.incap += cap_pop; X spread.incity += city_pop; X X if( magic(sptr->owner, ARCHITECT ) ) { X city_pop *= 2L; X cap_pop *= 2L; X } X X spread.revcity += city_pop * TAXCITY / 100L; X spread.revcap += cap_pop * TAXCAP / 100L; X } X else if(sptr->designation==DCITY) { X spread.incity += sptr->people; X city_pop = sptr->people; X if( magic(sptr->owner, ARCHITECT ) ) X city_pop *= 2L; X spread.gold += city_pop * TAXCITY / 100L; X spread.revcity += city_pop * TAXCITY / 100L; X } X#ifndef DERVDESG X else if(((magic(sptr->owner,DERVISH)==1) X ||(magic(sptr->owner,DESTROYER)==1)) X &&((sptr->vegetation==ICE) ||(sptr->vegetation==DESERT)) X &&(sptr->people>0)) { X product= 6L * sptr->people; X spread.food += product; X spread.revfood += product*TAXFOOD/100L; X } X#endif DERVDESG X } X spread.gold += spread.revfood + spread.revjewels + spread.reviron + spread.revcity + spread.revcap; X} X X#ifdef CONQUER X X/* string inputing routine to allow deleting */ Xget_nname(str) Xchar str[]; X{ X char ch; X int done=0,count=0,maxsize,xpos,ypos; X X maxsize=12; /* nation name input size */ X while(!done) { X ch=getch(); X if (isprint(ch)) { X if (count<maxsize) { X /* only input displayable characters */ X addch(ch); X refresh(); X str[count++] = ch; X } X } X else if ((ch=='\b' || ch=='\177')&&(count)) X { X /* only delete what was printed */ X getyx(stdscr,ypos,xpos); X move(ypos,--xpos); X addch(' '); X move(ypos,xpos); X refresh(); X count--; X } else if (ch=='\n') { X done=1; X } X } X str[count++] = '\0'; X return(count); X} X#endif CONQUER END_OF_misc.c if test 26322 -ne `wc -c <misc.c`; then echo shar: \"misc.c\" unpacked with wrong size! fi # end of overwriting check fi echo shar: End of archive 3 \(of 8\). cp /dev/null ark3isdone MISSING="" for I in 1 2 3 4 5 6 7 8 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 8 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0