/* ************************************************************************ * file: mobact.c , Mobile action module. Part of DIKUMUD * * Usage: Procedures generating 'intelligent' behavior in the mobiles. * * Copyright (C) 1990, 1991 - see 'license.doc' for complete information. * ************************************************************************* */ #include <stdio.h> #include "utils.h" #include "structs.h" #include "db.h" #include "comm.h" extern struct char_data *character_list; extern struct index_data *mob_index; extern struct room_data *world; extern struct str_app_type str_app[]; void hit(struct char_data *ch, struct char_data *victim, int type); void mobile_activity(void) { register struct char_data *ch; struct char_data *tmp_ch; struct obj_data *obj, *best_obj, *worst_obj; int door, found, max, min; extern int no_specials; void do_move(struct char_data *ch, char *argument, int cmd); void do_get(struct char_data *ch, char *argument, int cmd); for (ch = character_list; ch; ch = ch->next) if (IS_MOB(ch)) { /* Examine call for special procedure */ if (IS_SET(ch->specials.act, ACT_SPEC) && !no_specials) { if (!mob_index[ch->nr].func) { log("Attempting to call a non-existing MOB func. (mobact.c)"); REMOVE_BIT(ch->specials.act, ACT_SPEC); } else { if ((*mob_index[ch->nr].func) (ch, 0, "")) continue; } } if (AWAKE(ch) && !(ch->specials.fighting)) { if (IS_SET(ch->specials.act, ACT_SCAVENGER)) { if (world[ch->in_room].contents && !number(0,10)) { for (max = 1, best_obj = 0, obj = world[ch->in_room].contents; obj; obj = obj->next_content) { if (CAN_GET_OBJ(ch, obj)) { if (obj->obj_flags.cost > max) { best_obj = obj; max = obj->obj_flags.cost; } } } /* for */ if (best_obj) { obj_from_room(best_obj); obj_to_char(best_obj, ch); act("$n gets $p.",FALSE,ch,best_obj,0,TO_ROOM); } } } /* Scavenger */ if (!IS_SET(ch->specials.act, ACT_SENTINEL) && (GET_POS(ch) == POSITION_STANDING) && ((door = number(0, 45)) <= 5) && CAN_GO(ch,door) && !IS_SET(world[EXIT(ch, door)->to_room].room_flags, NO_MOB) && !IS_SET(world[EXIT(ch, door)->to_room].room_flags, DEATH)) { if (ch->specials.last_direction == door) { ch->specials.last_direction = -1; } else { if (!IS_SET(ch->specials.act, ACT_STAY_ZONE)) { ch->specials.last_direction = door; do_move(ch, "", ++door); } else { if (world[EXIT(ch, door)->to_room].zone == world[ch->in_room].zone) { ch->specials.last_direction = door; do_move(ch, "", ++door); } } } } /* if can go */ if (IS_SET(ch->specials.act,ACT_AGGRESSIVE)) { found = FALSE; for (tmp_ch = world[ch->in_room].people; tmp_ch && !found; tmp_ch = tmp_ch->next_in_room) { if (!IS_NPC(tmp_ch) && CAN_SEE(ch, tmp_ch)) { if (!IS_SET(ch->specials.act, ACT_WIMPY) || !AWAKE(tmp_ch)) { hit(ch, tmp_ch, 0); found = TRUE; } } } } } /* If AWAKE(ch) */ } /* If IS_MOB(ch) */ }