Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.1 6/24/83; site tty3b.UUCP Path: utzoo!watmath!clyde!burl!mgnetp!ltuxa!tty3b!estes From: estes@tty3b.UUCP (8-01-83"Edward E 9723i) Newsgroups: net.sources Subject: Phantasia (part 2 of 3) Message-ID: <490@tty3b.UUCP> Date: Fri, 7-Sep-84 18:13:50 EDT Article-I.D.: tty3b.490 Posted: Fri Sep 7 18:13:50 1984 Date-Received: Thu, 13-Sep-84 06:13:46 EDT Organization: Teletype Corp., Skokie, Ill Lines: 1930 ----------CUT-----------CUT------------CUT------------CUT---------CUT-------- : This is a shar archieve. Extract with sh, not csh. : The rest of this file will extract: : func0.c func1.c echo extracting - func0.c sed 's/^X//' > func0.c << '!EOR!' X/* X * func0.c Phantasia support routines X */ X X#include "phant.h" X Xvoid treasure(stat,treastyp,size) /* select a treasure */ Xreg struct stats *stat; Xshort treastyp; Xreg int size; X{ Xreg int which; Xint ch; Xdouble temp, temp2; Xchar aline[35]; XFILE *fp; X X which = roll(1,3); X move(3,0); X clrtobot(); X move(5,0); X if (rnd() > 0.65) /* gold and gems */ X if (treastyp > 7) /* gems */ X { X temp = roll(1,(treastyp - 7)*(treastyp - 7)*(size - 1)/4); X printw("You have discovered %.0f gems! Will you pick them up ? ",temp); X ch = rgetch(); X addch('\n'); X if (toupper(ch) == 'Y') X if (rnd() < treastyp/40 + 0.05) /* cursed */ X { X addstr("They were cursed!\n"); X goto CURSE; X } X else X stat->gem += temp; X return; X } X else /* gold */ X { X temp = roll(treastyp*10,treastyp*treastyp*10*(size - 1)); X printw("You have found %.0f gold pieces. Do you want to pick them up ? ",temp); X ch = rgetch(); X addch('\n'); X if (toupper(ch) == 'Y') X if (rnd() < treastyp/35 + 0.04) /* cursed */ X { X addstr("They were cursed!\n"); X goto CURSE; X } X else X { X stat->gld += floor(0.9 * temp); X fp = fopen(goldfile,"r"); X fread((char *) &temp2,sizeof(double),1,fp); X fclose(fp); X fp = fopen(goldfile,"w"); X temp2 += floor(temp/10); X fwrite((char *) &temp2,sizeof(double),1,fp); X fclose(fp); X } X return; X } X else /* other treasures */ X { X addstr("You have found some treasure. Do you want to inspect it ? "); X ch = rgetch(); X addch('\n'); X if (toupper(ch) != 'Y') X return; X else X if (rnd() < 0.08 && treastyp != 4) X { X addstr("It was cursed!\n"); X goto CURSE; X } X else X switch(treastyp) X { X case 1: X switch(which) X { X case 1: X addstr("You've discovered a power booster!\n"); X stat->man += roll(size*4,size*30); X break; X case 2: X addstr("You have encountered a druid.\n"); X stat->exp += roll(0,2000 + size*400); X break; X case 3: X addstr("You have found a holy orb.\n"); X stat->sin = max(0,stat->sin - 0.25); X break; X } X break; X case 2: X switch (which) X { X case 1: X addstr("You have found an amulet.\n"); X ++stat->amu; X break; X case 2: X addstr("You've found some holy water!\n"); X ++stat->hw; X break; X case 3: X addstr("You've met a hermit!\n"); X stat->sin *= 0.75; X stat->man += 12*size; X break; X } X break; X case 3: X switch (which) X { X case 1: X temp = roll(7,30 + size/10); X printw("You've found a +%.0f shield!\n",temp); X if (temp >= stat->shd) X stat->shd = temp; X else X somebetter(); X break; X case 2: X addstr("You have rescued a virgin. Will you be honorable ? "); X ch = rgetch(); X if (toupper(ch) == 'Y') X stat->vrg = TRUE; X else X { X stat->exp += 2000*size; X ++stat->sin; X } X break; X case 3: X addstr("You've discovered some athelas!\n"); X --stat->psn; X break; X } X break; X case 4: X addstr("You've found a scroll. Will you read it ? "); X ch = rgetch(); X addch('\n'); X if (toupper(ch) == 'Y') X switch ((int) roll(1,6)) X { X case 1: X addstr("It throws up a shield for you next monster.\n"); X paws(8); X longjmp(fightenv,2); X /*NOTREACHED*/ X case 2: X addstr("It makes you invisible for you next monster.\n"); X paws(8); X speed = 1e6; X longjmp(fightenv,0); X /*NOTREACHED*/ X case 3: X addstr("It increases your strength ten fold to fight your next monster.\n"); X paws(8); X strength *= 10; X longjmp(fightenv,0); X /*NOTREACHED*/ X case 4: X addstr("It is a general knowledge scroll.\n"); X stat->brn += roll(2,size); X stat->mag += roll(1,size/2); X break; X case 5: X addstr("It tells you how to pick your next monster.\n"); X addstr("Which monster do you want [0-99] ? "); X which = inflt(); X which = min(99,max(0,which)); X fight(stat,which); X break; X case 6: X addstr("It was cursed!\n"); X goto CURSE; X } X break; X case 5: X switch (which) X { X case 1: X temp = roll(size/4+5,size/2 + 9); X printw("You've discovered a +%.0f dagger.\n",temp); X if (temp >= stat->swd) X stat->swd = temp; X else X somebetter(); X break; X case 2: X temp = roll(7.5 + size*3,size * 2 + 160); X printw("You have found some +%.0f armour!\n",temp); X if (temp >= stat->shd) X stat->shd = temp; X else X somebetter(); X break; X case 3: X addstr("You've found a tablet.\n"); X stat->brn += 4.5*size; X break; X } X break; X case 6: X switch (which) X { X case 1: X addstr("You've found a priest.\n"); X stat->nrg = stat->mxn + stat->shd; X stat->sin /= 2; X stat->man += 24*size; X stat->brn += size; X break; X case 2: X addstr("You have come upon Robin Hood!\n"); X stat->shd += size*2; X stat->str += size/2.5 + 1; X break; X case 3: X temp = roll(2 + size/4,size/1.2 + 10); X printw("You have found a +%.0f axe!\n",temp); X if (temp >= stat->swd) X stat->swd = temp; X else X somebetter(); X break; X } X break; X case 7: X switch (which) X { X case 1: X addstr("You've discovered a charm!\n"); X ++stat->chm; X break; X case 2: X addstr("You have encountered Merlyn!\n"); X stat->brn += size + 5; X stat->mag += size/3 + 5; X stat->man += size*10; X break; X case 3: X temp = roll(5+size/3,size/1.5 + 20); X printw("You have found a +%.0f war hammer!\n",temp); X if (temp >= stat->swd) X stat->swd = temp; X else X somebetter(); X break; X } X break; X case 8: X switch (which) X { X case 1: X addstr("You have found a healing potion.\n"); X stat->psn = min(-2,stat->psn-2); X break; X case 2: X addstr("You have discovered a transporter. Do you wish to go anywhere ? "); X ch = rgetch(); X addch('\n'); X if (toupper(ch) == 'Y') X { X addstr("X Y Coordinates ? "); X getstring(aline,80); X sscanf(aline,"%F %F",&stat->x,&stat->y); X stat->x = floor(stat->x); X stat->y = floor(stat->y); X } X break; X case 3: X temp = roll(10 + size/1.2,size*3 + 30); X printw("You've found a +%.0f sword!\n",temp); X if (temp >= stat->swd) X stat->swd = temp; X else X somebetter(); X break; X } X break; X case 10: X case 11: X case 12: X case 13: X if (rnd() < 0.33) X { X if (treastyp == 10) X { X addstr("You've found a pair of elven boots!\n"); X stat->quk += 2; X break; X } X else if (treastyp == 11 && !stat->pal) X { X addstr("You've acquired Saruman's palantir.\n"); X stat->pal = TRUE; X break; X } X else if (!stat->rng.type && stat->typ < 20 && (treastyp == 12 || treastyp == 13)) X { X if (treastyp == 12) X if (rnd() < 0.8) X { X which = NAZREG; X temp = 15; X } X else X { X which = NAZBAD; X temp = 10 + rngcalc(stat->typ) + roll(0,5); X } X else X if (rnd() > 0.9) X { X which = DLREG; X temp = 0; X } X else X { X which = DLBAD; X temp = 15 + rngcalc(stat->typ) + roll(0,5); X } X addstr("You've discovered a ring. Will you pick it up ? "); X ch = rgetch(); X addch('\n'); X if (toupper(ch) == 'Y') X { X stat->rng.type = which; X stat->rng.duration = temp; X } X } X break; X } X case 9: X switch (which) X { X case 1: X if (!(stat->lvl > 1000 || stat->crn > floor((double) stat->lvl/100) X || stat->lvl < 10)) X { X addstr("You have found a golden crown!\n"); X ++stat->crn; X break; X } X case 2: X addstr("You've been blessed!\n"); X stat->bls = TRUE; X stat->sin /=3; X stat->nrg = stat->mxn + stat->shd; X stat->man += 100*size; X break; X case 3: X temp = roll(1,size/5+5); X temp = min(temp,99); X printw("You have discovered some +%.0f quicksilver!\n",temp); X if (temp >= stat->quks) X stat->quks = temp; X else X somebetter(); X break; X } X break; X } X refresh(); X return; X } XCURSE: if (stat->chm) X { X addstr("But your charm saved you!\n"); X --stat->chm; X } X else if (stat->amu) X { X addstr("But your amulet saved you!\n"); X --stat->amu; X } X else X { X stat->nrg = (stat->mxn + stat->shd)/10; X stat->psn += 0.25; X } X} X Xvoid callmonster(which,size,mons) /* fill a structure with monster 'which' of size 'size' */ Xreg int which, size; Xreg struct mstats *mons; X{ XFILE *fp; Xchar instr[100]; X X which = min(which,99); X fp = fopen(monsterfile,"r"); X for (++which; which; --which) X fgets(instr,100,fp); X strncpy(mons->name,instr,24); X mons->name[24] = '\0'; X sscanf(instr + 24,"%F%F%F%F%F%d%d%d",&mons->str,&mons->brn,&mons->spd,&mons->hit, X &mons->exp,&mons->trs,&mons->typ,&mons->flk); X if (mons->typ == 2) /* Modnar */ X { X mons->str *= rnd() + 0.5; X mons->brn *= rnd() + 0.5; X mons->spd *= rnd() + 0.5; X mons->hit *= rnd() + 0.5; X mons->exp *= rnd() + 0.5; X mons->trs *= rnd(); X } X else if (mons->typ == 3) /* mimic */ X { X fseek(fp,0L,0); X for (which = roll(0,100); which; --which) X fgets(instr,100,fp); X strncpy(mons->name,instr,24); X } X trunc(mons->name); X mons->str += (size-1)*mons->str/2; X mons->brn *= size; X mons->spd += size * 1.e-9; X mons->hit *= size; X mons->exp *= size; X fclose(fp); X} X Xstruct /* lookup table for rolling stats and making increases upon gaining levels */ X { X struct X { X int base; X int interval; X float increase; X } quick, strength, manna, energy, brains, magic; X } table[7] = X { X/* mag. usr: */ 30, 6, 0.0, 20, 6, 2.0, 50,51,75.0, 30,16,20.0, 60,26, 6.0, 5, 5,2.75, X/* fighter: */ 30, 6, 0.0, 40,16, 3.0, 30,21,40.0, 45,26,30.0, 25,21, 3.0, 3, 4, 1.5, X/* elf: */ 32, 7, 0.0, 35,11, 2.5, 45,46,65.0, 30,21,25.0, 40,26, 4.0, 4, 4, 2.0, X/* dwarf: */ 25, 6, 0.0, 45,21, 5.0, 25,21,30.0, 60,41,35.0, 20,21, 2.5, 2, 4, 1.0, X/* halfling: */ 34, 0, 0.0, 20, 6, 2.0, 25,21,30.0, 55,36,30.0, 40,36, 4.5, 1, 4, 1.0, X/* exprmnto: */ 27, 0, 0.0, 25, 0, 0.0, 100,0, 0.0, 35, 0, 0.0, 25, 0, 0.0, 2, 0, 0.0, X/* super: */ 38, 0, 0.0, 65, 0, 0.0, 100,0, 0.0, 80, 0, 0.0, 85, 0, 0.0, 9, 0, 0.0 X }; X Xvoid genchar(res,type) /* init a charac struct */ Xint type; Xreg struct stats *res; X{ Xregister int subscript; X X if (type < '1' || type > '6') X if (type != '7' || !su) X type = '2'; /* fighter is default */ X subscript = type - '1'; X res->quk = roll(table[subscript].quick.base,table[subscript].quick.interval); X res->str = roll(table[subscript].strength.base,table[subscript].strength.interval); X res->man = roll(table[subscript].manna.base,table[subscript].manna.interval); X res->mxn = res->nrg = roll(table[subscript].energy.base,table[subscript].energy.interval); X res->brn = roll(table[subscript].brains.base,table[subscript].brains.interval); X res->mag = roll(table[subscript].magic.base,table[subscript].magic.interval); X res->typ = subscript; X if (subscript < 6) X ++res->typ; X if (type == '5') X res->exp = roll(600,200); /* give halfling some exp. */ X} X Xvoid movelvl(stat) /* update stats for new level */ Xreg struct stats *stat; X{ Xreg int type; Xreg unsigned new; Xdouble inc; X X changed = TRUE; X type = abs(stat->typ); X if (type < 6) X ; /* normal */ X else if (type < 10) X type = roll(1,5); /* experimento */ X else if (type < 20) X { X type -= 10; /* king */ X if (type > 5) X type = roll(1,5); /* experimento */ X } X else if (type < 26) X type -= 20; /* council of wise */ X else X type = roll(1,5); /* everything else */ X new = level(stat->exp); X inc = new - stat->lvl; X --type; /* set up for subscripting into table */ X stat->str += table[type].strength.increase * inc; X stat->man += table[type].manna.increase * inc; X stat->brn += table[type].brains.increase * inc; X stat->mag += table[type].magic.increase * inc; X stat->mxn += table[type].energy.increase * inc; X stat->nrg = stat->mxn + stat->shd; X if ((stat->lvl = min(10000,new)) >= 1000) X { /* no longer able to be king */ X stat->gld += stat->crn * 5000; X stat->crn = 0; X stat->typ = abs(stat->typ); X } X if (stat->lvl >= 3000 && stat->typ < 20) X { /* make a member of the council */ X mvaddstr(6,0,"You have made it to the Council of the Wise.\nGood Luck on your search for the Holy Grail.\n"); X stat->rng.type = 0; X stat->rng.duration = 3; X stat->typ = abs(stat->typ) + (stat->typ > 10 ? 10 :20); X } X} X Xchar *printloc(x,y) /* return a pointer to a string specifying location */ Xdouble x,y; /* also, set some global flags */ X{ Xreg int size, loc; Xreg char *label; Xstatic char res[80], X *nametable[4][4] = /* names of places */ X { X "Anorien", "Ithilien", "Rohan", "Lorien", X "Gondor", "Mordor", "Dunland", "Rovanion", X "South Gondor", "Khand", "Eriador", "The Iron Hills", X "Far Harad", "Near Harad", "The Northern Waste", "Rhun" X }; X X throne = beyond = marsh = FALSE; X if (wmhl) X return (strcpy(res," is in the Wormholes")); X else if (valhala) X return (strcpy(res," is in Valhala")); X else if ((size = circ(x,y)) >= 1000) X { X if (max(abs(x),abs(y)) > 1100000) X { X label = "The Point of No Return"; X beyond = TRUE; X } X else X label = "The Ashen Mountains"; X } X else if (size >= 55) X label = "Morannon"; X else if (size >= 35) X label = "Kennaquahair"; X else if (size >= 20) X { X label = "The Dead Marshes"; X marsh = TRUE; X } X else if (size >= 9) X label = "The Outer Waste"; X else if (size >= 5) X label = "The Moors Adventurous"; X else X { X if (!x && !y) X { X label = "The Lord's Chamber"; X throne = TRUE; X } X else X { X loc = (x > 0) + 2 * (y >= 0); X label = nametable[size-1][loc]; X } X } X sprintf(res," is in %s (%.0f,%.0f)",label,x,y); X return (res); X} X Xvoid initchar(stat) /* put in some default values */ Xreg struct stats *stat; X{ X stat->x = roll(-125,251); X stat->y = roll(-125,251); X stat->exp = stat->lvl = stat->sin = 0; X stat->crn = stat->psn = 0; X stat->rng.type = NONE; X stat->rng.duration = 0; X stat->blind = stat->vrg = stat->pal = FALSE; X stat->hw = stat->amu = stat->bls = 0; X stat->chm = 0; X stat->gem = 0.1; X stat->gld = roll(25,50) + roll(0,25) + 0.1; X stat->quks = stat->swd = stat->shd = 0; X stat->typ = 0; X stat->status = stat->tampered = OFF; X stat->scratch1 = stat->scratch2 = 0.0; X stat->wormhole = 0; X stat->age = 0; X stat->degen = 1; X} X Xvoid trade(stat) /* trading post */ Xreg struct stats *stat; X{ Xstatic struct X { X char *item; X int cost; X } menu[] = X { X "Manna",1, X "Shield",5, X "Book",200, X "Sword",500, X "Charm",1000, X "Quiksilver",2500, X "Blessing",7000, X "Gem",1000 /* this is only to ease changing the value of gems */ X }; Xdouble temp; Xint ch; Xreg int size, loop; Xbool cheat = FALSE; X X changed = TRUE; X clear(); X addstr("You are at a trading post. All purchases must be made with gold."); X size = sqrt(abs(stat->x/100)) + 1; X size = min(7,size); X mvprintw(4,0,"L:Leave P:Purchase S:Sell Gems ? "); X move(6,0); X for (loop = 0; loop < size; ++loop) X printw("(%d) %-10s: %6d\n",loop+1,menu[loop].item,menu[loop].cost); XPROMPT: mvprintw(1,0,"Gold: %9.0f Gems: %9.0f Level: %6u Charms: %6d\n",stat->gld,stat->gem,stat->lvl,stat->chm); X printw("Shield:%9.0f Sword: %9.0f Quicksilver:%3d Blessed: %s", X stat->shd,stat->swd,stat->quks,(stat->bls ? " True" : "False")); X move(4,36); X ch = rgetch(); X move(15,0); X clrtobot(); X switch(toupper(ch)) X { X case 'L': X case '\n': X stat->x -= floor(stat->x/10); X stat->y -= floor(stat->y/10); X return; X case 'P': X mvaddstr(15,0,"What what would you like to buy ? "); X ch = rgetch(); X move(15,0); X clrtoeol(); X if (ch - '0' > size) X addstr("Sorry, this merchant doesn't have that."); X else X switch (toupper(ch)) X { X case '1': X printw("Manna is one per %d gold piece. How many do you want (%.0f max) ? ",menu[0].cost,floor(stat->gld/menu[0].cost)); X temp = inflt(); X if (temp * menu[0].cost > stat->gld || temp < 0) X goto CHEAT; X else X { X stat->gld -= floor(temp) * menu[0].cost; X if (rnd() < 0.02) X goto DISHON; X else X stat->man += floor(temp); X } X break; X case '2': X printw("Shields are %d per +1. How many do you want (%.0f max) ? ",menu[1].cost,floor(stat->gld/menu[1].cost)); X temp = inflt(); X if (!temp) X break; X if (temp * menu[1].cost > stat->gld || temp < 0) X goto CHEAT; X else X { X stat->gld -= floor(temp) * menu[1].cost; X if (rnd() < 0.02) X goto DISHON; X else X stat->shd = floor(temp); X } X break; X case '3': X printw("A book costs %d gp. How many do you want (%.0f max) ? ",menu[2].cost,floor(stat->gld/menu[2].cost)); X temp = inflt(); X if (temp * menu[2].cost > stat->gld || temp < 0) X goto CHEAT; X else X { X stat->gld -= floor(temp) * menu[2].cost; X if (rnd() < 0.02) X goto DISHON; X else X if (rnd()*temp > stat->lvl/10 && temp != 1) X { X printw("\nYou blew your mind!\n"); X stat->brn /= 5; X } X else X stat->brn += floor(temp)*roll(25,10); X } X break; X case '4': X printw("Swords are %d gp per +1. How many + do you want (%.0f max) ? ",menu[3].cost,floor(stat->gld/menu[3].cost)); X temp = inflt(); X if (!temp) X break; X if (temp * menu[3].cost > stat->gld || temp < 0) X goto CHEAT; X else X { X stat->gld -= floor(temp) * menu[3].cost; X if (rnd() < 0.02) X goto DISHON; X else X stat->swd = floor(temp); X } X break; X case '5': X printw("A charm costs %d gp. How many do you want (%.0f max) ? ",menu[4].cost,floor(stat->gld/menu[4].cost)); X temp = inflt(); X if (temp * menu[4].cost > stat->gld || temp < 0) X goto CHEAT; X else X { X stat->gld -= floor(temp) * menu[4].cost; X if (rnd() < 0.02) X goto DISHON; X else X stat->chm += floor(temp); X } X break; X case '6': X printw("Quicksilver is %d gp per +1. How many + do you want (%.0f max) ? ",menu[5].cost,floor(stat->gld/menu[5].cost)); X temp = inflt(); X if (!temp) X break; X if (temp * menu[5].cost > stat->gld || temp < 0) X goto CHEAT; X else X { X stat->gld -= floor(temp) * menu[5].cost; X if (rnd() < 0.02) X goto DISHON; X else X stat->quks = min(99,floor(temp)); X } X break; X case '7': X printw("A blessing requires a %d gp donation. Still want one ? ",menu[6].cost); X ch = rgetch(); X if (toupper(ch) == 'Y') X if (stat->gld < menu[6].cost) X goto CHEAT; X else X { X stat->gld -= menu[6].cost; X if (rnd() < 0.02) X goto DISHON; X else X stat->bls = TRUE; X } X break; X } X break; X case 'S': X mvprintw(15,0,"A gem is worth %d gp. How many do you want to sell (%.0f max) ? ",menu[7].cost,stat->gem); X temp = inflt(); X if (temp > stat->gem || temp < 0) X goto CHEAT; X else X { X stat->gem -= floor(temp); X stat->gld += floor(temp) * menu[7].cost; X } X } X goto PROMPT; X XCHEAT: move(17,0); X if (!cheat) X { X addstr("Come on, merchants aren't stupid. Stop cheating.\n"); X cheat = TRUE; X goto PROMPT; X } X else X { X addstr("You had your chance. This merchant happens to be\n"); X printw("a %.0f level magic user, and you made %s mad!\n",roll(size*10,size*20),(rnd() < 0.5) ? "him" : "her"); X stat->x += roll(-250,500)*size; X stat->y += roll(-250,500)*size; X stat->nrg = min(size*20,stat->mxn); X ++stat->sin; X paws(23); X } X return; X XDISHON: mvaddstr(17,0,"The merchant stole your money!"); X refresh(); X stat->x -= floor(stat->x/10); X stat->y -= floor(stat->y/10); X sleep(2); X} X Xvoid printstats(stat) /* show characteristics */ Xreg struct stats *stat; X{ X mvprintw(0,0,"%s%s\n",stat->name,printloc(stat->x,stat->y)); X mvprintw(1,0,"Level :%7u Energy :%9.0f(%9.0f) Manna:%9.0f Users:%3d\n", X stat->lvl,stat->nrg,stat->mxn + stat->shd,stat->man,users); X mvprintw(2,0,"Quick :%3.0f(%3d) Strength:%9.0f(%9.0f) Gold :%9.0f ", X speed,stat->quk + stat->quks,strength,stat->str + stat->swd,stat->gld); X switch (stat->status) X { X case PLAYING: X if (stat->nrg < 0.2 * (stat->mxn + stat->shd)) X addstr("Low Energy\n"); X else if (stat->blind) X addstr("Blind\n"); X else X clrtoeol(); X break; X case CLOAKED: X addstr("Cloaked\n"); X break; X case INBATTLE: X addstr("In Battle\n"); X break; X case OFF: X addstr("Off\n"); X } X} X Xvoid showall(stat) /* show special items */ Xreg struct stats *stat; X{ Xstatic char *flags[] = X { X "False", X " True" X }; X X mvprintw(6,0,"Type: %3d -- ",stat->typ); X switch (abs(stat->typ)) X { X case 1: X case 11: X case 21: X addstr("Magic User"); X break; X case 2: X case 12: X case 22: X addstr("Fighter"); X break; X case 3: X case 13: X case 23: X addstr("Elf"); X break; X case 4: X case 14: X case 24: X addstr("Dwarf"); X break; X case 5: X case 15: X case 25: X addstr("Halfling"); X break; X case 6: X case 16: X case 26: X addstr("Experimento"); X break; X case 90: X addstr("Ex-Valar"); X break; X case 99: X addstr("Valar"); X } X if (stat->typ > 10 && stat->typ < 90) X if (stat->typ > 20) X addstr(" (Council of Wise)"); X else X addstr(" (King)"); X addch('\n'); X mvprintw(7,0,"Experience: %9.0f",stat->exp); X mvprintw(8,0,"Brains : %9.0f",stat->brn); X mvprintw(9,0,"Magic Lvl : %9.0f",stat->mag); X mvprintw(10,0,"Sin : %9.5f",stat->sin); X mvprintw(11,0,"Poison : %9.5f",stat->psn); X mvprintw(12,0,"Gems : %9.0f",stat->gem); X mvprintw(13,0,"Age : %9d",stat->age); X mvprintw(7,40,"Holy Water: %9d",stat->hw); X mvprintw(8,40,"Amulets : %9d",stat->amu); X mvprintw(9,40,"Charms : %9d",stat->chm); X mvprintw(10,40,"Crowns : %9d",stat->crn); X mvprintw(11,40,"Shield : %9.0f",stat->shd); X mvprintw(12,40,"Sword : %9.0f",stat->swd); X mvprintw(13,40,"Quickslver: %9d",stat->quks); X X mvprintw(14,0,"Blessing: %s Ring: %s Virgin: %s Palantir: %s", X flags[stat->bls],flags[stat->rng.type != 0],flags[stat->vrg],flags[stat->pal]); X} X Xvoid neatstuff(stat) /* random things */ Xreg struct stats *stat; X{ Xdouble temp; Xint ch; X X switch ((int) roll(0,100)) X { X case 1: X case 2: X if (stat->psn > 0) X { X mvaddstr(5,0,"You've found a medic! How much will you offer to be cured ? "); X temp = inflt(); X if (temp < 0 || temp > stat->gld) X { X mvaddstr(6,0,"He was not amused, and made you worse.\n"); X ++stat->psn; X } X else if (rnd()/2.0 > (temp + 1)/max(stat->gld,1)) X mvaddstr(6,0,"Sorry, he wasn't interested.\n"); X else X { X mvaddstr(6,0,"He accepted."); X stat->psn = max(0,stat->psn-1); X stat->gld -= floor(temp); X } X } X break; X case 3: X mvaddstr(6,0,"You've been caught raping and pillaging!\n"); X stat->exp += 4000; X stat->sin += 0.5; X break; X case 4: X temp = roll(6,50); X mvprintw(5,0,"You've found %.0f gold pieces, want them ? ",temp); X clrtoeol(); X ch = rgetch(); X if (toupper(ch) == 'Y') X stat->gld += temp; X break; X case 5: X if (stat->sin > 1) X { X mvaddstr(6,0,"You've found a Holy Orb!\n"); X stat->sin -= 0.25; X } X break; X case 6: X if (stat->psn < 1) X { X mvaddstr(6,0,"You've been hit with a plague!\n"); X ++stat->psn; X } X break; X case 7: X mvaddstr(6,0,"You've found some holy water.\n"); X ++stat->hw; X break; X case 8: X mvaddstr(6,0,"You've met a Guru. . ."); X if (rnd()*stat->sin > 1) X addstr("You disgusted him with your sins!\n"); X else if (stat->psn > 0) X { X addstr("He looked kindly upon you, and cured you.\n"); X stat->psn = 0; X } X else X { X addstr("He rewarded you for your virtue.\n"); X stat->man += 50; X stat->shd += 2; X } X break; X case 9: X mvaddstr(6,0,"You've found an amulet.\n"); X ++stat->amu; X break; X case 10: X if (stat->blind) X { X mvaddstr(6,0,"You've regained your sight!\n"); X stat->blind = FALSE; X } X break; X default: X if (stat->psn > 0) X stat->nrg -= min(stat->psn*stat->mxn/45,0.9*stat->mxn); X stat->nrg = max(stat->nrg,floor(stat->mxn/11)); X } X} !EOR! echo extracting - func1.c sed 's/^X//' > func1.c << '!EOR!' X/* X * func1.c Phantasia support routines X */ X X#include "phant.h" X Xbool findname(name) /* return TRUE if name in use */ Xreg char *name; X{ XFILE *fp; Xstruct stats buf; X X fp = fopen(peoplefile,"r"); X while (fread((char *) &buf,sizeof(buf),1,fp)) X if (!strcmp(buf.name,name)) X { X fclose(fp); X mvaddstr(21,0,"Name already in use.\n"); X refresh(); X return (TRUE); X } X fclose(fp); X return (FALSE); X} X Xint findspace() /* allocate space for a character in peoplefile */ X{ XFILE *fp; Xstruct stats buf; Xreg int loc; X X loc = 0; X fp = fopen(peoplefile,"r"); X while (fread((char *) &buf,sizeof(buf),1,fp)) X { X if (!strcmp(buf.name,"")) X { X fclose(fp); X return (loc); X } X else X ++loc; X } X fclose(fp); X fp = fopen(peoplefile,ACCESS); X fseek(fp,(long) loc * sizeof(buf),0); X initchar(&buf); X strcpy(buf.name,"inuse"); X fwrite((char *) &buf,sizeof(buf),1,fp); X fclose(fp); X return (loc); X} X Xint findchar(stat) /* retrieve a character from file */ Xreg struct stats *stat; X{ Xreg int loc = 0, loop; Xchar name[21]; XFILE *fp; X X if (fp = fopen(peoplefile,"r")) X { X clear(); X mvprintw(10,0,"What was your character's name ? "); X getstring(name,21); X trunc(name); X while (fread((char *) stat,sizeof(*stat),1,fp)) X { X if (!strcmp(stat->name,name)) X { X move(11,0); X refresh(); X fclose(fp); X nocrmode(); X for (loop = 0; loop < 2; ++loop) X if (!strcmp(getpass("Password ? "),stat->pswd)) X { X crmode(); X return (loc); X } X else X printf("No good.\n"); X exit1(); X /*NOTREACHED*/ X } X ++loc; X } X } X fclose(fp); X addstr("\n\nNot found.\n"); X exit1(); X/*NOTREACHED*/ X} X Xvoid leave(stat) /* save character in file */ Xreg struct stats *stat; X{ Xlong ltemp; X X if (!stat->lvl) X strcpy(stat->name,""); X stat->status = OFF; X time(<emp); X stat->age += ltemp - secs; X update(stat,fileloc); X exit1(); X /*NOTREACHED*/ X} X Xvoid talk(name) /* send message to all players */ Xreg char *name; X{ XFILE *fp; Xchar aline[160]; X X mvaddstr(5,0,"Message ? "); X getstring(aline,160); X fp = fopen(messfile,"w"); X if (*aline) X fprintf(fp,"%s: %s",name,aline); X fclose(fp); X} X Xvoid death(stat) /* remove a player after dying */ Xreg struct stats *stat; X{ XFILE *fp; Xchar aline[100]; Xint ch; Xreg int loop; Xlong ltemp; X X clear(); X if (stat->typ == 99) X if (stat->rng.duration) X { X addstr("Valar should be more cautious. You've been killed.\n"); X printw("You only have %d more chance(s).\n",--stat->rng.duration); X paws(3); X stat->nrg = stat->mxn; X return; X } X else X { X addstr("You had your chances, but Valar aren't totally\n"); X addstr("immortal. You are now left to wither and die . . .\n"); X paws(3); X stat->brn = stat->lvl /25; X stat->nrg = stat->mxn; X stat->quks = stat->swd = 0; X stat->typ = 90; X return; X } X if (stat->lvl > 9999) X addstr("Characters greater than level 10K must be retired. Sorry."); X switch(stat->rng.type) X { X case -DLREG: X case -NAZREG: X mvaddstr(4,0,"Your ring saved you from death!\n"); X refresh(); X stat->rng.type = NONE; X stat->nrg = stat->mxn/12+1; X stat->crn -= (stat->crn > 0); X return; X case DLBAD: X case -DLBAD: X case NAZBAD: X case -NAZBAD: X case -SPOILED: X case SPOILED: X mvaddstr(4,0,"Your ring has taken control of you and turned you into a monster!\n"); X fp = fopen(monsterfile,"r"); X for (loop = 0; loop <= 13; ++loop) X fgets(aline,100,fp); X ltemp = ftell(fp); X fclose(fp); X fp = fopen(monsterfile,ACCESS); X fseek(fp,ltemp,0); X fprintf(fp,"%-20s",stat->name); X fclose(fp); X } X initchar(stat); X fp = fopen(lastdead,"w"); X fprintf(fp,"%s Login: %s",stat->name,stat->login); X fclose(fp); X strcpy(stat->name,""); X update(stat,fileloc); X clear(); X move(10,0); X switch ((int) roll(1,5)) X { X case 1: X addstr("You've crapped out! "); X break; X case 2: X addstr("You have been disemboweled. "); X break; X case 3: X addstr("You've been mashed, mauled, and spit upon. (You're dead.)\n"); X break; X case 4: X addstr("You died! "); X break; X case 5: X addstr("You're a complete failure -- you've died!!\n"); X } X addstr("Care to give it another try ? "); X ch = rgetch(); X if (toupper(ch) == 'Y') X { X endwin(); X execl(gameprog,"phantasia","-s",0); X } X exit1(); X /*NOTREACHED*/ X} X Xvoid update(stat,place) /* update charac file */ Xreg struct stats *stat; Xreg int place; X{ XFILE *fp; X X fp = fopen(peoplefile,ACCESS); X fseek(fp,(long) place*sizeof(*stat),0); X fwrite((char *) stat,sizeof(*stat),1,fp); X fclose(fp); X} X Xvoid printplayers(stat) /* show users */ Xreg struct stats *stat; X{ XFILE *fp; Xstruct stats buf; Xreg int loop = 0; Xdouble loc; Xlong ltmp; Xint ch; X X if (stat->blind) X { X mvaddstr(6,0,"You can't see anyone.\n"); X return; X } X loc = circ(stat->x,stat->y); X mvaddstr(6,0,"Name X Y Lvl Type Login\n"); X fp = fopen(peoplefile,"r"); X while (fread((char *) &buf,sizeof(buf),1,fp)) X { X if (buf.status) X { X ch = (buf.status == CLOAKED) ? '?' : 'W'; X if (stat->typ > 10 || buf.typ > 10 || loc >= circ(buf.x,buf.y) || stat->pal) X if (buf.status != CLOAKED || (stat->typ == 99 && stat->pal)) X if (buf.typ == 99) X addstr("The Valar is watching you. . .\n"); X else if (buf.wormhole) X printw("%-20s %c %c %6u %3d %-9s\n", X buf.name,ch,ch,buf.lvl,buf.typ,buf.login); X else X printw("%-20s %8.0f %8.0f %6u %3d %-9s\n", X buf.name,buf.x,buf.y,buf.lvl,buf.typ,buf.login); X else X if (buf.typ == 99) X --loop; X else X printw("%-20s ? ? %6u %3d %-9s\n", X buf.name,buf.lvl,buf.typ,buf.login); X ++loop; X } X } X fclose(fp); X time(<mp); X printw("Total users = %d %s\n",loop,ctime(<mp)); X refresh(); X} X X Xvoid printhelp() /* print help file */ X{ XFILE *fp; Xchar instr[100]; X X fp = fopen(helpfile,"r"); X while (fgets(instr,100,fp)) X fputs(instr,stdout); X fclose(fp); X} X Xvoid titlestuff() /* print out a header */ X{ XFILE *fp; Xchar instr[80], hiname[21], nxtname[21], aline[80]; Xbool cowfound = FALSE, kingfound = FALSE; Xstruct stats buf; Xdouble hiexp, nxtexp; Xunsigned hilvl, nxtlvl; Xreg int loop; X X mvaddstr(0,15,"W e l c o m e t o P h a n t a s i a (vers. 3.2)!"); X fp = fopen(motd,"r"); X if (fgets(instr,80,fp)) X mvaddstr(2,40 - strlen(instr)/2,instr); X fclose(fp); X fp = fopen(peoplefile,"r"); X while (fread((char *) &buf,sizeof(buf),1,fp)) X if (buf.typ > 10 && buf.typ < 20) X { X sprintf(instr,"The present ruler is %s Level:%d",buf.name,buf.lvl); X mvaddstr(4,40 - strlen(instr)/2,instr); X kingfound = TRUE; X break; X } X if (!kingfound) X mvaddstr(4,24,"There is no ruler at this time."); X fseek(fp,0L,0); X while (fread((char *) &buf,sizeof(buf),1,fp)) X if (buf.typ == 99) X { X sprintf(instr,"The Valar is %s Login: %s",buf.name,buf.login); X mvaddstr(6,40 - strlen(instr)/2,instr); X break; X } X fseek(fp,0L,0); X while (fread((char *) &buf,sizeof(buf),1,fp)) X if (buf.typ > 20 && buf.typ < 90) X { X if (!cowfound) X { X mvaddstr(8,30,"Council of the Wise:"); X loop = 10; X cowfound = TRUE; X } X /* This assumes a finite (<=7) number of C.O.W.: */ X sprintf(instr,"%s Login: %s",buf.name,buf.login); X mvaddstr(loop++,40 - strlen(instr)/2,instr); X } X fseek(fp,0L,0); X *nxtname = *hiname = '\0'; X hiexp = 0.0; X nxtlvl = hilvl = 0; X while (fread((char *) &buf,sizeof(buf),1,fp)) X if (buf.exp > hiexp && buf.typ < 20) X { X nxtexp = hiexp; X hiexp = buf.exp; X nxtlvl = hilvl; X hilvl = buf.lvl; X strcpy(nxtname,hiname); X strcpy(hiname,buf.name); X } X else if (buf.exp > nxtexp && buf.typ < 20) X { X nxtexp = buf.exp; X nxtlvl = buf.lvl; X strcpy(nxtname,buf.name); X } X fclose(fp); X mvaddstr(17,28,"Highest characters are:"); X sprintf(instr,"%s Level:%d and %s Level:%d",hiname,hilvl,nxtname,nxtlvl); X mvaddstr(19,40 - strlen(instr)/2,instr); X fp = fopen(lastdead,"r"); X fgets(aline,80,fp); X sprintf(instr,"The last character to die is %s",aline); X mvaddstr(21,40 - strlen(instr)/2,instr); X fclose(fp); X refresh(); X} X X X Xvoid printmonster() /* do a monster list on the terminal */ X{ XFILE *fp; Xreg int count = 0; Xchar instr[100]; X X puts(" # Name Str Brains Quick Hits Exp Treas Type Flock%\n"); X fp = fopen(monsterfile,"r"); X while (fgets(instr,100,fp)) X printf("%2d %s",count++,instr); X fclose(fp); X} X Xvoid exit1() /* exit, but cleanup */ X{ X move(23,0); X refresh(); X nocrmode(); X endwin(); X exit(0); X /*NOTREACHED*/ X} X Xvoid init1() /* set up for screen updating */ X{ X /* catch/ingnore signals */ X#ifdef BSD41 X sigignore(SIGQUIT); X sigignore(SIGALRM); X sigignore(SIGTERM); X sigignore(SIGTSTP); X sigignore(SIGTTIN); X sigignore(SIGTTOU); X sighold(SIGINT); X#endif X#ifdef BSD42 X signal(SIGQUIT,interrupt,1); X signal(SIGALRM,interrupt,1); X signal(SIGTERM,interrupt,1); X signal(SIGTSTP,interrupt,1); X signal(SIGTTIN,interrupt,1); X signal(SIGTTOU,interrupt,1); X signal(SIGINT,interrupt,1); X#endif X#ifdef USG3 X signal(SIGINT,SIG_IGN); X signal(SIGQUIT,SIG_IGN); X signal(SIGTERM,SIG_IGN); X signal(SIGALRM,SIG_IGN); X#endif X#ifdef USG5 X signal(SIGINT,SIG_IGN); X signal(SIGQUIT,SIG_IGN); X signal(SIGTERM,SIG_IGN); X signal(SIGALRM,SIG_IGN); X#endif X srand((unsigned) time((long *) NULL)); /* prime random numbers */ X initscr(); X noecho(); X crmode(); X clear(); X refresh(); X} X Xvoid getstring(cp,mx) /* get a string from the stdscr at current y,x */ Xreg char *cp; Xreg int mx; X{ Xreg int loop = 0, x, y, xorig; Xint ch; X X getyx(stdscr,y,xorig); X clrtoeol(); X refresh(); X while((ch = getch()) != '\n' && loop < mx - 1) X switch (ch) X { X case '\033': /* escape */ X case '\010': /* backspace */ X if (loop) X { X --loop; X getyx(stdscr,y,x); X mvaddch(y,x-1,' '); X move(y,x-1); X refresh(); X } X break; X case '\030': /* ctrl-x */ X loop = 0; X move(y,xorig); X clrtoeol(); X refresh(); X break; X default: X if (ch >= ' ') /* printing char */ X { X addch(ch); X cp[loop++] = ch; X refresh(); X } X } X cp[loop] = '\0'; X} X X Xvoid showusers() /* print a list of all characters */ X{ Xstruct stats buf; XFILE *fp; X X if (fp = fopen(peoplefile,"r")) X { X puts("Current characters on file are:\n"); X while (fread((char *) &buf,sizeof(buf),1,fp)) X if (strcmp("",buf.name)) X printf("%-20s Login: %-9s Level: %6u\n",buf.name,buf.login,buf.lvl); X fclose(fp); X } X} X Xvoid kingstuff(stat) /* stuff upon entering throne */ Xreg struct stats *stat; X{ XFILE *fp; Xstruct stats buf; Xstruct nrgvoid vbuf; Xreg int loc = 0; X X if (stat->typ < 10) /* check to see if king -- assumes crown */ X { X fp = fopen(peoplefile,"r"); X while (fread((char *) &buf,sizeof(buf),1,fp)) X if (buf.typ > 10 && buf.typ < 20) /* found old king */ X if (buf.status != OFF) X { X mvaddstr(6,0,"The king is playing, so you cannot steal his throne\n"); X stat->x = stat->y = 9; X move(3,0); X fclose(fp); X return; X } X else X { X buf.typ -= 10; X if (buf.crn) X --buf.crn; X fclose(fp); X update(&buf,loc); XKING: stat->typ = abs(stat->typ) + 10; X mvaddstr(6,0,"You have become king!\n"); X fp = fopen(messfile,"w"); X fprintf(fp,"All hail the new king!"); X fclose(fp); X /* clear all energy voids */ X fp = fopen(voidfile,"r"); X fread((char *) &vbuf,sizeof(vbuf),1,fp); X fclose(fp); X fp = fopen(voidfile,"w"); X fwrite((char *) &vbuf,sizeof(vbuf),1,fp); X fclose(fp); X goto EXIT; X } X else X ++loc; X fclose(fp); /* old king not found -- install new one */ X goto KING; X } XEXIT: mvaddstr(3,0,"0:Decree "); X} X Xvoid paws(where) /* wait for input to continue */ Xint where; X{ X mvaddstr(where,0,"-- more --"); X rgetch(); X} X Xvoid cstat() /* examine/change stats of a character */ X{ Xstruct stats charac; Xchar s[60], flag[2]; XFILE *fp; Xreg int loc = 0; Xint c, temp, today; Xlong ltemp; Xdouble dtemp; X X flag[0] = 'F'; flag[1] = 'T'; X mvaddstr(10,0,"Which character do you want to look at ? "); X getstring(s,60); X if (fp = fopen(peoplefile,"r")) X while (fread((char *) &charac,sizeof(charac),1,fp)) X if (!strcmp(s,charac.name)) X goto FOUND; X else X ++loc; X mvaddstr(11,0,"Not found."); X exit1(); X /*NOTREACHED*/ X XFOUND: fclose(fp); X time(<emp); X today = localtime(<emp)->tm_yday; X if (!su) X strcpy(charac.pswd,"XXXXXXXX"); X clear(); XTOP: mvprintw(0,0,"a:Name %s\n",charac.name); X printw("b:Password %s\n",charac.pswd); X printw(" :Login %s\n",charac.login); X temp = today - charac.lastused; X if (temp < 0) X temp += 365; X printw("c:Used %d\n",temp); X mvprintw(5,0,"d:Experience %.0f\n",charac.exp); X printw("e:Level %d\n",charac.lvl); X printw("f:Strength %.0f\n",charac.str); X printw("g:Sword %.0f\n",charac.swd); X printw("h:Quickness %d\n",charac.quk); X printw("i:Quikslvr %d\n",charac.quks); X printw("j:Energy %.0f\n",charac.nrg); X printw("k:Max-Nrg %.0f\n",charac.mxn); X printw("l:Shield %.0f\n",charac.shd); X printw("m:Magic %.0f\n",charac.mag); X printw("n:Manna %.0f\n",charac.man); X printw("o:Brains %.0f\n",charac.brn); X mvprintw(0,40,"p:X-coord %.0f\n",charac.x); X mvprintw(1,40,"q:Y-coord %.0f\n",charac.y); X if (su) X mvprintw(2,40,"r:Wormhole %d\n",charac.wormhole); X else X mvprintw(2,40,"r:Wormhole %c\n",flag[charac.wormhole != 0]); X mvprintw(3,40,"s:Type %d\n",charac.typ); X mvprintw(5,40,"t:Sin %0.3f\n",charac.sin); X mvprintw(6,40,"u:Poison %0.3f\n",charac.psn); X mvprintw(7,40,"v:Gold %.0f\n",charac.gld); X mvprintw(8,40,"w:Gem %.0f\n",charac.gem); X mvprintw(9,40,"x:Holy Water %d\n",charac.hw); X mvprintw(10,40,"y:Charms %d\n",charac.chm); X mvprintw(11,40,"z:Crowns %d\n",charac.crn); X mvprintw(12,40,"1:Amulets %d\n",charac.amu); X mvprintw(13,40,"2:Age %d\n",charac.age); X mvprintw(18,5,"3:Virgin %c 4:Blessed %c 5:Ring %c 6:Blind %c 7:Palantir %c", X flag[charac.vrg],flag[charac.bls],flag[charac.rng.type != 0],flag[charac.blind],flag[charac.pal]); X if (!su) X exit1(); X mvaddstr(15,40,"!:Quit"); X mvaddstr(16,40,"?:Delete"); X mvaddstr(19,30,"8:Duration"); X mvaddstr(21,0,"What would you like to change? "); X c = rgetch(); X switch(c) X { X case 'p': /* change x coord */ X mvprintw(23,0,"x = %f; x = ",charac.x); X dtemp = inflt(); X if (dtemp != 0.0) X charac.x = dtemp; X break; X case 'q': /* change y coord */ X mvprintw(23,0,"y = %f; y = ",charac.y); X dtemp = inflt(); X if (dtemp != 0.0) X charac.y = dtemp; X break; X case 'd': /* change Experience */ X mvprintw(23,0,"exp = %f; exp = ",charac.exp); X dtemp = inflt(); X if (dtemp != 0.0) X charac.exp = dtemp; X break; X case 'e': /* change level */ X mvprintw(23,0,"lvl = %d; lvl;= ",charac.lvl); X dtemp = inflt(); X if (dtemp != 0.0) X charac.lvl = dtemp; X break; X case 'h': /* change quickness */ X mvprintw(23,0,"quk = %d; quk;= ",charac.quk); X dtemp = inflt(); X if (dtemp != 0.0) X charac.quk = dtemp; X break; X case 'f': /* change strength */ X mvprintw(23,0,"str = %f; str;= ",charac.str); X dtemp = inflt(); X if (dtemp != 0.0) X charac.str = dtemp; X break; X case 't': /* change Sin */ X mvprintw(23,0,"sin = %f; sin;= ",charac.sin); X dtemp = inflt(); X if (dtemp != 0.0) X charac.sin = dtemp; X break; X case 'n': /* change manna */ X mvprintw(23,0,"man = %f; man;= ",charac.man); X dtemp = inflt(); X if (dtemp != 0.0) X charac.man = dtemp; X break; X case 'v': /* change gold */ X mvprintw(23,0,"gld = %f; gld;= ",charac.gld); X dtemp = inflt(); X if (dtemp != 0.0) X charac.gld = dtemp; X break; X case 'j': /* change energy */ X mvprintw(23,0,"nrg = %f; nrg;= ",charac.nrg); X dtemp = inflt(); X if (dtemp != 0.0) X charac.nrg = dtemp; X break; X case 'k': /* change Maximum energy */ X mvprintw(23,0,"mxn = %f; mxn;= ",charac.mxn); X dtemp = inflt(); X if (dtemp != 0.0) X charac.mxn = dtemp; X break; X case 'm': /* change magic */ X mvprintw(23,0,"mag = %f; mag;= ",charac.mag); X dtemp = inflt(); X if (dtemp != 0.0) X charac.mag = dtemp; X break; X case 'o': /* change brains */ X mvprintw(23,0,"brn = %f; brn;= ",charac.brn); X dtemp = inflt(); X if (dtemp != 0.0) X charac.brn = dtemp; X break; X case 'z': /* change crowns */ X mvprintw(23,0,"crn = %d; crn;= ",charac.crn); X dtemp = inflt(); X if (dtemp != 0.0) X charac.crn = dtemp; X break; X case '5': /* change ring type */ X mvprintw(23,0,"rng-type = %d; rng-type;= ",charac.rng.type); X dtemp = inflt(); X if (dtemp != 0.0) X charac.rng.type = dtemp; X break; X case '8': /* change ring duration */ X mvprintw(23,0,"rng-duration = %d; rng-duration;= ",charac.rng.duration); X dtemp = inflt(); X if (dtemp != 0.0) X charac.rng.duration = dtemp; X break; X case '7': /* change palantir */ X mvprintw(23,0,"pal = %d; pal;= ",charac.pal); X dtemp = inflt(); X if (dtemp != 0.0) X { X charac.pal = dtemp; X charac.pal = (charac.pal != 0); X } X break; X case 'u': /* change poison */ X mvprintw(23,0,"psn = %f; psn;= ",charac.psn); X dtemp = inflt(); X if (dtemp != 0.0) X charac.psn = dtemp; X break; X case 'x': /* change holy water */ X mvprintw(23,0,"hw = %d; hw;= ",charac.hw); X dtemp = inflt(); X if (dtemp != 0.0) X charac.hw = dtemp; X break; X case '1': /* change amulet */ X mvprintw(23,0,"amu = %d; amu;= ",charac.amu); X dtemp = inflt(); X if (dtemp != 0.0) X charac.amu = dtemp; X break; X case '4': /* change Blessing */ X mvprintw(23,0,"bls = %d; bls;= ",charac.bls); X dtemp = inflt(); X if (dtemp != 0.0) X { X charac.bls = dtemp; X charac.bls = (charac.bls != 0); X } X break; X case 'y': /* change Charm */ X mvprintw(23,0,"chm = %d; chm;= ",charac.chm); X dtemp = inflt(); X if (dtemp != 0.0) X charac.chm = dtemp; X break; X case 'w': /* change Gems */ X mvprintw(23,0,"gem = %f; gem;= ",charac.gem); X dtemp = inflt(); X if (dtemp != 0.0) X charac.gem = dtemp; X break; X case 'i': /* change Quicksilver */ X mvprintw(23,0,"quks = %d; quks;= ",charac.quks); X dtemp = inflt(); X if (dtemp != 0.0) X charac.quks = dtemp; X break; X case 'g': /* change swords */ X mvprintw(23,0,"swd = %f; swd;= ",charac.swd); X dtemp = inflt(); X if (dtemp != 0.0) X charac.swd = dtemp; X break; X case 'l': /* change shields */ X mvprintw(23,0,"shd = %f; shd;= ",charac.shd); X dtemp = inflt(); X if (dtemp != 0.0) X charac.shd = dtemp; X break; X case 's': /* change type */ X mvprintw(23,0,"typ = %d; typ;= ",charac.typ); X dtemp = inflt(); X if (dtemp != 0.0) X charac.typ = dtemp; X break; X case '3': /* change virgin */ X mvprintw(23,0,"vrg = %d; vrg;= ",charac.vrg); X dtemp = inflt(); X if (dtemp != 0.0) X { X charac.vrg = dtemp; X charac.vrg = (charac.vrg != 0); X } X break; X case 'c': /* change last-used */ X mvprintw(23,0,"last-used = %d; last-used;= ",charac.lastused); X dtemp = inflt(); X if (dtemp != 0.0) X charac.lastused = dtemp; X break; X case 'b': /* change password */ X mvaddstr(23,0,"New password: "); X getstring(s,60); X if (*s) X strcpy(charac.pswd,s); X break; X case 'a': /* change name */ X mvaddstr(23,0,"New name: "); X getstring(s,60); X if (*s) X strcpy(charac.name,s); X break; X case 'r': /* change wormhole */ X mvprintw(23,0,"wormhole = %d; wormhole;= ",charac.wormhole); X dtemp = inflt(); X if (dtemp != 0.0) X charac.wormhole = dtemp; X break; X case '2': /* change age */ X mvprintw(23,0,"age = %d; age;= ",charac.age); X dtemp = inflt(); X if (dtemp != 0.0) X charac.age = dtemp; X break; X case '6': /* change blindness */ X mvprintw(23,0,"blind = %d; blind;= ",charac.blind); X dtemp = inflt(); X if (dtemp != 0.0) X { X charac.blind = dtemp; X charac.blind = (charac.blind != 0); X } X break; X case '!': /* quit, update */ X goto LEAVE; X case '?': /* delete char */ X strcpy(charac.name,""); X initchar(&charac); X goto LEAVE; X } X goto TOP; XLEAVE: charac.status = OFF; X update(&charac,loc); X} X Xunsigned level(expr) /* calculate level */ Xdouble expr; X{ X if (expr < 1.1e+7) X return (pow((expr/1000.0), 0.4875)); X else X return (pow((expr/1250.0), 0.4865)); X} X Xvoid trunc(str) /* remove blank spaces at the end of str[] */ Xreg char *str; X{ Xreg int loop; X loop = strlen(str) - 1; X while (str[--loop] == ' ') X str[loop] = '\0'; X} X Xdouble inflt() /* get a floating point # from the terminal */ X{ Xchar aline[80]; Xdouble res; X getstring(aline,80); X if (sscanf(aline,"%F",&res) < 1) X res = 0; X return (res); X} X Xvoid checkmov(stat) /* see if beyond PONR */ Xreg struct stats *stat; X{ X if (beyond) X { X stat->x = sgn(stat->x) * max(abs(stat->x),1.1e+6); X stat->y = sgn(stat->y) * max(abs(stat->y),1.1e+6); X } X} Xvoid scramble(stat) /* mix up some stats */ Xreg struct stats *stat; X{ Xdouble buf[5], temp; Xreg int first, second; Xreg double *bp; X X bp = buf; X *bp++ = stat->str; X *bp++ = stat->man; X *bp++ = stat->brn; X *bp++ = stat->mag; X *bp++ = stat->nrg; X X bp = buf; X first = roll(0,5); X second = roll(0,5); X temp = bp[first]; X bp[first] = bp[second]; X bp[second] = temp; X X stat->str = *bp++; X stat->man = *bp++; X stat->brn = *bp++; X stat->mag = *bp++; X stat->nrg = *bp++; X} !EOR!