suntzu/bin/
suntzu/cnf/
suntzu/lib/
suntzu/lib/etc/
suntzu/lib/etc/boards/
suntzu/lib/house/
suntzu/lib/misc/
suntzu/lib/plralias/ZZZ/
suntzu/lib/plrfiles/
suntzu/lib/plrobjs/
suntzu/lib/plrobjs/ZZZ/
suntzu/lib/world/gld/
suntzu/lib/world/trg/
suntzu/src/
suntzu/src/doc/
/* ************************************************************************
*   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(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(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;
}