/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Envy Diku Mud, you must comply with *
* the original Diku license in 'license.doc', the Merc license in *
* 'license.txt', as well as the Envy license in 'license.nvy'. *
* In particular, you may not remove either of these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
* *
* ROM 2.4 is copyright 1993-1998 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@hypercube.org) *
* Gabrielle Taylor (gtaylor@hypercube.org) *
* Brian Moore (zump@rom.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
* *
* Code Adapted and Improved by Abandoned Realms Mud *
* and Aabahran: The Forsaken Lands Mud by Virigoth *
* *
* Continued Production of this code is available at www.flcodebase.com *
***************************************************************************/
/* defines */
#define STUDY_LEARN 0
#define STUDY_MEMORIZE 1
/* Types of Living Weapon */
#define LIVWEP_NONE 0
#define LIVWEP_MAL 1
#define LIVWEP_CON 2
#define LIVWEP_HOL 3
/* The system flags of gen effects, stored in flag1 */
/* GLOBALED IN MERC.H
#define EFF_F1_NONE 0 //No flags.
#define EFF_F1_NOSAVE (A) //Effect is not saved.
#define EFF_F1_NOEXTRACT (B) //UPDATE_KILL isn't run on extraction.
#define EFF_F1_ALLOW_EXTEND (C) //Spell is a normal spell effect and duration may be extended for benefit.
#define EFF_F1_CMDBLOCK (D) //Blocks Commands from execution (high priority).
*/
/* definition of gen numbers, most will also need an extern in merc.h */
sh_int gen_firestorm;
sh_int gen_mana_charge;
sh_int gen_gold_loss;
sh_int gen_guise;
sh_int gen_study;
//5
sh_int gen_insect_swarm;
sh_int gen_panic;
sh_int gen_malform;
sh_int gen_has_owner;
sh_int gen_dark_meta;
//10
sh_int gen_soul_reaver;
sh_int gen_handof_chaos;
sh_int gen_request;
sh_int gen_unlife;
sh_int gen_seremon;
//15
sh_int gen_holy_hands;
sh_int gen_voodoo_doll;
sh_int gen_pc_charm;
sh_int gen_blades;
sh_int gen_dan_blade;
//20
sh_int gen_terra_shield;
sh_int gen_plumbum;
sh_int gen_ref_shield;
sh_int gen_anger;
sh_int gen_discord;
//25
sh_int gen_orb;
sh_int gen_conceal;
sh_int gen_d_shroud;
sh_int gen_cspawn;
sh_int gen_visit;
//30
sh_int gen_sav_ward;
sh_int gen_sav_cata;
sh_int gen_challenge;
sh_int gen_circle_of_protection;
sh_int gen_yearning;
//35
sh_int gen_ensnare;
sh_int gen_mob_gen;
sh_int gen_jail;
sh_int gen_watchtower;
sh_int gen_batter;
//40
sh_int gen_addiction;
sh_int gen_levitation;
sh_int gen_siege;
sh_int gen_photon_wall;
sh_int gen_crusade;
//45
sh_int gen_avenger;
sh_int gen_bleed;
sh_int gen_apierce;
sh_int gen_chant;
sh_int gen_dvoid;
//50
sh_int gen_strium;
sh_int gen_ward;
sh_int gen_acraft;
sh_int gen_wcraft;
sh_int gen_hwep;
//55
sh_int gen_approach;
sh_int gen_suffocate;
sh_int gen_contract;
sh_int gen_spirit;
sh_int gen_coup;
//60
sh_int gen_diplomacy;
sh_int gen_recruit;
sh_int gen_vengeance;
sh_int gen_conjure;
sh_int gen_maze;
//65
sh_int gen_chron;
sh_int gen_paradox;
sh_int gen_temp_avenger;
sh_int gen_move_dam;
sh_int gen_kinesis;
//70
sh_int gen_create_object;
sh_int gen_ainfection;
sh_int gen_dreamwalk;
sh_int gen_svise;
sh_int gen_upgrade;
//75
sh_int gen_metabolic_boost;
sh_int gen_phantasm;
sh_int gen_dragon_blood;
sh_int gen_regenerate;
sh_int gen_temp_storm;
/* definition of the gen EFF_UPDATE functions */
DECLARE_EFF_UPDATE( general_kill );
DECLARE_EFF_UPDATE( firestorm_init );
DECLARE_EFF_UPDATE( firestorm_kill );
DECLARE_EFF_UPDATE( firestorm_precombat );
DECLARE_EFF_UPDATE( firestorm_enter );
DECLARE_EFF_UPDATE( firestorm_leave );
DECLARE_EFF_UPDATE( mana_charge_init );
DECLARE_EFF_UPDATE( mana_charge_kill );
DECLARE_EFF_UPDATE( mana_charge_prespell );
DECLARE_EFF_UPDATE( mana_charge_postspell );
DECLARE_EFF_UPDATE( gold_loss_init );
DECLARE_EFF_UPDATE( gold_loss_kill );
DECLARE_EFF_UPDATE( guise_init );
DECLARE_EFF_UPDATE( guise_kill );
DECLARE_EFF_UPDATE( study_none );
DECLARE_EFF_UPDATE( study_precommand );
DECLARE_EFF_UPDATE( study_init );
DECLARE_EFF_UPDATE( study_kill );
DECLARE_EFF_UPDATE( study_tick );
DECLARE_EFF_UPDATE( insect_swarm_init );
DECLARE_EFF_UPDATE( insect_swarm_kill );
DECLARE_EFF_UPDATE( insect_swarm_tick );
DECLARE_EFF_UPDATE( watch_init );
DECLARE_EFF_UPDATE( watch_kill );
DECLARE_EFF_UPDATE( watch_leave );
DECLARE_EFF_UPDATE( panic_init );
DECLARE_EFF_UPDATE( panic_postcombat );
DECLARE_EFF_UPDATE( panic_precommand );
DECLARE_EFF_UPDATE( panic_tick );
DECLARE_EFF_UPDATE( panic_kill );
DECLARE_EFF_UPDATE( malform_none );
DECLARE_EFF_UPDATE( malform_init );
DECLARE_EFF_UPDATE( malform_predeath );
DECLARE_EFF_UPDATE( malform_postkill );
DECLARE_EFF_UPDATE( malform_objtick );
DECLARE_EFF_UPDATE( has_owner_none );
DECLARE_EFF_UPDATE( has_owner_init );
DECLARE_EFF_UPDATE( has_owner_kill );
DECLARE_EFF_UPDATE( has_owner_precommand );
DECLARE_EFF_UPDATE( has_owner_objtick );
DECLARE_EFF_UPDATE( dark_met_init );
DECLARE_EFF_UPDATE( dark_met_kill );
DECLARE_EFF_UPDATE( dark_met_postdamage );
DECLARE_EFF_UPDATE( soul_reaver_init );
DECLARE_EFF_UPDATE( soul_reaver_kill );
DECLARE_EFF_UPDATE( soul_reaver_postdamage );
DECLARE_EFF_UPDATE( soul_reaver_parry );
DECLARE_EFF_UPDATE( handof_chaos_init );
DECLARE_EFF_UPDATE( handof_chaos_kill );
DECLARE_EFF_UPDATE( handof_chaos_postdamage );
DECLARE_EFF_UPDATE( handof_chaos_parry );
DECLARE_EFF_UPDATE( request_none );
DECLARE_EFF_UPDATE( request_init );
DECLARE_EFF_UPDATE( request_kill );
DECLARE_EFF_UPDATE( request_end );
DECLARE_EFF_UPDATE( request_tick );
DECLARE_EFF_UPDATE( request_precommand );
DECLARE_EFF_UPDATE( unlife_init );
DECLARE_EFF_UPDATE( unlife_kill );
DECLARE_EFF_UPDATE( unlife_tick );
DECLARE_EFF_UPDATE( seremon_init );
DECLARE_EFF_UPDATE( seremon_kill );
DECLARE_EFF_UPDATE( seremon_tick );
DECLARE_EFF_UPDATE( holy_hands_init );
DECLARE_EFF_UPDATE( holy_hands_kill );
DECLARE_EFF_UPDATE( holy_hands_postdamage );
DECLARE_EFF_UPDATE( voodoo_doll_init );
DECLARE_EFF_UPDATE( voodoo_doll_kill );
DECLARE_EFF_UPDATE( pc_charm_init );
DECLARE_EFF_UPDATE( pc_charm_precommand );
DECLARE_EFF_UPDATE( pc_charm_predamage );
DECLARE_EFF_UPDATE( pc_charm_kill );
DECLARE_EFF_UPDATE( blades_init );
DECLARE_EFF_UPDATE( blades_kill );
DECLARE_EFF_UPDATE( blades_previo );
DECLARE_EFF_UPDATE( blades_tick );
DECLARE_EFF_UPDATE( blades_precombat );
DECLARE_EFF_UPDATE( blades_predamage );
DECLARE_EFF_UPDATE( dan_blade_init );
DECLARE_EFF_UPDATE( dan_blade_kill );
DECLARE_EFF_UPDATE( dan_blade_tick );
DECLARE_EFF_UPDATE( dan_blade_previo );
DECLARE_EFF_UPDATE( dan_blade_postvio );
DECLARE_EFF_UPDATE( dan_blade_precombat );
DECLARE_EFF_UPDATE( anger_search_room );
DECLARE_EFF_UPDATE( anger_kill );
DECLARE_EFF_UPDATE( anger_leave );
DECLARE_EFF_UPDATE( terra_shield_init );
DECLARE_EFF_UPDATE( terra_shield_kill );
DECLARE_EFF_UPDATE( terra_shield_enter );
DECLARE_EFF_UPDATE( terra_shield_leave );
DECLARE_EFF_UPDATE( terra_shield_predamage );
DECLARE_EFF_UPDATE( terra_shield_tick );
DECLARE_EFF_UPDATE( ref_shield_init );
DECLARE_EFF_UPDATE( ref_shield_kill );
DECLARE_EFF_UPDATE( ref_shield_predamage );
DECLARE_EFF_UPDATE( ref_shield_tick );
DECLARE_EFF_UPDATE( ref_shield_precombat );
DECLARE_EFF_UPDATE( plumbum_init );
DECLARE_EFF_UPDATE( plumbum_kill );
DECLARE_EFF_UPDATE( plumbum_precombat );
DECLARE_EFF_UPDATE( plumbum_tick );
DECLARE_EFF_UPDATE( plumbum_postcombat );
DECLARE_EFF_UPDATE( discord_init );
DECLARE_EFF_UPDATE( discord_kill );
DECLARE_EFF_UPDATE( discord_tick );
DECLARE_EFF_UPDATE( orb_init );
DECLARE_EFF_UPDATE( orb_kill );
DECLARE_EFF_UPDATE( orb_precombat );
DECLARE_EFF_UPDATE( conceal_init );
DECLARE_EFF_UPDATE( conceal_kill );
DECLARE_EFF_UPDATE( conceal_precombat );
DECLARE_EFF_UPDATE( d_shroud_init );
DECLARE_EFF_UPDATE( d_shroud_kill );
DECLARE_EFF_UPDATE( d_shroud_precommand );
DECLARE_EFF_UPDATE( cspawn_init );
DECLARE_EFF_UPDATE( cspawn_kill );
DECLARE_EFF_UPDATE( cspawn_tick );
DECLARE_EFF_UPDATE( cspawn_previo );
DECLARE_EFF_UPDATE( cspawn_precombat );
DECLARE_EFF_UPDATE( visit_init );
DECLARE_EFF_UPDATE( visit_kill );
DECLARE_EFF_UPDATE( visit_tick );
DECLARE_EFF_UPDATE( visit_viol );
DECLARE_EFF_UPDATE( sav_ward_init );
DECLARE_EFF_UPDATE( sav_ward_kill );
DECLARE_EFF_UPDATE( sav_ward_predamage );
DECLARE_EFF_UPDATE( sav_cata_init );
DECLARE_EFF_UPDATE( sav_cata_kill );
DECLARE_EFF_UPDATE( sav_cata_tick );
DECLARE_EFF_UPDATE( circle_of_protection_init );
DECLARE_EFF_UPDATE( circle_of_protection_kill );
DECLARE_EFF_UPDATE( circle_of_protection_predamage );
DECLARE_EFF_UPDATE( challenge_init );
DECLARE_EFF_UPDATE( challenge_kill );
DECLARE_EFF_UPDATE( challenge_tick );
DECLARE_EFF_UPDATE( yearning_tick );
DECLARE_EFF_UPDATE( ensnare_tick );
DECLARE_EFF_UPDATE( ensnare_kill );
DECLARE_EFF_UPDATE( mob_gen_tick );
DECLARE_EFF_UPDATE( jail_tick );
DECLARE_EFF_UPDATE( jail_kill );
DECLARE_EFF_UPDATE( batter_kill );
DECLARE_EFF_UPDATE( batter_postdamage );
DECLARE_EFF_UPDATE( batter_predamage );
DECLARE_EFF_UPDATE( batter_precombat );
DECLARE_EFF_UPDATE( addiction_tick );
DECLARE_EFF_UPDATE( levitation_init );
DECLARE_EFF_UPDATE( levitation_kill );
DECLARE_EFF_UPDATE( photon_init );
DECLARE_EFF_UPDATE( photon_kill );
DECLARE_EFF_UPDATE( crusade_init );
DECLARE_EFF_UPDATE( crusade_kill );
DECLARE_EFF_UPDATE( crusade_tick );
DECLARE_EFF_UPDATE( crusade_postkill );
DECLARE_EFF_UPDATE( avenger_init );
DECLARE_EFF_UPDATE( avenger_kill );
DECLARE_EFF_UPDATE( avenger_postkill );
DECLARE_EFF_UPDATE( bleed_init );
DECLARE_EFF_UPDATE( bleed_vtick );
DECLARE_EFF_UPDATE( bleed_enter );
DECLARE_EFF_UPDATE( bleed_kill );
DECLARE_EFF_UPDATE( apierce_init );
DECLARE_EFF_UPDATE( apierce_predamage );
DECLARE_EFF_UPDATE( apierce_postviolence );
DECLARE_EFF_UPDATE( chant_none );
DECLARE_EFF_UPDATE( chant_end );
DECLARE_EFF_UPDATE( chant_init );
DECLARE_EFF_UPDATE( chant_kill );
DECLARE_EFF_UPDATE( dvoid_init );
DECLARE_EFF_UPDATE( dvoid_kill );
DECLARE_EFF_UPDATE( dvoid_tick );
DECLARE_EFF_UPDATE( strium_init );
DECLARE_EFF_UPDATE( strium_kill );
DECLARE_EFF_UPDATE( strium_predam );
DECLARE_EFF_UPDATE( ward_init );
DECLARE_EFF_UPDATE( ward_kill );
DECLARE_EFF_UPDATE( ward_tick );
DECLARE_EFF_UPDATE( acraft_init );
DECLARE_EFF_UPDATE( acraft_kill );
DECLARE_EFF_UPDATE( acraft_none );
DECLARE_EFF_UPDATE( acraft_end );
DECLARE_EFF_UPDATE( wcraft_init );
DECLARE_EFF_UPDATE( wcraft_kill );
DECLARE_EFF_UPDATE( wcraft_none );
DECLARE_EFF_UPDATE( wcraft_end );
DECLARE_EFF_UPDATE( hwep_objtick );
DECLARE_EFF_UPDATE( hwep_none );
DECLARE_EFF_UPDATE( approach_tick );
DECLARE_EFF_UPDATE( approach_none );
DECLARE_EFF_UPDATE( approach_kill );
DECLARE_EFF_UPDATE( suffocate_kill );
DECLARE_EFF_UPDATE( suffocate_tick );
DECLARE_EFF_UPDATE( suffocate_vtick );
DECLARE_EFF_UPDATE( contract_kill );
DECLARE_EFF_UPDATE( contract_tick );
DECLARE_EFF_UPDATE( spirit_kill );
DECLARE_EFF_UPDATE( spirit_precombat );
DECLARE_EFF_UPDATE( coup_kill );
DECLARE_EFF_UPDATE( coup_postkill );
DECLARE_EFF_UPDATE( coup_postdeath );
DECLARE_EFF_UPDATE( diplo_kill );
DECLARE_EFF_UPDATE( diplo_none );
DECLARE_EFF_UPDATE( diplo_tick );
DECLARE_EFF_UPDATE( veng_init );
DECLARE_EFF_UPDATE( veng_kill );
DECLARE_EFF_UPDATE( veng_predamage );
DECLARE_EFF_UPDATE( veng_precombat );
DECLARE_EFF_UPDATE( conjure_init );
DECLARE_EFF_UPDATE( conjure_kill );
DECLARE_EFF_UPDATE( conjure_none );
DECLARE_EFF_UPDATE( conjure_end );
DECLARE_EFF_UPDATE( maze_init );
DECLARE_EFF_UPDATE( maze_kill );
DECLARE_EFF_UPDATE( chron_kill );
DECLARE_EFF_UPDATE( chron_tick );
DECLARE_EFF_UPDATE( chron_predamage );
DECLARE_EFF_UPDATE( paradox_kill );
DECLARE_EFF_UPDATE( paradox_tick );
DECLARE_EFF_UPDATE( temp_avenger_tick );
DECLARE_EFF_UPDATE( movedam_enter );
DECLARE_EFF_UPDATE( kinesis_kill );
DECLARE_EFF_UPDATE( kinesis_vtick );
DECLARE_EFF_UPDATE( create_object_init );
DECLARE_EFF_UPDATE( create_object_kill );
DECLARE_EFF_UPDATE( ainfect_init );
DECLARE_EFF_UPDATE( ainfect_kill );
DECLARE_EFF_UPDATE( ainfect_tick );
DECLARE_EFF_UPDATE( dreamwalk_none );
DECLARE_EFF_UPDATE( dreamwalk_kill );
DECLARE_EFF_UPDATE( dreamwalk_tick );
DECLARE_EFF_UPDATE( dreamwalk_vtick );
DECLARE_EFF_UPDATE( svise_kill );
DECLARE_EFF_UPDATE( svise_vtick );
DECLARE_EFF_UPDATE( mboost_init );
DECLARE_EFF_UPDATE( mboost_kill );
DECLARE_EFF_UPDATE( phantasm_vtick );
DECLARE_EFF_UPDATE( dragon_blood_precom );
DECLARE_EFF_UPDATE( regenerate_vtick );
DECLARE_EFF_UPDATE( temp_storm_vupdate );
DECLARE_EFF_UPDATE( temp_storm_tick );
/* Various definitions for MALFORM WEAPON */
#define MAX_MALFORM 9 //Max level of malforemd weapon.
//bitwise flags for each selectable effect.
#define WEP_EFF_NONE 0
#define WEP_EFF_1 (A)
#define WEP_EFF_2 (B)
#define WEP_EFF_3 (C)
#define WEP_EFF_4 (D)
#define WEP_EFF_5 (E)
#define WEP_EFF_6 (F)
#define WEP_EFF_7 (G)
#define WEP_EFF_8 (H)
#define WEP_EFF_9 (I)
#define WEP_EFF_10 (J)
#define WEP_EFF_11 (K)
#define WEP_EFF_12 (L)
#define WEP_EFF_13 (M)
#define WEP_EFF_14 (N)
#define WEP_EFF_15 (O)
#define WEP_EFF_16 (P)
#define WEP_EFF_17 (Q)
#define WEP_EFF_18 (R)
#define WEP_EFF_19 (S)
#define WEP_EFF_20 (T)
#define WEP_EFF_21 (U)
#define WEP_EFF_22 (V)
#define WEP_EFF_23 (W)
#define WEP_EFF_24 (X)
#define WEP_EFF_25 (Y)
#define WEP_EFF_26 (Z)
#define WEP_EFF_27 (aa)
#define WEP_EFF_28 (bb)
#define WEP_EFF_29 (cc)
#define WEP_NAMED (dd)
/*percent frequency for spell effects. double on 2h weapons. */
#define LVL5_SPELL_FRE 9
#define LVL7_SPELL_FRE 8
#define LVL9_SPELL_FRE 7
/* table for the two gods */
#define MAL_DEATH 0
#define MAL_CHAOS 1
#define MAL_KNOW 2
#define MAL_FAITH 3
const struct mal_name_type mal_name_table [] =
{
//DEATH
{"Heart of Decay", "Soul Reaver"},
//CHAOS
{"Bane of Order", "Hand of Chaos"},
//KNOWLEDGE
{"Shard of Wisdom", "Final Verdict"},
//FAITH
{"Hand of God", "Wrath of God"}
};
const struct mal_name_type hol_name_table [] =
{
/* exotic */
{"Holy Relic", "Reliquary of Truth"},
/* sword */
{"Blade of Purity", "Blade of Atonement"},
/* dagger */
{"Dagger of Benevolence","Blood of Martyrs"},
/* Spear */
{"Arm of God", "Crucifix of Heathens"},
/* Staff */
{"Staff of Purgation","Banisher of Heretics"},
/* Mace */
{"Mace of Piety", "Purifier of Impiety"},
/* Axe */
{"Will of the Devout","Bane of Miscreants"},
/* Flail */
{"Purveyor of Remorse","Cleanser of Sacrilege"},
/* Whip */
{"Ray of Light", "Flagellator of the Damned"},
/* Polearm */
{"Harvester of Sorrow","Wrath of God"},
};