📄 monster.c
字号:
/* * monster.c * * This source herein may be modified and/or distributed by anybody who * so desires, with the following restrictions: * 1.) No portion of this notice shall be removed. * 2.) Credit shall not be taken for the creation of this source. * 3.) This code is not to be traded, sold, or used for personal * gain or profit. * */#ifndef lintstatic char sccsid[] = "@(#)monster.c 5.1 (Berkeley) 11/25/87";#endif /* not lint */#include "rogue.h"object level_monsters;boolean mon_disappeared;char *m_names[] = { "aquator", "bat", "centaur", "dragon", "emu", "venus fly-trap", "griffin", "hobgoblin", "ice monster", "jabberwock", "kestrel", "leprechaun", "medusa", "nymph", "orc", "phantom", "quagga", "rattlesnake", "snake", "troll", "black unicorn", "vampire", "wraith", "xeroc", "yeti", "zombie"};object mon_tab[MONSTERS] = { {(ASLEEP|WAKENS|WANDERS|RUSTS),"0d0",25,'A',20,9,18,100,0,0,0,0,0}, {(ASLEEP|WANDERS|FLITS|FLIES),"1d3",10,'B',2,1,8,60,0,0,0,0,0}, {(ASLEEP|WANDERS),"3d3/2d5",32,'C',15,7,16,85,0,10,0,0,0}, {(ASLEEP|WAKENS|FLAMES),"4d6/4d9",145,'D',5000,21,126,100,0,90,0,0,0}, {(ASLEEP|WAKENS),"1d3",11,'E',2,1,7,65,0,0,0,0,0}, {(HOLDS|STATIONARY),"5d5",73,'F',91,12,126,80,0,0,0,0,0}, {(ASLEEP|WAKENS|WANDERS|FLIES),"5d5/5d5",115,'G', 2000,20,126,85,0,10,0,0,0}, {(ASLEEP|WAKENS|WANDERS),"1d3/1d2",15,'H',3,1,10,67,0,0,0,0,0}, {(ASLEEP|FREEZES),"0d0",15,'I',5,2,11,68,0,0,0,0,0}, {(ASLEEP|WANDERS),"3d10/4d5",132,'J',3000,21,126,100,0,0,0,0,0}, {(ASLEEP|WAKENS|WANDERS|FLIES),"1d4",10,'K',2,1,6,60,0,0,0,0,0}, {(ASLEEP|STEALS_GOLD),"0d0",25,'L',21,6,16,75,0,0,0,0,0}, {(ASLEEP|WAKENS|WANDERS|CONFUSES),"4d4/3d7",97,'M', 250,18,126,85,0,25,0,0,0}, {(ASLEEP|STEALS_ITEM),"0d0",25,'N',39,10,19,75,0,100,0,0,0}, {(ASLEEP|WANDERS|WAKENS|SEEKS_GOLD),"1d6",25,'O',5,4,13,70,0,10,0,0,0}, {(ASLEEP|INVISIBLE|WANDERS|FLITS),"5d4",76,'P',120,15,24,80,0,50,0,0,0}, {(ASLEEP|WAKENS|WANDERS),"3d5",30,'Q',20,8,17,78,0,20,0,0,0}, {(ASLEEP|WAKENS|WANDERS|STINGS),"2d5",19,'R',10,3,12,70,0,0,0,0,0}, {(ASLEEP|WAKENS|WANDERS),"1d3",8,'S',2,1,9,50,0,0,0,0,0}, {(ASLEEP|WAKENS|WANDERS),"4d6/1d4",75,'T',125,13,22,75,0,33,0,0,0}, {(ASLEEP|WAKENS|WANDERS),"4d10",90,'U', 200,17,26,85,0,33,0,0,0}, {(ASLEEP|WAKENS|WANDERS|DRAINS_LIFE),"1d14/1d4",55,'V', 350,19,126,85,0,18,0,0,0}, {(ASLEEP|WANDERS|DROPS_LEVEL),"2d8",45,'W',55,14,23,75,0,0,0,0,0}, {(ASLEEP|IMITATES),"4d6",42,'X',110,16,25,75,0,0,0,0,0}, {(ASLEEP|WANDERS),"3d6",35,'Y',50,11,20,80,0,20,0,0,0}, {(ASLEEP|WAKENS|WANDERS),"1d7",21,'Z',8,5,14,69,0,0,0,0,0}};extern short cur_level;extern short cur_room, party_room;extern short blind, halluc, haste_self;extern boolean detect_monster, see_invisible, r_see_invisible;extern short stealthy;put_mons(){ short i; short n; object *monster; short row, col; n = get_rand(4, 6); for (i = 0; i < n; i++) { monster = gr_monster((object *) 0, 0); if ((monster->m_flags & WANDERS) && coin_toss()) { wake_up(monster); } gr_row_col(&row, &col, (FLOOR | TUNNEL | STAIRS | OBJECT)); put_m_at(row, col, monster); }}object *gr_monster(monster, mn)register object *monster;register mn;{ if (!monster) { monster = alloc_object(); for (;;) { mn = get_rand(0, MONSTERS-1); if ((cur_level >= mon_tab[mn].first_level) && (cur_level <= mon_tab[mn].last_level)) { break; } } } *monster = mon_tab[mn]; if (monster->m_flags & IMITATES) { monster->disguise = gr_obj_char(); } if (cur_level > (AMULET_LEVEL + 2)) { monster->m_flags |= HASTED; } monster->trow = NO_ROOM; return(monster);}mv_mons(){ register object *monster, *next_monster; boolean flew; if (haste_self % 2) { return; } monster = level_monsters.next_monster; while (monster) { next_monster = monster->next_monster; mon_disappeared = 0; if (monster->m_flags & HASTED) { mv_1_monster(monster, rogue.row, rogue.col); if (mon_disappeared) { goto NM; } } else if (monster->m_flags & SLOWED) { monster->slowed_toggle = !monster->slowed_toggle; if (monster->slowed_toggle) { goto NM; } } if ((monster->m_flags & CONFUSED) && move_confused(monster)) { goto NM; } flew = 0; if ( (monster->m_flags & FLIES) && !(monster->m_flags & NAPPING) && !mon_can_go(monster, rogue.row, rogue.col)) { flew = 1; mv_1_monster(monster, rogue.row, rogue.col); if (mon_disappeared) { goto NM; } } if (!(flew && mon_can_go(monster, rogue.row, rogue.col))) { mv_1_monster(monster, rogue.row, rogue.col); }NM: monster = next_monster; }}party_monsters(rn, n)int rn, n;{ short i, j; short row, col; object *monster; boolean found; n += n; for (i = 0; i < MONSTERS; i++) { mon_tab[i].first_level -= (cur_level % 3); } for (i = 0; i < n; i++) { if (no_room_for_monster(rn)) { break; } for (j = found = 0; ((!found) && (j < 250)); j++) { row = get_rand(rooms[rn].top_row+1, rooms[rn].bottom_row-1); col = get_rand(rooms[rn].left_col+1, rooms[rn].right_col-1); if ((!(dungeon[row][col] & MONSTER)) && (dungeon[row][col] & (FLOOR | TUNNEL))) { found = 1; } } if (found) { monster = gr_monster((object *) 0, 0); if (!(monster->m_flags & IMITATES)) { monster->m_flags |= WAKENS; } put_m_at(row, col, monster); } } for (i = 0; i < MONSTERS; i++) { mon_tab[i].first_level += (cur_level % 3); }}gmc_row_col(row, col)register row, col;{ register object *monster; if (monster = object_at(&level_monsters, row, col)) { if ((!(detect_monster || see_invisible || r_see_invisible) && (monster->m_flags & INVISIBLE)) || blind) { return(monster->trail_char); } if (monster->m_flags & IMITATES) { return(monster->disguise); } return(monster->m_char); } else { return('&'); /* BUG if this ever happens */ }}gmc(monster)object *monster;{ if ((!(detect_monster || see_invisible || r_see_invisible) && (monster->m_flags & INVISIBLE)) || blind) { return(monster->trail_char); } if (monster->m_flags & IMITATES) { return(monster->disguise); } return(monster->m_char);}mv_1_monster(monster, row, col)register object *monster;short row, col;{ short i, n; boolean tried[6]; if (monster->m_flags & ASLEEP) { if (monster->m_flags & NAPPING) { if (--monster->nap_length <= 0) { monster->m_flags &= (~(NAPPING | ASLEEP)); } return; } if ((monster->m_flags & WAKENS) && rogue_is_around(monster->row, monster->col) && rand_percent(((stealthy > 0) ? (WAKE_PERCENT / (STEALTH_FACTOR + stealthy)) : WAKE_PERCENT))) { wake_up(monster); } return; } else if (monster->m_flags & ALREADY_MOVED) { monster->m_flags &= (~ALREADY_MOVED); return; } if ((monster->m_flags & FLITS) && flit(monster)) { return; } if ((monster->m_flags & STATIONARY) && (!mon_can_go(monster, rogue.row, rogue.col))) { return; } if (monster->m_flags & FREEZING_ROGUE) { return; } if ((monster->m_flags & CONFUSES) && m_confuse(monster)) { return; } if (mon_can_go(monster, rogue.row, rogue.col)) { mon_hit(monster); return; } if ((monster->m_flags & FLAMES) && flame_broil(monster)) { return; } if ((monster->m_flags & SEEKS_GOLD) && seek_gold(monster)) { return; } if ((monster->trow == monster->row) && (monster->tcol == monster->col)) { monster->trow = NO_ROOM; } else if (monster->trow != NO_ROOM) { row = monster->trow; col = monster->tcol; } if (monster->row > row) { row = monster->row - 1; } else if (monster->row < row) { row = monster->row + 1; } if ((dungeon[row][monster->col] & DOOR) && mtry(monster, row, monster->col)) { return; } if (monster->col > col) { col = monster->col - 1; } else if (monster->col < col) { col = monster->col + 1; } if ((dungeon[monster->row][col] & DOOR) && mtry(monster, monster->row, col)) { return; } if (mtry(monster, row, col)) { return; } for (i = 0; i <= 5; i++) tried[i] = 0; for (i = 0; i < 6; i++) {NEXT_TRY: n = get_rand(0, 5); switch(n) { case 0: if (!tried[n] && mtry(monster, row, monster->col-1)) { goto O; } break; case 1: if (!tried[n] && mtry(monster, row, monster->col)) { goto O; } break; case 2: if (!tried[n] && mtry(monster, row, monster->col+1)) { goto O; } break; case 3: if (!tried[n] && mtry(monster, monster->row-1, col)) { goto O; } break; case 4: if (!tried[n] && mtry(monster, monster->row, col)) { goto O; } break; case 5: if (!tried[n] && mtry(monster, monster->row+1, col)) { goto O; } break; } if (!tried[n]) { tried[n] = 1; } else { goto NEXT_TRY; } }O: if ((monster->row == monster->o_row) && (monster->col == monster->o_col)) { if (++(monster->o) > 4) { if ((monster->trow == NO_ROOM) && (!mon_sees(monster, rogue.row, rogue.col))) { monster->trow = get_rand(1, (DROWS - 2)); monster->tcol = get_rand(0, (DCOLS - 1)); } else { monster->trow = NO_ROOM; monster->o = 0; } } } else { monster->o_row = monster->row; monster->o_col = monster->col; monster->o = 0; }}mtry(monster, row, col)register object *monster;register short row, col;{ if (mon_can_go(monster, row, col)) { move_mon_to(monster, row, col); return(1); } return(0);}move_mon_to(monster, row, col)register object *monster;register short row, col;{ short c; register mrow, mcol; mrow = monster->row; mcol = monster->col; dungeon[mrow][mcol] &= ~MONSTER; dungeon[row][col] |= MONSTER;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -