From e41bd31debce476e2f6ae864651c7380bea2cdbb Mon Sep 17 00:00:00 2001 From: markm Date: Mon, 21 Oct 2002 07:40:27 +0000 Subject: Deorbit complete. We dont build these anymore, so into the attic they go. --- games/phantasia/COPYRIGHT | 24 - games/phantasia/Makefile | 41 - games/phantasia/OWNER | 6 - games/phantasia/README | 82 -- games/phantasia/fight.c | 1693 ---------------------------------------- games/phantasia/gamesupport.c | 725 ----------------- games/phantasia/include.h | 18 - games/phantasia/interplayer.c | 1211 ----------------------------- games/phantasia/io.c | 439 ----------- games/phantasia/macros.h | 16 - games/phantasia/main.c | 1303 ------------------------------- games/phantasia/map.c | 160 ---- games/phantasia/misc.c | 1708 ----------------------------------------- games/phantasia/monsters.asc | 100 --- games/phantasia/pathnames.h | 52 -- games/phantasia/phantasia.6 | 1225 ----------------------------- games/phantasia/phantdefs.h | 139 ---- games/phantasia/phantglobs.c | 113 --- games/phantasia/phantglobs.h | 85 -- games/phantasia/phantstruct.h | 124 --- games/phantasia/setup.c | 268 ------- 21 files changed, 9532 deletions(-) delete mode 100644 games/phantasia/COPYRIGHT delete mode 100644 games/phantasia/Makefile delete mode 100644 games/phantasia/OWNER delete mode 100644 games/phantasia/README delete mode 100644 games/phantasia/fight.c delete mode 100644 games/phantasia/gamesupport.c delete mode 100644 games/phantasia/include.h delete mode 100644 games/phantasia/interplayer.c delete mode 100644 games/phantasia/io.c delete mode 100644 games/phantasia/macros.h delete mode 100644 games/phantasia/main.c delete mode 100644 games/phantasia/map.c delete mode 100644 games/phantasia/misc.c delete mode 100644 games/phantasia/monsters.asc delete mode 100644 games/phantasia/pathnames.h delete mode 100644 games/phantasia/phantasia.6 delete mode 100644 games/phantasia/phantdefs.h delete mode 100644 games/phantasia/phantglobs.c delete mode 100644 games/phantasia/phantglobs.h delete mode 100644 games/phantasia/phantstruct.h delete mode 100644 games/phantasia/setup.c (limited to 'games/phantasia') diff --git a/games/phantasia/COPYRIGHT b/games/phantasia/COPYRIGHT deleted file mode 100644 index 71a58b3..0000000 --- a/games/phantasia/COPYRIGHT +++ /dev/null @@ -1,24 +0,0 @@ -This entire subtree is explicitly not copyrighted. -The following notice applies to all files found here. None of -these files contain AT&T proprietary source code. -_____________________________________________________________________________ - -/* DISCLAIMER: - * - * This game is distributed for free as is. It is not guaranteed to work - * in every conceivable environment. It is not even guaranteed to work - * in ANY environment. - * - * This game is distributed without notice of copyright, therefore it - * may be used in any manner the recipient sees fit. However, the - * author assumes no responsibility for maintaining or revising this - * game, in its original form, or any derivitives thereof. - * - * The author shall not be responsible for any loss, cost, or damage, - * including consequential damage, caused by reliance on this material. - * - * The author makes no warranties, express or implied, including warranties - * of merchantability or fitness for a particular purpose or use. - * - * AT&T is in no way connected with this game. - */ diff --git a/games/phantasia/Makefile b/games/phantasia/Makefile deleted file mode 100644 index 8c79652..0000000 --- a/games/phantasia/Makefile +++ /dev/null @@ -1,41 +0,0 @@ -# @(#)Makefile 8.1 (Berkeley) 5/31/93 -# $FreeBSD$ - -PROG= phantasia -SRCS= main.c fight.c io.c interplayer.c gamesupport.c misc.c phantglobs.c -DPADD= ${LIBM} ${LIBCURSES} ${LIBCOMPAT} -LDADD= -lm -lcurses -lcompat -DATAFILES=characs gold lastdead mess monsters motd scoreboard void -HIDEGAME=hidegame -MAN= phantasia.6 -CLEANFILES=${DATAFILES} cross-phantglobs.o map setup setup.o stamp.setuprun - -all: stamp.setuprun - -build-tools: setup - -cross-phantglobs.o: phantglobs.c - ${CC} ${CFLAGS} -c -o ${.TARGET} ${.ALLSRC} - -stamp.setuprun: monsters.asc setup - ./setup -m ${.CURDIR}/monsters.asc - touch ${.TARGET} - -setup: cross-phantglobs.o setup.o ${LIBM} - ${CC} -static ${CFLAGS} ${LDFLAGS} -o ${.TARGET} ${.ALLSRC:M*.o} -lm - -beforeinstall: -.for file in ${DATAFILES} -.if !exists(${DESTDIR}/var/games/phantasia/${file}) - ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m 660 \ - ${file} ${DESTDIR}/var/games/phantasia -.endif -.endfor - -# Make Phantasia map. Change the map commands reflect your installation. -# PLOTDEVICE is used for plotting the map. Change as appropriate. -map: map.c - ${CC} -static -O ${.CURDIR}/map.c -lplot -o ${.TARGET} - ./map | plot > /dev/tty - -.include diff --git a/games/phantasia/OWNER b/games/phantasia/OWNER deleted file mode 100644 index 28387fe..0000000 --- a/games/phantasia/OWNER +++ /dev/null @@ -1,6 +0,0 @@ - Edward Estes - AT&T - 5555 Touhy Ave. - Skokie, IL 60077 - (312) 982-3969 - ihnp4!ttrde!estes diff --git a/games/phantasia/README b/games/phantasia/README deleted file mode 100644 index d56a621..0000000 --- a/games/phantasia/README +++ /dev/null @@ -1,82 +0,0 @@ -June 25, 1986 - - -This is a much modified version of Phantasia. It is intended to fix -all reported bug fixes, enhance the game, and speed up the game. - -I have to thank Chris Robertson for many ideas which have made the game -faster, and more user-friendly. Most of her changes/additions are -incorporated in this latest versions, although perhaps not in the exact -manner of her design. I left out a few items which were not in keeping -with the spirit of the game. (For example, I didn't like the extra lives -and the pausing of the game. I think it's too easy even WITHOUT that stuff.) - -CHANGES: - - - Wormholes have been deleted (I never liked them anyway). - - The source code has been greatly enhanced for speed, size, readability, - and maintainability. - fight.c should no longer cause optimizers to run out of space. - - A few loopholes have been tightened to make the game more enjoyable. - (Except for those who are in the habit of exercising those loopholes.) - - Chris' map is enclosed. - - The "charac" file is not compatible with older versions of Phantasia - (3.3.1 and 3.3.1+). A 'convert' program is provided to convert your - old file to the new format. See Makefile for details. - - Movements can be made with HJKL for WSNE, respectively. - - Players may examine others while playing ('x') option. - - Monsters are now stored in a binary data base, to speed calling - monsters, and to ease formatting of monster listings. - - Taxes are collected on all gold and gems. - - Dead players can be resurrected by the 'wizard'. - - 'setup' is smarter, although not as smart as it should be. - - Players can change their names and passwords - -PORTABILTY: - - I have tried to make this as non-machine/system specific as possible. - - All identifiers are unique to 7 characters or less, dual case. - - The code WILL NOT fit on a 16-bit machine without separate I/D. - - Stdio MUST support fopen() with mode "r+". I think this is true - for all Version 7 and later. - - 'curses' library functions are required. - - All problems/solutions with portability should be reported to me, - and fixes will be included in subsequent versions of this software. - - -Please send me any bugs, (of which I am sure there are many), you may find, -but PLEASE be specific. I cannot correct a bug which is described as: - - "When I choose a character type, it blows up." - - (What blows up? What exactly was printed at the terminal? - Which character type was chosen? Etc. . . ?) - -Also, please tell me which version of UN*X you are running, and upon -which type of hardware. - -I will also do my best to help anyone with problems just trying to -get the game running. Again, I need to know which version of UN*X -and what type of CPU. Also, a copy of the output from 'make' -would be extremely useful. - -Any and all ideas/suggestions/additions are more than welcome. If -you feel strongly enough about it, write the change and send it to me, -and I will do my best to incorporate it in the next version of Phantasia. -Otherwise, I will give serious thought to adding it myself. - -Follow the directions in the Makefile CAREFULLY to set up the game. -Read the comments at the beginning of 'main.c', if you haven't already. - -Enjoy. - -Ted Estes -AT&T Information Systems -Skokie, IL 60077 - -...!ihnp4!ttrdc!ttrda!estes diff --git a/games/phantasia/fight.c b/games/phantasia/fight.c deleted file mode 100644 index 030b29b..0000000 --- a/games/phantasia/fight.c +++ /dev/null @@ -1,1693 +0,0 @@ -/* - * fight.c Phantasia monster fighting routines - * - * $FreeBSD$ - */ - -#include -#include "include.h" - -/************************************************************************ -/ -/ FUNCTION NAME: encounter() -/ -/ FUNCTION: monster battle routine -/ -/ AUTHOR: E. A. Estes, 2/20/86 -/ -/ ARGUMENTS: -/ int particular - particular monster to fight if >= 0 -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: monsthits(), playerhits(), readmessage(), callmonster(), -/ writerecord(), pickmonster(), displaystats(), pow(), cancelmonster(), -/ awardtreasure(), more(), death(), wmove(), setjmp(), drandom(), printw(), -/ longjmp(), wrefresh(), mvprintw(), wclrtobot() -/ -/ GLOBAL INPUTS: Curmonster, Whichmonster, LINES, Lines, Circle, Shield, -/ Player, *stdscr, Fileloc, Fightenv[], *Enemyname -/ -/ GLOBAL OUTPUTS: Curmonster, Whichmonster, Lines, Shield, Player, Luckout -/ -/ DESCRIPTION: -/ Choose a monster and check against some special types. -/ Arbitrate between monster and player. Watch for either -/ dying. -/ -*************************************************************************/ - -encounter(particular) -int particular; -{ -bool firsthit = Player.p_blessing; /* set if player gets the first hit */ -int flockcnt = 1; /* how many time flocked */ - - /* let others know what we are doing */ - Player.p_status = S_MONSTER; - writerecord(&Player, Fileloc); - -#ifdef SYS5 - flushinp(); -#endif - - Shield = 0.0; /* no shield up yet */ - - if (particular >= 0) - /* monster is specified */ - Whichmonster = particular; - else - /* pick random monster */ - Whichmonster = pickmonster(); - - setjmp(Fightenv); /* this is to enable changing fight state */ - - move(6, 0); - clrtobot(); /* clear bottom area of screen */ - - Lines = 9; - callmonster(Whichmonster); /* set up monster to fight */ - - Luckout = FALSE; /* haven't tried to luckout yet */ - - if (Curmonster.m_type == SM_MORGOTH) - mvprintw(4, 0, "You've encountered %s, Bane of the Council and Valar.\n", - Enemyname); - - if (Curmonster.m_type == SM_UNICORN) - { - if (Player.p_virgin) - { - printw("You just subdued %s, thanks to the virgin.\n", Enemyname); - Player.p_virgin = FALSE; - } - else - { - printw("You just saw %s running away!\n", Enemyname); - Curmonster.m_experience = 0.0; - Curmonster.m_treasuretype = 0; - } - } - else - /* not a special monster */ - for (;;) - /* print header, and arbitrate between player and monster */ - { - mvprintw(6, 0, "You are being attacked by %s, EXP: %.0f (Size: %.0f)\n", - Enemyname, Curmonster.m_experience, Circle); - - displaystats(); - mvprintw(1, 26, "%20.0f", Player.p_energy + Shield); /* overprint energy */ - readmessage(); - - if (Curmonster.m_type == SM_DARKLORD - && Player.p_blessing - && Player.p_charms > 0) - /* overpower Dark Lord with blessing and charm */ - { - mvprintw(7, 0, "You just overpowered %s!", Enemyname); - Lines = 8; - Player.p_blessing = FALSE; - --Player.p_charms; - break; - } - - /* allow paralyzed monster to wake up */ - Curmonster.m_speed = MIN(Curmonster.m_speed + 1.0, Curmonster.m_maxspeed); - - if (drandom() * Curmonster.m_speed > drandom() * Player.p_speed - /* monster is faster */ - && Curmonster.m_type != SM_DARKLORD - /* not D. L. */ - && Curmonster.m_type != SM_SHRIEKER - /* not mimic */ - && !firsthit) - /* monster gets a hit */ - monsthits(); - else - /* player gets a hit */ - { - firsthit = FALSE; - playerhits(); - } - - refresh(); - - if (Lines > LINES - 2) - /* near bottom of screen - pause */ - { - more(Lines); - move(Lines = 8, 0); - clrtobot(); - } - - if (Player.p_energy <= 0.0) - /* player died */ - { - more(Lines); - death(Enemyname); - cancelmonster(); - break; /* fight ends if the player is saved from death */ - } - - if (Curmonster.m_energy <= 0.0) - /* monster died */ - break; - } - - /* give player credit for killing monster */ - Player.p_experience += Curmonster.m_experience; - - if (drandom() < Curmonster.m_flock / 100.0) - /* monster flocks */ - { - more(Lines); - ++flockcnt; - longjmp(Fightenv, 0); - /*NOTREACHED*/ - } - else if (Circle > 1.0 - && Curmonster.m_treasuretype > 0 - && drandom() > 0.2 + pow(0.4, (double) (flockcnt / 3 + Circle / 3.0))) - /* monster has treasure; this takes # of flocks and size into account */ - { - more(Lines); - awardtreasure(); - } - - /* pause before returning */ - getyx(stdscr, Lines, flockcnt); - more(Lines + 1); - - Player.p_ring.ring_inuse = FALSE; /* not using ring */ - - /* clean up the screen */ - move(4, 0); - clrtobot(); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: pickmonster() -/ -/ FUNCTION: choose a monster based upon where we are -/ -/ AUTHOR: E. A. Estes, 2/20/86 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: monster number to call -/ -/ MODULES CALLED: floor(), drandom() -/ -/ GLOBAL INPUTS: Marsh, Circle, Player -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Certain monsters can be found in certain areas of the grid. -/ We take care of rolling them here. -/ Unfortunately, this routine assumes that the monster data -/ base is arranged in a particular order. If the data base -/ is altered (to add monsters, or make them tougher), this -/ routine may also need to be changed. -/ -*************************************************************************/ - -pickmonster() -{ - if (Player.p_specialtype == SC_VALAR) - /* even chance of any monster */ - return((int) ROLL(0.0, 100.0)); - - if (Marsh) - /* water monsters */ - return((int) ROLL(0.0, 15.0)); - - else if (Circle > 24) - /* even chance of all non-water monsters */ - return((int) ROLL(14.0, 86.0)); - - else if (Circle > 15) - /* chance of all non-water monsters, weighted toward middle */ - return((int) (ROLL(0.0, 50.0) + ROLL(14.0, 37.0))); - - else if (Circle > 8) - /* not all non-water monsters, weighted toward middle */ - return((int) (ROLL(0.0, 50.0) + ROLL(14.0, 26.0))); - - else if (Circle > 3) - /* even chance of some tamer non-water monsters */ - return((int) ROLL(14.0, 50.0)); - - else - /* even chance of some of the tamest non-water monsters */ - return((int) ROLL(14.0, 25.0)); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: playerhits() -/ -/ FUNCTION: prompt player for action in monster battle, and process -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: hitmonster(), throwspell(), inputoption(), cancelmonster(), -/ floor(), wmove(), drandom(), altercoordinates(), waddstr(), mvprintw(), -/ wclrtoeol(), wclrtobot() -/ -/ GLOBAL INPUTS: Curmonster, Lines, Player, *stdscr, Luckout, *Enemyname -/ -/ GLOBAL OUTPUTS: Curmonster, Lines, Player, Luckout -/ -/ DESCRIPTION: -/ Process all monster battle options. -/ -*************************************************************************/ - -playerhits() -{ -double inflict; /* damage inflicted */ -int ch; /* input */ - - mvaddstr(7, 0, "1:Melee 2:Skirmish 3:Evade 4:Spell 5:Nick "); - - if (!Luckout) { - /* haven't tried to luckout yet */ - if (Curmonster.m_type == SM_MORGOTH) - /* cannot luckout against Morgoth */ - addstr("6:Ally "); - else - addstr("6:Luckout "); - } - - if (Player.p_ring.ring_type != R_NONE) - /* player has a ring */ - addstr("7:Use Ring "); - else - clrtoeol(); - - ch = inputoption(); - - move(8, 0); - clrtobot(); /* clear any messages from before */ - Lines = 9; - mvaddstr(4, 0, "\n\n"); /* clear status area */ - - switch (ch) - { - case 'T': /* timeout; lose turn */ - break; - - case ' ': - case '1': /* melee */ - /* melee affects monster's energy and strength */ - inflict = ROLL(Player.p_might / 2.0 + 5.0, 1.3 * Player.p_might) - + (Player.p_ring.ring_inuse ? Player.p_might : 0.0); - - Curmonster.m_melee += inflict; - Curmonster.m_strength = Curmonster.m_o_strength - - Curmonster.m_melee / Curmonster.m_o_energy - * Curmonster.m_o_strength / 4.0; - hitmonster(inflict); - break; - - case '2': /* skirmish */ - /* skirmish affects monter's energy and speed */ - inflict = ROLL(Player.p_might / 3.0 + 3.0, 1.1 * Player.p_might) - + (Player.p_ring.ring_inuse ? Player.p_might : 0.0); - - Curmonster.m_skirmish += inflict; - Curmonster.m_maxspeed = Curmonster.m_o_speed - - Curmonster.m_skirmish / Curmonster.m_o_energy - * Curmonster.m_o_speed / 4.0; - hitmonster(inflict); - break; - - case '3': /* evade */ - /* use brains and speed to try to evade */ - if ((Curmonster.m_type == SM_DARKLORD - || Curmonster.m_type == SM_SHRIEKER - /* can always run from D. L. and shrieker */ - || drandom() * Player.p_speed * Player.p_brains - > drandom() * Curmonster.m_speed * Curmonster.m_brains) - && (Curmonster.m_type != SM_MIMIC)) - /* cannot run from mimic */ - { - mvaddstr(Lines++, 0, "You got away!"); - cancelmonster(); - altercoordinates(0.0, 0.0, A_NEAR); - } - else - mvprintw(Lines++, 0, "%s is still after you!", Enemyname); - - break; - - case 'M': - case '4': /* magic spell */ - throwspell(); - break; - - case '5': /* nick */ - /* hit 1 plus sword; give some experience */ - inflict = 1.0 + Player.p_sword; - Player.p_experience += floor(Curmonster.m_experience / 10.0); - Curmonster.m_experience *= 0.92; - /* monster gets meaner */ - Curmonster.m_maxspeed += 2.0; - Curmonster.m_speed = (Curmonster.m_speed < 0.0) ? 0.0 : Curmonster.m_speed + 2.0; - if (Curmonster.m_type == SM_DARKLORD) - /* Dark Lord; doesn't like to be nicked */ - { - mvprintw(Lines++, 0, - "You hit %s %.0f times, and made him mad!", Enemyname, inflict); - Player.p_quickness /= 2.0; - altercoordinates(0.0, 0.0, A_FAR); - cancelmonster(); - } - else - hitmonster(inflict); - break; - - case 'B': - case '6': /* luckout */ - if (Luckout) - mvaddstr(Lines++, 0, "You already tried that."); - else - { - Luckout = TRUE; - if (Curmonster.m_type == SM_MORGOTH) - /* Morgoth; ally */ - { - if (drandom() < Player.p_sin / 100.0) - { - mvprintw(Lines++, 0, "%s accepted!", Enemyname); - cancelmonster(); - } - else - mvaddstr(Lines++, 0, "Nope, he's not interested."); - } - else - /* normal monster; use brains for success */ - { - if ((drandom() + 0.333) * Player.p_brains - < (drandom() + 0.333) * Curmonster.m_brains) - mvprintw(Lines++, 0, "You blew it, %s.", Player.p_name); - else - { - mvaddstr(Lines++, 0, "You made it!"); - Curmonster.m_energy = 0.0; - } - } - } - break; - - case '7': /* use ring */ - if (Player.p_ring.ring_type != R_NONE) - { - mvaddstr(Lines++, 0, "Now using ring."); - Player.p_ring.ring_inuse = TRUE; - if (Player.p_ring.ring_type != R_DLREG) - /* age ring */ - --Player.p_ring.ring_duration; - } - break; - } - -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: monsthits() -/ -/ FUNCTION: process a monster hitting the player -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: cancelmonster(), scramblestats(), more(), floor(), wmove(), -/ drandom(), altercoordinates(), longjmp(), waddstr(), mvprintw(), -/ getanswer() -/ -/ GLOBAL INPUTS: Curmonster, Lines, Circle, Shield, Player, *stdscr, -/ Fightenv[], *Enemyname -/ -/ GLOBAL OUTPUTS: Curmonster, Whichmonster, Lines, Shield, Player, -/ *Enemyname -/ -/ DESCRIPTION: -/ Handle all special monsters here. If the monster is not a special -/ one, simply roll a hit against the player. -/ -*************************************************************************/ - -monsthits() -{ -double inflict; /* damage inflicted */ -int ch; /* input */ - - switch (Curmonster.m_type) - /* may be a special monster */ - { - case SM_DARKLORD: - /* hits just enough to kill player */ - inflict = (Player.p_energy + Shield) * 1.02; - goto SPECIALHIT; - - case SM_SHRIEKER: - /* call a big monster */ - mvaddstr(Lines++, 0, - "Shrieeeek!! You scared it, and it called one of its friends."); - more(Lines); - Whichmonster = (int) ROLL(70.0, 30.0); - longjmp(Fightenv, 0); - /*NOTREACHED*/ - - case SM_BALROG: - /* take experience away */ - inflict = ROLL(10.0, Curmonster.m_strength); - inflict = MIN(Player.p_experience, inflict); - mvprintw(Lines++, 0, - "%s took away %.0f experience points.", Enemyname, inflict); - Player.p_experience -= inflict; - return; - - case SM_FAERIES: - if (Player.p_holywater > 0) - /* holy water kills when monster tries to hit */ - { - mvprintw(Lines++, 0, "Your holy water killed it!"); - --Player.p_holywater; - Curmonster.m_energy = 0.0; - return; - } - break; - - case SM_NONE: - /* normal hit */ - break; - - default: - if (drandom() > 0.2) - /* normal hit */ - break; - - /* else special things */ - switch (Curmonster.m_type) - { - case SM_LEANAN: - /* takes some of the player's strength */ - inflict = ROLL(1.0, (Circle - 1.0) / 2.0); - inflict = MIN(Player.p_strength, inflict); - mvprintw(Lines++, 0, "%s sapped %0.f of your strength!", - Enemyname, inflict); - Player.p_strength -= inflict; - Player.p_might -= inflict; - break; - - case SM_SARUMAN: - if (Player.p_palantir) - /* take away palantir */ - { - mvprintw(Lines++, 0, "Wormtongue stole your palantir!"); - Player.p_palantir = FALSE; - } - else if (drandom() > 0.5) - /* gems turn to gold */ - { - mvprintw(Lines++, 0, - "%s transformed your gems into gold!", Enemyname); - Player.p_gold += Player.p_gems; - Player.p_gems = 0.0; - } - else - /* scramble some stats */ - { - mvprintw(Lines++, 0, "%s scrambled your stats!", Enemyname); - scramblestats(); - } - break; - - case SM_THAUMATURG: - /* transport player */ - mvprintw(Lines++, 0, "%s transported you!", Enemyname); - altercoordinates(0.0, 0.0, A_FAR); - cancelmonster(); - break; - - case SM_VORTEX: - /* suck up some mana */ - inflict = ROLL(0, 7.5 * Circle); - inflict = MIN(Player.p_mana, floor(inflict)); - mvprintw(Lines++, 0, - "%s sucked up %.0f of your mana!", Enemyname, inflict); - Player.p_mana -= inflict; - break; - - case SM_NAZGUL: - /* try to take ring if player has one */ - if (Player.p_ring.ring_type != R_NONE) - /* player has a ring */ - { - mvaddstr(Lines++, 0, "Will you relinguish your ring ? "); - ch = getanswer("YN", FALSE); - if (ch == 'Y') - /* take ring away */ - { - Player.p_ring.ring_type = R_NONE; - Player.p_ring.ring_inuse = FALSE; - cancelmonster(); - break; - } - } - - /* otherwise, take some brains */ - mvprintw(Lines++, 0, - "%s neutralized 1/5 of your brain!", Enemyname); - Player.p_brains *= 0.8; - break; - - case SM_TIAMAT: - /* take some gold and gems */ - mvprintw(Lines++, 0, - "%s took half your gold and gems and flew off.", Enemyname); - Player.p_gold /= 2.0; - Player.p_gems /= 2.0; - cancelmonster(); - break; - - case SM_KOBOLD: - /* steal a gold piece and run */ - mvprintw(Lines++, 0, - "%s stole one gold piece and ran away.", Enemyname); - Player.p_gold = MAX(0.0, Player.p_gold - 1.0); - cancelmonster(); - break; - - case SM_SHELOB: - /* bite and (medium) poison */ - mvprintw(Lines++, 0, - "%s has bitten and poisoned you!", Enemyname); - Player.p_poison -= 1.0; - break; - - case SM_LAMPREY: - /* bite and (small) poison */ - mvprintw(Lines++, 0, "%s bit and poisoned you!", Enemyname); - Player.p_poison += 0.25; - break; - - case SM_BONNACON: - /* fart and run */ - mvprintw(Lines++, 0, "%s farted and scampered off.", Enemyname); - Player.p_energy /= 2.0; /* damage from fumes */ - cancelmonster(); - break; - - case SM_SMEAGOL: - if (Player.p_ring.ring_type != R_NONE) - /* try to steal ring */ - { - mvprintw(Lines++, 0, - "%s tried to steal your ring, ", Enemyname); - if (drandom() > 0.1) - addstr("but was unsuccessful."); - else - { - addstr("and ran away with it!"); - Player.p_ring.ring_type = R_NONE; - cancelmonster(); - } - } - break; - - case SM_SUCCUBUS: - /* inflict damage through shield */ - inflict = ROLL(15.0, Circle * 10.0); - inflict = MIN(inflict, Player.p_energy); - mvprintw(Lines++, 0, "%s sapped %.0f of your energy.", - Enemyname, inflict); - Player.p_energy -= inflict; - break; - - case SM_CERBERUS: - /* take all metal treasures */ - mvprintw(Lines++, 0, - "%s took all your metal treasures!", Enemyname); - Player.p_crowns = 0; - Player.p_sword = - Player.p_shield = - Player.p_gold = 0.0; - cancelmonster(); - break; - - case SM_UNGOLIANT: - /* (large) poison and take a quickness */ - mvprintw(Lines++, 0, - "%s poisoned you, and took one quik.", Enemyname); - Player.p_poison += 5.0; - Player.p_quickness -= 1.0; - break; - - case SM_JABBERWOCK: - /* fly away, and leave either a Jubjub bird or Bonnacon */ - mvprintw(Lines++, 0, - "%s flew away, and left you to contend with one of its friends.", - Enemyname); - Whichmonster = 55 + (drandom() > 0.5) ? 22 : 0; - longjmp(Fightenv, 0); - /*NOTREACHED*/ - - case SM_TROLL: - /* partially regenerate monster */ - mvprintw(Lines++, 0, - "%s partially regenerated his energy.!", Enemyname); - Curmonster.m_energy += - floor((Curmonster.m_o_energy - Curmonster.m_energy) / 2.0); - Curmonster.m_strength = Curmonster.m_o_strength; - Curmonster.m_melee = Curmonster.m_skirmish = 0.0; - Curmonster.m_maxspeed = Curmonster.m_o_speed; - break; - - case SM_WRAITH: - if (!Player.p_blindness) - /* make blind */ - { - mvprintw(Lines++, 0, "%s blinded you!", Enemyname); - Player.p_blindness = TRUE; - Enemyname = "A monster"; - } - break; - } - return; - } - - /* fall through to here if monster inflicts a normal hit */ - inflict = drandom() * Curmonster.m_strength + 0.5; -SPECIALHIT: - mvprintw(Lines++, 0, "%s hit you %.0f times!", Enemyname, inflict); - - if ((Shield -= inflict) < 0) - { - Player.p_energy += Shield; - Shield = 0.0; - } -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: cancelmonster() -/ -/ FUNCTION: mark current monster as no longer active -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: none -/ -/ GLOBAL INPUTS: none -/ -/ GLOBAL OUTPUTS: Curmonster -/ -/ DESCRIPTION: -/ Clear current monster's energy, experience, treasure type, and -/ flock. This is the same as having the monster run away. -/ -*************************************************************************/ - -cancelmonster() -{ - Curmonster.m_energy = 0.0; - Curmonster.m_experience = 0.0; - Curmonster.m_treasuretype = 0; - Curmonster.m_flock = 0.0; -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: hitmonster() -/ -/ FUNCTION: inflict damage upon current monster -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ double inflict - damage to inflict upon monster -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: monsthits(), wmove(), strcmp(), waddstr(), mvprintw() -/ -/ GLOBAL INPUTS: Curmonster, Lines, Player, *stdscr, *Enemyname -/ -/ GLOBAL OUTPUTS: Curmonster, Lines -/ -/ DESCRIPTION: -/ Hit monster specified number of times. Handle when monster dies, -/ and a few special monsters. -/ -*************************************************************************/ - -hitmonster(inflict) -double inflict; -{ - mvprintw(Lines++, 0, "You hit %s %.0f times!", Enemyname, inflict); - Curmonster.m_energy -= inflict; - if (Curmonster.m_energy > 0.0) - { - if (Curmonster.m_type == SM_DARKLORD || Curmonster.m_type == SM_SHRIEKER) - /* special monster didn't die */ - monsthits(); - } - else - /* monster died. print message. */ - { - if (Curmonster.m_type == SM_MORGOTH) - mvaddstr(Lines++, 0, "You have defeated Morgoth, but he may return. . ."); - else - /* all other types of monsters */ - { - mvprintw(Lines++, 0, "You killed it. Good work, %s.", Player.p_name); - - if (Curmonster.m_type == SM_MIMIC - && strcmp(Curmonster.m_name, "A Mimic") != 0 - && !Player.p_blindness) - mvaddstr(Lines++, 0, "The body slowly changes into the form of a mimic."); - } - } -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: throwspell() -/ -/ FUNCTION: throw a magic spell -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: hitmonster(), cancelmonster(), sqrt(), floor(), wmove(), -/ drandom(), altercoordinates(), longjmp(), infloat(), waddstr(), mvprintw(), -/ getanswer() -/ -/ GLOBAL INPUTS: Curmonster, Whichmonster, Nomana[], Player, *stdscr, -/ Fightenv[], Illspell[], *Enemyname -/ -/ GLOBAL OUTPUTS: Curmonster, Whichmonster, Shield, Player -/ -/ DESCRIPTION: -/ Prompt player and process magic spells. -/ -*************************************************************************/ - -throwspell() -{ -double inflict; /* damage inflicted */ -double dtemp; /* for dtemporary calculations */ -int ch; /* input */ - - mvaddstr(7, 0, "\n\n"); /* clear menu area */ - - if (Player.p_magiclvl >= ML_ALLORNOTHING) - mvaddstr(7, 0, "1:All or Nothing "); - if (Player.p_magiclvl >= ML_MAGICBOLT) - addstr("2:Magic Bolt "); - if (Player.p_magiclvl >= ML_FORCEFIELD) - addstr("3:Force Field "); - if (Player.p_magiclvl >= ML_XFORM) - addstr("4:Transform "); - if (Player.p_magiclvl >= ML_INCRMIGHT) - addstr("5:Increase Might\n"); - if (Player.p_magiclvl >= ML_INVISIBLE) - mvaddstr(8, 0, "6:Invisibility "); - if (Player.p_magiclvl >= ML_XPORT) - addstr("7:Transport "); - if (Player.p_magiclvl >= ML_PARALYZE) - addstr("8:Paralyze "); - if (Player.p_specialtype >= SC_COUNCIL) - addstr("9:Specify"); - mvaddstr(4, 0, "Spell ? "); - - ch = getanswer(" ", TRUE); - - mvaddstr(7, 0, "\n\n"); /* clear menu area */ - - if (Curmonster.m_type == SM_MORGOTH && ch != '3') - /* can only throw force field against Morgoth */ - ILLSPELL(); - else - switch (ch) - { - case '1': /* all or nothing */ - if (drandom() < 0.25) - /* success */ - { - inflict = Curmonster.m_energy * 1.01 + 1.0; - - if (Curmonster.m_type == SM_DARKLORD) - /* all or nothing doesn't quite work against D. L. */ - inflict *= 0.9; - } - else - /* failure -- monster gets stronger and quicker */ - { - Curmonster.m_o_strength = Curmonster.m_strength *= 2.0; - Curmonster.m_maxspeed *= 2.0; - Curmonster.m_o_speed *= 2.0; - - /* paralyzed monsters wake up a bit */ - Curmonster.m_speed = MAX(1.0, Curmonster.m_speed * 2.0); - } - - if (Player.p_mana >= MM_ALLORNOTHING) - /* take a mana if player has one */ - Player.p_mana -= MM_ALLORNOTHING; - - hitmonster(inflict); - break; - - case '2': /* magic bolt */ - if (Player.p_magiclvl < ML_MAGICBOLT) - ILLSPELL(); - else - { - do - /* prompt for amount to expend */ - { - mvaddstr(4, 0, "How much mana for bolt? "); - dtemp = floor(infloat()); - } - while (dtemp < 0.0 || dtemp > Player.p_mana); - - Player.p_mana -= dtemp; - - if (Curmonster.m_type == SM_DARKLORD) - /* magic bolts don't work against D. L. */ - inflict = 0.0; - else - inflict = dtemp * ROLL(15.0, sqrt(Player.p_magiclvl / 3.0 + 1.0)); - mvaddstr(5, 0, "Magic Bolt fired!\n"); - hitmonster(inflict); - } - break; - - case '3': /* force field */ - if (Player.p_magiclvl < ML_FORCEFIELD) - ILLSPELL(); - else if (Player.p_mana < MM_FORCEFIELD) - NOMANA(); - else - { - Player.p_mana -= MM_FORCEFIELD; - Shield = (Player.p_maxenergy + Player.p_shield) * 4.2 + 45.0; - mvaddstr(5, 0, "Force Field up.\n"); - } - break; - - case '4': /* transform */ - if (Player.p_magiclvl < ML_XFORM) - ILLSPELL(); - else if (Player.p_mana < MM_XFORM) - NOMANA(); - else - { - Player.p_mana -= MM_XFORM; - Whichmonster = (int) ROLL(0.0, 100.0); - longjmp(Fightenv, 0); - /*NOTREACHED*/ - } - break; - - case '5': /* increase might */ - if (Player.p_magiclvl < ML_INCRMIGHT) - ILLSPELL(); - else if (Player.p_mana < MM_INCRMIGHT) - NOMANA(); - else - { - Player.p_mana -= MM_INCRMIGHT; - Player.p_might += - (1.2 * (Player.p_strength + Player.p_sword) - + 5.0 - Player.p_might) / 2.0; - mvprintw(5, 0, "New strength: %.0f\n", Player.p_might); - } - break; - - case '6': /* invisible */ - if (Player.p_magiclvl < ML_INVISIBLE) - ILLSPELL(); - else if (Player.p_mana < MM_INVISIBLE) - NOMANA(); - else - { - Player.p_mana -= MM_INVISIBLE; - Player.p_speed += - (1.2 * (Player.p_quickness + Player.p_quksilver) - + 5.0 - Player.p_speed) / 2.0; - mvprintw(5, 0, "New quickness: %.0f\n", Player.p_speed); - } - break; - - case '7': /* transport */ - if (Player.p_magiclvl < ML_XPORT) - ILLSPELL(); - else if (Player.p_mana < MM_XPORT) - NOMANA(); - else - { - Player.p_mana -= MM_XPORT; - if (Player.p_brains + Player.p_magiclvl - < Curmonster.m_experience / 200.0 * drandom()) - { - mvaddstr(5, 0, "Transport backfired!\n"); - altercoordinates(0.0, 0.0, A_FAR); - cancelmonster(); - } - else - { - mvprintw(5, 0, "%s is transported.\n", Enemyname); - if (drandom() < 0.3) - /* monster didn't drop its treasure */ - Curmonster.m_treasuretype = 0; - - Curmonster.m_energy = 0.0; - } - } - break; - - case '8': /* paralyze */ - if (Player.p_magiclvl < ML_PARALYZE) - ILLSPELL(); - else if (Player.p_mana < MM_PARALYZE) - NOMANA(); - else - { - Player.p_mana -= MM_PARALYZE; - if (Player.p_magiclvl > - Curmonster.m_experience / 1000.0 * drandom()) - { - mvprintw(5, 0, "%s is held.\n", Enemyname); - Curmonster.m_speed = -2.0; - } - else - mvaddstr(5, 0, "Monster unaffected.\n"); - } - break; - - case '9': /* specify */ - if (Player.p_specialtype < SC_COUNCIL) - ILLSPELL(); - else if (Player.p_mana < MM_SPECIFY) - NOMANA(); - else - { - Player.p_mana -= MM_SPECIFY; - mvaddstr(5, 0, "Which monster do you want [0-99] ? "); - Whichmonster = (int) infloat(); - Whichmonster = MAX(0, MIN(99, Whichmonster)); - longjmp(Fightenv, 0); - /*NOTREACHED*/ - } - break; - } -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: callmonster() -/ -/ FUNCTION: read monster from file, and fill structure -/ -/ AUTHOR: E. A. Estes, 2/25/86 -/ -/ ARGUMENTS: -/ int which - which monster to call -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: truncstring(), fread(), fseek(), floor(), drandom(), -/ strcpy() -/ -/ GLOBAL INPUTS: Curmonster, Circle, Player, *Monstfp -/ -/ GLOBAL OUTPUTS: Curmonster, Player, *Enemyname -/ -/ DESCRIPTION: -/ Read specified monster from monster database and fill up -/ current monster structure. -/ Adjust statistics based upon current size. -/ Handle some special monsters. -/ -*************************************************************************/ - -callmonster(which) -int which; -{ -struct monster Othermonster; /* to find a name for mimics */ - - which = MIN(which, 99); /* make sure within range */ - - /* fill structure */ - fseek(Monstfp, (long) which * (long) SZ_MONSTERSTRUCT, 0); - fread((char *) &Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp); - - /* handle some special monsters */ - if (Curmonster.m_type == SM_MODNAR) - { - if (Player.p_specialtype < SC_COUNCIL) - /* randomize some stats */ - { - Curmonster.m_strength *= drandom() + 0.5; - Curmonster.m_brains *= drandom() + 0.5; - Curmonster.m_speed *= drandom() + 0.5; - Curmonster.m_energy *= drandom() + 0.5; - Curmonster.m_experience *= drandom() + 0.5; - Curmonster.m_treasuretype = - (int) ROLL(0.0, (double) Curmonster.m_treasuretype); - } - else - /* make Modnar into Morgoth */ - { - strcpy(Curmonster.m_name, "Morgoth"); - Curmonster.m_strength = drandom() * (Player.p_maxenergy + Player.p_shield) / 1.4 - + drandom() * (Player.p_maxenergy + Player.p_shield) / 1.5; - Curmonster.m_brains = Player.p_brains; - Curmonster.m_energy = Player.p_might * 30.0; - Curmonster.m_type = SM_MORGOTH; - Curmonster.m_speed = Player.p_speed * 1.1 - + (Player.p_specialtype == SC_EXVALAR) ? Player.p_speed : 0.0; - Curmonster.m_flock = 0.0; - Curmonster.m_treasuretype = 0; - Curmonster.m_experience = 0.0; - } - } - else if (Curmonster.m_type == SM_MIMIC) - /* pick another name */ - { - which = (int) ROLL(0.0, 100.0); - fseek(Monstfp, (long) which * (long) SZ_MONSTERSTRUCT, 0); - fread(&Othermonster, SZ_MONSTERSTRUCT, 1, Monstfp); - strcpy(Curmonster.m_name, Othermonster.m_name); - } - - truncstring(Curmonster.m_name); - - if (Curmonster.m_type != SM_MORGOTH) - /* adjust stats based on which circle player is in */ - { - Curmonster.m_strength *= (1.0 + Circle / 2.0); - Curmonster.m_brains *= Circle; - Curmonster.m_speed += Circle * 1.e-9; - Curmonster.m_energy *= Circle; - Curmonster.m_experience *= Circle; - } - - if (Player.p_blindness) - /* cannot see monster if blind */ - Enemyname = "A monster"; - else - Enemyname = Curmonster.m_name; - - if (Player.p_speed <= 0.0) - /* make Player.p_speed positive */ - { - Curmonster.m_speed += -Player.p_speed; - Player.p_speed = 1.0; - } - - /* fill up the rest of the structure */ - Curmonster.m_o_strength = Curmonster.m_strength; - Curmonster.m_o_speed = Curmonster.m_maxspeed = Curmonster.m_speed; - Curmonster.m_o_energy = Curmonster.m_energy; - Curmonster.m_melee = Curmonster.m_skirmish = 0.0; -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: awardtreasure() -/ -/ FUNCTION: select a treasure -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: pickmonster(), collecttaxes(), more(), cursedtreasure(), -/ floor(), wmove(), drandom(), sscanf(), printw(), altercoordinates(), -/ longjmp(), infloat(), waddstr(), getanswer(), getstring(), wclrtobot() -/ -/ GLOBAL INPUTS: Somebetter[], Curmonster, Whichmonster, Circle, Player, -/ *stdscr, Databuf[], *Statptr, Fightenv[] -/ -/ GLOBAL OUTPUTS: Whichmonster, Shield, Player -/ -/ DESCRIPTION: -/ Roll up a treasure based upon monster type and size, and -/ certain player statistics. -/ Handle cursed treasure. -/ -*************************************************************************/ - -awardtreasure() -{ -int whichtreasure; /* calculated treasure to grant */ -int temp; /* temporary */ -int ch; /* input */ -double treasuretype; /* monster's treasure type */ -double gold = 0.0; /* gold awarded */ -double gems = 0.0; /* gems awarded */ -double dtemp; /* for temporary calculations */ - - whichtreasure = (int) ROLL(1.0, 3.0); /* pick a treasure */ - treasuretype = (double) Curmonster.m_treasuretype; - - move(4, 0); - clrtobot(); - move(6, 0); - - if (drandom() > 0.65) - /* gold and gems */ - { - if (Curmonster.m_treasuretype > 7) - /* gems */ - { - gems = ROLL(1.0, (treasuretype - 7.0) - * (treasuretype - 7.0) * (Circle - 1.0) / 4.0); - printw("You have discovered %.0f gems!", gems); - } - else - /* gold */ - { - gold = ROLL(treasuretype * 10.0, treasuretype - * treasuretype * 10.0 * (Circle - 1.0)); - printw("You have found %.0f gold pieces.", gold); - } - - addstr(" Do you want to pick them up ? "); - ch = getanswer("NY", FALSE); - addstr("\n\n"); - - if (ch == 'Y') { - if (drandom() < treasuretype / 35.0 + 0.04) - /* cursed */ - { - addstr("They were cursed!\n"); - cursedtreasure(); - } - else - collecttaxes(gold, gems); - } - - return; - } - else - /* other treasures */ - { - addstr("You have found some treasure. Do you want to inspect it ? "); - ch = getanswer("NY", FALSE); - addstr("\n\n"); - - if (ch != 'Y') - return; - else - if (drandom() < 0.08 && Curmonster.m_treasuretype != 4) - { - addstr("It was cursed!\n"); - cursedtreasure(); - return; - } - else - switch (Curmonster.m_treasuretype) - { - case 1: /* treasure type 1 */ - switch (whichtreasure) - { - case 1: - addstr("You've discovered a power booster!\n"); - Player.p_mana += ROLL(Circle * 4.0, Circle * 30.0); - break; - - case 2: - addstr("You have encountered a druid.\n"); - Player.p_experience += - ROLL(0.0, 2000.0 + Circle * 400.0); - break; - - case 3: - addstr("You have found a holy orb.\n"); - Player.p_sin = MAX(0.0, Player.p_sin - 0.25); - break; - } - break; - /* end treasure type 1 */ - - case 2: /* treasure type 2 */ - switch (whichtreasure) - { - case 1: - addstr("You have found an amulet.\n"); - ++Player.p_amulets; - break; - - case 2: - addstr("You've found some holy water!\n"); - ++Player.p_holywater; - break; - - case 3: - addstr("You've met a hermit!\n"); - Player.p_sin *= 0.75; - Player.p_mana += 12.0 * Circle; - break; - } - break; - /* end treasure type 2 */ - - case 3: /* treasure type 3 */ - switch (whichtreasure) - { - case 1: - dtemp = ROLL(7.0, 30.0 + Circle / 10.0); - printw("You've found a +%.0f shield!\n", dtemp); - if (dtemp >= Player.p_shield) - Player.p_shield = dtemp; - else - SOMEBETTER(); - break; - - case 2: - addstr("You have rescued a virgin. Will you be honorable ? "); - ch = getanswer("NY", FALSE); - addstr("\n\n"); - if (ch == 'Y') - Player.p_virgin = TRUE; - else - { - Player.p_experience += 2000.0 * Circle; - ++Player.p_sin; - } - break; - - case 3: - addstr("You've discovered some athelas!\n"); - --Player.p_poison; - break; - } - break; - /* end treasure type 3 */ - - case 4: /* treasure type 4 */ - addstr("You've found a scroll. Will you read it ? "); - ch = getanswer("NY", FALSE); - addstr("\n\n"); - - if (ch == 'Y') - switch ((int) ROLL(1, 6)) - { - case 1: - addstr("It throws up a shield for you next monster.\n"); - getyx(stdscr, whichtreasure, ch); - more(whichtreasure); - Shield = - (Player.p_maxenergy + Player.p_energy) * 5.5 + Circle * 50.0; - Whichmonster = pickmonster(); - longjmp(Fightenv, 0); - /*NOTREACHED*/ - - case 2: - addstr("It makes you invisible for you next monster.\n"); - getyx(stdscr, whichtreasure, ch); - more(whichtreasure); - Player.p_speed = 1e6; - Whichmonster = pickmonster(); - longjmp(Fightenv, 0); - /*NOTREACHED*/ - - case 3: - addstr("It increases your strength ten fold to fight your next monster.\n"); - getyx(stdscr, whichtreasure, ch); - more(whichtreasure); - Player.p_might *= 10.0; - Whichmonster = pickmonster(); - longjmp(Fightenv, 0); - /*NOTREACHED*/ - - case 4: - addstr("It is a general knowledge scroll.\n"); - Player.p_brains += ROLL(2.0, Circle); - Player.p_magiclvl += ROLL(1.0, Circle / 2.0); - break; - - case 5: - addstr("It tells you how to pick your next monster.\n"); - addstr("Which monster do you want [0-99] ? "); - Whichmonster = (int) infloat(); - Whichmonster = MIN(99, MAX(0, Whichmonster)); - longjmp(Fightenv, 0); - - case 6: - addstr("It was cursed!\n"); - cursedtreasure(); - break; - } - break; - /* end treasure type 4 */ - - case 5: /* treasure type 5 */ - switch (whichtreasure) - { - case 1: - dtemp = ROLL(Circle / 4.0 + 5.0, Circle / 2.0 + 9.0); - printw("You've discovered a +%.0f dagger.\n", dtemp); - if (dtemp >= Player.p_sword) - Player.p_sword = dtemp; - else - SOMEBETTER(); - break; - - case 2: - dtemp = ROLL(7.5 + Circle * 3.0, Circle * 2.0 + 160.0); - printw("You have found some +%.0f armour!\n", dtemp); - if (dtemp >= Player.p_shield) - Player.p_shield = dtemp; - else - SOMEBETTER(); - break; - - case 3: - addstr("You've found a tablet.\n"); - Player.p_brains += 4.5 * Circle; - break; - } - break; - /* end treasure type 5 */ - - case 6: /* treasure type 6 */ - switch (whichtreasure) - { - case 1: - addstr("You've found a priest.\n"); - Player.p_energy = Player.p_maxenergy + Player.p_shield; - Player.p_sin /= 2.0; - Player.p_mana += 24.0 * Circle; - Player.p_brains += Circle; - break; - - case 2: - addstr("You have come upon Robin Hood!\n"); - Player.p_shield += Circle * 2.0; - Player.p_strength += Circle / 2.5 + 1.0; - break; - - case 3: - dtemp = ROLL(2.0 + Circle / 4.0, Circle / 1.2 + 10.0); - printw("You have found a +%.0f axe!\n", dtemp); - if (dtemp >= Player.p_sword) - Player.p_sword = dtemp; - else - SOMEBETTER(); - break; - } - break; - /* end treasure type 6 */ - - case 7: /* treasure type 7 */ - switch (whichtreasure) - { - case 1: - addstr("You've discovered a charm!\n"); - ++Player.p_charms; - break; - - case 2: - addstr("You have encountered Merlyn!\n"); - Player.p_brains += Circle + 5.0; - Player.p_magiclvl += Circle / 3.0 + 5.0; - Player.p_mana += Circle * 10.0; - break; - - case 3: - dtemp = ROLL(5.0 + Circle / 3.0, Circle / 1.5 + 20.0); - printw("You have found a +%.0f war hammer!\n", dtemp); - if (dtemp >= Player.p_sword) - Player.p_sword = dtemp; - else - SOMEBETTER(); - break; - } - break; - /* end treasure type 7 */ - - case 8: /* treasure type 8 */ - switch (whichtreasure) - { - case 1: - addstr("You have found a healing potion.\n"); - Player.p_poison = MIN(-2.0, Player.p_poison - 2.0); - break; - - case 2: - addstr("You have discovered a transporter. Do you wish to go anywhere ? "); - ch = getanswer("NY", FALSE); - addstr("\n\n"); - if (ch == 'Y') - { - double x, y; - - addstr("X Y Coordinates ? "); - getstring(Databuf, SZ_DATABUF); - sscanf(Databuf, "%lf %lf", &x, &y); - altercoordinates(x, y, A_FORCED); - } - break; - - case 3: - dtemp = ROLL(10.0 + Circle / 1.2, Circle * 3.0 + 30.0); - printw("You've found a +%.0f sword!\n", dtemp); - if (dtemp >= Player.p_sword) - Player.p_sword = dtemp; - else - SOMEBETTER(); - break; - } - break; - /* end treasure type 8 */ - - case 10: - case 11: - case 12: - case 13: /* treasure types 10 - 13 */ - if (drandom() < 0.33) - { - if (Curmonster.m_treasuretype == 10) - { - addstr("You've found a pair of elven boots!\n"); - Player.p_quickness += 2.0; - break; - } - else if (Curmonster.m_treasuretype == 11 - && !Player.p_palantir) - { - addstr("You've acquired Saruman's palantir.\n"); - Player.p_palantir = TRUE; - break; - } - else if (Player.p_ring.ring_type == R_NONE - && Player.p_specialtype < SC_COUNCIL - && (Curmonster.m_treasuretype == 12 - || Curmonster.m_treasuretype == 13)) - /* roll up a ring */ - { - if (drandom() < 0.8) - /* regular rings */ - { - if (Curmonster.m_treasuretype == 12) - { - whichtreasure = R_NAZREG; - temp = 35; - } - else - { - whichtreasure = R_DLREG; - temp = 0; - } - } - else - /* bad rings */ - { - whichtreasure = R_BAD; - temp = 15 + Statptr->c_ringduration + (int) ROLL(0,5); - } - - addstr("You've discovered a ring. Will you pick it up ? "); - ch = getanswer("NY", FALSE); - addstr("\n\n"); - - if (ch == 'Y') - { - Player.p_ring.ring_type = whichtreasure; - Player.p_ring.ring_duration = temp; - } - - break; - } - } - /* end treasure types 10 - 13 */ - /* FALLTHROUGH to treasure type 9 if no treasure from above */ - - case 9: /* treasure type 9 */ - switch (whichtreasure) - { - case 1: - if (Player.p_level <= 1000.0 - && Player.p_crowns <= 3 - && Player.p_level >= 10.0) - { - addstr("You have found a golden crown!\n"); - ++Player.p_crowns; - break; - } - /* FALLTHROUGH */ - - case 2: - addstr("You've been blessed!\n"); - Player.p_blessing = TRUE; - Player.p_sin /= 3.0; - Player.p_energy = Player.p_maxenergy + Player.p_shield; - Player.p_mana += 100.0 * Circle; - break; - - case 3: - dtemp = ROLL(1.0, Circle / 5.0 + 5.0); - dtemp = MIN(dtemp, 99.0); - printw("You have discovered some +%.0f quicksilver!\n",dtemp); - if (dtemp >= Player.p_quksilver) - Player.p_quksilver = dtemp; - else - SOMEBETTER(); - break; - } - break; - /* end treasure type 9 */ - } - } -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: cursedtreasure() -/ -/ FUNCTION: take care of cursed treasure -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: waddstr() -/ -/ GLOBAL INPUTS: Player, *stdscr -/ -/ GLOBAL OUTPUTS: Player -/ -/ DESCRIPTION: -/ Handle cursed treasure. Look for amulets and charms to save -/ the player from the curse. -/ -*************************************************************************/ - -cursedtreasure() -{ - if (Player.p_charms > 0) - { - addstr("But your charm saved you!\n"); - --Player.p_charms; - } - else if (Player.p_amulets > 0) - { - addstr("But your amulet saved you!\n"); - --Player.p_amulets; - } - else - { - Player.p_energy = (Player.p_maxenergy + Player.p_shield) / 10.0; - Player.p_poison += 0.25; - } -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: scramblestats() -/ -/ FUNCTION: scramble some selected statistics -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: floor(), drandom() -/ -/ GLOBAL INPUTS: Player -/ -/ GLOBAL OUTPUTS: Player -/ -/ DESCRIPTION: -/ Swap a few player statistics randomly. -/ -*************************************************************************/ - -scramblestats() -{ -double dbuf[6]; /* to put statistic in */ -double dtemp1, dtemp2; /* for swapping values */ -int first, second; /* indices for swapping */ -double *dptr; /* pointer for filling and emptying buf[] */ - - /* fill buffer */ - dptr = &dbuf[0]; - *dptr++ = Player.p_strength; - *dptr++ = Player.p_mana; - *dptr++ = Player.p_brains; - *dptr++ = Player.p_magiclvl; - *dptr++ = Player.p_energy; - *dptr = Player.p_sin; - - /* pick values to swap */ - first = (int) ROLL(0, 5); - second = (int) ROLL(0, 5); - - /* swap values */ - dptr = &dbuf[0]; - dtemp1 = dptr[first]; - /* this expression is split to prevent a compiler loop on some compilers */ - dtemp2 = dptr[second]; - dptr[first] = dtemp2; - dptr[second] = dtemp1; - - /* empty buffer */ - Player.p_strength = *dptr++; - Player.p_mana = *dptr++; - Player.p_brains = *dptr++; - Player.p_magiclvl = *dptr++; - Player.p_energy = *dptr++; - Player.p_sin = *dptr; -} diff --git a/games/phantasia/gamesupport.c b/games/phantasia/gamesupport.c deleted file mode 100644 index 23711d2..0000000 --- a/games/phantasia/gamesupport.c +++ /dev/null @@ -1,725 +0,0 @@ -/* - * gamesupport.c - auxiliary routines for support of Phantasia - * - * $FreeBSD$ - */ - -#include -#include "include.h" - -/************************************************************************ -/ -/ FUNCTION NAME: changestats() -/ -/ FUNCTION: examine/change statistics for a player -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ bool ingameflag - set if called while playing game (Wizard only) -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: freerecord(), writerecord(), descrstatus(), truncstring(), -/ time(), more(), wmove(), wclear(), strcmp(), printw(), strcpy(), -/ infloat(), waddstr(), cleanup(), findname(), userlist(), mvprintw(), -/ localtime(), getanswer(), descrtype(), getstring() -/ -/ GLOBAL INPUTS: LINES, *Login, Other, Wizard, Player, *stdscr, Databuf[], -/ Fileloc -/ -/ GLOBAL OUTPUTS: Echo -/ -/ DESCRIPTION: -/ Prompt for player name to examine/change. -/ If the name is NULL, print a list of all players. -/ If we are called from within the game, check for the -/ desired name being the same as the current player's name. -/ Only the 'Wizard' may alter players. -/ Items are changed only if a non-zero value is specified. -/ To change an item to 0, use 0.1; it will be truncated later. -/ -/ Players may alter their names and passwords, if the following -/ are true: -/ - current login matches the character's logins -/ - the password is known -/ - the player is not in the middle of the game (ingameflag == FALSE) -/ -/ The last condition is imposed for two reasons: -/ - the game could possibly get a bit hectic if a player were -/ continually changing his/her name -/ - another player structure would be necessary to check for names -/ already in use -/ -*************************************************************************/ - -changestats(ingameflag) -bool ingameflag; -{ -static char flag[2] = /* for printing values of bools */ - {'F', 'T'}; -struct player *playerp;/* pointer to structure to alter */ -char *prompt; /* pointer to prompt string */ -int c; /* input */ -int today; /* day of year of today */ -int temp; /* temporary variable */ -long loc; /* location in player file */ -time_t now; /* time now */ -double dtemp; /* temporary variable */ -bool *bptr; /* pointer to bool item to change */ -double *dptr; /* pointer to double item to change */ -short *sptr; /* pointer to short item to change */ - - clear(); - - for (;;) - /* get name of player to examine/alter */ - { - mvaddstr(5, 0, "Which character do you want to look at ? "); - getstring(Databuf, SZ_DATABUF); - truncstring(Databuf); - - if (Databuf[0] == '\0') - userlist(ingameflag); - else - break; - } - - loc = -1L; - - if (!ingameflag) - /* use 'Player' structure */ - playerp = &Player; - else if (strcmp(Databuf, Player.p_name) == 0) - /* alter/examine current player */ - { - playerp = &Player; - loc = Fileloc; - } - else - /* use 'Other' structure */ - playerp = &Other; - - /* find player on file */ - if (loc < 0L && (loc = findname(Databuf, playerp)) < 0L) - /* didn't find player */ - { - clear(); - mvaddstr(11, 0, "Not found."); - return; - } - - time(&now); - today = localtime(&now)->tm_yday; - - clear(); - - for (;;) - /* print player structure, and prompt for action */ - { - mvprintw(0, 0,"A:Name %s\n", playerp->p_name); - - if (Wizard) - printw("B:Password %s\n", playerp->p_password); - else - addstr("B:Password XXXXXXXX\n"); - - printw(" :Login %s\n", playerp->p_login); - - printw("C:Experience %.0f\n", playerp->p_experience); - printw("D:Level %.0f\n", playerp->p_level); - printw("E:Strength %.0f\n", playerp->p_strength); - printw("F:Sword %.0f\n", playerp->p_sword); - printw(" :Might %.0f\n", playerp->p_might); - printw("G:Energy %.0f\n", playerp->p_energy); - printw("H:Max-Energy %.0f\n", playerp->p_maxenergy); - printw("I:Shield %.0f\n", playerp->p_shield); - printw("J:Quickness %.0f\n", playerp->p_quickness); - printw("K:Quicksilver %.0f\n", playerp->p_quksilver); - printw(" :Speed %.0f\n", playerp->p_speed); - printw("L:Magic Level %.0f\n", playerp->p_magiclvl); - printw("M:Mana %.0f\n", playerp->p_mana); - printw("N:Brains %.0f\n", playerp->p_brains); - - if (Wizard || playerp->p_specialtype != SC_VALAR) - mvaddstr(0, 40, descrstatus(playerp)); - - mvprintw(1, 40, "O:Poison %0.3f\n", playerp->p_poison); - mvprintw(2, 40, "P:Gold %.0f\n", playerp->p_gold); - mvprintw(3, 40, "Q:Gem %.0f\n", playerp->p_gems); - mvprintw(4, 40, "R:Sin %0.3f\n", playerp->p_sin); - if (Wizard) - { - mvprintw(5, 40, "S:X-coord %.0f\n", playerp->p_x); - mvprintw(6, 40, "T:Y-coord %.0f\n", playerp->p_y); - } - else - { - mvaddstr(5, 40, "S:X-coord ?\n"); - mvaddstr(6, 40, "T:Y-coord ?\n"); - } - - mvprintw(7, 40, "U:Age %ld\n", playerp->p_age); - mvprintw(8, 40, "V:Degenerated %d\n", playerp->p_degenerated); - - mvprintw(9, 40, "W:Type %d (%s)\n", - playerp->p_type, descrtype(playerp, FALSE) + 1); - mvprintw(10, 40, "X:Special Type %d\n", playerp->p_specialtype); - mvprintw(11, 40, "Y:Lives %d\n", playerp->p_lives); - mvprintw(12, 40, "Z:Crowns %d\n", playerp->p_crowns); - mvprintw(13, 40, "0:Charms %d\n", playerp->p_charms); - mvprintw(14, 40, "1:Amulets %d\n", playerp->p_amulets); - mvprintw(15, 40, "2:Holy Water %d\n", playerp->p_holywater); - - temp = today - playerp->p_lastused; - if (temp < 0) - /* last year */ - temp += 365; - mvprintw(16, 40, "3:Lastused %d (%d)\n", playerp->p_lastused, temp); - - mvprintw(18, 8, "4:Palantir %c 5:Blessing %c 6:Virgin %c 7:Blind %c", - flag[playerp->p_palantir], - flag[playerp->p_blessing], - flag[playerp->p_virgin], - flag[playerp->p_blindness]); - - if (!Wizard) - mvprintw(19, 8, "8:Ring %c", - flag[playerp->p_ring.ring_type != R_NONE]); - else - mvprintw(19, 8, "8:Ring %d 9:Duration %d", - playerp->p_ring.ring_type, playerp->p_ring.ring_duration); - - if (!Wizard - /* not wizard */ - && (ingameflag || strcmp(Login, playerp->p_login) != 0)) - /* in game or not examining own character */ - { - if (ingameflag) - { - more(LINES - 1); - clear(); - return; - } - else - cleanup(TRUE); - /*NOTREACHED*/ - } - - mvaddstr(20, 0, "!:Quit ?:Delete"); - mvaddstr(21, 0, "What would you like to change ? "); - - if (Wizard) - c = getanswer(" ", TRUE); - else - /* examining own player; allow to change name and password */ - c = getanswer("!BA", FALSE); - - switch (c) - { - case 'A': /* change name */ - case 'B': /* change password */ - if (!Wizard) - /* prompt for password */ - { - mvaddstr(23, 0, "Password ? "); - Echo = FALSE; - getstring(Databuf, 9); - Echo = TRUE; - if (strcmp(Databuf, playerp->p_password) != 0) - continue; - } - - if (c == 'A') - /* get new name */ - { - mvaddstr(23, 0, "New name: "); - getstring(Databuf, SZ_NAME); - truncstring(Databuf); - if (Databuf[0] != '\0') - if (Wizard || findname(Databuf, &Other) < 0L) - strcpy(playerp->p_name, Databuf); - } - else - /* get new password */ - { - if (!Wizard) - Echo = FALSE; - - do - /* get two copies of new password until they match */ - { - /* get first copy */ - mvaddstr(23, 0, "New password ? "); - getstring(Databuf, SZ_PASSWORD); - if (Databuf[0] == '\0') - break; - - /* get second copy */ - mvaddstr(23, 0, "One more time ? "); - getstring(playerp->p_password, SZ_PASSWORD); - } - while (strcmp(playerp->p_password, Databuf) != 0); - - Echo = TRUE; - } - - continue; - - case 'C': /* change experience */ - prompt = "experience"; - dptr = &playerp->p_experience; - goto DALTER; - - case 'D': /* change level */ - prompt = "level"; - dptr = &playerp->p_level; - goto DALTER; - - case 'E': /* change strength */ - prompt = "strength"; - dptr = &playerp->p_strength; - goto DALTER; - - case 'F': /* change swords */ - prompt = "sword"; - dptr = &playerp->p_sword; - goto DALTER; - - case 'G': /* change energy */ - prompt = "energy"; - dptr = &playerp->p_energy; - goto DALTER; - - case 'H': /* change maximum energy */ - prompt = "max energy"; - dptr = &playerp->p_maxenergy; - goto DALTER; - - case 'I': /* change shields */ - prompt = "shield"; - dptr = &playerp->p_shield; - goto DALTER; - - case 'J': /* change quickness */ - prompt = "quickness"; - dptr = &playerp->p_quickness; - goto DALTER; - - case 'K': /* change quicksilver */ - prompt = "quicksilver"; - dptr = &playerp->p_quksilver; - goto DALTER; - - case 'L': /* change magic */ - prompt = "magic level"; - dptr = &playerp->p_magiclvl; - goto DALTER; - - case 'M': /* change mana */ - prompt = "mana"; - dptr = &playerp->p_mana; - goto DALTER; - - case 'N': /* change brains */ - prompt = "brains"; - dptr = &playerp->p_brains; - goto DALTER; - - case 'O': /* change poison */ - prompt = "poison"; - dptr = &playerp->p_poison; - goto DALTER; - - case 'P': /* change gold */ - prompt = "gold"; - dptr = &playerp->p_gold; - goto DALTER; - - case 'Q': /* change gems */ - prompt = "gems"; - dptr = &playerp->p_gems; - goto DALTER; - - case 'R': /* change sin */ - prompt = "sin"; - dptr = &playerp->p_sin; - goto DALTER; - - case 'S': /* change x coord */ - prompt = "x"; - dptr = &playerp->p_x; - goto DALTER; - - case 'T': /* change y coord */ - prompt = "y"; - dptr = &playerp->p_y; - goto DALTER; - - case 'U': /* change age */ - mvprintw(23, 0, "age = %ld; age = ", playerp->p_age); - dtemp = infloat(); - if (dtemp != 0.0) - playerp->p_age = (long) dtemp; - continue; - - case 'V': /* change degen */ - mvprintw(23, 0, "degen = %d; degen = ", playerp->p_degenerated); - dtemp = infloat(); - if (dtemp != 0.0) - playerp->p_degenerated = (int) dtemp; - continue; - - case 'W': /* change type */ - prompt = "type"; - sptr = &playerp->p_type; - goto SALTER; - - case 'X': /* change special type */ - prompt = "special type"; - sptr = &playerp->p_specialtype; - goto SALTER; - - case 'Y': /* change lives */ - prompt = "lives"; - sptr = &playerp->p_lives; - goto SALTER; - - case 'Z': /* change crowns */ - prompt = "crowns"; - sptr = &playerp->p_crowns; - goto SALTER; - - case '0': /* change charms */ - prompt = "charm"; - sptr = &playerp->p_charms; - goto SALTER; - - case '1': /* change amulet */ - prompt = "amulet"; - sptr = &playerp->p_amulets; - goto SALTER; - - case '2': /* change holy water */ - prompt = "holy water"; - sptr = &playerp->p_holywater; - goto SALTER; - - case '3': /* change last-used */ - prompt = "last-used"; - sptr = &playerp->p_lastused; - goto SALTER; - - case '4': /* change palantir */ - prompt = "palantir"; - bptr = &playerp->p_palantir; - goto BALTER; - - case '5': /* change blessing */ - prompt = "blessing"; - bptr = &playerp->p_blessing; - goto BALTER; - - case '6': /* change virgin */ - prompt = "virgin"; - bptr = &playerp->p_virgin; - goto BALTER; - - case '7': /* change blindness */ - prompt = "blindness"; - bptr = &playerp->p_blindness; - goto BALTER; - - case '8': /* change ring type */ - prompt = "ring-type"; - sptr = &playerp->p_ring.ring_type; - goto SALTER; - - case '9': /* change ring duration */ - prompt = "ring-duration"; - sptr = &playerp->p_ring.ring_duration; - goto SALTER; - - case '!': /* quit, update */ - if (Wizard && - (!ingameflag || playerp != &Player)) - /* turn off status if not modifying self */ - { - playerp->p_status = S_OFF; - playerp->p_tampered = T_OFF; - } - - writerecord(playerp, loc); - clear(); - return; - - case '?': /* delete player */ - if (ingameflag && playerp == &Player) - /* cannot delete self */ - continue; - - freerecord(playerp, loc); - clear(); - return; - - default: - continue; - } -DALTER: - mvprintw(23, 0, "%s = %f; %s = ", prompt, *dptr, prompt); - dtemp = infloat(); - if (dtemp != 0.0) - *dptr = dtemp; - continue; - -SALTER: - mvprintw(23, 0, "%s = %d; %s = ", prompt, *sptr, prompt); - dtemp = infloat(); - if (dtemp != 0.0) - *sptr = (short) dtemp; - continue; - -BALTER: - mvprintw(23, 0, "%s = %c; %s = ", prompt, flag[*bptr], prompt); - c = getanswer("\nTF", TRUE); - if (c == 'T') - *bptr = TRUE; - else if (c == 'F') - *bptr = FALSE; - continue; - } -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: monstlist() -/ -/ FUNCTION: print a monster listing -/ -/ AUTHOR: E. A. Estes, 2/27/86 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: puts(), fread(), fseek(), printf() -/ -/ GLOBAL INPUTS: Curmonster, *Monstfp -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Read monster file, and print a monster listing on standard output. -/ -*************************************************************************/ - -monstlist() -{ -int count = 0; /* count in file */ - - puts(" #) Name Str Brain Quick Energy Exper Treas Type Flock%\n"); - fseek(Monstfp, 0L, 0); - while (fread((char *) &Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp) == 1) - printf("%2d) %-20.20s%4.0f %4.0f %2.0f %5.0f %5.0f %2d %2d %3.0f\n", count++, - Curmonster.m_name, Curmonster.m_strength, Curmonster.m_brains, - Curmonster.m_speed, Curmonster.m_energy, Curmonster.m_experience, - Curmonster.m_treasuretype, Curmonster.m_type, Curmonster.m_flock); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: scorelist() -/ -/ FUNCTION: print player score board -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: fread(), fopen(), printf(), fclose() -/ -/ GLOBAL INPUTS: -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Read the scoreboard file and print the contents. -/ -*************************************************************************/ - -scorelist() -{ -struct scoreboard sbuf; /* for reading entries */ -FILE *fp; /* to open the file */ - - if ((fp = fopen(_PATH_SCORE, "r")) != NULL) - { - while (fread((char *) &sbuf, SZ_SCORESTRUCT, 1, fp) == 1) - printf("%-20s (%-9s) Level: %6.0f Type: %s\n", - sbuf.sb_name, sbuf.sb_login, sbuf.sb_level, sbuf.sb_type); - fclose(fp); - } -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: activelist() -/ -/ FUNCTION: print list of active players to standard output -/ -/ AUTHOR: E. A. Estes, 3/7/86 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: descrstatus(), fread(), fseek(), printf(), descrtype() -/ -/ GLOBAL INPUTS: Other, *Playersfp -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Read player file, and print list of active records to standard output. -/ -*************************************************************************/ - -activelist() -{ - fseek(Playersfp, 0L, 0); - printf("Current characters on file are:\n\n"); - - while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) - if (Other.p_status != S_NOTUSED) - printf("%-20s (%-9s) Level: %6.0f %s (%s)\n", - Other.p_name, Other.p_login, Other.p_level, - descrtype(&Other, FALSE), descrstatus(&Other)); - -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: purgeoldplayers() -/ -/ FUNCTION: purge inactive players from player file -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: freerecord(), time(), fread(), fseek(), localtime() -/ -/ GLOBAL INPUTS: Other, *Playersfp -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Delete characters which have not been used with the last -/ three weeks. -/ -*************************************************************************/ - -purgeoldplayers() -{ -int today; /* day of year for today */ -int daysold; /* how many days since the character has been used */ -time_t ltime; /* time in seconds */ -long loc = 0L; /* location in file */ - - time(<ime); - today = localtime(<ime)->tm_yday; - - for (;;) - { - fseek(Playersfp, loc, 0); - if (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) != 1) - break; - - daysold = today - Other.p_lastused; - if (daysold < 0) - daysold += 365; - - if (daysold > N_DAYSOLD) - /* player hasn't been used in a while; delete */ - freerecord(&Other, loc); - - loc += SZ_PLAYERSTRUCT; - } -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: enterscore() -/ -/ FUNCTION: enter player into scoreboard -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: fread(), fseek(), fopen(), error(), strcmp(), fclose(), -/ strcpy(), fwrite(), descrtype() -/ -/ GLOBAL INPUTS: Player -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ The scoreboard keeps track of the highest character on a -/ per-login basis. -/ Search the scoreboard for an entry for the current login, -/ if an entry is found, and it is lower than the current player, -/ replace it, otherwise create an entry. -/ -*************************************************************************/ - -enterscore() -{ -struct scoreboard sbuf; /* buffer to read in scoreboard entries */ -FILE *fp; /* to open scoreboard file */ -long loc = 0L; /* location in scoreboard file */ -bool found = FALSE; /* set if we found an entry for this login */ - - if ((fp = fopen(_PATH_SCORE, "r+")) != NULL) - { - while (fread((char *) &sbuf, SZ_SCORESTRUCT, 1, fp) == 1) - if (strcmp(Player.p_login, sbuf.sb_login) == 0) - { - found = TRUE; - break; - } - else - loc += SZ_SCORESTRUCT; - } - else - { - error(_PATH_SCORE); - /*NOTREACHED*/ - } - - /* - * At this point, 'loc' will either indicate a point beyond - * the end of file, or the place where the previous entry - * was found. - */ - - if ((!found) || Player.p_level > sbuf.sb_level) - /* put new entry in for this login */ - { - strcpy(sbuf.sb_login, Player.p_login); - strcpy(sbuf.sb_name, Player.p_name); - sbuf.sb_level = Player.p_level; - strcpy(sbuf.sb_type, descrtype(&Player, TRUE)); - } - - /* update entry */ - fseek(fp, loc, 0); - fwrite((char *) &sbuf, SZ_SCORESTRUCT, 1, fp); - fclose(fp); -} diff --git a/games/phantasia/include.h b/games/phantasia/include.h deleted file mode 100644 index 812b5a5..0000000 --- a/games/phantasia/include.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * include.h - includes all important files for Phantasia - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "macros.h" -#include "phantdefs.h" -#include "phantstruct.h" -#include "phantglobs.h" -#include "pathnames.h" diff --git a/games/phantasia/interplayer.c b/games/phantasia/interplayer.c deleted file mode 100644 index 6a7f9ec..0000000 --- a/games/phantasia/interplayer.c +++ /dev/null @@ -1,1211 +0,0 @@ -/* - * interplayer.c - player to player routines for Phantasia - * - * $FreeBSD$ - */ - -#include -#include "include.h" - -/************************************************************************ -/ -/ FUNCTION NAME: checkbattle() -/ -/ FUNCTION: check to see if current player should battle another -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: battleplayer(), fread(), fseek() -/ -/ GLOBAL INPUTS: Other, Users, Player, Fileloc, *Playersfp -/ -/ GLOBAL OUTPUTS: Users -/ -/ DESCRIPTION: -/ Seach player file for a foe at the same coordinates as the -/ current player. -/ Also update user count. -/ -*************************************************************************/ - -checkbattle() -{ -long foeloc = 0L; /* location in file of person to fight */ - - Users = 0; - fseek(Playersfp, 0L, 0); - - while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) - { - if (Other.p_status != S_OFF - && Other.p_status != S_NOTUSED - && Other.p_status != S_HUNGUP - && (Other.p_status != S_CLOAKED || Other.p_specialtype != SC_VALAR)) - /* player is on and not a cloaked valar */ - { - ++Users; - - if (Player.p_x == Other.p_x - && Player.p_y == Other.p_y - /* same coordinates */ - && foeloc != Fileloc - /* not self */ - && Player.p_status == S_PLAYING - && (Other.p_status == S_PLAYING || Other.p_status == S_INBATTLE) - /* both are playing */ - && Other.p_specialtype != SC_VALAR - && Player.p_specialtype != SC_VALAR) - /* neither is valar */ - { - battleplayer(foeloc); - return; - } - } - foeloc += SZ_PLAYERSTRUCT; - } -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: battleplayer() -/ -/ FUNCTION: inter-terminal battle with another player -/ -/ AUTHOR: E. A. Estes, 2/15/86 -/ -/ ARGUMENTS: -/ long foeplace - location in player file of person to battle -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: readrecord(), readmessage(), writerecord(), collecttaxes(), -/ displaystats(), fabs(), more(), death(), sleep(), wmove(), waddch(), printw(), -/ myturn(), altercoordinates(), waddstr(), wrefresh(), mvprintw(), -/ getanswer(), wclrtoeol(), wclrtobot() -/ -/ GLOBAL INPUTS: Foestrikes, LINES, Lines, Other, Shield, Player, *stdscr, -/ Fileloc, *Enemyname -/ -/ GLOBAL OUTPUTS: Foestrikes, Lines, Shield, Player, Luckout, *Enemyname -/ -/ DESCRIPTION: -/ Inter-terminal battle is a very fragile and slightly klugy thing. -/ At any time, one player is master and the other is slave. -/ We pick who is master first by speed and level. After that, -/ the slave waits for the master to relinquish its turn, and -/ the slave becomes master, and so on. -/ -/ The items in the player structure which control the handshake are: -/ p_tampered: -/ master increments this to relinquish control -/ p_istat: -/ master sets this to specify particular action -/ p_1scratch: -/ set to total damage inflicted so far; changes to indicate action -/ -*************************************************************************/ - -battleplayer(foeplace) -long foeplace; -{ -double dtemp; /* for temporary calculations */ -double oldhits = 0.0; /* previous damage inflicted by foe */ -int loop; /* for timing out */ -int ch; /* input */ -short oldtampered; /* old value of foe's p_tampered */ - - Lines = 8; - Luckout = FALSE; - mvaddstr(4, 0, "Preparing for battle!\n"); - refresh(); - -#ifdef SYS5 - flushinp(); -#endif - - /* set up variables, file, etc. */ - Player.p_status = S_INBATTLE; - Shield = Player.p_energy; - - /* if p_tampered is not 0, someone else may try to change it (king, etc.) */ - Player.p_tampered = oldtampered = 1; - Player.p_1scratch = 0.0; - Player.p_istat = I_OFF; - - readrecord(&Other, foeplace); - if (fabs(Player.p_level - Other.p_level) > 20.0) - /* see if players are greatly mismatched */ - { - dtemp = (Player.p_level - Other.p_level) / MAX(Player.p_level, Other.p_level); - if (dtemp < -0.5) - /* foe outweighs this one */ - Player.p_speed *= 2.0; - } - - writerecord(&Player, Fileloc); /* write out all our info */ - - if (Player.p_blindness) - Enemyname = "someone"; - else - Enemyname = Other.p_name; - - mvprintw(6, 0, "You have encountered %s Level: %.0f\n", Enemyname, Other.p_level); - refresh(); - - for (loop = 0; Other.p_status != S_INBATTLE && loop < 30; ++loop) - /* wait for foe to respond */ - { - readrecord(&Other, foeplace); - sleep(1); - } - - if (Other.p_status != S_INBATTLE) - /* foe did not respond */ - { - mvprintw(5, 0, "%s is not responding.\n", Enemyname); - goto LEAVE; - } - /* else, we are ready to battle */ - - move(4, 0); - clrtoeol(); - - /* - * determine who is first master - * if neither player is faster, check level - * if neither level is greater, battle is not allowed - * (this should never happen, but we have to handle it) - */ - if (Player.p_speed > Other.p_speed) - Foestrikes = FALSE; - else if (Other.p_speed > Player.p_speed) - Foestrikes = TRUE; - else if (Player.p_level > Other.p_level) - Foestrikes = FALSE; - else if (Other.p_level > Player.p_level) - Foestrikes = TRUE; - else - /* no one is faster */ - { - printw("You can't fight %s yet.", Enemyname); - goto LEAVE; - } - - for (;;) - { - displaystats(); - readmessage(); - mvprintw(1, 26, "%20.0f", Shield); /* overprint energy */ - - if (!Foestrikes) - /* take action against foe */ - myturn(); - else - /* wait for foe to take action */ - { - mvaddstr(4, 0, "Waiting...\n"); - clrtoeol(); - refresh(); - - for (loop = 0; loop < 20; ++loop) - /* wait for foe to act */ - { - readrecord(&Other, foeplace); - if (Other.p_1scratch != oldhits) - /* p_1scratch changes to indicate action */ - break; - else - /* wait and try again */ - { - sleep(1); - addch('.'); - refresh(); - } - } - - if (Other.p_1scratch == oldhits) - { - /* timeout */ - mvaddstr(22, 0, "Timeout: waiting for response. Do you want to wait ? "); - ch = getanswer("NY", FALSE); - move(22, 0); - clrtobot(); - if (ch == 'Y') - continue; - else - break; - } - else - /* foe took action */ - { - switch (Other.p_istat) - { - case I_RAN: /* foe ran away */ - mvprintw(Lines++, 0, "%s ran away!", Enemyname); - break; - - case I_STUCK: /* foe tried to run, but couldn't */ - mvprintw(Lines++, 0, "%s tried to run away.", Enemyname); - break; - - case I_BLEWIT: /* foe tried to luckout, but didn't */ - mvprintw(Lines++, 0, "%s tried to luckout!", Enemyname); - break; - - default: - dtemp = Other.p_1scratch - oldhits; - mvprintw(Lines++, 0, "%s hit you %.0f times!", Enemyname, dtemp); - Shield -= dtemp; - break; - } - - oldhits = Other.p_1scratch; /* keep track of old hits */ - - if (Other.p_tampered != oldtampered) - /* p_tampered changes to relinquish turn */ - { - oldtampered = Other.p_tampered; - Foestrikes = FALSE; - } - } - } - - /* decide what happens next */ - refresh(); - if (Lines > LINES - 2) - { - more(Lines); - move(Lines = 8, 0); - clrtobot(); - } - - if (Other.p_istat == I_KILLED || Shield < 0.0) - /* we died */ - { - Shield = -2.0; /* insure this value is negative */ - break; - } - - if (Player.p_istat == I_KILLED) - /* we killed foe; award treasre */ - { - mvprintw(Lines++, 0, "You killed %s!", Enemyname); - Player.p_experience += Other.p_experience; - Player.p_crowns += (Player.p_level < 1000.0) ? Other.p_crowns : 0; - Player.p_amulets += Other.p_amulets; - Player.p_charms += Other.p_charms; - collecttaxes(Other.p_gold, Other.p_gems); - Player.p_sword = MAX(Player.p_sword, Other.p_sword); - Player.p_shield = MAX(Player.p_shield, Other.p_shield); - Player.p_quksilver = MAX(Player.p_quksilver, Other.p_quksilver); - if (Other.p_virgin && !Player.p_virgin) - { - mvaddstr(Lines++, 0, "You have rescued a virgin. Will you be honorable ? "); - if ((ch = getanswer("YN", FALSE)) == 'Y') - Player.p_virgin = TRUE; - else - { - ++Player.p_sin; - Player.p_experience += 8000.0; - } - } - sleep(3); /* give other person time to die */ - break; - } - else if (Player.p_istat == I_RAN || Other.p_istat == I_RAN) - /* either player ran away */ - break; - } - -LEAVE: - /* clean up things and leave */ - writerecord(&Player, Fileloc); /* update a final time */ - altercoordinates(0.0, 0.0, A_NEAR); /* move away from battle site */ - Player.p_energy = Shield; /* set energy to actual value */ - Player.p_tampered = T_OFF; /* clear p_tampered */ - - more(Lines); /* pause */ - - move(4, 0); - clrtobot(); /* clear bottom area of screen */ - - if (Player.p_energy < 0.0) - /* we are dead */ - death("Interterminal battle"); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: myturn() -/ -/ FUNCTION: process players action against foe in battle -/ -/ AUTHOR: E. A. Estes, 2/7/86 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: writerecord(), inputoption(), floor(), wmove(), drandom(), -/ waddstr(), wrefresh(), mvprintw(), wclrtoeol(), wclrtobot() -/ -/ GLOBAL INPUTS: Lines, Other, Player, *stdscr, Fileloc, Luckout, -/ *Enemyname -/ -/ GLOBAL OUTPUTS: Foestrikes, Lines, Player, Luckout -/ -/ DESCRIPTION: -/ Take action action against foe, and decide who is master -/ for next iteration. -/ -*************************************************************************/ - -myturn() -{ -double dtemp; /* for temporary calculations */ -int ch; /* input */ - - mvaddstr(7, 0, "1:Fight 2:Run Away! 3:Power Blast "); - if (Luckout) - clrtoeol(); - else - addstr("4:Luckout "); - - ch = inputoption(); - move(Lines = 8, 0); - clrtobot(); - - switch (ch) - { - default: /* fight */ - dtemp = ROLL(2.0, Player.p_might); -HIT: - mvprintw(Lines++, 0, "You hit %s %.0f times!", Enemyname, dtemp); - Player.p_sin += 0.5; - Player.p_1scratch += dtemp; - Player.p_istat = I_OFF; - break; - - case '2': /* run away */ - Player.p_1scratch -= 1.0; /* change this to indicate action */ - if (drandom() > 0.25) - { - mvaddstr(Lines++, 0, "You got away!"); - Player.p_istat = I_RAN; - } - else - { - mvprintw(Lines++, 0, "%s is still after you!", Enemyname); - Player.p_istat = I_STUCK; - } - break; - - case '3': /* power blast */ - dtemp = MIN(Player.p_mana, Player.p_level * 5.0); - Player.p_mana -= dtemp; - dtemp *= (drandom() + 0.5) * Player.p_magiclvl * 0.2 + 2.0; - mvprintw(Lines++, 0, "You blasted %s !", Enemyname); - goto HIT; - - case '4': /* luckout */ - if (Luckout || drandom() > 0.1) - { - if (Luckout) - mvaddstr(Lines++, 0, "You already tried that!"); - else - { - mvaddstr(Lines++, 0, "Not this time . . ."); - Luckout = TRUE; - } - - Player.p_1scratch -= 1.0; - Player.p_istat = I_BLEWIT; - } - else - { - mvaddstr(Lines++, 0, "You just lucked out!"); - Player.p_1scratch = Other.p_energy * 1.1; - } - break; - } - - refresh(); - Player.p_1scratch = floor(Player.p_1scratch); /* clean up any mess */ - - if (Player.p_1scratch > Other.p_energy) - Player.p_istat = I_KILLED; - else if (drandom() * Player.p_speed < drandom() * Other.p_speed) - /* relinquish control */ - { - ++Player.p_tampered; - Foestrikes = TRUE; - } - - writerecord(&Player, Fileloc); /* let foe know what we did */ -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: checktampered() -/ -/ FUNCTION: check if current player has been tampered with -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: readrecord(), fread(), fseek(), tampered(), writevoid() -/ -/ GLOBAL INPUTS: *Energyvoidfp, Other, Player, Fileloc, Enrgyvoid -/ -/ GLOBAL OUTPUTS: Enrgyvoid -/ -/ DESCRIPTION: -/ Check for energy voids, holy grail, and tampering by other -/ players. -/ -*************************************************************************/ - -checktampered() -{ -long loc = 0L; /* location in energy void file */ - - /* first check for energy voids */ - fseek(Energyvoidfp, 0L, 0); - while (fread((char *) &Enrgyvoid, SZ_VOIDSTRUCT, 1, Energyvoidfp) == 1) - if (Enrgyvoid.ev_active - && Enrgyvoid.ev_x == Player.p_x - && Enrgyvoid.ev_y == Player.p_y) - /* sitting on one */ - { - if (loc > 0L) - /* not the holy grail; inactivate energy void */ - { - Enrgyvoid.ev_active = FALSE; - writevoid(&Enrgyvoid, loc); - tampered(T_NRGVOID, 0.0, 0.0); - } - else if (Player.p_status != S_CLOAKED) - /* holy grail */ - tampered(T_GRAIL, 0.0, 0.0); - break; - } - else - loc += SZ_VOIDSTRUCT; - - /* now check for other things */ - readrecord(&Other, Fileloc); - if (Other.p_tampered != T_OFF) - tampered(Other.p_tampered, Other.p_1scratch, Other.p_2scratch); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: tampered() -/ -/ FUNCTION: take care of tampering by other players -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ int what - what type of tampering -/ double arg1, arg2 - rest of tampering info -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: writerecord(), more(), fread(), death(), fseek(), sleep(), -/ floor(), wmove(), waddch(), drandom(), printw(), altercoordinates(), -/ waddstr(), wrefresh(), encounter(), writevoid() -/ -/ GLOBAL INPUTS: Other, Player, *stdscr, Enrgyvoid, *Playersfp -/ -/ GLOBAL OUTPUTS: Other, Player, Changed, Enrgyvoid -/ -/ DESCRIPTION: -/ Take care of energy voids, holy grail, decree and intervention -/ action on current player. -/ -*************************************************************************/ - -tampered(what, arg1, arg2) -int what; -double arg1; -double arg2; -{ -long loc; /* location in file of other players */ - - Changed = TRUE; - move(4,0); - - Player.p_tampered = T_OFF; /* no longer tampered with */ - - switch (what) - { - case T_NRGVOID: - addstr("You've hit an energy void !\n"); - Player.p_mana /= 3.0; - Player.p_energy /= 2.0; - Player.p_gold = floor(Player.p_gold/1.25) + 0.1; - altercoordinates(0.0, 0.0, A_NEAR); - break; - - case T_TRANSPORT: - addstr("The king transported you ! "); - if (Player.p_charms > 0) - { - addstr("But your charm saved you. . .\n"); - --Player.p_charms; - } - else - { - altercoordinates(0.0, 0.0, A_FAR); - addch('\n'); - } - break; - - case T_BESTOW: - printw("The king has bestowed %.0f gold pieces on you !\n", arg1); - Player.p_gold += arg1; - break; - - case T_CURSED: - addstr("You've been cursed ! "); - if (Player.p_blessing) - { - addstr("But your blessing saved you. . .\n"); - Player.p_blessing = FALSE; - } - else - { - addch('\n'); - Player.p_poison += 2.0; - Player.p_energy = 10.0; - Player.p_maxenergy *= 0.95; - Player.p_status = S_PLAYING; /* no longer cloaked */ - } - break; - - case T_VAPORIZED: - addstr("You have been vaporized!\n"); - more(7); - death("Vaporization"); - break; - - case T_MONSTER: - addstr("The Valar zapped you with a monster!\n"); - more(7); - encounter((int) arg1); - return; - - case T_BLESSED: - addstr("The Valar has blessed you!\n"); - Player.p_energy = (Player.p_maxenergy *= 1.05) + Player.p_shield; - Player.p_mana += 500.0; - Player.p_strength += 0.5; - Player.p_brains += 0.5; - Player.p_magiclvl += 0.5; - Player.p_poison = MIN(0.5, Player.p_poison); - break; - - case T_RELOCATE: - addstr("You've been relocated. . .\n"); - altercoordinates(arg1, arg2, A_FORCED); - break; - - case T_HEAL: - addstr("You've been healed!\n"); - Player.p_poison -= 0.25; - Player.p_energy = Player.p_maxenergy + Player.p_shield; - break; - - case T_EXVALAR: - addstr("You are no longer Valar!\n"); - Player.p_specialtype = SC_COUNCIL; - break; - - case T_GRAIL: - addstr("You have found The Holy Grail!!\n"); - if (Player.p_specialtype < SC_COUNCIL) - /* must be council of wise to behold grail */ - { - addstr("However, you are not experienced enough to behold it.\n"); - Player.p_sin *= Player.p_sin; - Player.p_mana += 1000; - } - else if (Player.p_specialtype == SC_VALAR - || Player.p_specialtype == SC_EXVALAR) - { - addstr("You have made it to the position of Valar once already.\n"); - addstr("The Grail is of no more use to you now.\n"); - } - else - { - addstr("It is now time to see if you are worthy to behold it. . .\n"); - refresh(); - sleep(4); - - if (drandom() / 2.0 < Player.p_sin) - { - addstr("You have failed!\n"); - Player.p_strength = - Player.p_mana = - Player.p_energy = - Player.p_maxenergy = - Player.p_magiclvl = - Player.p_brains = - Player.p_experience = - Player.p_quickness = 1.0; - - altercoordinates(1.0, 1.0, A_FORCED); - Player.p_level = 0.0; - } - else - { - addstr("You made to position of Valar!\n"); - Player.p_specialtype = SC_VALAR; - Player.p_lives = 5; - fseek(Playersfp, 0L, 0); - loc = 0L; - while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) - /* search for existing valar */ - if (Other.p_specialtype == SC_VALAR - && Other.p_status != S_NOTUSED) - /* found old valar */ - { - Other.p_tampered = T_EXVALAR; - writerecord(&Other, loc); - break; - } - else - loc += SZ_PLAYERSTRUCT; - } - } - - /* move grail to new location */ - Enrgyvoid.ev_active = TRUE; - Enrgyvoid.ev_x = ROLL(-1.0e6, 2.0e6); - Enrgyvoid.ev_y = ROLL(-1.0e6, 2.0e6); - writevoid(&Enrgyvoid, 0L); - break; - } - refresh(); - sleep(2); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: userlist() -/ -/ FUNCTION: print list of players and locations -/ -/ AUTHOR: E. A. Estes, 2/28/86 -/ -/ ARGUMENTS: -/ bool ingameflag - set if called while playing -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: descrstatus(), descrlocation(), more(), fread(), fseek(), -/ floor(), wmove(), printw(), waddstr(), distance(), wrefresh(), -/ descrtype(), wclrtobot() -/ -/ GLOBAL INPUTS: LINES, Other, Circle, Wizard, Player, *stdscr, *Playersfp -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ We can only see the coordinate of those closer to the origin -/ from us. -/ Kings and council of the wise can see and can be seen by everyone. -/ Palantirs are good for seeing everyone; and the valar can use -/ one to see through a 'cloak' spell. -/ The valar has no coordinates, and is completely invisible if -/ cloaked. -/ -*************************************************************************/ - -userlist(ingameflag) -bool ingameflag; -{ -int numusers = 0; /* number of users on file */ - - if (ingameflag && Player.p_blindness) - { - mvaddstr(8, 0, "You cannot see anyone.\n"); - return; - } - - fseek(Playersfp, 0L, 0); - mvaddstr(8, 0, - "Name X Y Lvl Type Login Status\n"); - - while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) - { - if (Other.p_status == S_NOTUSED - /* record is unused */ - || (Other.p_specialtype == SC_VALAR && Other.p_status == S_CLOAKED)) - /* cloaked valar */ - { - if (!Wizard) - /* wizard can see everything on file */ - continue; - } - - ++numusers; - - if (ingameflag && - /* must be playing for the rest of these conditions */ - (Player.p_specialtype >= SC_KING - /* kings and higher can see others */ - || Other.p_specialtype >= SC_KING - /* kings and higher can be seen by others */ - || Circle >= CIRCLE(Other.p_x, Other.p_y) - /* those nearer the origin can be seen */ - || Player.p_palantir) - /* palantir enables one to see others */ - && (Other.p_status != S_CLOAKED - || (Player.p_specialtype == SC_VALAR && Player.p_palantir)) - /* not cloaked; valar can see through cloak with a palantir */ - && Other.p_specialtype != SC_VALAR) - /* not a valar */ - /* coordinates should be printed */ - printw("%-20s %8.0f %8.0f ", - Other.p_name, Other.p_x, Other.p_y); - else - /* cannot see player's coordinates */ - printw("%-20s %19.19s ", - Other.p_name, descrlocation(&Other, TRUE)); - - printw("%6.0f %s %-9.9s%s\n", Other.p_level, descrtype(&Other, TRUE), - Other.p_login, descrstatus(&Other)); - - if ((numusers % (LINES - 10)) == 0) - { - more(LINES - 1); - move(9, 0); - clrtobot(); - } - } - - printw("Total players on file = %d\n", numusers); - refresh(); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: throneroom() -/ -/ FUNCTION: king stuff upon entering throne -/ -/ AUTHOR: E. A. Estes, 12/16/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: writerecord(), fread(), fseek(), fopen(), wmove(), fclose(), -/ fwrite(), altercoordinates(), waddstr(), fprintf() -/ -/ GLOBAL INPUTS: *Energyvoidfp, Other, Player, *stdscr, -/ Enrgyvoid, *Playersfp -/ -/ GLOBAL OUTPUTS: Other, Player, Changed -/ -/ DESCRIPTION: -/ If player is not already king, make him/her so if the old king -/ is not playing. -/ Clear energy voids with new king. -/ Print 'decree' prompt. -/ -*************************************************************************/ - -throneroom() -{ -FILE *fp; /* to clear energy voids */ -long loc = 0L; /* location of old king in player file */ - - if (Player.p_specialtype < SC_KING) - /* not already king -- assumes crown */ - { - fseek(Playersfp, 0L, 0); - while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) - if (Other.p_specialtype == SC_KING && Other.p_status != S_NOTUSED) - /* found old king */ - { - if (Other.p_status != S_OFF) - /* old king is playing */ - { - mvaddstr( 4, 0, "The king is playing, so you cannot steal his throne\n"); - altercoordinates(0.0, 0.0, A_NEAR); - move(6, 0); - return; - } - else - /* old king is not playing - remove him/her */ - { - Other.p_specialtype = SC_NONE; - if (Other.p_crowns) - --Other.p_crowns; - writerecord(&Other, loc); - break; - } - } - else - loc += SZ_PLAYERSTRUCT; - - /* make player new king */ - Changed = TRUE; - Player.p_specialtype = SC_KING; - mvaddstr(4, 0, "You have become king!\n"); - - /* let everyone else know */ - fp = fopen(_PATH_MESS, "w"); - fprintf(fp, "All hail the new king!"); - fclose(fp); - - /* clear all energy voids; retain location of holy grail */ - fseek(Energyvoidfp, 0L, 0); - fread((char *) &Enrgyvoid, SZ_VOIDSTRUCT, 1, Energyvoidfp); - fp = fopen(_PATH_VOID, "w"); - fwrite((char *) &Enrgyvoid, SZ_VOIDSTRUCT, 1, fp); - fclose(fp); - } - - mvaddstr(6, 0, "0:Decree "); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: dotampered() -/ -/ FUNCTION: king and valar special options -/ -/ AUTHOR: E. A. Estes, 2/28/86 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: writerecord(), truncstring(), fread(), fseek(), fopen(), -/ floor(), wmove(), drandom(), fclose(), fwrite(), sscanf(), strcmp(), -/ infloat(), waddstr(), findname(), distance(), userlist(), mvprintw(), -/ allocvoid(), getanswer(), getstring(), wclrtoeol(), writevoid() -/ -/ GLOBAL INPUTS: *Energyvoidfp, Other, Illcmd[], Wizard, Player, *stdscr, -/ Databuf[], Enrgyvoid -/ -/ GLOBAL OUTPUTS: Other, Player, Enrgyvoid -/ -/ DESCRIPTION: -/ Tamper with other players. Handle king/valar specific options. -/ -*************************************************************************/ - -dotampered() -{ -short tamper; /* value for tampering with other players */ -char *option; /* pointer to option description */ -double temp1 = 0.0, temp2 = 0.0; /* other tampering values */ -int ch; /* input */ -long loc; /* location in energy void file */ -FILE *fp; /* for opening gold file */ - - move(6, 0); - clrtoeol(); - if (Player.p_specialtype < SC_COUNCIL && !Wizard) - /* king options */ - { - addstr("1:Transport 2:Curse 3:Energy Void 4:Bestow 5:Collect Taxes "); - - ch = getanswer(" ", TRUE); - move(6, 0); - clrtoeol(); - move(4, 0); - switch (ch) - { - case '1': /* transport someone */ - tamper = T_TRANSPORT; - option = "transport"; - break; - - case '2': /* curse another */ - tamper = T_CURSED; - option = "curse"; - break; - - case '3': /* create energy void */ - if ((loc = allocvoid()) > 20L * SZ_VOIDSTRUCT) - /* can only have 20 void active at once */ - mvaddstr(5, 0, "Sorry, void creation limit reached.\n"); - else - { - addstr("Enter the X Y coordinates of void ? "); - getstring(Databuf, SZ_DATABUF); - sscanf(Databuf, "%lf %lf", &temp1, &temp2); - Enrgyvoid.ev_x = floor(temp1); - Enrgyvoid.ev_y = floor(temp2); - Enrgyvoid.ev_active = TRUE; - writevoid(&Enrgyvoid, loc); - mvaddstr(5, 0, "It is done.\n"); - } - return; - - case '4': /* bestow gold to subject */ - tamper = T_BESTOW; - addstr("How much gold to bestow ? "); - temp1 = infloat(); - if (temp1 > Player.p_gold || temp1 < 0) - { - mvaddstr(5, 0, "You don't have that !\n"); - return; - } - - /* adjust gold after we are sure it will be given to someone */ - option = "give gold to"; - break; - - case '5': /* collect accumulated taxes */ - if ((fp = fopen(_PATH_GOLD, "r+")) != NULL) - /* collect taxes */ - { - fread((char *) &temp1, sizeof(double), 1, fp); - fseek(fp, 0L, 0); - /* clear out value */ - temp2 = 0.0; - fwrite((char *) &temp2, sizeof(double), 1, fp); - fclose(fp); - } - - mvprintw(4, 0, "You have collected %.0f in gold.\n", temp1); - Player.p_gold += floor(temp1); - return; - - default: - return; - } - /* end of king options */ - } - else - /* council of wise, valar, wizard options */ - { - addstr("1:Heal "); - if (Player.p_palantir || Wizard) - addstr("2:Seek Grail "); - if (Player.p_specialtype == SC_VALAR || Wizard) - addstr("3:Throw Monster 4:Relocate 5:Bless "); - if (Wizard) - addstr("6:Vaporize "); - - ch = getanswer(" ", TRUE); - if (!Wizard) - { - if (ch > '2' && Player.p_specialtype != SC_VALAR) - { - ILLCMD(); - return; - } - - if (Player.p_mana < MM_INTERVENE) - { - mvaddstr(5, 0, "No mana left.\n"); - return; - } - else - Player.p_mana -= MM_INTERVENE; - } - - switch (ch) - { - case '1': /* heal another */ - tamper = T_HEAL; - option = "heal"; - break; - - case '2': /* seek grail */ - if (Player.p_palantir) - /* need a palantir to seek */ - { - fseek(Energyvoidfp, 0L, 0); - fread((char *) &Enrgyvoid, SZ_VOIDSTRUCT, 1, Energyvoidfp); - temp1 = distance(Player.p_x, Enrgyvoid.ev_x, Player.p_y, Enrgyvoid.ev_y); - temp1 += ROLL(-temp1 / 10.0, temp1 / 5.0); /* add some error */ - mvprintw(5, 0, "The palantir says the Grail is about %.0f away.\n", temp1); - } - else - /* no palantir */ - mvaddstr(5, 0, "You need a palantir to seek the Grail.\n"); - return; - - case '3': /* lob monster at someone */ - mvaddstr(4, 0, "Which monster [0-99] ? "); - temp1 = infloat(); - temp1 = MAX(0.0, MIN(99.0, temp1)); - tamper = T_MONSTER; - option = "throw a monster at"; - break; - - case '4': /* move another player */ - mvaddstr(4, 0, "New X Y coordinates ? "); - getstring(Databuf, SZ_DATABUF); - sscanf(Databuf, "%lf %lf", &temp1, &temp2); - tamper = T_RELOCATE; - option = "relocate"; - break; - - case '5': /* bless a player */ - tamper = T_BLESSED; - option = "bless"; - break; - - case '6': /* kill off a player */ - if (Wizard) - { - tamper = T_VAPORIZED; - option = "vaporize"; - break; - } - else - return; - - default: - return; - } - - /* adjust age after we are sure intervention will be done */ - /* end of valar, etc. options */ - } - - for (;;) - /* prompt for player to affect */ - { - mvprintw(4, 0, "Who do you want to %s ? ", option); - getstring(Databuf, SZ_DATABUF); - truncstring(Databuf); - - if (Databuf[0] == '\0') - userlist(TRUE); - else - break; - } - - if (strcmp(Player.p_name, Databuf) != 0) - /* name other than self */ - { - if ((loc = findname(Databuf, &Other)) >= 0L) - { - if (Other.p_tampered != T_OFF) - { - mvaddstr(5, 0, "That person has something pending already.\n"); - return; - } - else - { - if (tamper == T_RELOCATE - && CIRCLE(temp1, temp2) < CIRCLE(Other.p_x, Other.p_y) - && !Wizard) - mvaddstr(5, 0, "Cannot move someone closer to the Lord's Chamber.\n"); - else - { - if (tamper == T_BESTOW) Player.p_gold -= floor(temp1); - if (!Wizard && (tamper == T_HEAL || tamper == T_MONSTER || - tamper == T_RELOCATE || tamper == T_BLESSED)) - Player.p_age += N_AGE; /* age penalty */ - Other.p_tampered = tamper; - Other.p_1scratch = floor(temp1); - Other.p_2scratch = floor(temp2); - writerecord(&Other, loc); - mvaddstr(5, 0, "It is done.\n"); - } - return; - } - } - else - /* player not found */ - mvaddstr(5, 0, "There is no one by that name.\n"); - } - else - /* self */ - mvaddstr(5, 0, "You may not do it to yourself!\n"); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: writevoid() -/ -/ FUNCTION: update energy void entry in energy void file -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ struct energyvoid *vp - pointer to structure to write to file -/ long loc - location in file to update -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: fseek(), fwrite(), fflush() -/ -/ GLOBAL INPUTS: *Energyvoidfp -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Write out energy void structure at specified location. -/ -*************************************************************************/ - -writevoid(vp, loc) -struct energyvoid *vp; -long loc; -{ - - fseek(Energyvoidfp, loc, 0); - fwrite((char *) vp, SZ_VOIDSTRUCT, 1, Energyvoidfp); - fflush(Energyvoidfp); - fseek(Energyvoidfp, 0L, 0); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: allocvoid() -/ -/ FUNCTION: allocate space for a new energy void -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: location of new energy void space -/ -/ MODULES CALLED: fread(), fseek() -/ -/ GLOBAL INPUTS: *Energyvoidfp, Enrgyvoid -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Search energy void file for an inactive entry and return its -/ location. -/ If no inactive ones are found, return one more than last location. -/ -*************************************************************************/ - -long -allocvoid() -{ -long loc = 0L; /* location of new energy void */ - - fseek(Energyvoidfp, 0L, 0); - while (fread((char *) &Enrgyvoid, SZ_VOIDSTRUCT, 1, Energyvoidfp) == 1) - if (Enrgyvoid.ev_active) - loc += SZ_VOIDSTRUCT; - else - break; - - return(loc); -} diff --git a/games/phantasia/io.c b/games/phantasia/io.c deleted file mode 100644 index bfd2564..0000000 --- a/games/phantasia/io.c +++ /dev/null @@ -1,439 +0,0 @@ -/* - * io.c - input/output routines for Phantasia - * - * $FreeBSD$ - */ - -#include -#include "include.h" - -/************************************************************************ -/ -/ FUNCTION NAME: getstring() -/ -/ FUNCTION: read a string from operator -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ char *cp - pointer to buffer area to fill -/ int mx - maximum number of characters to put in buffer -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: wmove(), _filbuf(), clearok(), waddstr(), wrefresh(), -/ wclrtoeol() -/ -/ GLOBAL INPUTS: Echo, _iob[], Wizard, *stdscr -/ -/ GLOBAL OUTPUTS: _iob[] -/ -/ DESCRIPTION: -/ Read a string from the keyboard. -/ This routine is specially designed to: -/ -/ - strip non-printing characters (unless Wizard) -/ - echo, if desired -/ - redraw the screen if CH_REDRAW is entered -/ - read in only 'mx - 1' characters or less characters -/ - nul-terminate string, and throw away newline -/ -/ 'mx' is assumed to be at least 2. -/ -*************************************************************************/ - -getstring(cp, mx) -char *cp; -int mx; -{ -char *inptr; /* pointer into string for next string */ -int x, y; /* original x, y coordinates on screen */ -int ch; /* input */ - - getyx(stdscr, y, x); /* get coordinates on screen */ - inptr = cp; - *inptr = '\0'; /* clear string to start */ - --mx; /* reserve room in string for nul terminator */ - - do - /* get characters and process */ - { - if (Echo) - mvaddstr(y, x, cp); /* print string on screen */ - clrtoeol(); /* clear any data after string */ - refresh(); /* update screen */ - - ch = getchar(); /* get character */ - - switch (ch) - { - case CH_ERASE: /* back up one character */ - if (inptr > cp) - --inptr; - break; - - case CH_KILL: /* back up to original location */ - inptr = cp; - break; - - case CH_NEWLINE: /* terminate string */ - break; - - case CH_REDRAW: /* redraw screen */ - clearok(stdscr, TRUE); - continue; - - default: /* put data in string */ - if (ch >= ' ' || Wizard) - /* printing char; put in string */ - *inptr++ = ch; - } - - *inptr = '\0'; /* terminate string */ - } - while (ch != CH_NEWLINE && inptr < cp + mx); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: more() -/ -/ FUNCTION: pause and prompt player -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ int where - line on screen on which to pause -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: wmove(), waddstr(), getanswer() -/ -/ GLOBAL INPUTS: *stdscr -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Print a message, and wait for a space character. -/ -*************************************************************************/ - -more(where) -int where; -{ - mvaddstr(where, 0, "-- more --"); - getanswer(" ", FALSE); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: infloat() -/ -/ FUNCTION: input a floating point number from operator -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: floating point number from operator -/ -/ MODULES CALLED: sscanf(), getstring() -/ -/ GLOBAL INPUTS: Databuf[] -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Read a string from player, and scan for a floating point -/ number. -/ If no valid number is found, return 0.0. -/ -*************************************************************************/ - -double -infloat() -{ -double result; /* return value */ - - getstring(Databuf, SZ_DATABUF); - if (sscanf(Databuf, "%lf", &result) < 1) - /* no valid number entered */ - result = 0.0; - - return(result); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: inputoption() -/ -/ FUNCTION: input an option value from player -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: floor(), drandom(), getanswer() -/ -/ GLOBAL INPUTS: Player -/ -/ GLOBAL OUTPUTS: Player -/ -/ DESCRIPTION: -/ Age increases with every move. -/ Refresh screen, and get a single character option from player. -/ Return a random value if player's ring has gone bad. -/ -*************************************************************************/ - -inputoption() -{ - ++Player.p_age; /* increase age */ - - if (Player.p_ring.ring_type != R_SPOILED) - /* ring ok */ - return(getanswer("T ", TRUE)); - else - /* bad ring */ - { - getanswer(" ", TRUE); - return((int) ROLL(0.0, 5.0) + '0'); - } -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: interrupt() -/ -/ FUNCTION: handle interrupt from operator -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: fork(), exit(), wait(), death(), alarm(), execl(), wmove(), -/ getgid(), signal(), getenv(), wclear(), setuid(), getuid(), setgid(), -/ crmode(), clearok(), waddstr(), cleanup(), wrefresh(), leavegame(), -/ getanswer() -/ -/ GLOBAL INPUTS: Player, *stdscr -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Allow player to quit upon hitting the interrupt key. -/ If the player wants to quit while in battle, he/she automatically -/ dies. -/ -*************************************************************************/ - -interrupt() -{ -char line[81]; /* a place to store data already on screen */ -int loop; /* counter */ -int x, y; /* coordinates on screen */ -int ch; /* input */ -unsigned savealarm; /* to save alarm value */ - -#ifdef SYS3 - signal(SIGINT, SIG_IGN); -#endif -#ifdef SYS5 - signal(SIGINT, SIG_IGN); -#endif - - savealarm = alarm(0); /* turn off any alarms */ - - getyx(stdscr, y, x); /* save cursor location */ - - for (loop = 0; loop < 80; ++loop) /* save line on screen */ - { - move(4, loop); - line[loop] = inch(); - } - line[80] = '\0'; /* nul terminate */ - - if (Player.p_status == S_INBATTLE || Player.p_status == S_MONSTER) - /* in midst of fighting */ - { - mvaddstr(4, 0, "Quitting now will automatically kill your character. Still want to ? "); - ch = getanswer("NY", FALSE); - if (ch == 'Y') - death("Bailing out"); - /*NOTREACHED*/ - } - else - { - mvaddstr(4, 0, "Do you really want to quit ? "); - ch = getanswer("NY", FALSE); - if (ch == 'Y') - leavegame(); - /*NOTREACHED*/ - } - - mvaddstr(4, 0, line); /* restore data on screen */ - move(y, x); /* restore cursor */ - refresh(); - -#ifdef SYS3 - signal(SIGINT, interrupt); -#endif -#ifdef SYS5 - signal(SIGINT, interrupt); -#endif - - alarm(savealarm); /* restore alarm */ -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: getanswer() -/ -/ FUNCTION: get an answer from operator -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ char *choices - string of (upper case) valid choices -/ bool def - set if default answer -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: alarm(), wmove(), waddch(), signal(), setjmp(), strchr(), -/ _filbuf(), clearok(), toupper(), wrefresh(), mvprintw(), wclrtoeol() -/ -/ GLOBAL INPUTS: catchalarm(), Echo, _iob[], _ctype[], *stdscr, Timeout, -/ Timeoenv[] -/ -/ GLOBAL OUTPUTS: _iob[] -/ -/ DESCRIPTION: -/ Get a single character answer from operator. -/ Timeout waiting for response. If we timeout, or the -/ answer in not in the list of valid choices, print choices, -/ and wait again, otherwise return the first character in ths -/ list of choices. -/ Give up after 3 tries. -/ -*************************************************************************/ - -getanswer(choices, def) -char *choices; -bool def; -{ -int ch; /* input */ -int loop; /* counter */ -int oldx, oldy; /* original coordinates on screen */ - - getyx(stdscr, oldy, oldx); - alarm(0); /* make sure alarm is off */ - - for (loop = 3; loop; --loop) - /* try for 3 times */ - { - if (setjmp(Timeoenv) != 0) - /* timed out waiting for response */ - { - if (def || loop <= 1) - /* return default answer */ - break; - else - /* prompt, and try again */ - goto YELL; - } - else - /* wait for response */ - { - clrtoeol(); - refresh(); -#ifdef BSD41 - sigset(SIGALRM, catchalarm); -#else - signal(SIGALRM, catchalarm); -#endif - /* set timeout */ - if (Timeout) - alarm(7); /* short */ - else - alarm(600); /* long */ - - ch = getchar(); - - alarm(0); /* turn off timeout */ - - if (ch < 0) - /* caught some signal */ - { - ++loop; - continue; - } - else if (ch == CH_REDRAW) - /* redraw screen */ - { - clearok(stdscr, TRUE); /* force clear screen */ - ++loop; /* don't count this input */ - continue; - } - else if (Echo) - { - addch(ch); /* echo character */ - refresh(); - } - - if (islower(ch)) - /* convert to upper case */ - ch = toupper(ch); - - if (def || strchr(choices, ch) != NULL) - /* valid choice */ - return(ch); - else if (!def && loop > 1) - /* bad choice; prompt, and try again */ - { -YELL: mvprintw(oldy + 1, 0, "Please choose one of : [%s]\n", choices); - move(oldy, oldx); - clrtoeol(); - continue; - } - else - /* return default answer */ - break; - } - } - - return(*choices); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: catchalarm() -/ -/ FUNCTION: catch timer when waiting for input -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: longjmp() -/ -/ GLOBAL INPUTS: Timeoenv[] -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Come here when the alarm expires while waiting for input. -/ Simply longjmp() into getanswer(). -/ -*************************************************************************/ - -void -catchalarm() -{ - longjmp(Timeoenv, 1); -} diff --git a/games/phantasia/macros.h b/games/phantasia/macros.h deleted file mode 100644 index e232742..0000000 --- a/games/phantasia/macros.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * macros.h - macro definitions for Phantasia - */ - -#define ROLL(BASE,INTERVAL) floor((BASE) + (INTERVAL) * drandom()) -#define SGN(X) ((X) < 0 ? -1 : 1) -#define CIRCLE(X, Y) floor(distance(X, 0.0, Y, 0.0) / 125.0 + 1) -#define MAX(A, B) ((A) > (B) ? (A) : (B)) -#define MIN(A, B) ((A) < (B) ? (A) : (B)) -#define ILLCMD() mvaddstr(5, 0, Illcmd) -#define MAXMOVE() (Player.p_level * 1.5 + 1) -#define ILLMOVE() mvaddstr(5, 0, Illmove) -#define ILLSPELL() mvaddstr(5, 0, Illspell) -#define NOMANA() mvaddstr(5, 0, Nomana) -#define SOMEBETTER() addstr(Somebetter) -#define NOBETTER() mvaddstr(17, 0, Nobetter) diff --git a/games/phantasia/main.c b/games/phantasia/main.c deleted file mode 100644 index 8840bae..0000000 --- a/games/phantasia/main.c +++ /dev/null @@ -1,1303 +0,0 @@ -/* - * Phantasia 3.3.2 -- Interterminal fantasy game - * - * Edward A. Estes - * AT&T, March 12, 1986 - * - * $FreeBSD$ - */ - -/* DISCLAIMER: - * - * This game is distributed for free as is. It is not guaranteed to work - * in every conceivable environment. It is not even guaranteed to work - * in ANY environment. - * - * This game is distributed without notice of copyright, therefore it - * may be used in any manner the recipient sees fit. However, the - * author assumes no responsibility for maintaining or revising this - * game, in its original form, or any derivitives thereof. - * - * The author shall not be responsible for any loss, cost, or damage, - * including consequential damage, caused by reliance on this material. - * - * The author makes no warranties, express or implied, including warranties - * of merchantability or fitness for a particular purpose or use. - * - * AT&T is in no way connected with this game. - */ - -#include -#include -#include - -/* - * The program allocates as much file space as it needs to store characters, - * so the possibility exists for the character file to grow without bound. - * The file is purged upon normal entry to try to avoid that problem. - * A similar problem exists for energy voids. To alleviate the problem here, - * the void file is cleared with every new king, and a limit is placed - * on the size of the energy void file. - */ - -/* - * Put one line of text into the file 'motd' for announcements, etc. - */ - -/* - * The scoreboard file is updated when someone dies, and keeps track - * of the highest character to date for that login. - * Being purged from the character file does not cause the scoreboard - * to be updated. - */ - -/* - * All source files are set up for 'vi' with shiftwidth=4, tabstop=8. - */ - -/* */ - -/* - * main.c Main routines for Phantasia - */ - -#include "include.h" - -/*************************************************************************** -/ FUNCTION NAME: main() -/ -/ FUNCTION: initialize state, and call main process -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ int argc - argument count -/ char **argv - argument vector -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: monstlist(), checkenemy(), activelist(), -/ throneroom(), checkbattle(), readmessage(), changestats(), writerecord(), -/ tradingpost(), adjuststats(), recallplayer(), displaystats(), checktampered(), -/ fabs(), rollnewplayer(), time(), exit(), sqrt(), floor(), wmove(), -/ signal(), strcat(), purgeoldplayers(), getuid(), isatty(), wclear(), -/ strcpy(), system(), altercoordinates(), cleanup(), waddstr(), procmain(), -/ playinit(), leavegame(), localtime(), getanswer(), neatstuff(), initialstate(), -/ scorelist(), titlelist() -/ -/ GLOBAL INPUTS: *Login, Throne, Wizard, Player, *stdscr, Changed, Databuf[], -/ Fileloc, Stattable[] -/ -/ GLOBAL OUTPUTS: Wizard, Player, Changed, Fileloc, Timeout, *Statptr -/ -/ DESCRIPTION: -/ Process arguments, initialize program, and loop forever processing -/ player input. -/ -****************************************************************************/ - -main(argc, argv) -int argc; -char **argv; -{ -bool noheader = FALSE; /* set if don't want header */ -bool headeronly = FALSE; /* set if only want header */ -bool examine = FALSE; /* set if examine a character */ -time_t seconds; /* for time of day */ -double dtemp; /* for temporary calculations */ - - initialstate(); /* init globals */ - - /* process arguments */ - while (--argc && (*++argv)[0] == '-') - switch ((*argv)[1]) - { - case 's': /* short */ - noheader = TRUE; - break; - - case 'H': /* Header */ - headeronly = TRUE; - break; - - case 'a': /* all users */ - activelist(); - cleanup(TRUE); - /*NOTREACHED*/ - - case 'p': /* purge old players */ - purgeoldplayers(); - cleanup(TRUE); - /*NOTREACHED*/ - - case 'S': /* set 'Wizard' */ - Wizard = !getuid(); - break; - - case 'x': /* examine */ - examine = TRUE; - break; - - case 'm': /* monsters */ - monstlist(); - cleanup(TRUE); - /*NOTREACHED*/ - - case 'b': /* scoreboard */ - scorelist(); - cleanup(TRUE); - /*NOTREACHED*/ - } - - if (!isatty(0)) /* don't let non-tty's play */ - cleanup(TRUE); - /*NOTREACHED*/ - - playinit(); /* set up to catch signals, init curses */ - - if (examine) - { - changestats(FALSE); - cleanup(TRUE); - /*NOTREACHED*/ - } - - if (!noheader) - { - titlelist(); - purgeoldplayers(); /* clean up old characters */ - } - - if (headeronly) - cleanup(TRUE); - /*NOTREACHED*/ - - do - /* get the player structure filled */ - { - Fileloc = -1L; - - mvaddstr(22, 17, "Do you have a character to run [Q = Quit] ? "); - - switch (getanswer("NYQ", FALSE)) - { - case 'Y': - Fileloc = recallplayer(); - break; - - case 'Q': - cleanup(TRUE); - /*NOTREACHED*/ - - default: - Fileloc = rollnewplayer(); - break; - } - clear(); - } - while (Fileloc < 0L); - - if (Player.p_level > 5.0) - /* low level players have long timeout */ - Timeout = TRUE; - - /* update some important player statistics */ - strcpy(Player.p_login, Login); - time(&seconds); - Player.p_lastused = localtime(&seconds)->tm_yday; - Player.p_status = S_PLAYING; - writerecord(&Player, Fileloc); - - Statptr = &Stattable[Player.p_type]; /* initialize pointer */ - - /* catch interrupts */ -#ifdef BSD41 - sigset(SIGINT, interrupt); -#endif -#ifdef BSD42 - signal(SIGINT, interrupt); -#endif -#ifdef SYS3 - signal(SIGINT, interrupt); -#endif -#ifdef SYS5 - signal(SIGINT, interrupt); -#endif - - altercoordinates(Player.p_x, Player.p_y, A_FORCED); /* set some flags */ - - clear(); - - for (;;) - /* loop forever, processing input */ - { - - adjuststats(); /* cleanup stats */ - - if (Throne && Player.p_crowns == 0 && Player.p_specialtype != SC_KING) - /* not allowed on throne -- move */ - { - mvaddstr(5,0,"You're not allowed in the Lord's Chamber without a crown.\n"); - altercoordinates(0.0, 0.0, A_NEAR); - } - - checktampered(); /* check for energy voids, etc. */ - - if (Player.p_status != S_CLOAKED - /* not cloaked */ - && (dtemp = fabs(Player.p_x)) == fabs(Player.p_y) - /* |x| = |y| */ - && !Throne) - /* not on throne */ - { - dtemp = sqrt(dtemp / 100.0); - if (floor(dtemp) == dtemp) - /* |x| / 100 == n*n; at a trading post */ - { - tradingpost(); - clear(); - } - } - - checkbattle(); /* check for player to player battle */ - neatstuff(); /* gurus, medics, etc. */ - - if (Player.p_status == S_CLOAKED) - /* costs 3 mana per turn to be cloaked */ - if (Player.p_mana > 3.0) - Player.p_mana -= 3.0; - else - /* ran out of mana, uncloak */ - { - Player.p_status = S_PLAYING; - Changed = TRUE; - } - - if (Player.p_status != S_PLAYING && Player.p_status != S_CLOAKED) - /* change status back to S_PLAYING */ - { - Player.p_status = S_PLAYING; - Changed = TRUE; - } - - if (Changed) - /* update file only if important stuff has changed */ - { - writerecord(&Player, Fileloc); - Changed = FALSE; - continue; - } - - readmessage(); /* read message, if any */ - - displaystats(); /* print statistics */ - - move(6, 0); - - if (Throne) - /* maybe make king, print prompt, etc. */ - throneroom(); - - /* print status line */ - addstr("1:Move 2:Players 3:Talk 4:Stats 5:Quit "); - if (Player.p_level >= MEL_CLOAK && Player.p_magiclvl >= ML_CLOAK) - addstr("6:Cloak "); - if (Player.p_level >= MEL_TELEPORT && Player.p_magiclvl >= ML_TELEPORT) - addstr("7:Teleport "); - if (Player.p_specialtype >= SC_COUNCIL || Wizard) - addstr("8:Intervene "); - - procmain(); /* process input */ - } -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: initialstate() -/ -/ FUNCTION: initialize some important global variable -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: time(), fopen(), srandom(), error(), getuid(), getlogin(), -/ getpwuid() -/ -/ GLOBAL INPUTS: -/ -/ GLOBAL OUTPUTS: *Energyvoidfp, Echo, Marsh, *Login, Users, Beyond, -/ Throne, Wizard, Changed, Okcount, Timeout, Windows, *Monstfp, *Messagefp, -/ *Playersfp -/ -/ DESCRIPTION: -/ Set global flags, and open files which remain open. -/ -*************************************************************************/ - -initialstate() -{ - Beyond = FALSE; - Marsh = FALSE; - Throne = FALSE; - Changed = FALSE; - Wizard = FALSE; - Timeout = FALSE; - Users = 0; - Windows = FALSE; - Echo = TRUE; - - /* setup login name */ - if ((Login = getlogin()) == NULL) - Login = getpwuid(getuid())->pw_name; - - /* open some files */ - if ((Playersfp = fopen(_PATH_PEOPLE, "r+")) == NULL) - error(_PATH_PEOPLE); - /*NOTREACHED*/ - - if ((Monstfp = fopen(_PATH_MONST, "r+")) == NULL) - error(_PATH_MONST); - /*NOTREACHED*/ - - if ((Messagefp = fopen(_PATH_MESS, "r")) == NULL) - error(_PATH_MESS); - /*NOTREACHED*/ - - if ((Energyvoidfp = fopen(_PATH_VOID, "r+")) == NULL) - error(_PATH_VOID); - /*NOTREACHED*/ - - srandomdev(); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: rollnewplayer() -/ -/ FUNCTION: roll up a new character -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: initplayer(), allocrecord(), truncstring(), fabs(), wmove(), -/ wclear(), sscanf(), strcmp(), genchar(), waddstr(), findname(), mvprintw(), -/ getanswer(), getstring() -/ -/ GLOBAL INPUTS: Other, Wizard, Player, *stdscr, Databuf[] -/ -/ GLOBAL OUTPUTS: Echo -/ -/ DESCRIPTION: -/ Prompt player, and roll up new character. -/ -*************************************************************************/ - -long -rollnewplayer() -{ -int chartype; /* character type */ -int ch; /* input */ - - initplayer(&Player); /* initialize player structure */ - - clear(); - mvaddstr(4, 21, "Which type of character do you want:"); - mvaddstr(8, 4, "1:Magic User 2:Fighter 3:Elf 4:Dwarf 5:Halfling 6:Experimento "); - if (Wizard) { - addstr("7:Super ? "); - chartype = getanswer("1234567", FALSE); - } - else { - addstr("? "); - chartype = getanswer("123456", FALSE); - } - - do - { - genchar(chartype); /* roll up a character */ - - /* print out results */ - mvprintw(12, 14, - "Strength : %2.0f Quickness: %2.0f Mana : %2.0f\n", - Player.p_strength, Player.p_quickness, Player.p_mana); - mvprintw(13, 14, - "Energy Level: %2.0f Brains : %2.0f Magic Level: %2.0f\n", - Player.p_energy, Player.p_brains, Player.p_magiclvl); - - if (Player.p_type == C_EXPER || Player.p_type == C_SUPER) - break; - - mvaddstr(14, 14, "Type '1' to keep >"); - ch = getanswer(" ", TRUE); - } - while (ch != '1'); - - if (Player.p_type == C_EXPER || Player.p_type == C_SUPER) - /* get coordinates for experimento */ - for (;;) - { - mvaddstr(16, 0, "Enter the X Y coordinates of your experimento ? "); - getstring(Databuf, SZ_DATABUF); - sscanf(Databuf, "%lf %lf", &Player.p_x, &Player.p_y); - - if (fabs(Player.p_x) > D_EXPER || fabs(Player.p_y) > D_EXPER) - mvaddstr(17, 0, "Invalid coordinates. Try again.\n"); - else - break; - } - - for (;;) - /* name the new character */ - { - mvprintw(18, 0, - "Give your character a name [up to %d characters] ? ", SZ_NAME - 1); - getstring(Player.p_name, SZ_NAME); - truncstring(Player.p_name); /* remove trailing blanks */ - - if (Player.p_name[0] == '\0') - /* no null names */ - mvaddstr(19, 0, "Invalid name."); - else if (findname(Player.p_name, &Other) >= 0L) - /* cannot have duplicate names */ - mvaddstr(19, 0, "Name already in use."); - else - /* name is acceptable */ - break; - - addstr(" Pick another.\n"); - } - - /* get a password for character */ - Echo = FALSE; - - do - { - mvaddstr(20, 0, "Give your character a password [up to 8 characters] ? "); - getstring(Player.p_password, SZ_PASSWORD); - mvaddstr(21, 0, "One more time to verify ? "); - getstring(Databuf, SZ_PASSWORD); - } - while (strcmp(Player.p_password, Databuf) != 0); - - Echo = TRUE; - - return(allocrecord()); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: procmain() -/ -/ FUNCTION: process input from player -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: dotampered(), changestats(), inputoption(), allstatslist(), -/ fopen(), wmove(), drandom(), sscanf(), fclose(), altercoordinates(), -/ waddstr(), fprintf(), distance(), userlist(), leavegame(), encounter(), -/ getstring(), wclrtobot() -/ -/ GLOBAL INPUTS: Circle, Illcmd[], Throne, Wizard, Player, *stdscr, -/ Databuf[], Illmove[] -/ -/ GLOBAL OUTPUTS: Player, Changed -/ -/ DESCRIPTION: -/ Process main menu options. -/ -*************************************************************************/ - -procmain() -{ -int ch; /* input */ -double x; /* desired new x coordinate */ -double y; /* desired new y coordinate */ -double temp; /* for temporary calculations */ -FILE *fp; /* for opening files */ -int loop; /* a loop counter */ -bool hasmoved = FALSE; /* set if player has moved */ - - ch = inputoption(); - mvaddstr(4, 0, "\n\n"); /* clear status area */ - - move(7, 0); - clrtobot(); /* clear data on bottom area of screen */ - - if (Player.p_specialtype == SC_VALAR && (ch == '1' || ch == '7')) - /* valar cannot move */ - ch = ' '; - - switch (ch) - { - case 'K': /* move up/north */ - case 'N': - x = Player.p_x; - y = Player.p_y + MAXMOVE(); - hasmoved = TRUE; - break; - - case 'J': /* move down/south */ - case 'S': - x = Player.p_x; - y = Player.p_y - MAXMOVE(); - hasmoved = TRUE; - break; - - case 'L': /* move right/east */ - case 'E': - x = Player.p_x + MAXMOVE(); - y = Player.p_y; - hasmoved = TRUE; - break; - - case 'H': /* move left/west */ - case 'W': - x = Player.p_x - MAXMOVE(); - y = Player.p_y; - hasmoved = TRUE; - break; - - default: /* rest */ - Player.p_energy += (Player.p_maxenergy + Player.p_shield) / 15.0 - + Player.p_level / 3.0 + 2.0; - Player.p_energy = - MIN(Player.p_energy, Player.p_maxenergy + Player.p_shield); - - if (Player.p_status != S_CLOAKED) - /* cannot find mana if cloaked */ - { - Player.p_mana += (Circle + Player.p_level) / 4.0; - - if (drandom() < 0.2 && Player.p_status == S_PLAYING && !Throne) - /* wandering monster */ - encounter(-1); - } - break; - - case 'X': /* change/examine a character */ - changestats(TRUE); - break; - - case '1': /* move */ - for (loop = 3; loop; --loop) - { - mvaddstr(4, 0, "X Y Coordinates ? "); - getstring(Databuf, SZ_DATABUF); - - if (sscanf(Databuf, "%lf %lf", &x, &y) != 2) - mvaddstr(5, 0, "Try again\n"); - else if (distance(Player.p_x, x, Player.p_y, y) > MAXMOVE()) - ILLMOVE(); - else - { - hasmoved = TRUE; - break; - } - } - break; - - case '2': /* players */ - userlist(TRUE); - break; - - case '3': /* message */ - mvaddstr(4, 0, "Message ? "); - getstring(Databuf, SZ_DATABUF); - /* we open the file for writing to erase any data which is already there */ - fp = fopen(_PATH_MESS, "w"); - if (Databuf[0] != '\0') - fprintf(fp, "%s: %s", Player.p_name, Databuf); - fclose(fp); - break; - - case '4': /* stats */ - allstatslist(); - break; - - case '5': /* good-bye */ - leavegame(); - /*NOTREACHED*/ - - case '6': /* cloak */ - if (Player.p_level < MEL_CLOAK || Player.p_magiclvl < ML_CLOAK) - ILLCMD(); - else if (Player.p_status == S_CLOAKED) - Player.p_status = S_PLAYING; - else if (Player.p_mana < MM_CLOAK) - mvaddstr(5, 0, "No mana left.\n"); - else - { - Changed = TRUE; - Player.p_mana -= MM_CLOAK; - Player.p_status = S_CLOAKED; - } - break; - - case '7': /* teleport */ - /* - * conditions for teleport - * - 20 per (level plus magic level) - * - OR council of the wise or valar or ex-valar - * - OR transport from throne - * transports from throne cost no mana - */ - if (Player.p_level < MEL_TELEPORT || Player.p_magiclvl < ML_TELEPORT) - ILLCMD(); - else - for (loop = 3; loop; --loop) - { - mvaddstr(4, 0, "X Y Coordinates ? "); - getstring(Databuf, SZ_DATABUF); - - if (sscanf(Databuf, "%lf %lf", &x, &y) == 2) - { - temp = distance(Player.p_x, x, Player.p_y, y); - if (!Throne - /* can transport anywhere from throne */ - && Player.p_specialtype <= SC_COUNCIL - /* council, valar can transport anywhere */ - && temp > (Player.p_level + Player.p_magiclvl) * 20.0) - /* can only move 20 per exp. level + mag. level */ - ILLMOVE(); - else - { - temp = (temp / 75.0 + 1.0) * 20.0; /* mana used */ - - if (!Throne && temp > Player.p_mana) - mvaddstr(5, 0, "Not enough power for that distance.\n"); - else - { - if (!Throne) - Player.p_mana -= temp; - hasmoved = TRUE; - break; - } - } - } - } - break; - - case 'C': - case '9': /* monster */ - if (Throne) - /* no monsters while on throne */ - mvaddstr(5, 0, "No monsters in the chamber!\n"); - else if (Player.p_specialtype != SC_VALAR) - /* the valar cannot call monsters */ - { - Player.p_sin += 1e-6; - encounter(-1); - } - break; - - case '0': /* decree */ - if (Wizard || Player.p_specialtype == SC_KING && Throne) - /* kings must be on throne to decree */ - dotampered(); - else - ILLCMD(); - break; - - case '8': /* intervention */ - if (Wizard || Player.p_specialtype >= SC_COUNCIL) - dotampered(); - else - ILLCMD(); - break; - } - - if (hasmoved) - /* player has moved -- alter coordinates, and do random monster */ - { - altercoordinates(x, y, A_SPECIFIC); - - if (drandom() < 0.2 && Player.p_status == S_PLAYING && !Throne) - encounter(-1); - } -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: titlelist() -/ -/ FUNCTION: print title page -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: fread(), fseek(), fopen(), fgets(), wmove(), strcpy(), -/ fclose(), strlen(), waddstr(), sprintf(), wrefresh() -/ -/ GLOBAL INPUTS: Lines, Other, *stdscr, Databuf[], *Playersfp -/ -/ GLOBAL OUTPUTS: Lines -/ -/ DESCRIPTION: -/ Print important information about game, players, etc. -/ -*************************************************************************/ - -titlelist() -{ -FILE *fp; /* used for opening various files */ -bool councilfound = FALSE; /* set if we find a member of the council */ -bool kingfound = FALSE; /* set if we find a king */ -double hiexp, nxtexp; /* used for finding the two highest players */ -double hilvl, nxtlvl; /* used for finding the two highest players */ -char hiname[21], nxtname[21];/* used for finding the two highest players */ - - mvaddstr(0, 14, "W e l c o m e t o P h a n t a s i a (vers. 3.3.2)!"); - - /* print message of the day */ - if ((fp = fopen(_PATH_MOTD, "r")) != NULL - && fgets(Databuf, SZ_DATABUF, fp) != NULL) - { - mvaddstr(2, 40 - strlen(Databuf) / 2, Databuf); - fclose(fp); - } - - /* search for king */ - fseek(Playersfp, 0L, 0); - while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) - if (Other.p_specialtype == SC_KING && Other.p_status != S_NOTUSED) - /* found the king */ - { - sprintf(Databuf, "The present ruler is %s Level:%.0f", - Other.p_name, Other.p_level); - mvaddstr(4, 40 - strlen(Databuf) / 2, Databuf); - kingfound = TRUE; - break; - } - - if (!kingfound) - mvaddstr(4, 24, "There is no ruler at this time."); - - /* search for valar */ - fseek(Playersfp, 0L, 0); - while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) - if (Other.p_specialtype == SC_VALAR && Other.p_status != S_NOTUSED) - /* found the valar */ - { - sprintf(Databuf, "The Valar is %s Login: %s", Other.p_name, Other.p_login); - mvaddstr(6, 40 - strlen(Databuf) / 2 , Databuf); - break; - } - - /* search for council of the wise */ - fseek(Playersfp, 0L, 0); - Lines = 10; - while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) - if (Other.p_specialtype == SC_COUNCIL && Other.p_status != S_NOTUSED) - /* found a member of the council */ - { - if (!councilfound) - { - mvaddstr(8, 30, "Council of the Wise:"); - councilfound = TRUE; - } - - /* This assumes a finite (<=5) number of C.O.W.: */ - sprintf(Databuf, "%s Login: %s", Other.p_name, Other.p_login); - mvaddstr(Lines++, 40 - strlen(Databuf) / 2, Databuf); - } - - /* search for the two highest players */ - nxtname[0] = hiname[0] = '\0'; - hiexp = 0.0; - nxtlvl = hilvl = 0; - - fseek(Playersfp, 0L, 0); - while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) - if (Other.p_experience > hiexp && Other.p_specialtype <= SC_KING && Other.p_status != S_NOTUSED) - /* highest found so far */ - { - nxtexp = hiexp; - hiexp = Other.p_experience; - nxtlvl = hilvl; - hilvl = Other.p_level; - strcpy(nxtname, hiname); - strcpy(hiname, Other.p_name); - } - else if (Other.p_experience > nxtexp - && Other.p_specialtype <= SC_KING - && Other.p_status != S_NOTUSED) - /* next highest found so far */ - { - nxtexp = Other.p_experience; - nxtlvl = Other.p_level; - strcpy(nxtname, Other.p_name); - } - - mvaddstr(15, 28, "Highest characters are:"); - sprintf(Databuf, "%s Level:%.0f and %s Level:%.0f", - hiname, hilvl, nxtname, nxtlvl); - mvaddstr(17, 40 - strlen(Databuf) / 2, Databuf); - - /* print last to die */ - if ((fp = fopen(_PATH_LASTDEAD,"r")) != NULL - && fgets(Databuf, SZ_DATABUF, fp) != NULL) - { - mvaddstr(19, 25, "The last character to die was:"); - mvaddstr(20, 40 - strlen(Databuf) / 2,Databuf); - fclose(fp); - } - - refresh(); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: recallplayer() -/ -/ FUNCTION: find a character on file -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: writerecord(), truncstring(), more(), death(), wmove(), -/ wclear(), strcmp(), printw(), cleanup(), waddstr(), findname(), mvprintw(), -/ getanswer(), getstring() -/ -/ GLOBAL INPUTS: Player, *stdscr, Databuf[] -/ -/ GLOBAL OUTPUTS: Echo, Player -/ -/ DESCRIPTION: -/ Search for a character of a certain name, and check password. -/ -*************************************************************************/ - -long -recallplayer() -{ -long loc = 0L; /* location in player file */ -int loop; /* loop counter */ -int ch; /* input */ - - clear(); - mvprintw(10, 0, "What was your character's name ? "); - getstring(Databuf, SZ_NAME); - truncstring(Databuf); - - if ((loc = findname(Databuf, &Player)) >= 0L) - /* found character */ - { - Echo = FALSE; - - for (loop = 0; loop < 2; ++loop) - { - /* prompt for password */ - mvaddstr(11, 0, "Password ? "); - getstring(Databuf, SZ_PASSWORD); - if (strcmp(Databuf, Player.p_password) == 0) - /* password good */ - { - Echo = TRUE; - - if (Player.p_status != S_OFF) - /* player did not exit normally last time */ - { - clear(); - addstr("Your character did not exit normally last time.\n"); - addstr("If you think you have good cause to have your character saved,\n"); - printw("you may quit and mail your reason to 'root'.\n"); - addstr("Otherwise, continuing spells certain death.\n"); - addstr("Do you want to quit ? "); - ch = getanswer("YN", FALSE); - if (ch == 'Y') - { - Player.p_status = S_HUNGUP; - writerecord(&Player, loc); - cleanup(TRUE); - /*NOTREACHED*/ - } - death("Stupidity"); - /*NOTREACHED*/ - } - return(loc); - } - else - mvaddstr(12, 0, "No good.\n"); - } - - Echo = TRUE; - } - else - mvaddstr(11, 0, "Not found.\n"); - - more(13); - return(-1L); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: neatstuff() -/ -/ FUNCTION: do random stuff -/ -/ AUTHOR: E. A. Estes, 3/3/86 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: collecttaxes(), floor(), wmove(), drandom(), infloat(), -/ waddstr(), mvprintw(), getanswer() -/ -/ GLOBAL INPUTS: Player, *stdscr, *Statptr -/ -/ GLOBAL OUTPUTS: Player -/ -/ DESCRIPTION: -/ Handle gurus, medics, etc. -/ -*************************************************************************/ - -neatstuff() -{ -double temp; /* for temporary calculations */ -int ch; /* input */ - - switch ((int) ROLL(0.0, 100.0)) - { - case 1: - case 2: - if (Player.p_poison > 0.0) - { - mvaddstr(4, 0, "You've found a medic! How much will you offer to be cured ? "); - temp = floor(infloat()); - if (temp < 0.0 || temp > Player.p_gold) - /* negative gold, or more than available */ - { - mvaddstr(6, 0, "He was not amused, and made you worse.\n"); - Player.p_poison += 1.0; - } - else if (drandom() / 2.0 > (temp + 1.0) / MAX(Player.p_gold, 1)) - /* medic wants 1/2 of available gold */ - mvaddstr(5, 0, "Sorry, he wasn't interested.\n"); - else - { - mvaddstr(5, 0, "He accepted."); - Player.p_poison = MAX(0.0, Player.p_poison - 1.0); - Player.p_gold -= temp; - } - } - break; - - case 3: - mvaddstr(4, 0, "You've been caught raping and pillaging!\n"); - Player.p_experience += 4000.0; - Player.p_sin += 0.5; - break; - - case 4: - temp = ROLL(10.0, 75.0); - mvprintw(4, 0, "You've found %.0f gold pieces, want them ? ", temp); - ch = getanswer("NY", FALSE); - - if (ch == 'Y') - collecttaxes(temp, 0.0); - break; - - case 5: - if (Player.p_sin > 1.0) - { - mvaddstr(4, 0, "You've found a Holy Orb!\n"); - Player.p_sin -= 0.25; - } - break; - - case 6: - if (Player.p_poison < 1.0) - { - mvaddstr(4, 0, "You've been hit with a plague!\n"); - Player.p_poison += 1.0; - } - break; - - case 7: - mvaddstr(4, 0, "You've found some holy water.\n"); - ++Player.p_holywater; - break; - - case 8: - mvaddstr(4, 0, "You've met a Guru. . ."); - if (drandom() * Player.p_sin > 1.0) - addstr("You disgusted him with your sins!\n"); - else if (Player.p_poison > 0.0) - { - addstr("He looked kindly upon you, and cured you.\n"); - Player.p_poison = 0.0; - } - else - { - addstr("He rewarded you for your virtue.\n"); - Player.p_mana += 50.0; - Player.p_shield += 2.0; - } - break; - - case 9: - mvaddstr(4, 0, "You've found an amulet.\n"); - ++Player.p_amulets; - break; - - case 10: - if (Player.p_blindness) - { - mvaddstr(4, 0, "You've regained your sight!\n"); - Player.p_blindness = FALSE; - } - break; - - default: /* deal with poison */ - if (Player.p_poison > 0.0) - { - temp = Player.p_poison * Statptr->c_weakness - * Player.p_maxenergy / 600.0; - if (Player.p_energy > Player.p_maxenergy / 10.0 - && temp + 5.0 < Player.p_energy) - Player.p_energy -= temp; - } - break; - } -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: genchar() -/ -/ FUNCTION: generate a random character -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ int type - ASCII value of character type to generate -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: floor(), drandom() -/ -/ GLOBAL INPUTS: Wizard, Player, Stattable[] -/ -/ GLOBAL OUTPUTS: Player -/ -/ DESCRIPTION: -/ Use the lookup table for rolling stats. -/ -*************************************************************************/ - -genchar(type) -int type; -{ -int subscript; /* used for subscripting into Stattable */ -struct charstats *statptr;/* for pointing into Stattable */ - - subscript = type - '1'; - - if (subscript < C_MAGIC || subscript > C_EXPER) - if (subscript != C_SUPER || !Wizard) - /* fighter is default */ - subscript = C_FIGHTER; - - statptr = &Stattable[subscript]; - - Player.p_quickness = - ROLL(statptr->c_quickness.base, statptr->c_quickness.interval); - Player.p_strength = - ROLL(statptr->c_strength.base, statptr->c_strength.interval); - Player.p_mana = - ROLL(statptr->c_mana.base, statptr->c_mana.interval); - Player.p_maxenergy = - Player.p_energy = - ROLL(statptr->c_energy.base, statptr->c_energy.interval); - Player.p_brains = - ROLL(statptr->c_brains.base, statptr->c_brains.interval); - Player.p_magiclvl = - ROLL(statptr->c_magiclvl.base, statptr->c_magiclvl.interval); - - Player.p_type = subscript; - - if (Player.p_type == C_HALFLING) - /* give halfling some experience */ - Player.p_experience = ROLL(600.0, 200.0); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: playinit() -/ -/ FUNCTION: initialize for playing game -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: signal(), wclear(), noecho(), crmode(), initscr(), -/ wrefresh() -/ -/ GLOBAL INPUTS: *stdscr, ill_sig() -/ -/ GLOBAL OUTPUTS: Windows -/ -/ DESCRIPTION: -/ Catch a bunch of signals, and turn on curses stuff. -/ -*************************************************************************/ - -playinit() -{ - /* catch/ingnore signals */ - -#ifdef BSD41 - sigignore(SIGQUIT); - sigignore(SIGALRM); - sigignore(SIGTERM); - sigignore(SIGTSTP); - sigignore(SIGTTIN); - sigignore(SIGTTOU); - sighold(SIGINT); - sigset(SIGHUP, ill_sig); - sigset(SIGTRAP, ill_sig); - sigset(SIGIOT, ill_sig); - sigset(SIGEMT, ill_sig); - sigset(SIGFPE, ill_sig); - sigset(SIGBUS, ill_sig); - sigset(SIGSEGV, ill_sig); - sigset(SIGSYS, ill_sig); - sigset(SIGPIPE, ill_sig); -#endif -#ifdef BSD42 - signal(SIGQUIT, ill_sig); - signal(SIGALRM, SIG_IGN); - signal(SIGTERM, SIG_IGN); - signal(SIGTSTP, SIG_IGN); - signal(SIGTTIN, SIG_IGN); - signal(SIGTTOU, SIG_IGN); - signal(SIGINT, ill_sig); - signal(SIGHUP, SIG_DFL); - signal(SIGTRAP, ill_sig); - signal(SIGIOT, ill_sig); - signal(SIGEMT, ill_sig); - signal(SIGFPE, ill_sig); - signal(SIGBUS, ill_sig); - signal(SIGSEGV, ill_sig); - signal(SIGSYS, ill_sig); - signal(SIGPIPE, ill_sig); -#endif -#ifdef SYS3 - signal(SIGINT, SIG_IGN); - signal(SIGQUIT, SIG_IGN); - signal(SIGTERM, SIG_IGN); - signal(SIGALRM, SIG_IGN); - signal(SIGHUP, ill_sig); - signal(SIGTRAP, ill_sig); - signal(SIGIOT, ill_sig); - signal(SIGEMT, ill_sig); - signal(SIGFPE, ill_sig); - signal(SIGBUS, ill_sig); - signal(SIGSEGV, ill_sig); - signal(SIGSYS, ill_sig); - signal(SIGPIPE, ill_sig); -#endif -#ifdef SYS5 - signal(SIGINT, SIG_IGN); - signal(SIGQUIT, SIG_IGN); - signal(SIGTERM, SIG_IGN); - signal(SIGALRM, SIG_IGN); - signal(SIGHUP, ill_sig); - signal(SIGTRAP, ill_sig); - signal(SIGIOT, ill_sig); - signal(SIGEMT, ill_sig); - signal(SIGFPE, ill_sig); - signal(SIGBUS, ill_sig); - signal(SIGSEGV, ill_sig); - signal(SIGSYS, ill_sig); - signal(SIGPIPE, ill_sig); -#endif - - initscr(); /* turn on curses */ - noecho(); /* do not echo input */ - crmode(); /* do not process erase, kill */ - clear(); - refresh(); - Windows = TRUE; /* mark the state */ -} - -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: cleanup() -/ -/ FUNCTION: close some files, and maybe exit -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ bool doexit - exit flag -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: exit(), wmove(), fclose(), endwin(), nocrmode(), wrefresh() -/ -/ GLOBAL INPUTS: *Energyvoidfp, LINES, *stdscr, Windows, *Monstfp, -/ *Messagefp, *Playersfp -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Close all open files. If we are "in curses" terminate curses. -/ If 'doexit' is set, exit, otherwise return. -/ -*************************************************************************/ - -cleanup(doexit) -bool doexit; -{ - if (Windows) - { - move(LINES - 2, 0); - refresh(); - nocrmode(); - endwin(); - } - - if (Playersfp) { - fclose(Playersfp); - Playersfp = NULL; - } - if (Monstfp) { - fclose(Monstfp); - Monstfp = NULL; - } - if (Messagefp) { - fclose(Messagefp); - Messagefp = NULL; - } - if (Energyvoidfp) { - fclose(Energyvoidfp); - Energyvoidfp = NULL; - } - - if (doexit) - exit(0); - /*NOTREACHED*/ -} diff --git a/games/phantasia/map.c b/games/phantasia/map.c deleted file mode 100644 index be035df..0000000 --- a/games/phantasia/map.c +++ /dev/null @@ -1,160 +0,0 @@ -#define minusminus plusplus -#define minusplus plusminus - -main() -{ - /* Set up */ - - openpl(); - space(-1400, -1000, 1200, 1200); - - /* Big box */ - - move(-1400, -1000); - cont(-1400, 1000); - cont(600, 1000); - cont(600, -1000); - cont(-1400, -1000); - - /* Grid -- horizontal lines every 200 */ - - linemod("dotted"); - line(600, -800, -1400, -800); - line(-1400, -600, 600, -600); - line(600, -400, -1400, -400); - line(-1400, -200, 600, -200); - linemod("solid"); - line(600, 0, -1400, 0); - linemod("dotted"); - line(-1400, 200, 600, 200); - line(600, 400, -1400, 400); - line(-1400, 600, 600, 600); - line(600, 800, -1400, 800); - - /* Grid -- vertical lines every 200 */ - - line(-1200, 1000, -1200, -1000); - line(-1000, 1000, -1000, -1000); - line(-800, 1000, -800, -1000); - line(-600, 1000, -600, -1000); - linemod("solid"); - line(-400, 1000, -400, -1000); - linemod("dotted"); - line(-200, 1000, -200, -1000); - line(0, 1000, 0, -1000); - line(200, 1000, 200, -1000); - line(400, 1000, 400, -1000); - - /* Circles radius +250 on "center" */ - - linemod("solid"); - circle(-400, 0, 250); - circle(-400, 0, 500); - circle(-400, 0, 750); - circle(-400, 0, 1000); - - /* A few labels */ - - move(-670, 1075); - label("- THE PHANTASIA UNIVERSE -"); - line(-630, 1045, -115, 1045); - move(-360, 80); - label("Lorien"); - move(-385, -100); - label("Ithilien"); - move(-560, 80); - label("Rohan"); - move(-580, -100); - label("Anorien"); - plusplus("Rovanion", -250, 320); - plusplus("The Iron Hills", -100, 560); - plusplus("Rhun", 250, 570); - minusplus("Dunland", -700, 160); - minusplus("Eriador", -920, 300); - minusplus("The Northern Waste", -1240, 320); - minusminus("Gondor", -720, -180); - minusminus("South Gondor", -940, -270); - minusminus("Far Harad", -1100, -500); - plusminus("Mordor", -180, -300); - plusminus("Khand", 0, -500); - plusminus("Near Harad", 40, -780); - move(340, 900); - label("The Moors"); - move(300, 840); - label("Adventurous"); - move(340, -840); - label("The Moors"); - move(300, -900); - label("Adventurous"); - move(-1340, 900); - label("The Moors"); - move(-1340, 840); - label("Adventurous"); - move(-1340, -840); - label("The Moors"); - move(-1340, -900); - label("Adventurous"); - move(700, 1000); - label("OUTER CIRCLES:"); - line(690, 970, 1000, 970); - move(700, 900); - label("> 9: The Outer Waste"); - move(700, 800); - label("> 20: The Dead Marshes"); - move(700, 700); - label("> 35: Kennaquhair"); - move(700, 600); - label("> 55: Morannon"); - move(700, 300); - label("(0,0): The Lord's Chamber"); - - move(700, -400); - label("Grid squares are 100 x 100"); - move(700, -800); - label("Created by Ted Estes"); - move(700, -860); - label("Plotted by Chris Robertson"); - move(700, -920); - label(" c 1985"); - circle(723, -923, 20); - - /* Close down */ - - move(-1380, 1180); - closepl(); - exit(0); -} - -plusplus(s, x, y) /* draw strings in plus plus quadrant */ -char *s; -int x, y; -{ -char s1[2]; - - while (*s) - { - move(x, y); - s1[0] = *s++; - s1[1] = '\0'; - label(s1); - x += 25; - y -= 30; - } -} - -plusminus(s, x, y) /* draw strings in plus minus quadrant */ -char *s; -int x, y; -{ -char s1[2]; - - while (*s) - { - move(x, y); - s1[0] = *s++; - s1[1] = '\0'; - label(s1); - x += 25; - y += 30; - } -} diff --git a/games/phantasia/misc.c b/games/phantasia/misc.c deleted file mode 100644 index c103e08..0000000 --- a/games/phantasia/misc.c +++ /dev/null @@ -1,1708 +0,0 @@ -/* - * misc.c Phantasia miscellaneous support routines - * - * $FreeBSD$ - */ - -#include -#include "include.h" - - -/************************************************************************ -/ -/ FUNCTION NAME: movelevel() -/ -/ FUNCTION: move player to new level -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: death(), floor(), wmove(), drandom(), waddstr(), explevel() -/ -/ GLOBAL INPUTS: Player, *stdscr, *Statptr, Stattable[] -/ -/ GLOBAL OUTPUTS: Player, Changed -/ -/ DESCRIPTION: -/ Use lookup table to increment important statistics when -/ progressing to new experience level. -/ Players are rested to maximum as a bonus for making a new -/ level. -/ Check for council of wise, and being too big to be king. -/ -*************************************************************************/ - -movelevel() -{ -struct charstats *statptr; /* for pointing into Stattable */ -double new; /* new level */ -double inc; /* increment between new and old levels */ - - Changed = TRUE; - - if (Player.p_type == C_EXPER) - /* roll a type to use for increment */ - statptr = &Stattable[(int) ROLL(C_MAGIC, C_HALFLING - C_MAGIC + 1)]; - else - statptr = Statptr; - - new = explevel(Player.p_experience); - inc = new - Player.p_level; - Player.p_level = new; - - /* add increments to statistics */ - Player.p_strength += statptr->c_strength.increase * inc; - Player.p_mana += statptr->c_mana.increase * inc; - Player.p_brains += statptr->c_brains.increase * inc; - Player.p_magiclvl += statptr->c_magiclvl.increase * inc; - Player.p_maxenergy += statptr->c_energy.increase * inc; - - /* rest to maximum upon reaching new level */ - Player.p_energy = Player.p_maxenergy + Player.p_shield; - - if (Player.p_crowns > 0 && Player.p_level >= 1000.0) - /* no longer able to be king -- turn crowns into cash */ - { - Player.p_gold += ((double) Player.p_crowns) * 5000.0; - Player.p_crowns = 0; - } - - if (Player.p_level >= 3000.0 && Player.p_specialtype < SC_COUNCIL) - /* make a member of the council */ - { - mvaddstr(6, 0, "You have made it to the Council of the Wise.\n"); - addstr("Good Luck on your search for the Holy Grail.\n"); - - Player.p_specialtype = SC_COUNCIL; - - /* no rings for council and above */ - Player.p_ring.ring_type = R_NONE; - Player.p_ring.ring_duration = 0; - - Player.p_lives = 3; /* three extra lives */ - } - - if (Player.p_level > 9999.0 && Player.p_specialtype != SC_VALAR) - death("Old age"); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: descrlocation() -/ -/ FUNCTION: return a formatted description of location -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ struct player playerp - pointer to player structure -/ bool shortflag - set if short form is desired -/ -/ RETURN VALUE: pointer to string containing result -/ -/ MODULES CALLED: fabs(), floor(), sprintf(), distance() -/ -/ GLOBAL INPUTS: Databuf[] -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Look at coordinates and return an appropriately formatted -/ string. -/ -*************************************************************************/ - -char * -descrlocation(playerp, shortflag) -struct player *playerp; -bool shortflag; -{ -double circle; /* corresponding circle for coordinates */ -int quadrant; /* quandrant of grid */ -char *label; /* pointer to place name */ -static char *nametable[4][4] = /* names of places */ - { - "Anorien", "Ithilien", "Rohan", "Lorien", - "Gondor", "Mordor", "Dunland", "Rovanion", - "South Gondor", "Khand", "Eriador", "The Iron Hills", - "Far Harad", "Near Harad", "The Northern Waste", "Rhun" - }; - - if (playerp->p_specialtype == SC_VALAR) - return(" is in Valhala"); - else if ((circle = CIRCLE(playerp->p_x, playerp->p_y)) >= 1000.0) - { - if (MAX(fabs(playerp->p_x), fabs(playerp->p_y)) > D_BEYOND) - label = "The Point of No Return"; - else - label = "The Ashen Mountains"; - } - else if (circle >= 55) - label = "Morannon"; - else if (circle >= 35) - label = "Kennaquahair"; - else if (circle >= 20) - label = "The Dead Marshes"; - else if (circle >= 9) - label = "The Outer Waste"; - else if (circle >= 5) - label = "The Moors Adventurous"; - else - { - if (playerp->p_x == 0.0 && playerp->p_y == 0.0) - label = "The Lord's Chamber"; - else - { - /* this expression is split to prevent compiler loop with some compilers */ - quadrant = ((playerp->p_x > 0.0) ? 1 : 0); - quadrant += ((playerp->p_y >= 0.0) ? 2 : 0); - label = nametable[((int) circle) - 1][quadrant]; - } - } - - if (shortflag) - sprintf(Databuf, "%.29s", label); - else - sprintf(Databuf, " is in %s (%.0f,%.0f)", label, playerp->p_x, playerp->p_y); - - return(Databuf); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: tradingpost() -/ -/ FUNCTION: do trading post stuff -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: writerecord(), adjuststats(), fabs(), more(), sqrt(), -/ sleep(), floor(), wmove(), drandom(), wclear(), printw(), -/ altercoordinates(), infloat(), waddstr(), wrefresh(), mvprintw(), getanswer(), -/ wclrtoeol(), wclrtobot() -/ -/ GLOBAL INPUTS: Menu[], Circle, Player, *stdscr, Fileloc, Nobetter[] -/ -/ GLOBAL OUTPUTS: Player -/ -/ DESCRIPTION: -/ Different trading posts have different items. -/ Merchants cannot be cheated, but they can be dishonest -/ themselves. -/ -/ Shields, swords, and quicksilver are not cumulative. This is -/ one major area of complaint, but there are two reasons for this: -/ 1) It becomes MUCH too easy to make very large versions -/ of these items. -/ 2) In the real world, one cannot simply weld two swords -/ together to make a bigger one. -/ -/ At one time, it was possible to sell old weapons at half the purchase -/ price. This resulted in huge amounts of gold floating around, -/ and the game lost much of its challenge. -/ -/ Also, purchasing gems defeats the whole purpose of gold. Gold -/ is small change for lower level players. They really shouldn't -/ be able to accumulate more than enough gold for a small sword or -/ a few books. Higher level players shouldn't even bother to pick -/ up gold, except maybe to buy mana once in a while. -/ -*************************************************************************/ - -tradingpost() -{ -double numitems; /* number of items to purchase */ -double cost; /* cost of purchase */ -double blessingcost; /* cost of blessing */ -int ch; /* input */ -int size; /* size of the trading post */ -int loop; /* loop counter */ -int cheat = 0; /* number of times player has tried to cheat */ -bool dishonest = FALSE;/* set when merchant is dishonest */ - - Player.p_status = S_TRADING; - writerecord(&Player, Fileloc); - - clear(); - addstr("You are at a trading post. All purchases must be made with gold."); - - size = sqrt(fabs(Player.p_x / 100)) + 1; - size = MIN(7, size); - - /* set up cost of blessing */ - blessingcost = 1000.0 * (Player.p_level + 5.0); - - /* print Menu */ - move(7, 0); - for (loop = 0; loop < size; ++loop) - /* print Menu */ - { - if (loop == 6) - cost = blessingcost; - else - cost = Menu[loop].cost; - printw("(%d) %-12s: %6.0f\n", loop + 1, Menu[loop].item, cost); - } - - mvprintw(5, 0, "L:Leave P:Purchase S:Sell Gems ? "); - - for (;;) - { - adjuststats(); /* truncate any bad values */ - - /* print some important statistics */ - mvprintw(1, 0, "Gold: %9.0f Gems: %9.0f Level: %6.0f Charms: %6d\n", - Player.p_gold, Player.p_gems, Player.p_level, Player.p_charms); - printw("Shield: %9.0f Sword: %9.0f Quicksilver:%3.0f Blessed: %s\n", - Player.p_shield, Player.p_sword, Player.p_quksilver, - (Player.p_blessing ? " True" : "False")); - printw("Brains: %9.0f Mana: %9.0f", Player.p_brains, Player.p_mana); - - move(5, 36); - ch = getanswer("LPS", FALSE); - move(15, 0); - clrtobot(); - switch(ch) - { - case 'L': /* leave */ - case '\n': - altercoordinates(0.0, 0.0, A_NEAR); - return; - - case 'P': /* make purchase */ - mvaddstr(15, 0, "What what would you like to buy ? "); - ch = getanswer(" 1234567", FALSE); - move(15, 0); - clrtoeol(); - - if (ch - '0' > size) - addstr("Sorry, this merchant doesn't have that."); - else - switch (ch) - { - case '1': - printw("Mana is one per %.0f gold piece. How many do you want (%.0f max) ? ", - Menu[0].cost, floor(Player.p_gold / Menu[0].cost)); - cost = (numitems = floor(infloat())) * Menu[0].cost; - - if (cost > Player.p_gold || numitems < 0) - ++cheat; - else - { - cheat = 0; - Player.p_gold -= cost; - if (drandom() < 0.02) - dishonest = TRUE; - else - Player.p_mana += numitems; - } - break; - - case '2': - printw("Shields are %.0f per +1. How many do you want (%.0f max) ? ", - Menu[1].cost, floor(Player.p_gold / Menu[1].cost)); - cost = (numitems = floor(infloat())) * Menu[1].cost; - - if (numitems == 0.0) - break; - else if (cost > Player.p_gold || numitems < 0) - ++cheat; - else if (numitems < Player.p_shield) - NOBETTER(); - else - { - cheat = 0; - Player.p_gold -= cost; - if (drandom() < 0.02) - dishonest = TRUE; - else - Player.p_shield = numitems; - } - break; - - case '3': - printw("A book costs %.0f gp. How many do you want (%.0f max) ? ", - Menu[2].cost, floor(Player.p_gold / Menu[2].cost)); - cost = (numitems = floor(infloat())) * Menu[2].cost; - - if (cost > Player.p_gold || numitems < 0) - ++cheat; - else - { - cheat = 0; - Player.p_gold -= cost; - if (drandom() < 0.02) - dishonest = TRUE; - else if (drandom() * numitems > Player.p_level / 10.0 - && numitems != 1) - { - printw("\nYou blew your mind!\n"); - Player.p_brains /= 5; - } - else - { - Player.p_brains += floor(numitems) * ROLL(20, 8); - } - } - break; - - case '4': - printw("Swords are %.0f gp per +1. How many + do you want (%.0f max) ? ", - Menu[3].cost, floor(Player.p_gold / Menu[3].cost)); - cost = (numitems = floor(infloat())) * Menu[3].cost; - - if (numitems == 0.0) - break; - else if (cost > Player.p_gold || numitems < 0) - ++cheat; - else if (numitems < Player.p_sword) - NOBETTER(); - else - { - cheat = 0; - Player.p_gold -= cost; - if (drandom() < 0.02) - dishonest = TRUE; - else - Player.p_sword = numitems; - } - break; - - case '5': - printw("A charm costs %.0f gp. How many do you want (%.0f max) ? ", - Menu[4].cost, floor(Player.p_gold / Menu[4].cost)); - cost = (numitems = floor(infloat())) * Menu[4].cost; - - if (cost > Player.p_gold || numitems < 0) - ++cheat; - else - { - cheat = 0; - Player.p_gold -= cost; - if (drandom() < 0.02) - dishonest = TRUE; - else - Player.p_charms += numitems; - } - break; - - case '6': - printw("Quicksilver is %.0f gp per +1. How many + do you want (%.0f max) ? ", - Menu[5].cost, floor(Player.p_gold / Menu[5].cost)); - cost = (numitems = floor(infloat())) * Menu[5].cost; - - if (numitems == 0.0) - break; - else if (cost > Player.p_gold || numitems < 0) - ++cheat; - else if (numitems < Player.p_quksilver) - NOBETTER(); - else - { - cheat = 0; - Player.p_gold -= cost; - if (drandom() < 0.02) - dishonest = TRUE; - else - Player.p_quksilver = numitems; - } - break; - - case '7': - if (Player.p_blessing) - { - addstr("You already have a blessing."); - break; - } - - printw("A blessing requires a %.0f gp donation. Still want one ? ", blessingcost); - ch = getanswer("NY", FALSE); - - if (ch == 'Y') - { - if (Player.p_gold < blessingcost) - ++cheat; - else - { - cheat = 0; - Player.p_gold -= blessingcost; - if (drandom() < 0.02) - dishonest = TRUE; - else - Player.p_blessing = TRUE; - } - } - break; - } - break; - - case 'S': /* sell gems */ - mvprintw(15, 0, "A gem is worth %.0f gp. How many do you want to sell (%.0f max) ? ", - (double) N_GEMVALUE, Player.p_gems); - numitems = floor(infloat()); - - if (numitems > Player.p_gems || numitems < 0) - ++cheat; - else - { - cheat = 0; - Player.p_gems -= numitems; - Player.p_gold += numitems * N_GEMVALUE; - } - } - - if (cheat == 1) - mvaddstr(17, 0, "Come on, merchants aren't stupid. Stop cheating.\n"); - else if (cheat == 2) - { - mvaddstr(17, 0, "You had your chance. This merchant happens to be\n"); - printw("a %.0f level magic user, and you made %s mad!\n", - ROLL(Circle * 20.0, 40.0), (drandom() < 0.5) ? "him" : "her"); - altercoordinates(0.0, 0.0, A_FAR); - Player.p_energy /= 2.0; - ++Player.p_sin; - more(23); - return; - } - else if (dishonest) - { - mvaddstr(17, 0, "The merchant stole your money!"); - refresh(); - altercoordinates(Player.p_x - Player.p_x / 10.0, - Player.p_y - Player.p_y / 10.0, A_SPECIFIC); - sleep(2); - return; - } - } -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: displaystats() -/ -/ FUNCTION: print out important player statistics -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: descrstatus(), descrlocation(), mvprintw() -/ -/ GLOBAL INPUTS: Users, Player -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Important player statistics are printed on the screen. -/ -*************************************************************************/ - -displaystats() -{ - mvprintw(0, 0, "%s%s\n", Player.p_name, descrlocation(&Player, FALSE)); - mvprintw(1, 0, "Level :%7.0f Energy :%9.0f(%9.0f) Mana :%9.0f Users:%3d\n", - Player.p_level, Player.p_energy, Player.p_maxenergy + Player.p_shield, - Player.p_mana, Users); - mvprintw(2, 0, "Quick :%3.0f(%3.0f) Strength:%9.0f(%9.0f) Gold :%9.0f %s\n", - Player.p_speed, Player.p_quickness + Player.p_quksilver, Player.p_might, - Player.p_strength + Player.p_sword, Player.p_gold, descrstatus(&Player)); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: allstatslist() -/ -/ FUNCTION: show player items -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: mvprintw(), descrtype() -/ -/ GLOBAL INPUTS: Player -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Print out some player statistics of lesser importance. -/ -*************************************************************************/ - -allstatslist() -{ -static char *flags[] = /* to print value of some bools */ - { - "False", - " True" - }; - - mvprintw( 8, 0, "Type: %s\n", descrtype(&Player, FALSE)); - - mvprintw(10, 0, "Experience: %9.0f", Player.p_experience); - mvprintw(11, 0, "Brains : %9.0f", Player.p_brains); - mvprintw(12, 0, "Magic Lvl : %9.0f", Player.p_magiclvl); - mvprintw(13, 0, "Sin : %9.5f", Player.p_sin); - mvprintw(14, 0, "Poison : %9.5f", Player.p_poison); - mvprintw(15, 0, "Gems : %9.0f", Player.p_gems); - mvprintw(16, 0, "Age : %9d", Player.p_age); - mvprintw(10, 40, "Holy Water: %9d", Player.p_holywater); - mvprintw(11, 40, "Amulets : %9d", Player.p_amulets); - mvprintw(12, 40, "Charms : %9d", Player.p_charms); - mvprintw(13, 40, "Crowns : %9d", Player.p_crowns); - mvprintw(14, 40, "Shield : %9.0f", Player.p_shield); - mvprintw(15, 40, "Sword : %9.0f", Player.p_sword); - mvprintw(16, 40, "Quickslver: %9.0f", Player.p_quksilver); - - mvprintw(18, 0, "Blessing: %s Ring: %s Virgin: %s Palantir: %s", - flags[Player.p_blessing], flags[Player.p_ring.ring_type != R_NONE], - flags[Player.p_virgin], flags[Player.p_palantir]); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: descrtype() -/ -/ FUNCTION: return a string specifying player type -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ struct player playerp - pointer to structure for player -/ bool shortflag - set if short form is desired -/ -/ RETURN VALUE: pointer to string describing player type -/ -/ MODULES CALLED: strcpy() -/ -/ GLOBAL INPUTS: Databuf[] -/ -/ GLOBAL OUTPUTS: Databuf[] -/ -/ DESCRIPTION: -/ Return a string describing the player type. -/ King, council, valar, supercedes other types. -/ The first character of the string is '*' if the player -/ has a crown. -/ If 'shortflag' is TRUE, return a 3 character string. -/ -*************************************************************************/ - -char * -descrtype(playerp, shortflag) -struct player *playerp; -bool shortflag; -{ -int type; /* for caluculating result subscript */ -static char *results[] = /* description table */ - { - " Magic User", " MU", - " Fighter", " F ", - " Elf", " E ", - " Dwarf", " D ", - " Halfling", " H ", - " Experimento", " EX", - " Super", " S ", - " King", " K ", - " Council of Wise", " CW", - " Ex-Valar", " EV", - " Valar", " V ", - " ? ", " ? " - }; - - type = playerp->p_type; - - switch (playerp->p_specialtype) - { - case SC_NONE: - type = playerp->p_type; - break; - - case SC_KING: - type = 7; - break; - - case SC_COUNCIL: - type = 8; - break; - - case SC_EXVALAR: - type = 9; - break; - - case SC_VALAR: - type = 10; - break; - } - - type *= 2; /* calculate offset */ - - if (type > 20) - /* error */ - type = 22; - - if (shortflag) - /* use short descriptions */ - ++type; - - if (playerp->p_crowns > 0) - { - strcpy(Databuf, results[type]); - Databuf[0] = '*'; - return(Databuf); - } - else - return(results[type]); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: findname() -/ -/ FUNCTION: find location in player file of given name -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ char *name - name of character to look for -/ struct player *playerp - pointer of structure to fill -/ -/ RETURN VALUE: location of player if found, -1 otherwise -/ -/ MODULES CALLED: fread(), fseek(), strcmp() -/ -/ GLOBAL INPUTS: Wizard, *Playersfp -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Search the player file for the player of the given name. -/ If player is found, fill structure with player data. -/ -*************************************************************************/ - -long -findname(name, playerp) -char *name; -struct player *playerp; -{ -long loc = 0; /* location in the file */ - - fseek(Playersfp, 0L, 0); - while (fread((char *) playerp, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) - { - if (strcmp(playerp->p_name, name) == 0) - { - if (playerp->p_status != S_NOTUSED || Wizard) - /* found it */ - return(loc); - } - loc += SZ_PLAYERSTRUCT; - } - - return(-1); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: allocrecord() -/ -/ FUNCTION: find space in the player file for a new character -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: location of free space in file -/ -/ MODULES CALLED: initplayer(), writerecord(), fread(), fseek() -/ -/ GLOBAL INPUTS: Other, *Playersfp -/ -/ GLOBAL OUTPUTS: Player -/ -/ DESCRIPTION: -/ Search the player file for an unused entry. If none are found, -/ make one at the end of the file. -/ -*************************************************************************/ - -long -allocrecord() -{ -long loc = 0L; /* location in file */ - - fseek(Playersfp, 0L, 0); - while (fread((char *) &Other, SZ_PLAYERSTRUCT, 1, Playersfp) == 1) - { - if (Other.p_status == S_NOTUSED) - /* found an empty record */ - return(loc); - else - loc += SZ_PLAYERSTRUCT; - } - - /* make a new record */ - initplayer(&Other); - Player.p_status = S_OFF; - writerecord(&Other, loc); - - return(loc); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: freerecord() -/ -/ FUNCTION: free up a record on the player file -/ -/ AUTHOR: E. A. Estes, 2/7/86 -/ -/ ARGUMENTS: -/ struct player playerp - pointer to structure to free -/ long loc - location in file to free -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: writerecord() -/ -/ GLOBAL INPUTS: none -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Mark structure as not used, and update player file. -/ -*************************************************************************/ - -freerecord(playerp, loc) -struct player *playerp; -long loc; -{ - playerp->p_name[0] = CH_MARKDELETE; - playerp->p_status = S_NOTUSED; - writerecord(playerp, loc); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: leavegame() -/ -/ FUNCTION: leave game -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: freerecord(), writerecord(), cleanup() -/ -/ GLOBAL INPUTS: Player, Fileloc -/ -/ GLOBAL OUTPUTS: Player -/ -/ DESCRIPTION: -/ Mark player as inactive, and cleanup. -/ Do not save players below level 1. -/ -*************************************************************************/ - -leavegame() -{ - - if (Player.p_level < 1.0) - /* delete character */ - freerecord(&Player, Fileloc); - else - { - Player.p_status = S_OFF; - writerecord(&Player, Fileloc); - } - - cleanup(TRUE); - /*NOTREACHED*/ -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: death() -/ -/ FUNCTION: death routine -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ char *how - pointer to string describing cause of death -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: freerecord(), enterscore(), more(), exit(), fread(), -/ fseek(), execl(), fopen(), floor(), wmove(), drandom(), wclear(), strcmp(), -/ fwrite(), fflush(), printw(), strcpy(), fclose(), waddstr(), cleanup(), -/ fprintf(), wrefresh(), getanswer(), descrtype() -/ -/ GLOBAL INPUTS: Curmonster, Wizard, Player, *stdscr, Fileloc, *Monstfp -/ -/ GLOBAL OUTPUTS: Player -/ -/ DESCRIPTION: -/ Kill off current player. -/ Handle rings, and multiple lives. -/ Print an appropriate message. -/ Update scoreboard, lastdead, and let other players know about -/ the demise of their comrade. -/ -*************************************************************************/ - -death(how) -char *how; -{ -FILE *fp; /* for updating various files */ -int ch; /* input */ -static char *deathmesg[] = - /* add more messages here, if desired */ - { - "You have been wounded beyond repair. ", - "You have been disemboweled. ", - "You've been mashed, mauled, and spit upon. (You're dead.)\n", - "You died! ", - "You're a complete failure -- you've died!!\n", - "You have been dealt a fatal blow! " - }; - - clear(); - - if (strcmp(how, "Stupidity") != 0) - { - if (Player.p_level > 9999.0) - /* old age */ - addstr("Characters must be retired upon reaching level 10000. Sorry."); - else if (Player.p_lives > 0) - /* extra lives */ - { - addstr("You should be more cautious. You've been killed.\n"); - printw("You only have %d more chance(s).\n", --Player.p_lives); - more(3); - Player.p_energy = Player.p_maxenergy; - return; - } - else if (Player.p_specialtype == SC_VALAR) - { - addstr("You had your chances, but Valar aren't totally\n"); - addstr("immortal. You are now left to wither and die . . .\n"); - more(3); - Player.p_brains = Player.p_level / 25.0; - Player.p_energy = Player.p_maxenergy /= 5.0; - Player.p_quksilver = Player.p_sword = 0.0; - Player.p_specialtype = SC_COUNCIL; - return; - } - else if (Player.p_ring.ring_inuse && - (Player.p_ring.ring_type == R_DLREG || Player.p_ring.ring_type == R_NAZREG)) - /* good ring in use - saved from death */ - { - mvaddstr(4, 0, "Your ring saved you from death!\n"); - refresh(); - Player.p_ring.ring_type = R_NONE; - Player.p_energy = Player.p_maxenergy / 12.0 + 1.0; - if (Player.p_crowns > 0) - --Player.p_crowns; - return; - } - else if (Player.p_ring.ring_type == R_BAD - || Player.p_ring.ring_type == R_SPOILED) - /* bad ring in possession; name idiot after player */ - { - mvaddstr(4, 0, - "Your ring has taken control of you and turned you into a monster!\n"); - fseek(Monstfp, 13L * SZ_MONSTERSTRUCT, 0); - fread((char *) &Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp); - strcpy(Curmonster.m_name, Player.p_name); - fseek(Monstfp, 13L * SZ_MONSTERSTRUCT, 0); - fwrite((char *) &Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp); - fflush(Monstfp); - } - } - - enterscore(); /* update score board */ - - /* put info in last dead file */ - fp = fopen(_PATH_LASTDEAD, "w"); - fprintf(fp,"%s (%s, run by %s, level %.0f, killed by %s)", - Player.p_name, descrtype(&Player, TRUE), - Player.p_login, Player.p_level, how); - fclose(fp); - - /* let other players know */ - fp = fopen(_PATH_MESS, "w"); - fprintf(fp, "%s was killed by %s.", Player.p_name, how); - fclose(fp); - - freerecord(&Player, Fileloc); - - clear(); - move(10, 0); - addstr(deathmesg[(int) ROLL(0.0, (double) sizeof(deathmesg) / sizeof(char *))]); - addstr("Care to give it another try ? "); - ch = getanswer("NY", FALSE); - - if (ch == 'Y') - { - cleanup(FALSE); - execl(_PATH_GAMEPROG, "phantasia", "-s", - (Wizard ? "-S": (char *) NULL), (char *)0); - exit(0); - /*NOTREACHED*/ - } - - cleanup(TRUE); - /*NOTREACHED*/ -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: writerecord() -/ -/ FUNCTION: update structure in player file -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ struct player *playerp - pointer to structure to write out -/ long place - location in file to updata -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: fseek(), fwrite(), fflush() -/ -/ GLOBAL INPUTS: *Playersfp -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Update location in player file with given structure. -/ -*************************************************************************/ - -writerecord(playerp, place) -struct player *playerp; -long place; -{ - fseek(Playersfp, place, 0); - fwrite((char *) playerp, SZ_PLAYERSTRUCT, 1, Playersfp); - fflush(Playersfp); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: explevel() -/ -/ FUNCTION: calculate level based upon experience -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ double experience - experience to calculate experience level from -/ -/ RETURN VALUE: experience level -/ -/ MODULES CALLED: pow(), floor() -/ -/ GLOBAL INPUTS: none -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Experience level is a geometric progression. This has been finely -/ tuned over the years, and probably should not be changed. -/ -*************************************************************************/ - -double -explevel(experience) -double experience; -{ - if (experience < 1.1e7) - return(floor(pow((experience / 1000.0), 0.4875))); - else - return(floor(pow((experience / 1250.0), 0.4865))); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: truncstring() -/ -/ FUNCTION: truncate trailing blanks off a string -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ char *string - pointer to null terminated string -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: strlen() -/ -/ GLOBAL INPUTS: none -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Put nul characters in place of spaces at the end of the string. -/ -*************************************************************************/ - -truncstring(string) -char *string; -{ -int length; /* length of string */ - - length = strlen(string); - while (string[--length] == ' ') - string[length] = '\0'; -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: altercoordinates() -/ -/ FUNCTION: Alter x, y coordinates and set/check location flags -/ -/ AUTHOR: E. A. Estes, 12/16/85 -/ -/ ARGUMENTS: -/ double xnew, ynew - new x, y coordinates -/ int operation - operation to perform with coordinates -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: fabs(), floor(), drandom(), distance() -/ -/ GLOBAL INPUTS: Circle, Beyond, Player -/ -/ GLOBAL OUTPUTS: Marsh, Circle, Beyond, Throne, Player, Changed -/ -/ DESCRIPTION: -/ This module is called whenever the player's coordinates are altered. -/ If the player is beyond the point of no return, he/she is forced -/ to stay there. -/ -*************************************************************************/ - -altercoordinates(xnew, ynew, operation) -double xnew; -double ynew; -int operation; -{ - switch (operation) - { - case A_FORCED: /* move with no checks */ - break; - - case A_NEAR: /* pick random coordinates near */ - xnew = Player.p_x + ROLL(1.0, 5.0); - ynew = Player.p_y - ROLL(1.0, 5.0); - /* FALLTHROUGH for check */ - - case A_SPECIFIC: /* just move player */ - if (Beyond && fabs(xnew) < D_BEYOND && fabs(ynew) < D_BEYOND) - /* - * cannot move back from point of no return - * pick the largest coordinate to remain unchanged - */ - { - if (fabs(xnew) > fabs(ynew)) - xnew = SGN(Player.p_x) * MAX(fabs(Player.p_x), D_BEYOND); - else - ynew = SGN(Player.p_y) * MAX(fabs(Player.p_y), D_BEYOND); - } - break; - - case A_FAR: /* pick random coordinates far */ - xnew = Player.p_x + SGN(Player.p_x) * ROLL(50 * Circle, 250 * Circle); - ynew = Player.p_y + SGN(Player.p_y) * ROLL(50 * Circle, 250 * Circle); - break; - } - - /* now set location flags and adjust coordinates */ - Circle = CIRCLE(Player.p_x = floor(xnew), Player.p_y = floor(ynew)); - - /* set up flags based upon location */ - Throne = Marsh = Beyond = FALSE; - - if (Player.p_x == 0.0 && Player.p_y == 0.0) - Throne = TRUE; - else if (Circle < 35 && Circle >= 20) - Marsh = TRUE; - else if (MAX(fabs(Player.p_x), fabs(Player.p_y)) >= D_BEYOND) - Beyond = TRUE; - - Changed = TRUE; -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: readrecord() -/ -/ FUNCTION: read a player structure from file -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ struct player *playerp - pointer to structure to fill -/ int loc - location of record to read -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: fread(), fseek() -/ -/ GLOBAL INPUTS: *Playersfp -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Read structure information from player file. -/ -*************************************************************************/ - -readrecord(playerp, loc) -struct player *playerp; -long loc; -{ - fseek(Playersfp, loc, 0); - fread((char *) playerp, SZ_PLAYERSTRUCT, 1, Playersfp); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: adjuststats() -/ -/ FUNCTION: adjust player statistics -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: death(), floor(), drandom(), explevel(), movelevel() -/ -/ GLOBAL INPUTS: Player, *Statptr -/ -/ GLOBAL OUTPUTS: Circle, Player, Timeout -/ -/ DESCRIPTION: -/ Handle adjustment and maximums on various player characteristics. -/ -*************************************************************************/ - -adjuststats() -{ -double dtemp; /* for temporary calculations */ - - if (explevel(Player.p_experience) > Player.p_level) - /* move one or more levels */ - { - movelevel(); - if (Player.p_level > 5.0) - Timeout = TRUE; - } - - if (Player.p_specialtype == SC_VALAR) - /* valar */ - Circle = Player.p_level / 5.0; - - /* calculate effective quickness */ - dtemp = ((Player.p_gold + Player.p_gems / 2.0) - 1000.0) / Statptr->c_goldtote - - Player.p_level;; - dtemp = MAX(0.0, dtemp); /* gold slows player down */ - Player.p_speed = Player.p_quickness + Player.p_quksilver - dtemp; - - /* calculate effective strength */ - if (Player.p_poison > 0.0) - /* poison makes player weaker */ - { - dtemp = 1.0 - Player.p_poison * Statptr->c_weakness / 800.0; - dtemp = MAX(0.1, dtemp); - } - else - dtemp = 1.0; - Player.p_might = dtemp * Player.p_strength + Player.p_sword; - - /* insure that important things are within limits */ - Player.p_quksilver = MIN(99.0, Player.p_quksilver); - Player.p_mana = MIN(Player.p_mana, - Player.p_level * Statptr->c_maxmana + 1000.0); - Player.p_brains = MIN(Player.p_brains, - Player.p_level * Statptr->c_maxbrains + 200.0); - Player.p_charms = MIN(Player.p_charms, Player.p_level + 10.0); - - /* - * some implementations have problems with floating point compare - * we work around it with this stuff - */ - Player.p_gold = floor(Player.p_gold) + 0.1; - Player.p_gems = floor(Player.p_gems) + 0.1; - Player.p_mana = floor(Player.p_mana) + 0.1; - - if (Player.p_ring.ring_type != R_NONE) - /* do ring things */ - { - /* rest to max */ - Player.p_energy = Player.p_maxenergy + Player.p_shield; - - if (Player.p_ring.ring_duration <= 0) - /* clean up expired rings */ - switch (Player.p_ring.ring_type) - { - case R_BAD: /* ring drives player crazy */ - Player.p_ring.ring_type = R_SPOILED; - Player.p_ring.ring_duration = (short) ROLL(10.0, 25.0); - break; - - case R_NAZREG: /* ring disappears */ - Player.p_ring.ring_type = R_NONE; - break; - - case R_SPOILED: /* ring kills player */ - death("A cursed ring"); - break; - - case R_DLREG: /* this ring doesn't expire */ - Player.p_ring.ring_duration = 0; - break; - } - } - - if (Player.p_age / N_AGE > Player.p_degenerated) - /* age player slightly */ - { - ++Player.p_degenerated; - if (Player.p_quickness > 23.0) - Player.p_quickness *= 0.99; - Player.p_strength *= 0.97; - Player.p_brains *= 0.95; - Player.p_magiclvl *= 0.97; - Player.p_maxenergy *= 0.95; - Player.p_quksilver *= 0.95; - Player.p_sword *= 0.93; - Player.p_shield *= 0.93; - } -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: initplayer() -/ -/ FUNCTION: initialize a character -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ struct player *playerp - pointer to structure to init -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: floor(), drandom() -/ -/ GLOBAL INPUTS: none -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Put a bunch of default values in the given structure. -/ -*************************************************************************/ - -initplayer(playerp) -struct player *playerp; -{ - playerp->p_experience = - playerp->p_level = - playerp->p_strength = - playerp->p_sword = - playerp->p_might = - playerp->p_energy = - playerp->p_maxenergy = - playerp->p_shield = - playerp->p_quickness = - playerp->p_quksilver = - playerp->p_speed = - playerp->p_magiclvl = - playerp->p_mana = - playerp->p_brains = - playerp->p_poison = - playerp->p_gems = - playerp->p_sin = - playerp->p_1scratch = - playerp->p_2scratch = 0.0; - - playerp->p_gold = ROLL(50.0, 75.0) + 0.1; /* give some gold */ - - playerp->p_x = ROLL(-125.0, 251.0); - playerp->p_y = ROLL(-125.0, 251.0); /* give random x, y */ - - /* clear ring */ - playerp->p_ring.ring_type = R_NONE; - playerp->p_ring.ring_duration = 0; - playerp->p_ring.ring_inuse = FALSE; - - playerp->p_age = 0L; - - playerp->p_degenerated = 1; /* don't degenerate initially */ - - playerp->p_type = C_FIGHTER; /* default */ - playerp->p_specialtype = SC_NONE; - playerp->p_lives = - playerp->p_crowns = - playerp->p_charms = - playerp->p_amulets = - playerp->p_holywater = - playerp->p_lastused = 0; - playerp->p_status = S_NOTUSED; - playerp->p_tampered = T_OFF; - playerp->p_istat = I_OFF; - - playerp->p_palantir = - playerp->p_blessing = - playerp->p_virgin = - playerp->p_blindness = FALSE; - - playerp->p_name[0] = - playerp->p_password[0] = - playerp->p_login[0] = '\0'; -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: readmessage() -/ -/ FUNCTION: read message from other players -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: fseek(), fgets(), wmove(), waddstr(), wclrtoeol() -/ -/ GLOBAL INPUTS: *stdscr, Databuf[], *Messagefp -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ If there is a message from other players, print it. -/ -*************************************************************************/ - -readmessage() -{ - move(3, 0); - clrtoeol(); - fseek(Messagefp, 0L, 0); - if (fgets(Databuf, SZ_DATABUF, Messagefp) != NULL) - addstr(Databuf); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: error() -/ -/ FUNCTION: process evironment error -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ char *whichfile - pointer to name of file which caused error -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: wclear(), cleanup() -/ -/ GLOBAL INPUTS: errno, *stdscr, printw(), printf(), Windows -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Print message about offending file, and exit. -/ -*************************************************************************/ - -error(whichfile) - char *whichfile; -{ - int (*funcp)(const char *, ...); - - if (Windows) - { - funcp = printw; - clear(); - } - else - funcp = printf; - - (*funcp)("An unrecoverable error has occurred reading %s. (errno = %d)\n", whichfile, errno); - (*funcp)("Please run 'setup' to determine the problem.\n"); - cleanup(TRUE); - /*NOTREACHED*/ -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: distance() -/ -/ FUNCTION: calculate distance between two points -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ double x1, y1 - x, y coordinates of first point -/ double x2, y2 - x, y coordinates of second point -/ -/ RETURN VALUE: distance between the two points -/ -/ MODULES CALLED: sqrt() -/ -/ GLOBAL INPUTS: none -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ This function is provided because someone's hypot() library function -/ fails if x1 == x2 && y1 == y2. -/ -*************************************************************************/ - -double -distance(x1, x2, y1, y2) -double x1, x2, y1, y2; -{ -double deltax, deltay; - - deltax = x1 - x2; - deltay = y1 - y2; - return(sqrt(deltax * deltax + deltay * deltay)); -} - -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: ill_sig() -/ -/ FUNCTION: exit upon trapping an illegal signal -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ int whichsig - signal which occured to cause jump to here -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: wclear(), printw(), cleanup() -/ -/ GLOBAL INPUTS: *stdscr -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ When an illegal signal is caught, print a message, and cleanup. -/ -*************************************************************************/ - -ill_sig(whichsig) -int whichsig; -{ - clear(); - if (!(whichsig == SIGINT || whichsig == SIGQUIT)) - printw("Error: caught signal # %d.\n", whichsig); - cleanup(TRUE); - /*NOTREACHED*/ -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: descrstatus() -/ -/ FUNCTION: return a string describing the player status -/ -/ AUTHOR: E. A. Estes, 3/3/86 -/ -/ ARGUMENTS: -/ struct player playerp - pointer to player structure to describe -/ -/ RETURN VALUE: string describing player's status -/ -/ MODULES CALLED: none -/ -/ GLOBAL INPUTS: none -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Return verbal description of player status. -/ If player status is S_PLAYING, check for low energy and blindness. -/ -*************************************************************************/ - -char * -descrstatus(playerp) -struct player *playerp; -{ - switch (playerp->p_status) - { - case S_PLAYING: - if (playerp->p_energy < 0.2 * (playerp->p_maxenergy + playerp->p_shield)) - return("Low Energy"); - else if (playerp->p_blindness) - return("Blind"); - else - return("In game"); - - case S_CLOAKED: - return("Cloaked"); - - case S_INBATTLE: - return("In Battle"); - - case S_MONSTER: - return("Encounter"); - - case S_TRADING: - return("Trading"); - - case S_OFF: - return("Off"); - - case S_HUNGUP: - return("Hung up"); - - default: - return(""); - } -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: drandom() -/ -/ FUNCTION: return a random floating point number from 0.0 < 1.0 -/ -/ AUTHOR: E. A. Estes, 2/7/86 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: random() -/ -/ GLOBAL INPUTS: none -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Convert random integer from library routine into a floating -/ point number, and divide by the largest possible random number. -/ We mask large integers with 32767 to handle sites that return -/ 31 bit random integers. -/ -*************************************************************************/ - -double -drandom() -{ - if (sizeof(int) != 2) - /* use only low bits */ - return((double) (random() & 0x7fff) / 32768.0); - else - return((double) random() / 32768.0); -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: collecttaxes() -/ -/ FUNCTION: collect taxes from current player -/ -/ AUTHOR: E. A. Estes, 2/7/86 -/ -/ ARGUMENTS: -/ double gold - amount of gold to tax -/ double gems - amount of gems to tax -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: fread(), fseek(), fopen(), floor(), fwrite(), fclose() -/ -/ GLOBAL INPUTS: Player -/ -/ GLOBAL OUTPUTS: Player -/ -/ DESCRIPTION: -/ Pay taxes on gold and gems. If the player does not have enough -/ gold to pay taxes on the added gems, convert some gems to gold. -/ Add taxes to tax data base; add remaining gold and gems to -/ player's cache. -/ -*************************************************************************/ - -collecttaxes(gold, gems) -double gold; -double gems; -{ -FILE *fp; /* to update Goldfile */ -double dtemp; /* for temporary calculations */ -double taxes; /* tax liability */ - - /* add to cache */ - Player.p_gold += gold; - Player.p_gems += gems; - - /* calculate tax liability */ - taxes = N_TAXAMOUNT / 100.0 * (N_GEMVALUE * gems + gold); - - if (Player.p_gold < taxes) - /* not enough gold to pay taxes, must convert some gems to gold */ - { - dtemp = floor(taxes / N_GEMVALUE + 1.0); /* number of gems to convert */ - - if (Player.p_gems >= dtemp) - /* player has enough to convert */ - { - Player.p_gems -= dtemp; - Player.p_gold += dtemp * N_GEMVALUE; - } - else - /* take everything; this should never happen */ - { - Player.p_gold += Player.p_gems * N_GEMVALUE; - Player.p_gems = 0.0; - taxes = Player.p_gold; - } - } - - Player.p_gold -= taxes; - - if ((fp = fopen(_PATH_GOLD, "r+")) != NULL) - /* update taxes */ - { - dtemp = 0.0; - fread((char *) &dtemp, sizeof(double), 1, fp); - dtemp += floor(taxes); - fseek(fp, 0L, 0); - fwrite((char *) &dtemp, sizeof(double), 1, fp); - fclose(fp); - } -} diff --git a/games/phantasia/monsters.asc b/games/phantasia/monsters.asc deleted file mode 100644 index 3d426a9..0000000 --- a/games/phantasia/monsters.asc +++ /dev/null @@ -1,100 +0,0 @@ -A Water Leaper 12 14 16 24 59 0 0 62 -A Leech 4 19 29 30 66 0 0 73 -An Urisk 13 30 15 46 127 1 0 3 -Shellycoat 28 21 18 63 226 2 0 0 -A Naiad 21 62 27 58 378 2 0 11 -A Nixie 22 58 28 108 604 3 0 6 -A Glaistig 21 106 25 127 1002 3 0 0 -A Mermaid 18 116 22 108 809 3 0 0 -A Merman 24 115 23 109 808 4 0 0 -A Siren 22 128 31 89 915 4 0 24 -A Lamprey 14 67 33 156 1562 4 15 37 -A Kopoacinth 26 36 26 206 2006 5 0 20 -A Kelpie 61 25 24 223 4025 5 0 0 -An Aspidchelone 114 104 19 898 10041 7 0 2 -An Idiot 13 14 16 28 49 0 0 0 -Some Green Slime 1 5 45 100 57 0 0 26 -A Pixie 11 29 23 26 64 0 0 32 -A Serpent 10 18 25 25 79 0 0 10 -A Cluricaun 12 27 20 30 81 0 14 5 -An Imp 22 30 14 40 92 0 0 1 -A Centipede 3 8 18 15 33 0 0 61 -A Beetle 2 11 21 26 44 0 0 48 -A Fir Darrig 18 22 17 35 107 0 14 1 -Modnar 15 23 20 40 101 7 2 12 -A Gnome 7 45 26 23 111 0 0 21 -A Sprite 9 37 25 31 132 1 0 43 -A Mimic 11 55 29 47 213 1 3 2 -A Kobold 13 10 14 21 121 1 12 68 -A Spider 6 11 28 28 124 1 0 57 -An Uldra 14 37 21 32 93 1 0 6 -A Gnoll 20 25 15 40 166 1 0 61 -A Bogie 23 28 19 57 189 1 0 57 -A Fachan 9 40 15 45 139 1 14 10 -A Moron 3 1 10 10 28 0 0 100 -An Orc 25 13 16 26 141 1 0 92 -A Ghillie Dhu 12 16 13 28 104 2 14 2 -A Bogle 19 15 16 35 157 2 14 15 -A Shrieker 2 62 27 9 213 2 16 0 -A Carrion Crawler 12 20 20 65 142 2 0 42 -A Trow 15 17 23 51 136 2 0 36 -A Warg 20 10 17 45 152 2 0 88 -A Stirge 2 6 35 25 153 2 0 95 -A Crebain 5 11 31 31 82 2 0 81 -A Killmoulis 30 19 8 75 175 3 14 22 -A Hob-goblin 35 20 15 72 246 3 0 18 -A Unicorn 27 57 27 57 627 3 1 0 -A Fenoderee 16 6 21 65 222 3 0 42 -An Ogre 42 14 16 115 409 3 0 19 -A Dodo 62 12 11 76 563 3 0 3 -A Hydra 14 27 33 99 599 3 0 27 -A Hamadryad 23 47 26 62 426 3 0 12 -A Bwca 21 17 19 55 387 3 14 1 -An Owlbear 35 16 18 100 623 4 0 22 -Black Annis 37 52 15 65 786 4 0 2 -A Jello Blob 100 25 7 264 1257 4 0 13 -A Jubjub Bird 45 23 12 114 1191 4 0 0 -A Wichtlein 13 40 25 61 800 4 0 8 -A Cocodrill 39 28 24 206 1438 4 0 38 -A Troll 75 12 20 185 1013 4 24 29 -A Bonnacon 89 26 9 255 1661 4 17 14 -A Gargoyle 22 21 29 200 1753 5 0 7 -A Chaladrius 8 49 37 172 1929 5 0 20 -A Gwyllion 27 73 20 65 1888 5 0 4 -A Cinomulgus 23 2 10 199 263 5 0 18 -A Peridexion 26 32 24 98 1300 5 0 2 -Smeagol 41 33 27 373 2487 5 18 0 -A Wraith 52 102 22 200 3112 5 25 13 -A Snotgurgle 143 19 26 525 4752 6 0 3 -A Phooka 42 63 21 300 4125 5 0 12 -A Vortex 101 30 31 500 6992 6 9 4 -Shelob 147 64 28 628 5003 7 13 0 -A Thaumaturgist 35 200 23 400 7628 6 7 0 -Smaug 251 76 26 1022 9877 7 0 0 -A Cold-drake 301 102 24 1222 10888 7 0 0 -A Red Dragon 342 141 23 1299 11649 8 0 0 -Scatha the Worm 406 208 20 1790 11999 8 0 0 -Tiamat 506 381 29 2000 13001 9 11 0 -A Bandersnatch 105 98 22 450 7981 6 0 3 -A Harpy 103 49 24 263 7582 6 0 2 -A Tigris 182 38 17 809 7777 6 0 3 -A Gryphon 201 45 19 813 8888 7 0 1 -A Coblynau 205 46 18 585 8333 6 0 2 -A Chimaera 173 109 28 947 12006 7 0 0 -A Jack-in-Irons 222 36 12 1000 9119 7 0 0 -Saruman 55 373 17 1500 17101 11 6 0 -A Balrog 500 100 25 705 8103 7 8 0 -Argus 201 87 14 1500 10010 8 0 0 -A Titan 302 1483 12 1625 11011 8 0 0 -Cacus 256 43 19 1750 12012 8 0 0 -Begion 403 154 10 1875 13013 8 0 0 -Grendel 197 262 23 2000 14014 8 0 0 -A Nazgul 250 251 26 1011 9988 12 10 9 -A Succubus 186 1049 27 2007 19984 9 19 0 -Red Cap 143 50 35 1965 23456 9 0 0 -A Nuckelavee 300 75 20 2185 11111 8 0 0 -Cerberus 236 96 29 2600 25862 9 20 0 -A Jabberwock 185 136 25 2265 23256 9 22 0 -Ungoliant 399 2398 37 2784 27849 10 21 0 -Leanan-Sidhe 486 5432 46 3000 30004 9 5 0 -The Dark Lord 9999 9999 31 19999 30005 13 4 0 diff --git a/games/phantasia/pathnames.h b/games/phantasia/pathnames.h deleted file mode 100644 index cce5475..0000000 --- a/games/phantasia/pathnames.h +++ /dev/null @@ -1,52 +0,0 @@ -/*- - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)pathnames.h 8.2 (Berkeley) 4/2/94 - */ - -#define _PATH_GAMEPROG "/usr/games/phantasia" -#define _PATH_GOLD "/var/games/phantasia/gold" -#define _PATH_LASTDEAD "/var/games/phantasia/lastdead" -#define _PATH_MESS "/var/games/phantasia/mess" -#define _PATH_MONST "/var/games/phantasia/monsters" -#define _PATH_MOTD "/var/games/phantasia/motd" -#define _PATH_PEOPLE "/var/games/phantasia/characs" -#define _PATH_SCORE "/var/games/phantasia/scoreboard" -#define _PATH_VOID "/var/games/phantasia/void" -#define _SPATH_GOLD "gold" -#define _SPATH_LASTDEAD "lastdead" -#define _SPATH_MESS "mess" -#define _SPATH_MONST "monsters" -#define _SPATH_MOTD "motd" -#define _SPATH_PEOPLE "characs" -#define _SPATH_SCORE "scoreboard" -#define _SPATH_VOID "void" diff --git a/games/phantasia/phantasia.6 b/games/phantasia/phantasia.6 deleted file mode 100644 index ceae5a9..0000000 --- a/games/phantasia/phantasia.6 +++ /dev/null @@ -1,1225 +0,0 @@ -.\" $FreeBSD$ -.\" -.de sh -.br -.ne 5 -.PP -\fB\\$1\fR -.PP -.. -.TH PHANTASIA 6 "June 1, 1994" -.UC 4 -.SH NAME -phantasia \- an interterminal fantasy game -.SH SYNOPSIS -phantasia [ \-HSabmpsx ] -.SH DESCRIPTION -.I Phantasia -is a role playing game -which allows players to roll up characters of various types to fight -monsters and other players. -Progression of characters is based upon gaining experience from fighting -monsters (and other players). -.PP -Most of the game is menu driven and self-explanatory (more or less). -The screen is cursor updated, so be sure to set up the -.B TERM -variable in your environment. -.PP -The options provide for a variety of functions to support the game. -They are: -.PP -.TP .5i -.B \-s -Invokes -.I phantasia -without header information. -.TP .5i -.B \-m -Get a monster listing. -.TP .5i -.B \-a -Get a listing of all character names on file. -.TP .5i -.B \-x -Examine/change a particular character on file. -.TP .5i -.B \-H -Print header only. -.TP .5i -.B \-p -Purge old characters. -.TP .5i -.B \-b -Show scoreboard of top characters per login. -.TP .5i -.B \-S -Turn on wizard options, if allowed, if running as ``root''. -.PP -The characters are saved on a common file, in order to make the game -interactive between players. The characters are given a password -in order to retrieve them later. Only characters above -.B level -zero are saved. Characters unused for awhile will be purged. -Characters are only placed on the scoreboard when they die. -.SH AUTHOR -Edward Estes, AT&T Information Systems, Skokie, IL -.SH PARTICULARS -.sh "Normal Play" -A number of the player's more important statistics are almost always -displayed on the screen, with maximums (where applicable) in -parentheses. -.PP -The character is placed randomly near the center of a cartesian -system. -Most commands are selected with a single letter or digit. -For example, one may move by hitting 'W', 'S', 'N', or 'E', -(lower case may also be used, at no time is the game case dependent). -One may also use 'H', 'J', 'K', 'L', -for movement, similar to -.IR vi (1). -To move to a specific (x, y) coordinate, use the -.B move -('1') command. The distance a character can move is calculated by -1 plus 1.5 per -.B level. -Moving in a compass direction will move the player the maximum -allowed distance in that direction. -.PP -A player may see who else is playing by using the -.B players -('2') option. One may see the coordinates of those who are the same -distance or closer to the origin as he/she. -.B Kings, -and -.B council of the wise -can see and can be seen by everyone. A -.B palantir -removes these restrictions. -.PP -One can talk to other players with the -.B talk -('3') option. In general, this is a line or so of text. To remove a current -message, just type when prompted for a message. -.PP -The -.B stats -('4') option shows additional characteristics of a player. -.PP -One may leave the game either with the -.B quit -('5') option. -.PP -One may rest by default. Resting lets one regain maximum -.B energy level, -and also lets one find -.B mana -(more is found for larger levels and further distances from the origin). -.PP -One may call a monster by hitting '9' or 'C'. -.PP -Use 'X' to examine other players. -.PP -One may quit or execute a sub-shell by hitting interrupt. -Quitting during battle results in death for obvious reasons. -.PP -Several other options become available as the player progresses in -.B level -and -.B magic, -or to other stations in the game ( -.B valar, council of the wise, king -). -These are described elsewhere. -In general, a control-L will force the redrawing of the screen. -.PP -Other things which may happen are more or less self-explanatory. -.sh "Fighting Monsters" -A player has several options while fighting monsters. They are as follows: -.TP 1.5i -.B melee -Inflicts damage on the monster, based upon -.B strength. -Also decreases the monster's -.B strength -some. -.TP 1.5i -.B skirmish -Inflicts a little less damage than -.B melee, -but decreases the monster's -.B quickness -instead. -.TP 1.5i -.B evade -Attempt to run away. Success is based upon both the player's and -the monster's -.B brains -and -.B quickness. -.TP 1.5i -.B spell -Several options for throwing spells (described elsewhere). -.TP 1.5i -.B nick -Hits the monster one plus the player's -.B sword, -and gives the player 10% of the monster's -.B experience. -Decreases the monster's -.B experience -an amount proportional to the amount granted. -This also increases the monster's quickness. -Paralyzed monsters wake up very fast when nicked. -.TP 1.5i -.B luckout -This is essentially a battle of wits with the monster. Success is based -upon the player's and the monster's -.B brains. -The player gets credit for slaying the monster if he/she succeeds. -Otherwise, nothing happens, and the chance to -.B luckout -is lost. -.sh "Character Statistics" -.TP 1.5i -.B strength -determines how much damage a character can inflict. -.TP 1.5i -.B quickness -determines how many chances a character gets to make decisions while -fighting. -.TP 1.5i -.B energy level -specifies how much damage a character may endure before dying. -.TP 1.5i -.B magic level -determines which spells a character may throw, and how effective those -spells will be. -.TP 1.5i -.B brains -basically, the character's intelligence; used for various fighting options -and spells. -.TP 1.5i -.B mana -used as a power source for throwing spells. -.TP 1.5i -.B experience -gained by fighting monsters and other characters. -.TP 1.5i -.B level -indicative of how much experience a character has accumulated; progresses -geometrically as -.B experience -increases. -.TP 1.5i -.B poison -sickness which degrades a character's performance (affects -.B energy level -and -.B strength -). -.TP 1.5i -.B sin -accumulated as a character does certain nasty things; used only rarely -in normal play of the game. -.TP 1.5i -.B age -of player; roughly equivalent to number of turns. -As -.B age -increases, many personal statistics degenerate. -.sh "Character Types" -Character statistics are rolled randomly from the above list, according -to character type. The types are as follows: -.TP 1.5i -.B magic user -strong in -.B magic level -and -.B brains -, weak in other areas. Must rely on wits and magic to survive. -.TP 1.5i -.B fighter -good in -.B strength -and -.B energy level -, fairly good in other areas. This adds up to a well-equipped fighter. -.TP 1.5i -.B elf -very high -.B quickness -and above average -.B magic level -are -.B elves -selling points. -.TP 1.5i -.B dwarf -very high -.B strength -and -.B energy level -, but with a tendency to be rather slow and not too bright. -.TP 1.5i -.B halfling -rather quick and smart, with high -.B energy level -, but poor in -.B magic -and -.B strength. -Born with some -.B experience. -.TP 1.5i -.B experimento -very mediocre in all areas. However, the -.B experimento -may be placed almost anywhere within the playing grid. -.PP -The possible ranges for starting statistics are summarized in -the following table. -.PP -.TS -l c c c c c c -l c c c c c c. -Type Strength Quick Mana Energy Brains Magic -_ -Mag. User 10-15 30-35 50-100 30-45 60-85 5-9 -Fighter 40-55 30-35 30-50 45-70 25-45 3-6 -Elf 35-45 32-38 45-90 30-50 40-65 4-7 -Dwarf 50-70 25-30 25-45 60-100 20-40 2-5 -Halfling 20-25 34 25-45 55-90 40-75 1-4 -Experimento 25 27 100 35 25 2 -.TE -.PP -Not only are the starting characteristics different for the different -character types, the characteristics progress at different rates for the -different types as the character goes up in -.B level. Experimentoes' -characteristics progress randomly as one of the other types. -The progression as characters increase in -.B level -is summarized in the following table. -.PP -.TS -l c c c c c -l n n n n n. -Type Strength Mana Energy Brains Magic -_ -Mag. User 2.0 75 20 6 2.75 -Fighter 3.0 40 30 3.0 1.5 -Elf 2.5 65 25 4.0 2.0 -Dwarf 5 30 35 2.5 1 -Halfling 2.0 30 30 4.5 1 -.TE -.PP -The character type also determines how much gold a player may -carry, how long until -.B rings -can overcome the player, and how much -.B poison -the player can withstand. -.sh "Spells" -During the course of the game, the player may exercise his/her -magic powers. These cases are described below. -.TP 1.5i -.B cloak -.I magic level necessary: -20 (plus level 7) -.br -.I mana used: -35 plus 3 per rest period -.br -Used during normal play. Prevents monsters from finding the character, -as well as hiding the player from other players. His/her coordinates -show up as '?' in the -.B players -option. Players cannot collect -.B mana, -find trading posts, or discover the -.B grail -while cloaked. Calling a monster uncloaks, as well as choosing -this option while cloaked. -.br -.TP 1.5i -.B teleport -.I magic level necessary: -40 (plus level 12) -.br -.I mana used: -30 per 75 moved -.br -Used during normal play. Allows the player too move with much more freedom -than with the -.B move -option, at the price of expending mana. The maximum distance possible -to move is based upon -.B level -and -.B magic level. -.TP 1.5i -.B power blast -.I magic level necessary: -none -.br -.I mana used: -5 times -.B level -.br -Used during inter-terminal battle. Damage is based upon -.B magic level -and -.B strength. -Hits much harder than a normal hit. -.TP 1.5i -.B all or nothing -.I magic level necessary: -none -.br -.I mana used: -1 -.br -Used while combating monsters. -Has a 25% chance of working. If it works it hits the monster just enough -to kill it. If it fails, it doesn't hit the monster, and doubles the -monster's -.B quickness -and -.B strength. -Paralyzed monsters wake up much quicker as a result of this spell. -.TP 1.5i -.B magic bolt -.I magic level necessary: -5 -.br -.I mana used: -variable -.br -Used while combating monsters. Hits the monster based upon the amount -of -.B mana -expended and -.B magic level. -Guaranteed to hit at least 10 per -.B mana. -.TP 1.5i -.B force field -.I magic level necessary: -15 -.br -.I mana used: -30 -.br -Used during monster combat. Throws up a shield to protect from damage. -The shield is added to actual energy level, and is a fixed number, based -upon maximum energy. Normally, damage occurs first to the shield, and -then to the players actual -.B energy level. -.TP 1.5i -.B transform -.I magic level necessary: -25 -.br -.I mana used: -50 -.br -Used during monster combat. Transforms the monster randomly into one -of the 100 monsters from the monster file. -.TP 1.5i -.B increase might -.I magic level necessary: -35 -.br -.I mana used: -75 -.br -Used during combat with monsters. Increases strength up to a maximum. -.TP 1.5i -.B invisibility -.I magic level necessary: -45 -.br -.I mana used: -90 -.br -Used while fighting monsters. Makes it harder for the monster to hit, -by temporarily increasing the player's -.B quickness. -This spell may be thrown several times, but a maximum level will be reached. -.TP 1.5i -.B transport -.I magic level necessary: -60 -.br -.I mana used: -125 -.br -Used during monster combat. Transports the monster away from the -player. Success is base upon player's -.B magic -and -.B brains, -and the monster's -.B experience. -If it fails the player is transported instead. 60% of the time, the monster -will drop any treasure it was carrying. -.TP 1.5i -.B paralyze -.I magic level necessary: -75 -.br -.I mana used: -150 -.br -Used during monster combat. "Freezes" the monster by putting its -.B quickness -slightly negative. The monster will slowly wake up. Success is based -upon player's -.B magic -and the monster's -.B experience. -If it fails, nothing happens. -.TP 1.5i -.B specify -.I magic level necessary: -none -.br -.I mana used: -1000 -.br -Used during monster combat only by -.B valar -or -.B council of the wise. -Allows the player to pick which monster to fight. -.sh "Monsters" -Monsters get bigger as one moves farther from the origin (0,0). Rings of -distance 125 from the origin determine the size. A monster's -.B experience, energy level, -and -.B brains -are multiplied by the size. -.B Strength -is increase 50% per size over one, and -.B quickness -remains the same, regardless of size. -.PP -Also, nastier monsters are found as one progress farther out -from the origin. Monsters also may flock. The percent chance of that -happening is designated as -.B flock% -in the monster listing. Monsters outside the first ring -may carry treasure, as determined by their treasure type. -Flocking monsters, and bigger monsters increase the chances of treasure. -.PP -Certain monsters have special abilities; they are as follows: -.TP 1.5i -.B Unicorn -can only be subdued if the player is in possession of a -.B virgin. -.TP 1.5i -.B Modnar -has random characteristics, including treasure type. -.TP 1.5i -.B Mimic -will pick another name from the list of monsters in order to -confuse. -.TP 1.5i -.B Dark Lord -very nasty person. Does not like to be hit (especially nicked), -and many spells do not work well (or at all) against him. -One can always -.B evade -from the -.B Dark Lord. -.TP 1.5i -.B Leanan-Sidhe -also a very nasty person. She will permanently sap -.B strength -from someone. -.TP 1.5i -.B Saruman -wanders around with -.B Wormtongue -, who can steal a -.B palantir. -Also, -.B Saruman -may turn a player's gems into gold pieces, -or scramble her/his stats. -.TP 1.5i -.B Thaumaturgist -can transport a player. -.TP 1.5i -.B Balrog -inflicts damage by taking away -.B experience -, not -.B energy. -.TP 1.5i -.B Vortex -may take some -.B mana. -.TP 1.5i -.B Nazgul -may try to steal a -.B ring -or neutralize part of one's -.B brains. -.TP 1.5i -.B Tiamat -may take half a player's -.B gold -and -.B gems -and escape. -.TP 1.5i -.B Kobold -may get nasty and steal one gold piece and run away. -.TP 1.5i -.B Shelob -may bite, inflicting the equivalent of one -.B poison. -.TP 1.5i -.B Assorted Faeries -These are killed if attacking someone carrying -.B holy water. -These are -.B Cluricaun, Fir Darrig, Fachan, -.B Ghille Dhu, Bogle, Killmoulis, -and -.B Bwca. -.TP 1.5i -.B Lamprey -may bite, inflicting 1/2 of a -.B poison. -.TP 1.5i -.B Shrieker -will call one of its (much bigger) buddies if picked upon. -.TP 1.5i -.B Bonnacon -will become bored with battle, fart, and run off. -.TP 1.5i -.B Smeagol -will try to steal a -.B ring -from a player, if given the chance. -.TP 1.5i -.B Succubus -may inflict damage through a -.B force field. -This subtracts from -.B energy level -instead of any shield the player may have thrown up. -This is a very easy way to die. -.TP 1.5i -.B Cerberus -loves metal and will steal all the metal treasures from -a player if able. -.TP 1.5i -.B Ungoliant -can bite and poison. This inflicts five -.B poisons -, and also takes one from the player's -.B quickness. -.TP 1.5i -.B Jabberwock -may tire of battle, and leave after calling one of his friends -( -.B Jubjub Bird -or -.B Bandersnatch -). -.TP 1.5i -.B Morgoth -actually -.B Modnar -, but reserved for -.B council of the wise, valar, -and -.B ex-valar. -Fights with -.B Morgoth -end when either he or the player dies. His characteristics -are calculated based upon the player's. The player is given -the chance to ally with him. No magic, except -.B force field -works when battling -.B Morgoth. -.TP 1.5i -.B Troll -may regenerate its -.B energy -and -.B strength -while in battle. -.TP 1.5i -.B Wraith -may make a player blind. -.sh "Treasures" -The various treasure types are as follows: -.TP 1.5i -.B Type zero -.I none -.TP 1.5i -.B Type one -.I power booster -\- adds mana. -.br -.I druid -\- adds experience. -.br -.I holy orb -\- subtracts 0.25 sin. -.TP 1.5i -.B Type two -.I amulet -\- protects from cursed treasure. -.br -.I holy water -\- kills -.B assorted faeries. -.br -.I hermit -\- reduces sin by 25% and adds some mana. -.TP 1.5i -.B Type three -.I shield -\- adds to maximum -.B energy level -.br -.I virgin -\- used to subdue a -.B unicorn -, or to give much -.B experience -(and some -.B sin -). -.br -.I athelas -\- subtracts one -.B poison. -.TP 1.5i -.B Type four (scrolls) -.I shield -\- throws a bigger than normal -.B force field. -.br -.I invisible -\- temporarily puts the finder's -.B quickness -to one million. -.br -.I ten fold strength -\- multiplies finder's strength by ten. -.br -.I pick monster -\- allows finder to pick next monster to battle. -.br -.I general knowledge -\- adds to finder's -.B brains -and -.B magic level. -.PP -All the scrolls except -.B general knowledge -automatically call a monster. These preserve any -spells that were already in effect, but are only in -effect while in battle. -.TP 1.5i -.B Type five -.I dagger -\- adds to -.B strength. -.br -.I armour -\- same as a -.B shield, -but bigger. -.br -.I tablet -\- adds brains. -.TP 1.5i -.B Type six -.I priest -\- rests to maximum; adds -.B mana, brains; -and halves -.B sin. -.br -.I Robin Hood -\- increases -.B shield -and adds permanently to -.B strength. -.br -.I axe -\- like -.B dagger, -but bigger. -.TP 1.5i -.B Type seven -.I charm -\- protects from cursed treasure (used before -.B amulet -); used in conjunction with -.B blessing -to battle -.B Dark Lord. -.br -.I Merlyn -\- adds -.B brains, magic, -and -.B mana. -.br -.I war hammer -\- like an -.B axe, -but bigger. -.TP 1.5i -.B Type eight -.I healing potion -\- sets -.B poison -to -2, or subtracts two from -.B poison, -whichever is better. -.br -.I transporter -\- allows finder to move anywhere. -.br -.I sword -\- like a -.B war hammer -, but bigger. -.TP 1.5i -.B Type nine -.I golden crown -\- allows the player to become -.B king, -by going to (0,0). -.br -.I blessing -\- cuts -.B sin -to 1/3, adds -.B mana, -rests to max., kills -.B Dark Lord -with a -.B charm, -and gives bearer first hit on all monsters. -.br -.I quicksilver -\- adds to -.B quickness. -.TP 1.5i -.B Type ten -.I elven boots -\- adds permanently to -.B quickness. -.TP 1.5i -.B Type eleven -.I palantir -\- allows one to see all the other players; used by -.B council of the wise -to seek the -.B grail. -.TP 1.5i -.B Type twelve/thirteen -.I ring -\- allows one to hit much harder in battle, etc. -.PP -Any treasure type 10-13 monsters may instead carry a type nine treasure. -.PP -A monster may also be carrying -.B gold -or -.B gems. -These are used at -.B trading posts -to buy things. A -.B gem -is worth 1000 gold pieces. Too much -.B gold -will slow a player down. One may carry 1000 plus 200 per -.B level -of -.B gold. -A -.B gem -weighs one half a gold piece. -Monsters of treasure type 7 or higher may carry -.B gems. -.PP -The chance of a cursed treasure is based upon treasure type. -The more valuable treasures have a greater chance of being cursed. -A cursed treasure knocks -.B energy level -very low, and adds 0.25 -.B poison. -.sh "Rings" -.B Rings -are only carried by -.B nazguls -and -.B Dark Lord. -They come in four different flavors. -All -.B rings -rest the player to maximum and cause him/her to hit much harder -in battle with monsters (assuming one has chosen to use the -.B ring -for battle.) -.PP -Two types of -.B rings -are cursed and come either from -.B nazguls -or -.B Dark Lord. -After a few times of using these types, the player falls -under the control of the -.B ring, -and strange, random things will occur. -Eventually, the player dies, and gives his/her name to a monster -on the file. -Dying before the -.B ring -is used up also renames the monster. -.PP -The two remaining types of -.B rings -are much more benign. -The one from a -.B nazgul -is good for a limited number of battle rounds, and will save -the player from death if it was being used when he/she died. -The one from -.B Dark Lord -is the same, except that it never is used up. -.B rings -disappear after saving someone from death. -In general, cursed -.B rings -occur much more often than normal ones. -It is usually not a good idea to pick one up. -The only way to get rid of a -.B ring -is to have a monster steal it. -.sh "King" -A player may become -.B king by finding a -.I crown -and going to (0,0). Players must have a -.B level -in the range of 10 to 1000 to be able to find a -.I crown. -When a player with one or more -.I crowns -reaches -.B level -1000, the -.I crowns -are converted to -.I gold. -.PP -Once a player is king, he/she may do certain things while in -the Lord's Chamber (0,0). These are exercised with the -.B decree -('0') option. -.TP 1.5i -.I transport -This is done to another player. It randomly moves the affected -player about. A -.B charm -protects from transports. -.TP 1.5i -.I curse -This is done to another player. It is analogous to cursed treasure, -but worse. It inflicts two -.B poison, -knocks -.B energy level -very low, and degrades the maximum energy. It also -removes a -.B cloak. -A -.B blessing -protects from king's curses. -.TP 1.5i -.I energy void -The king may put a number of these scattered about -his/her kingdom as he/she pleases. -If a player hits one, he/she loses -.B mana, energy, -and -.B gold. -The energy void disappears after being hit. -.TP 1.5i -.I bestow -This is also done to another player. The king may -wish to reward one or more loyal subjects by sharing his/her -riches ( -.B gold -). Or it is a convenient way to dispose of some unwanted -deadweight. -.TP 1.5i -.I collect taxes -Everyone pays 7% tax on all -.B gold -and -.B gems -acquired, regardless of the existence of a -.B king. -The king collects the accrued taxes with this option. -.PP -The -.B king -may also -.B teleport -anywhere for free by using the origin as a starting place. -.sh "Council of the Wise, Valar" -.pl +0.5 -A player automatically becomes a member of the -.B council of the wise -upon reaching level 3000. Members of the council cannot have -.B rings. -Members of the council have a few extra options which they can exercise. -These are exercised -.B intervene -('8') option. -All -.B intervene -options cost 1000 mana. -One -.B intervene -option is to -.I heal -another player. This is just a quick way for that player to be rested -to maximum and lose a little -.B poison. -The main purpose in life for members of the council is to seek the -.B Holy Grail. -This is done with a -.B palantir -under the -.I seek grail -option. The distance cited by the seek is accurate within 10%, in order -not to make it too easy to find the grail. -A player must have infinitesimally small -.B sin, -or else it's all over upon finding the grail. -In order to help members of the council on their quest, they -may -.I teleport -with greater ease. -.pl -0.5 -.sp 1 -.ne 1i -.PP -Upon finding the grail, the player advances to position of -.B valar. -He/she may then exercise more and niftier options under -.I intervention. -These include all of the council members' options plus the -ability to move other players about, bless them, and throw monsters at -them. -A -.BR valar 's -blessing has the same effect as the treasure -.I blessing, -except that the affected player does not get his/her -.I blessing -flag set. -All -.I intervention -options which affect other players age the player -who uses them. -.B Valars -are essentially immortal, but are actually given five lives. -If these are used up, the player is left to die, and becomes an -.B ex-valar. -A -.B valar -cannot -.I move, teleport, -or call monsters. -(An exception to this is if the -.I valar -finds a -.I transporter. -This is to allow him/her to dispose of excess -.I gold. -Any monsters which a -.B valar -encounters are based upon his/her size. -Only one valar may exist at a time. -The current valar is replaced when another player finds the grail. -The valar is then bumped back to the council of the wise. -.sh "Wizard" -The -.I wizard -is usually the owner of the game, and the one who maintains -the associated files. -The -.I wizard -is granted special powers within the game, if it is invoked -with the '\-S' option. -Otherwise, the -.I wizard -plays no different from other players. -The -.I wizard -abilities are outlined below. -.TP -.I change players -When examining a player, (game invoked with '-x', or use 'X' from within game), -the -.I wizard -may also change the player. -.TP -.I intervention -The -.I wizard -may do all the -.I intervention -options. One extra option, -.I vaporize, -is added to kill any offensive players. -.TP -.I super character type -An extra character type is added. This character starts with the -maximum possible in all statistics, selected from the other character types. -A -.B super -character's statistics also progress at the maximum possible rate, selected -from the other character types. -.sh "Special Places" -Certain regions of the playing grid have different names. -In general, this is only to give the player some idea of -his/her present location. Some special places do exist. -.TP 1.5i -.I Trading Posts -These are located at |x| == |y| == n*n*100 for n = 1, 2...1000. -Trading posts farther out have more things for sale. -Be careful about cheating the merchants there, as they have short -tempers. -Merchants are dishonest about 5% of the time. -.TP 1.5i -.I Lord's Chamber -This is located at (0,0). Only players with -.B crowns -may enter. -.TP 1.5i -.I Point of No Return -This is located beyond 1.2e+6 in any direction. -The only way to return from here is a -.B transporter -or to have a -.B valar -relocate the player. -.TP 1.5i -.I Dead Marshes -This is a band located fairly distant from the origin. The first -fourteen monsters (water monsters) can normally only be found here. -.TP 1.5i -.I Valhala -This place is where the -.B valar -resides. It is associated with no particular coordinate on the -playing grid. -.sh "Miscellaneous" -Once a player reaches -.B level -5, the game will start to time out waiting for input. -This is to try to keep the game a bit faster paced. -.PP -A -.I guru -will never be disgusted with your -.B sins -if they are less than one. -.PP -A -.I medic -wants half of a player's -.B gold -to be happy. Offering more than one has, or a negative amount -will anger the -.I medic, -who will make the player worse (add one -.B poison -). -.PP -The -.B Holy Grail -does little for those who are not ready to behold it. -Whenever anyone finds it, it moves. -It is always located within 1e+6 in any compass direction of the origin. -.PP -There is a maximum amount of -.B mana -and -.B charms -a player may posses, based upon -.B level. -.I Quicksilver -is always limited to a maximum of 99. -.PP -.I Books -bought at a -.B trading post -increase -.B brains, -based upon the number bought. -It is unwise, however to buy more than 1/10 of one's -.B level -in books at a time. -.PP -Players over level 10000 are automatically retired. -.PP -A -.I blindness -goes away in random time. -.PP -Players with -.I crowns -are identified with a '*' before their character type. -.sh "Inter-terminal Battle" -When two player's coordinates correspond, they may engage in battle. -In general, the player with the highest -.B quickness -gets the first hit. -If the two players are severely mis-matched, the stronger player -is drastically handicapped for the battle. -In order to protect from being stuck in an infinite loop, -the player waiting for response may time out. Options for battle are: -.TP 1.5i -.I fight -Inflicts damage upon other person. -.TP 1.5i -.I run away -Escape from battle. Has a 75% chance of working. -.TP 1.5i -.I power blast -Battle spell. -.TP 1.5i -.I luckout -One-time chance to try to win against the foe. Has a 10% chance of working. -.PP -Sometimes waits for the other player may be excessive, because -he/she may be battling a monster. Upon slaying a player in battle -the winner gets the other's -.B experience -and treasures. -.B Rings -do not work for inter-terminal battle. -.SH BUGS -All screen formats assume at least 24 lines by at least 80 columns. -No provisions are made for when any of the data items get too big -for the allotted space on the screen. diff --git a/games/phantasia/phantdefs.h b/games/phantasia/phantdefs.h deleted file mode 100644 index 9e597e5..0000000 --- a/games/phantasia/phantdefs.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * phantdefs.h - important constants for Phantasia - */ - -/* ring constants */ -#define R_NONE 0 /* no ring */ -#define R_NAZREG 1 /* regular Nazgul ring (expires) */ -#define R_DLREG 2 /* regular Dark Lord ring (does not expire) */ -#define R_BAD 3 /* bad ring */ -#define R_SPOILED 4 /* ring which has gone bad */ - -/* status constants */ -#define S_NOTUSED 0 /* record not in use */ -#define S_OFF 1 /* not playing */ -#define S_PLAYING 2 /* playing - nothing else */ -#define S_CLOAKED 3 /* playing - cloaked */ -#define S_INBATTLE 4 /* playing - in battle */ -#define S_MONSTER 5 /* playing - fighting monster */ -#define S_TRADING 6 /* playing - at a trading post */ -#define S_HUNGUP 7 /* error occured with character */ - -/* tampered constants */ -#define T_OFF 0 /* nothing */ -#define T_NRGVOID 1 /* hit an energy void */ -#define T_GRAIL 2 /* landed on the holy grail */ -#define T_TRANSPORT 3 /* transported by king */ -#define T_BESTOW 4 /* gold bestowed by king */ -#define T_CURSED 5 /* cursed by king */ -#define T_MONSTER 6 /* monster lobbed by valar */ -#define T_BLESSED 7 /* blessed by valar */ -#define T_RELOCATE 8 /* moved by valar */ -#define T_HEAL 9 /* healed by valar */ -#define T_VAPORIZED 10 /* vaporized by wizard */ -#define T_EXVALAR 11 /* no longer valar */ - -/* inter-terminal battle status constants */ -#define I_OFF 0 /* nothing */ -#define I_RAN 1 /* ran away */ -#define I_STUCK 2 /* tried to run unsuccessfully */ -#define I_BLEWIT 3 /* tried to luckout unsuccessfully */ -#define I_KILLED 4 /* killed foe */ - -/* constants for altering coordinates */ -#define A_SPECIFIC 0 /* coordinates specified */ -#define A_FORCED 1 /* coordinates specified, ignore Beyond */ -#define A_NEAR 2 /* coordinates not specified, move near */ -#define A_FAR 3 /* coordinates not specified, move far */ - -/* constants for character types */ -#define C_MAGIC 0 /* magic user */ -#define C_FIGHTER 1 /* fighter */ -#define C_ELF 2 /* elf */ -#define C_DWARF 3 /* dwarf */ -#define C_HALFLING 4 /* halfling */ -#define C_EXPER 5 /* experimento */ -#define C_SUPER 6 /* super being */ - -/* constants for special character types */ -#define SC_NONE 0 /* not a special character */ -#define SC_KING 1 /* king */ -#define SC_COUNCIL 2 /* council of the wise */ -#define SC_VALAR 3 /* valar */ -#define SC_EXVALAR 4 /* ex-valar */ - -/* special monster constants */ -#define SM_NONE 0 /* nothing special */ -#define SM_UNICORN 1 /* unicorn */ -#define SM_MODNAR 2 /* Modnar */ -#define SM_MIMIC 3 /* mimic */ -#define SM_DARKLORD 4 /* Dark Lord */ -#define SM_LEANAN 5 /* Leanan-Sidhe */ -#define SM_SARUMAN 6 /* Saruman */ -#define SM_THAUMATURG 7 /* thaumaturgist */ -#define SM_BALROG 8 /* balrog */ -#define SM_VORTEX 9 /* vortex */ -#define SM_NAZGUL 10 /* nazgul */ -#define SM_TIAMAT 11 /* Tiamat */ -#define SM_KOBOLD 12 /* kobold */ -#define SM_SHELOB 13 /* Shelob */ -#define SM_FAERIES 14 /* assorted faeries */ -#define SM_LAMPREY 15 /* lamprey */ -#define SM_SHRIEKER 16 /* shrieker */ -#define SM_BONNACON 17 /* bonnacon */ -#define SM_SMEAGOL 18 /* Smeagol */ -#define SM_SUCCUBUS 19 /* succubus */ -#define SM_CERBERUS 20 /* Cerberus */ -#define SM_UNGOLIANT 21 /* Ungoliant */ -#define SM_JABBERWOCK 22 /* jabberwock */ -#define SM_MORGOTH 23 /* Morgoth */ -#define SM_TROLL 24 /* troll */ -#define SM_WRAITH 25 /* wraith */ - -/* constants for spells */ -#define ML_ALLORNOTHING 0.0 /* magic level for 'all or nothing' */ -#define MM_ALLORNOTHING 1.0 /* mana used for 'all or nothing' */ -#define ML_MAGICBOLT 5.0 /* magic level for 'magic bolt' */ -#define ML_FORCEFIELD 15.0 /* magic level for 'force field' */ -#define MM_FORCEFIELD 30.0 /* mana used for 'force field' */ -#define ML_XFORM 25.0 /* magic level for 'transform' */ -#define MM_XFORM 50.0 /* mana used for 'transform' */ -#define ML_INCRMIGHT 35.0 /* magic level for 'increase might' */ -#define MM_INCRMIGHT 75.0 /* mana used for 'increase might' */ -#define ML_INVISIBLE 45.0 /* magic level for 'invisibility' */ -#define MM_INVISIBLE 90.0 /* mana used for 'invisibility' */ -#define ML_XPORT 60.0 /* magic level for 'transport' */ -#define MM_XPORT 125.0 /* mana used for 'transport' */ -#define ML_PARALYZE 75.0 /* magic level for 'paralyze' */ -#define MM_PARALYZE 150.0 /* mana used for 'paralyze' */ -#define MM_SPECIFY 1000.0 /* mana used for 'specify' */ -#define ML_CLOAK 20.0 /* magic level for 'cloak' */ -#define MEL_CLOAK 7.0 /* experience level for 'cloak' */ -#define MM_CLOAK 35.0 /* mana used for 'cloak' */ -#define ML_TELEPORT 40.0 /* magic level for 'teleport' */ -#define MEL_TELEPORT 12.0 /* experience level for 'teleport' */ -#define MM_INTERVENE 1000.0 /* mana used to 'intervene' */ - -/* some miscellaneous constants */ -#define SZ_DATABUF 100 /* size of input buffer */ -#define SZ_PLAYERSTRUCT sizeof(struct player) /* size of player structure */ -#define SZ_VOIDSTRUCT sizeof(struct energyvoid) /* size of energy void struct */ -#define SZ_SCORESTRUCT sizeof(struct scoreboard) /* size of score board entry */ -#define SZ_MONSTERSTRUCT sizeof(struct monster) /* size of monster structure */ -#define SZ_NAME 21 /* size of player name (incl. trailing nul) */ -#define SZ_PASSWORD 9 /* size of password (incl. trailing nul) */ -#define SZ_LOGIN 9 /* size of login (incl. trailing nul) */ - -#define N_DAYSOLD 21 /* number of days old for purge */ -#define N_AGE 500 /* age to degenerate ratio */ -#define N_GEMVALUE (1000.0) /* number of gold pieces to gem ratio */ -#define N_TAXAMOUNT (7.0) /* tax percent */ - -#define D_BEYOND (1.1e6) /* distance to beyond point of no return */ -#define D_EXPER (2000.0) /* distance experimentos are allowed */ - -#define CH_MARKDELETE '\001' /* used to alter name of deleted players */ -#define CH_KILL '\030' /* kill character (ctrl-X) */ -#define CH_ERASE '\010' /* erase character (ctrl-H) */ -#define CH_NEWLINE '\n' /* newline */ -#define CH_REDRAW '\014' /* redraw screen character (ctrl-L) */ diff --git a/games/phantasia/phantglobs.c b/games/phantasia/phantglobs.c deleted file mode 100644 index 65ab630..0000000 --- a/games/phantasia/phantglobs.c +++ /dev/null @@ -1,113 +0,0 @@ -/* - * phantglobs.c - globals for Phantasia - */ - -#include "include.h" - -double Circle; /* which circle player is in */ -double Shield; /* force field thrown up in monster battle */ - -bool Beyond; /* set if player is beyond point of no return */ -bool Marsh; /* set if player is in dead marshes */ -bool Throne; /* set if player is on throne */ -bool Changed; /* set if important player stats have changed */ -bool Wizard; /* set if player is the 'wizard' of the game */ -bool Timeout; /* set if short timeout waiting for input */ -bool Windows; /* set if we are set up for curses stuff */ -bool Luckout; /* set if we have tried to luck out in fight */ -bool Foestrikes; /* set if foe gets a chance to hit in battleplayer() */ -bool Echo; /* set if echo input to terminal */ - -int Users; /* number of users currently playing */ -int Whichmonster; /* which monster we are fighting */ -int Lines; /* line on screen counter for fight routines */ - -jmp_buf Fightenv; /* used to jump into fight routine */ -jmp_buf Timeoenv; /* used for timing out waiting for input */ - -long Fileloc; /* location in file of player statistics */ - -char *Login; /* pointer to login of player */ -char *Enemyname; /* pointer name of monster/player we are battling*/ - -struct player Player; /* stats for player */ -struct player Other; /* stats for another player */ - -struct monster Curmonster;/* stats for current monster */ - -struct energyvoid Enrgyvoid;/* energy void buffer */ - -struct charstats *Statptr;/* pointer into Stattable[] */ - -/* lookup table for character type dependent statistics */ -struct charstats Stattable[7] = - { - /* MAGIC USER */ - /* max brains, max mana, weakness, gold tote, ring duration */ - 15.0, 200.0, 18.0, 175.0, 10, - /* quickness strength mana energy brains magic lvl */ - 30, 6, 0.0, 10, 6, 2.0, 50,51,75.0, 30,16,20.0, 60,26, 6.0, 5, 5,2.75, - - /* FIGHTER */ - /* max brains, max mana, weakness, gold tote, ring duration */ - 10.0, 110.0, 15.0, 220.0, 20, - /* quickness strength mana energy brains magic lvl */ - 30, 6, 0.0, 40,16, 3.0, 30,21,40.0, 45,26,30.0, 25,21, 3.0, 3, 4, 1.5, - - /* ELF */ - /* max brains, max mana, weakness, gold tote, ring duration */ - 12.0, 150.0, 17.0, 190.0, 13, - /* quickness strength mana energy brains magic lvl */ - 32, 7, 0.0, 35,11, 2.5, 45,46,65.0, 30,21,25.0, 40,26, 4.0, 4, 4, 2.0, - - /* DWARF */ - /* max brains, max mana, weakness, gold tote, ring duration */ - 7.0, 80.0, 13.0, 255.0, 25, - /* quickness strength mana energy brains magic lvl */ - 25, 6, 0.0, 50,21, 5.0, 25,21,30.0, 60,41,35.0, 20,21, 2.5, 2, 4, 1.0, - - /* HALFLING */ - /* max brains, max mana, weakness, gold tote, ring duration */ - 11.0, 80.0, 10.0, 125.0, 40, - /* quickness strength mana energy brains magic lvl */ - 34, 0, 0.0, 20, 6, 2.0, 25,21,30.0, 55,36,30.0, 40,36, 4.5, 1, 4, 1.0, - - /* EXPERIMENTO */ - /* max brains, max mana, weakness, gold tote, ring duration */ - 9.0, 90.0, 16.0, 160.0, 20, - /* quickness strength mana energy brains magic lvl */ - 27, 0, 0.0, 25, 0, 0.0, 100,0, 0.0, 35, 0, 0.0, 25, 0, 0.0, 2, 0, 0.0, - - /* SUPER */ - /* max brains, max mana, weakness, gold tote, ring duration */ - 15.0, 200.0, 10.0, 225.0, 40, - /* quickness strength mana energy brains magic lvl */ - 38, 0, 0.0, 65, 0, 5.0, 100,0,75.0, 80, 0,35.0, 85, 0, 6.0, 9, 0,2.75 - }; - -/* menu of items for purchase */ -struct menuitem Menu[] = - { - "Mana", 1, - "Shield", 5, - "Book", 200, - "Sword", 500, - "Charm", 1000, - "Quicksilver", 2500, - "Blessing", 1000, - }; - -FILE *Playersfp; /* pointer to open player file */ -FILE *Monstfp; /* pointer to open monster file */ -FILE *Messagefp; /* pointer to open message file */ -FILE *Energyvoidfp; /* pointer to open energy void file */ - -char Databuf[SZ_DATABUF]; /* a place to read data into */ - -/* some canned strings for messages */ -char Illcmd[] = "Illegal command.\n"; -char Illmove[] = "Too far.\n"; -char Illspell[] = "Illegal spell.\n"; -char Nomana[] = "Not enought mana for that spell.\n"; -char Somebetter[] = "But you already have something better.\n"; -char Nobetter[] = "That's no better than what you already have.\n"; diff --git a/games/phantasia/phantglobs.h b/games/phantasia/phantglobs.h deleted file mode 100644 index b0b64bd..0000000 --- a/games/phantasia/phantglobs.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * phantglobs.h - global declarations for Phantasia - */ - -extern double Circle; /* which circle player is in */ -extern double Shield; /* force field thrown up in monster battle */ - -extern bool Beyond; /* set if player is beyond point of no return */ -extern bool Marsh; /* set if player is in dead marshes */ -extern bool Throne; /* set if player is on throne */ -extern bool Changed; /* set if important player stats have changed */ -extern bool Wizard; /* set if player is the 'wizard' of the game */ -extern bool Timeout; /* set if short timeout waiting for input */ -extern bool Windows; /* set if we are set up for curses stuff */ -extern bool Luckout; /* set if we have tried to luck out in fight */ -extern bool Foestrikes; /* set if foe gets a chance to hit in battleplayer()*/ -extern bool Echo; /* set if echo input to terminal */ - -extern int Users; /* number of users currently playing */ -extern int Whichmonster; /* which monster we are fighting */ -extern int Lines; /* line on screen counter for fight routines */ - -extern jmp_buf Fightenv; /* used to jump into fight routine */ -extern jmp_buf Timeoenv; /* used for timing out waiting for input */ - -extern long Fileloc; /* location in file of player statistics */ - -extern char *Login; /* pointer to login of current player */ -extern char *Enemyname; /* pointer name of monster/player we are battling*/ - -extern struct player Player; /* stats for player */ -extern struct player Other; /* stats for another player */ - -extern struct monster Curmonster;/* stats for current monster */ - -extern struct energyvoid Enrgyvoid;/* energy void buffer */ - -extern struct charstats Stattable[];/* used for rolling and changing player stats*/ - -extern struct charstats *Statptr;/* pointer into Stattable[] */ - -extern struct menuitem Menu[]; /* menu of items for purchase */ - -extern FILE *Playersfp; /* pointer to open player file */ -extern FILE *Monstfp; /* pointer to open monster file */ -extern FILE *Messagefp; /* pointer to open message file */ -extern FILE *Energyvoidfp; /* pointer to open energy void file */ - -extern char Databuf[]; /* a place to read data into */ - -/* some canned strings for messages */ -extern char Illcmd[]; -extern char Illmove[]; -extern char Illspell[]; -extern char Nomana[]; -extern char Somebetter[]; -extern char Nobetter[]; - -/* library functions and system calls */ -extern char *getlogin(); -extern char *getpass(); -extern char *strchr(); -extern char *strcat(); -extern char *strcpy(); -extern char *strncpy(); -extern char *getenv(); -struct passwd *getpwuid(); -extern char *fgets(); - -/* functions which we need to know about */ -extern int interrupt(); -extern int ill_sig(); -extern void catchalarm(); -extern long recallplayer(); -extern long findname(); -extern long allocrecord(); -extern long rollnewplayer(); -extern long allocvoid(); -extern double drandom(); -extern double distance(); -extern double infloat(); -extern double explevel(); -extern char *descrlocation(); -extern char *descrtype(); -extern char *descrstatus(); diff --git a/games/phantasia/phantstruct.h b/games/phantasia/phantstruct.h deleted file mode 100644 index 05c6da5..0000000 --- a/games/phantasia/phantstruct.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * phantstruct.h - structure definitions for Phantasia - */ - -struct player /* player statistics */ - { - double p_experience; /* experience */ - double p_level; /* level */ - double p_strength; /* strength */ - double p_sword; /* sword */ - double p_might; /* effect strength */ - double p_energy; /* energy */ - double p_maxenergy; /* maximum energy */ - double p_shield; /* shield */ - double p_quickness; /* quickness */ - double p_quksilver; /* quicksilver */ - double p_speed; /* effective quickness */ - double p_magiclvl; /* magic level */ - double p_mana; /* mana */ - double p_brains; /* brains */ - double p_poison; /* poison */ - double p_gold; /* gold */ - double p_gems; /* gems */ - double p_sin; /* sin */ - double p_x; /* x coord */ - double p_y; /* y coord */ - double p_1scratch, - p_2scratch; /* variables used for decree, player battle */ - - struct - { - short ring_type; /* type of ring */ - short ring_duration; /* duration of ring */ - bool ring_inuse; /* ring in use flag */ - } p_ring; /* ring stuff */ - - long p_age; /* age of player */ - - int p_degenerated; /* age/3000 last degenerated */ - - short p_type; /* character type */ - short p_specialtype; /* special character type */ - short p_lives; /* multiple lives for council, valar */ - short p_crowns; /* crowns */ - short p_charms; /* charms */ - short p_amulets; /* amulets */ - short p_holywater; /* holy water */ - short p_lastused; /* day of year last used */ - short p_status; /* playing, cloaked, etc. */ - short p_tampered; /* decree'd, etc. flag */ - short p_istat; /* used for inter-terminal battle */ - - bool p_palantir; /* palantir */ - bool p_blessing; /* blessing */ - bool p_virgin; /* virgin */ - bool p_blindness; /* blindness */ - - char p_name[SZ_NAME]; /* name */ - char p_password[SZ_PASSWORD];/* password */ - char p_login[SZ_LOGIN]; /* login */ - }; - -struct monster /* monster stats */ - { - double m_strength; /* strength */ - double m_brains; /* brains */ - double m_speed; /* speed */ - double m_energy; /* energy */ - double m_experience; /* experience */ - double m_flock; /* % chance of flocking */ - - double m_o_strength; /* original strength */ - double m_o_speed; /* original speed */ - double m_maxspeed; /* maximum speed */ - double m_o_energy; /* original energy */ - double m_melee; /* melee damage */ - double m_skirmish; /* skirmish damage */ - - int m_treasuretype; /* treasure type */ - int m_type; /* special type */ - - char m_name[26]; /* name */ - }; - -struct energyvoid /* energy void */ - { - double ev_x; /* x coordinate */ - double ev_y; /* y coordinate */ - bool ev_active; /* active or not */ - }; - -struct scoreboard /* scoreboard entry */ - { - double sb_level; /* level of player */ - char sb_type[4]; /* character type of player */ - char sb_name[SZ_NAME]; /* name of player */ - char sb_login[SZ_LOGIN]; /* login of player */ - }; - -struct charstats /* character type statistics */ - { - double c_maxbrains; /* max brains per level */ - double c_maxmana; /* max mana per level */ - double c_weakness; /* how strongly poison affects player */ - double c_goldtote; /* how much gold char can carry */ - int c_ringduration; /* bad ring duration */ - struct - { - double base; /* base for roll */ - double interval; /* interval for roll */ - double increase; /* increment per level */ - } c_quickness, /* quickness */ - c_strength, /* strength */ - c_mana, /* mana */ - c_energy, /* energy level */ - c_brains, /* brains */ - c_magiclvl; /* magic level */ - }; - -struct menuitem /* menu item for purchase */ - { - char *item; /* menu item name */ - double cost; /* cost of item */ - }; diff --git a/games/phantasia/setup.c b/games/phantasia/setup.c deleted file mode 100644 index b295b6a..0000000 --- a/games/phantasia/setup.c +++ /dev/null @@ -1,268 +0,0 @@ -/* - * setup.c - set up all files for Phantasia - * - * $FreeBSD$ - */ -#include "include.h" -#include -#include -#include -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: main() -/ -/ FUNCTION: setup files for Phantasia 3.3.2 -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: time(), exit(), stat(), Error(), creat(), close(), fopen(), -/ fgets(), floor(), srandom(), umask(), drandom(), strcpy(), getuid(), -/ unlink(), fwrite(), fclose(), sscanf(), printf(), strlen(), fprintf() -/ -/ GLOBAL INPUTS: Curmonster, _iob[], Databuf[], *Monstfp, Enrgyvoid -/ -/ GLOBAL OUTPUTS: Curmonster, Databuf[], *Monstfp, Enrgyvoid -/ -/ DESCRIPTION: -/ -/ This program tries to verify the parameters specified in -/ the Makefile. -/ -/ Create all necessary files. Note that nothing needs to be -/ put in these files. -/ Also, the monster binary data base is created here. -/ -*************************************************************************/ - -void Error(); - -static char *files[] = { /* all files to create */ - _SPATH_MONST, - _SPATH_PEOPLE, - _SPATH_MESS, - _SPATH_LASTDEAD, - _SPATH_MOTD, - _SPATH_GOLD, - _SPATH_VOID, - _SPATH_SCORE, - NULL, -}; - -char *monsterfile="monsters.asc"; - -int -main(argc, argv) - int argc; - char *argv[]; -{ - char **filename; /* for pointing to file names */ - int fd; /* file descriptor */ - FILE *fp; /* for opening files */ - struct stat fbuf; /* for getting files statistics */ - int ch; - - while ((ch = getopt(argc, argv, "m:")) != -1) - switch(ch) { - case 'm': - monsterfile = optarg; - break; - case '?': - default: - break; - } - argc -= optind; - argv += optind; - - srandomdev(); - -#if 0 - umask(0117); /* only owner can read/write created files */ -#endif - - /* try to create data files */ - filename = &files[0]; - while (*filename != NULL) - /* create each file */ - { - if (stat(*filename, &fbuf) == 0) - /* file exists; remove it */ - { - if (!strcmp(*filename, _SPATH_PEOPLE)) - /* do not reset character file if it already exists */ - { - ++filename; - continue; - } - - if (unlink(*filename) < 0) - Error("Cannot unlink %s.\n", *filename); - /*NOTREACHED*/ - } - - if ((fd = creat(*filename, 0666)) < 0) - Error("Cannot create %s.\n", *filename); - /*NOTREACHED*/ - - close(fd); /* close newly created file */ - - ++filename; /* process next file */ - } - - /* put holy grail info into energy void file */ - Enrgyvoid.ev_active = TRUE; - Enrgyvoid.ev_x = ROLL(-1.0e6, 2.0e6); - Enrgyvoid.ev_y = ROLL(-1.0e6, 2.0e6); - if ((fp = fopen(_SPATH_VOID, "w")) == NULL) - Error("Cannot update %s.\n", _SPATH_VOID); - else - { - fwrite(&Enrgyvoid, SZ_VOIDSTRUCT, 1, fp); - fclose(fp); - } - - /* create binary monster data base */ - if ((Monstfp = fopen(_SPATH_MONST, "w")) == NULL) - Error("Cannot update %s.\n", _SPATH_MONST); - else - { - if ((fp = fopen(monsterfile, "r")) == NULL) - { - fclose(Monstfp); - Error("cannot open %s to create monster database.\n", "monsters.asc"); - } - else - { - Curmonster.m_o_strength = - Curmonster.m_o_speed = - Curmonster.m_maxspeed = - Curmonster.m_o_energy = - Curmonster.m_melee = - Curmonster.m_skirmish = 0.0; - - while (fgets(Databuf, SZ_DATABUF, fp) != NULL) - /* read in text file, convert to binary */ - { - sscanf(&Databuf[24], "%lf%lf%lf%lf%lf%d%d%lf", - &Curmonster.m_strength, &Curmonster.m_brains, - &Curmonster.m_speed, &Curmonster.m_energy, - &Curmonster.m_experience, &Curmonster.m_treasuretype, - &Curmonster.m_type, &Curmonster.m_flock); - Databuf[24] = '\0'; - strcpy(Curmonster.m_name, Databuf); - fwrite((char *) &Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp); - } - fclose(fp); - fclose(Monstfp); - } - } - -#ifdef MAKE_INSTALLS_THIS_AND_DOESNT_WANT_TO_HEAR_ABOUT_IT - /* write to motd file */ - printf("One line 'motd' ? "); - if (fgets(Databuf, SZ_DATABUF, stdin) == NULL) - Databuf[0] = '\0'; - if ((fp = fopen(_SPATH_MOTD, "w")) == NULL) - Error("Cannot update %s.\n", _SPATH_MOTD); - else - { - fwrite(Databuf, sizeof(char), strlen(Databuf), fp); - fclose(fp); - } - - /* report compile-time options */ - printf("Compiled options:\n\n"); - printf("Phantasia destination directory: %s\n", _SPATH_PHANTDIR); - printf("Wizard: root UID: 0\n"); - -#ifdef BSD41 - printf("Compiled for BSD 4.1\n"); -#endif - -#ifdef BSD42 - printf("Compiled for BSD 4.2\n"); -#endif - -#ifdef SYS3 - printf("Compiled for System III\n"); -#endif - -#ifdef SYS5 - printf("Compiled for System V\n"); -#endif -#endif - - exit(0); - /*NOTREACHED*/ -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: Error() -/ -/ FUNCTION: print an error message, and exit -/ -/ AUTHOR: E. A. Estes, 12/4/85 -/ -/ ARGUMENTS: -/ char *str - format string for printf() -/ char *file - file which caused error -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: exit(), perror(), fprintf() -/ -/ GLOBAL INPUTS: _iob[] -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ Print an error message, then exit. -/ -*************************************************************************/ - -void -Error(str, file) -char *str, *file; -{ - fprintf(stderr, "Error: "); - fprintf(stderr, str, file); - perror(file); - exit(1); - /*NOTREACHED*/ -} -/* */ -/************************************************************************ -/ -/ FUNCTION NAME: drandom() -/ -/ FUNCTION: return a random number -/ -/ AUTHOR: E. A. Estes, 2/7/86 -/ -/ ARGUMENTS: none -/ -/ RETURN VALUE: none -/ -/ MODULES CALLED: random() -/ -/ GLOBAL INPUTS: none -/ -/ GLOBAL OUTPUTS: none -/ -/ DESCRIPTION: -/ -*************************************************************************/ - -double -drandom() -{ - if (sizeof(int) != 2) - return((double) (random() & 0x7fff) / 32768.0); - else - return((double) random() / 32768.0); -} -- cgit v1.1