|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T c
Length: 32409 (0x7e99)
Types: TextFile
Names: »commands.c.orig«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Conquer/commands.c.orig«
/*conquer : Copyright (c) 1988 by Ed Barlow.
* I spent a long time writing this code & I hope that you respect this.
* I give permission to alter the code, but not to copy or redistribute
* it without my explicit permission. If you alter the code,
* please document changes and send me a copy, so all can have it.
* This code, to the best of my knowledge works well, but it is my first
* 'C' program and should be treated as such. I disclaim any
* responsibility for the codes actions (use at your own risk). I guess
* I am saying "Happy gaming", and am trying not to get sued in the process.
* Ed
*/
#include "header.h"
#include "data.h"
#include <ctype.h>
#ifdef SYSMAIL
#include <sys/types.h>
#endif SYSMAIL
extern long conq_mail_size;
extern FILE *fexe; /*execute file pointer*/
extern short country;
extern short selector;
extern short pager;
extern short xcurs,ycurs,xoffset,yoffset;
extern short redraw;
int roads_this_turn = 0;
/* routine to determine if the given designation is ok; TRUE for ok */
int
desg_ok(prtflag, desg, sptr)
int prtflag;
char desg;
struct s_sector *sptr;
{
/* check vegetation */
if((desg!=DNODESIG)&&(desg!=DROAD)&&(desg!=DFORT)
&&(desg!=DSTOCKADE)&&(tofood(sptr,country)<DESFOOD)) {
if(prtflag) errormsg("vegetation too sparse");
return(FALSE);
}
/* don't allow the same designation */
if(desg==sptr->designation) {
if(prtflag) errormsg("Hey, get your act together! There is already one there.");
return(FALSE);
}
/* check for city/capitol being made into something else */
if((desg!=DRUIN)
&&((desg!=DCAPITOL && sptr->designation==DCITY)
||sptr->designation==DCAPITOL)) {
if(prtflag) {
char buf[80];
sprintf(buf,"Must first burn down city/capitol (designate as '%c')",DRUIN);
errormsg(buf);
}
return(FALSE);
}
/* check for proper population */
if((sptr->people<500)
&&(desg==DCAPITOL || desg==DCITY || desg==DTOWN)) {
if(prtflag) errormsg("Need 500 people to build a city or town");
return(FALSE);
}
/* only god may create pirate */
if(desg==DBASECAMP) {
if(prtflag) errormsg("A Pirate Cove?? Are you serious?!");
return(FALSE);
}
/* should not appear in display list */
if (prtflag==FALSE &&
((desg==DSPECIAL && sptr->tradegood!=TG_stones) || desg==DNODESIG))
return(FALSE);
if (desg==DRUIN) {
if(sptr->designation!=DCITY&&sptr->designation!=DCAPITOL) {
if(prtflag) errormsg("Ruins may only come from cities or capitols");
return(FALSE);
}
}
if (desg==DCAPITOL || desg==DCITY) {
if((desg==DCAPITOL && sptr->designation!=DCITY)
&& sptr->designation!=DTOWN && sptr->designation!=DRUIN) {
if(prtflag) errormsg("You can't build a city from that!");
return(FALSE);
}
}
/* have this for now... may be too harsh */
if (desg==DMILL || desg==DGRANARY) {
if((sptr->tradegood != TG_none)
&&(*(tg_stype + sptr->tradegood) != DFARM)
&&(*(tg_stype + sptr->tradegood) != 'x')) {
if(prtflag) errormsg("You can't have one of those here!");
return(FALSE);
}
}
if (desg==DUNIVERSITY || desg==DLUMBERYD) {
if((sptr->tradegood != TG_none)
&&(*(tg_stype + sptr->tradegood) != desg)
&&(*(tg_stype + sptr->tradegood) != 'x')) {
if(prtflag) errormsg("You can't have one of those here!");
return(FALSE);
}
}
if(desg==DMINE || desg==DGOLDMINE) {
if( !tg_ok( country, sptr )) {
if(prtflag) errormsg("Your people refuse to be unemployed");
return(FALSE);
}
if((desg==DMINE && sptr->metal==0 )
||( desg==DGOLDMINE && sptr->jewels==0)) {
if(prtflag) errormsg("Your people refuse to be unemployed");
return(FALSE);
}
}
if((desg==DSPECIAL)&&(magic(country,SUMMON)!=TRUE)) {
if(prtflag) errormsg("You are gonna need SUMMON power to use those stones!");
return(FALSE);
}
return(TRUE);
}
/*change current hex designation*/
void
redesignate()
{
char newdes;
char tgtype[NAMELTH+1];
struct s_sector *sptr= &sct[XREAL][YREAL];
short x,y;
long metal=0;
int isgod=FALSE;
if(country==0){
isgod=TRUE;
country=sptr->owner;
curntn= &ntn[country];
clear_bottom(0);
mvaddstr(LINES-4,0,"SUPER USER: CHANGE (v)egetation, (e)levation, (d)esig, (o)wner, (t)radegood");
refresh();
switch(getch()){
case 'd':
/* fall into normal redesignation command */
break;
case 'e':
/*simple contour map definitions*/
mvprintw(LINES-3,7,"ELEVATIONS: change to %c, %c, %c, %c or %c?",WATER,PEAK,MOUNTAIN,HILL,CLEAR);
refresh();
newdes=getch();
if(newdes!=WATER&&newdes!=PEAK&&newdes!=MOUNTAIN
&&newdes!=HILL&&newdes!=CLEAR) {
reset_god();
return;
}
sptr->altitude=newdes;
if((newdes==PEAK)||(newdes==WATER)) {
sptr->owner=0;
sptr->people=0;
sptr->fortress=0;
}
/*will fall through as must change vegetation*/
case 'v':
/*vegetation types*/
mvprintw(LINES-3,7,"VEGETATIONS: change to %c, %c, %c, %c, %c, %c, %c, %c, %c, %c, %c or %c?",
VOLCANO,DESERT,TUNDRA,BARREN,LT_VEG,
GOOD,WOOD,FOREST,JUNGLE,SWAMP,ICE,NONE);
refresh();
newdes=getch();
if(newdes!=VOLCANO
&&newdes!=DESERT&&newdes!=TUNDRA
&&newdes!=BARREN&&newdes!=LT_VEG
&&newdes!=NONE&&newdes!=GOOD
&&newdes!=WOOD&&newdes!=FOREST&&newdes!=JUNGLE
&&newdes!=SWAMP&&newdes!=ICE) {
reset_god();
return;
}
sptr->vegetation=newdes;
if(tofood(sptr,0)!=0)
sptr->designation=newdes;
reset_god();
return;
case 'o':
mvprintw(LINES-3,7,"what nation owner:");
refresh();
x = get_country();
if (x<NTOTAL) sptr->owner=x;
reset_god();
return;
case 't':
x=TRUE;
while(x==TRUE) {
mvaddstr(LINES-2,7,"new sector tradegood type:");
clrtoeol();
refresh();
get_nname(tgtype);
if(strlen(tgtype)==0) {
reset_god();
return;
}
for(y=0;x==TRUE && y<=TG_none;y++)
if(strcmp(tg_name[y],tgtype)==0) x=FALSE;
}
y--;
if((y!=TG_none)&&(y>END_NORMAL)) {
mvaddstr(LINES-1,7,"new sector value: ");
refresh();
x = get_number();
if(x<100 && x>=0)
if(y>END_MINE) {
sptr->jewels = (char)x;
sptr->metal = 0;
} else {
sptr->metal = (char)x;
sptr->jewels = 0;
}
} else {
sptr->jewels=0;
sptr->metal=0;
}
sptr->tradegood= (char)y;
reset_god();
return;
default:
reset_god();
return;
}
}
if((SOWN!=country)&&(isgod==FALSE)) {
errormsg("Hey! You don't own that sector!");
return;
}
clear_bottom(0);
mvaddstr(LINES-4,0,"Possible sector designations: ");
x = 30;
y = LINES-4;
for(newdes=0; *(des+newdes) != '0'; newdes++ ) {
if((isgod==TRUE)||desg_ok(FALSE,*(des+newdes),sptr)) {
mvprintw(y,x,"(%c)",*(des+newdes));
x+=4;
if(x>COLS-15) {
x=5;
y++;
}
}
}
if((sptr->tradegood != TG_none)
&&( *(tg_stype+sptr->tradegood) != 'x')
&&( isgod==TRUE || desg_ok(FALSE,*(tg_stype+sptr->tradegood),sptr)) )
mvprintw(y,x,"(%c special=>%c)",DSPECIAL,*(tg_stype+sptr->tradegood));
mvaddstr(++y,0,"<Any other key to return> What new designation:");
refresh();
/*read answer*/
if((newdes=getch())==DSPECIAL) {
if((sptr->tradegood == TG_none)
||( *(tg_stype+sptr->tradegood) == 'x')||(isgod==FALSE
&& !desg_ok(FALSE,*(tg_stype+sptr->tradegood),sptr)) ) {
errormsg("no special designation possible" );
if(isgod==TRUE) reset_god();
return;
} else
newdes = *(tg_stype + sptr->tradegood);
}
for(x=0; *(des+x) != '0'; x++ )
if(newdes == *(des+x)) break;
if(*(des+x) == '0') {
if(isgod==TRUE) reset_god();
return;
}
/* validate designation */
if((isgod==FALSE)&&!desg_ok(TRUE,newdes,sptr)) {
return;
}
if (newdes == DROAD && isgod==FALSE) {
if( sptr->people < 100 ) {
errormsg("Need 100+ people to build a road!");
return;
}
roads_this_turn++;
if (roads_this_turn>2) {
roads_this_turn=2;
errormsg("Only two roads a turn! Let the road crews sleep!!");
return;
}
}
/* do not need metal to build a capitol from a city */
if((newdes==DFORT)||(newdes == DTOWN)) metal=DESCOST;
else if((newdes == DCITY)
||(newdes == DCAPITOL && sptr->designation!=DCITY)) metal=5*DESCOST;
if((newdes!=DTOWN)&&(newdes!=DFORT)&&(newdes!=DCITY)&&(newdes!=DCAPITOL)){
/*decrement treasury*/
if((newdes==DRUIN)||(newdes==DDEVASTATED)) {
DEVASTATE(XREAL,YREAL);
} else{
sptr->designation=newdes;
}
SADJDES;
if(newdes == DSTOCKADE)
curntn->tgold-=STOCKCOST*(1-isgod);
else
curntn->tgold-=DESCOST*(1-isgod);
} else if((isgod==FALSE)&&(curntn->metals<metal)) {
errormsg("Not enough metal for city, town, or fort");
} else if((newdes==DCITY)||(newdes==DCAPITOL)) {
if(sptr->designation==DRUIN){
curntn->tgold-=10*DESCOST*(1-isgod);
curntn->metals-=metal/2*(1-isgod);
} else {
curntn->tgold-=20*DESCOST*(1-isgod);
if(newdes==DCITY || sptr->designation!=DCITY)
curntn->metals-=metal*(1-isgod);
}
x=curntn->capx; /* need this for SADJDES2 */
y=curntn->capy;
/* can only have one capitol */
if(newdes==DCAPITOL){
if (sct[x][y].owner==country) {
sct[x][y].designation=DCITY;
SADJDES2;
}
curntn->capx=XREAL;
curntn->capy=YREAL;
}
sptr->designation=newdes;
SADJDES;
} else if((newdes==DFORT)||(newdes==DTOWN)){
curntn->tgold-=10*DESCOST*(1-isgod);
curntn->metals-=metal*(1-isgod);
sptr->designation=newdes;
SADJDES;
} else errormsg("Serious error: What designation are you?");
if(isgod==TRUE) reset_god();
}
/*build fort or ship-type */
void
construct()
{
int tmpvar,tmpvar2,onboard;
long cost;
int armbonus;
int x,y;
short nvynum=0;
short shipsize,amount;
short isgod=FALSE;
char type;
clear_bottom(0);
if(country==0){
isgod=TRUE;
country=sct[XREAL][YREAL].owner;
curntn= &ntn[country];
}
if(sct[XREAL][YREAL].owner!=country) {
errormsg("You do not own");
if(isgod==TRUE) reset_god();
return;
}
if((isgod==FALSE)&&(sct[XREAL][YREAL].people<=500)) {
errormsg("You need over 500 people to construct");
return;
}
if((isgod==FALSE) && (curntn->tgold < 0 )) {
errormsg("You are broke");
return;
}
tmpvar=FALSE;
for(x=XREAL-1;x<=XREAL+1;x++)
for(y=YREAL-1;y<=YREAL+1;y++)
if(ONMAP(x,y) && sct[x][y].altitude==WATER)
tmpvar=TRUE;
if((sct[XREAL][YREAL].designation==DTOWN)
||(sct[XREAL][YREAL].designation==DFORT)
||(sct[XREAL][YREAL].designation==DCAPITOL)
||(sct[XREAL][YREAL].designation==DCITY)) {
/*calculate cost for fort*/
cost=FORTCOST;
if(isgod==TRUE) cost=0;
else for(x=1;x<=sct[XREAL][YREAL].fortress;x++)
cost*=2;
if(sct[XREAL][YREAL].designation==DTOWN) armbonus=TOWNSTR;
else if(sct[XREAL][YREAL].designation==DFORT) armbonus=FORTSTR;
else if(sct[XREAL][YREAL].designation==DCAPITOL) armbonus=CITYSTR;
else if(sct[XREAL][YREAL].designation==DCITY) armbonus=CITYSTR;
if(magic(country,ARCHITECT)==TRUE) armbonus*=2;
if(tmpvar)
mvprintw(LINES-4,0,"<f>ortify sector (+%d%%/%ld talons); <b>uild or <r>epair ships?: ",armbonus,cost);
else
mvprintw(LINES-4,0,"<f>ortify sector (+%d%% - %ld talons):",armbonus,cost);
refresh();
type=getch();
} else {
errormsg("Must construct in town, city, or fortress");
if (isgod==TRUE) reset_god();
return;
}
/* construct ships*/
if((type=='b')||(type=='r')) {
/*check if next to sea*/
if((tmpvar==FALSE)||(sct[XREAL][YREAL].designation==DFORT)){
errormsg("not in a harbor");
if(isgod==TRUE) reset_god();
return;
}
nvynum=getselunit()-MAXARM;
if(type=='r') {
if((nvynum>=MAXNAVY)||(nvynum<0)){
errormsg("INVALID NAVY");
if(isgod==TRUE) reset_god();
return;
}
if (P_NCREW==SHIPCREW) {
errormsg("You may only &^#$! repair damaged fleets!!!");
if(isgod==TRUE) reset_god();
return;
}
clear_bottom(0);
shipsize = flthold(nvynum);
mvprintw(LINES-4,0,"Repairing Fleet (%d)",nvynum);
mvprintw(LINES-4,30,"Storage Units [%d]",shipsize);
mvprintw(LINES-3,0,"crew per unit = %d",(int)P_NCREW);
mvprintw(LINES-3,30,"max crew per unit = %d",SHIPCREW);
mvaddstr(LINES-2,0,"How many crew per unit do you wish to add:");
clrtoeol();
refresh();
amount = (short) get_number();
/* find cost of repairs on all ships */
cost = 0;
for(tmpvar=N_LIGHT;tmpvar<=N_HEAVY;tmpvar++) {
cost += (tmpvar+1)*WARSHPCOST*P_NWAR(tmpvar);
cost += (tmpvar+1)*MERSHPCOST*P_NMER(tmpvar);
cost += (tmpvar+1)*GALSHPCOST*P_NGAL(tmpvar);
}
cost *= amount / SHIPCREW;
if(isgod==TRUE) cost=0;
else if(magic(country,SAILOR)==TRUE) cost/=2L;
if( curntn->tgold < cost ) {
errormsg("NOT ENOUGH GOLD");
if(isgod==TRUE) reset_god();
return;
}
if( sct[XREAL][YREAL].people < amount * shipsize) {
errormsg("NOT ENOUGH CIVILIANS IN SECTOR");
if(isgod==TRUE) reset_god();
return;
}
if( SHIPCREW < P_NCREW + amount ){
errormsg("THAT WOULD EXCEED MAXIMUM SHIP CREW");
if(isgod==TRUE) reset_god();
return;
}
curntn->tgold -= cost;
sct[XREAL][YREAL].people -= amount*shipsize;
P_NCREW += (unsigned char) amount;
NADJCRW;
SADJCIV;
if(isgod==TRUE) reset_god();
return;
}
mvaddstr(LINES-3,0,"Do you wish to raise a new fleet? (y or n)");
clrtoeol();
refresh();
if(getch()=='y') nvynum=(-1);
clear_bottom(0);
if(nvynum<0) {
nvynum=0;
x=(-1);
while((x==(-1))&&(nvynum<MAXNAVY)) {
if(P_NWSHP==0 && P_NMSHP==0 && P_NGSHP==0) {
x=nvynum;
P_NWSHP=0;
P_NMSHP=0;
P_NGSHP=0;
P_NCREW=0;
P_NARMY=MAXARM;
P_NPEOP=0;
NADJHLD;
NADJCRW;
NADJWAR;
NADJMER;
NADJGAL;
}
nvynum++;
}
nvynum=x;
if(nvynum<0){
errormsg("NO FREE NAVIES");
if(isgod==TRUE) reset_god();
return;
} else
mvprintw(LINES-1,0,"Raising New Fleet (%d)",nvynum);
} else mvprintw(LINES-1,0,"Adding to Fleet (%d)",nvynum);
/* process type first to be consistant with drafting */
mvaddstr(LINES-4,0,"What ship type to construct: (W)arship (M)erchant (G)alley?");
refresh();
/*
* Note: 3 and 6 hard-coded for ship sizes based on
* 0 = light 1 = medium 2 = heavy
* Bad technique, but it is not worth saying
* (N_HEAVY-N_LIGHT+1) everywhere.
*/
switch(getch()) {
case 'w':
case 'W':
shipsize=0;
break;
case 'g':
case 'G':
shipsize=3;
break;
case 'm':
case 'M':
shipsize=6;
break;
case ' ':
if(isgod==TRUE) reset_god();
return;
default:
errormsg("Invalid Ship Type");
if(isgod==TRUE) reset_god();
return;
}
mvaddstr(LINES-3,0,"What ship class to construct: (L)ight (M)edium");
if(sct[XREAL][YREAL].designation!=DTOWN) addstr(" (H)eavy?");
else addstr("?");
refresh();
switch(getch()) {
case 'l':
case 'L':
shipsize+=N_LIGHT;
break;
case 'm':
case 'M':
shipsize+=N_MEDIUM;
break;
case 'h':
case 'H':
if(sct[XREAL][YREAL].designation==DTOWN) {
errormsg("Towns cannot construct heavy ships");
if(isgod==TRUE) reset_god();
return;
}
shipsize+=N_HEAVY;
break;
case ' ':
if(isgod==TRUE) reset_god();
return;
default:
errormsg("Invalid Ship Class");
if(isgod==TRUE) reset_god();
return;
}
mvaddstr(LINES-2,0,"How many ships to construct?");
refresh();
amount = (short) get_number();
/*sanity checks*/
if((amount>N_MASK)) amount=0;
if (amount==0)
{
if(isgod==TRUE) reset_god();
return;
}
/* 6 and 3 hard coded ... see above comment */
cost = (long) amount * ( shipsize%3 + 1 );
if (shipsize>=6) {
cost *= MERSHPCOST;
} else if (shipsize>=3) {
cost *= GALSHPCOST;
} else {
cost *= WARSHPCOST;
}
if(isgod==TRUE) cost=0;
else if(magic(country,SAILOR)==TRUE) cost/=2L;
if((cost > curntn->tgold) && (cost > 0)) {
errormsg("sorry - not enough talons");
return;
}
if( sct[XREAL][YREAL].people < amount * SHIPCREW ){
errormsg("NOT ENOUGH CIVILIANS IN SECTOR");
if(isgod==TRUE) reset_god();
return;
}
if((nvynum>=0)&&(nvynum<MAXNAVY)) {
clear_bottom(0);
tmpvar = amount*SHIPCREW*(shipsize%3+1)
+ flthold(nvynum)*P_NCREW;
onboard = P_NPEOP*fltmhold(nvynum);
if (shipsize>=6) {
shipsize %= 3;
tmpvar2 = NADD_MER(amount);
} else if (shipsize>=3) {
shipsize %= 3;
tmpvar2 = NADD_GAL(amount);
} else {
shipsize %= 3;
tmpvar2 = NADD_WAR(amount);
}
/* check for bad build */
if (tmpvar2==FALSE) {
errormsg("Too many such ships in fleet.");
if(isgod==TRUE) reset_god();
return;
}
/* crew average based on number of holding units */
P_NCREW = (unsigned char)( tmpvar / flthold(nvynum) );
sct[XREAL][YREAL].people-=amount*(shipsize+1)*SHIPCREW;
curntn->tgold -= cost;
P_NXLOC =XREAL;
P_NYLOC =YREAL;
P_NMOVE=0;
mvprintw(LINES-4,0,"Fleet (%2d): Warships = [Light %2hd/Medium %2hd/Heavy %2hd]",nvynum,P_NWAR(N_LIGHT),P_NWAR(N_MEDIUM),P_NWAR(N_HEAVY));
mvprintw(LINES-3,0," Merchants = [Light %2hd/Medium %2hd/Heavy %2hd]",P_NMER(N_LIGHT),P_NMER(N_MEDIUM),P_NMER(N_HEAVY));
mvprintw(LINES-2,0,"Avg Crew[%3d] Galleys = [Light %2hd/Medium %2hd/Heavy %2hd]",(int)P_NCREW,P_NGAL(N_LIGHT),P_NGAL(N_MEDIUM),P_NGAL(N_HEAVY));
if(fltmhold(nvynum)>0)
P_NPEOP = (unsigned char) (onboard/fltmhold(nvynum));
else P_NPEOP = 0;
SADJCIV;
NADJCRW;
NADJWAR;
NADJMER;
NADJGAL;
NADJHLD;
NADJLOC;
NADJMOV;
mvprintw(LINES-2,65,"HIT ANY KEY");
refresh();
getch();
} else errormsg("ERROR!!!!!!!!!!!!!");
}
/* construct fortification points*/
else if(type=='f'){
/* can only go into debt as much as the nation has jewels */
if ((curntn->tgold - cost) >= ((-1)*10*curntn->jewels)) {
mvprintw(LINES-2,5,"you build +%d%% fort points for %ld gold",armbonus,cost);
curntn->tgold-=cost;
sct[XREAL][YREAL].fortress++;
INCFORT;
errormsg("");
} else errormsg("you are broke");
}
else errormsg("invalid input error");
if(isgod==TRUE) reset_god();
refresh();
}
/*DRAFT IF IN A CITY*/
void
draft()
{
short armynum,x,y,i;
long men=0,mercs;
short army=(-1), isgod=FALSE, newtype=0;
long i_cost, e_cost;
char ch;
clear_bottom(0);
if(country==0) {
isgod=TRUE;
country=sct[XREAL][YREAL].owner;
curntn= &ntn[country];
} else if(sct[XREAL][YREAL].owner!=country) {
errormsg("You do not own");
return;
}
if((sct[XREAL][YREAL].designation!=DTOWN)
&&(sct[XREAL][YREAL].designation!=DCAPITOL)
&&(sct[XREAL][YREAL].designation!=DCITY)) {
errormsg("must raise in towns/cities/capitols");
if(isgod==TRUE) reset_god();
return;
}
if(curntn->tgold <= 0){
errormsg("you are broke");
if(isgod==TRUE) reset_god();
return;
}
if((sct[XREAL][YREAL].designation==DTOWN)
&&(sct[XREAL][YREAL].people*(2*CITYLIMIT+(curntn->tsctrs/2))<curntn->tciv)){
mvprintw(LINES-1,0,"need %d people in sector: hit any key",curntn->tciv/(2*CITYLIMIT+(curntn->tsctrs/2)));
refresh();
getch();
if(isgod==TRUE) reset_god();
return;
}
/*ask what type of unit*/
y=LINES-2;
mvaddstr(y,0,"options: 1) spy 2) scout");
clrtoeol();
x=25;
for(i=0;i<=NOUNITTYPES;i++){
if(unitvalid(i)==TRUE) {
mvprintw(y,x+2,"%s",*(shunittype+i));
mvprintw(y,x,"(%c)",*(shunittype+i)[0]);
x+= strlen( *(shunittype+i) ) +3;
if(x>COLS-10){
x=0;
y++;
}
}
}
move(y,x);
clrtoeol();
if((magic(country,WARRIOR)==TRUE)
||(magic(country,WARLORD)==TRUE)
||(magic(country,CAPTAIN)==TRUE))
mvaddstr(LINES-3,0,"(Warrior = 1/2 enlist cost) what type of unit do you want:");
else
mvaddstr(LINES-3,0,"what type of unit do you want to raise:");
clrtoeol();
refresh();
ch = getch();
for(newtype=0;newtype<=NOUNITTYPES;newtype++)
if(ch == *(shunittype+newtype)[0]) break;
if((newtype == NOUNITTYPES+1 )||(unitvalid(newtype)==FALSE)) {
if( ch == '1' ) newtype=A_SPY;
else if( ch == '2' ) newtype=A_SCOUT;
else {
errormsg("Invalid type");
if (isgod==TRUE) reset_god();
return;
}
}
clear_bottom(0);
/* marines and sailors may only be drafted in harbors */
if(newtype==A_MARINES || newtype==A_SAILOR) {
i=FALSE;
for (x=XREAL-1;x<=XREAL+1;x++)
for (y=YREAL-1;y<=YREAL+1;y++)
if (sct[x][y].altitude==WATER) i=TRUE;
/* not a harbor */
if (i==FALSE) {
if (newtype==A_MARINES)
errormsg("Huh? What would marines do without the water?");
else errormsg("You gotta be kinding!? Sailors on land?");
if (isgod==TRUE) reset_god();
return;
}
}
/*raise an untrained army */
i = FALSE;
if( newtype==A_SPY || newtype==A_SCOUT ) {
men=1;
} else {
mvprintw(LINES-3,0,"how many %s do you wish to raise:",unittype[newtype]);
clrtoeol();
refresh();
men = get_number();
if(men<=0) {
if (isgod==TRUE) reset_god();
return;
}
}
/* i_people*256 is initial people -> can draft up to following */
/* draftable = max_draft - already drafted */
/* = imen/4 - ( imen - people) */
/* = -3/4 * imen + people) */
/* 192 comes from 3*256/4 */
if((men > sct[XREAL][YREAL].people - (sct[XREAL][YREAL].i_people*192))
||(sct[XREAL][YREAL].i_people <= 0)) {
if(sct[XREAL][YREAL].i_people <= 0)
errormsg("error: sector wasn't city at beginning of turn");
else errormsg("error: raising too many soldiers");
if(isgod==TRUE) reset_god();
return;
}
/* check that you dont have too many mercenaries */
mercs=0;
if(newtype == A_MERCENARY){
int totalsolds=0;
for(armynum=0;armynum<MAXARM;armynum++){
if(P_ATYPE<MINLEADER) {
if(P_ATYPE==A_MERCENARY) mercs+=P_ASOLD;
totalsolds+=P_ASOLD;
}
}
if(men+mercs > (totalsolds+men)/2) {
errormsg("you would then have more than 50%% mercenaries");
if(isgod==TRUE) reset_god();
return;
}
if(mercgot+men > MERCMEN/NTOTAL) {
errormsg("there are not that many mercanaries available");
if(isgod==TRUE) reset_god();
return;
}
}
e_cost= (long) *(u_encost+newtype) * men;
i_cost= (long) *(u_enmetal+newtype) * men;
/*magiced get 1/2 enlistment costs*/
if((magic(country,WARRIOR)==TRUE)
||(magic(country,WARLORD)==TRUE)
||(magic(country,CAPTAIN)==TRUE))
e_cost/=2;
if((magic(country,SAPPER)==TRUE)
&&((newtype==A_SIEGE)||(newtype==A_CATAPULT))){
e_cost/=2;
i_cost/=2;
}
/*check to see if enough gold*/
if(e_cost > curntn->tgold) {
errormsg("You don't have enough talons");
if(isgod==TRUE) reset_god();
return;
} else if(i_cost > curntn->metals) {
mvprintw(LINES-2,0,"You don't have %ld metal",i_cost);
clrtoeol();
refresh();
getch();
if(isgod==TRUE) reset_god();
return;
} else {
move(LINES-2,0);
clrtoeol();
}
/*count is order of that army in sector*/
/*armynum is number of that army*/
if((armynum=getselunit())>=0){
if(armynum>=MAXARM || newtype==A_SPY || newtype==A_SCOUT) {
army = -1;
} else {
/*if different types, must raise new army*/
if((newtype == P_ATYPE)&&(P_ASTAT!=ONBOARD)) {
mvaddstr(LINES-1,0,"Do you wish to raise a new army:");
clrtoeol();
refresh();
if(getch()!='y') army=armynum;
else army= -1;
}
else army=(-1);
}
}
if(army==(-1)) {
mvprintw(LINES-2,0,"(%s, gold talons=%ld, metal=%ld) raising a new army",*(unittype+newtype),e_cost,i_cost);
clrtoeol();
refresh();
sleep(1);
armynum=0;
while((army==(-1))&&(armynum<MAXARM)) {
if(P_ASOLD<=0) {
army=armynum;
P_ASOLD=0;
if( newtype==A_MILITIA )
P_ASTAT=MILITIA;/* new militia units=MILITIA */
else
P_ASTAT=DEFEND; /* set new armies to DEFEND */
AADJSTAT;
AADJMEN;
}
armynum++;
}
if(army==(-1)){
errormsg("NO FREE ARMIES");
if(isgod==TRUE) reset_god();
return;
}
armynum=army;
} else {
mvprintw(LINES-2,0,"(%s, gold talons=%ld, metal=%ld) adding to existing army",*(unittype+newtype),e_cost,i_cost);
clrtoeol();
refresh();
sleep(2);
}
if( newtype == A_SPY ) {
while(TRUE){
clear_bottom(0);
mvaddstr(LINES-3,0,"Spy Against What Nation: ");
refresh();
if((i = get_country())==(-1)) {
if (isgod==TRUE) reset_god();
return;
}
if(i==country) {
errormsg("What? You don't even trust yourself?");
i=NTOTAL;
}
if(!(isntn(ntn[i].active))) {
errormsg("You can't spy against them");
i=NTOTAL;
}
if( i<NTOTAL && isactive(i)) break;
}
if(curntn->dstatus[i]!=UNMET) {
P_AYLOC = ntn[i].capy;
P_AXLOC = ntn[i].capx;
mvprintw(LINES-2,0,"The Spy Starts in %s's Capitol (%d,%d)",
ntn[i].name,P_AXLOC,P_AYLOC);
clrtoeol();
} else {
clear_bottom(0);
mvprintw(LINES-4,0,"You do not yet know where %s is",ntn[i].name);
mvaddstr(LINES-3,0,"Have the Spy start from this sector? [y or n]");
refresh();
if(getch()!='y') {
if(isgod==TRUE) reset_god();
return;
}
P_AYLOC = YREAL;
P_AXLOC = XREAL;
mvprintw(LINES-2,0,"Intelligence indicates that %s lies to the %s",ntn[i].name,
*(directions+compass(P_AXLOC,P_AYLOC,ntn[i].capx,ntn[i].capy)));
clrtoeol();
}
errormsg("");
redraw=TRUE;
} else {
P_AYLOC=YREAL;
P_AXLOC=XREAL;
}
if( newtype == A_SPY || newtype == A_SCOUT ) {
P_ASTAT = SCOUT;
AADJSTAT;
}
P_ATYPE=newtype;
if(P_ATYPE != A_MERCENARY){
sct[XREAL][YREAL].people -= men;
SADJCIV;
} else {
mercgot += men;
AADJMERC;
}
AADJLOC;
P_AMOVE=0;
AADJMOV;
P_ASOLD+=men;
AADJMEN;
if(P_ASTAT>=NUMSTATUS) {
P_ASTAT=ATTACK;
AADJSTAT;
}
curntn->metals -= i_cost;
curntn->tgold -= e_cost;
makemap(); /* if display 'y' is set, this will show new army */
if(isgod==TRUE) reset_god();
}
/*go through msgfile not rewriting to temp messages you discard*/
/* then move temp to msgfile*/
void
rmessage()
{
int unlink();
FILE *mesgfp;
FILE *fptemp;
int i;
int count,msglen;
int contd;
int done=FALSE;
char tempfile[ 30 ];
char mesgfile[ 30 ];
char line[80], inpch;
char save[50][80];
/*open file*/
sprintf(tempfile,"%s%hd.tmp",msgfile,country);
if( (fptemp = fopen(tempfile,"w")) == NULL ) {
clear_bottom(0);
sprintf(mesgfile,"error: %s open",tempfile);
errormsg(mesgfile);
redraw=FALSE;
makebottom();
return;
}
sprintf(mesgfile,"%s%d",msgfile,country);
if ((mesgfp=fopen(mesgfile,"r"))==NULL) {
(void) unlink (tempfile) ;
clear_bottom(0);
errormsg("no messages");
makebottom();
redraw=FALSE;
return;
}
/*read in file a line at at time*/
if(fgets(line,80,mesgfp)==NULL) {
done=TRUE;
redraw=FALSE;
clear_bottom(0);
errormsg("no messages");
makebottom();
}
if (done==FALSE) clear();
while(done==FALSE) {
contd=FALSE;
msglen=0;
count=3;
clear();
standout();
/*print to end of message*/
while(contd==FALSE) {
if(msglen<50) strcpy(save[msglen],line);
if(count==LINES-3) {
standout();
mvaddstr(LINES-3,(COLS/2)-8,"--- more ---");
standend();
refresh();
getch();
clear();
count=3;
}
mvprintw(count,0,"%s",line);
standend();
count++;
msglen++;
if(fgets(line,80,mesgfp)==NULL) contd=TRUE;
if(strncmp(line,"END",3)==0) contd=TRUE;
}
standout();
mvaddstr(LINES-3,(COLS/2)-22,"HIT ANY KEY TO CONTINUE");
mvaddstr(LINES-2,(COLS/2)-22,"HIT RETURN TO DELETE MESSAGE");
standend();
refresh();
inpch=getch();
if((inpch!='\n' && inpch!='\r')) {
for(i=0;i<msglen;i++) fputs(save[i],fptemp);
strcpy(line,"END\n");
fputs(line,fptemp);
}
if(fgets(line,80,mesgfp)==NULL) done=TRUE;
}
fclose(mesgfp);
fclose(fptemp);
/*IMPLEMENT A MOVE BETWEEN TMP FILE AND REAL FILE HERE*/
move_file( tempfile, mesgfile );
#ifdef SYSMAIL
/* increase size to ensure mail check works */
conq_mail_size++;
#endif SYSMAIL
}
void
wmessage()
{
int x,y;
int done=FALSE;
char ch;
char name[NAMELTH+1];
int temp=(-1);
int linedone;
char line[100];
/*what nation to send to*/
clear();
mvprintw(0,0,"to send a message to the administrator, send to 'god';");
mvprintw(1,0,"to post to the news, send to 'news':");
mvprintw(2,0,"Enter the name of the country to send to:");
refresh();
temp=get_country();
if( temp == (-2) ) {
strcpy(name,"news");
} else {
/* quick return on bad input */
if(temp==(-1) || temp>=NTOTAL
|| (!isntn(ntn[temp].active) && temp!=0))
return;
strcpy(name,ntn[temp].name); /* find nation name */
}
mailopen( temp );
move(0,0);
clrtoeol();
move(1,0);
clrtoeol();
move(2,0);
clrtoeol();
standout();
if(temp != -2)
mvprintw(3,(COLS-25)/2,"message to nation %s",name);
else
mvprintw(3,(COLS-25)/2,"message to all players");
mvprintw(LINES-2,(COLS-35)/2,"end with a return on a new line");
standend();
if(temp != -2) {
if (country==0)
fprintf(fm,"Message to %s from GOD (%s of year %d)\n",name,PSEASON(TURN),YEAR(TURN));
else fprintf(fm,"Message to %s from %s (%s of year %d)\n",name,curntn->name,PSEASON(TURN),YEAR(TURN));
} else fprintf(fm,"5.----------\n");
y=6;
x=0;
refresh();
while(done==FALSE) {
linedone=FALSE;
ch=' ';
/*read line*/
while(linedone==FALSE){
/* check for delete or backspace */
if(ch=='\b' || ch=='\177'){
if(x>1) x--;
mvaddch(y,x,' ');
move(y,x);
line[x]=' ';
refresh();
ch=getch();
} else if((ch=='\n')||(ch=='\r')) linedone=TRUE;
else if(isprint(ch)&&(x<65)){
/*concatonate to end*/
line[x]=ch;
mvaddch(y,x,ch);
x++;
refresh();
ch=getch();
} else if (ch=='\f
') {
refresh();
ch=getch();
} else ch=getch();
}
if((ch!='\n')&&(ch!='\r')) {
mvaddch(y,x,ch);
line[x]=ch;
x++;
}
line[x]='\0';
/*write to file*/
if(x<=1) done=TRUE;
else if (temp != -2) fprintf(fm,"%s\n",line);
else {
if (country!=0) fprintf(fm,"5.%-9s:%s\n",curntn->name,line);
else fprintf(fm,"5.God :%s\n",line);
}
x=0;
y++;
}
if (temp != -2) mailclose();
else {
mailok=FALSE;
fclose(fm);
}
}
/*strategic move of civilians...once only*/
void
moveciv()
{
long people;
short i,j;
clear_bottom(0);
if(sct[XREAL][YREAL].owner!=country){
errormsg("you do not own");
makebottom();
return;
}
else if(sct[XREAL][YREAL].people==0){
errormsg("nobody lives here!!!");
makebottom();
return;
}
mvprintw(LINES-4,0,"Sector contains %d people [cost 50 per civilian]",sct[XREAL][YREAL].people);
mvaddstr(LINES-3,0,"how many people to move?");
clrtoeol();
refresh();
people = get_number();
if((people<0)
||(people>sct[XREAL][YREAL].people)
||(people*50>curntn->tgold)){
errormsg("Sorry...Input error or you do not have the gold talons");
makebottom();
return;
}
mvprintw(LINES-4,0,"sector location is x=%d, y=%d",XREAL,YREAL);
clrtoeol();
mvaddstr(LINES-3,0,"what x location to move to?");
clrtoeol();
refresh();
i = get_number();
if((i-(XREAL))>2||(i-(XREAL))<-2) {
errormsg("sorry, can only move two sectors");
makebottom();
return;
}
mvaddstr(LINES-2,0,"what y location to move to?");
clrtoeol();
refresh();
j = get_number();
if((j-(YREAL)>2)||((YREAL)-j>2)) {
errormsg("sorry, can only move two sectors");
}
else if(sct[i][j].owner!=country){
errormsg("sorry, you dont own it...");
}
/*need to check move cost > 0 for sector*/
else if(movecost[i][j]<0){
errormsg("you can't enter there...");
}
else if ((i!=XREAL)||(j!=YREAL)){
curntn->tgold-=50*people;
sct[XREAL][YREAL].people-=people;
SADJCIV;
sct[i][j].people+=people;
SADJCIV2;
}
makebottom();
}
int
armygoto()
{
short armynum=0,loop=0;
armynum=getselunit();
if((armynum<0)||(armynum>MAXARM)) armynum=0;
else armynum++;
/* move to next army with > 0 soldiers or army not in group */
while((armynum < MAXARM) && ((P_ASOLD <= 0) || (P_ASTAT>=NUMSTATUS)))
armynum++;
if(armynum >= MAXARM) {
armynum=0;
if(P_ASOLD <= 0) return(0);
}
/*move to correct location*/
xcurs = P_AXLOC - xoffset;
ycurs = P_AYLOC - yoffset;
coffmap();
/*select correct unit*/
selector=0;
pager=0;
while((getselunit() != armynum) && (loop++ < 500)) {
selector+=2;
if(selector>=10) {
selector=0;
pager+=1;
}
}
return(1);
}
int
navygoto()
{
short nvynum=0,loop=0;
nvynum=getselunit()-MAXARM;
if((nvynum<0)||(nvynum>MAXNAVY)) nvynum=0;
else nvynum++;
/* move to next nvy with > 0 soldiers*/
while ((nvynum < MAXNAVY) && (P_NMSHP==0) && (P_NWSHP==0)
&& (P_NGSHP == 0)) nvynum++;
if(nvynum >= MAXNAVY) {
nvynum=0;
if((P_NMSHP==0)&&(P_NWSHP==0)&&(P_NGSHP == 0)) return(0);
}
/*move to correct location*/
xcurs = P_NXLOC - xoffset;
ycurs = P_NYLOC - yoffset;
coffmap();
/*select correct unit*/
selector=0;
pager=0;
while(((getselunit()-MAXARM) != nvynum) && (loop++ < 500)) {
selector+=2;
if(selector>=10) {
selector=0;
pager+=1;
}
}
return(1);
}