Mercurial > hg > early-roguelike
comparison rogue3/io.c @ 0:527e2150eaf0
Import Rogue 3.6 from the Roguelike Restoration Project (r1490)
| author | edwarj4 |
|---|---|
| date | Tue, 13 Oct 2009 13:33:34 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:527e2150eaf0 |
|---|---|
| 1 /* | |
| 2 * Various input/output functions | |
| 3 * | |
| 4 * @(#)io.c 3.10 (Berkeley) 6/15/81 | |
| 5 * | |
| 6 * Rogue: Exploring the Dungeons of Doom | |
| 7 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman | |
| 8 * All rights reserved. | |
| 9 * | |
| 10 * See the file LICENSE.TXT for full copyright and licensing information. | |
| 11 */ | |
| 12 | |
| 13 #include <stdlib.h> | |
| 14 #include "curses.h" | |
| 15 #include <ctype.h> | |
| 16 #include <stdarg.h> | |
| 17 #include <string.h> | |
| 18 #include "machdep.h" | |
| 19 #include "rogue.h" | |
| 20 | |
| 21 /* | |
| 22 * msg: | |
| 23 * Display a message at the top of the screen. | |
| 24 */ | |
| 25 | |
| 26 static char msgbuf[BUFSIZ]; | |
| 27 static int newpos = 0; | |
| 28 | |
| 29 /*VARARGS1*/ | |
| 30 void | |
| 31 msg(char *fmt, ...) | |
| 32 { | |
| 33 va_list ap; | |
| 34 /* | |
| 35 * if the string is "", just clear the line | |
| 36 */ | |
| 37 if (*fmt == '\0') | |
| 38 { | |
| 39 wmove(cw, 0, 0); | |
| 40 wclrtoeol(cw); | |
| 41 mpos = 0; | |
| 42 return; | |
| 43 } | |
| 44 /* | |
| 45 * otherwise add to the message and flush it out | |
| 46 */ | |
| 47 va_start(ap, fmt); | |
| 48 doadd(fmt, ap); | |
| 49 va_end(ap); | |
| 50 endmsg(); | |
| 51 } | |
| 52 | |
| 53 /* | |
| 54 * add things to the current message | |
| 55 */ | |
| 56 void | |
| 57 addmsg(char *fmt, ...) | |
| 58 { | |
| 59 va_list ap; | |
| 60 | |
| 61 va_start(ap, fmt); | |
| 62 doadd(fmt, ap); | |
| 63 va_end(ap); | |
| 64 } | |
| 65 | |
| 66 /* | |
| 67 * Display a new msg (giving him a chance to see the previous one if it | |
| 68 * is up there with the --More--) | |
| 69 */ | |
| 70 void | |
| 71 endmsg() | |
| 72 { | |
| 73 strncpy(huh, msgbuf, 80); | |
| 74 huh[79] = 0; | |
| 75 | |
| 76 if (mpos) | |
| 77 { | |
| 78 wmove(cw, 0, mpos); | |
| 79 waddstr(cw, "--More--"); | |
| 80 draw(cw); | |
| 81 wait_for(cw,' '); | |
| 82 } | |
| 83 mvwaddstr(cw, 0, 0, msgbuf); | |
| 84 wclrtoeol(cw); | |
| 85 mpos = newpos; | |
| 86 newpos = 0; | |
| 87 draw(cw); | |
| 88 } | |
| 89 | |
| 90 void | |
| 91 doadd(char *fmt, va_list ap) | |
| 92 { | |
| 93 vsprintf(&msgbuf[newpos], fmt, ap); | |
| 94 newpos = (int) strlen(msgbuf); | |
| 95 } | |
| 96 | |
| 97 /* | |
| 98 * step_ok: | |
| 99 * returns true if it is ok to step on ch | |
| 100 */ | |
| 101 | |
| 102 int | |
| 103 step_ok(int ch) | |
| 104 { | |
| 105 switch (ch) | |
| 106 { | |
| 107 case ' ': | |
| 108 case '|': | |
| 109 case '-': | |
| 110 case SECRETDOOR: | |
| 111 return FALSE; | |
| 112 default: | |
| 113 return (!isalpha(ch)); | |
| 114 } | |
| 115 } | |
| 116 | |
| 117 /* | |
| 118 * readchar: | |
| 119 * flushes stdout so that screen is up to date and then returns | |
| 120 * getchar. | |
| 121 */ | |
| 122 | |
| 123 int | |
| 124 readchar(WINDOW *win) | |
| 125 { | |
| 126 int ch; | |
| 127 | |
| 128 ch = md_readchar(win); | |
| 129 | |
| 130 if ((ch == 3) || (ch == 0)) | |
| 131 { | |
| 132 quit(0); | |
| 133 return(27); | |
| 134 } | |
| 135 | |
| 136 return(ch); | |
| 137 } | |
| 138 | |
| 139 /* | |
| 140 * status: | |
| 141 * Display the important stats line. Keep the cursor where it was. | |
| 142 */ | |
| 143 | |
| 144 void | |
| 145 status() | |
| 146 { | |
| 147 int oy, ox, temp; | |
| 148 char *pb; | |
| 149 static char buf[80]; | |
| 150 static int hpwidth = 0, s_hungry = -1; | |
| 151 static int s_lvl = -1, s_pur, s_hp = -1, s_str, s_add, s_ac = 0; | |
| 152 static long s_exp = 0; | |
| 153 | |
| 154 /* | |
| 155 * If nothing has changed since the last status, don't | |
| 156 * bother. | |
| 157 */ | |
| 158 if (s_hp == pstats.s_hpt && s_exp == pstats.s_exp && s_pur == purse | |
| 159 && s_ac == (cur_armor != NULL ? cur_armor->o_ac : pstats.s_arm) | |
| 160 && s_str == pstats.s_str.st_str && s_add == pstats.s_str.st_add | |
| 161 && s_lvl == level && s_hungry == hungry_state) | |
| 162 return; | |
| 163 | |
| 164 getyx(cw, oy, ox); | |
| 165 if (s_hp != max_hp) | |
| 166 { | |
| 167 temp = s_hp = max_hp; | |
| 168 for (hpwidth = 0; temp; hpwidth++) | |
| 169 temp /= 10; | |
| 170 } | |
| 171 sprintf(buf, "Level: %d Gold: %-5d Hp: %*d(%*d) Str: %-2d", | |
| 172 level, purse, hpwidth, pstats.s_hpt, hpwidth, max_hp, | |
| 173 pstats.s_str.st_str); | |
| 174 if (pstats.s_str.st_add != 0) | |
| 175 { | |
| 176 pb = &buf[strlen(buf)]; | |
| 177 sprintf(pb, "/%d", pstats.s_str.st_add); | |
| 178 } | |
| 179 pb = &buf[strlen(buf)]; | |
| 180 sprintf(pb, " Ac: %-2d Exp: %d/%d", | |
| 181 cur_armor != NULL ? cur_armor->o_ac : pstats.s_arm, pstats.s_lvl, | |
| 182 pstats.s_exp); | |
| 183 /* | |
| 184 * Save old status | |
| 185 */ | |
| 186 s_lvl = level; | |
| 187 s_pur = purse; | |
| 188 s_hp = pstats.s_hpt; | |
| 189 s_str = pstats.s_str.st_str; | |
| 190 s_add = pstats.s_str.st_add; | |
| 191 s_exp = pstats.s_exp; | |
| 192 s_ac = (cur_armor != NULL ? cur_armor->o_ac : pstats.s_arm); | |
| 193 mvwaddstr(cw, LINES - 1, 0, buf); | |
| 194 switch (hungry_state) | |
| 195 { | |
| 196 case 0: ; | |
| 197 when 1: | |
| 198 waddstr(cw, " Hungry"); | |
| 199 when 2: | |
| 200 waddstr(cw, " Weak"); | |
| 201 when 3: | |
| 202 waddstr(cw, " Fainting"); | |
| 203 } | |
| 204 wclrtoeol(cw); | |
| 205 s_hungry = hungry_state; | |
| 206 wmove(cw, oy, ox); | |
| 207 } | |
| 208 | |
| 209 /* | |
| 210 * wait_for | |
| 211 * Sit around until the guy types the right key | |
| 212 */ | |
| 213 | |
| 214 void | |
| 215 wait_for(WINDOW *win, int ch) | |
| 216 { | |
| 217 int c; | |
| 218 | |
| 219 if (ch == '\n') | |
| 220 while ((c = readchar(win)) != '\n' && c != '\r') | |
| 221 continue; | |
| 222 else | |
| 223 while (readchar(win) != ch) | |
| 224 continue; | |
| 225 } | |
| 226 | |
| 227 /* | |
| 228 * show_win: | |
| 229 * function used to display a window and wait before returning | |
| 230 */ | |
| 231 | |
| 232 void | |
| 233 show_win(WINDOW *scr, char *message) | |
| 234 { | |
| 235 mvwaddstr(scr, 0, 0, message); | |
| 236 touchwin(scr); | |
| 237 wmove(scr, hero.y, hero.x); | |
| 238 draw(scr); | |
| 239 wait_for(scr,' '); | |
| 240 clearok(cw, TRUE); | |
| 241 touchwin(cw); | |
| 242 } | |
| 243 | |
| 244 void | |
| 245 flush_type() | |
| 246 { | |
| 247 flushinp(); | |
| 248 } |
