-+-+-+-+-+-+-+-+ START OF PART 26 -+-+-+-+-+-+-+-+ Xint get_string(in_str, row, column, slen) Xchar *in_str; Xint row, column, slen; X`7B X register int start_col, end_col, i; X char *p; X int flag, aborted; X#ifdef MAC X Rect area; X#endif X X aborted = FALSE; X flag`09= FALSE; X#ifdef MAC X area.left = column; X area.top = row; X area.right = column + slen; X area.bottom = row + 1; X DEraseScreen(&area); X DSetScreenCursor(column, row); X#else X (void) move(row, column); X for (i = slen; i > 0; i--) X (void) addch(' '); X (void) move(row, column); X#endif X start_col = column; X end_col = column + slen - 1; X if (end_col > 79) X `7B X slen = 80 - column; X end_col = 79; X `7D X p = in_str; X do X `7B X i = inkey(); X switch(i) X`09`7B X`09case ESCAPE: X`09 aborted = TRUE; X`09 break; X`09case CTRL('J'): case CTRL('M'): X`09 flag`09= TRUE; X`09 break; X`09case DELETE: case CTRL('H'): X`09 if (column > start_col) X`09 `7B X`09 column--; X`09 put_buffer(" ", row, column); X`09 move_cursor(row, column); X`09 *--p = '\0'; X`09 `7D X`09 break; X`09default: X`09 if (!isprint(i) `7C`7C column > end_col) X`09 bell(); X`09 else X`09 `7B X#ifdef MAC X`09 DSetScreenCursor(column, row); X`09 DWriteScreenCharAttr((char) i, ATTR_NORMAL); X#else X`09 use_value2 mvaddch(row, column, (char)i); X#endif X`09 *p++ = i; X`09 column++; X`09 `7D X`09 break; X`09`7D X `7D X while ((!flag) && (!aborted)); X if (aborted) X return(FALSE); X /* Remove trailing blanks`09*/ X while (p > in_str && p`5B-1`5D == ' ') X p--; X *p = '\0'; X return(TRUE); X`7D X X X/* Pauses for user response before returning`09`09-RAK-`09*/ Xvoid pause_line(prt_line) Xint prt_line; X`7B X prt("`5BPress any key to continue.`5D", prt_line, 23); X (void) inkey(); X erase_line(prt_line, 0); X`7D X X X/* Pauses for user response before returning`09`09-RAK-`09*/ X/* NOTE: Delay is for players trying to roll up "perfect"`09*/ X/*`09characters. Make them wait a bit.`09`09`09*/ Xvoid pause_exit(prt_line, delay) Xint prt_line; Xint delay; X`7B X char dummy; X X prt("`5BPress any key to continue, or Q to exit.`5D", prt_line, 10); X dummy = inkey(); X if (dummy == 'Q') X `7B X erase_line(prt_line, 0); X#ifndef MSDOS`09`09/* PCs are slow enough as is -dgk */ X if (delay > 0) (void) sleep((unsigned)delay); X#else X /* prevent message about delay unused */ X dummy = delay; X#endif X#ifdef MAC X enablefilemenu(FALSE); X exit_game(); X enablefilemenu(TRUE); X#else X exit_game(); X#endif X `7D X erase_line(prt_line, 0); X`7D X X#ifdef MAC Xvoid save_screen() X`7B X mac_save_screen(); X`7D X Xvoid restore_screen() X`7B X mac_restore_screen(); X`7D X#else Xvoid save_screen() X`7B X overwrite(stdscr, savescr); X`7D X Xvoid restore_screen() X`7B X overwrite(savescr, stdscr); X touchwin(stdscr); X`7D X#endif X Xvoid bell() X`7B X put_qio(); X X /* The player can turn off beeps if he/she finds them annoying. */ X if (! sound_beep_flag) X return; X X#ifdef MAC X mac_beep(); X#else X (void) write(1, "\007", 1); X#endif X`7D X X/* definitions used by screen_map() */ X/* index into border character array */ X#define TL 0`09/* top left */ X#define TR 1 X#define BL 2 X#define BR 3 X#define HE 4`09/* horizontal edge */ X#define VE 5 X X/* character set to use */ X#ifdef MSDOS X# ifdef ANSI X# define CH(x)`09(ansi ? screen_border`5B0`5D`5Bx`5D : screen_border`5B1`5 VD`5Bx`5D) X# else X# define CH(x)`09(screen_border`5B1`5D`5Bx`5D) X# endif X#else X# define CH(x)`09(screen_border`5B0`5D`5Bx`5D) X#endif X X /* Display highest priority object in the RATIO by RATIO area */ X#define`09RATIO 3 X Xvoid screen_map() X`7B X register int`09i, j; X static int8u screen_border`5B2`5D`5B6`5D = `7B X `7B'+', '+', '+', '+', '-', '`7C'`7D,`09/* normal chars */ X `7B201, 187, 200, 188, 205, 186`7D`09/* graphics chars */ X `7D; X int8u map`5BMAX_WIDTH / RATIO + 1`5D; X int8u tmp; X int priority`5B256`5D; X int row, orow, col, myrow, mycol = 0; X#ifndef MAC X char prntscrnbuf`5B80`5D; X#endif X X for (i = 0; i < 256; i++) X priority`5Bi`5D = 0; X priority`5B'<'`5D = 5; X priority`5B'>'`5D = 5; X priority`5B'@'`5D = 10; X#ifdef MSDOS X priority`5Bwallsym`5D = -5; X priority`5Bfloorsym`5D = -10; X#else X#ifndef ATARI_ST X priority`5B'#'`5D = -5; X#else X priority`5B(unsigned char)240`5D = -5; X#endif X priority`5B'.'`5D = -10; X#endif X priority`5B'\''`5D = -3; X priority`5B' '`5D = -15; X X save_screen(); X clear_screen(); X#ifdef MAC X DSetScreenCursor(0, 0); X DWriteScreenCharAttr(CH(TL), ATTR_NORMAL); X for (i = 0; i < MAX_WIDTH / RATIO; i++) X DWriteScreenCharAttr(CH(HE), ATTR_NORMAL); X DWriteScreenCharAttr(CH(TR), ATTR_NORMAL); X#else X use_value2 mvaddch(0, 0, CH(TL)); X for (i = 0; i < MAX_WIDTH / RATIO; i++) X (void) addch(CH(HE)); X (void) addch(CH(TR)); X#endif X orow = -1; X map`5BMAX_WIDTH / RATIO`5D = '\0'; X for (i = 0; i < MAX_HEIGHT; i++) X `7B X row = i / RATIO; X if (row != orow) X`09`7B X`09 if (orow >= 0) X`09 `7B X#ifdef MAC X`09 DSetScreenCursor(0, orow+1); X`09 DWriteScreenCharAttr(CH(VE), ATTR_NORMAL); X`09 DWriteScreenString((char *) map); X`09 DWriteScreenCharAttr(CH(VE), ATTR_NORMAL); X#else X`09 /* can not use mvprintw() on ibmpc, because PC-Curses is horribly X`09`09 written, and mvprintw() causes the fp emulation library to be X`09`09 linked with PC-Moria, makes the program 10K bigger */ X`09 (void) sprintf(prntscrnbuf,"%c%s%c",CH(VE), map, CH(VE)); X`09 use_value2 mvaddstr(orow+1, 0, prntscrnbuf); X#endif X`09 `7D X`09 for (j = 0; j < MAX_WIDTH / RATIO; j++) X`09 map`5Bj`5D = ' '; X`09 orow = row; X`09`7D X for (j = 0; j < MAX_WIDTH; j++) X`09`7B X`09 col = j / RATIO; X`09 tmp = loc_symbol(i, j); X`09 if (priority`5Bmap`5Bcol`5D`5D < priority`5Btmp`5D) X`09 map`5Bcol`5D = tmp; X`09 if (map`5Bcol`5D == '@') X`09 `7B X`09 mycol = col + 1; /* account for border */ X`09 myrow = row + 1; X`09 `7D X`09`7D X `7D X if (orow >= 0) X `7B X#ifdef MAC X DSetScreenCursor(0, orow+1); X DWriteScreenCharAttr(CH(VE), ATTR_NORMAL); X DWriteScreenString((char *) map); X DWriteScreenCharAttr(CH(VE), ATTR_NORMAL); X#else X (void) sprintf(prntscrnbuf,"%c%s%c",CH(VE), map, CH(VE)); X use_value2 mvaddstr(orow+1, 0, prntscrnbuf); X#endif X `7D X#ifdef MAC X DSetScreenCursor(0, orow + 2); X DWriteScreenCharAttr(CH(BL), ATTR_NORMAL); X for (i = 0; i < MAX_WIDTH / RATIO; i++) X DWriteScreenCharAttr(CH(HE), ATTR_NORMAL); X DWriteScreenCharAttr(CH(BR), ATTR_NORMAL); X#else X use_value2 mvaddch(orow + 2, 0, CH(BL)); X for (i = 0; i < MAX_WIDTH / RATIO; i++) X (void) addch(CH(HE)); X (void) addch(CH(BR)); X#endif X X#ifdef MAC X DSetScreenCursor(23, 23); X DWriteScreenStringAttr("Hit any key to continue", ATTR_NORMAL); X if (mycol > 0) X DSetScreenCursor(mycol, myrow); X#else X use_value2 mvaddstr(23, 23, "Hit any key to continue"); X if (mycol > 0) X (void) move(myrow, mycol); X#endif X (void) inkey(); X restore_screen(); X`7D $ CALL UNPACK IO.C;1 71753794 $ create 'f' X/* source/magic.c: code for mage spells X X Copyright (c) 1989-92 James E. Wilson, Robert A. Koeneke X X This software may be copied and distributed for educational, research, an Vd X not for profit purposes provided that this copyright and statement are X included in all such copies. */ X X#include "config.h" X#include "constant.h" X#include "types.h" X#include "externs.h" X X X/* Throw a magic spell`09`09`09`09`09-RAK-`09*/ Xvoid cast() X`7B X int i, j, item_val, dir; X int choice, chance, result; X register struct flags *f_ptr; X register struct misc *p_ptr; X register inven_type *i_ptr; X register spell_type *m_ptr; X#ifdef ATARIST_MWC X int32u holder; X#endif X X free_turn_flag = TRUE; X if (py.flags.blind > 0) X msg_print("You can't see to read your spell book!"); X else if (no_light()) X msg_print("You have no light to read by."); X else if (py.flags.confused > 0) X msg_print("You are too confused."); X else if (class`5Bpy.misc.pclass`5D.spell != MAGE) X msg_print("You can't cast spells!"); X else if (!find_range(TV_MAGIC_BOOK, TV_NEVER, &i, &j)) X msg_print("But you are not carrying any spell-books!"); X else if (get_item(&item_val, "Use which spell-book?", i, j, CNIL, CNIL)) X `7B X result = cast_spell("Cast which spell?", item_val, &choice, &chance); X if (result < 0) X`09msg_print("You don't know any spells in that book."); X else if (result > 0) X`09`7B X`09 m_ptr = &magic_spell`5Bpy.misc.pclass-1`5D`5Bchoice`5D; X`09 free_turn_flag = FALSE; X X`09 if (randint(100) < chance) X`09 msg_print("You failed to get the spell off!"); X`09 else X`09 `7B X`09 /* Spells. */ X`09 switch(choice+1) X`09`09`7B X`09`09case 1: X`09`09 if (get_dir(CNIL, &dir)) X`09`09 fire_bolt(GF_MAGIC_MISSILE, dir, char_row, char_col, X`09`09`09 damroll(2, 6), spell_names`5B0`5D); X`09`09 break; X`09`09case 2: X`09`09 (void) detect_monsters(); X`09`09 break; X`09`09case 3: X`09`09 teleport(10); X`09`09 break; X`09`09case 4: X`09`09 (void) light_area(char_row, char_col); X`09`09 break; X`09`09case 5: X`09`09 (void) hp_player(damroll(4, 4)); X`09`09 break; X`09`09case 6: X`09`09 (void) detect_sdoor(); X`09`09 (void) detect_trap(); X`09`09 break; X`09`09case 7: X`09`09 if (get_dir(CNIL, &dir)) X`09`09 fire_ball(GF_POISON_GAS, dir, char_row, char_col, 12, X`09`09`09 spell_names`5B6`5D); X`09`09 break; X`09`09case 8: X`09`09 if (get_dir(CNIL, &dir)) X`09`09 (void) confuse_monster(dir, char_row, char_col); X`09`09 break; X`09`09case 9: X`09`09 if (get_dir(CNIL, &dir)) X`09`09 fire_bolt(GF_LIGHTNING, dir, char_row, char_col, X`09`09`09 damroll(4, 8), spell_names`5B8`5D); X`09`09 break; X`09`09case 10: X`09`09 (void) td_destroy(); X`09`09 break; X`09`09case 11: X`09`09 if (get_dir(CNIL, &dir)) X`09`09 (void) sleep_monster(dir, char_row, char_col); X`09`09 break; X`09`09case 12: X`09`09 (void) cure_poison(); X`09`09 break; X`09`09case 13: X`09`09 teleport((int)(py.misc.lev*5)); X`09`09 break; X`09`09case 14: X`09`09 for (i = 22; i < INVEN_ARRAY_SIZE; i++) X`09`09 `7B X`09`09 i_ptr = &inventory`5Bi`5D; X#ifdef ATARIST_MWC X`09`09 i_ptr->flags = (i_ptr->flags & `7E(holder = TR_CURSED)); X#else X`09`09 i_ptr->flags = (i_ptr->flags & `7ETR_CURSED); X#endif X`09`09 `7D X`09`09 break; X`09`09case 15: X`09`09 if (get_dir(CNIL, &dir)) X`09`09 fire_bolt(GF_FROST, dir, char_row, char_col, X`09`09`09 damroll(6, 8), spell_names`5B14`5D); X`09`09 break; X`09`09case 16: X`09`09 if (get_dir(CNIL, &dir)) X`09`09 (void) wall_to_mud(dir, char_row, char_col); X`09`09 break; X`09`09case 17: X`09`09 create_food(); X`09`09 break; X`09`09case 18: X`09`09 (void) recharge(20); X`09`09 break; X`09`09case 19: X`09`09 (void) sleep_monsters1(char_row, char_col); X`09`09 break; X`09`09case 20: X`09`09 if (get_dir(CNIL, &dir)) X`09`09 (void) poly_monster(dir, char_row, char_col); X`09`09 break; X`09`09case 21: X`09`09 (void) ident_spell(); X`09`09 break; X`09`09case 22: X`09`09 (void) sleep_monsters2(); X`09`09 break; X`09`09case 23: X`09`09 if (get_dir(CNIL, &dir)) X`09`09 fire_bolt(GF_FIRE, dir, char_row, char_col, X`09`09`09 damroll(9, 8), spell_names`5B22`5D); X`09`09 break; X`09`09case 24: X`09`09 if (get_dir(CNIL, &dir)) X`09`09 (void)speed_monster(dir, char_row, char_col, -1); X`09`09 break; X`09`09case 25: X`09`09 if (get_dir(CNIL, &dir)) X`09`09 fire_ball(GF_FROST, dir, char_row, char_col, 48, X`09`09`09 spell_names`5B24`5D); X`09`09 break; X`09`09case 26: X`09`09 (void) recharge(60); X`09`09 break; X`09`09case 27: X`09`09 if (get_dir(CNIL, &dir)) X`09`09 (void) teleport_monster(dir, char_row, char_col); X`09`09 break; X`09`09case 28: X`09`09 f_ptr = &py.flags; X`09`09 f_ptr->fast += randint(20) + py.misc.lev; X`09`09 break; X`09`09case 29: X`09`09 if (get_dir(CNIL, &dir)) X`09`09 fire_ball(GF_FIRE, dir, char_row, char_col, 72, X`09`09`09 spell_names`5B28`5D); X`09`09 break; X`09`09case 30: X`09`09 destroy_area(char_row, char_col); X`09`09 break; X`09`09case 31: X`09`09 (void) genocide(); X`09`09 break; X`09`09default: X`09`09 break; X`09`09`7D X`09 /* End of spells.`09`09`09`09 */ X`09 if (!free_turn_flag) X`09`09`7B X`09`09 p_ptr = &py.misc; X`09`09 if ((spell_worked & (1L << choice)) == 0) X`09`09 `7B X`09`09 p_ptr->exp += m_ptr->sexp << 2; X`09`09 spell_worked `7C= (1L << choice); X`09`09 prt_experience(); X`09`09 `7D X`09`09`7D X`09 `7D X`09 p_ptr = &py.misc; X`09 if (!free_turn_flag) X`09 `7B X`09 if (m_ptr->smana > p_ptr->cmana) X`09`09`7B X`09`09 msg_print("You faint from the effort!"); X`09`09 py.flags.paralysis = X`09`09 randint((int)(5*(m_ptr->smana-p_ptr->cmana))); X`09`09 p_ptr->cmana = 0; X`09`09 p_ptr->cmana_frac = 0; X`09`09 if (randint(3) == 1) X`09`09 `7B X`09`09 msg_print("You have damaged your health!"); X`09`09 (void) dec_stat (A_CON); X`09`09 `7D X`09`09`7D X`09 else X`09`09p_ptr->cmana -= m_ptr->smana; X`09 prt_cmana(); X`09 `7D X`09`7D X `7D X`7D $ CALL UNPACK MAGIC.C;1 1398520071 $ create 'f' X/* UNIX Moria Version 5.x X source/main.c: initialization, main() function and main loop X Copyright (c) 1989-92 James E. Wilson, Robert A. Koeneke X X This software may be copied and distributed for educational, research, an Vd X not for profit purposes provided that this copyright and statement are X included in all such copies. */ X X X/* Original copyright message follows. */ X X/* Moria Version 4.8`09COPYRIGHT (c) Robert Alan Koeneke`09`09*/ X/*`09`09`09`09`09`09`09`09`09 */ X/*`09 I lovingly dedicate this game to hackers and adventurers`09 */ X/*`09 everywhere...`09`09`09`09`09`09`09 */ +-+-+-+-+-+-+-+- END OF PART 26 +-+-+-+-+-+-+-+-