void
move_mon_to(object *monster, short row, short col)
{
	short c;
	int mrow, mcol;

	mrow = monster->row;
	mcol = monster->col;

	dungeon[mrow][mcol] &= ~MONSTER;
	dungeon[row][col] |= MONSTER;

	c = mvinch(mrow, mcol);

	if ((c >= 'A') && (c <= 'Z')) {
		if (!detect_monster) {
			mvaddch(mrow, mcol, monster->trail_char);
		} else {
			if (rogue_can_see(mrow, mcol)) {
				mvaddch(mrow, mcol, monster->trail_char);
			} else {
				if (monster->trail_char == '.') {
					monster->trail_char = ' ';
				}
				mvaddch(mrow, mcol, monster->trail_char);
			}
		}
	}
	monster->trail_char = mvinch(row, col);
	if (!blind && (detect_monster || rogue_can_see(row, col))) {
		if ((!(monster->m_flags & INVISIBLE) ||
			(detect_monster || see_invisible || r_see_invisible))) {
			mvaddch(row, col, gmc(monster));
		}
	}
	if ((dungeon[row][col] & DOOR) &&
		(get_room_number(row, col) != cur_room) &&
		(dungeon[mrow][mcol] == FLOOR) && !blind) {
			mvaddch(mrow, mcol, ' ');
	}
	if (dungeon[row][col] & DOOR) {
			dr_course(monster, ((dungeon[mrow][mcol] & TUNNEL) ? 1 : 0),
				row, col);
	} else {
		monster->row = row;
		monster->col = col;
	}
}
void
wanderer(void)
{
	object *monster;
	short row, col, i;
	boolean found = 0;

	monster = NULL;		/* XXXGCC -Wuninitialized [powerpc] */

	for (i = 0; ((i < 15) && (!found)); i++) {
		monster = gr_monster(NULL, 0);
		if (!(monster->m_flags & (WAKENS | WANDERS))) {
			free_object(monster);
		} else {
			found = 1;
		}
	}
	if (found) {
		found = 0;
		wake_up(monster);
		for (i = 0; ((i < 25) && (!found)); i++) {
			gr_row_col(&row, &col, (FLOOR | TUNNEL | STAIRS | OBJECT));
			if (!rogue_can_see(row, col)) {
				put_m_at(row, col, monster);
				found = 1;
			}
		}
		if (!found) {
			free_object(monster);
		}
	}
}
예제 #3
0
void
disappear(object *monster)
{
    short row, col;

    row = monster->row;
    col = monster->col;

    dungeon[row][col] &= ~MONSTER;
    if (rogue_can_see(row, col)) {
	mvaddch_rogue(row, col, get_dungeon_char(row, col));
    }
    take_from_pack(monster, &level_monsters);
    free_object(monster);
    mon_disappeared = 1;
}
void
aggravate(void)
{
	object *monster;

	messagef(0, "you hear a high pitched humming noise");

	monster = level_monsters.next_monster;

	while (monster) {
		wake_up(monster);
		monster->m_flags &= (~IMITATES);
		if (rogue_can_see(monster->row, monster->col)) {
			mvaddch(monster->row, monster->col, monster->m_char);
		}
		monster = monster->next_monster;
	}
}
예제 #5
0
int
m_confuse(object *monster)
{
    char msg[80];

    if (!rogue_can_see(monster->row, monster->col)) {
	return 0;
    }
    if (rand_percent(45)) {
	monster->m_flags &= (~CONFUSES);	/* will not confuse the rogue */
	return 0;
    }
    if (rand_percent(55)) {
	monster->m_flags &= (~CONFUSES);
	sprintf(msg, mesg[209], mon_name(monster));
	message(msg, 1);
	confuse();
	return 1;
    }
    return 0;
}
예제 #6
0
void wanderer(void)
{
    object *monster;
    int row, col;
    int	i;
    boolean found = 0;

    for (i = 0; ((i < 15) && (!found)); i++)
    {
        monster = gr_monster((object *) 0, 0);
        if (!(monster->m_flags & (WAKENS | WANDERS)))
        {
            free_object(monster);
        }
        else
        {
            found = 1;
        }
    }
    if (found)
    {
        found = 0;
        wake_up(monster);
        for (i = 0; ((i < 25) && (!found)); i++)
        {
            gr_row_col(&row, &col, (FLOOR | TUNNEL | STAIRS | OBJECT));
            if (!rogue_can_see(row, col))
            {
                put_m_at(row, col, monster);
                found = 1;
            }
        }
        if (!found)
        {
            free_object(monster);
        }
    }
}