Annotation of early-roguelike/urogue/getplay.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: getplay.c - Procedures for saving and retrieving a characters starting
! 3: attributes, armour, and weapon.
! 4:
! 5: UltraRogue: The Ultimate Adventure in the Dungeons of Doom
! 6: Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
! 7: All rights reserved.
! 8:
! 9: See the file LICENSE.TXT for full copyright and licensing information.
! 10: */
! 11:
! 12: /* 11/08/83 ???, S.A. Hester */
! 13:
! 14: #include <stdlib.h>
! 15: #include <ctype.h>
! 16: #include <string.h>
! 17: #include "rogue.h"
! 18:
! 19: #ifdef HAVE_CONFIG_H
! 20: #include "config.h"
! 21: #endif
! 22:
! 23: #define I_STR 0
! 24: #define I_INTEL 1
! 25: #define I_WISDOM 2
! 26: #define I_DEXT 3
! 27: #define I_CONST 4
! 28: #define I_CHARISMA 5
! 29: #define I_HPT 6
! 30: #define I_POWER 7
! 31: #define I_CTYPE 8
! 32: #define MAXPATT 9 /* Total Number of above defines. */
! 33: #define MAXPDEF 10 /* Maximum number of pre-defined chars */
! 34:
! 35: static int def_array[MAXPDEF][MAXPATT]; /* Pre-def'd chars */
! 36:
! 37: static void get_chr_filename(char *filename, int size)
! 38: {
! 39: const char *home;
! 40:
! 41: home = getenv("HOME");
! 42:
! 43: #ifdef CHARDIR
! 44: if (use_savedir)
! 45: {
! 46: strncpy(filename, CHARDIR, size);
! 47: filename[size-1] = '\0';
! 48: snprintf(filename, size, "%s/%d-%.80s.chr", CHARDIR, md_getuid(),
! 49: whoami);
! 50: return;
! 51: }
! 52: #endif
! 53: if (home) {
! 54: if ((int)strlen(home) < (size - 12) )
! 55: {
! 56: strcpy(filename, home);
! 57: strcat(filename,"/urogue.chr");
! 58: }
! 59: else
! 60: strncpy(filename,"urogue.chr",size);
! 61: }
! 62: else
! 63: strcpy(filename, "urogue.chr");
! 64: }
! 65:
! 66: int
! 67: geta_player(void)
! 68: {
! 69: int i;
! 70: FILE *fd;
! 71: char pbuf[2 * LINELEN];
! 72: char filename[200];
! 73:
! 74: get_chr_filename(filename, sizeof(filename));
! 75:
! 76: if ((fd = fopen(filename, "r")) == NULL)
! 77: return(FALSE);
! 78:
! 79: fread(def_array, sizeof(def_array), 1, fd);
! 80: fclose(fd);
! 81:
! 82: wclear(hw);
! 83: touchwin(hw);
! 84:
! 85: print_stored();
! 86: mvwaddstr(hw, 0, 0, "Do you wish to select a character? ");
! 87: wrefresh(hw);
! 88:
! 89: if (readcharw(hw) != 'y')
! 90: return FALSE;
! 91:
! 92: do
! 93: {
! 94: wmove(hw, LINES - 1, 0);
! 95: wclrtoeol(hw);
! 96: mvwaddstr(hw, 0, 0, "Enter the number of a pre-defined character: ");
! 97: wclrtoeol(hw);
! 98: wrefresh(hw);
! 99: get_string(pbuf, hw);
! 100: i = atoi(pbuf) - 1;
! 101:
! 102: if (i < 0 || i > MAXPDEF - 1)
! 103: {
! 104: wstandout(hw);
! 105: mvwaddstr(hw, 1, 0, "Please use the range 1 to");
! 106: wprintw(hw, " %d.", MAXPDEF);
! 107: wstandend(hw);
! 108: wclrtoeol(hw);
! 109: wrefresh(hw);
! 110: }
! 111: else if (def_array[i][I_STR] == 0)
! 112: {
! 113: wstandout(hw);
! 114: mvwaddstr(hw,1,0,"Please enter the number of a known character: ");
! 115: wstandend(hw);
! 116: wclrtoeol(hw);
! 117: }
! 118: else
! 119: {
! 120: mvwaddstr(hw, 1, 0, "");
! 121: wclrtoeol(hw);
! 122: }
! 123:
! 124: }
! 125: while (i < 0 || i > MAXPDEF - 1 || (def_array[i][I_STR] == 0));
! 126:
! 127: pstats.s_str = def_array[i][I_STR];
! 128: pstats.s_intel = def_array[i][I_INTEL];
! 129: pstats.s_wisdom = def_array[i][I_WISDOM];
! 130: pstats.s_dext = def_array[i][I_DEXT];
! 131: pstats.s_const = def_array[i][I_CONST];
! 132: pstats.s_charisma = def_array[i][I_CHARISMA];
! 133: pstats.s_hpt = def_array[i][I_HPT];
! 134: pstats.s_power = def_array[i][I_POWER];
! 135: player.t_ctype = char_type = def_array[i][I_CTYPE];
! 136: max_stats = pstats;
! 137:
! 138: return(TRUE);
! 139: }
! 140:
! 141: void
! 142: puta_player(void)
! 143: {
! 144: FILE *fd;
! 145: char pbuf[2 * LINELEN];
! 146: char filename[200];
! 147: int i;
! 148: char *class = which_class(player.t_ctype);
! 149:
! 150: sprintf(pbuf, "You have a %s with the following attributes:", class);
! 151: mvwaddstr(hw, 2, 0, pbuf);
! 152: wclrtoeol(hw);
! 153:
! 154: sprintf(pbuf,
! 155: "Int: %d Str: %d Wis: %d Dex: %d Con: %d Cha: %d Pow: %d Hpt: %ld",
! 156: pstats.s_intel,
! 157: pstats.s_str,
! 158: pstats.s_wisdom,
! 159: pstats.s_dext,
! 160: pstats.s_const,
! 161: pstats.s_charisma,
! 162: pstats.s_power,
! 163: pstats.s_hpt );
! 164:
! 165: mvwaddstr(hw, 3, 0, "");
! 166: wclrtoeol(hw);
! 167: mvwaddstr(hw, 4, 0, pbuf);
! 168: wclrtoeol(hw);
! 169: mvwaddstr(hw, 5, 0, "");
! 170: wclrtoeol(hw);
! 171: mvwaddstr(hw, 0, 0, "Would you like to save this character?");
! 172: wclrtoeol(hw);
! 173:
! 174:
! 175: wrefresh(hw);
! 176:
! 177: if ((readcharw(hw) & 0177) != 'y')
! 178: return;
! 179:
! 180: do
! 181: {
! 182: mvwaddstr(hw, 0, 0, "Overwrite which number? ");
! 183: wclrtoeol(hw);
! 184: wrefresh(hw);
! 185: get_string(pbuf, hw);
! 186: i = atoi(pbuf) - 1;
! 187:
! 188: if (i < 0 || i > MAXPDEF - 1)
! 189: {
! 190: wstandout(hw);
! 191: mvwaddstr(hw, 1, 0, "Use the range 1 to");
! 192: wprintw(hw, " %d!", MAXPDEF);
! 193: wstandend(hw);
! 194: wclrtoeol(hw);
! 195: wrefresh(hw);
! 196: }
! 197: }
! 198: while (i < 0 || i > MAXPDEF - 1);
! 199:
! 200: /* Set some global stuff */
! 201:
! 202: def_array[i][I_STR] = pstats.s_str;
! 203: def_array[i][I_INTEL] = pstats.s_intel;
! 204: def_array[i][I_WISDOM] = pstats.s_wisdom;
! 205: def_array[i][I_DEXT] = pstats.s_dext;
! 206: def_array[i][I_CONST] = pstats.s_const;
! 207: def_array[i][I_CHARISMA] = pstats.s_charisma;
! 208: def_array[i][I_HPT] = pstats.s_hpt;
! 209: def_array[i][I_POWER] = pstats.s_power;
! 210: def_array[i][I_CTYPE] = player.t_ctype;
! 211:
! 212: /* OK. Now let's write this stuff out! */
! 213:
! 214: get_chr_filename(filename, sizeof(filename));
! 215:
! 216:
! 217: if ((fd = fopen(filename, "w")) == NULL)
! 218: {
! 219: sprintf(pbuf, "I can't seem to open/create urogue.chr.");
! 220: mvwaddstr(hw, 5, 5, pbuf);
! 221: mvwaddstr(hw, 6, 5, "However I'll let you play it anyway!");
! 222: mvwaddstr(hw, LINES - 1, 0, spacemsg);
! 223: wrefresh(hw);
! 224: wait_for(' ');
! 225:
! 226: return;
! 227: }
! 228:
! 229: fwrite(def_array, sizeof(def_array), 1, fd);
! 230: fclose(fd);
! 231: return;
! 232: }
! 233:
! 234: void
! 235: do_getplayer(void)
! 236: {
! 237: print_stored();
! 238:
! 239: if (char_type == C_NOTSET)
! 240: do
! 241: {
! 242: /* See what type character will be */
! 243:
! 244: mvwaddstr(hw, 3, 0, "[a] Fighter\t"
! 245: "[b] Paladin\t"
! 246: "[c] Ranger\n"
! 247: "[d] Cleric\t"
! 248: "[e] Druid\t"
! 249: "[f] Magician\n"
! 250: "[g] Illusionist\t"
! 251: "[h] Thief\t"
! 252: "[i] Assasin\t"
! 253: "[j] Ninja");
! 254:
! 255: mvwaddstr(hw, 0, 0, "What character class do you desire? ");
! 256: wrefresh(hw);
! 257: char_type = readcharw(hw) - 'a';
! 258:
! 259: if (char_type < C_FIGHTER || char_type >= C_MONSTER)
! 260: {
! 261: wstandout(hw);
! 262: mvwaddstr(hw, 1, 0, "Please enter a letter from a - j");
! 263: wstandend(hw);
! 264: wclrtoeol(hw);
! 265: wrefresh(hw);
! 266: }
! 267: else
! 268: {
! 269: mvwaddstr(hw, 1, 0, "");
! 270: wclrtoeol(hw);
! 271: }
! 272: }
! 273: while (char_type < C_FIGHTER || char_type >= C_MONSTER);
! 274:
! 275: player.t_ctype = char_type;
! 276: }
! 277:
! 278: void
! 279: print_stored(void)
! 280: {
! 281: int i;
! 282: char *class;
! 283: char pbuf[2 * LINELEN];
! 284:
! 285: wstandout(hw);
! 286: mvwaddstr(hw, 9, 0, "YOUR CURRENT CHARACTERS:");
! 287: wstandend(hw);
! 288: wclrtoeol(hw);
! 289:
! 290: for (i = 0; i < MAXPDEF; i++)
! 291: {
! 292: if (def_array[i][I_STR])
! 293: {
! 294: class = which_class(def_array[i][I_CTYPE]);
! 295:
! 296: sprintf(pbuf,
! 297: "%2d. (%s): Int: %d Str: %d Wis: %d Dex: %d Con: %d Cha: %d"
! 298: " Pow: %d Hpt: %d",
! 299: i + 1,
! 300: class,
! 301: def_array[i][I_INTEL],
! 302: def_array[i][I_STR],
! 303: def_array[i][I_WISDOM],
! 304: def_array[i][I_DEXT],
! 305: def_array[i][I_CONST],
! 306: def_array[i][I_CHARISMA],
! 307: def_array[i][I_POWER],
! 308: def_array[i][I_HPT]);
! 309:
! 310: mvwaddstr(hw, 11 + i, 0, pbuf);
! 311:
! 312: }
! 313: else
! 314: {
! 315: sprintf(pbuf, "%2d. ### NONE ###", i + 1);
! 316: mvwaddstr(hw, 11 + i, 0, pbuf);
! 317: }
! 318: }
! 319: }
! 320:
! 321: char *
! 322: which_class(int c_class)
! 323: {
! 324: char *class;
! 325:
! 326: switch (c_class)
! 327: {
! 328: case C_FIGHTER:
! 329: class = "Fighter";
! 330: break;
! 331: case C_MAGICIAN:
! 332: class = "Magician";
! 333: break;
! 334: case C_CLERIC:
! 335: class = "Cleric";
! 336: break;
! 337: case C_THIEF:
! 338: class = "Thief";
! 339: break;
! 340: case C_PALADIN:
! 341: class = "Paladin";
! 342: break;
! 343: case C_RANGER:
! 344: class = "Ranger";
! 345: break;
! 346: case C_DRUID:
! 347: class = "Druid";
! 348: break;
! 349: case C_ILLUSION:
! 350: class = "Illusionist";
! 351: break;
! 352: case C_ASSASIN:
! 353: class = "Assasin";
! 354: break;
! 355: case C_NINJA:
! 356: class = "Ninja";
! 357: break;
! 358: default:
! 359: class = "Monster";
! 360: break;
! 361: }
! 362:
! 363: return (class);
! 364: }
CVSweb