|
|
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 m
Length: 22755 (0x58e3)
Types: TextFile
Names: »magic.c.orig«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Conquer/magic.c.orig«
/*conquer : Copyright (c) 1988 by Ed Barlow.
* I spent a long time writing this code & I hope that you respect this.
* I give permission to alter the code, but not to copy or redistribute
* it without my explicit permission. If you alter the code,
* please document changes and send me a copy, so all can have it.
* This code, to the best of my knowledge works well, but it is my first
* 'C' program and should be treated as such. I disclaim any
* responsibility for the codes actions (use at your own risk). I guess
* I am saying "Happy gaming", and am trying not to get sued in the process.
* Ed
*/
/*create a new login for a new player*/
#include "header.h"
#include "data.h"
#include <ctype.h>
extern short country;
extern short redraw;
extern FILE *fexe;
extern FILE *fnews;
/*give player one new magic power in current magic (powers)*/
/*do nothing if that player has that power or it is not permitted*/
/*getmagic() returns the value of the power gained, and stores it in power*/
long
getmagic(type)
int type;
{
long newpower;
int start,end;
switch(type){
case M_MGK:
start=S_MGK;
end=E_MGK;
break;
case M_CIV:
start=S_CIV;
end=E_CIV;
break;
case M_MIL:
start=S_MIL;
end=E_MIL;
break;
default:
printf("fatal error in num_powers");
abrt();
}
newpower=powers[start+(rand()%end)];
if(newpower==0) {
printf("ILLEGAL POWER");
abrt();
}
if((newpower==WARRIOR)||(newpower==CAPTAIN)||(newpower==WARLORD)){
if(magic(country,WARRIOR)!=TRUE){
curntn->powers|=WARRIOR;
return(WARRIOR);
}
else if(magic(country,CAPTAIN)!=TRUE){
curntn->powers|=CAPTAIN;
return(CAPTAIN);
}
else if(magic(country,WARLORD)!=TRUE){
curntn->powers|=WARLORD;
return(WARLORD);
}
else return(0L);
}else if((newpower==MI_MONST) ||(newpower==AV_MONST) ||(newpower==MA_MONST)){
if(curntn->race!=ORC) return(0L);
if(magic(country,MI_MONST)!=TRUE){
curntn->powers|=MI_MONST;
return(MI_MONST);
}
else if(magic(country,AV_MONST)!=TRUE){
curntn->powers|=AV_MONST;
return(AV_MONST);
}
else if(magic(country,MA_MONST)==TRUE){
curntn->powers|=MA_MONST;
return(MA_MONST);
}
else return(0L);
}else if(newpower==CAVALRY){
if(curntn->race==ORC) return(0L);
if(isnotpc(curntn->active)) return(0L); /*npc nation*/
if(magic(country,newpower)==TRUE) return(0L);
curntn->powers|=newpower;
return(newpower);
}else if(newpower==URBAN){
if(magic(country,BREEDER)==TRUE) return(0L);
if(magic(country,newpower)==TRUE) return(0L);
curntn->powers|=newpower;
return(newpower);
}else if(newpower==RELIGION){
if(curntn->race==ORC) return(0L);
if(magic(country,newpower)==TRUE) return(0L);
curntn->powers|=newpower;
return(newpower);
}else if(newpower==KNOWALL){
#ifdef OGOD
#ifdef HIDELOC
/* only god should have KNOWALL if sectors hidden */
if(country!=0) return(0L);
#endif
#endif
if(magic(country,KNOWALL)==TRUE) return(0L);
curntn->powers|=KNOWALL;
return(KNOWALL);
}else if((newpower==SLAVER)
||(newpower==DERVISH)
||(newpower==HIDDEN)
||(newpower==ARCHITECT)
||(newpower==THE_VOID)
||(newpower==ARCHER)){
if((magic(country,newpower)==TRUE)
||((newpower==DERVISH)&&(magic(country,DESTROYER)==TRUE)))
return(0L);
curntn->powers|=newpower;
return(newpower);
}else if(newpower==DESTROYER){
if((curntn->race!=ELF)
&&(magic(country,DESTROYER)!=TRUE)
&&(magic(country,DERVISH)!=TRUE)){
curntn->powers|=DESTROYER;
return(DESTROYER);
}
return(0L);
}else if(newpower==VAMPIRE){
if((curntn->race!=ELF)&&(magic(country,VAMPIRE)!=TRUE)){
curntn->powers|=VAMPIRE;
return(VAMPIRE);
}
return(0L);
}else if(newpower==MINER){
if((curntn->race!=ELF)&&(curntn->race!=DWARF)&&(magic(country,MINER)!=TRUE)){
curntn->powers|=MINER;
return(MINER);
}
return(0L);
}else if(newpower==STEEL){
if(magic(country,STEEL)==TRUE) return(0L);
if(magic(country,MINER)!=TRUE) return(0L);
curntn->powers|=STEEL;
return(STEEL);
}else if(newpower==BREEDER){
if(magic(country,URBAN)==TRUE) return(0L);
if(magic(country,BREEDER)==TRUE) return(0L);
if(curntn->race!=ORC) return(0L);
curntn->powers|=BREEDER;
return(BREEDER);
}
else if(isnotpc(curntn->active)) {
return(0L); /* remaining powers only for pc's */
} else if((newpower==NINJA)
||(newpower==SLAVER)
||(newpower==SAILOR)
||(newpower==DEMOCRACY)
||(newpower==ROADS)
||(newpower==SAPPER)
||(newpower==ARMOR)
||(newpower==AVIAN)){
if(magic(country,newpower)==TRUE) return(0L);
curntn->powers|=newpower;
return(newpower);
}
else if((newpower==SUMMON)||(newpower==WYZARD)||(newpower==SORCERER)){
/* dwarves may not cast spells */
if(curntn->race==DWARF) return(0L);
if(magic(country,SUMMON)!=TRUE) {
curntn->powers|=SUMMON;
return(SUMMON);
} else if(magic(country,WYZARD)!=TRUE) {
curntn->powers|=WYZARD;
return(WYZARD);
} else if(magic(country,SORCERER)!=TRUE) {
curntn->powers|=SORCERER;
return(SORCERER);
} else return(0L);
} else return(0L);
}
#ifdef CONQUER
/*form to interactively get a magic power*/
void
domagic()
{
int count, done=FALSE, loop=0, i,type;
long price,x;
short isgod=0;
if(country==0) {
isgod=TRUE;
if (get_god()) return;
}
while(done==FALSE){
done=TRUE;
clear();
count=3;
redraw=TRUE;
standout();
mvprintw(0,(COLS/2)-15,"MAGIC POWERS FOR %s",curntn->name);
mvprintw(count++,30,"1) %d military powers: %ld jewels",
num_powers(country,M_MIL) ,getmgkcost(M_MIL,country));
mvprintw(count++,30,"2) %d civilian powers: %ld jewels",
num_powers(country,M_CIV) ,getmgkcost(M_CIV,country));
mvprintw(count++,30,"3) %d magic powers: %ld jewels",
num_powers(country,M_MGK),getmgkcost(M_MGK,country));
price = getmgkcost(M_MIL,country);
if(price > getmgkcost(M_CIV,country))
price = getmgkcost(M_CIV,country);
if(price > getmgkcost(M_MGK,country))
price = getmgkcost(M_MGK,country);
#ifdef OGOD
if (isgod==TRUE) price=0;
#endif OGOD
standend();
count=3;
/*print the powers that you have*/
i=0;
while( powers[i] != 0 ){
if(magic(country,powers[i])==TRUE)
mvprintw(count++,0,"you have power %s",*(pwrname+i));
i++;
}
if(count<=7) count=8;
else count++;
standout();
mvprintw(count++,0,"YOU HAVE %ld JEWELS IN YOUR TREASURY",curntn->jewels);
if(price < curntn->jewels){
mvaddstr(count++,0,"DO YOU WISH TO BUY A RANDOM NEW POWER (enter y or n):");
standend();
refresh();
count++;
if(getch()=='y'){
done=FALSE;
mvprintw(count++,0,"ENTER SELECTION (1,2,3):");
refresh();
type = getch() - '0';
if(type==M_MIL || type==M_CIV || type==M_MGK){
price=getmgkcost(type,country);
#ifdef OGOD
if (isgod==TRUE) price=0;
#endif OGOD
if(curntn->jewels>=price) {
loop = 0;
while(loop++ < 500) if((x=getmagic(type))!=0){
curntn->jewels -= price;
CHGMGK;
exenewmgk(x);
refresh();
if (isgod==TRUE) reset_god();
break;
}
if (loop >= 500)
errormsg("You have too many powers!");
} else errormsg("CAN'T AFFORD A NEW POWER");
} else errormsg("BAD SELECTION");
}
} else {
mvaddstr(LINES-1,0,"CAN'T AFFORD A NEW POWER");
clrtoeol();
mvaddstr(LINES-1,60,"PRESS ANY KEY");
refresh();
standend();
getch();
}
#ifdef ORCTAKE
if((curntn->race==ORC)&&(curntn->jewels>=ORCTAKE)&&(curntn->spellpts>=TAKEPOINTS))
done |= orctake(&count);
#endif ORCTAKE
#ifdef OGOD
if (isgod==TRUE) {
mvaddstr(count++,0,"GOD: REMOVE A MAGIC POWER? (y or n)");
refresh();
if (getch()=='y') killmagk();
}
#endif OGOD
}
if(isgod==TRUE) reset_god();
}
#endif CONQUER
#ifdef ORCTAKE
/*do magic for both npcs and pcs in update*/
/*if target is 0 then it is update and target will be picked randomly*/
int
takeover(percent,target)
int percent,target;
{
int loop=1,y,save,isupdate=0;
save=country;
if(target==country) return(0);
if(target==0) isupdate=1;
country=target;
if(rand()%100<percent){
loop=0;
y=0;
if (target==0) while(loop==FALSE){
y++;
country=rand()%NTOTAL;
if((ntn[country].race==ntn[save].race)
&&(isnpc(ntn[country].active))
&&(curntn->dstatus[country]<HOSTILE)
&&(curntn->dstatus[country]!=UNMET)
&&(country!=save))
loop=TRUE;
else if(y>=500) {
country=save;
return(0);
}
}
sct[ntn[country].capx][ntn[country].capy].owner=save;
if(isupdate==1){
printf("nation %s magically taken over by %s\n",ntn[country].name,ntn[save].name);
fprintf(fnews,"1.\tnation %s magically taken over by %s\n",ntn[country].name,ntn[save].name);
}
else {
DESTROY;
if ((fnews=fopen("/dev/null","w"))==NULL){
printf("error opening null file\n");
exit(FAIL);
}
}
destroy(country);
sct[ntn[country].capx][ntn[country].capy].designation=DCITY;
if(isupdate!=1) fclose(fnews);
y=country;
country=save;
return(y);
}
country=save;
return(0);
}
#endif ORCTAKE
/*execute new magic*/
void
exenewmgk(newpower)
long newpower;
{
short x,armynum;
#ifdef ADMIN
short y;
#endif
if(newpower==WARRIOR) {
curntn->aplus+=10;
curntn->dplus+=10;
return;
}
if(newpower==CAPTAIN) {
curntn->aplus+=10;
curntn->dplus+=10;
return;
}
if(newpower==WARLORD) {
curntn->aplus+=10;
curntn->dplus+=10;
return;
}
if(newpower==RELIGION) {
if(curntn->race==ORC) {
printf("ORCS CANT HAVE RELIGION POWER\n");
abrt();
} else if(curntn->repro<=8){
curntn->repro+=2;
} else if(curntn->repro==9){
curntn->repro=10;
curntn->dplus+=5;
} else if(curntn->repro>=10){
curntn->dplus+=10;
}
return;
}
if(newpower==DESTROYER) {
/* this ifdef is so that destroyer only takes place in an update */
#ifdef ADMIN
for(x=curntn->capx-3;x<=curntn->capx+3;x++) {
for(y=curntn->capy-3;y<=curntn->capy+3;y++){
if((ONMAP(x,y))
&&(sct[x][y].altitude!=WATER)
#ifdef DERVDESG
&&((rand()%2)==0)
#else
&&(tofood( &sct[x][y],0)<6)
#endif DERVDESG
&&((x!=curntn->capx)
||(y!=curntn->capy))){
sct[x][y].vegetation=DESERT;
sct[x][y].designation=DNODESIG;
}
}
}
fprintf(fnews,"1.\tnation %s gets destroyer power: land turns to desert\n",curntn->name);
#endif ADMIN
updmove(curntn->race,country);
return;
}
if(newpower==DERVISH) {
updmove(curntn->race,country);
return;
}
if((newpower==MI_MONST)
||(newpower==AV_MONST)
||(newpower==MA_MONST)
||(newpower==KNOWALL)
||(newpower==HIDDEN)
||(newpower==THE_VOID)
||(newpower==ARCHITECT)
||(newpower==MINER))
return;
if(newpower==VAMPIRE) {
curntn->aplus-=35;
curntn->dplus-=35;
for(armynum=0;armynum<MAXARM;armynum++){
if((P_ATYPE == A_INFANTRY)||(P_ATYPE == A_MILITIA))
P_ATYPE=A_ZOMBIE;
}
return;
}
if(newpower==URBAN) {
if(curntn->race==ORC) {
x=curntn->repro;
if(curntn->repro>=14){
curntn->maxmove+=3;
}
else if(curntn->repro>11){
curntn->maxmove+= x-11;
curntn->repro=14;
}
else curntn->repro+=3;
}
else if(curntn->repro<=9){
curntn->repro+=3;
}
else {
curntn->maxmove+=2*(curntn->repro-9);
curntn->repro=12;
}
return;
}
if(newpower==BREEDER) {
x=curntn->repro;
if(curntn->repro>=14){
curntn->maxmove+=3;
}
else if(curntn->repro>11){
curntn->maxmove+= x-11;
curntn->repro=14;
}
else curntn->repro+=3;
curntn->dplus-=10;
curntn->aplus-=10;
return;
}
if(newpower==DEMOCRACY){
curntn->maxmove+=1;
curntn->repro+=1;
curntn->dplus+=10;
curntn->aplus+=10;
return;
}
if(newpower==ROADS){
curntn->maxmove+=4;
return;
}
if(newpower==ARMOR){
curntn->maxmove-=3;
if( curntn->maxmove<4) curntn->maxmove=4;
curntn->dplus+=20;
}
if((newpower==NINJA)
||(newpower==STEEL)
||(newpower==ARCHER)
||(newpower==CAVALRY)
||(newpower==SAILOR)
||(newpower==SUMMON)
||(newpower==WYZARD)
||(newpower==SORCERER)
||(newpower==SAPPER)
||(newpower==AVIAN)){ /* these powers are only for pc's */
return;
}
}
#ifdef CONQUER
/* returns 0 if summon occurred, 1 else */
void
dosummon()
{
int x,count,i,armynum;
long e_cost;
int newtype,s_cost;
char line[80],ch;
x=0;
count=LINES-4;
clear_bottom(0);
mvaddstr(count,x,"options:");
x+=9;
for(i=MINMONSTER;i<=MAXMONSTER;i++){
if(unitvalid(i)==TRUE) {
mvprintw(count,x+2,"%s",*(shunittype+(i%UTYPE)));
mvprintw(count,x,"(%c)",*(shunittype+(i%UTYPE))[0]);
x+=7;
if(x>COLS-20){
x=0;
count++;
}
}
}
count++;
mvaddstr(count++,0,"what type of unit do you want to raise:");
refresh();
ch=getch();
for(newtype=MINMONSTER;newtype<=MAXMONSTER;newtype++){
if( *(shunittype+(newtype%UTYPE))[0] == ch ) break;
}
if (newtype==MAXMONSTER+1) {
/* quick exit */
return;
}
if(unitvalid(newtype)==FALSE) {
beep();
clear_bottom(0);
errormsg("you are unable to summon that monster");
return;
}
s_cost= *(u_encost+(newtype%UTYPE));
if(s_cost > curntn->spellpts) {
sprintf(line,"you dont have %d spell points",s_cost);
clear_bottom(0);
errormsg(line);
return;
}
e_cost= (long) *(u_encost+(newtype%UTYPE)) * *(unitminsth+(newtype%UTYPE));
if(e_cost > curntn->tgold) {
sprintf(line,"you dont have %ld gold talons in your treasury",e_cost);
clear_bottom(0);
errormsg(line);
return;
}
armynum=0;
while(armynum<MAXARM) {
if(P_ASOLD<=0) {
P_ASOLD= *(unitminsth+(newtype%UTYPE));
P_ATYPE=newtype;
P_ASTAT=DEFEND; /* set new armies to DEFEND */
P_AXLOC=curntn->capx;
P_AYLOC=curntn->capy;
P_AMOVE=0;
AADJLOC;
AADJSTAT;
AADJMEN;
AADJMOV;
armynum=MAXARM;
} else if(armynum==MAXARM-1) {
clear_bottom(0);
errormsg("NO FREE ARMIES");
return;
} else armynum++;
}
curntn->tgold -= e_cost;
curntn->spellpts -= s_cost;
EDECSPL;
}
#ifdef ORCTAKE
/* orc takeover routine... returns 0 if run, 1 if not */
int
orctake(count)
int *count;
{
int chance=0,done=TRUE,i,s_cost;
if((*count)>20) {
(*count)=2;
clear();
}
if(magic(country,MA_MONST)==TRUE) {
mvprintw((*count)++,0," You have a 10 percent chance for %ld Jewels take over other orcs",ORCTAKE);
chance=10;
} else if(magic(country,AV_MONST)==TRUE) {
mvprintw((*count)++,0," You have a 6 percent chance for %ld Jewels take over other orcs",ORCTAKE);
chance=6;
} else if(magic(country,MI_MONST)==TRUE){
mvprintw((*count)++,0," You have a 3 percent chance for %ld Jewels to take over other orcs",ORCTAKE);
chance=3;
}
if(chance==0) return(TRUE);
mvaddstr((*count)++,0,"DO YOU WISH TO TAKE OVER AN ORC NPC NATION");
mvaddstr((*count)++,0,"target cant be unmet, hostile, war, or jihad (enter y or n):");
refresh();
if(getch()=='y'){
done=FALSE;
mvaddstr((*count)++,0," What orc nation:");
refresh();
i=get_country();
if(i<=0 || i>=NTOTAL || !isntn(ntn[i].active) )
mvaddstr((*count)++,0," Invalid Nation");
else if((curntn->dstatus[i]<HOSTILE)
&&(curntn->dstatus[i]!=UNMET)
&&(ntn[i].race==ORC)){
curntn->jewels-=ORCTAKE;
s_cost=TAKEPOINTS;
curntn->spellpts-=s_cost;
EDECSPL;
if(( takeover(chance,i)) !=0 )
mvprintw((*count)++,0," Successful: %d",i);
else {
mvaddstr((*count)++,0," Failed: Nation becomes more hostile");
curntn->dstatus[i]++;
EADJDIP(country,i);
}
}
else mvaddstr((*count)++,0," Wrong Race");
}
return(done);
}
#endif ORCTAKE
#endif CONQUER
#ifdef CONQUER
/**********************************************************************/
/* unitvalid() returns TRUE if nation has powers needed to draft unit */
/**********************************************************************/
int
unitvalid(type)
int type;
{
int valid=FALSE;
switch(type){
case A_INFANTRY: /* not everyone gets infantry now */
if(defaultunit(country)==A_INFANTRY) valid=TRUE;
break;
case GARGOYLE:
case A_GOBLIN:
case A_ORC: if(magic(country,MI_MONST)==TRUE) valid=TRUE;
break;
case A_MARINES: if(magic(country,SAILOR)==TRUE) valid=TRUE;
break;
case A_ARCHER: if(magic(country,ARCHER)==TRUE) valid=TRUE;
break;
case A_URUK: if(magic(country,AV_MONST)==TRUE) valid=TRUE;
break;
case A_NINJA: if(magic(country,NINJA)==TRUE) valid=TRUE;
break;
case A_PHALANX: if(magic(country,CAPTAIN)==TRUE) valid=TRUE;
break;
case A_OLOG: if((magic(country,BREEDER)==TRUE)
&&(magic(country,AV_MONST)==TRUE)) valid=TRUE;
break;
case A_ELEPHANT:if(magic(country,DERVISH)==TRUE) valid=TRUE;
break;
case SUPERHERO:
case A_LEGION: if(magic(country,WARLORD)==TRUE) valid=TRUE;
break;
case A_TROLL: if(magic(country,MA_MONST)==TRUE) valid=TRUE;
break;
case A_ELITE: if(magic(country,ARMOR)==TRUE) valid=TRUE;
break;
case CENTAUR:
case A_LT_CAV:
case A_CAVALRY: if(magic(country,CAVALRY)==TRUE) valid=TRUE;
break;
case A_KNIGHT: if((magic(country,ARMOR)==TRUE)
&&(magic(country,CAVALRY)==TRUE)) valid=TRUE;
break;
case A_ROC:
case A_GRIFFON: if(magic(country,AVIAN)==TRUE) valid=TRUE;
break;
case ASSASSIN: if(magic(country,NINJA)==TRUE) valid=TRUE;
break;
case DJINNI: if(magic(country,DERVISH)==TRUE) valid=TRUE;
break;
case HERO: if(magic(country,WARRIOR)==TRUE) valid=TRUE;
break;
case ELEMENTAL: if(magic(country,SORCERER)==TRUE) valid=TRUE;
break;
case A_ZOMBIE:
case WRAITH:
case MUMMY: if(magic(country,VAMPIRE)==TRUE) valid=TRUE;
break;
case MINOTAUR:
case DEMON: if(magic(country,DESTROYER)==TRUE) valid=TRUE;
break;
case BALROG: if((magic(country,WYZARD)==TRUE)
&&(magic(country,VAMPIRE)==TRUE)) valid=TRUE;
break;
case DRAGON: if((magic(country,MA_MONST)==TRUE)
&&(magic(country,WYZARD)==TRUE)) valid=TRUE;
break;
case A_SPY:
case A_SCOUT: break; /* handled elsewhere */
default: valid=TRUE; /* for all unrestricted types */
}
return(valid);
}
#endif CONQUER
/*remove properties of magic power; must first remove power */
void
removemgk(oldpower)
long oldpower;
{
short x,y,armynum;
if((oldpower==WARRIOR)
||(oldpower==CAPTAIN)
||(oldpower==WARLORD)) {
curntn->aplus-=10;
curntn->dplus-=10;
return;
}
if(oldpower==RELIGION) {
if(curntn->race==ORC) {
printf("ORCS CANT HAVE RELIGION POWER\n");
abrt();
} else curntn->repro -= 2;
return;
}
if(oldpower==DESTROYER) {
for(x=curntn->capx-3;x<=curntn->capx+3;x++) {
for(y=curntn->capy-3;y<=curntn->capy+3;y++){
if((ONMAP(x,y))
&&(sct[x][y].altitude!=WATER)
&&((x!=curntn->capx)
||(y!=curntn->capy))){
if (sct[x][y].vegetation==DESERT)
{
/* LT_VEG has medium value*/
sct[x][y].vegetation=LT_VEG;
sct[x][y].designation=DNODESIG;
}
}
}
}
updmove(curntn->race,country);
return;
}
if(oldpower==DERVISH) {
updmove(curntn->race,country);
return;
}
if(oldpower==VAMPIRE) {
curntn->aplus+=35;
curntn->dplus+=35;
for(armynum=0;armynum<MAXARM;armynum++){
if(P_ATYPE == A_ZOMBIE) P_ATYPE=defaultunit(country);
}
return;
}
if(oldpower==URBAN) {
curntn->repro -= 3;
return;
}
if(oldpower==BREEDER) {
curntn->repro-=3;
curntn->dplus+=10;
curntn->aplus+=10;
for(armynum=0;armynum<MAXARM;armynum++){
if(P_ATYPE == A_OLOG) P_ATYPE=A_URUK;
}
return;
}
if(oldpower==DEMOCRACY){
curntn->maxmove-=1;
curntn->repro-=1;
curntn->dplus-=10;
curntn->aplus-=10;
return;
}
if(oldpower==ROADS){
curntn->maxmove-=4;
return;
}
if(oldpower==ARMOR){
curntn->maxmove+=3;
curntn->dplus-=20;
return;
}
if(oldpower==MI_MONST) {
for(armynum=0;armynum<MAXARM;armynum++){
if(P_ATYPE == A_ORC) P_ATYPE=defaultunit(country);
}
return;
}
if(oldpower==AV_MONST) {
for(armynum=0;armynum<MAXARM;armynum++){
if(P_ATYPE == A_URUK || P_ATYPE == A_OLOG)
P_ATYPE=defaultunit(country);
}
return;
}
if(oldpower==ARCHER) {
for(armynum=0;armynum<MAXARM;armynum++){
if(P_ATYPE == A_ARCHER) P_ATYPE=defaultunit(country);
}
return;
}
/* remaining cause no change in statistics */
}
#ifdef CONQUER
#ifdef OGOD
/* killmagk: this routine removes a magic power */
killmagk()
{
int count,choice,i;
clear();
count=3;
standout();
mvprintw(0,(COLS/2)-15,"MAGIC POWERS FOR %s",curntn->name);
standend();
i=0;
while( powers[i] != 0 ){
if(magic(country,powers[i])==TRUE) {
mvprintw(count,0,"%d: power %s",i+1,*(pwrname+i));
count++;
}
i++;
}
count++;
standout();
mvaddstr(count++,5," Which power to remove? ");
standend();
refresh();
choice=get_number();
if(choice!=0) {
mvprintw(count++,0," Remove magic #%d? (y or [n])",choice);
refresh();
if (getch()=='y') {
if(magic(country,powers[choice-1])) {
curntn->powers ^= powers[choice-1];
removemgk(powers[choice-1]);
}
}
}
}
#endif OGOD
#define NUMSPELLS 4
char *spellstr[NUMSPELLS]={"(S)ummon","(F)light","(A)ttack Enhancement",
"(D)efense Enhancement"};
/* quick adjustment to allow magical status change */
int magicstat[NUMSPELLS]={DEFEND, FLIGHT, MAGATT, MAGDEF};
/* number of soldiers per point of spell cost */
int magiccost[NUMSPELLS]={0,100,300,300};
/* routine to perform spells */
void
wizardry()
{
int i,xspt,yspt,choice,armynum,s_cost;
char line[80];
void dosummon();
clear_bottom(0);
if(curntn->spellpts>0)
{
xspt=0; yspt=LINES-3;
/* summon only to those with summon */
if (magic(country,SUMMON)==TRUE) i=0;
else i=1;
for (;i<NUMSPELLS;i++) {
sprintf(line," %s",spellstr[i]);
mvaddstr(yspt,xspt,line);
xspt += strlen(line);
if (xspt>COLS-20) {
xspt=0;
yspt++;
}
}
mvaddstr(LINES-4,0,"Which spell to cast:");
refresh();
choice=NUMSPELLS;
switch(getch()) {
case 's':
case 'S':
if (magic(country,SUMMON)==TRUE) dosummon();
else {
clear_bottom(0);
errormsg("you do not have SUMMON power");
}
break;
case 'f':
case 'F':
choice--;
case 'a':
case 'A':
choice--;
case 'd':
case 'D':
choice--;
/* change status of currently selected army */
armynum = getselunit();
clear_bottom(0);
if (armynum<0 || armynum>=MAXARM ||
P_ASTAT==SCOUT || P_ASTAT==TRADED ||
P_ASTAT==GENERAL || P_ASTAT>NUMSTATUS ||
P_ASOLD<=0) {
errormsg("Invalid Unit for Magicking");
} else if(P_ASTAT==ONBOARD) {
errormsg("Carried armies must be unloaded");
} else if(P_ASTAT==magicstat[choice]) {
errormsg("Unit has already been magicked");
} else if(P_ASTAT==MARCH) {
errormsg("That unit is too busy marching");
} else {
/*cost of 1 spell point for magiccost men*/
s_cost = (P_ASOLD-1) / magiccost[choice] + 1;
if (s_cost > curntn->spellpts) {
sprintf(line,"You don't have %d spell points",s_cost);
errormsg(line);
} else {
change_status(armynum,magicstat[choice]);
curntn->spellpts -= s_cost;
EDECSPL;
}
}
break;
default:
break;
}
}
else errormsg("You have no spell points for spell casting");
makebottom();
}
#endif CONQUER