364 lines
8.7 KiB
C
364 lines
8.7 KiB
C
/*
|
|
getplay.c - Procedures for saving and retrieving a characters starting
|
|
attributes, armour, and weapon.
|
|
|
|
UltraRogue: The Ultimate Adventure in the Dungeons of Doom
|
|
Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
|
|
All rights reserved.
|
|
|
|
See the file LICENSE.TXT for full copyright and licensing information.
|
|
*/
|
|
|
|
/* 11/08/83 ???, S.A. Hester */
|
|
|
|
#include <stdlib.h>
|
|
#include <ctype.h>
|
|
#include <string.h>
|
|
#include "rogue.h"
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#define I_STR 0
|
|
#define I_INTEL 1
|
|
#define I_WISDOM 2
|
|
#define I_DEXT 3
|
|
#define I_CONST 4
|
|
#define I_CHARISMA 5
|
|
#define I_HPT 6
|
|
#define I_POWER 7
|
|
#define I_CTYPE 8
|
|
#define MAXPATT 9 /* Total Number of above defines. */
|
|
#define MAXPDEF 10 /* Maximum number of pre-defined chars */
|
|
|
|
static int def_array[MAXPDEF][MAXPATT]; /* Pre-def'd chars */
|
|
|
|
static void get_chr_filename(char *filename, int size)
|
|
{
|
|
const char *home;
|
|
|
|
home = getenv("HOME");
|
|
|
|
#ifdef CHARDIR
|
|
if (use_savedir)
|
|
{
|
|
strncpy(filename, CHARDIR, size);
|
|
filename[size-1] = '\0';
|
|
snprintf(filename, size, "%s/%d-%.80s.chr", CHARDIR, md_getuid(),
|
|
whoami);
|
|
return;
|
|
}
|
|
#endif
|
|
if (home) {
|
|
if ((int)strlen(home) < (size - 12) )
|
|
{
|
|
strcpy(filename, home);
|
|
strcat(filename,"/urogue.chr");
|
|
}
|
|
else
|
|
strncpy(filename,"urogue.chr",size);
|
|
}
|
|
else
|
|
strcpy(filename, "urogue.chr");
|
|
}
|
|
|
|
int
|
|
geta_player(void)
|
|
{
|
|
int i;
|
|
FILE *fd;
|
|
char pbuf[2 * LINELEN];
|
|
char filename[200];
|
|
|
|
get_chr_filename(filename, sizeof(filename));
|
|
|
|
if ((fd = fopen(filename, "r")) == NULL)
|
|
return(FALSE);
|
|
|
|
fread(def_array, sizeof(def_array), 1, fd);
|
|
fclose(fd);
|
|
|
|
wclear(hw);
|
|
touchwin(hw);
|
|
|
|
print_stored();
|
|
mvwaddstr(hw, 0, 0, "Do you wish to select a character? ");
|
|
wrefresh(hw);
|
|
|
|
if (readcharw(hw) != 'y')
|
|
return FALSE;
|
|
|
|
do
|
|
{
|
|
wmove(hw, LINES - 1, 0);
|
|
wclrtoeol(hw);
|
|
mvwaddstr(hw, 0, 0, "Enter the number of a pre-defined character: ");
|
|
wclrtoeol(hw);
|
|
wrefresh(hw);
|
|
get_string(pbuf, hw);
|
|
i = atoi(pbuf) - 1;
|
|
|
|
if (i < 0 || i > MAXPDEF - 1)
|
|
{
|
|
wstandout(hw);
|
|
mvwaddstr(hw, 1, 0, "Please use the range 1 to");
|
|
wprintw(hw, " %d.", MAXPDEF);
|
|
wstandend(hw);
|
|
wclrtoeol(hw);
|
|
wrefresh(hw);
|
|
}
|
|
else if (def_array[i][I_STR] == 0)
|
|
{
|
|
wstandout(hw);
|
|
mvwaddstr(hw,1,0,"Please enter the number of a known character: ");
|
|
wstandend(hw);
|
|
wclrtoeol(hw);
|
|
}
|
|
else
|
|
{
|
|
mvwaddstr(hw, 1, 0, "");
|
|
wclrtoeol(hw);
|
|
}
|
|
|
|
}
|
|
while (i < 0 || i > MAXPDEF - 1 || (def_array[i][I_STR] == 0));
|
|
|
|
pstats.s_str = def_array[i][I_STR];
|
|
pstats.s_intel = def_array[i][I_INTEL];
|
|
pstats.s_wisdom = def_array[i][I_WISDOM];
|
|
pstats.s_dext = def_array[i][I_DEXT];
|
|
pstats.s_const = def_array[i][I_CONST];
|
|
pstats.s_charisma = def_array[i][I_CHARISMA];
|
|
pstats.s_hpt = def_array[i][I_HPT];
|
|
pstats.s_power = def_array[i][I_POWER];
|
|
player.t_ctype = char_type = def_array[i][I_CTYPE];
|
|
max_stats = pstats;
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
void
|
|
puta_player(void)
|
|
{
|
|
FILE *fd;
|
|
char pbuf[2 * LINELEN];
|
|
char filename[200];
|
|
int i;
|
|
char *class = which_class(player.t_ctype);
|
|
|
|
sprintf(pbuf, "You have a %s with the following attributes:", class);
|
|
mvwaddstr(hw, 2, 0, pbuf);
|
|
wclrtoeol(hw);
|
|
|
|
sprintf(pbuf,
|
|
"Int: %d Str: %d Wis: %d Dex: %d Con: %d Cha: %d Pow: %d Hpt: %ld",
|
|
pstats.s_intel,
|
|
pstats.s_str,
|
|
pstats.s_wisdom,
|
|
pstats.s_dext,
|
|
pstats.s_const,
|
|
pstats.s_charisma,
|
|
pstats.s_power,
|
|
pstats.s_hpt );
|
|
|
|
mvwaddstr(hw, 3, 0, "");
|
|
wclrtoeol(hw);
|
|
mvwaddstr(hw, 4, 0, pbuf);
|
|
wclrtoeol(hw);
|
|
mvwaddstr(hw, 5, 0, "");
|
|
wclrtoeol(hw);
|
|
mvwaddstr(hw, 0, 0, "Would you like to save this character?");
|
|
wclrtoeol(hw);
|
|
|
|
|
|
wrefresh(hw);
|
|
|
|
if ((readcharw(hw) & 0177) != 'y')
|
|
return;
|
|
|
|
do
|
|
{
|
|
mvwaddstr(hw, 0, 0, "Overwrite which number? ");
|
|
wclrtoeol(hw);
|
|
wrefresh(hw);
|
|
get_string(pbuf, hw);
|
|
i = atoi(pbuf) - 1;
|
|
|
|
if (i < 0 || i > MAXPDEF - 1)
|
|
{
|
|
wstandout(hw);
|
|
mvwaddstr(hw, 1, 0, "Use the range 1 to");
|
|
wprintw(hw, " %d!", MAXPDEF);
|
|
wstandend(hw);
|
|
wclrtoeol(hw);
|
|
wrefresh(hw);
|
|
}
|
|
}
|
|
while (i < 0 || i > MAXPDEF - 1);
|
|
|
|
/* Set some global stuff */
|
|
|
|
def_array[i][I_STR] = pstats.s_str;
|
|
def_array[i][I_INTEL] = pstats.s_intel;
|
|
def_array[i][I_WISDOM] = pstats.s_wisdom;
|
|
def_array[i][I_DEXT] = pstats.s_dext;
|
|
def_array[i][I_CONST] = pstats.s_const;
|
|
def_array[i][I_CHARISMA] = pstats.s_charisma;
|
|
def_array[i][I_HPT] = pstats.s_hpt;
|
|
def_array[i][I_POWER] = pstats.s_power;
|
|
def_array[i][I_CTYPE] = player.t_ctype;
|
|
|
|
/* OK. Now let's write this stuff out! */
|
|
|
|
get_chr_filename(filename, sizeof(filename));
|
|
|
|
|
|
if ((fd = fopen(filename, "w")) == NULL)
|
|
{
|
|
sprintf(pbuf, "I can't seem to open/create urogue.chr.");
|
|
mvwaddstr(hw, 5, 5, pbuf);
|
|
mvwaddstr(hw, 6, 5, "However I'll let you play it anyway!");
|
|
mvwaddstr(hw, LINES - 1, 0, spacemsg);
|
|
wrefresh(hw);
|
|
wait_for(' ');
|
|
|
|
return;
|
|
}
|
|
|
|
fwrite(def_array, sizeof(def_array), 1, fd);
|
|
fclose(fd);
|
|
return;
|
|
}
|
|
|
|
void
|
|
do_getplayer(void)
|
|
{
|
|
print_stored();
|
|
|
|
if (char_type == C_NOTSET)
|
|
do
|
|
{
|
|
/* See what type character will be */
|
|
|
|
mvwaddstr(hw, 3, 0, "[a] Fighter\t"
|
|
"[b] Paladin\t"
|
|
"[c] Ranger\n"
|
|
"[d] Cleric\t"
|
|
"[e] Druid\t"
|
|
"[f] Magician\n"
|
|
"[g] Illusionist\t"
|
|
"[h] Thief\t"
|
|
"[i] Assasin\t"
|
|
"[j] Ninja");
|
|
|
|
mvwaddstr(hw, 0, 0, "What character class do you desire? ");
|
|
wrefresh(hw);
|
|
char_type = readcharw(hw) - 'a';
|
|
|
|
if (char_type < C_FIGHTER || char_type >= C_MONSTER)
|
|
{
|
|
wstandout(hw);
|
|
mvwaddstr(hw, 1, 0, "Please enter a letter from a - j");
|
|
wstandend(hw);
|
|
wclrtoeol(hw);
|
|
wrefresh(hw);
|
|
}
|
|
else
|
|
{
|
|
mvwaddstr(hw, 1, 0, "");
|
|
wclrtoeol(hw);
|
|
}
|
|
}
|
|
while (char_type < C_FIGHTER || char_type >= C_MONSTER);
|
|
|
|
player.t_ctype = char_type;
|
|
}
|
|
|
|
void
|
|
print_stored(void)
|
|
{
|
|
int i;
|
|
char *class;
|
|
char pbuf[2 * LINELEN];
|
|
|
|
wstandout(hw);
|
|
mvwaddstr(hw, 9, 0, "YOUR CURRENT CHARACTERS:");
|
|
wstandend(hw);
|
|
wclrtoeol(hw);
|
|
|
|
for (i = 0; i < MAXPDEF; i++)
|
|
{
|
|
if (def_array[i][I_STR])
|
|
{
|
|
class = which_class(def_array[i][I_CTYPE]);
|
|
|
|
sprintf(pbuf,
|
|
"%2d. (%s): Int: %d Str: %d Wis: %d Dex: %d Con: %d Cha: %d"
|
|
" Pow: %d Hpt: %d",
|
|
i + 1,
|
|
class,
|
|
def_array[i][I_INTEL],
|
|
def_array[i][I_STR],
|
|
def_array[i][I_WISDOM],
|
|
def_array[i][I_DEXT],
|
|
def_array[i][I_CONST],
|
|
def_array[i][I_CHARISMA],
|
|
def_array[i][I_POWER],
|
|
def_array[i][I_HPT]);
|
|
|
|
mvwaddstr(hw, 11 + i, 0, pbuf);
|
|
|
|
}
|
|
else
|
|
{
|
|
sprintf(pbuf, "%2d. ### NONE ###", i + 1);
|
|
mvwaddstr(hw, 11 + i, 0, pbuf);
|
|
}
|
|
}
|
|
}
|
|
|
|
char *
|
|
which_class(int c_class)
|
|
{
|
|
char *class;
|
|
|
|
switch (c_class)
|
|
{
|
|
case C_FIGHTER:
|
|
class = "Fighter";
|
|
break;
|
|
case C_MAGICIAN:
|
|
class = "Magician";
|
|
break;
|
|
case C_CLERIC:
|
|
class = "Cleric";
|
|
break;
|
|
case C_THIEF:
|
|
class = "Thief";
|
|
break;
|
|
case C_PALADIN:
|
|
class = "Paladin";
|
|
break;
|
|
case C_RANGER:
|
|
class = "Ranger";
|
|
break;
|
|
case C_DRUID:
|
|
class = "Druid";
|
|
break;
|
|
case C_ILLUSION:
|
|
class = "Illusionist";
|
|
break;
|
|
case C_ASSASIN:
|
|
class = "Assasin";
|
|
break;
|
|
case C_NINJA:
|
|
class = "Ninja";
|
|
break;
|
|
default:
|
|
class = "Monster";
|
|
break;
|
|
}
|
|
|
|
return (class);
|
|
}
|