empiremud/cnf/
empiremud/doc/
empiremud/lib/boards/
empiremud/lib/etc/
empiremud/lib/misc/
empiremud/lib/plralias/F-J/
empiremud/lib/plralias/K-O/
empiremud/lib/plralias/P-T/
empiremud/lib/plralias/U-Z/
empiremud/lib/plrobjs/
empiremud/lib/plrobjs/F-J/
empiremud/lib/plrobjs/K-O/
empiremud/lib/plrobjs/P-T/
empiremud/lib/plrobjs/U-Z/
empiremud/lib/world/
empiremud/lib/world/mob/
empiremud/lib/world/obj/
empiremud/log/
/* ************************************************************************
*   File: mobact.c                                       EmpireMUD AD 1.0 *
*  Usage: Functions for generating intelligent (?) behavior in mobiles    *
*                                                                         *
*  All rights reserved.  See license.doc for complete information.        *
*                                                                         *
*  Code base by Paul Clarke.  EmpireMUD Project, a tbgMUD Production.     *
*  Based upon CircleMUD 3.0, beta patch level 17, by Jeremy Elson.        *
*                                                                         *
*  Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University *
*  CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991.               *
************************************************************************ */

#include "conf.h"
#include "sysdep.h"

#include "structs.h"
#include "utils.h"
#include "db.h"
#include "comm.h"
#include "interpreter.h"
#include "handler.h"
#include "skills.h"


/* local functions */
void mobile_activity(void) {
	extern int perform_move(Creature ch, int dir, int need_specials_check, byte mode);

	register Creature ch, next_ch, vict;
	Object obj;
	int dir, found;

	for (ch = character_list; ch; ch = next_ch) {
		next_ch = ch->next;

		if (!IS_MOB(ch) || GET_RIDDEN_BY(ch) || GET_FED_ON_BY(ch))
			continue;

		/* If the mob has no specproc, do the default actions */
		if (FIGHTING(ch) || !AWAKE(ch) || AFF_FLAGGED(ch, AFF_CHARM) || MOB_FLAGGED(ch, MOB_TIED) || GET_PULLING(ch) || GET_LED_BY(ch) || GET_RIDDEN_BY(ch))
			continue;

		if ((HAS_INFRA(ch) || !IS_DARK(ch->in_room)) && !MOB_FLAGGED(ch, MOB_SENTINEL) && GET_POS(ch) == POS_STANDING && SECT(ch->in_room) != SECT_BUILDING && SECT(ch->in_room) != SECT_MONUMENT_CLOSED && SECT(ch->in_room) != SECT_INSIDE)
			if (!GET_RIDDEN_BY(ch) && !GET_LED_BY(ch))
				if ((dir = number(0, 40)) < NUM_2D_DIRS)
					if (IS_SET(MOB_SECTS(ch), (1 << SECT(real_shift(ch->in_room, shift_dir[dir][0], shift_dir[dir][1])))))
						perform_move(ch, dir, 1, 0);

		/* Aggressive Mobs */
		if (MOB_FLAGGED(ch, MOB_AGGRESSIVE)) {
			for (found = FALSE, vict = world[ch->in_room].people; vict && !found; vict = vict->next_in_room) {
				if (IS_NPC(vict) || !vict->desc || !CAN_SEE(ch, vict) || GET_LEVEL(vict) >= LVL_GOD)
					continue;
				if (GET_RIDING(vict) && MOB_FLAGGED(GET_RIDING(vict), MOB_FLYING))
					continue;
				if (AFF_FLAGGED(vict, AFF_FLY))
					continue;
				hit(ch, vict);
				found = TRUE;
				}
			}

		if (MOB_FLAGGED(ch, MOB_SCAVENGER) && !FIGHTING(ch))
			for (obj = world[ch->in_room].contents; obj; obj = obj->next_content)
				if (GET_OBJ_TYPE(obj) == ITEM_CORPSE && !number(0, 10)) {
					while (obj->contains)
						obj_to_room(obj->contains, obj->in_room);
					extract_obj(obj);
					break;
					}

		/* Add new mobile actions here */

		}
	}