diff options
Diffstat (limited to 'conf')
-rw-r--r-- | conf/magic.conf | 152 |
1 files changed, 121 insertions, 31 deletions
diff --git a/conf/magic.conf b/conf/magic.conf index 390df589..5ae0bba1 100644 --- a/conf/magic.conf +++ b/conf/magic.conf @@ -40,6 +40,13 @@ CONST SFX_HEAL = 3 CONST MAX_RAIN_SPELL_RADIUS = 20 +CONST SCRIPT_XP = "MAGIC_EXPERIENCE" +CONST SCRIPT_XP_MASK = 0xffff +CONST SCRIPT_XP_SHIFT = 0 +CONST SCRIPT_LASTSPELL_MASK = 0xff +CONST SCRIPT_LASTSPELL_SHIFT = 16 +CONST DEBUG = 1 + # Default sfx on caster PROCEDURE default_effect() = sfx(caster, school - MAGIC + 2, 0); @@ -47,8 +54,54 @@ PROCEDURE default_effect() = PROCEDURE sfx_generic(target) = sfx(target, SFX_DEFAULT, 0); +PROCEDURE set_var(name, mask, shift, value) = + set_script_variable(caster, name, script_int(caster, name) & (neg (mask << shift)) | ((value & mask) << shift)); + +PROCEDURE gain_xp(gain) = + IF (level + 3 > skill(caster, MAGIC)) # Level 4 and 5 magic users don't gain anything from spell levels 0 resp. 0+1 + THEN ( + index = spell_index(self_spell); + last_index = (script_int(caster, SCRIPT_XP) >> SCRIPT_LASTSPELL_SHIFT) & SCRIPT_LASTSPELL_MASK; + last_xp = (script_int(caster, SCRIPT_XP) >> SCRIPT_XP_SHIFT) & SCRIPT_XP_MASK; + IF (index != last_index) + THEN ( # Some variation observed + xp = last_xp + gain; + IF (xp > SCRIPT_XP_MASK) + THEN xp = SCRIPT_XP_MASK; + CALL set_var(SCRIPT_XP, SCRIPT_XP_MASK, SCRIPT_XP_SHIFT, xp); + CALL set_var(SCRIPT_XP, SCRIPT_LASTSPELL_MASK, SCRIPT_LASTSPELL_SHIFT, index); + IF DEBUG THEN message(caster, "Spell xp = " + xp); + ) ELSE IF DEBUG THEN message(caster, "Re-cast same spell, xp remain at " + last_xp); + ) + +PROCEDURE create_item(good_item, count, bad_item, difficulty) = + score = experience + random(min(spellpower, (experience / 3) + 1)); + IF (score >= difficulty) + THEN create_item(caster, good_item, count); + ELSE ( + score = score + random(luk(caster)) + random(luk(caster)); + IF (score < difficulty / 3) + THEN ( + message(caster, "Your spell backfires!"); + IF (random(110) < (luk(caster))) + THEN itemheal(caster, 0 - ((level + 1) * (level + 2) * (3 + random(28))), 0); + ELSE itemheal(caster, 0 - (level + 1), 0); + ) ELSE IF (score < (difficulty * 2) / 3) + THEN ( + IF random(5) = 0 + THEN (message(caster, "Your spell solidifies into the shape of a mysterious object!"); + create_item(caster, "Iten", 1);) + ELSE message(caster, "Your spell escapes!"); + ) ELSE ( + message(caster, "Your spell takes on a mind of its own!"); + IF random(3) = 0 + THEN create_item(caster, bad_item, 1); + ) + ) + # Increase spellpower by school and general magic skill PROCEDURE adjust_spellpower(school) = + experience = (script_int(caster, SCRIPT_XP) >> SCRIPT_XP_SHIFT) & SCRIPT_XP_MASK; spellpower = spellpower + (skill(caster, MAGIC) + skill(caster, school)) * 10; IF ((school = LIFE) && (target = partner(caster))) THEN spellpower = spellpower + 200; # Do something for wedding rings, too? @@ -115,85 +168,123 @@ PROCEDURE summon_spell(mob_id, count, delay, lifetime, control_level) = # Level 0 spells #-------------------------------------------------------------------------------- -#SPELL reset : "#reset" = -# EFFECT { skill 340, 0; -# skill 341, 0; -# skill 342, 0; -# skill 343, 0; -# skill 344, 0; -# skill 345, 0; -# } +SPELL transmute-wood-to-mouboo : "#T00" = + LET level = 0 + school = TRANSMUTE + IN (MANA 5, CASTTIME 4000, + REQUIRE skill(caster, MAGIC) > level, + REQUIRE skill(caster, school) > level, + COMPONENTS ["RawLog"]) + => EFFECT CALL adjust_spellpower(school); + CALL default_effect(); + CALL create_item("MoubooFigurine", 1, "WarpedLog", 40); + CALL gain_xp(1); -SPELL lesser-heal (target : STRING) : "#imx" = +SPELL make-sulphur : "#T01" = + LET level = 0 + school = TRANSMUTE + IN (MANA 4, CASTTIME 4000, + REQUIRE skill(caster, MAGIC) > level, + REQUIRE skill(caster, school) > level, + COMPONENTS ["PileOfAsh"]) + => EFFECT CALL adjust_spellpower(school); + CALL default_effect(); + CALL create_item("SulphurPowder", 1, "PileOfAsh", 50); + CALL gain_xp(1); + +SPELL lesser-heal (target : STRING) : "#L00" = LET level = 0 school = LIFE - IN (MANA 5, CASTTIME 400, + IN (MANA 6, CASTTIME 500, REQUIRE skill(caster, MAGIC) > level, REQUIRE if_then_else(failed(pc(target)), 1, - rdistance(location(caster), location(pc(target))) < 2 + (spellpower / 50)), - (COMPONENTS ["MaggotSlime"] OR COMPONENTS ["BugLeg"])) + rdistance(location(caster), location(pc(target))) < 2 + (spellpower / 100)), + (COMPONENTS ["LifeStone"])) => EFFECT CALL adjust_spellpower(school); + CALL default_effect(); IF failed(pc(target)) THEN target = caster; # quest handling goes here ELSE target = pc(target); CALL heal(target, 200); + CALL gain_xp(1); -SPELL flare-dart : "#fla" = +SPELL flare-dart : "#W00" = LET level = 0 school = WAR - IN (MANA 15, CASTTIME 500, + IN (MANA 10, CASTTIME 500, REQUIRE skill(caster, MAGIC) > level, (REQUIRE skill(caster, school) > 2 OR COMPONENTS ["SulphurPowder"])) => EFFECT CALL adjust_spellpower(school); CALL default_effect(); - damage = min(40 + skill(caster, school) * 20, - 10 + spellpower); + damage = 5 * sqrt(spellpower); damage_bonus = 5 + level(caster) / 3; - CALL install_attack_spell(3 + spellpower / 30, + CALL install_attack_spell(3 + spellpower / 50, 1200, 4, 31); - + CALL gain_xp(1); ATTRIGGER CALL attack_check(target); CALL elt_damage (target, damage, damage_bonus, ELT_WATER, ELT_FIRE, 15); -SPELL magic-blade : "#mbl" = + +SPELL magic-blade : "#W01" = LET level = 0 school = WAR - IN (MANA 12, CASTTIME 500, + IN (MANA 9, CASTTIME 500, REQUIRE skill(caster, MAGIC) > level) => ( COMPONENTS ["SharpKnife"] => EFFECT CALL adjust_spellpower(WAR); CALL default_effect(); - CALL install_melee_spell(10 + spellpower / 10, 900, 30); - ATTRIGGER CALL melee_damage(target, 60 + spellpower / 20, 5 + str(caster)); + CALL install_melee_spell(10 + spellpower / 15, 900, 30); + CALL gain_xp(1); + ATTRIGGER CALL melee_damage(target, 60, 5 + str(caster)); | COMPONENTS ["Knife"] => EFFECT CALL adjust_spellpower(WAR); CALL default_effect(); - CALL install_melee_spell(10 + spellpower / 10, 900, 30); - ATTRIGGER CALL melee_damage(target, 40 + spellpower / 20, 5 + str(caster)); + CALL install_melee_spell(10 + spellpower / 15, 900, 30); + CALL gain_xp(1); + ATTRIGGER CALL melee_damage(target, 40, 5 + str(caster)); ) -SPELL aggravate : "#qaw" = +SPELL aggravate : "#N00" = LET level = 0 school = NATURE - IN (MANA 5, CASTTIME 300, + IN (MANA 3, CASTTIME 1000, REQUIRE skill(caster, MAGIC) > level) - => EFFECT CALL adjust_spellpower(school); + => EFFECT CALL adjust_spellpower(school); CALL default_effect(); FOREACH MOB target IN rbox(location(caster), 1 + spellpower / 20) DO (CALL sfx_generic(target); aggravate(target, 0, caster);) -LOCAL SPELL summon-maggots : "#kbm" = +LOCAL SPELL summon-maggots : "#A00" = LET level = 0 school = ASTRAL - IN (MANA 20, CASTTIME 3000, + IN (MANA 21, CASTTIME 6000, REQUIRE skill(caster, MAGIC) > level, COMPONENTS ["MaggotSlime"]) => EFFECT CALL adjust_spellpower(school); - CALL summon_spell(1002, 3 + spellpower / 15, 5000 - (spellpower * 10), spellpower * 500, 1); + CALL gain_xp(1); + CALL summon_spell(1002, + 1 + ((sqrt(spellpower) + (spellpower / 15)) / 5), + 5000 - (spellpower * 5), + 10000 + (spellpower * 50), 1); + +SPELL detect-magic : "#G00" = + LET level = 0 + school = MAGIC + IN (MANA 3, CASTTIME 6000, + REQUIRE skill(caster, MAGIC) > level) + => EFFECT CALL adjust_spellpower(school); + CALL default_effect(); + range = 1 + spellpower / 50; + FOREACH NPC n IN rbox(location(caster), range) + DO IF strstr(name_of(n), "#MAGIC") || strstr(name_of(n), "#_M") + THEN sfx(n, SFX_DEFAULT, 0); + FOREACH SPELL s IN rbox(location(caster), range) + DO IF (s <> self_invocation) + THEN sfx(s, SFX_DEFAULT, 0); #-------------------------------------------------------------------------------- @@ -642,4 +733,3 @@ LOCAL SPELL mouboo-smell : "#s" = FOREACH PC p IN rbox(location(caster), 30) DO message(p, "You notice a strange smell all around you."); - |