2008-01-28 09:20:15 +03:00
|
|
|
/* $NetBSD: misc.c,v 1.15 2008/01/28 06:20:15 dholland Exp $ */
|
1995-03-24 06:58:08 +03:00
|
|
|
|
1994-10-22 00:19:39 +03:00
|
|
|
/*
|
|
|
|
* misc.c Phantasia miscellaneous support routines
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "include.h"
|
2004-04-11 17:35:06 +04:00
|
|
|
#undef bool
|
2004-04-07 21:46:47 +04:00
|
|
|
#include <curses.h>
|
1994-10-22 00:19:39 +03:00
|
|
|
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
movelevel()
|
|
|
|
{
|
Add use of `const' where appropriate to the games.
This merges in all such remaining changes from the Linux port of the
NetBSD games, except in hunt (where substantial changes from OpenBSD
need to be looked at).
Some such changes were previously covered in PRs bin/6041, bin/6146,
bin/6148, bin/6150, bin/6151, bin/6580, bin/6660, bin/7993, bin/7994,
bin/8039, bin/8057 and bin/8093.
1999-09-09 01:17:44 +04:00
|
|
|
const struct charstats *statptr; /* for pointing into Stattable */
|
1997-10-13 06:18:06 +04:00
|
|
|
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 */
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
Player.p_gold += ((double) Player.p_crowns) * 5000.0;
|
|
|
|
Player.p_crowns = 0;
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
1997-10-13 06:18:06 +04:00
|
|
|
if (Player.p_level >= 3000.0 && Player.p_specialtype < SC_COUNCIL)
|
|
|
|
/* make a member of the council */
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
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");
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
Player.p_specialtype = SC_COUNCIL;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
/* no rings for council and above */
|
|
|
|
Player.p_ring.ring_type = R_NONE;
|
|
|
|
Player.p_ring.ring_duration = 0;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
Player.p_lives = 3; /* three extra lives */
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
1997-10-13 06:18:06 +04:00
|
|
|
if (Player.p_level > 9999.0 && Player.p_specialtype != SC_VALAR)
|
|
|
|
death("Old age");
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
1997-10-13 06:18:06 +04:00
|
|
|
|
Add use of `const' where appropriate to the games.
This merges in all such remaining changes from the Linux port of the
NetBSD games, except in hunt (where substantial changes from OpenBSD
need to be looked at).
Some such changes were previously covered in PRs bin/6041, bin/6146,
bin/6148, bin/6150, bin/6151, bin/6580, bin/6660, bin/7993, bin/7994,
bin/8039, bin/8057 and bin/8093.
1999-09-09 01:17:44 +04:00
|
|
|
const char *
|
1994-10-22 00:19:39 +03:00
|
|
|
descrlocation(playerp, shortflag)
|
1997-10-13 06:18:06 +04:00
|
|
|
struct player *playerp;
|
2005-02-15 15:58:21 +03:00
|
|
|
phbool shortflag;
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
double circle; /* corresponding circle for coordinates */
|
|
|
|
int quadrant; /* quandrant of grid */
|
Add use of `const' where appropriate to the games.
This merges in all such remaining changes from the Linux port of the
NetBSD games, except in hunt (where substantial changes from OpenBSD
need to be looked at).
Some such changes were previously covered in PRs bin/6041, bin/6146,
bin/6148, bin/6150, bin/6151, bin/6580, bin/6660, bin/7993, bin/7994,
bin/8039, bin/8057 and bin/8093.
1999-09-09 01:17:44 +04:00
|
|
|
const char *label; /* pointer to place name */
|
|
|
|
static const char *const nametable[4][4] = /* names of places */
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
{"Anorien", "Ithilien", "Rohan", "Lorien"},
|
|
|
|
{"Gondor", "Mordor", "Dunland", "Rovanion"},
|
|
|
|
{"South Gondor", "Khand", "Eriador", "The Iron Hills"},
|
|
|
|
{"Far Harad", "Near Harad", "The Northern Waste", "Rhun"}
|
1994-10-22 00:19:39 +03:00
|
|
|
};
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
if (playerp->p_specialtype == SC_VALAR)
|
|
|
|
return (" is in Valhala");
|
1994-10-22 00:19:39 +03:00
|
|
|
else
|
1997-10-13 06:18:06 +04:00
|
|
|
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
|
|
|
|
*
|
|
|
|
* expr
|
|
|
|
* essi
|
|
|
|
* on
|
|
|
|
* is
|
|
|
|
* spli
|
|
|
|
* t
|
|
|
|
* to
|
|
|
|
* prev
|
|
|
|
* ent
|
|
|
|
* comp
|
|
|
|
* iler
|
|
|
|
*
|
|
|
|
* loop
|
|
|
|
*
|
|
|
|
* with
|
|
|
|
*
|
|
|
|
* some
|
|
|
|
*
|
|
|
|
* comp
|
|
|
|
* iler
|
|
|
|
* s */
|
|
|
|
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);
|
1994-10-22 00:19:39 +03:00
|
|
|
else
|
1997-10-13 06:18:06 +04:00
|
|
|
sprintf(Databuf, " is in %s (%.0f,%.0f)", label, playerp->p_x, playerp->p_y);
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
return (Databuf);
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
tradingpost()
|
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
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);
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
clear();
|
|
|
|
addstr("You are at a trading post. All purchases must be made with gold.");
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
size = sqrt(fabs(Player.p_x / 100)) + 1;
|
|
|
|
size = MIN(7, size);
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
/* set up cost of blessing */
|
|
|
|
blessingcost = 1000.0 * (Player.p_level + 5.0);
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
/* 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);
|
|
|
|
}
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
mvprintw(5, 0, "L:Leave P:Purchase S:Sell Gems ? ");
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
for (;;) {
|
|
|
|
adjuststats(); /* truncate any bad values */
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
/* 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);
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
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);
|
|
|
|
|
1998-08-30 13:19:36 +04:00
|
|
|
if (ch == 'Y') {
|
1997-10-13 06:18:06 +04:00
|
|
|
if (Player.p_gold < blessingcost)
|
|
|
|
++cheat;
|
|
|
|
else {
|
|
|
|
cheat = 0;
|
|
|
|
Player.p_gold -= blessingcost;
|
|
|
|
if (drandom() < 0.02)
|
|
|
|
dishonest = TRUE;
|
|
|
|
else
|
|
|
|
Player.p_blessing = TRUE;
|
|
|
|
}
|
1998-08-30 13:19:36 +04:00
|
|
|
}
|
1997-10-13 06:18:06 +04:00
|
|
|
break;
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
1997-10-13 06:18:06 +04:00
|
|
|
break;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
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());
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
if (numitems > Player.p_gems || numitems < 0)
|
1994-10-22 00:19:39 +03:00
|
|
|
++cheat;
|
1997-10-13 06:18:06 +04:00
|
|
|
else {
|
1994-10-22 00:19:39 +03:00
|
|
|
cheat = 0;
|
1997-10-13 06:18:06 +04:00
|
|
|
Player.p_gems -= numitems;
|
|
|
|
Player.p_gold += numitems * N_GEMVALUE;
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
1997-10-13 06:18:06 +04:00
|
|
|
}
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
if (cheat == 1)
|
|
|
|
mvaddstr(17, 0, "Come on, merchants aren't stupid. Stop cheating.\n");
|
1994-10-22 00:19:39 +03:00
|
|
|
else
|
1997-10-13 06:18:06 +04:00
|
|
|
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;
|
|
|
|
}
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
displaystats()
|
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
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));
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
allstatslist()
|
|
|
|
{
|
Add use of `const' where appropriate to the games.
This merges in all such remaining changes from the Linux port of the
NetBSD games, except in hunt (where substantial changes from OpenBSD
need to be looked at).
Some such changes were previously covered in PRs bin/6041, bin/6146,
bin/6148, bin/6150, bin/6151, bin/6580, bin/6660, bin/7993, bin/7994,
bin/8039, bin/8057 and bin/8093.
1999-09-09 01:17:44 +04:00
|
|
|
static const char *const flags[] = /* to print value of some bools */
|
1997-10-13 06:18:06 +04:00
|
|
|
{
|
|
|
|
"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);
|
2000-04-27 04:30:51 +04:00
|
|
|
mvprintw(16, 0, "Age : %9ld", Player.p_age);
|
1997-10-13 06:18:06 +04:00
|
|
|
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[(int)Player.p_blessing],
|
|
|
|
flags[Player.p_ring.ring_type != R_NONE],
|
|
|
|
flags[(int)Player.p_virgin],
|
|
|
|
flags[(int)Player.p_palantir]);
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
1997-10-13 06:18:06 +04:00
|
|
|
|
Add use of `const' where appropriate to the games.
This merges in all such remaining changes from the Linux port of the
NetBSD games, except in hunt (where substantial changes from OpenBSD
need to be looked at).
Some such changes were previously covered in PRs bin/6041, bin/6146,
bin/6148, bin/6150, bin/6151, bin/6580, bin/6660, bin/7993, bin/7994,
bin/8039, bin/8057 and bin/8093.
1999-09-09 01:17:44 +04:00
|
|
|
const char *
|
1994-10-22 00:19:39 +03:00
|
|
|
descrtype(playerp, shortflag)
|
1997-10-13 06:18:06 +04:00
|
|
|
struct player *playerp;
|
2005-02-15 15:58:21 +03:00
|
|
|
phbool shortflag;
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
int type; /* for caluculating result subscript */
|
Add use of `const' where appropriate to the games.
This merges in all such remaining changes from the Linux port of the
NetBSD games, except in hunt (where substantial changes from OpenBSD
need to be looked at).
Some such changes were previously covered in PRs bin/6041, bin/6146,
bin/6148, bin/6150, bin/6151, bin/6580, bin/6660, bin/7993, bin/7994,
bin/8039, bin/8057 and bin/8093.
1999-09-09 01:17:44 +04:00
|
|
|
static const char *const results[] =/* description table */
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
" 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) {
|
1994-10-22 00:19:39 +03:00
|
|
|
case SC_NONE:
|
1997-10-13 06:18:06 +04:00
|
|
|
type = playerp->p_type;
|
|
|
|
break;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
|
|
|
case SC_KING:
|
1997-10-13 06:18:06 +04:00
|
|
|
type = 7;
|
|
|
|
break;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
|
|
|
case SC_COUNCIL:
|
1997-10-13 06:18:06 +04:00
|
|
|
type = 8;
|
|
|
|
break;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
|
|
|
case SC_EXVALAR:
|
1997-10-13 06:18:06 +04:00
|
|
|
type = 9;
|
|
|
|
break;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
|
|
|
case SC_VALAR:
|
1997-10-13 06:18:06 +04:00
|
|
|
type = 10;
|
|
|
|
break;
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
type *= 2; /* calculate offset */
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
if (type > 20)
|
|
|
|
/* error */
|
|
|
|
type = 22;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
if (shortflag)
|
|
|
|
/* use short descriptions */
|
|
|
|
++type;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
if (playerp->p_crowns > 0) {
|
|
|
|
strcpy(Databuf, results[type]);
|
|
|
|
Databuf[0] = '*';
|
|
|
|
return (Databuf);
|
|
|
|
} else
|
|
|
|
return (results[type]);
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
long
|
|
|
|
findname(name, playerp)
|
Add use of `const' where appropriate to the games.
This merges in all such remaining changes from the Linux port of the
NetBSD games, except in hunt (where substantial changes from OpenBSD
need to be looked at).
Some such changes were previously covered in PRs bin/6041, bin/6146,
bin/6148, bin/6150, bin/6151, bin/6580, bin/6660, bin/7993, bin/7994,
bin/8039, bin/8057 and bin/8093.
1999-09-09 01:17:44 +04:00
|
|
|
const char *name;
|
1997-10-13 06:18:06 +04:00
|
|
|
struct player *playerp;
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
long loc = 0; /* location in the file */
|
|
|
|
|
1999-09-09 01:57:16 +04:00
|
|
|
fseek(Playersfp, 0L, SEEK_SET);
|
1997-10-13 06:18:06 +04:00
|
|
|
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;
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
return (-1);
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
long
|
|
|
|
allocrecord()
|
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
long loc = 0L; /* location in file */
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1999-09-09 01:57:16 +04:00
|
|
|
fseek(Playersfp, 0L, SEEK_SET);
|
1997-10-13 06:18:06 +04:00
|
|
|
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;
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
/* make a new record */
|
|
|
|
initplayer(&Other);
|
|
|
|
Player.p_status = S_OFF;
|
|
|
|
writerecord(&Other, loc);
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
return (loc);
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
freerecord(playerp, loc)
|
1997-10-13 06:18:06 +04:00
|
|
|
struct player *playerp;
|
|
|
|
long loc;
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
playerp->p_name[0] = CH_MARKDELETE;
|
|
|
|
playerp->p_status = S_NOTUSED;
|
|
|
|
writerecord(playerp, loc);
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
leavegame()
|
|
|
|
{
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
if (Player.p_level < 1.0)
|
|
|
|
/* delete character */
|
|
|
|
freerecord(&Player, Fileloc);
|
|
|
|
else {
|
|
|
|
Player.p_status = S_OFF;
|
|
|
|
writerecord(&Player, Fileloc);
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
cleanup(TRUE);
|
|
|
|
/* NOTREACHED */
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
death(how)
|
Add use of `const' where appropriate to the games.
This merges in all such remaining changes from the Linux port of the
NetBSD games, except in hunt (where substantial changes from OpenBSD
need to be looked at).
Some such changes were previously covered in PRs bin/6041, bin/6146,
bin/6148, bin/6150, bin/6151, bin/6580, bin/6660, bin/7993, bin/7994,
bin/8039, bin/8057 and bin/8093.
1999-09-09 01:17:44 +04:00
|
|
|
const char *how;
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
FILE *fp; /* for updating various files */
|
|
|
|
int ch; /* input */
|
Add use of `const' where appropriate to the games.
This merges in all such remaining changes from the Linux port of the
NetBSD games, except in hunt (where substantial changes from OpenBSD
need to be looked at).
Some such changes were previously covered in PRs bin/6041, bin/6146,
bin/6148, bin/6150, bin/6151, bin/6580, bin/6660, bin/7993, bin/7994,
bin/8039, bin/8057 and bin/8093.
1999-09-09 01:17:44 +04:00
|
|
|
static const char *const deathmesg[] =
|
1994-10-22 00:19:39 +03:00
|
|
|
/* add more messages here, if desired */
|
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
"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! "
|
1994-10-22 00:19:39 +03:00
|
|
|
};
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
clear();
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
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");
|
1999-09-09 01:57:16 +04:00
|
|
|
fseek(Monstfp, 13L * SZ_MONSTERSTRUCT, SEEK_SET);
|
1997-10-13 06:18:06 +04:00
|
|
|
fread((char *) &Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp);
|
|
|
|
strcpy(Curmonster.m_name, Player.p_name);
|
1999-09-09 01:57:16 +04:00
|
|
|
fseek(Monstfp, 13L * SZ_MONSTERSTRUCT, SEEK_SET);
|
1997-10-13 06:18:06 +04:00
|
|
|
fwrite((char *) &Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp);
|
|
|
|
fflush(Monstfp);
|
|
|
|
}
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
1997-10-13 06:18:06 +04:00
|
|
|
enterscore(); /* update score board */
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
/* 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);
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
/* let other players know */
|
|
|
|
fp = fopen(_PATH_MESS, "w");
|
|
|
|
fprintf(fp, "%s was killed by %s.", Player.p_name, how);
|
|
|
|
fclose(fp);
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
freerecord(&Player, Fileloc);
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
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",
|
2005-02-15 15:56:20 +03:00
|
|
|
(Wizard ? "-S" : (char *) NULL), (char *) NULL);
|
1997-10-13 06:18:06 +04:00
|
|
|
exit(0);
|
|
|
|
/* NOTREACHED */
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
1997-10-13 06:18:06 +04:00
|
|
|
cleanup(TRUE);
|
|
|
|
/* NOTREACHED */
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
writerecord(playerp, place)
|
1997-10-13 06:18:06 +04:00
|
|
|
struct player *playerp;
|
|
|
|
long place;
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1999-09-09 01:57:16 +04:00
|
|
|
fseek(Playersfp, place, SEEK_SET);
|
1997-10-13 06:18:06 +04:00
|
|
|
fwrite((char *) playerp, SZ_PLAYERSTRUCT, 1, Playersfp);
|
|
|
|
fflush(Playersfp);
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
double
|
|
|
|
explevel(experience)
|
1997-10-13 06:18:06 +04:00
|
|
|
double experience;
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
if (experience < 1.1e7)
|
|
|
|
return (floor(pow((experience / 1000.0), 0.4875)));
|
|
|
|
else
|
|
|
|
return (floor(pow((experience / 1250.0), 0.4865)));
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
truncstring(string)
|
1997-10-13 06:18:06 +04:00
|
|
|
char *string;
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
int length; /* length of string */
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
length = strlen(string);
|
|
|
|
while (string[--length] == ' ')
|
|
|
|
string[length] = '\0';
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
altercoordinates(xnew, ynew, operation)
|
1997-10-13 06:18:06 +04:00
|
|
|
double xnew;
|
|
|
|
double ynew;
|
|
|
|
int operation;
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
switch (operation) {
|
|
|
|
case A_FORCED: /* move with no checks */
|
|
|
|
break;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
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);
|
|
|
|
/* fall through for check */
|
1994-10-22 00:19:39 +03:00
|
|
|
|
|
|
|
case A_SPECIFIC: /* just move player */
|
1997-10-13 06:18:06 +04:00
|
|
|
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
|
|
|
|
*/
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
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);
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
1997-10-13 06:18:06 +04:00
|
|
|
break;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
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;
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
/* now set location flags and adjust coordinates */
|
|
|
|
Circle = CIRCLE(Player.p_x = floor(xnew), Player.p_y = floor(ynew));
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
/* set up flags based upon location */
|
|
|
|
Throne = Marsh = Beyond = FALSE;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
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;
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
readrecord(playerp, loc)
|
1997-10-13 06:18:06 +04:00
|
|
|
struct player *playerp;
|
|
|
|
long loc;
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1999-09-09 01:57:16 +04:00
|
|
|
fseek(Playersfp, loc, SEEK_SET);
|
1997-10-13 06:18:06 +04:00
|
|
|
fread((char *) playerp, SZ_PLAYERSTRUCT, 1, Playersfp);
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
adjuststats()
|
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
double dtemp; /* for temporary calculations */
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
if (explevel(Player.p_experience) > Player.p_level)
|
|
|
|
/* move one or more levels */
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
movelevel();
|
|
|
|
if (Player.p_level > 5.0)
|
|
|
|
Timeout = TRUE;
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
1997-10-13 06:18:06 +04:00
|
|
|
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
|
2003-01-20 08:29:53 +03:00
|
|
|
- Player.p_level;
|
1997-10-13 06:18:06 +04:00
|
|
|
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 */
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
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 */
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
/* 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;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
case R_NAZREG: /* ring disappears */
|
|
|
|
Player.p_ring.ring_type = R_NONE;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case R_SPOILED: /* ring kills player */
|
|
|
|
death("A cursed ring");
|
|
|
|
break;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
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 */
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
++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;
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
initplayer(playerp)
|
1997-10-13 06:18:06 +04:00
|
|
|
struct player *playerp;
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
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';
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
readmessage()
|
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
move(3, 0);
|
|
|
|
clrtoeol();
|
1999-09-09 01:57:16 +04:00
|
|
|
fseek(Messagefp, 0L, SEEK_SET);
|
1997-10-13 06:18:06 +04:00
|
|
|
if (fgets(Databuf, SZ_DATABUF, Messagefp) != NULL)
|
|
|
|
addstr(Databuf);
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
error(whichfile)
|
Add use of `const' where appropriate to the games.
This merges in all such remaining changes from the Linux port of the
NetBSD games, except in hunt (where substantial changes from OpenBSD
need to be looked at).
Some such changes were previously covered in PRs bin/6041, bin/6146,
bin/6148, bin/6150, bin/6151, bin/6580, bin/6660, bin/7993, bin/7994,
bin/8039, bin/8057 and bin/8093.
1999-09-09 01:17:44 +04:00
|
|
|
const char *whichfile;
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
2003-05-08 17:03:49 +04:00
|
|
|
int (*funcp)(const char *,...);
|
1997-10-13 06:18:06 +04:00
|
|
|
|
|
|
|
if (Windows) {
|
|
|
|
funcp = printw;
|
|
|
|
clear();
|
|
|
|
} else
|
|
|
|
funcp = printf;
|
|
|
|
|
2004-01-01 19:03:46 +03:00
|
|
|
(*funcp) ("An unrecoverable error has occurred reading %s. (%s)\n", whichfile, strerror(errno));
|
1997-10-13 06:18:06 +04:00
|
|
|
(*funcp) ("Please run 'setup' to determine the problem.\n");
|
|
|
|
cleanup(TRUE);
|
|
|
|
/* NOTREACHED */
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
double
|
2008-01-28 09:20:15 +03:00
|
|
|
distance(x_1, x_2, y_1, y_2)
|
|
|
|
double x_1, x_2, y_1, y_2;
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
double deltax, deltay;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
2008-01-28 09:20:15 +03:00
|
|
|
deltax = x_1 - x_2;
|
|
|
|
deltay = y_1 - y_2;
|
1997-10-13 06:18:06 +04:00
|
|
|
return (sqrt(deltax * deltax + deltay * deltay));
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
ill_sig(whichsig)
|
1997-10-13 06:18:06 +04:00
|
|
|
int whichsig;
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
clear();
|
|
|
|
if (!(whichsig == SIGINT || whichsig == SIGQUIT))
|
|
|
|
printw("Error: caught signal # %d.\n", whichsig);
|
|
|
|
cleanup(TRUE);
|
|
|
|
/* NOTREACHED */
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
1997-10-13 06:18:06 +04:00
|
|
|
|
Add use of `const' where appropriate to the games.
This merges in all such remaining changes from the Linux port of the
NetBSD games, except in hunt (where substantial changes from OpenBSD
need to be looked at).
Some such changes were previously covered in PRs bin/6041, bin/6146,
bin/6148, bin/6150, bin/6151, bin/6580, bin/6660, bin/7993, bin/7994,
bin/8039, bin/8057 and bin/8093.
1999-09-09 01:17:44 +04:00
|
|
|
const char *
|
1994-10-22 00:19:39 +03:00
|
|
|
descrstatus(playerp)
|
1997-10-13 06:18:06 +04:00
|
|
|
struct player *playerp;
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
switch (playerp->p_status) {
|
1994-10-22 00:19:39 +03:00
|
|
|
case S_PLAYING:
|
1997-10-13 06:18:06 +04:00
|
|
|
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");
|
1994-10-22 00:19:39 +03:00
|
|
|
|
|
|
|
case S_CLOAKED:
|
1997-10-13 06:18:06 +04:00
|
|
|
return ("Cloaked");
|
1994-10-22 00:19:39 +03:00
|
|
|
|
|
|
|
case S_INBATTLE:
|
1997-10-13 06:18:06 +04:00
|
|
|
return ("In Battle");
|
1994-10-22 00:19:39 +03:00
|
|
|
|
|
|
|
case S_MONSTER:
|
1997-10-13 06:18:06 +04:00
|
|
|
return ("Encounter");
|
1994-10-22 00:19:39 +03:00
|
|
|
|
|
|
|
case S_TRADING:
|
1997-10-13 06:18:06 +04:00
|
|
|
return ("Trading");
|
1994-10-22 00:19:39 +03:00
|
|
|
|
|
|
|
case S_OFF:
|
1997-10-13 06:18:06 +04:00
|
|
|
return ("Off");
|
1994-10-22 00:19:39 +03:00
|
|
|
|
|
|
|
case S_HUNGUP:
|
1997-10-13 06:18:06 +04:00
|
|
|
return ("Hung up");
|
1994-10-22 00:19:39 +03:00
|
|
|
|
|
|
|
default:
|
1997-10-13 06:18:06 +04:00
|
|
|
return ("");
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
double
|
|
|
|
drandom()
|
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
if (sizeof(int) != 2)
|
|
|
|
/* use only low bits */
|
|
|
|
return ((double) (random() & 0x7fff) / 32768.0);
|
|
|
|
else
|
|
|
|
return ((double) random() / 32768.0);
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
void
|
1994-10-22 00:19:39 +03:00
|
|
|
collecttaxes(gold, gems)
|
1997-10-13 06:18:06 +04:00
|
|
|
double gold;
|
|
|
|
double gems;
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
FILE *fp; /* to update Goldfile */
|
|
|
|
double dtemp; /* for temporary calculations */
|
|
|
|
double taxes; /* tax liability */
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
/* add to cache */
|
|
|
|
Player.p_gold += gold;
|
|
|
|
Player.p_gems += gems;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
/* calculate tax liability */
|
|
|
|
taxes = N_TAXAMOUNT / 100.0 * (N_GEMVALUE * gems + gold);
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
if (Player.p_gold < taxes)
|
|
|
|
/* not enough gold to pay taxes, must convert some gems to
|
|
|
|
* gold */
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
dtemp = floor(taxes / N_GEMVALUE + 1.0); /* number of gems to
|
|
|
|
* convert */
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
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;
|
1994-10-22 00:19:39 +03:00
|
|
|
|
1997-10-13 06:18:06 +04:00
|
|
|
if ((fp = fopen(_PATH_GOLD, "r+")) != NULL)
|
|
|
|
/* update taxes */
|
1994-10-22 00:19:39 +03:00
|
|
|
{
|
1997-10-13 06:18:06 +04:00
|
|
|
dtemp = 0.0;
|
|
|
|
fread((char *) &dtemp, sizeof(double), 1, fp);
|
|
|
|
dtemp += floor(taxes);
|
1999-09-09 01:57:16 +04:00
|
|
|
fseek(fp, 0L, SEEK_SET);
|
1997-10-13 06:18:06 +04:00
|
|
|
fwrite((char *) &dtemp, sizeof(double), 1, fp);
|
|
|
|
fclose(fp);
|
1994-10-22 00:19:39 +03:00
|
|
|
}
|
|
|
|
}
|