/***************************************************************************
 *  file: spec_ass.c , Special module.                     Part of DIKUMUD *
 *  Usage: Procedures assigning function pointers.                         *
 *  Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
 *                                                                         *
 *  Copyright (C) 1992, 1993 Michael Chastain, Michael Quan, Mitchell Tse  *
 *  Performance optimization and bug fixes by MERC Industries.             *
 *  You can use our stuff in any way you like whatsoever so long as this   *
 *  copyright notice remains intact.  If you like it please drop a line    *
 *  to mec@garnet.berkeley.edu.                                            *
 *                                                                         *
 *  This is free software and you are benefitting.  We hope that you       *
 *  share your changes too.  What goes around, comes around.               *
 ***************************************************************************/

#include <stdio.h>

#include "structs.h"
#include "mob.h"
#include "obj.h"
#include "utils.h"
#include "db.h"

typedef int    SPEC_FUN  (struct char_data *ch, int cmd, char *argument);

extern struct room_data *world;
extern struct index_data *mob_index;
extern struct index_data *obj_index;
void boot_the_shops();
void assign_the_shopkeepers();

/* ********************************************************************
*  Assignments                                                        *
******************************************************************** */

/* assign special procedures to mobiles */
void assign_mobiles(void)
{
    SPEC_FUN	cityguard;
    SPEC_FUN	guild;
    SPEC_FUN	guild_guard;
    SPEC_FUN	puff;
    SPEC_FUN	fido;
    SPEC_FUN	janitor;
    SPEC_FUN	mayor;
    SPEC_FUN	snake;
    SPEC_FUN	thief;
    SPEC_FUN	magic_user;
    SPEC_FUN	red_dragon;
    SPEC_FUN	blue_dragon;
    SPEC_FUN	green_dragon;
    SPEC_FUN	black_dragon;
    SPEC_FUN	white_dragon;
    SPEC_FUN	mud_school_adept;
    SPEC_FUN	adept;
    SPEC_FUN	brass_dragon;
    SPEC_FUN	baby_troll;
    SPEC_FUN	Fanatic_Hector;
    SPEC_FUN	Thalos_citizen;
    SPEC_FUN	Executioner;
    SPEC_FUN	MERCling;
    SPEC_FUN	train;

    mob_index[real_mobile(1)].func = puff;

    mob_index[real_mobile(200)].func = mud_school_adept;
    mob_index[real_mobile(207)].func = adept;
    mob_index[real_mobile(208)].func = adept;
    mob_index[real_mobile(214)].func = fido;
    mob_index[real_mobile(218)].func = train;
    mob_index[real_mobile(219)].func = guild;
    mob_index[real_mobile(250)].func = MERCling;

    mob_index[real_mobile(1203)].func = Executioner;
    mob_index[real_mobile(3007)].func = train;
    mob_index[real_mobile(3060)].func = cityguard;
    mob_index[real_mobile(3067)].func = cityguard;
    mob_index[real_mobile(3061)].func = janitor;
    mob_index[real_mobile(3062)].func = fido;
    mob_index[real_mobile(3066)].func = fido;

    mob_index[real_mobile(3020)].func = guild;
    mob_index[real_mobile(3021)].func = guild;
    mob_index[real_mobile(3022)].func = guild;
    mob_index[real_mobile(3023)].func = guild;

    mob_index[real_mobile(3024)].func = guild_guard;
    mob_index[real_mobile(3025)].func = guild_guard;
    mob_index[real_mobile(3026)].func = guild_guard;
    mob_index[real_mobile(3027)].func = guild_guard;

    mob_index[real_mobile(3143)].func = mayor;
      
    /* MIDEN'NIR */
    mob_index[real_mobile(3500)].func = snake;

    /* MORIA */
    mob_index[real_mobile(4000)].func = snake;
    mob_index[real_mobile(4001)].func = snake;
    mob_index[real_mobile(4053)].func = snake;

    mob_index[real_mobile(4103)].func = thief;
    mob_index[real_mobile(4100)].func = magic_user;
    mob_index[real_mobile(4102)].func = snake;

    mob_index[real_mobile(4150)].func = blue_dragon;
    mob_index[real_mobile(4151)].func = red_dragon;
    mob_index[real_mobile(4152)].func = green_dragon;
    mob_index[real_mobile(4153)].func = white_dragon;
    mob_index[real_mobile(4154)].func = black_dragon;
    mob_index[real_mobile(5005)].func = brass_dragon;
    mob_index[real_mobile(5377)].func = white_dragon;
    mob_index[real_mobile(4155)].func = thief;
    mob_index[real_mobile(4157)].func = magic_user;
    mob_index[real_mobile(4158)].func = snake;

    /* mages and mage types */
    mob_index[real_mobile(5200)].func = magic_user;
    mob_index[real_mobile(7200)].func = magic_user;
    mob_index[real_mobile(7201)].func = magic_user;
    mob_index[real_mobile(7202)].func = magic_user;

    /* more dragons */
    mob_index[real_mobile(5050)].func = green_dragon;
    mob_index[real_mobile(5377)].func = white_dragon;
    mob_index[real_mobile(6112)].func = green_dragon;
    mob_index[real_mobile(6302)].func = red_dragon;
    mob_index[real_mobile(6302)].func = green_dragon;
    mob_index[real_mobile(6316)].func = green_dragon;
    mob_index[real_mobile(6317)].func = green_dragon;
    mob_index[real_mobile(350)].func  = green_dragon;
    mob_index[real_mobile(1000)].func = magic_user; /* faerie dragon */
    mob_index[real_mobile(5010)].func = red_dragon; /* draco lich    */

    /* SEWERS */
    mob_index[real_mobile(7006)].func = snake;
    mob_index[real_mobile(7040)].func = red_dragon;

    /* FOREST */
    mob_index[real_mobile(6113)].func = snake;
    mob_index[real_mobile(6114)].func = snake;

    mob_index[real_mobile(6910)].func = magic_user;
    mob_index[real_mobile(3404)].func = magic_user;
    mob_index[real_mobile(2828)].func = baby_troll;

    /* Thalos */
    mob_index[real_mobile(503)].func  = cityguard;
    mob_index[real_mobile(502)].func  = Thalos_citizen;
    mob_index[real_mobile(504)].func  = Thalos_citizen;
    mob_index[real_mobile(506)].func  = Fanatic_Hector;
    mob_index[real_mobile(507)].func  = magic_user;
    
    boot_the_shops();
    assign_the_shopkeepers();
}

/* assign special procedures to objects */
void assign_objects(void)
{
    int board(struct char_data *ch, int cmd, char *arg);

    obj_index[real_object(3099)].func = board;
}



/* assign special procedures to rooms */
void assign_rooms(void)
{
    int pet_shops(struct char_data *ch, int cmd, char *arg);

    world[real_room(3031)].funct = pet_shops;
}