/* ************************************************************************
*   File: spec_assign.c                                 Part of CircleMUD *
*  Usage: Functions to assign function pointers to objs/mobs/rooms        *
*                                                                         *
*  All rights reserved.  See license.doc for complete information.        *
*                                                                         *
*  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 "db.h"
#include "interpreter.h"
#include "utils.h"
/* external globals */
extern int mini_mud;
/* external functions */
SPECIAL(dump);
SPECIAL(pet_shops);
SPECIAL(postmaster);
SPECIAL(cityguard);
SPECIAL(receptionist);
SPECIAL(cryogenicist);
SPECIAL(guild_guard);
SPECIAL(puff);
SPECIAL(fido);
SPECIAL(janitor);
SPECIAL(mayor);
SPECIAL(snake);
SPECIAL(thief);
SPECIAL(magic_user);
SPECIAL(bank);
SPECIAL(gen_board);
SPECIAL(lyrzaxyn);
SPECIAL(azimer);
SPECIAL(dziak);
SPECIAL(cleric_ao);
SPECIAL(cleric_marduk);
/* local functions */
void assign_mobiles(void);
void assign_objects(void);
void assign_rooms(void);
void ASSIGNROOM(room_vnum room, SPECIAL(fname));
void ASSIGNMOB(mob_vnum mob, SPECIAL(fname));
void ASSIGNOBJ(obj_vnum obj, SPECIAL(fname));
/* functions to perform assignments */
void ASSIGNMOB(mob_vnum mob, SPECIAL(fname))
{
  mob_rnum rnum;
  if ((rnum = real_mobile(mob)) != NOBODY)
    mob_index[rnum].func = fname;
  else if (!mini_mud)
    log("SYSERR: Attempt to assign spec to non-existant mob #%d", mob);
}
void ASSIGNOBJ(obj_vnum obj, SPECIAL(fname))
{
  obj_rnum rnum;
  if ((rnum = real_object(obj)) != NOTHING)
    obj_index[rnum].func = fname;
  else if (!mini_mud)
    log("SYSERR: Attempt to assign spec to non-existant obj #%d", obj);
}
void ASSIGNROOM(room_vnum room, SPECIAL(fname))
{
  room_rnum rnum;
  if ((rnum = real_room(room)) != NOWHERE)
    world[rnum].func = fname;
  else if (!mini_mud)
    log("SYSERR: Attempt to assign spec to non-existant room #%d", room);
}
/* ********************************************************************
*  Assignments                                                        *
******************************************************************** */
/* assign special procedures to mobiles */
void assign_mobiles(void)
{
  /* Tower of the Ordeal */
  ASSIGNMOB(103, magic_user);
  /* The followers of Dziak */
  ASSIGNMOB(401, magic_user);
  ASSIGNMOB(402, magic_user);
  ASSIGNMOB(403, cleric_marduk);
  ASSIGNMOB(404, dziak);
  /* Buried temple */
  ASSIGNMOB(600, snake);
  ASSIGNMOB(603, magic_user);
  /* Timmoth */
  ASSIGNMOB(1404, cleric_marduk);
  ASSIGNMOB(1405, cleric_marduk);
  /* Elysium */
  /* Aghazstamn's Lair */
  ASSIGNMOB(2104, magic_user);
  /* School of Wizardry */
  ASSIGNMOB(2505, azimer);
  /* First Quest */
  ASSIGNMOB(2902, cleric_marduk);
  ASSIGNMOB(2903, magic_user);
  /* Kortaal */
  ASSIGNMOB(3005, receptionist);
  ASSIGNMOB(3010, postmaster);
  ASSIGNMOB(3012, magic_user);
  ASSIGNMOB(3013, magic_user);
  ASSIGNMOB(3014, magic_user);
  ASSIGNMOB(3015, magic_user);
  ASSIGNMOB(3024, guild_guard);
  ASSIGNMOB(3025, guild_guard);
  ASSIGNMOB(3026, guild_guard);
  ASSIGNMOB(3027, guild_guard);
  ASSIGNMOB(3028, guild_guard);
  ASSIGNMOB(3029, guild_guard);
  ASSIGNMOB(3059, cityguard);
  ASSIGNMOB(3060, cityguard);
  ASSIGNMOB(3061, janitor);
  ASSIGNMOB(3062, fido);
  ASSIGNMOB(3066, fido);
  /* Outside Kortaal */
  ASSIGNMOB(3106, receptionist);
  ASSIGNMOB(3107, receptionist);
  /* Fields of the Dead */
  ASSIGNMOB(3304, magic_user);
  /* Kings Roads */
  ASSIGNMOB(3601, cleric_ao);
  /* PC Mobs */
  ASSIGNMOB(4203, magic_user);
  ASSIGNMOB(4204, cleric_ao);
  ASSIGNMOB(4205, magic_user);
  ASSIGNMOB(4206, magic_user);
  ASSIGNMOB(4208, cleric_ao);
  ASSIGNMOB(4213, magic_user);
  ASSIGNMOB(4214, magic_user);
  /* Secret Tunnel */
  ASSIGNMOB(4342, lyrzaxyn);
  /* MORIA */
  ASSIGNMOB(4000, snake);
  ASSIGNMOB(4001, snake);
  ASSIGNMOB(4053, snake);
  ASSIGNMOB(4100, magic_user);
  ASSIGNMOB(4102, snake);
  ASSIGNMOB(4219, cityguard);
  /* Drow City */
  ASSIGNMOB(5103, magic_user);
  ASSIGNMOB(5104, cleric_marduk);
  ASSIGNMOB(5107, magic_user);
  ASSIGNMOB(5108, magic_user);
  /* Castle Kilgrave */
  ASSIGNMOB(5506, magic_user);
  ASSIGNMOB(5507, cleric_marduk);
  /* Kings Forest */
  ASSIGNMOB(6023, receptionist);
  ASSIGNMOB(6033, cleric_ao);
  ASSIGNMOB(6034, cleric_ao);
  ASSIGNMOB(6035, cleric_ao);
  ASSIGNMOB(6036, cleric_ao);
  ASSIGNMOB(6037, cleric_ao);
  /* FOREST */
  ASSIGNMOB(6112, magic_user);
  ASSIGNMOB(6113, snake);
  ASSIGNMOB(6114, magic_user);
  ASSIGNMOB(6115, magic_user);
  ASSIGNMOB(6116, cleric_ao);
  /* SEWERS */
  ASSIGNMOB(7006, snake);
  ASSIGNMOB(7009, magic_user);
  ASSIGNMOB(7015, guild_guard);
  ASSIGNMOB(7016, guild_guard);
  /* Ohari */
  ASSIGNMOB(8002, cityguard);
  ASSIGNMOB(8003, cityguard);
  ASSIGNMOB(8004, cityguard);
  ASSIGNMOB(8005, cityguard);
  ASSIGNMOB(8006, cityguard);
  ASSIGNMOB(8007, cleric_ao);
  ASSIGNMOB(8008, cityguard);
  ASSIGNMOB(8009, magic_user);
  ASSIGNMOB(8013, magic_user);
  ASSIGNMOB(8014, magic_user);
  ASSIGNMOB(8018, cleric_ao);
  ASSIGNMOB(8022, magic_user);
  /* Nangalen */
  ASSIGNMOB(8504, cleric_ao);
  ASSIGNMOB(8517, cleric_ao);
  ASSIGNMOB(8518, cleric_ao);
  ASSIGNMOB(8519, magic_user);
  ASSIGNMOB(8523, magic_user);
  ASSIGNMOB(8524, magic_user);
  ASSIGNMOB(8529, cleric_ao);
  ASSIGNMOB(8534, magic_user);
  /* Church of Ao */
  ASSIGNMOB(9000, cityguard);
  /* Maakan */
  ASSIGNMOB(11001, cleric_ao);
  ASSIGNMOB(11002, cleric_ao);
  ASSIGNMOB(11003, cleric_ao);
  ASSIGNMOB(11004, cleric_ao);
  ASSIGNMOB(11005, cleric_ao);
  ASSIGNMOB(11014, receptionist);
  ASSIGNMOB(11020, guild_guard);
  /* Tekaro */
  ASSIGNMOB(12000, receptionist);
  ASSIGNMOB(12004, receptionist);
  ASSIGNMOB(12006, guild_guard);
  ASSIGNMOB(12010, guild_guard);
  ASSIGNMOB(12008, guild_guard);
  /* Helgor */
  ASSIGNMOB(11803, receptionist);
  /* Woeld */
  ASSIGNMOB(11903, cityguard);
  ASSIGNMOB(11925, receptionist);
  ASSIGNMOB(11927, guild_guard);
}
/* assign special procedures to objects */
void assign_objects(void)
{
  ASSIGNOBJ(3096, gen_board);	/* social board */
  ASSIGNOBJ(3097, gen_board);	/* freeze board */
  ASSIGNOBJ(3098, gen_board);	/* immortal board */
  ASSIGNOBJ(3099, gen_board);	/* mortal board */
  ASSIGNOBJ(3034, bank);	/* atm */
  ASSIGNOBJ(3036, bank);	/* cashcard */
}
/* assign special procedures to rooms */
void assign_rooms(void)
{
  room_rnum i;
  ASSIGNROOM(3030, dump);
  ASSIGNROOM(3031, pet_shops);
  if (CONFIG_DTS_ARE_DUMPS)
    for (i = 0; i <= top_of_world; i++)
      if (ROOM_FLAGGED(i, ROOM_DEATH))
	world[i].func = dump;
}