billr@saab.CNA.TEK.COM (Bill Randle) (06/24/89)
Submitted-by: adb@bu-it.bu.edu (Adam Bryant)
Posting-number: Volume 6, Issue 90
Archive-name: conquer4/Part08
Superseeds: conquer3; Volume 4, Issue 42-49
#! /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 8 (of 14)."
# Contents: data.h magic.c
# Wrapped by billr@saab on Thu Jun 15 15:20:16 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'data.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'data.h'\"
else
echo shar: Extracting \"'data.h'\" \(31789 characters\)
sed "s/^X//" >'data.h' <<'END_OF_FILE'
X/* conquer : Copyright (c) 1988 by Ed Barlow. */
X
X/*--------I DO NOT BELIEVE IT IS NECESSARY TO ALTER THIS FILE----------------*/
X#define FAIL 1 /* fail return to shell */
X#define SUCCESS 0 /* successful return to shell */
X#define BIG 500000000L /* BIGGER THAN ANYTHING SHOULD BE */
X /* this is used to protect against overflow */
X#define SCRARM ((LINES-14)/2) /* number of armies to fit on screen */
X
Xextern char *strcpy(),*strncpy(),*strcat(),*strncat();
X
X#include <stdio.h>
X#include <curses.h>
X
X/* sometimes curses.h defines TRUE */
X#ifndef TRUE
X#define TRUE 1
X#define FALSE 0
X#endif
X
X#define SCREEN_X_SIZE (( COLS - 21) / 2) /* divide by two as only 1/2
X sectors will be shown */
X#define SCREEN_Y_SIZE ( LINES - 5 )
X#define HAS_SEEN(x,y) hasseen[(x)+((y)*((COLS-10)/2))]
X#define PASSLTH 7 /*one less than the characters in the password*/
X#define NAMELTH 9 /*one less than the characters in the name*/
X#define LEADERLTH 9 /*one less than the characters in the leader*/
X
X/*simple contour map definitions*/
X#define WATER (*(ele+0))
X#define PEAK (*(ele+1))
X#define MOUNTAIN (*(ele+2))
X#define HILL (*(ele+3))
X#define CLEAR (*(ele+4))
X
X/*racial types*/
X#define GOD '-'
X#define ORC 'O'
X#define ELF 'E'
X#define DWARF 'D'
X#define LIZARD 'L'
X#define HUMAN 'H'
X#define PIRATE 'P'
X#define BARBARIAN 'B'
X#define NOMAD 'N'
X#define TUNKNOWN '?'
X
X/*designations*/
X#define DTOWN (*(des+0))
X#define DCITY (*(des+1))
X#define DMINE (*(des+2))
X#define DFARM (*(des+3))
X#define DDEVASTATED (*(des+4))
X#define DGOLDMINE (*(des+5))
X#define DFORT (*(des+6))
X#define DRUIN (*(des+7))
X#define DSTOCKADE (*(des+8))
X#define DCAPITOL (*(des+9))
X#define DSPECIAL (*(des+10))
X#define DLUMBERYD (*(des+11))
X#define DBLKSMITH (*(des+12))
X#define DROAD (*(des+13))
X#define DMILL (*(des+14))
X#define DGRANARY (*(des+15))
X#define DCHURCH (*(des+16))
X#define DUNIVERSITY (*(des+17))
X#define DNODESIG (*(des+18))
X#define DBASECAMP (*(des+19))
X
X/* nation placement variables */
X#define GREAT 'G'
X#define FAIR 'F'
X#define RANDOM 'R'
X#define OOPS 'X'
X
X/*vegetation types -- these are legal in designations too*/
X#define VOLCANO (*(veg+0))
X#define DESERT (*(veg+1))
X#define TUNDRA (*(veg+2))
X#define BARREN (*(veg+3))
X#define LT_VEG (*(veg+4))
X#define GOOD (*(veg+5))
X#define WOOD (*(veg+6))
X#define FOREST (*(veg+7))
X#define JUNGLE (*(veg+8))
X#define SWAMP (*(veg+9))
X#define ICE (*(veg+10))
X#define NONE (*(veg+11))
X
X/*Diplomacy Variables*/
X#define JIHAD 7
X#define WAR 6
X#define HOSTILE 5
X#define NEUTRAL 4
X#define FRIENDLY 3
X#define ALLIED 2
X#define TREATY 1
X#define UNMET 0
X
X#define BREAKJIHAD 200000L /* $ cost to break confederacy or jihad */
X
X/*army status*/
X#define MARCH 1 /*March */
X#define SCOUT 2 /*Scouting--will not engage enemy if possible*/
X#define GARRISON 3 /*Garrison--for a town or Capitol */
X#define TRADED 4 /*Indicates an army that has been traded*/
X#define MILITIA 5 /*Unit is a militia unit */
X#define FLIGHT 6 /*Indicates army is flying*/
X#define DEFEND 7 /*Defend */
X#define MAGDEF 8 /*Magically enhanced defend mode*/
X#define ATTACK 9 /*Attack anybody (Hostile+) within 2 sectors*/
X#define MAGATT 10 /*Magically enhanced attack mode*/
X#define GENERAL 11 /* group leader !!! */
X#define SORTIE 12 /*Quick attack from a city */
X#define SIEGE 13 /*Set siege on a city */
X#define SIEGED 14 /*Unit under siege */
X#define ONBOARD 15 /*On board a fleet */
X#define RULE 16 /*Nation leader status for capitol */
X#define NUMSTATUS 17 /* number of possible stats */
X /* Army groups are implemented in the army
X status vbl. if >= NUMSTATUS, you belong to
X army group x-NUMSTATUS - army groups always
X of status attack and may not be magicked */
X
X/*seasonal definitions */
X#define TURN world.turn /* game turn */
X#define SEASON(x) ((x)%4)
X#define PSEASON(x) seasonstr[((x)%4)]
X#define YEAR(x) ((int)((x+3)/4))
X#define WINTER 0
X#define SPRING 1
X#define SUMMER 2
X#define FALL 3
X
X/* definitions for compass directions */
X#define CENTERED 0
X#define NORTH 1
X#define NORTHEAST 2
X#define EAST 3
X#define SOUTHEAST 4
X#define SOUTH 5
X#define SOUTHWEST 6
X#define WEST 7
X#define NORTHWEST 8
X
Xstruct s_world
X{
X short mapx,mapy; /* size of world */
X short nations; /* number of actual nations */
X short othrntns; /* god, lizard... */
X short turn; /* game turn */
X long m_mil; /* number of mercs available */
X short m_aplus; /* mercenary attack bonus */
X short m_dplus; /* mercenary defence bonus */
X long w_jewels; /* jewels in world */
X long w_gold; /* gold talons in world */
X long w_food; /* food in world */
X long w_metal; /* metal in world */
X long w_civ; /* world population */
X long w_mil; /* world military */
X long w_sctrs; /* owned sectors in world */
X long score; /* world score total */
X};
X
X#define MAPX world.mapx
X#define MAPY world.mapy
X#define MERCMEN world.m_mil
X#define MERCATT world.m_aplus
X#define MERCDEF world.m_dplus
X#define WORLDJEWELS world.w_jewels
X#define WORLDGOLD world.w_gold
X#define WORLDMETAL world.w_metal
X#define WORLDFOOD world.w_food
X#define WORLDSCORE world.score
X#define WORLDCIV world.w_civ
X#define WORLDSCT world.w_sctrs
X#define WORLDMIL world.w_mil
X#define WORLDNTN world.nations
X
Xstruct s_sector
X{
X char designation; /* designation of sector */
X char altitude; /* sector altitude */
X char vegetation; /* sector vegetation */
X char owner; /* nation id of owner */
X long people; /* civilians in sector */
X short i_people; /* initial civilians in sector */
X unsigned char jewels; /* jewel production ability */
X unsigned char fortress; /* fortification level (0 to 9) */
X unsigned char metal; /* metal produced by sector */
X unsigned char tradegood; /* exotic trade goods in sector */
X /* unsigned char region; /* index of region */
X};
X#define SOWN sct[xcurs+xoffset][ycurs+yoffset].owner
X#define XREAL (xcurs+xoffset)
X#define YREAL (ycurs+yoffset)
X
Xstruct navy
X{
X unsigned short warships;
X unsigned short merchant;
X unsigned short galleys;
X char xloc;
X char yloc;
X char smove; /* movement ability of ship */
X unsigned char crew; /* crew on ship */
X unsigned char people; /* people carried */
X unsigned char commodity; /* future commodities */
X char armynum; /* army carried */
X};
X
X
X/* NATION STRATEGY: a nation's strategy is a part of the ntn[].active
X * variable which tells if it is a PC or NPC, its allignment, and its
X * constraints allignments can be good, neutral, or evil.
X * NPC Nations can be Expansionsist (with 0,2,4,6 sectors to expand into)
X * or Isolationist. */
X#define INACTIVE 0
X#define PC_GOOD 1 /* PC NATIONS */
X#define PC_NEUTRAL 2
X#define PC_EVIL 3
X#define GOOD_0FREE 4 /* NPC NATIONS */
X#define GOOD_2FREE 5
X#define GOOD_4FREE 6
X#define GOOD_6FREE 7
X#define NEUTRAL_0FREE 8
X#define NEUTRAL_2FREE 9
X#define NEUTRAL_4FREE 10
X#define NEUTRAL_6FREE 11
X#define EVIL_0FREE 12
X#define EVIL_2FREE 13
X#define EVIL_4FREE 14
X#define EVIL_6FREE 15
X#define ISOLATIONIST 16 /* ISOLATIONIST NATIONS */
X#define NPC_PEASANT 17 /* PEASANT REVOLT TYPE NATIONS */
X#define NPC_PIRATE 18
X#define NPC_LIZARD 19
X#define NPC_NOMAD 20
X#define NPC_BARBARIAN 21
X
X#define ispc(x) (((x)==PC_GOOD)||((x)==PC_EVIL)||((x)==PC_NEUTRAL))
X#define npctype(x) (ispc(x) ? (x) : (x)/4)
X#define isgood(x) (npctype(x) == 1)
X#define isneutral(x) (npctype(x) == 2)
X#define isevil(x) (npctype(x) == 3)
X#define isnpc(x) (((x)>=GOOD_0FREE)&&((x)<=ISOLATIONIST))
X#define isnotpc(x) (((x)>=GOOD_0FREE)&&((x)!=INACTIVE))
X#define ismonst(x) ((x)>=NPC_PEASANT)
X#define ispeasant(x) ((x)==NPC_PEASANT)
X#define isntn(x) (((x)!=INACTIVE)&&((x)<=ISOLATIONIST))
X#define isntnorp(x) (((x)!=INACTIVE)&&((x)<=NPC_PEASANT))
X#define isactive(x) ((x)!=INACTIVE)
X
X/* definitions for mail checker */
X#define NO_MAIL 0
X#define NEW_MAIL 1
X
X/* definitions for naval types */
X#define N_LIGHT 0
X#define N_MEDIUM 1
X#define N_HEAVY 2
X#define N_BITSIZE 5
X#define N_MASK ((unsigned short) 0x001f)
X
X/* definitions for naval calculations */
X#define N_WSPD 20 /* speed of warships */
X#define N_GSPD 18 /* speed of galleys */
X#define N_MSPD 15 /* speed of merchants */
X#define N_NOSPD 0 /* no ships no speed */
X#define N_SIZESPD 3 /* bonus speed for lighter ships */
X
X#define UTYPE 75
X#define TWOUTYPE 150 /* two times value of UTYPE above */
X
X#define A_MILITIA 0
X#define A_GOBLIN 1
X#define A_ORC 2
X#define A_INFANTRY 3
X#define A_SAILOR 4
X#define A_MARINES 5
X#define A_ARCHER 6
X#define A_URUK 7
X#define A_NINJA 8
X#define A_PHALANX 9
X#define A_OLOG 10
X#define A_LEGION 11
X#define A_DRAGOON 12
X#define A_MERCENARY 13
X#define A_TROLL 14
X#define A_ELITE 15
X#define A_LT_CAV 16
X#define A_CAVALRY 17
X#define A_CATAPULT 18
X#define A_SIEGE 19
X#define A_ROC 20
X#define A_KNIGHT 21
X#define A_GRIFFON 22
X#define A_ELEPHANT 23
X#define A_ZOMBIE 24
X#define A_SPY 25
X#define A_SCOUT 26
X#define NOUNITTYPES 26 /*number of unit types*/
X
X#define MINLEADER (27+UTYPE) /* min value of a leader -1*/
X#define L_KING (27+UTYPE)
X#define L_BARON (28+UTYPE)
X#define L_EMPEROR (29+UTYPE)
X#define L_PRINCE (30+UTYPE)
X#define L_WIZARD (31+UTYPE)
X#define L_MAGI (32+UTYPE)
X#define L_APOSTLE (33+UTYPE)
X#define L_BISHOP (34+UTYPE)
X#define L_ADMIRAL (35+UTYPE)
X#define L_CAPTAIN (36+UTYPE)
X#define L_WARLORD (37+UTYPE)
X#define L_LORD (38+UTYPE)
X#define L_DEMON (39+UTYPE)
X#define L_DEVIL (40+UTYPE)
X#define L_DRAGON (41+UTYPE)
X#define L_WYRM (42+UTYPE)
X#define L_SHADOW (43+UTYPE)
X#define L_NAZGUL (44+UTYPE)
X
X#define MINMONSTER (45+TWOUTYPE) /* min value of a monster */
X#define SPIRIT (45+TWOUTYPE)
X#define ASSASSIN (46+TWOUTYPE)
X#define DJINNI (47+TWOUTYPE)
X#define GARGOYLE (48+TWOUTYPE)
X#define WRAITH (49+TWOUTYPE)
X#define HERO (50+TWOUTYPE)
X#define CENTAUR (51+TWOUTYPE)
X#define GIANT (52+TWOUTYPE)
X#define SUPERHERO (53+TWOUTYPE)
X#define MUMMY (54+TWOUTYPE)
X#define ELEMENTAL (55+TWOUTYPE)
X#define MINOTAUR (56+TWOUTYPE)
X#define DEMON (57+TWOUTYPE)
X#define BALROG (58+TWOUTYPE)
X#define DRAGON (59+TWOUTYPE)
X#define MAXMONSTER (59+TWOUTYPE)
X
Xstruct army
X{
X unsigned char unittyp;
X char xloc;
X char yloc;
X char smove;
X long sold;
X char stat;
X};
X
Xstruct s_nation /* player nation stats */
X{
X char name[NAMELTH+1]; /* name */
X char passwd[PASSLTH+1]; /* password */
X char leader[LEADERLTH+1]; /* leader title */
X char race; /* national race (integer--see header.h)*/
X char location; /* location variable (gfr) */
X char mark; /* unique mark for nation */
X char capx; /* Capitol x coordinate */
X char capy; /* Capitol y coordinate */
X char active; /* nation type and strategy */
X char maxmove; /* maximum movement of soldiers */
X char repro; /* reproduction rate of nation */
X long score; /* score */
X long tgold; /* gold in treasury */
X long jewels; /* raw amount of jewels in treasury */
X long tmil; /* total military */
X long tciv; /* total civilians */
X long metals; /* total real metal in nation */
X long tfood; /* total food in nation */
X long powers;
X short class; /* national class */
X short aplus; /* attack plus of all soldiers */
X short dplus; /* attack plus of all soldiers */
X short spellpts; /* spell points */
X short tsctrs; /* total number sectors */
X short tships; /* number warships */
X short inflation; /* inflation rate */
X unsigned char charity; /* charity budget (% of Taxes) */
X struct army arm[MAXARM];
X struct navy nvy[MAXNAVY];
X char dstatus[NTOTAL]; /* diplomatic status */
X unsigned char tax_rate; /* taxrate populace */
X unsigned char prestige; /* nations prestige */
X unsigned char popularity; /* governments popularity */
X unsigned char power; /* nation power */
X unsigned char communications; /* leader communication */
X unsigned char wealth; /* per capita income */
X unsigned char eatrate; /* food eaten / 10 people*/
X unsigned char spoilrate; /* food spoilage rate */
X unsigned char knowledge; /* general knowledge */
X unsigned char farm_ability; /* farming ability */
X unsigned char mine_ability; /* mine ability */
X unsigned char poverty; /* % poor people */
X unsigned char terror; /* peoples terror of you*/
X unsigned char reputation; /* reputation of nation */
X};
X#define P_NTNCOM ((((float) curntn->communications)/ 50.0 ))
X#define P_EATRATE ((((float) curntn->eatrate) / 25.0 ))
X#define P_REPRORATE ( ((float) (100.0 + 25.0*curntn->repro )/100.0))
X
X#define P_ATYPE curntn->arm[armynum].unittyp
X#define P_AXLOC curntn->arm[armynum].xloc
X#define P_AYLOC curntn->arm[armynum].yloc
X#define P_AMOVE curntn->arm[armynum].smove
X#define P_ASOLD curntn->arm[armynum].sold
X#define P_ASTAT curntn->arm[armynum].stat
X#define P_NWSHP curntn->nvy[nvynum].warships
X#define P_NMSHP curntn->nvy[nvynum].merchant
X#define P_NGSHP curntn->nvy[nvynum].galleys
X#define P_NCREW curntn->nvy[nvynum].crew
X#define P_NARMY curntn->nvy[nvynum].armynum
X#define P_NPEOP curntn->nvy[nvynum].people
X#define P_NXLOC curntn->nvy[nvynum].xloc
X#define P_NYLOC curntn->nvy[nvynum].yloc
X#define P_NMOVE curntn->nvy[nvynum].smove
X
X/* naval routine macros */
X#define SHIPS(x,y) (short)( ((x)&(N_MASK<<((y)*N_BITSIZE))) >> ((y)*N_BITSIZE) )
X#define P_NWAR(x) SHIPS(P_NWSHP,x)
X#define P_NMER(x) SHIPS(P_NMSHP,x)
X#define P_NGAL(x) SHIPS(P_NGSHP,x)
X#define NADD_WAR(x) addwships(nvynum,shipsize,(x));
X#define NADD_MER(x) addmships(nvynum,shipsize,(x));
X#define NADD_GAL(x) addgships(nvynum,shipsize,(x));
X#define NSUB_WAR(x) subwships(nvynum,shipsize,(x));
X#define NSUB_MER(x) submships(nvynum,shipsize,(x));
X#define NSUB_GAL(x) subgships(nvynum,shipsize,(x));
X
X#define ATYPE ntn[country].arm[armynum].unittyp
X#define AXLOC ntn[country].arm[armynum].xloc
X#define AYLOC ntn[country].arm[armynum].yloc
X#define AMOVE ntn[country].arm[armynum].smove
X#define ASOLD ntn[country].arm[armynum].sold
X#define ASTAT ntn[country].arm[armynum].stat
X#define NWSHP ntn[country].nvy[nvynum].warships
X#define NMSHP ntn[country].nvy[nvynum].merchant
X#define NGSHP ntn[country].nvy[nvynum].galleys
X#define NCREW ntn[country].nvy[nvynum].crew
X#define NARMY ntn[country].nvy[nvynum].armynum
X#define NPEOP ntn[country].nvy[nvynum].people
X#define NXLOC ntn[country].nvy[nvynum].xloc
X#define NYLOC ntn[country].nvy[nvynum].yloc
X#define NMOVE ntn[country].nvy[nvynum].smove
X
X/* these defines are for types of magic powers */
X#define M_MIL 1 /* military */
X#define M_CIV 2 /* civilian */
X#define M_MGK 3 /* magical */
X#define M_TECH 4 /* technological */
X#define M_ALL 5
X
X#define AORN 0
X#define ARMY 1
X#define NAVY 2
X
X#define XASTAT 1
X#define XAMEN 2
X#define XBRIBE 3
X#define XALOC 4
X#define XNLOC 5
X#define XNAMER 6
X#define XNACREW 7
X#define XECNAME 8
X#define XECPAS 9
X#define EDSPL 10
X#define XSADES 11
X#define XSACIV 12
X#define XSIFORT 13
X#define XNAGOLD 14
X#define XAMOV 15
X#define XNMOV 16
X#define XSAOWN 17
X#define EDADJ 18
X#define XNARGOLD 19
X#define XNAMETAL 20
X#define INCAPLUS 22
X#define INCDPLUS 23
X#define CHG_MGK 24
X#define DESTRY 25
X#define MSETA 26
X#define MSETB 27
X#define NTAX 28
X#define XNAWAR 29
X#define XNAGAL 30
X#define XNAHOLD 31
X#define NPOP 32
X
X#define BRIBENATION fprintf(fm,"L_NGOLD\t%d\t%d\t%ld\t0\t%d\t%s\n",XBRIBE,country,bribecost,nation,"null");
X#define DESTROY fprintf(fexe,"DESTROY\t%d\t%d\t%hd\t0\t0\t%s\n",DESTRY,save,country,"null")
X#define CHGMGK fprintf(fexe,"L_MAGIC\t%d\t%hd\t%ld\t%ld\t0\t%s\n",CHG_MGK,country,ntn[country].powers,x,"null")
X#define I_APLUS fprintf(fexe,"INC_APLUS\t%d\t%hd\t0\t0\t0\t%s\n",INCAPLUS,country,"null")
X#define I_DPLUS fprintf(fexe,"INC_DPLUS\t%d\t%hd\t0\t0\t0\t%s\n",INCDPLUS,country,"null")
X#define AADJMERC fprintf(fexe,"A_MERC\t%d\t%d\t%ld\t0\t0\t%s\n",MSETA,country,men,"null")
X#define AADJDISB fprintf(fexe,"A_MERC\t%d\t%d\t%ld\t%d\t%d\t%s\n",MSETB,country,bemerc,attset,defset,"null")
X#define AADJSTAT fprintf(fexe,"A_STAT\t%d\t%hd\t%d\t%d\t0\t%s\n",XASTAT,country,armynum,ntn[country].arm[armynum].stat,"null")
X#define AADJMEN fprintf(fexe,"L_ADJMEN\t%d\t%hd\t%hd\t%ld\t%d\t%s\n",XAMEN,country,armynum,P_ASOLD,P_ATYPE,"null")
X#define NADJCRW fprintf(fexe,"N_ASHP\t%d\t%hd\t%hd\t%d\t%d\t%s\n",XNACREW,country,nvynum,NCREW,ntn[country].nvy[nvynum].armynum,"null")
X#define NADJMER fprintf(fexe,"N_ASHP\t%d\t%hd\t%d\t%hd\t%d\t%s\n",XNAMER,country,nvynum,ntn[country].nvy[nvynum].merchant,0,"null")
X#define NADJWAR fprintf(fexe,"N_ASHP\t%d\t%hd\t%d\t%hd\t%d\t%s\n",XNAWAR,country,nvynum,ntn[country].nvy[nvynum].warships,0,"null")
X#define NADJGAL fprintf(fexe,"N_ASHP\t%d\t%hd\t%d\t%hd\t%d\t%s\n",XNAGAL,country,nvynum,ntn[country].nvy[nvynum].galleys,0,"null")
X#define NADJHLD fprintf(fexe,"N_ASHP\t%d\t%hd\t%d\t%hd\t%d\t%s\n",XNAHOLD,country,nvynum,ntn[country].nvy[nvynum].armynum,ntn[country].nvy[nvynum].people,"null")
X#define AADJLOC fprintf(fexe,"A_LOC\t%d\t%hd\t%d\t%d\t%d\t%s\n",XALOC,country,armynum,ntn[country].arm[armynum].xloc,ntn[country].arm[armynum].yloc,"null")
X#define NADJLOC fprintf(fexe,"N_LOC\t%d\t%hd\t%d\t%d\t%d\t%s\n",XNLOC,country,nvynum,ntn[country].nvy[nvynum].xloc,ntn[country].nvy[nvynum].yloc,"null")
X#define AADJMOV fprintf(fexe,"A_MOV\t%d\t%hd\t%d\t%d\t0\t%s\n",XAMOV,country,armynum,ntn[country].arm[armynum].smove,"null")
X#define NADJMOV fprintf(fexe,"N_MOV\t%d\t%hd\t%d\t%d\t0\t%s\n",XNMOV,country,nvynum,ntn[country].nvy[nvynum].smove,"null")
X#define ECHGNAME fprintf(fexe,"E_CNAME\t%d\t%hd\t0\t0\t0\t%s\n",XECNAME,country,ntn[country].name)
X#define ECHGPAS fprintf(fexe,"E_CPAS\t%d\t%hd\t0\t0\t0\t%s\n",XECPAS,country,curntn->passwd)
X#define SADJDES fprintf(fexe,"S_ADES\t%d\t%hd\t0\t%d\t%d\t%c\n",XSADES,country,xcurs+xoffset,ycurs+yoffset,sct[xcurs+xoffset][ycurs+yoffset].designation)
X#define SADJDES2 fprintf(fexe,"S_ADES\t%d\t%hd\t0\t%d\t%d\t%c\n",XSADES,country,x,y,sct[x][y].designation)
X#define SADJCIV2 fprintf(fexe,"S_ACIV\t%d\t%hd\t%ld\t%d\t%d\t%s\n",XSACIV,country,sct[i][j].people,i,j,"null")
X#define SADJCIV fprintf(fexe,"S_ACIV\t%d\t%hd\t%ld\t%d\t%d\t%s\n",XSACIV,country,sct[xcurs+xoffset][ycurs+yoffset].people,xcurs+xoffset,ycurs+yoffset,"null")
X#define INCFORT fprintf(fexe,"SIFORT\t%d\t%hd\t0\t%d\t%d\t%s\n",XSIFORT,country,xcurs+xoffset,ycurs+yoffset,"null")
X#define SADJOWN fprintf(fexe,"S_AOWN\t%d\t%hd\t0\t%d\t%d\t%s\n",XSAOWN,country,xcurs+xoffset,ycurs+yoffset,"null")
X#define EADJDIP(a,b) fprintf(fexe,"E_ADJ\t%d\t%hd\t%d\t%d\t0\t%s\n",EDADJ,a,b,ntn[a].dstatus[b],"null")
X#define EDECSPL fprintf(fexe,"E_SPL\t%d\t%hd\t%d\t%d\t0\t%s\n",EDSPL,country,s_cost,0,"null")
X#define NADJNTN fprintf(fexe,"N_TAX \t%d \t%hd \t%d \t%d \t%d \tnull\n",NTAX,country,(int) curntn->tax_rate,(int) curntn->active, (int) curntn->charity)
X#define NADJNTN2 fprintf(fexe,"N_POP \t%d \t%hd \t%d \t%d \t%d \tnull\n",NPOP,country,(int) curntn->popularity,(int) curntn->terror, (int) curntn->reputation)
X
X#define S_MIL 0 /* position in powers array */
X#define WARRIOR 0x00000001L
X#define CAPTAIN 0x00000002L
X#define WARLORD 0x00000004L
X#define ARCHER 0x00000008L
X#define CAVALRY 0x00000010L
X#define SAPPER 0x00000020L
X#define ARMOR 0x00000040L
X#define AVIAN 0x00000080L
X#define MI_MONST 0x00000100L
X#define AV_MONST 0x00000200L
X#define MA_MONST 0x00000400L
X#define E_MIL 11
X /*CIVILIAN POWERS */
X#define S_CIV 11
X#define SLAVER 0x00000800L
X#define DERVISH 0x00001000L
X#define HIDDEN 0x00002000L
X#define ARCHITECT 0x00004000L
X#define RELIGION 0x00008000L
X#define MINER 0x00010000L
X#define BREEDER 0x00020000L
X#define URBAN 0x00040000L
X#define STEEL 0x00080000L
X#define NINJA 0x00100000L
X#define SAILOR 0x00200000L
X#define DEMOCRACY 0x00400000L
X#define ROADS 0x00800000L
X#define E_CIV 13
X /* MAGICAL SKILLS */
X#define S_MGK 24
X#define THE_VOID 0x01000000L
X#define KNOWALL 0x02000000L
X#define DESTROYER 0x04000000L
X#define VAMPIRE 0x08000000L
X#define SUMMON 0x10000000L
X#define WYZARD 0x20000000L
X#define SORCERER 0x40000000L
X#define E_MGK 7
X#define MAXPOWER 31 /* number of powers */
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#endif HILIGHT
X
X#ifdef BEEP
X#define beep() putc('\007',stderr)
X#else
X#define beep()
X#endif
X
X#ifdef SYSV
Xextern long lrand48();
X#define rand() lrand48()
X#define srand(x) srand48(x)
X#endif
X
X#ifdef BSD
X#define rand() random()
X#define srand(x) srandom(x)
X#endif
X
X#ifndef DEBUG
X#define check() ;
X#else
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/* extern all subroutine calls */
Xextern long getmagic(), getmagic(), getmgkcost(), score_one();
Xextern long get_number(), solds_in_sector(),defaultunit();
X
Xextern int move_file(), land_2reachp(), land_reachp(), canbeseen();
Xextern int water_reachp(), markok(), is_habitable();
Xextern int units_in_sector(), num_powers(), tofood();
Xextern int get_god(), flightcost(), todigit(), getclass(), startcost();
Xextern int water_2reachp(),tg_ok(), readmap(), avian();
Xextern int cbonus(), armymove(),takeover(),getnewname();
Xextern int getleader(),execute(),peasant_revolt(),other_revolt();
Xextern int aretheyon(),armygoto(),navygoto(),getselunit();
Xextern int unitvalid(),access(),orctake(),fort_val();
Xextern int addgships(),addmships(),addwships(),fltships();
Xextern int fltghold(),fltwhold(),fltmhold(),flthold(),compass();
Xextern int get_country(),check_lock(),doclass();
Xextern unsigned short fltspeed();
Xextern void do_pirate(), do_nomad(), do_barbarian(), do_lizard();
Xextern void getjewel(),getmetal(),loadfleet(),removemgk(),exenewmgk();
Xextern struct s_sector *rand_sector();
Xextern void subgships(),submships(),subwships(),getspace(),sackem();
Xextern void sleep(), whatcansee(), reset_god(), get_nname(), camp_info();
Xextern void main(), makebottom(), parse(), makeside(), check_mail();
Xextern void checkout(),copyscreen(),bye(),credits(),init_hasseen();
Xextern void combinearmies(),change_status(),reducearmy(),splitarmy();
Xextern void errormsg(), clear_bottom(), addgroup(),ext_cmd();
Xextern void randomevent(), wdisaster(), weather(), deplete();
Xextern void verify_ntn(), verify_sct(), verifydata(), prep();
Xextern void destroy(), updmove(), spreadsheet(), mailopen(), mailclose();
Xextern void updexecs(), updlizards(), updcapture(), updsectors();
Xextern void updmil(), updcomodities(), updleader();
Xextern void nationrun(), n_atpeace(), n_trespass(), n_people();
Xextern void n_toofar(), n_unowned(), pceattr(), checkout();
Xextern void fdxyretreat(), retreat(), rawmaterials(), createworld();
Xextern void att_setup(), att_base(), att_bonus();
Xextern void adjarm(),armyrpt(),atkattr(),blowup();
Xextern void budget(),change(),cheat(),coffmap(),combat(),construct();
Xextern void defattr(),diploscrn(),domagic(),draft(),erupt();
Xextern void fight();
Xextern void fill_edge(),flee(),fleetrpt(),hangup(),help();
Xextern void highlight(),makemap(),makeside();
Xextern void makeworld(),monster(),moveciv();
Xextern void mymove(),navalcbt(),newdip(),newdisplay(),newlogin();
Xextern void newspaper(),npcredes(),offmap(),place(),populate();
Xextern void printele(),printnat(),printscore(),printveg();
Xextern void pr_ntns(),produce();
Xextern void readdata(),redesignate(),redomil(),reduce(),rmessage(),score();
Xextern void see(),showscore(),update();
Xextern void wmessage(),writedata(),getdstatus(),exit();
Xextern void wizardry();
Xextern char *crypt(),**m2alloc();
X#ifdef TRADE
Xvoid trade(),uptrade(),checktrade();
X#endif TRADE
X
X#define HI_OWN 0 /* hilight modes */
X#define HI_ARMY 1
X#define HI_NONE 2
X#define HI_YARM 3
X#define HI_MOVE 4
X#define HI_GOOD 5
X
X#define DI_VEGE 1 /* display modes */
X#define DI_DESI 2
X#define DI_CONT 3
X#define DI_FOOD 4
X#define DI_NATI 5
X#define DI_RACE 6
X#define DI_MOVE 7
X#define DI_DEFE 8
X#define DI_PEOP 9
X#define DI_GOLD 10
X#define DI_METAL 11
X#define DI_ITEMS 12
X
Xextern struct sprd_sht
X{
X long food,gold,jewels,metal; /* total @ end of turn */
X long revfood,revjewels,revmetal,
X revcap,revcity,revothr; /* revenue in turn */
X long ingold,inmetal,infarm,incity,incap,inothr;
X /* civilians in area */
X long civilians; /* total civilians */
X int sectors;
X} spread;
X
X#ifndef max
X#define max(x,y) ((x)>(y) ? (x) : (y))
X#define min(x,y) ((x)<(y) ? (x) : (y))
X#endif
X
X/* attractiveness of sector to general populace */
X#define GOLDATTR 9 /* per jewel value of sector */
X#define FARMATTR 7 /* per point of food producable */
X#define MINEATTR 9 /* per metal value of sector */
X#define TOWNATTR 150
X#define CITYATTR 300
X#define TGATTR 10 /* bonus per point of value for tradegoods */
X#define OTHRATTR 50 /* attractiveness of other sector types */
X
X
X#define DMNTNATTR 40 /* DWARF ATTRACTIVENESS */
X#define DHILLATTR 20
X#define DCLERATTR 0
X#define DCITYATTR -20
X#define DTOWNATTR -20
X#define DGOLDATTR 40
X#define DMINEATTR 40
X#define DFOREATTR -20
X#define DWOODATTR -10
X
X#define EMNTNATTR -40 /* ELF */
X#define EHILLATTR -20
X#define ECLERATTR 0
X#define ECITYATTR -50
X#define ETOWNATTR -50
X#define EGOLDATTR 0
X#define EMINEATTR 0
X#define EFOREATTR 40
X#define EWOODATTR 40
X
X#define OMNTNATTR 30 /* ORC */
X#define OHILLATTR 20
X#define OCLERATTR 0
X#define OCITYATTR 50
X#define OTOWNATTR 25
X#define OGOLDATTR 20
X#define OMINEATTR 20
X#define OFOREATTR -40
X#define OWOODATTR -20
X
X#define HMNTNATTR -10 /* HUMAN */
X#define HHILLATTR 0
X#define HCLERATTR 30
X#define HCITYATTR 50
X#define HTOWNATTR 40
X#define HGOLDATTR 10
X#define HMINEATTR 10
X#define HFOREATTR -20
X#define HWOODATTR 0
X
X/* EXOTIC TRADE GOODS */
X#define TG_furs 0
X#define TG_wool 1
X#define TG_beer 2
X#define TG_cloth 3
X#define TG_wine 4
X#define END_POPULARITY 4
X
X#define TG_mules 5
X#define TG_horses 6
X#define TG_pigeons 7
X#define TG_griffons 8
X#define END_COMMUNICATION 8
X
X#define TG_corn 9
X#define TG_fish 10
X#define TG_sugar 11
X#define TG_honey 12
X#define TG_fruit 13
X#define TG_rice 14
X#define TG_wheat 15
X#define TG_dairy 16
X#define TG_peas 17
X#define TG_bread 18
X#define TG_cereal 19
X#define END_EATRATE 19
X
X#define TG_pottery 20
X#define TG_salt 21
X#define TG_timber 22
X#define TG_granite 23
X#define TG_pine 24
X#define TG_oak 25
X#define TG_nails 26
X#define END_SPOILRATE 26 /* also Knowledge start */
X
X#define TG_papyrus 27
X#define TG_math 28
X#define TG_library 29
X#define TG_drama 30
X#define TG_paper 31
X#define TG_literature 32
X#define TG_law 33
X#define TG_philosophy 34
X#define END_KNOWLEDGE 34
X
X#define TG_irregation 35
X#define TG_oxen 36
X#define TG_plows 37
X#define END_FARM 37
X
X#define TG_stones 38
X#define END_SPELL 38
X
X#define TG_herbs 39
X#define TG_medecine 40
X#define END_HEALTH 40
X
X#define TG_torture 41
X#define TG_prison 42
X#define END_TERROR 42
X#define END_NORMAL 42 /* also end of non mine/jewel goods */
X
X#define TG_bronze 43
X#define TG_copper 44
X#define TG_lead 45
X#define TG_tin 46
X#define TG_iron 47
X#define TG_steel 48
X#define TG_mithral 49
X#define TG_adamantine 50
X#define END_MINE 50
X
X#define TG_spice 51
X#define TG_silver 52
X#define TG_pearls 53
X#define TG_dye 54
X#define TG_silk 55
X#define TG_gold 56
X#define TG_rubys 57
X#define TG_ivory 58
X#define TG_diamonds 59
X#define TG_platinum 60
X#define END_WEALTH 60
X#define TG_none 61 /* no trade goods in sector */
X#define MAXTGVAL 100 /* maximum value for stat */
X
X/* defines for a nations class */
X#define C_NPC 0
X#define C_KING 1
X#define C_EMPEROR 2
X#define C_WIZARD 3
X#define C_PRIEST 4
X#define C_PIRATE 5
X#define C_TRADER 6
X#define C_WARLORD 7
X#define C_DEMON 8
X#define C_DRAGON 9
X#define C_SHADOW 10
X#define C_END 10
X
X#define ISCITY(desig) ((desig==DCITY)||(desig==DCAPITOL)||(desig==DFORT)||(desig==DTOWN))
X
X#define PWR_NA 10 /* national attributes gained from power */
X#define CLA_NA 30 /* national attributes gained from class */
X
X/* MAGIC/CIVILIAN/MILITARY POWER COSTS BY RACE */
X#define BASEMAGIC 50000L /* default for all not mentioned */
X#define DWFMAGIC 80000L
X#define HUMMAGIC 100000L
X#define ORCMAGIC 150000L
X#define DWFCIVIL 40000L
X#define ORCCIVIL 75000L
X#define HUMCIVIL 25000L
X#define DWFMILIT 40000L
X#define ORCMILIT 45000L
X
X#define abrt() { \
Xfprintf(stderr,"\nSerious Error (File %s, Line %d) - Aborting\n",__FILE__,__LINE__); \
Xabort(); \
X}
X
X#define DEVASTATE(X,Y) { \
Xif(is_habitable(X,Y)) { \
Xif((sct[X][Y].designation == DCAPITOL) \
X||(sct[X][Y].designation == DRUIN) \
X||(sct[X][Y].designation == DCITY)) { \
X if(sct[X][Y].fortress >= 4) { \
X sct[X][Y].fortress -= 4; \
X } else sct[X][Y].fortress = 0; \
X sct[X][Y].designation = DRUIN; \
X} else sct[X][Y].designation = DDEVASTATED; \
X} \
X}
X
Xextern FILE *fm;
Xextern int mailok;
Xextern char *seasonstr[];
Xextern char *allignment[];
Xextern struct s_sector **sct;
Xextern struct s_nation ntn[NTOTAL];
Xextern struct s_nation *curntn;
Xextern struct s_world world;
X
Xextern short **movecost;
Xextern char **occ; /* sector occupied?, NTOTAL+1 if contested */
Xextern char *ele, *elename[], *veg, *vegfood, *vegname[];
Xextern char *Class[],*races[],*diploname[];
Xextern char *soldname[], *unittype[], *shunittype[], *directions[];
Xextern int unitminsth[], u_enmetal[], u_encost[], unitmaint[];
Xextern char *des, *desname[], *pwrname[];
Xextern long powers[];
Xextern char *tg_value, *tg_name[], *tg_stype; /* trade goods */
X
X#ifdef CONQUER
Xextern long mercgot;
X#endif CONQUER
X
X#ifdef ADMIN
Xextern char *npcsfile;
Xextern char scenario[];
X#endif ADMIN
Xextern int unitmove[], unitattack[], unitdefend[];
X
X/* file name definitions */
Xextern char *sortname,*exefile,*datafile,*msgfile,*helpfile,*newsfile,*isonfile;
X
X#ifdef CONQUER
Xextern int conq_mail_status;
Xextern char conqmail[];
X#ifdef SYSMAIL
Xextern int sys_mail_status;
Xextern char sysmail[];
X#endif SYSMAIL
X#endif CONQUER
X#ifdef TRADE
Xextern char *tradefile;
X#endif TRADE
X
X#define EXT_CMD '\033' /* ESC to start extended command */
X
X#define MAXX (MAPX / 8) /* Number of X areas on map */
X#define MAXY (MAPY / 8) /* Number of Y areas on map */
X#define NUMAREAS (MAXX * MAXY) /* total # areas, MAXX*MAXY */
X#define NUMSECTS (MAPX * MAPY) /* total # areas, MAXX*MAXY */
X#define MAXHELP 6
X
X#ifdef HPUX
X#define SYSV
X#endif HPUX
X
X/* minor market items */
X#define GETFOOD 97 /* response needed to get food */
X#define GETMETAL 98
X#define GETJEWL 99
X#define GODFOOD 8000L /* food recieved for GODPRICE */
X#define GODMETAL 2000L /* " */
X#define GODJEWL 3000L /* " */
X#define GODPRICE 25000L
X
X#ifdef 0
X/* THE FOLLOWING DEFINES ARE NOT IMPLEMENTED YET */
X/* THEY DEFINE THE ATTRIBUTES OF A (TO BE IMPLEMENTED) REGION */
X
X/* REGIONS REVOLT STATUS: if larger than the value */
X#define R_OPEN_REVOLT 220
X#define R_GUERILLA_WAR 170
X#define R_UNREST 150
X#define R_DISSENT 120
X#define R_CALM 80
X#define R_HAPPY 50
X#define R_PROSPEROUS 0
X
X/* REGIONS GOVERNMENTAL STRENGTH */
X#define R_BARBARIAN 0
X#define R_IND_VILAGES 20
X#define R_TRIBAL 40
X#define R_CITY_STATES 80
X#define R_BALKANIZED 110
X#define R_CONFEDERACY 140
X#define R_NATION 160
X#define R_MONARCHY 180
X#define R_EMPIRE 200
X
X/* REGION STRATEGY: region strategy by owning nation */
X#define R_ISOLATION 37
X#define R_BUILD_ECON 36
X#define R_EXPAND_PCE 35
X#define R_TAX 34
X#define R_BUILD_MIL 33
X#define R_EXPAND_MIL 32
X#define R_AT_WAR 31
X#define R_SUBDUE 20 /* 20-30: # of turns left in unrest */
X#define R_CIVIL_WAR 0 /* 0-19: number of turns left in war */
X
X#define NUMREGIONS 250 /* number of regions in the world */
X#define STARTYEAR -10000 /* year that game treats as 0. In this
X case - ten thousand years B.C */
X
Xstruct s_region
X{
X char *name; /* name of region */
X long people; /* civilians in sector*/
X long tax; /* tax production ability*/
X unsigned char owner; /* nation id of owner */
X unsigned char color; /* color to display region*/
X unsigned char tech_level; /* technology level */
X unsigned char law_level; /* law level of region */
X unsigned char social_level; /* social level of region*/
X unsigned char govt_sth; /* owners sth. in region */
X unsigned char strategy; /* owners strategy in region */
X unsigned char revolt; /* status of region */
X unsigned char prestige; /* prestige for owning */
X};
X#endif 0
END_OF_FILE
if test 31789 -ne `wc -c <'data.h'`; then
echo shar: \"'data.h'\" unpacked with wrong size!
fi
# end of 'data.h'
fi
if test -f 'magic.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'magic.c'\"
else
echo shar: Extracting \"'magic.c'\" \(22754 characters\)
sed "s/^X//" >'magic.c' <<'END_OF_FILE'
X/*conquer : Copyright (c) 1988 by Ed Barlow.
X * I spent a long time writing this code & I hope that you respect this.
X * I give permission to alter the code, but not to copy or redistribute
X * it without my explicit permission. If you alter the code,
X * please document changes and send me a copy, so all can have it.
X * This code, to the best of my knowledge works well, but it is my first
X * 'C' program and should be treated as such. I disclaim any
X * responsibility for the codes actions (use at your own risk). I guess
X * I am saying "Happy gaming", and am trying not to get sued in the process.
X * Ed
X */
X
X/*create a new login for a new player*/
X#include "header.h"
X#include "data.h"
X#include <ctype.h>
X
Xextern short country;
Xextern short redraw;
Xextern FILE *fexe;
Xextern FILE *fnews;
X
X/*give player one new magic power in current magic (powers)*/
X/*do nothing if that player has that power or it is not permitted*/
X/*getmagic() returns the value of the power gained, and stores it in power*/
X
Xlong
Xgetmagic(type)
Xint type;
X{
X long newpower;
X int start,end;
X switch(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 }
X newpower=powers[start+(rand()%end)];
X if(newpower==0) {
X printf("ILLEGAL POWER");
X abrt();
X }
X
X if((newpower==WARRIOR)||(newpower==CAPTAIN)||(newpower==WARLORD)){
X if(magic(country,WARRIOR)!=TRUE){
X curntn->powers|=WARRIOR;
X return(WARRIOR);
X }
X else if(magic(country,CAPTAIN)!=TRUE){
X curntn->powers|=CAPTAIN;
X return(CAPTAIN);
X }
X else if(magic(country,WARLORD)!=TRUE){
X curntn->powers|=WARLORD;
X return(WARLORD);
X }
X else return(0L);
X }else if((newpower==MI_MONST) ||(newpower==AV_MONST) ||(newpower==MA_MONST)){
X if(curntn->race!=ORC) return(0L);
X if(magic(country,MI_MONST)!=TRUE){
X curntn->powers|=MI_MONST;
X return(MI_MONST);
X }
X else if(magic(country,AV_MONST)!=TRUE){
X curntn->powers|=AV_MONST;
X return(AV_MONST);
X }
X else if(magic(country,MA_MONST)==TRUE){
X curntn->powers|=MA_MONST;
X return(MA_MONST);
X }
X else return(0L);
X }else if(newpower==CAVALRY){
X if(curntn->race==ORC) return(0L);
X if(isnotpc(curntn->active)) return(0L); /*npc nation*/
X if(magic(country,newpower)==TRUE) return(0L);
X curntn->powers|=newpower;
X return(newpower);
X }else if(newpower==URBAN){
X if(magic(country,BREEDER)==TRUE) return(0L);
X if(magic(country,newpower)==TRUE) return(0L);
X curntn->powers|=newpower;
X return(newpower);
X }else if(newpower==RELIGION){
X if(curntn->race==ORC) return(0L);
X if(magic(country,newpower)==TRUE) return(0L);
X curntn->powers|=newpower;
X return(newpower);
X }else if(newpower==KNOWALL){
X#ifdef OGOD
X#ifdef HIDELOC
X /* only god should have KNOWALL if sectors hidden */
X if(country!=0) return(0L);
X#endif
X#endif
X if(magic(country,KNOWALL)==TRUE) return(0L);
X curntn->powers|=KNOWALL;
X return(KNOWALL);
X }else if((newpower==SLAVER)
X ||(newpower==DERVISH)
X ||(newpower==HIDDEN)
X ||(newpower==ARCHITECT)
X ||(newpower==THE_VOID)
X ||(newpower==ARCHER)){
X if((magic(country,newpower)==TRUE)
X ||((newpower==DERVISH)&&(magic(country,DESTROYER)==TRUE)))
X return(0L);
X curntn->powers|=newpower;
X return(newpower);
X }else if(newpower==DESTROYER){
X if((curntn->race!=ELF)
X &&(magic(country,DESTROYER)!=TRUE)
X &&(magic(country,DERVISH)!=TRUE)){
X curntn->powers|=DESTROYER;
X return(DESTROYER);
X }
X return(0L);
X }else if(newpower==VAMPIRE){
X if((curntn->race!=ELF)&&(magic(country,VAMPIRE)!=TRUE)){
X curntn->powers|=VAMPIRE;
X return(VAMPIRE);
X }
X return(0L);
X }else if(newpower==MINER){
X if((curntn->race!=ELF)&&(curntn->race!=DWARF)&&(magic(country,MINER)!=TRUE)){
X curntn->powers|=MINER;
X return(MINER);
X }
X return(0L);
X }else if(newpower==STEEL){
X if(magic(country,STEEL)==TRUE) return(0L);
X if(magic(country,MINER)!=TRUE) return(0L);
X curntn->powers|=STEEL;
X return(STEEL);
X }else if(newpower==BREEDER){
X if(magic(country,URBAN)==TRUE) return(0L);
X if(magic(country,BREEDER)==TRUE) return(0L);
X if(curntn->race!=ORC) return(0L);
X curntn->powers|=BREEDER;
X return(BREEDER);
X }
X else if(isnotpc(curntn->active)) {
X return(0L); /* remaining powers only for pc's */
X } else if((newpower==NINJA)
X ||(newpower==SLAVER)
X ||(newpower==SAILOR)
X ||(newpower==DEMOCRACY)
X ||(newpower==ROADS)
X ||(newpower==SAPPER)
X ||(newpower==ARMOR)
X ||(newpower==AVIAN)){
X if(magic(country,newpower)==TRUE) return(0L);
X curntn->powers|=newpower;
X return(newpower);
X }
X else if((newpower==SUMMON)||(newpower==WYZARD)||(newpower==SORCERER)){
X /* dwarves may not cast spells */
X if(curntn->race==DWARF) return(0L);
X if(magic(country,SUMMON)!=TRUE) {
X curntn->powers|=SUMMON;
X return(SUMMON);
X } else if(magic(country,WYZARD)!=TRUE) {
X curntn->powers|=WYZARD;
X return(WYZARD);
X } else if(magic(country,SORCERER)!=TRUE) {
X curntn->powers|=SORCERER;
X return(SORCERER);
X } else return(0L);
X } else return(0L);
X}
X#ifdef CONQUER
X/*form to interactively get a magic power*/
Xvoid
Xdomagic()
X{
X int count, done=FALSE, loop=0, i,type;
X long price,x;
X short isgod=0;
X if(country==0) {
X isgod=TRUE;
X if (get_god()) return;
X }
X
X while(done==FALSE){
X done=TRUE;
X clear();
X count=3;
X redraw=TRUE;
X standout();
X mvprintw(0,(COLS/2)-15,"MAGIC POWERS FOR %s",curntn->name);
X mvprintw(count++,30,"1) %d military powers: %ld jewels",
X num_powers(country,M_MIL) ,getmgkcost(M_MIL,country));
X mvprintw(count++,30,"2) %d civilian powers: %ld jewels",
X num_powers(country,M_CIV) ,getmgkcost(M_CIV,country));
X mvprintw(count++,30,"3) %d magic powers: %ld jewels",
X num_powers(country,M_MGK),getmgkcost(M_MGK,country));
X
X price = getmgkcost(M_MIL,country);
X if(price > getmgkcost(M_CIV,country))
X price = getmgkcost(M_CIV,country);
X if(price > getmgkcost(M_MGK,country))
X price = getmgkcost(M_MGK,country);
X#ifdef OGOD
X if (isgod==TRUE) price=0;
X#endif OGOD
X
X standend();
X count=3;
X /*print the powers that you have*/
X i=0;
X while( powers[i] != 0 ){
X if(magic(country,powers[i])==TRUE)
X mvprintw(count++,0,"you have power %s",*(pwrname+i));
X i++;
X }
X
X if(count<=7) count=8;
X else count++;
X standout();
X mvprintw(count++,0,"YOU HAVE %ld JEWELS IN YOUR TREASURY",curntn->jewels);
X if(price < curntn->jewels){
X mvaddstr(count++,0,"DO YOU WISH TO BUY A RANDOM NEW POWER (enter y or n):");
X standend();
X refresh();
X count++;
X if(getch()=='y'){
X done=FALSE;
X mvprintw(count++,0,"ENTER SELECTION (1,2,3):");
X refresh();
X type = getch() - '0';
X if(type==M_MIL || type==M_CIV || type==M_MGK){
X price=getmgkcost(type,country);
X#ifdef OGOD
X if (isgod==TRUE) price=0;
X#endif OGOD
X if(curntn->jewels>=price) {
X loop = 0;
X while(loop++ < 500) if((x=getmagic(type))!=0){
X curntn->jewels -= price;
X CHGMGK;
X exenewmgk(x);
X refresh();
X if (isgod==TRUE) reset_god();
X break;
X }
X if (loop >= 500)
X errormsg("You have too many powers!");
X } else errormsg("CAN'T AFFORD A NEW POWER");
X } else errormsg("BAD SELECTION");
X }
X } else {
X mvaddstr(LINES-1,0,"CAN'T AFFORD A NEW POWER");
X clrtoeol();
X mvaddstr(LINES-1,60,"PRESS ANY KEY");
X refresh();
X standend();
X getch();
X }
X#ifdef ORCTAKE
X if((curntn->race==ORC)&&(curntn->jewels>=ORCTAKE)&&(curntn->spellpts>=TAKEPOINTS))
X done |= orctake(&count);
X#endif ORCTAKE
X#ifdef OGOD
X if (isgod==TRUE) {
X mvaddstr(count++,0,"GOD: REMOVE A MAGIC POWER? (y or n)");
X refresh();
X if (getch()=='y') killmagk();
X }
X#endif OGOD
X }
X if(isgod==TRUE) reset_god();
X}
X#endif CONQUER
X#ifdef ORCTAKE
X/*do magic for both npcs and pcs in update*/
X/*if target is 0 then it is update and target will be picked randomly*/
Xint
Xtakeover(percent,target)
Xint percent,target;
X{
X int loop=1,y,save,isupdate=0;
X save=country;
X if(target==country) return(0);
X if(target==0) isupdate=1;
X country=target;
X if(rand()%100<percent){
X loop=0;
X y=0;
X if (target==0) while(loop==FALSE){
X y++;
X country=rand()%NTOTAL;
X if((ntn[country].race==ntn[save].race)
X &&(isnpc(ntn[country].active))
X &&(curntn->dstatus[country]<HOSTILE)
X &&(curntn->dstatus[country]!=UNMET)
X &&(country!=save))
X loop=TRUE;
X else if(y>=500) {
X country=save;
X return(0);
X }
X }
X sct[ntn[country].capx][ntn[country].capy].owner=save;
X if(isupdate==1){
X printf("nation %s magically taken over by %s\n",ntn[country].name,ntn[save].name);
X fprintf(fnews,"1.\tnation %s magically taken over by %s\n",ntn[country].name,ntn[save].name);
X }
X else {
X DESTROY;
X if ((fnews=fopen("/dev/null","w"))==NULL){
X printf("error opening null file\n");
X exit(FAIL);
X }
X }
X destroy(country);
X sct[ntn[country].capx][ntn[country].capy].designation=DCITY;
X if(isupdate!=1) fclose(fnews);
X y=country;
X country=save;
X return(y);
X }
X country=save;
X return(0);
X}
X#endif ORCTAKE
X
X/*execute new magic*/
Xvoid
Xexenewmgk(newpower)
Xlong newpower;
X{
X short x,armynum;
X#ifdef ADMIN
X short y;
X#endif
X if(newpower==WARRIOR) {
X curntn->aplus+=10;
X curntn->dplus+=10;
X return;
X }
X if(newpower==CAPTAIN) {
X curntn->aplus+=10;
X curntn->dplus+=10;
X return;
X }
X if(newpower==WARLORD) {
X curntn->aplus+=10;
X curntn->dplus+=10;
X return;
X }
X if(newpower==RELIGION) {
X if(curntn->race==ORC) {
X printf("ORCS CANT HAVE RELIGION POWER\n");
X abrt();
X } else if(curntn->repro<=8){
X curntn->repro+=2;
X } else if(curntn->repro==9){
X curntn->repro=10;
X curntn->dplus+=5;
X } else if(curntn->repro>=10){
X curntn->dplus+=10;
X }
X return;
X }
X if(newpower==DESTROYER) {
X/* this ifdef is so that destroyer only takes place in an update */
X#ifdef ADMIN
X for(x=curntn->capx-3;x<=curntn->capx+3;x++) {
X for(y=curntn->capy-3;y<=curntn->capy+3;y++){
X if((ONMAP(x,y))
X &&(sct[x][y].altitude!=WATER)
X#ifdef DERVDESG
X &&((rand()%2)==0)
X#else
X &&(tofood( &sct[x][y],0)<6)
X#endif DERVDESG
X &&((x!=curntn->capx)
X ||(y!=curntn->capy))){
X sct[x][y].vegetation=DESERT;
X sct[x][y].designation=DNODESIG;
X }
X }
X }
X fprintf(fnews,"1.\tnation %s gets destroyer power: land turns to desert\n",curntn->name);
X#endif ADMIN
X updmove(curntn->race,country);
X return;
X }
X if(newpower==DERVISH) {
X updmove(curntn->race,country);
X return;
X }
X if((newpower==MI_MONST)
X ||(newpower==AV_MONST)
X ||(newpower==MA_MONST)
X ||(newpower==KNOWALL)
X ||(newpower==HIDDEN)
X ||(newpower==THE_VOID)
X ||(newpower==ARCHITECT)
X ||(newpower==MINER))
X return;
X if(newpower==VAMPIRE) {
X curntn->aplus-=35;
X curntn->dplus-=35;
X for(armynum=0;armynum<MAXARM;armynum++){
X if((P_ATYPE == A_INFANTRY)||(P_ATYPE == A_MILITIA))
X P_ATYPE=A_ZOMBIE;
X }
X return;
X }
X if(newpower==URBAN) {
X if(curntn->race==ORC) {
X x=curntn->repro;
X if(curntn->repro>=14){
X curntn->maxmove+=3;
X }
X else if(curntn->repro>11){
X curntn->maxmove+= x-11;
X curntn->repro=14;
X }
X else curntn->repro+=3;
X }
X else if(curntn->repro<=9){
X curntn->repro+=3;
X }
X else {
X curntn->maxmove+=2*(curntn->repro-9);
X curntn->repro=12;
X }
X return;
X }
X if(newpower==BREEDER) {
X x=curntn->repro;
X if(curntn->repro>=14){
X curntn->maxmove+=3;
X }
X else if(curntn->repro>11){
X curntn->maxmove+= x-11;
X curntn->repro=14;
X }
X else curntn->repro+=3;
X curntn->dplus-=10;
X curntn->aplus-=10;
X return;
X }
X if(newpower==DEMOCRACY){
X curntn->maxmove+=1;
X curntn->repro+=1;
X curntn->dplus+=10;
X curntn->aplus+=10;
X return;
X }
X if(newpower==ROADS){
X curntn->maxmove+=4;
X return;
X }
X if(newpower==ARMOR){
X curntn->maxmove-=3;
X if( curntn->maxmove<4) curntn->maxmove=4;
X curntn->dplus+=20;
X }
X if((newpower==NINJA)
X ||(newpower==STEEL)
X ||(newpower==ARCHER)
X ||(newpower==CAVALRY)
X ||(newpower==SAILOR)
X ||(newpower==SUMMON)
X ||(newpower==WYZARD)
X ||(newpower==SORCERER)
X ||(newpower==SAPPER)
X ||(newpower==AVIAN)){ /* these powers are only for pc's */
X return;
X }
X}
X#ifdef CONQUER
X/* returns 0 if summon occurred, 1 else */
Xvoid
Xdosummon()
X{
X int x,count,i,armynum;
X long e_cost;
X int newtype,s_cost;
X char line[80],ch;
X
X x=0;
X count=LINES-4;
X clear_bottom(0);
X mvaddstr(count,x,"options:");
X x+=9;
X for(i=MINMONSTER;i<=MAXMONSTER;i++){
X if(unitvalid(i)==TRUE) {
X mvprintw(count,x+2,"%s",*(shunittype+(i%UTYPE)));
X mvprintw(count,x,"(%c)",*(shunittype+(i%UTYPE))[0]);
X x+=7;
X if(x>COLS-20){
X x=0;
X count++;
X }
X }
X }
X count++;
X mvaddstr(count++,0,"what type of unit do you want to raise:");
X refresh();
X ch=getch();
X for(newtype=MINMONSTER;newtype<=MAXMONSTER;newtype++){
X if( *(shunittype+(newtype%UTYPE))[0] == ch ) break;
X }
X
X if (newtype==MAXMONSTER+1) {
X /* quick exit */
X return;
X }
X if(unitvalid(newtype)==FALSE) {
X beep();
X clear_bottom(0);
X errormsg("you are unable to summon that monster");
X return;
X }
X
X s_cost= *(u_encost+(newtype%UTYPE));
X if(s_cost > curntn->spellpts) {
X sprintf(line,"you dont have %d spell points",s_cost);
X clear_bottom(0);
X errormsg(line);
X return;
X }
X
X e_cost= (long) *(u_encost+(newtype%UTYPE)) * *(unitminsth+(newtype%UTYPE));
X if(e_cost > curntn->tgold) {
X sprintf(line,"you dont have %ld gold talons in your treasury",e_cost);
X clear_bottom(0);
X errormsg(line);
X return;
X }
X
X armynum=0;
X while(armynum<MAXARM) {
X if(P_ASOLD<=0) {
X P_ASOLD= *(unitminsth+(newtype%UTYPE));
X P_ATYPE=newtype;
X P_ASTAT=DEFEND; /* set new armies to DEFEND */
X P_AXLOC=curntn->capx;
X P_AYLOC=curntn->capy;
X P_AMOVE=0;
X AADJLOC;
X AADJSTAT;
X AADJMEN;
X AADJMOV;
X armynum=MAXARM;
X } else if(armynum==MAXARM-1) {
X clear_bottom(0);
X errormsg("NO FREE ARMIES");
X return;
X } else armynum++;
X }
X curntn->tgold -= e_cost;
X curntn->spellpts -= s_cost;
X EDECSPL;
X}
X#ifdef ORCTAKE
X/* orc takeover routine... returns 0 if run, 1 if not */
Xint
Xorctake(count)
Xint *count;
X{
X int chance=0,done=TRUE,i,s_cost;
X if((*count)>20) {
X (*count)=2;
X clear();
X }
X if(magic(country,MA_MONST)==TRUE) {
X mvprintw((*count)++,0," You have a 10 percent chance for %ld Jewels take over other orcs",ORCTAKE);
X chance=10;
X } else if(magic(country,AV_MONST)==TRUE) {
X mvprintw((*count)++,0," You have a 6 percent chance for %ld Jewels take over other orcs",ORCTAKE);
X chance=6;
X } else if(magic(country,MI_MONST)==TRUE){
X mvprintw((*count)++,0," You have a 3 percent chance for %ld Jewels to take over other orcs",ORCTAKE);
X chance=3;
X }
X if(chance==0) return(TRUE);
X
X mvaddstr((*count)++,0,"DO YOU WISH TO TAKE OVER AN ORC NPC NATION");
X mvaddstr((*count)++,0,"target cant be unmet, hostile, war, or jihad (enter y or n):");
X refresh();
X if(getch()=='y'){
X done=FALSE;
X mvaddstr((*count)++,0," What orc nation:");
X refresh();
X i=get_country();
X if(i<=0 || i>NTOTAL || !isntn(ntn[i].active) )
X mvaddstr((*count)++,0," Invalid Nation");
X else if((curntn->dstatus[i]<HOSTILE)
X &&(curntn->dstatus[i]!=UNMET)
X &&(ntn[i].race==ORC)){
X curntn->jewels-=ORCTAKE;
X s_cost=TAKEPOINTS;
X curntn->spellpts-=s_cost;
X EDECSPL;
X if(( takeover(chance,i)) !=0 )
X mvprintw((*count)++,0," Successful: %d",i);
X else {
X mvaddstr((*count)++,0," Failed: Nation becomes more hostile");
X curntn->dstatus[i]++;
X EADJDIP(country,i);
X }
X }
X else mvaddstr((*count)++,0," Wrong Race");
X }
X return(done);
X}
X#endif ORCTAKE
X#endif CONQUER
X#ifdef CONQUER
X
X/**********************************************************************/
X/* unitvalid() returns TRUE if nation has powers needed to draft unit */
X/**********************************************************************/
Xint
Xunitvalid(type)
Xint type;
X{
X int valid=FALSE;
X switch(type){
X case A_INFANTRY: /* not everyone gets infantry now */
X if(defaultunit(country)==A_INFANTRY) valid=TRUE;
X break;
X case GARGOYLE:
X case A_GOBLIN:
X case A_ORC: if(magic(country,MI_MONST)==TRUE) valid=TRUE;
X break;
X case A_MARINES: if(magic(country,SAILOR)==TRUE) valid=TRUE;
X break;
X case A_ARCHER: if(magic(country,ARCHER)==TRUE) valid=TRUE;
X break;
X case A_URUK: if(magic(country,AV_MONST)==TRUE) valid=TRUE;
X break;
X case A_NINJA: if(magic(country,NINJA)==TRUE) valid=TRUE;
X break;
X case A_PHALANX: if(magic(country,CAPTAIN)==TRUE) valid=TRUE;
X break;
X case A_OLOG: if((magic(country,BREEDER)==TRUE)
X &&(magic(country,AV_MONST)==TRUE)) valid=TRUE;
X break;
X case A_ELEPHANT:if(magic(country,DERVISH)==TRUE) valid=TRUE;
X break;
X case SUPERHERO:
X case A_LEGION: if(magic(country,WARLORD)==TRUE) valid=TRUE;
X break;
X case A_TROLL: if(magic(country,MA_MONST)==TRUE) valid=TRUE;
X break;
X case A_ELITE: if(magic(country,ARMOR)==TRUE) valid=TRUE;
X break;
X case CENTAUR:
X case A_LT_CAV:
X case A_CAVALRY: if(magic(country,CAVALRY)==TRUE) valid=TRUE;
X break;
X case A_KNIGHT: if((magic(country,ARMOR)==TRUE)
X &&(magic(country,CAVALRY)==TRUE)) valid=TRUE;
X break;
X case A_ROC:
X case A_GRIFFON: if(magic(country,AVIAN)==TRUE) valid=TRUE;
X break;
X case ASSASSIN: if(magic(country,NINJA)==TRUE) valid=TRUE;
X break;
X case DJINNI: if(magic(country,DERVISH)==TRUE) valid=TRUE;
X break;
X case HERO: if(magic(country,WARRIOR)==TRUE) valid=TRUE;
X break;
X case ELEMENTAL: if(magic(country,SORCERER)==TRUE) valid=TRUE;
X break;
X case A_ZOMBIE:
X case WRAITH:
X case MUMMY: if(magic(country,VAMPIRE)==TRUE) valid=TRUE;
X break;
X case MINOTAUR:
X case DEMON: if(magic(country,DESTROYER)==TRUE) valid=TRUE;
X break;
X case BALROG: if((magic(country,WYZARD)==TRUE)
X &&(magic(country,VAMPIRE)==TRUE)) valid=TRUE;
X break;
X case DRAGON: if((magic(country,MA_MONST)==TRUE)
X &&(magic(country,WYZARD)==TRUE)) valid=TRUE;
X break;
X case A_SPY:
X case A_SCOUT: break; /* handled elsewhere */
X default: valid=TRUE; /* for all unrestricted types */
X }
X return(valid);
X}
X#endif CONQUER
X
X/*remove properties of magic power; must first remove power */
Xvoid
Xremovemgk(oldpower)
Xlong oldpower;
X{
X short x,y,armynum;
X if((oldpower==WARRIOR)
X ||(oldpower==CAPTAIN)
X ||(oldpower==WARLORD)) {
X curntn->aplus-=10;
X curntn->dplus-=10;
X return;
X }
X if(oldpower==RELIGION) {
X if(curntn->race==ORC) {
X printf("ORCS CANT HAVE RELIGION POWER\n");
X abrt();
X } else curntn->repro -= 2;
X return;
X }
X if(oldpower==DESTROYER) {
X for(x=curntn->capx-3;x<=curntn->capx+3;x++) {
X for(y=curntn->capy-3;y<=curntn->capy+3;y++){
X if((ONMAP(x,y))
X &&(sct[x][y].altitude!=WATER)
X &&((x!=curntn->capx)
X ||(y!=curntn->capy))){
X if (sct[x][y].vegetation==DESERT)
X {
X /* LT_VEG has medium value*/
X sct[x][y].vegetation=LT_VEG;
X sct[x][y].designation=DNODESIG;
X }
X }
X }
X }
X updmove(curntn->race,country);
X return;
X }
X if(oldpower==DERVISH) {
X updmove(curntn->race,country);
X return;
X }
X if(oldpower==VAMPIRE) {
X curntn->aplus+=35;
X curntn->dplus+=35;
X for(armynum=0;armynum<MAXARM;armynum++){
X if(P_ATYPE == A_ZOMBIE) P_ATYPE=defaultunit(country);
X }
X return;
X }
X if(oldpower==URBAN) {
X curntn->repro -= 3;
X return;
X }
X if(oldpower==BREEDER) {
X curntn->repro-=3;
X curntn->dplus+=10;
X curntn->aplus+=10;
X for(armynum=0;armynum<MAXARM;armynum++){
X if(P_ATYPE == A_OLOG) P_ATYPE=A_URUK;
X }
X return;
X }
X if(oldpower==DEMOCRACY){
X curntn->maxmove-=1;
X curntn->repro-=1;
X curntn->dplus-=10;
X curntn->aplus-=10;
X return;
X }
X if(oldpower==ROADS){
X curntn->maxmove-=4;
X return;
X }
X if(oldpower==ARMOR){
X curntn->maxmove+=3;
X curntn->dplus-=20;
X return;
X }
X if(oldpower==MI_MONST) {
X for(armynum=0;armynum<MAXARM;armynum++){
X if(P_ATYPE == A_ORC) P_ATYPE=defaultunit(country);
X }
X return;
X }
X if(oldpower==AV_MONST) {
X for(armynum=0;armynum<MAXARM;armynum++){
X if(P_ATYPE == A_URUK || P_ATYPE == A_OLOG)
X P_ATYPE=defaultunit(country);
X }
X return;
X }
X if(oldpower==ARCHER) {
X for(armynum=0;armynum<MAXARM;armynum++){
X if(P_ATYPE == A_ARCHER) P_ATYPE=defaultunit(country);
X }
X return;
X }
X /* remaining cause no change in statistics */
X}
X
X#ifdef CONQUER
X#ifdef OGOD
X/* killmagk: this routine removes a magic power */
Xkillmagk()
X{
X int count,choice,i;
X
X clear();
X count=3;
X standout();
X mvprintw(0,(COLS/2)-15,"MAGIC POWERS FOR %s",curntn->name);
X standend();
X i=0;
X while( powers[i] != 0 ){
X if(magic(country,powers[i])==TRUE) {
X mvprintw(count,0,"%d: power %s",i+1,*(pwrname+i));
X count++;
X }
X i++;
X }
X count++;
X standout();
X mvaddstr(count++,5," Which power to remove? ");
X standend();
X refresh();
X choice=get_number();
X if(choice!=0) {
X mvprintw(count++,0," Remove magic #%d? (y or [n])",choice);
X refresh();
X if (getch()=='y') {
X if(magic(country,powers[choice-1])) {
X curntn->powers ^= powers[choice-1];
X removemgk(powers[choice-1]);
X }
X }
X }
X}
X#endif OGOD
X
X#define NUMSPELLS 4
Xchar *spellstr[NUMSPELLS]={"(S)ummon","(F)light","(A)ttack Enhancement",
X "(D)efense Enhancement"};
X/* quick adjustment to allow magical status change */
Xint magicstat[NUMSPELLS]={DEFEND, FLIGHT, MAGATT, MAGDEF};
X/* number of soldiers per point of spell cost */
Xint magiccost[NUMSPELLS]={0,100,300,300};
X/* routine to perform spells */
Xvoid
Xwizardry()
X{
X int i,xspt,yspt,choice,armynum,s_cost;
X char line[80];
X void dosummon();
X
X clear_bottom(0);
X if(curntn->spellpts>0)
X {
X xspt=0; yspt=LINES-3;
X /* summon only to those with summon */
X if (magic(country,SUMMON)==TRUE) i=0;
X else i=1;
X for (;i<NUMSPELLS;i++) {
X sprintf(line," %s",spellstr[i]);
X mvaddstr(yspt,xspt,line);
X xspt += strlen(line);
X if (xspt>COLS-20) {
X xspt=0;
X yspt++;
X }
X }
X mvaddstr(LINES-4,0,"Which spell to cast:");
X refresh();
X choice=NUMSPELLS;
X switch(getch()) {
X case 's':
X case 'S':
X if (magic(country,SUMMON)==TRUE) dosummon();
X else {
X clear_bottom(0);
X errormsg("you do not have SUMMON power");
X }
X break;
X case 'f':
X case 'F':
X choice--;
X case 'a':
X case 'A':
X choice--;
X case 'd':
X case 'D':
X choice--;
X /* change status of currently selected army */
X armynum = getselunit();
X clear_bottom(0);
X if (armynum<0 || armynum>=MAXARM ||
X P_ASTAT==SCOUT || P_ASTAT==TRADED ||
X P_ASTAT==GENERAL || P_ASTAT>NUMSTATUS ||
X P_ASOLD<=0) {
X errormsg("Invalid Unit for Magicking");
X } else if(P_ASTAT==ONBOARD) {
X errormsg("Carried armies must be unloaded");
X } else if(P_ASTAT==magicstat[choice]) {
X errormsg("Unit has already been magicked");
X } else if(P_ASTAT==MARCH) {
X errormsg("That unit is too busy marching");
X } else {
X /*cost of 1 spell point for magiccost men*/
X s_cost = (P_ASOLD-1) / magiccost[choice] + 1;
X if (s_cost > curntn->spellpts) {
X sprintf(line,"You don't have %d spell points",s_cost);
X errormsg(line);
X } else {
X change_status(armynum,magicstat[choice]);
X curntn->spellpts -= s_cost;
X EDECSPL;
X }
X }
X break;
X default:
X break;
X }
X }
X else errormsg("You have no spell points for spell casting");
X makebottom();
X}
X#endif CONQUER
END_OF_FILE
if test 22754 -ne `wc -c <'magic.c'`; then
echo shar: \"'magic.c'\" unpacked with wrong size!
fi
# end of 'magic.c'
fi
echo shar: End of archive 8 \(of 14\).
cp /dev/null ark8isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 14 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0