Lines Matching refs:monster
1 /* $NetBSD: monster.c,v 1.18 2025/04/07 14:36:28 hgutch Exp $ */
38 static char sccsid[] = "@(#)monster.c 8.1 (Berkeley) 5/31/93";
40 __RCSID("$NetBSD: monster.c,v 1.18 2025/04/07 14:36:28 hgutch Exp $");
45 * monster.c
70 "ice monster",
149 object *monster;
155 monster = gr_monster(NULL, 0);
156 if ((monster->m_flags & WANDERS) && coin_toss()) {
157 wake_up(monster);
160 put_m_at(row, col, monster);
165 gr_monster(object *monster, int mn)
167 if (!monster) {
168 monster = alloc_object();
178 *monster = mon_tab[mn];
179 if (monster->m_flags & IMITATES) {
180 monster->disguise = gr_obj_char();
183 monster->m_flags |= HASTED;
185 monster->trow = NO_ROOM;
186 return(monster);
192 object *monster, *next_monster, *test_mons;
199 monster = level_monsters.next_monster;
201 while (monster) {
202 next_monster = monster->next_monster;
204 if (monster->m_flags & HASTED) {
205 mv_1_monster(monster, rogue.row, rogue.col);
209 } else if (monster->m_flags & SLOWED) {
210 monster->slowed_toggle = !monster->slowed_toggle;
211 if (monster->slowed_toggle) {
215 if ((monster->m_flags & CONFUSED) && move_confused(monster)) {
219 if ( (monster->m_flags & FLIES) &&
220 !(monster->m_flags & NAPPING) &&
221 !mon_can_go(monster, rogue.row, rogue.col)) {
223 mv_1_monster(monster, rogue.row, rogue.col);
228 if (!(flew && mon_can_go(monster, rogue.row, rogue.col))) {
229 mv_1_monster(monster, rogue.row, rogue.col);
232 monster = NULL;
237 monster = next_monster;
250 object *monster;
268 if ((!(dungeon[row][col] & MONSTER)) &&
274 monster = gr_monster((object *)0, 0);
275 if (!(monster->m_flags & IMITATES)) {
276 monster->m_flags |= WAKENS;
278 put_m_at(row, col, monster);
289 object *monster;
291 if ((monster = object_at(&level_monsters, row, col)) != NULL) {
293 (monster->m_flags & INVISIBLE)) || blind) {
294 return(monster->trail_char);
296 if (monster->m_flags & IMITATES) {
297 return(monster->disguise);
299 return(monster->m_char);
306 gmc(object *monster)
309 (monster->m_flags & INVISIBLE))
311 return(monster->trail_char);
313 if (monster->m_flags & IMITATES) {
314 return(monster->disguise);
316 return(monster->m_char);
320 mv_1_monster(object *monster, short row, short col)
325 if (monster->m_flags & ASLEEP) {
326 if (monster->m_flags & NAPPING) {
327 if (--monster->nap_length <= 0) {
328 monster->m_flags &= (~(NAPPING | ASLEEP));
332 if ((monster->m_flags & WAKENS) &&
333 rogue_is_around(monster->row, monster->col) &&
337 wake_up(monster);
340 } else if (monster->m_flags & ALREADY_MOVED) {
341 monster->m_flags &= (~ALREADY_MOVED);
344 if ((monster->m_flags & FLITS) && flit(monster)) {
347 if ((monster->m_flags & STATIONARY) &&
348 (!mon_can_go(monster, rogue.row, rogue.col))) {
351 if (monster->m_flags & FREEZING_ROGUE) {
354 if ((monster->m_flags & CONFUSES) && m_confuse(monster)) {
357 if (mon_can_go(monster, rogue.row, rogue.col)) {
358 mon_hit(monster);
361 if ((monster->m_flags & FLAMES) && flame_broil(monster)) {
364 if ((monster->m_flags & SEEKS_GOLD) && seek_gold(monster)) {
367 if ((monster->trow == monster->row) &&
368 (monster->tcol == monster->col)) {
369 monster->trow = NO_ROOM;
370 } else if (monster->trow != NO_ROOM) {
371 row = monster->trow;
372 col = monster->tcol;
374 if (monster->row > row) {
375 row = monster->row - 1;
376 } else if (monster->row < row) {
377 row = monster->row + 1;
379 if ((dungeon[row][monster->col] & DOOR) &&
380 mtry(monster, row, monster->col)) {
383 if (monster->col > col) {
384 col = monster->col - 1;
385 } else if (monster->col < col) {
386 col = monster->col + 1;
388 if ((dungeon[monster->row][col] & DOOR) &&
389 mtry(monster, monster->row, col)) {
392 if (mtry(monster, row, col)) {
402 if (!tried[n] && mtry(monster, row, monster->col-1)) {
407 if (!tried[n] && mtry(monster, row, monster->col)) {
412 if (!tried[n] && mtry(monster, row, monster->col+1)) {
417 if (!tried[n] && mtry(monster, monster->row-1, col)) {
422 if (!tried[n] && mtry(monster, monster->row, col)) {
427 if (!tried[n] && mtry(monster, monster->row+1, col)) {
439 if ((monster->row == monster->o_row) && (monster->col == monster->o_col)) {
440 if (++(monster->o) > 4) {
441 if ((monster->trow == NO_ROOM) &&
442 (!mon_sees(monster, rogue.row, rogue.col))) {
443 monster->trow = get_rand(1, (DROWS - 2));
444 monster->tcol = get_rand(0, (DCOLS - 1));
446 monster->trow = NO_ROOM;
447 monster->o = 0;
451 monster->o_row = monster->row;
452 monster->o_col = monster->col;
453 monster->o = 0;
458 mtry(object *monster, short row, short col)
460 if (mon_can_go(monster, row, col)) {
461 move_mon_to(monster, row, col);
468 move_mon_to(object *monster, short row, short col)
473 mrow = monster->row;
474 mcol = monster->col;
476 dungeon[mrow][mcol] &= ~MONSTER;
477 dungeon[row][col] |= MONSTER;
483 mvaddch(mrow, mcol, monster->trail_char);
486 mvaddch(mrow, mcol, monster->trail_char);
488 if (monster->trail_char == '.') {
489 monster->trail_char = ' ';
491 mvaddch(mrow, mcol, monster->trail_char);
495 monster->trail_char = mvinch(row, col);
497 if ((!(monster->m_flags & INVISIBLE) ||
499 mvaddch(row, col, gmc(monster));
508 dr_course(monster, ((dungeon[mrow][mcol] & TUNNEL) ? 1 : 0),
511 monster->row = row;
512 monster->col = col;
517 mon_can_go(const object *monster, short row, short col)
522 dr = monster->row - row; /* check if move distance > 1 */
526 dc = monster->col - col;
530 if ((!dungeon[monster->row][col]) || (!dungeon[row][monster->col])) {
533 if ((!is_passable(row, col)) || (dungeon[row][col] & MONSTER)) {
536 if ((monster->row!=row)&&(monster->col!=col)&&((dungeon[row][col]&DOOR) ||
537 (dungeon[monster->row][monster->col]&DOOR))) {
540 if (!(monster->m_flags & (FLITS | CONFUSED | CAN_FLIT)) &&
541 (monster->trow == NO_ROOM)) {
542 if ((monster->row < rogue.row) && (row < monster->row)) return(0);
543 if ((monster->row > rogue.row) && (row > monster->row)) return(0);
544 if ((monster->col < rogue.col) && (col < monster->col)) return(0);
545 if ((monster->col > rogue.col) && (col > monster->col)) return(0);
557 wake_up(object *monster)
559 if (!(monster->m_flags & NAPPING)) {
560 monster->m_flags &= (~(ASLEEP | IMITATES | WAKENS));
567 object *monster;
576 monster = level_monsters.next_monster;
578 while (monster) {
579 in_room = (rn == get_room_number(monster->row, monster->col));
582 monster->trow = NO_ROOM;
584 monster->trow = row;
585 monster->tcol = col;
588 if ((monster->m_flags & WAKENS) &&
589 (rn == get_room_number(monster->row, monster->col))) {
591 wake_up(monster);
594 monster = monster->next_monster;
599 mon_name(const object *monster)
603 if (blind || ((monster->m_flags & INVISIBLE) &&
611 ch = monster->m_char - 'A';
630 object *monster;
634 monster = NULL; /* XXXGCC -Wuninitialized [powerpc] */
637 monster = gr_monster(NULL, 0);
638 if (!(monster->m_flags & (WAKENS | WANDERS))) {
639 free_object(monster);
646 wake_up(monster);
650 put_m_at(row, col, monster);
655 free_object(monster);
663 object *monster;
670 monster = level_monsters.next_monster;
672 while (monster) {
673 mvaddch(monster->row, monster->col, monster->m_char);
674 if (monster->m_flags & IMITATES) {
675 monster->m_flags &= (~IMITATES);
676 monster->m_flags |= WAKENS;
678 monster = monster->next_monster;
688 object *monster;
700 if ((!(dungeon[row][col] & MONSTER)) &&
707 monster = gr_monster((object *)0, 0);
708 put_m_at(row, col, monster);
709 mvaddch(row, col, gmc(monster));
710 if (monster->m_flags & (WANDERS | WAKENS)) {
711 wake_up(monster);
719 put_m_at(short row, short col, object *monster)
721 monster->row = row;
722 monster->col = col;
723 dungeon[row][col] |= MONSTER;
724 monster->trail_char = mvinch(row, col);
725 (void)add_to_pack(monster, &level_monsters, 0);
726 aim_monster(monster);
730 aim_monster(object *monster)
734 rn = get_room_number(monster->row, monster->col);
736 clean_up("aim_monster: monster not in room");
742 monster->trow = rooms[rn].doors[d].door_row;
743 monster->tcol = rooms[rn].doors[d].door_col;
763 move_confused(object *monster)
767 if (!(monster->m_flags & ASLEEP)) {
768 if (--monster->moves_confused <= 0) {
769 monster->m_flags &= (~CONFUSED);
771 if (monster->m_flags & STATIONARY) {
776 row = monster->row;
777 col = monster->col;
784 if (mtry(monster, row, col)) {
793 flit(object *monster)
797 if (!rand_percent(FLIT_PERCENT + ((monster->m_flags & FLIES) ? 20 : 0))) {
803 row = monster->row;
804 col = monster->col;
811 if (mtry(monster, row, col)) {
836 if (!(dungeon[i][j] & MONSTER)) {
847 object *monster;
851 monster = level_monsters.next_monster;
853 while (monster) {
854 wake_up(monster);
855 monster->m_flags &= (~IMITATES);
856 if (rogue_can_see(monster->row, monster->col)) {
857 mvaddch(monster->row, monster->col, monster->m_char);
859 monster = monster->next_monster;
864 mon_sees(const object *monster, int row, int col)
871 (rn == get_room_number(monster->row, monster->col)) &&
875 rdif = row - monster->row;
876 cdif = col - monster->col;
885 object *monster;
887 monster = level_monsters.next_monster;
889 while (monster) {
890 if ((monster->m_char == 'A') &&
891 mon_can_go(monster, rogue.row, rogue.col)) {
892 mv_1_monster(monster, rogue.row, rogue.col);
893 monster->m_flags |= ALREADY_MOVED;
895 monster = monster->next_monster;