

WIZARD SLAYER: This warrior specializes in hunting down wielders of arcane magic. To that end, he conditions his body to resist magic and learns attack techniques that can disrupt arcane spellcasting. This rigorous training regimen requires the Wizard Slayer to forego the use of any magic items besides weapons, armor and healing potions. In addition, he must remain fully devoted to his cause and cannot pursue additional professions. Advantages: - Starts with 10% base magic resistance - Gains an additional +2% bonus to magic resistance for every level of experience - Gains the Disrupt Magic passive ability at first level - Gains the Shatter Magic ability at first level and every 8 levels thereafter Disadvantages: - Cannot use any magic items except for weapons, armor and healing potions - Cannot dual-class Disrupt Magic: Whenever a Wizard Slayer lands a successful hit on an arcane spellcaster the target is afflicted with a cumulative spell failure penalty. During the next 3 rounds, the victim has a 10% base chance to miscast any arcane spell plus 1% for every experience level the Wizard Slayer attains. This passive ability is always in effect. Shatter Magic: A Wizard Slayer can channel his innate magic resistance into his weapons in order to break through the magical defenses of arcane spellcasters. During the round when this ability is activated, each successful hit removes one combat and one specific protection from his target. However, this temporarily nullifies the Wizard Slayer's innate magic resistance making him vulnerable to magic during the next 2 rounds. Until his magic resistance recovers, the Wizard Slayer cannot use any special abilities that rely on it.Component 2: Wizard Slayer High Level Ability revision
Reflect Magic (replaces Resist Magic) An experienced Wizard Slayer eventually learns to channel his innate magic resistance in a manner which allows him to reflect magic back to its source. For 3 rounds after this ability is activated, all spells targeted directly against the Wizard Slayer are redirected back to the original caster. However, this temporarily nullifies the Wizard Slayer's innate magic resistance making him vulnerable to any spells that are not directly targeted at him. This vulnerability takes effect when the ability is activated and persists for 3 rounds after it expires. Until his magic resistance recovers, the Wizard Slayer cannot use any special abilities that rely on it. Arcane Bane (replaces War Cry) An experienced Wizard Slayer can apply a special technique to his attacks making them extremely effective against wielders of arcane magic. For 2 rounds after this ability is activated he gains a +5 bonus to damage against all arcane spellcasters. Furthermore, the Wizard Slayer's attacks become so forceful that his opponents must save vs. death with a -4 penalty or lose one of their memorized spells on each hit.Component 3: Revised Wizard Slayer item restrictions
This component slightly loosens the item restrictions that are normaly imposed on the Wizard Slayer. It can be installed in two ways. The "Minimal changes" option will allow the Wizard Slayer to use items which increase magic resistance, such as the Amulet of 5% Magic Resistance, Kaligun's Amulet of Magic Resistance, the Cloak of Balduran and the Potion of Magic Protection. In addition to everything mentioned above, the "Moderate changes" option allows the Wizard Slayer to also use items which provide protection from magic in some form, such as the Cloak of Mirroring, Belt of Inertial Barrier, Amulet of Spell Warding, Ring of Spell Turning, Potion of Magic Shielding and Potion of Magic Blocking.Disclaimer Although I am a Beamdog/Overhaul developer this mod is completely unrelated to my work there. Please do not mistake this for an officially supported product. I have made this mod in my own free time and Beamdog/Overhaul does not support it.
@1 = ~action sound 1~ [bobi] @2 = ~action sound 2~ [bobj] @3 = ~action sound 3~ [bobk]>These are WeiDU strings. The first line is associating the text between the tildes--in this case "action sound 1"--with the sound file named in the brackets--in this case bobi.wav--to a WeiDU string named @1. If you're making a soundset named Tough, for example, and your first action sound is "Let's do this!" then you modify @1 to read
@1 = ~Let's do this!~ [toughi]One more trick for the tra file is that if you want no text for a sound, e.g. your damage sound is just a grunt, you can use either one of these options:
@24 = ~~ [bobl]or
@24 = ~[grunt]~ [bobl]Text inside brackets is ignored by the engine when the game is being played, so either one of these options would play the grunt without text. Next open up cd_soundsets.tp2 with a text editor. At line 18, edit this line if your soundset is not for English:
COPY ~%MOD_FOLDER%/sounds~ ~lang/en_us/sounds~ // change en_us to the appropriate language folderChange that en_us as appropriate for your language. If the soundset is for English, no change is needed. Around line 23, you'll see a series of lines like
cd_action1 = RESOLVE_STR_REF(@1) // i cd_action2 = RESOLVE_STR_REF(@2) // j cd_action3 = RESOLVE_STR_REF(@3) // kThis bit in the tp2 is telling WeiDU to use strings from the tra file, e.g. the Action Acknowledgement 1 sound should use the @1 that we modified in the previous step. Again, you do not need to provide a full soundset: if you only want to use two action sounds, delete the lines related to action3-7 and the tool will adjust accordingly. Near the very end is this line:
STR_VAR cd_name = "BOB"Replace BOB with the name of your soundset, e.g. Tough. This is the name that will appear in the soundset selection menu and, as noted above, is limited to seven letters. Once this is done, simply run the resulting mod by double-clicking setup-cd_soundsets.
INCLUDE ~%filepath%/SEQUENCER_MENU.TPA~
LAF CREATE_SEQUENCER_MENU
INT_VAR
tip = stringRef
// String Reference from dialog.tlk, this is the Instructions displayed in the Sequencer Screen
name = stringRef
// String Reference from dialog.tlk, this is the name of the ability used to open the Sequencer Menu
desc = stringRef
// String Reference from dialog.tlk, this is the description for the ability used to open the Sequencer Menu
class = value
// 1 for arcane, else divine, doesn't matter if using custom spell lists.
maxlevel = value
// If non-zero, only spells up to this level will be automatically added to the primary spell list.
// If zero, no spells will be added (to add them manually or use custom mutlilists).
// If omitted, default maximum is used (9 for arcane, 7 for divine).
exclude = value
// If any exclusion flags at offset 0x1e of a spell match this value, it will be excluded from the primary spell list.
multilist = value
// If non-zero, function assumes that primary spell list is instead a list of other 2da files each with their own spell lists, all of which will be made available.
// Intended for School/Sphere systems, so that each school/sphere can have it's own list, while kits would just have a list of those lists as appropriate.
// Such sub-lists 'must' have an accompanying spell of the same name.
// If "Sphere1.2da" is a list of spells, "Sphere1.spl" must exist as a spell file, though it's contents are irrelevant.
column = value
// for use with custom spelllists, column of file to use.
alignment = value
// If non-zero, function enforces that spell selection should respect alignment restrictions (currently only if they are provided by an external source - it cannot read them through the UI).
global = value
// If non-zero, function will read known spells in LOCALS and GLOBAL variables. Activating ability will take up to 1 second before menu pops up while variables are checked/set.
// If 1, Subspells to learn spells will need to be setup manually, since this mode is only intended for spells that cannot be "known" in the normal manner.
// If 2, subspells are still created as normal.
// If the spells LOCALS variable is set to 1, it will be considered "known" and count towards the known spell limit.
// If the spells LOCALS variable is set to 2, it will be considered "known" but not count towards the known spell limit.
// The LOCALS/GLOBAL variable for each spell is it's RESREF.
STR_VAR
resref = ~filename~
// 7-character or less filename for Spell Selection ability
icon = ~filename~
// Icon for Spell Selection ability
spelltable = ~filename~
// 2DA table (no extension) for Known Spells, defaults to SPLSRCKN(.2DA) or SPLSHMKN(.2DA) if not specified.
// If used, SPLSRCKN.2DA and/or SPLSHMKN.2DA will be cloned as SPLSRCKN_BACKUP.2DA and SPLSHMKN_BACKUP.2DA for future referencing,
// while the main files are zeroed out so that normal spell selection is disabled.
// The specified 2DA File must exist in game.
spelllist = ~filename~
// 2da file (no extension) with custom spell list, only spells in this file will be added, still subject to maxlevel.
// First column can contain either IDS label or RESREF of a spell
// Other columns contain either '1' (yes) or '0' (no).
// The specified 2DA File must exist in game.
title = ~string~
// String to display in main "Title" slot of Sequencer Screen, added to appropriate "L_%EE_LANGUAGE%.LUA" file.
label = ~string~
// String to display in sub "Title" slot of Sequencer Screen, added to appropriate "L_%EE_LANGUAGE%.LUA" file.
attribute = ~value/string~
// 1, STR, STRENGTH, 2, DEX, DEXTERITY, 3, CON, CONSTITUTION, 4, INT, INTELLIGENCE, 5, WIS, WISDOM, 6, CHA, CHR, CHARISMA
// Is not case sensitive. Omit if not needed.
attrtable = ~filename~
// 2DA table (no extension) with bonus/penalty to Known spells based on specified attribute.
// Format is identical to the priests bonus wisdom spell table, MXSPLWIS.2DA.
// Table can contain postive and negative values. A sufficiently large penalty can be used to prevent selecting spells at the specified attribute score.
// The specified 2DA File must exist in game.
// Omit if not needed.
subspell = ~character~
// Default = ~L~
// Subspells for each learnable spell will be created, appended with this character (SPPR101.SPL -> SPPR101L.SPL)
// Must be a single character, must not already be in use by spells (A,B,C,D,F,P are not permitted)
blacklist = ~array name~
// Array ~%blacklist%~ will be scanned over for IDS spell labels as well as spell resrefs.
// All valid spells listed will be ommitted from the auto-generated spell lists.
// No function when using pre-built spell lists.
END
The following will mimic the default sorcerer/shaman spell options (provided proper tra references):
OUTER_SPRINT title @293 OUTER_SPRINT action @294
LAF CREATE_SEQUENCER_MENU
INT_VAR class = 2 maxlevel = 7 exclude = 0x80000000 tip = RESOLVE_STR_REF (@295) name = RESOLVE_STR_REF (@293) desc = RESOLVE_STR_REF (@293)
STR_VAR resref = ~SPLSHMK~ icon = ~SPPR316B~ title action
END
OUTER_SPRINT title @290 OUTER_SPRINT action @291
LAF CREATE_SEQUENCER_MENU
INT_VAR class = 1 maxlevel = 9 exclude = 0x00004000 tip = RESOLVE_STR_REF (@292) name = RESOLVE_STR_REF (@290) desc = RESOLVE_STR_REF (@290)
STR_VAR resref = ~SPLSRCK~ icon = ~SPPR316B~ title action
END
The following is optional code to flag a spell that is on the list of available choices has been given for "free", not counting against their known limit. Apply (w/ Timing Mode 9) the EFF file to the creature when the spell is gained, to prevent it from counting against their spell limit. "SPELL_RES" should be the resref of this "bonus" spell. "%resref%" should be the same string that was passed to the CREATE_SEQUENCER_MENU function. Note that using this will result in the character having a permanent "Spell Sequencer Active" portrait icon.
APPEND ~BGEE.LUA~ ~mageBookStrings['%resref%'].title = mageBookStrings['%resref%X'].title~
CREATE EFF ~(anything)~ WRITE_LONG 0x10 256 WRITE_LONG 0x2c 100 WRITE_ASCII 0x30 ~SPELL_RES~
WRITE_LONG 0x60 1 WRITE_ASCIIE 0x94 ~%resref%~