Mercurial > hg > early-roguelike
comparison urogue/player.c @ 256:c495a4f288c6
Import UltraRogue from the Roguelike Restoration Project (r1490)
| author | John "Elwin" Edwards |
|---|---|
| date | Tue, 31 Jan 2017 19:56:04 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 253:d9badb9c0179 | 256:c495a4f288c6 |
|---|---|
| 1 /* | |
| 2 player.c - functions for dealing with special player abilities | |
| 3 | |
| 4 UltraRogue: The Ultimate Adventure in the Dungeons of Doom | |
| 5 Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong | |
| 6 All rights reserved. | |
| 7 | |
| 8 Based on "Advanced Rogue" | |
| 9 Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka | |
| 10 All rights reserved. | |
| 11 | |
| 12 Based on "Rogue: Exploring the Dungeons of Doom" | |
| 13 Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman | |
| 14 All rights reserved. | |
| 15 | |
| 16 See the file LICENSE.TXT for full copyright and licensing information. | |
| 17 */ | |
| 18 | |
| 19 #include <stdlib.h> | |
| 20 #include <ctype.h> | |
| 21 #include "rogue.h" | |
| 22 | |
| 23 /* | |
| 24 * Pray to a deity | |
| 25 * | |
| 26 * 00-10 Good stuff happens | |
| 27 * 11-40 A good deity answers | |
| 28 * 41-60 Nothing happens | |
| 29 * 61-90 A bad deity answers, but with good results | |
| 30 * 91-99 You were better off before | |
| 31 */ | |
| 32 | |
| 33 void | |
| 34 prayer(void) | |
| 35 { | |
| 36 int chance, i, times; | |
| 37 char num_str[20]; | |
| 38 int ch; | |
| 39 struct linked_list *item; | |
| 40 struct thing *tp; | |
| 41 int is_godly; | |
| 42 | |
| 43 if (player.t_praycnt > pstats.s_lvl) | |
| 44 { | |
| 45 msg("Are you sure you want to bother the gods?"); | |
| 46 ch = readchar(); | |
| 47 | |
| 48 if (tolower(ch) != 'y') | |
| 49 { | |
| 50 after = FALSE; | |
| 51 return; | |
| 52 } | |
| 53 else | |
| 54 msg("Here goes..."); | |
| 55 } | |
| 56 | |
| 57 msg("You are surrounded by orange smoke..."); | |
| 58 | |
| 59 if (rnd(3) == 0) | |
| 60 luck--; | |
| 61 | |
| 62 if (is_wearing(R_PIETY) || (rnd(luck) == 0 && | |
| 63 (player.t_ctype == C_DRUID || player.t_ctype == C_CLERIC || | |
| 64 ((player.t_ctype == C_PALADIN || player.t_ctype == C_RANGER) | |
| 65 && pstats.s_lvl > 8)))) | |
| 66 is_godly = ISBLESSED; | |
| 67 else | |
| 68 is_godly = ISNORMAL; | |
| 69 | |
| 70 if (is_wearing(R_PIETY)) | |
| 71 player.t_praycnt += rnd(2); | |
| 72 else | |
| 73 player.t_praycnt++; | |
| 74 | |
| 75 if (wizard) | |
| 76 { | |
| 77 msg("What roll?[0..%d] ", 99); | |
| 78 ch = get_string(num_str, cw); | |
| 79 | |
| 80 if (ch == QUIT) | |
| 81 { | |
| 82 msg(""); | |
| 83 return; | |
| 84 } | |
| 85 chance = atoi(num_str); | |
| 86 } | |
| 87 else | |
| 88 { | |
| 89 chance = rnd(100) + roll(10, luck) - 5; | |
| 90 | |
| 91 if (player.t_praycnt > pstats.s_lvl) | |
| 92 chance += 50; | |
| 93 | |
| 94 if (is_godly) | |
| 95 chance -= 50; | |
| 96 } | |
| 97 | |
| 98 chance = max(0, min(chance, 100)); | |
| 99 | |
| 100 if (chance == 0) | |
| 101 { | |
| 102 msg("The heavens open and glorious radiance surrounds you!"); | |
| 103 | |
| 104 pstats.s_hpt = max_stats.s_hpt; | |
| 105 pstats.s_power = max_stats.s_power; | |
| 106 | |
| 107 if (is_godly) | |
| 108 times = 8; | |
| 109 else | |
| 110 times = 1; | |
| 111 | |
| 112 /* | |
| 113 * kill all monsters surrounding the hero except unique ones | |
| 114 * This will change when I implement the deity option. If | |
| 115 * The deity is "stronger" than the unique monster, then the | |
| 116 * monster will be killed. | |
| 117 */ | |
| 118 | |
| 119 for (i = 0; i < times; i++) | |
| 120 { | |
| 121 item = f_mons_a(player.t_pos.y, player.t_pos.x, TRUE); | |
| 122 | |
| 123 if (item) | |
| 124 { | |
| 125 tp = THINGPTR(item); | |
| 126 | |
| 127 msg("A bolt of eldritch energy strikes down the %s!", | |
| 128 monsters[tp->t_index].m_name); | |
| 129 | |
| 130 killed(NULL, item, NOMESSAGE, POINTS); | |
| 131 } | |
| 132 } | |
| 133 } | |
| 134 else if (chance == 2) | |
| 135 { | |
| 136 msg("Aule, Lord of Crafts, hears your call."); | |
| 137 read_scroll(&player, S_MAKEITEMEM, is_godly); | |
| 138 } | |
| 139 | |
| 140 /* Save 3-9 for other wonderful stuff */ | |
| 141 else if (chance < 15) | |
| 142 { | |
| 143 msg("Orome, Lord of Forests, hears your call."); | |
| 144 read_scroll(&player, S_SUMMON, is_godly); | |
| 145 } | |
| 146 else if (chance < 20) | |
| 147 { | |
| 148 msg("Hermes, the Winged Messenger, hears your call."); | |
| 149 quaff(&player, P_HASTE, is_godly); | |
| 150 } | |
| 151 else if (chance < 25) | |
| 152 { | |
| 153 msg("Lorien, Master of Dreams, hears your call."); | |
| 154 read_scroll(&player, S_SLEEP, is_godly); | |
| 155 } | |
| 156 else if (chance < 30) | |
| 157 { | |
| 158 msg("Este, Lady of Healing, hears your call."); | |
| 159 quaff(&player, P_RESTORE, is_godly); | |
| 160 quaff(&player, P_HEALING, is_godly); | |
| 161 } | |
| 162 else if (chance < 35) | |
| 163 { | |
| 164 msg("Thor, God of Thunder, hears your call."); | |
| 165 msg("A bolt of lighting strikes you!"); | |
| 166 read_scroll(&player, S_ELECTRIFY, is_godly); | |
| 167 } | |
| 168 else if (chance < 40) | |
| 169 { | |
| 170 msg("Lorien, Master of Illusion, hears your call."); | |
| 171 quaff(&player, P_DISGUISE, is_godly); | |
| 172 } | |
| 173 else if (chance < 60) /* Nothing happens */ | |
| 174 { | |
| 175 msg("Boccob, the Uncaring, ignores you."); | |
| 176 } | |
| 177 | |
| 178 /* You don't really want one of these gods answering your call */ | |
| 179 | |
| 180 else if (chance < 65) | |
| 181 { | |
| 182 msg("Jubilex, Master of Slimes and Oozes, hears your call."); | |
| 183 read_scroll(&player, S_HOLD, is_godly); | |
| 184 luck++; | |
| 185 } | |
| 186 else if (chance < 70) | |
| 187 { | |
| 188 msg("Sauron, Lord of the Ring, hears your call."); | |
| 189 quaff(&player, P_INVIS, is_godly); | |
| 190 luck++; | |
| 191 } | |
| 192 else if (chance < 75) | |
| 193 { | |
| 194 msg("Orcus, Lord of Undead, hears your call."); | |
| 195 quaff(&player, P_PHASE, is_godly); | |
| 196 luck++; | |
| 197 } | |
| 198 else if (chance < 80) | |
| 199 { | |
| 200 msg("Incabulos, God of Evil Sendings, hears your call."); | |
| 201 quaff(&player, P_CLEAR, is_godly); | |
| 202 luck++; | |
| 203 } | |
| 204 else if (chance < 85) | |
| 205 { | |
| 206 msg("Raxivort, Night Flutterer, hears your call."); | |
| 207 quaff(&player, P_SEEINVIS, is_godly); | |
| 208 luck++; | |
| 209 } | |
| 210 else if (chance < 90) | |
| 211 { | |
| 212 msg("Morgoth, Lord of Fire, hears your call."); | |
| 213 quaff(&player, P_FIRERESIST, is_godly); | |
| 214 luck++; | |
| 215 } | |
| 216 else if (chance < 100) /* You are in for it now! */ | |
| 217 { | |
| 218 msg("You fall into a horrible trance-like state."); | |
| 219 no_command += SLEEPTIME; | |
| 220 } | |
| 221 if (chance == 100) | |
| 222 { | |
| 223 msg("The heavens open - but wait!"); | |
| 224 msg("A bolt of eldritch energy strikes you!"); | |
| 225 | |
| 226 if (pstats.s_hpt > 1) | |
| 227 pstats.s_hpt /= 2; | |
| 228 | |
| 229 msg("The gods must be angry with you."); | |
| 230 } | |
| 231 } | |
| 232 | |
| 233 /* Routines for thieves */ | |
| 234 | |
| 235 /* | |
| 236 gsense() | |
| 237 Sense gold returns TRUE if gold was detected | |
| 238 */ | |
| 239 | |
| 240 int | |
| 241 gsense(void) | |
| 242 { | |
| 243 if (lvl_obj != NULL) | |
| 244 { | |
| 245 struct linked_list *gitem; | |
| 246 struct object *cur; | |
| 247 int gtotal = 0; | |
| 248 | |
| 249 wclear(hw); | |
| 250 | |
| 251 for (gitem = lvl_obj; gitem != NULL; gitem = next(gitem)) | |
| 252 { | |
| 253 cur = OBJPTR(gitem); | |
| 254 | |
| 255 if (cur->o_type == GOLD) | |
| 256 { | |
| 257 gtotal += cur->o_count; | |
| 258 mvwaddch(hw, cur->o_pos.y, cur->o_pos.x, GOLD); | |
| 259 | |
| 260 } | |
| 261 } | |
| 262 | |
| 263 if (gtotal) | |
| 264 { | |
| 265 msg("You sense gold!"); | |
| 266 overlay(hw, cw); | |
| 267 return(TRUE); | |
| 268 } | |
| 269 } | |
| 270 | |
| 271 nothing_message(ISNORMAL); | |
| 272 | |
| 273 return(FALSE); | |
| 274 } | |
| 275 | |
| 276 | |
| 277 /* | |
| 278 is_stealth() | |
| 279 is player quiet about something | |
| 280 */ | |
| 281 | |
| 282 int | |
| 283 is_stealth(struct thing *tp) | |
| 284 { | |
| 285 return (rnd(25) < tp->t_stats.s_dext || | |
| 286 (tp == &player && is_wearing(R_STEALTH))); | |
| 287 } | |
| 288 | |
| 289 /* | |
| 290 steal() | |
| 291 Steal in direction given in delta | |
| 292 */ | |
| 293 | |
| 294 void | |
| 295 steal(void) | |
| 296 { | |
| 297 struct linked_list *item; | |
| 298 struct thing *tp; | |
| 299 coord new_pos; | |
| 300 short thief_bonus; | |
| 301 char *unsuccess = ""; | |
| 302 char *gain = ""; | |
| 303 char *notice = "is not"; | |
| 304 | |
| 305 new_pos.y = hero.y + delta.y; | |
| 306 new_pos.x = hero.x + delta.x; | |
| 307 | |
| 308 /* Anything there? */ | |
| 309 | |
| 310 if (new_pos.y < 0 || new_pos.y > LINES - 3 || | |
| 311 new_pos.x < 0 || new_pos.x > COLS - 1 || | |
| 312 mvwinch(mw, new_pos.y, new_pos.x) == ' ') | |
| 313 { | |
| 314 msg("There is no one to steal from."); | |
| 315 return; | |
| 316 } | |
| 317 | |
| 318 if ((item = find_mons(new_pos.y, new_pos.x)) == NULL) | |
| 319 return; | |
| 320 | |
| 321 tp = THINGPTR(item); | |
| 322 | |
| 323 /* Can player steal something unnoticed? */ | |
| 324 | |
| 325 if (player.t_ctype == C_THIEF || player.t_ctype == C_NINJA) | |
| 326 thief_bonus = 10; | |
| 327 else | |
| 328 thief_bonus = -50; | |
| 329 | |
| 330 if (rnd(50) >= 3 * pstats.s_dext + thief_bonus) | |
| 331 { | |
| 332 chase_it(&new_pos, &player); | |
| 333 turn_off(*tp, ISFRIENDLY); | |
| 334 notice = "is"; | |
| 335 } | |
| 336 | |
| 337 if (rnd(100) < | |
| 338 (thief_bonus + 2 * pstats.s_dext + 5 * pstats.s_lvl - | |
| 339 5 * (tp->t_stats.s_lvl - 3))) | |
| 340 { | |
| 341 struct linked_list *s_item, *pack_ptr; | |
| 342 int cnt = 0; | |
| 343 | |
| 344 s_item = NULL; /* Start stolen goods out as nothing */ | |
| 345 | |
| 346 /* Find a good item to take */ | |
| 347 | |
| 348 if (tp->t_pack != NULL) | |
| 349 { | |
| 350 /* Count up the number of items in the monster's pack */ | |
| 351 | |
| 352 for (pack_ptr = tp->t_pack; pack_ptr != NULL; pack_ptr = next(pack_ptr)) | |
| 353 cnt++; | |
| 354 | |
| 355 /* Pick one */ | |
| 356 cnt = rnd(cnt); | |
| 357 | |
| 358 /* Take it from the monster */ | |
| 359 | |
| 360 for (pack_ptr = tp->t_pack; --cnt == 0; pack_ptr = next(pack_ptr)) | |
| 361 ; | |
| 362 | |
| 363 s_item = pack_ptr; | |
| 364 detach(tp->t_pack, s_item); | |
| 365 | |
| 366 /* Give it to player */ | |
| 367 | |
| 368 if (add_pack(s_item, MESSAGE) == FALSE) | |
| 369 { | |
| 370 (OBJPTR(s_item))->o_pos = hero; | |
| 371 fall(&player, s_item, TRUE, FALSE); | |
| 372 } | |
| 373 | |
| 374 /* Get points for stealing from unfriendly monsters */ | |
| 375 | |
| 376 if (off(*tp, ISFRIENDLY)) | |
| 377 { | |
| 378 if (player.t_ctype == C_THIEF) |
