void save_screen(void) { FILE *fp; short i, j; char buf[ROGUE_COLUMNS + 2]; boolean found_non_blank; if ((fp = fopen("rogue.screen", "w")) != NULL) { for (i = 0; i < ROGUE_LINES; i++) { found_non_blank = 0; for (j = (ROGUE_COLUMNS - 1); j >= 0; j--) { buf[j] = mvinch_rogue(i, j); if (!found_non_blank) { if ((buf[j] != ' ') || (j == 0)) { buf[j + ((j == 0) ? 0 : 1)] = 0; found_non_blank = 1; } } } fputs(buf, fp); putc('\n', fp); } fclose(fp); } else { sound_bell(); } }
int get_direction(void) { int dir; message(mesg[55], 0); while (!is_direction(dir = rgetchar())) { sound_bell(); } check_message(); return dir; }
void fight(boolean to_the_death) { short ch, c, d; short row, col; boolean first_miss = 1; short possible_damage; object *monster; while (!is_direction(ch = rgetchar(), &d)) { sound_bell(); if (first_miss) { message("direction?", 0); first_miss = 0; } } check_message(); if (ch == CANCEL) { return; } row = rogue.row; col = rogue.col; get_dir_rc(d, &row, &col, 0); c = mvinch(row, col); if (((c < 'A') || (c > 'Z')) || (!can_move(rogue.row, rogue.col, row, col))) { message("I see no monster there", 0); return; } if (!(fight_monster = object_at(&level_monsters, row, col))) { return; } if (!(fight_monster->m_flags & STATIONARY)) { possible_damage = ((get_damage(fight_monster->m_damage, 0) * 2) / 3); } else { possible_damage = fight_monster->stationary_damage - 1; } while (fight_monster) { one_move_rogue(ch, 0); if (((!to_the_death) && (rogue.hp_current <= possible_damage)) || interrupted || (!(dungeon[row][col] & MONSTER))) { fight_monster = NULL; } else { monster = object_at(&level_monsters, row, col); if (monster != fight_monster) { fight_monster = NULL; } } } }
void r_write(FILE *fp, char *buf, int n) { if (!write_failed) { if (fwrite(buf, sizeof(char), n, fp) != n) { #if defined( JAPAN ) message("ファイルに書けません。", 0); #else /* not JAPAN */ message("Write() failed, don't know why", 0); #endif /* not JAPAN */ sound_bell(); write_failed = 1; } } }
void rhack(const char *cmd) { const struct func_tab *tlist = cmdlist; boolean firsttime = FALSE; int res; if (!cmd) { firsttime = TRUE; flags.nopick = 0; cmd = parse(); } if (!*cmd || (*cmd & 0377) == 0377 || (flags.no_rest_on_space && *cmd == ' ')) { sound_bell(); flags.move = 0; return; /* probably we just had an interrupt */ } if (movecmd(*cmd)) { walk: if (multi) flags.mv = 1; domove(); return; } if (movecmd(lowc(*cmd))) { flags.run = 1; rush: if (firsttime) { if (!multi) multi = COLNO; u.last_str_turn = 0; } flags.mv = 1; #ifdef QUEST if (flags.run >= 4) finddir(); if (firsttime) { u.ux0 = u.ux + u.dx; u.uy0 = u.uy + u.dy; } #endif /* QUEST */ domove(); return; } if ((*cmd == 'f' && movecmd(cmd[1])) || movecmd(unctrl(*cmd))) { flags.run = 2; goto rush; } if (*cmd == 'F' && movecmd(lowc(cmd[1]))) { flags.run = 3; goto rush; } if (*cmd == 'm' && movecmd(cmd[1])) { flags.run = 0; flags.nopick = 1; goto walk; } if (*cmd == 'M' && movecmd(lowc(cmd[1]))) { flags.run = 1; flags.nopick = 1; goto rush; } #ifdef QUEST if (*cmd == cmd[1] && (*cmd == 'f' || *cmd == 'F')) { flags.run = 4; if (*cmd == 'F') flags.run += 2; if (cmd[2] == '-') flags.run += 1; goto rush; } #endif /* QUEST */ while (tlist->f_char) { if (*cmd == tlist->f_char) { res = (*(tlist->f_funct)) (); if (!res) { flags.move = 0; multi = 0; } return; } tlist++; } { char expcmd[10]; char *cp = expcmd; while (*cmd && cp - expcmd < (int)sizeof(expcmd) - 2) { if (*cmd >= 040 && *cmd < 0177) *cp++ = *cmd++; else { *cp++ = '^'; *cp++ = *cmd++ ^ 0100; } } *cp++ = 0; pline("Unknown command '%s'.", expcmd); } multi = flags.move = 0; }