AwakeMUD-0.6Beta/doc/
AwakeMUD-0.6Beta/lib/
AwakeMUD-0.6Beta/lib/etc/
AwakeMUD-0.6Beta/lib/etc/pfiles/
AwakeMUD-0.6Beta/lib/fixer_data/
AwakeMUD-0.6Beta/lib/misc/
AwakeMUD-0.6Beta/lib/plrobjs/
AwakeMUD-0.6Beta/lib/plrobjs/A-E/
AwakeMUD-0.6Beta/lib/plrobjs/F-J/
AwakeMUD-0.6Beta/lib/plrobjs/K-O/
AwakeMUD-0.6Beta/lib/plrobjs/U-Z/
AwakeMUD-0.6Beta/lib/plrspells/A-E/
AwakeMUD-0.6Beta/lib/plrspells/F-J/
AwakeMUD-0.6Beta/lib/plrtext/A-E/
AwakeMUD-0.6Beta/lib/world/
AwakeMUD-0.6Beta/lib/world/mob/
AwakeMUD-0.6Beta/lib/world/obj/
AwakeMUD-0.6Beta/lib/world/qst/
AwakeMUD-0.6Beta/lib/world/shp/
AwakeMUD-0.6Beta/lib/world/wld/
AwakeMUD-0.6Beta/lib/world/zon/
/* ************************************************************************
*   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 <stdio.h>

#include "structs.h"
#include "awake.h"
#include "db.h"
#include "interpreter.h"
#include "utils.h"
#include "spells.h"

extern struct room_data *world;
extern int top_of_world;
extern int mini_mud;
extern struct index_data *mob_index;
extern struct index_data *obj_index;

void ASSIGNMOB(int mob, SPECIAL(fname));

/* arrays for trainers/teachers/adepts/masters */

/* order: vnum, attributes, 1 - newbie trainer (else 0)					*/
/* to have multiple attributes, separate them with |						*/
train_t trainers[] = {
//  { 2506, STR, 0 },
//  { 4255, BOD, 0 },
  { 8004, BOD | QUI | STR | CHA | INT | WIL, 1 },
  { 8005, BOD | QUI | STR | CHA | INT | WIL, 1 },
  { 8006, BOD | QUI | STR | CHA | INT | WIL, 1 },
  { 8007, BOD | QUI | STR | CHA | INT | WIL, 1 },
  { 8018, BOD | QUI | STR | CHA | INT | WIL, 1 },
//  { 17104, BOD | QUI | STR, 0 },
//  { 9413, CHA | INT | WIL, 0 },
  { 0, 0, 0 } /* this MUST be last */
};

/* order: vnum, skill1, skill2, skill3, skill4, skill5, learn message, level		*/
/* see spells.h for the list of skills.								*/
/* don't have them teach anything above SKILL_ELF_ETTIQUETTE (except SKILL_CLIMBING)*/
/* if they teach < 5 skills, put a 0 in the remaining skill slots				*/
/* available levels are NEWBIE (4), AMATEUR (6/7), and ADVANCED (10/11)			*/
teach_t teachers[] = {
//  { 2508, SKILL_BIOTECH, 0, 0, 0, 0, 0, 0, 0, "After hours of medical research and instruction, you begin "
//    "to\r\nunderstand more of the basic biotech procedures.\r\n", NEWBIE },
//  { 3722, SKILL_ATHLETICS, SKILL_RIFLES, SKILL_PISTOLS, 0, 0, 0, 0, 0,
//    "After hours of study and physical practice, you feel like you've "
//    "learned\r\nsomething.\r\n", AMATEUR },
//  { 4101, SKILL_FIREARMS, SKILL_PISTOLS, SKILL_RIFLES, SKILL_SHOTGUNS, SKILL_GUNNERY, 0, 0, 0,
//    "After hours of study and target practice, you feel like you've "
//    "learned\r\nsomething.\r\n", AMATEUR },
//  { 4102, SKILL_ARMED_COMBAT, SKILL_EDGED_WEAPONS, SKILL_POLE_ARMS, SKILL_WHIPS_FLAILS,
//    SKILL_CLUBS, 0, 0, 0, "After hours of study and melee practice, you feel like you've "
//    "learned\r\nsomething.\r\n", AMATEUR },
//  { 4103, SKILL_FIREARMS, SKILL_PISTOLS, SKILL_RIFLES, SKILL_SHOTGUNS, SKILL_GUNNERY, 0, 0, 0,
//    "After hours of study and target practice, you feel like you've "
//    "learned\r\nsomething.\r\n", ADVANCED },
//  { 4104, SKILL_ARMED_COMBAT, SKILL_EDGED_WEAPONS, SKILL_POLE_ARMS, SKILL_WHIPS_FLAILS, 0, 0, 0,
//    SKILL_CLUBS, "After hours of study and melee practice, you feel like you've "
//    "learned\r\nsomething.\r\n", ADVANCED },
//  { 4250, SKILL_SORCERY, SKILL_MAGICAL_THEORY, SKILL_CONJURING, 0, 0, 0, 0, 0,
//    "After hours of study and magical practice, you feel like you've "
//    "learned\r\nsomething.\r\n", ADVANCED },
//  { 4251, SKILL_SHAMANIC_STUDIES, SKILL_CONJURING, SKILL_SORCERY, 0, 0, 0, 0, 0,
//    "After hours of study and magical practice, you feel like you've "
//    "learned\r\nsomething.\r\n", ADVANCED },
//  { 4257, SKILL_ASSAULT_RIFLES, SKILL_TASERS, 0, 0, 0, 0, 0, 0,
//    "After hours of study and weapon practice, you feel like you've "
//    "learned\r\nsomething.\r\n", AMATEUR },
  { 8000, SKILL_UNARMED_COMBAT, SKILL_ARMED_COMBAT, SKILL_FIREARMS, SKILL_COMPUTER,
    SKILL_ATHLETICS, SKILL_STREET_ETIQUETTE, SKILL_GUNNERY, SKILL_ELECTRONICS, "After hours of study and practice, you feel like you've "
    "learned\r\nsomething.\r\n", NEWBIE },
  { 8001, SKILL_SORCERY, SKILL_MAGICAL_THEORY, SKILL_FIREARMS, SKILL_ARMED_COMBAT,
    SKILL_UNARMED_COMBAT, SKILL_STREET_ETIQUETTE, SKILL_ELECTRONICS, SKILL_BIOTECH, "After hours of study and practice, you feel like you've "
    "learned\r\nsomething.\r\n", NEWBIE },
  { 8003, SKILL_SORCERY, SKILL_SHAMANIC_STUDIES, SKILL_FIREARMS, SKILL_ARMED_COMBAT,
    SKILL_UNARMED_COMBAT, SKILL_BIOTECH, SKILL_STREET_ETIQUETTE, SKILL_ELECTRONICS, "After hours of study and practice, you feel like you've "
    "learned\r\nsomething.\r\n", NEWBIE },
  { 8017, SKILL_UNARMED_COMBAT, SKILL_ARMED_COMBAT, SKILL_FIREARMS, SKILL_ATHLETICS,
    SKILL_THROWING_WEAPONS, SKILL_PROJECTILES, SKILL_STREET_ETIQUETTE, SKILL_GUNNERY, "After hours of study and practice, you feel like you've "
    "learned\r\nsomething.\r\n", NEWBIE },
  { 13499, SKILL_COMPUTER, SKILL_ELECTRONICS, SKILL_COMPUTER_THEORY, 0, 0, 0, 0, 0, "Brian explains some concepts you had yet to understand "
  "and\r\nyou feel like you've learned somthing.\r\n", AMATEUR },
//  { 14839, SKILL_UNARMED_COMBAT, SKILL_THROWING_WEAPONS, SKILL_STEALTH, SKILL_ATHLETICS,
//    SKILL_CLIMBING, SKILL_PROJECTILES, 0, 0, "Shing gives you a work out like none you've ever had, "
//    "but\r\nyou feel like you've learned something.\r\n", AMATEUR },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, "Report this bug!\r\n", 0 } // this MUST be last
};

/* order: vnum, perception, combat sense, inc. reflexes, killing hands, pain res.,
          1 - newbie trainer (else 0)								*/
/* max ratings - astral perception: 1, combat sense: 3, inc. reflexes: 3,		*/
/* killing hands: 4, pain resistance: 10								*/
adept_t adepts[] = {
  { 8019, { 1, 1, 1, 2, 3 }, 1 },
//  { 14839,{ 0, 0, 0, 2, 5 }, 0 },
//  { 3603, { 0, 2, 2, 3, 8 }, 0 },
//  { 20326,{ 0, 2, 0, 1, 0 }, 0 },
  { 0, { 0, 0, 0, 0 }, 0 } // this MUST be last
};

/* order: vnum, first spell, first max force, second spell, second max force,
          1 - mage teacher (0 - shaman teacher), 1 - newbie teacher (else 0)		*/
/* see spells.h for the list of spells								*/
/* don't have them teach anything above SPELL_TOXIC_WAVE					*/
/* neither force shouldn't exceed 6, as no one should have a magic rating > 6		*/
/* if they don't teach two spells, put a 0 in the fourth and fifth slots		*/
master_t masters[] = {
  { 8008, SPELL_POWER_DART, 4,   SPELL_MANA_DART, 4, 1, 1 },
  { 8009, SPELL_POWER_DART, 4,   SPELL_MANA_DART, 4, 0, 1 },
//  { 9413, SPELL_INVISIBILITY, 6, SPELL_ARMOR,     6, 0, 0 },
  { 0, 0, 0, 0, 0 } // this MUST be last
};

/* functions to perform assignments */

void ASSIGNMOB(int mob, SPECIAL(fname))
{
  int rnum;

  if ((rnum = real_mobile(mob)) >= 0) {
    mob_index[rnum].sfunc = mob_index[rnum].func;
    mob_index[rnum].func = fname;
  } else if (!mini_mud) {
    sprintf(buf, "SYSERR: Attempt to assign spec to non-existant mob #%d", mob);
    log(buf);
  }
}

void ASSIGNOBJ(int obj, SPECIAL(fname))
{
  if (real_object(obj) >= 0)
    obj_index[real_object(obj)].func = fname;
  else if (!mini_mud) {
    sprintf(buf, "SYSERR: Attempt to assign spec to non-existant obj #%d", obj);
    log(buf);
  }
}

void ASSIGNWEAPON(int weapon, WSPEC(fname))
{
  if (real_object(weapon) >= 0)
    obj_index[real_object(weapon)].wfunc = fname;
  else if (!mini_mud) {
    sprintf(buf, "SYSERR: Attempt to assign spec to non-existant weapon #%d", weapon);
    log(buf);
  }
}

void ASSIGNROOM(int room, SPECIAL(fname))
{
  if (real_room(room) >= 0)
    world[real_room(room)].func = fname;
  else if (!mini_mud) {
    sprintf(buf, "SYSERR: Attempt to assign spec to non-existant rm. #%d", room);
    log(buf);
  }
}


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

/* assign special procedures to mobiles */
void assign_mobiles(void)
{
  int i;

  SPECIAL(postmaster);
  SPECIAL(generic_guard);
  SPECIAL(receptionist);
  SPECIAL(cryogenicist);
  SPECIAL(teacher);
  SPECIAL(trainer);
  SPECIAL(adept_trainer);
  SPECIAL(spell_master);
  SPECIAL(puff);
  SPECIAL(janitor);
  SPECIAL(snake);
  SPECIAL(thief);
  SPECIAL(magic_user);
  SPECIAL(clean);
  SPECIAL(pike);
  SPECIAL(jeff);
  SPECIAL(captain);
  SPECIAL(rodgers);
  SPECIAL(delaney);
  SPECIAL(lone_star_park);
  SPECIAL(mugger_park);
  SPECIAL(gate_guard_park);
  SPECIAL(squirrel_park);
  SPECIAL(sick_ork);
  SPECIAL(mage_messenger);
  SPECIAL(adept_guard);
  SPECIAL(takehero_tsuyama);
  SPECIAL(bio_secretary);
  SPECIAL(expreen);
  SPECIAL(beurring);
  SPECIAL(tarmile);
  SPECIAL(nitler);
  SPECIAL(pool);
  SPECIAL(harlten);
  SPECIAL(branson);
  SPECIAL(bio_guard);
  SPECIAL(worker);
  SPECIAL(dwarf);
  SPECIAL(elf);
  SPECIAL(george);
  SPECIAL(wendigo);
  SPECIAL(pimp);
  SPECIAL(prostitute);
  SPECIAL(heinrich);
  SPECIAL(ignaz);
  SPECIAL(waitress);
  SPECIAL(dracula);
  SPECIAL(pandemonia);
  SPECIAL(tunnel_rat);
  SPECIAL(saeder_guard);
  SPECIAL(atomix);
  SPECIAL(fixer);
  SPECIAL(hacker);
  SPECIAL(fence);
  SPECIAL(taxi);
  SPECIAL(crime_mall_guard);
  SPECIAL(doctor_scriptshaw);
  SPECIAL(huge_troll);
  SPECIAL(phrodos_receptionist);
  SPECIAL(ghosts_receptionist);
  SPECIAL(aegnor);
  SPECIAL(purple_haze_bartender);

  /* trainers */
  for (i = 0; trainers[i].vnum != 0; i++)
    ASSIGNMOB(trainers[i].vnum, trainer);

  /* teachers */
  for (i = 0; teachers[i].vnum != 0; i++)
    ASSIGNMOB(teachers[i].vnum, teacher);

  /* adept trainer */
  for (i = 0; adepts[i].vnum != 0; i++)
    ASSIGNMOB(adepts[i].vnum, adept_trainer);

  for (i = 0; masters[i].vnum != 0; i++)
    ASSIGNMOB(masters[i].vnum, spell_master);

  /* Personal rooms */
  ASSIGNMOB(1, puff);
  ASSIGNMOB(2, mage_messenger);
  ASSIGNMOB(4, pool);
  ASSIGNMOB(8, phrodos_receptionist);
  ASSIGNMOB(9, ghosts_receptionist);

  /* cab drivers */
  ASSIGNMOB(600, taxi);

  /* Immortal HQ */
  ASSIGNMOB(1002, janitor);
  ASSIGNMOB(1005, postmaster);

  /* SWU */
  ASSIGNMOB(1102, postmaster);

  /* Various Tacoma */
  ASSIGNMOB(1823, aegnor);
  ASSIGNMOB(1832, fixer);
  ASSIGNMOB(1833, purple_haze_bartender);
  ASSIGNMOB(1900, postmaster);
  ASSIGNMOB(1902, receptionist);
  ASSIGNMOB(1916, generic_guard);

  /* Tacoma */
  ASSIGNMOB(2013, generic_guard);
  ASSIGNMOB(2020, hacker);
  ASSIGNMOB(2022, janitor);

  /* club penumbra */
//  ASSIGNMOB(2112, generic_guard);
//  ASSIGNMOB(2111, clean);
//  ASSIGNMOB(2113, magic_user);
//  ASSIGNMOB(2115, receptionist);

  /* Puyallup */
//  ASSIGNMOB(2306, pike);
//  ASSIGNMOB(2305, jeff);
//  ASSIGNMOB(2403, atomix);

  /*Lone Star 17th Precinct*/
//  ASSIGNMOB(3700, captain);
//  ASSIGNMOB(3708, rodgers);
//  ASSIGNMOB(3709, delaney);
//  ASSIGNMOB(3703, generic_guard);
//  ASSIGNMOB(3720, generic_guard);
//  ASSIGNMOB(3829, janitor);
//  ASSIGNMOB(3712, janitor);

  /*Seattle State Park*/
//  ASSIGNMOB(4001, lone_star_park);
//  ASSIGNMOB(4003, mugger_park);
//  ASSIGNMOB(4008, janitor);
//  ASSIGNMOB(4009, gate_guard_park);
//  ASSIGNMOB(4012, squirrel_park);
//  ASSIGNMOB(4013, sick_ork);
//  ASSIGNMOB(4016, adept_guard);
//  ASSIGNMOB(4019, takehero_tsuyama);

  /* Various - zone 116 */
//  ASSIGNMOB(4100, postmaster);

  /*BioHyde Complex*/
//  ASSIGNMOB(4202, bio_secretary);
//  ASSIGNMOB(4208, expreen);
//  ASSIGNMOB(4206, harlten);
//  ASSIGNMOB(4209, branson);
//  ASSIGNMOB(4200, bio_guard);
//  ASSIGNMOB(4203, worker);

  /*Groetza Camp*/
//  ASSIGNMOB(4227, beurring);
//  ASSIGNMOB(4228, tarmile);
//  ASSIGNMOB(4219, nitler);
//  ASSIGNMOB(4221, janitor);

  /*Titty Twister*/
//  ASSIGNMOB(4500, wendigo);
//  ASSIGNMOB(4501, pimp);
//  ASSIGNMOB(4502, prostitute);
//  ASSIGNMOB(4504, heinrich);
//  ASSIGNMOB(4506, ignaz);
//  ASSIGNMOB(4507, waitress);
//  ASSIGNMOB(4508, dracula);
//  ASSIGNMOB(4509, pandemonia);
//  ASSIGNMOB(4513, tunnel_rat);

  /* Tarislar */
//  ASSIGNMOB(4912, saeder_guard);

  /* Seattle */
//  ASSIGNMOB(5100, generic_guard);
//  ASSIGNMOB(5101, janitor);

  /* Neophytic Guild */
  ASSIGNMOB(8010, postmaster);
  ASSIGNMOB(8015, receptionist);

  /* Council Island */
//  ASSIGNMOB(9202, doctor_scriptshaw);
//  ASSIGNMOB(9410, huge_troll);

  /* Ork Underground */
//  ASSIGNMOB(9913, receptionist);

  /* Bellevue */
//  ASSIGNMOB(20342, receptionist);

  /* Crime Mall */
//  ASSIGNMOB(10022, crime_mall_guard);

  /* Bradenton */
//  ASSIGNMOB(14515, hacker);
//  ASSIGNMOB(14516, fence);
}

/* assign special procedures to objects */

void assign_objects(void)
{
  SPECIAL(bank);
  SPECIAL(gen_board);
  SPECIAL(vendtix);
  SPECIAL(clock);
//  SPECIAL(inky_pendant);
  SPECIAL(emerald_chalice);
  SPECIAL(vending_machine);
  SPECIAL(hand_held_scanner);
  SPECIAL(anticoagulant);
  SPECIAL(rng);

  ASSIGNOBJ(3, gen_board);
  ASSIGNOBJ(4, gen_board);
  ASSIGNOBJ(12, gen_board);
  ASSIGNOBJ(21, gen_board);
  ASSIGNOBJ(22, gen_board);
//  ASSIGNOBJ(26, gen_board);
//  ASSIGNOBJ(28, gen_board);
  ASSIGNOBJ(1006, gen_board);     /* builder board  */
  ASSIGNOBJ(1007, gen_board);
  ASSIGNOBJ(1038, gen_board);
  ASSIGNOBJ(1075, gen_board);	  /* Initiation Board */
  ASSIGNOBJ(1904, clock);
  ASSIGNOBJ(1946, bank);
  ASSIGNOBJ(2104, gen_board);     /* mortal board   */
  ASSIGNOBJ(2106, gen_board);     /* immortal board */
  ASSIGNOBJ(2107, gen_board);     /* freeze board   */
  ASSIGNOBJ(2108, bank);        /* atm  */
//  ASSIGNOBJ(22700, gen_board);  /* Washu's Board */
  ASSIGNOBJ(2506, anticoagulant);
//  ASSIGNOBJ(3012, vendtix);
//  ASSIGNOBJ(3114, gen_board);
//  ASSIGNOBJ(4006, clock);
//  ASSIGNOBJ(4216, clock);
//  ASSIGNOBJ(4507, emerald_chalice);
//  ASSIGNOBJ(4516, inky_pendant);   * Shouldn't exist in it's current form 
  ASSIGNOBJ(8001, gen_board);
  ASSIGNOBJ(8002, gen_board);
  ASSIGNOBJ(8003, gen_board);
  ASSIGNOBJ(8004, gen_board);
  ASSIGNOBJ(8013, gen_board);
//  ASSIGNOBJ(9329, vending_machine);
//  ASSIGNOBJ(9406, hand_held_scanner);
//  ASSIGNOBJ(12114, vending_machine);

  WSPEC(monowhip);

//  ASSIGNWEAPON(4905, monowhip);
}

/* assign special procedures to rooms */

void assign_rooms(void)
{
  extern int dts_are_dumps;
  int i;

  SPECIAL(dump);
  SPECIAL(pet_shops);
  SPECIAL(oceansounds);
  SPECIAL(aztec_one);
  SPECIAL(rope);
  SPECIAL(combination);
  SPECIAL(escalator);
  SPECIAL(center_initiation);
  SPECIAL(neophyte_lobby);
  SPECIAL(neophyte_entrance);
  SPECIAL(simulate_bar_fight);
  SPECIAL(crime_mall_blockade);
  SPECIAL(waterfall);
  SPECIAL(climb_down_junk_pile);
  SPECIAL(climb_up_junk_pile);
  SPECIAL(junk_pile_fridge);
  SPECIAL(cpu);
  SPECIAL(datastore);
  SPECIAL(input_output);
  SPECIAL(spu);
  SPECIAL(system_access);
  SPECIAL(slave);
  SPECIAL(phrodos_office);
  SPECIAL(ghosts_office);
  SPECIAL(moonlight_mall);

  /*  ASSIGNROOM(2130, dump);
  ASSIGNROOM(2131, pet_shops); */

  /* Limbo/God Rooms */
  ASSIGNROOM(3, rope);
  ASSIGNROOM(8, oceansounds);
  ASSIGNROOM(9, oceansounds);
  ASSIGNROOM(15, ghosts_office);
  ASSIGNROOM(17, phrodos_office);

  /* Carbanado */
//  ASSIGNROOM(2617, combination);

//  ASSIGNROOM(4477, waterfall);

  /* Aztechnology */
//  ASSIGNROOM(7401, aztec_one);

  /* Neophytic guild */
  ASSIGNROOM(8000, center_initiation);
  ASSIGNROOM(8029, neophyte_lobby);
  ASSIGNROOM(8031, neophyte_entrance);

  /* Ork Underground */
//  ASSIGNROOM(9978, simulate_bar_fight);

  /* Tacoma Mall */
  ASSIGNROOM(1904, escalator);
  ASSIGNROOM(1920, escalator);
  ASSIGNROOM(1923, escalator);
  ASSIGNROOM(1937, escalator);

  /* Crime Mall */
//  ASSIGNROOM(10075, crime_mall_blockade);
//  ASSIGNROOM(10077, crime_mall_blockade);

  /* Moonlight Mall*/
//  ASSIGNROOM(14308, moonlight_mall);

  /* Mr. BetterWrench Auto Repair */
//  ASSIGNROOM(12246, climb_down_junk_pile);
//  ASSIGNROOM(12248, junk_pile_fridge);
//  ASSIGNROOM(12278, climb_up_junk_pile);

  for (i = 0; i < top_of_world; i++) {
    if (IS_SET(ROOM_FLAGS(i), ROOM_MATRIX) && SECT(i) >= SECT_BLUE)
      switch (world[i].spec) {
        case 1 : world[i].func = cpu;           break;
        case 2 : world[i].func = datastore;     break;
        case 3 : world[i].func = input_output;  break;
        case 4 : world[i].func = spu;           break;
        case 5 : world[i].func = system_access; break;
        case 6 : world[i].func = slave;         break;
        default: break;
      }
    if (dts_are_dumps)
      if (IS_SET(ROOM_FLAGS(i), ROOM_DEATH))
        world[i].func = dump;
  }
}