Mercurial > hg > early-roguelike
view arogue5/move.c @ 63:0ed67132cf10
Import Advanced Rogue 5.8 from the Roguelike Restoration Project (r1490)
| author | elwin |
|---|---|
| date | Thu, 09 Aug 2012 22:58:48 +0000 |
| parents | |
| children | a0a57cf42810 |
line wrap: on
line source
/* * Hero movement commands * * Advanced Rogue * Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T * All rights reserved. * * Based on "Super-Rogue" * Copyright (C) 1984 Robert D. Kindelberger * All rights reserved. * * Based on "Rogue: Exploring the Dungeons of Doom" * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman * All rights reserved. * * See the file LICENSE.TXT for full copyright and licensing information. */ #include "curses.h" #include <ctype.h> #include "rogue.h" /* * Used to hold the new hero position */ static coord nh; static const char Moves[3][3] = { { 'y', 'k', 'u' }, { 'h', '\0', 'l' }, { 'b', 'j', 'n' } }; /* * be_trapped: * The guy stepped on a trap.... Make him pay. */ be_trapped(th, tc) register struct thing *th; register coord *tc; { register struct trap *tp; register char ch; register const char *mname = NULL; register bool is_player = (th == &player), can_see; register struct linked_list *mitem = NULL; /* Can the player see the creature? */ can_see = (cansee(tc->y, tc->x) && (is_player || !invisible(th))); tp = trap_at(tc->y, tc->x); /* * if he's wearing boots of elvenkind, he won't set off the trap * unless its a magic pool (they're not really traps) */ if (is_player && cur_misc[WEAR_BOOTS] != NULL && cur_misc[WEAR_BOOTS]->o_which == MM_ELF_BOOTS && tp->tr_type != POOL) return '\0'; /* * if the creature is flying then it won't set off the trap */ if (on(*th, ISFLY)) return '\0'; tp->tr_flags |= ISFOUND; if (!is_player) { mitem = find_mons(th->t_pos.y, th->t_pos.x); mname = monsters[th->t_index].m_name; } else { count = running = FALSE; mvwaddch(cw, tp->tr_pos.y, tp->tr_pos.x, tp->tr_type); } switch (ch = tp->tr_type) { case TRAPDOOR: if (is_player) { level++; pstats.s_hpt -= roll(1, 10); msg("You fell into a trap!"); if (pstats.s_hpt <= 0) death(D_FALL); new_level(NORMLEV); } else { if (can_see) msg("The %s fell into a trap!", mname); /* See if the fall killed the monster */ if ((th->t_stats.s_hpt -= roll(1, 10)) <= 0) { killed(mitem, FALSE, FALSE); } else { /* Just move monster to next level */ check_residue(th); /* Erase the monster from the old position */ if (isalpha(mvwinch(cw, th->t_pos.y, th->t_pos.x))) mvwaddch(cw, th->t_pos.y, th->t_pos.x, th->t_oldch); mvwaddch(mw, th->t_pos.y, th->t_pos.x, ' '); turn_on(*th, ISELSEWHERE); detach(mlist, mitem); attach(tlist, mitem); /* remember him next level */ } } when BEARTRAP: if (is_stealth(th)) { if (is_player) msg("You pass a bear trap."); else if (can_see) msg("The %s passes a bear trap.", mname); } else { th->t_no_move += BEARTIME; if (is_player) msg("You are caught in a bear trap."); else if (can_see) msg("The %s is caught in a bear trap.", mname); } when SLEEPTRAP: if (is_player) { msg("A strange white mist envelops you."); if (!ISWEARING(R_ALERT)) { msg("You fall asleep."); no_command += SLEEPTIME; } } else { if (can_see) msg("A strange white mist envelops the %s.",mname); if (on(*th, ISUNDEAD)) { if (can_see) msg("The mist doesn't seem to affect the %s.",mname); } else { th->t_no_move += SLEEPTIME; } } when ARROWTRAP: if (swing(th->t_ctype, th->t_stats.s_lvl-1, th->t_stats.s_arm, 1)) { if (is_player) { msg("Oh no! An arrow shot you."); if ((pstats.s_hpt -= roll(1, 6)) <= 0) { msg("The arrow killed you."); death(D_ARROW); } } else { if (can_see) msg("An arrow shot the %s.", mname); if ((th->t_stats.s_hpt -= roll(1, 6)) <= 0) { if (can_see) msg("The arrow killed the %s.", mname); killed(mitem, FALSE, FALSE); } } } else { register struct linked_list *item; register struct object *arrow; if (is_player) msg("An arrow shoots past you."); else if (can_see) msg("An arrow shoots by the %s.", mname); item = new_item(sizeof *arrow); arrow = OBJPTR(item); arrow->o_type = WEAPON; arrow->contents = NULL; arrow->o_which = ARROW; arrow->o_hplus = rnd(3) - 1; arrow->o_dplus = rnd(3) - 1; init_weapon(arrow, ARROW); arrow->o_count = 1; arrow->o_pos = *tc; arrow->o_mark[0] = '\0'; fall(item, FALSE); } when TELTRAP: if (is_player) teleport(); else { register int rm; struct room *old_room; /* old room of monster */ /* * Erase the monster from the old position */ if (isalpha(mvwinch(cw, th->t_pos.y, th->t_pos.x))) mvwaddch(cw, th->t_pos.y, th->t_pos.x, th->t_oldch); mvwaddch(mw, th->t_pos.y, th->t_pos.x, ' '); /* * check to see if room should go dark */ if (on(*th, HASFIRE)) { old_room=roomin(&th->t_pos); if (old_room != NULL) { register struct linked_list *fire_item; for (fire_item = old_room->r_fires; fire_item != NULL; fire_item = next(fire_item)) { if (THINGPTR(fire_item) == th) { detach(old_room->r_fires, fire_item); destroy_item(fire_item); if (old_room->r_fires == NULL) { old_room->r_flags &= ~HASFIRE; if (can_see) light(&hero); } } } } } /* Get a new position */ do { rm = rnd_room(); rnd_pos(&rooms[rm], &th->t_pos); } until(winat(th->t_pos.y, th->t_pos.x) == FLOOR); /* Put it there */ mvwaddch(mw, th->t_pos.y, th->t_pos.x, th->t_type); th->t_oldch = CCHAR( mvwinch(cw, th->t_pos.y, th->t_pos.x) ); /* * check to see if room that creature appears in should * light up */ if (on(*th, HASFIRE)) { register struct linked_list *fire_item; fire_item = creat_item(); ldata(fire_item) = (char *) th; attach(rooms[rm].r_fires, fire_item); rooms[rm].r_flags |= HASFIRE; if(cansee(th->t_pos.y, th->t_pos.x) && next(rooms[rm].r_fires) == NULL) light(&hero); } if (can_see) msg("The %s seems to have disappeared!", mname); } when DARTTRAP: if (swing(th->t_ctype, th->t_stats.s_lvl+1, th->t_stats.s_arm, 1)) { if (is_player) { msg("A small dart just hit you in the shoulder."); if ((pstats.s_hpt -= roll(1, 4)) <= 0) { msg("The dart killed you."); death(D_DART); } /* Now the poison */ if (!save(VS_POISON, &player, 0)) { /* 75% chance it will do point damage - else strength */ if (rnd(100) < 75) { pstats.s_hpt /= 2; if (pstats.s_hpt == 0) death(D_POISON); } else if (!ISWEARING(R_SUSABILITY)) chg_str(-1); } } else { if (can_see) msg("A small dart just hit the %s in the shoulder.", mname); if ((th->t_stats.s_hpt -= roll(1,4)) <= 0) { if (can_see) msg("The dart killed the %s.", mname); killed(mitem, FALSE, FALSE); } if (!save(VS_POISON, th, 0)) { th->t_stats.s_hpt /= 2; if (th->t_stats.s_hpt <= 0) { if (can_see) msg("The dart killed the %s.", mname); killed(mitem, FALSE, FALSE); } } } } else { if (is_player) msg("A small dart whizzes by your ear and vanishes."); else if (can_see) msg("A small dart whizzes by the %s's ear and vanishes.", mname); } when POOL: { register int i; i = rnd(100); if (is_player) { if ((tp->tr_flags & ISGONE)) { if (i < 30) { teleport(); /* teleport away */ pool_teleport = TRUE; } else if((i < 45) && level > 2) { level -= rnd(2) + 1; cur_max = level; new_level(NORMLEV); pool_teleport = TRUE; msg("You here a faint groan from below."); } else if(i < 70) { level += rnd(4) + 1; new_level(NORMLEV); pool_teleport = TRUE; msg("You find yourself in strange surroundings."); } else if(i > 95) { msg("Oh no!!! You drown in the pool!!! --More--"); wait_for(cw,' '); death(D_DROWN); } } } else { if (i < 60) { if (can_see) { /* Drowns */ if (i < 30) msg("The %s drowned in the pool!", mname); /* Teleported to another level */ else msg("The %s disappeared!", mname); } killed(mitem, FALSE, FALSE); } } } when MAZETRAP: if (is_player) { pstats.s_hpt -= roll(1, 10); level++; msg("You fell through a trap door!"); if (pstats.s_hpt <= 0) death(D_FALL); new_level(MAZELEV); msg("You are surrounded by twisty passages!"); } else { if (can_see) msg("The %s fell into a trap!", mname); killed(mitem, FALSE, FALSE); } } /* Move the cursor back onto the hero */ wmove(cw, hero.y, hero.x); md_flushinp(); /* flush typeahead */ return(ch); } /* * blue_light: * magically light up a room (or level or make it dark) */ bool blue_light(blessed, cursed) bool blessed, cursed; { register struct room *rp; bool ret_val=FALSE; /* Whether or not affect is known */ rp = roomin(&hero); /* What room is hero in? */ /* Darken the room if the magic is cursed */ if (cursed) { if ((rp == NULL) || !lit_room(rp)) msg(nothing); else { rp->r_flags |= ISDARK; if (!lit_room(rp) && (levtype != OUTSIDE || !daytime)) msg("The %s suddenly goes dark.", levtype == OUTSIDE ? "area" : "room"); else msg(nothing); ret_val = TRUE; } } else { ret_val = TRUE; if (rp && !lit_room(rp) && (levtype != OUTSIDE || !daytime)) { addmsg("The %s is lit", levtype == OUTSIDE ? "area" : "room"); if (!terse) addmsg(" by a %s blue light.", blessed ? "bright" : "shimmering"); endmsg(); } else if (winat(hero.y, hero.x) == PASSAGE) msg("The corridor glows %sand then fades", blessed ? "brightly " : ""); else { ret_val = FALSE; msg(nothing); } if (blessed) { register int i; /* Index through rooms */ for (i=0; i<MAXROOMS; i++) rooms[i].r_flags &= ~ISDARK; } else if (rp) rp->r_flags &= ~ISDARK; } /* * Light the room and put the player back up */ light(&hero); mvwaddch(cw, hero.y, hero.x, PLAYER); return(ret_val); } /* * corr_move: * Check to see that a move is legal. If so, return correct character.
