diff options
-rw-r--r-- | conf/magic.conf | 338 |
1 files changed, 234 insertions, 104 deletions
diff --git a/conf/magic.conf b/conf/magic.conf index d6262b41..a0eb7b4a 100644 --- a/conf/magic.conf +++ b/conf/magic.conf @@ -34,6 +34,9 @@ CONST SFX_DEFAULT = 10 CONST SFX_SUMMON_START = 21 CONST SFX_SUMMON_FIRE = 22 CONST SFX_TELEPORT = 24 +CONST SFX_RAIN = 25 +CONST SFX_HIT = 25 +CONST SFX_ARROW_HAIL = 27 CONST SFX_BARRIER = 10 CONST SFX_UNBARRIER = 10 CONST SFX_HEAL = 3 @@ -103,8 +106,13 @@ PROCEDURE create_item(good_item, count, bad_item, difficulty) = 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? + # Below, we adjust by special items + IF ((school = LIFE || school = NATURE) && (target = partner(caster))) + THEN (spellpower = spellpower + 200; + IF is_equipped(caster, "WeddingRing") + THEN spellpower = spellpower + 50; + IF is_equipped(target, "WeddingRing") + THEN spellpower = spellpower + 50;) PROCEDURE heal(target, max_heal) = CALL default_effect(); @@ -235,13 +243,13 @@ SPELL magic-blade : "#W01" = => ( COMPONENTS ["SharpKnife"] => EFFECT CALL adjust_spellpower(WAR); CALL default_effect(); - CALL install_melee_spell(10 + spellpower / 15, 900, 30); + CALL install_melee_spell(10 + spellpower / 15, 1200, 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 / 15, 900, 30); + CALL install_melee_spell(10 + spellpower / 15, 1200, 30); CALL gain_xp(1); ATTRIGGER CALL melee_damage(target, 40, 5 + str(caster)); ) @@ -291,64 +299,112 @@ SPELL detect-magic : "#G00" = # Level 1 spells #-------------------------------------------------------------------------------- -SPELL make-arrows : "#mkarrows" = +SPELL make-arrows : "#T10" = LET level = 1 school = TRANSMUTE - IN (MANA 20, CASTTIME 2000, + IN (MANA 8, CASTTIME 5000, REQUIRE skill(caster, MAGIC) > level, REQUIRE skill(caster, school) > level, COMPONENTS ["RawLog"]) => EFFECT CALL adjust_spellpower(school); CALL default_effect(); - create_item(caster, "Arrow", 1 + spellpower / 15); + CALL create_item("Arrow", 1 + spellpower / 40 + (random(max(1, 800 - spellpower)) / 80), "WarpedLog", 250); + CALL gain_xp(1); -SPELL make-shirt : "#mkshirt" = +SPELL make-shirt : "#T11" = LET level = 1 school = TRANSMUTE - IN (MANA 20, CASTTIME 2000, + IN (MANA 25, CASTTIME 5000, REQUIRE skill(caster, MAGIC) > level, REQUIRE skill(caster, school) > level, COMPONENTS [5 * "CottonCloth"]) => EFFECT CALL adjust_spellpower(school); CALL default_effect(); - create_item(caster, "CottonShirt", 1); + CALL create_item("CottonShirt", 1, "CottonCloth", 400); + CALL gain_xp(2); -SPELL make-tanktop : "#mktanktop" = +SPELL make-tanktop : "#T12" = LET level = 1 school = TRANSMUTE - IN (MANA 20, CASTTIME 2000, + IN (MANA 25, CASTTIME 5000, REQUIRE skill(caster, MAGIC) > level, REQUIRE skill(caster, school) > level, COMPONENTS [4 * "CottonCloth"]) => EFFECT CALL adjust_spellpower(school); CALL default_effect(); - create_item(caster, "TanktopWhite", 1); + CALL create_item("WhiteTankTop", 1, "CottonCloth", 500); + CALL gain_xp(2); -SPELL make-short-tanktop : "#mkshorttanktop" = +SPELL make-short-tanktop : "#T13" = LET level = 1 school = TRANSMUTE - IN (MANA 20, CASTTIME 2000, + IN (MANA 25, CASTTIME 5000, REQUIRE skill(caster, MAGIC) > level, REQUIRE skill(caster, school) > level, COMPONENTS [3 * "CottonCloth"]) => EFFECT CALL adjust_spellpower(school); CALL default_effect(); - create_item(caster, "ShortTanktopWhite", 1); + CALL create_item("WhiteShortTankTop", 1, "CottonCloth", 550); + CALL gain_xp(2); + +SPELL make-iron-powder : "#T14" = + LET level = 1 + school = TRANSMUTE + IN (MANA 8, CASTTIME 5000, + REQUIRE skill(caster, MAGIC) > level, + REQUIRE skill(caster, school) > level, + COMPONENTS ["IronOre"]) + => EFFECT CALL adjust_spellpower(school); + CALL default_effect(); + CALL create_item("IronPowder", 1 + spellpower / 140 + (random(max(1, 900 - spellpower)) / 220), "IronOre", 700); + CALL gain_xp(3); + +SPELL lay-on-hands (target : STRING) : "#L10" = + LET level = 1 + school = LIFE + IN (MANA 10, CASTTIME 500, + REQUIRE hp(caster) > max_hp(caster) / 20, + REQUIRE skill(caster, MAGIC) > level, + REQUIRE if_then_else(failed(pc(target)), 1, + (rdistance(location(caster), + location(pc(target))) < 2 + (spellpower / 50)) + && not (running_status_update(pc(target), SC_HALT_REGENERATE)) + )) + => EFFECT CALL adjust_spellpower(school); + IF failed(pc(target)) + THEN target = caster; # quest handling goes here + ELSE target = pc(target); + needed = max_hp(target) - hp(target); + pay_fraction = max(80, 200 - (vit(caster) + (spellpower / 10))); # Pay at least 40% + payment = (needed * pay_fraction) / 200; + available = hp(caster) - (max_hp(caster) / 20); -SPELL lightning-strike : "#kig" = + IF payment < available + THEN power = needed; + ELSE (payment = available; + power = (available * 200) / pay_fraction; + ) + + instaheal(caster, 0 - payment, 0); + CALL quickheal(target, power); + status_change(caster, SC_HALT_REGENERATE, 0, 0, 0, 0, 10000); + IF ((caster <> target) && (payment >= 100)) + THEN CALL gain_xp(min(4, payment / 100)); + +SPELL lightning-strike : "#W10" = LET level = 1 school = WAR - IN (MANA 25, CASTTIME 1000, + IN (MANA 20, CASTTIME 1000, REQUIRE skill(caster, MAGIC) > level, REQUIRE skill(caster, school) > level, (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["IronPowder"])) => EFFECT CALL adjust_spellpower(school); - damage = min(100 + skill(caster, school) * 50, - 50 + spellpower * 2); - damage_bonus = level(caster) + spellpower; - CALL install_attack_spell(1 + spellpower / 60, + damage = spellpower; + damage_bonus = 1 + spellpower / 2; + CALL install_attack_spell(1 + spellpower / 90, 3000, 8, 31); + CALL gain_xp(2); ATTRIGGER CALL attack_check(target); in_rain = 0; area = location(caster); @@ -373,32 +429,41 @@ SPELL lightning-strike : "#kig" = ) ELSE CALL elt_damage (target, damage, damage_bonus, ELT_EARTH, ELT_WIND, 17 + random(3)); -SPELL fire-ball : "#pof" = +LOCAL SPELL arrow-hail : "#W11" = LET level = 1 school = WAR - IN (MANA 30, CASTTIME 1000, + IN (MANA 25, CASTTIME 5000, REQUIRE skill(caster, MAGIC) > level, REQUIRE skill(caster, school) > level, - (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["PileOfAsh"])) - => EFFECT CALL adjust_spellpower(school); - damage = min(50 + skill(caster, school) * 40, - 30 + ((spellpower * 3) / 2)); - damage_bonus = level(caster) + spellpower * 2; - radius = 2 + spellpower / 50; - CALL install_attack_spell(1 + spellpower / 60, - 5000, - 10, 31); - ATTRIGGER CALL attack_check(target); - loc = location(target); - #WAIT 500; - sfx(loc, 16, 0); - FOREACH TARGET target IN rbox(loc, radius) - DO IF line_of_sight(loc, location(target)) - THEN (divisor = (3 + rdistance(loc, location(target))); - CALL elt_damage (target, (damage * 3) / divisor, (damage_bonus * 3) / divisor, ELT_WATER, ELT_FIRE, 15); - ) + REQUIRE is_exterior(location(caster)), + (COMPONENTS [20 * "Arrow"] OR COMPONENTS [20 * "IronArrow"]), + (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["SulphurPowder"])) + => EFFECT CALL adjust_spellpower(school); + CALL default_effect(); + range = 7; + area = rbox(awayfrom(location(caster), dir(caster), 1 + range), range); + damage = 100; + damage_bonus = spellpower / 5; + CALL gain_xp(2); + FOR i = 0 TO spellpower / 8 DO ( + FOR j = 0 TO 3 DO ( + location = random_location(area); + sfx(location, SFX_ARROW_HAIL, 0); + done = 0; + FOREACH TARGET target IN rbox(location, 0) DO ( + injure(caster, target, damage + random(damage_bonus) + random(damage_bonus), 0); + done = 1; + BREAK; + ) + IF location(caster) = location && not(done) + THEN (itemheal(caster, 0 - (damage + random(damage_bonus) + random(damage_bonus)), 0); + sfx(caster, SFX_HIT, 0); + ) + ); + WAIT (250 - min(spellpower / 3, 180)) + random(50) + random(50); + ); -SPELL magic-knuckles (target : PC) : "#iom" = +SPELL magic-knuckles : "#W12" = LET level = 1 school = WAR IN (MANA 20, CASTTIME 500, @@ -407,16 +472,17 @@ SPELL magic-knuckles (target : PC) : "#iom" = (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["Beer"])) => EFFECT CALL adjust_spellpower(WAR); - str = str(target); - CALL install_melee_spell(10 + spellpower / 12, 1000, 0); - ATTRIGGER CALL melee_damage(target, 40 + (str / 2) + spellpower / 20, 5 + str); + str = str(caster); + CALL install_melee_spell(10 + spellpower / 10, 1300, 34); + ATTRIGGER CALL melee_damage(target, 30, 5 + (str * 2)); -SPELL flying-backpack (target : PC) : "#uuy" = +SPELL flying-backpack (target : PC) : "#N10" = LET level = 1 school = NATURE IN (MANA 12, CASTTIME 1000, REQUIRE skill(caster, MAGIC) > level, REQUIRE skill(caster, school) > level, + (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["SilkCocoon"]), REQUIRE rdistance(location(target), location(caster)) < 2 + spellpower / 30) => EFFECT CALL adjust_spellpower(school); CALL default_effect(); @@ -424,14 +490,14 @@ SPELL flying-backpack (target : PC) : "#uuy" = THEN sfx(caster, 2, 0); status_change(target, SC_FLYING_BACKPACK, 0, 0, 0, 0, 5000 + (spellpower * 500)); message (target, "Your backpack is lifted by a mystical force; you no longer feel it pressing on your back."); + CALL gain_xp(1); ATEND message (target, "Your backpack is no longer levitating."); sfx(target, 2, 0); - -SPELL protect (target : PC) : "#ism" = +SPELL protect (target : PC) : "#N11" = LET level = 1 school = NATURE - IN (MANA 18, CASTTIME 1000, + IN (MANA 14, CASTTIME 1500, REQUIRE skill(caster, MAGIC) > level, REQUIRE skill(caster, school) > level, (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["HardSpike"]), @@ -440,27 +506,41 @@ SPELL protect (target : PC) : "#ism" = sfx(target, 11, 0); IF (caster <> target) THEN CALL default_effect(); - status_change(target, SC_PHYS_SHIELD, 5 + max(15, spellpower / 12), 0, 0, 0, 5000 + (spellpower * 500)); + status_change(target, SC_PHYS_SHIELD, 5 + max(15, spellpower / 20), 0, 0, 0, 5000 + (spellpower * 400)); message (target, "You feel more protected."); + CALL gain_xp(2); ATEND message (target, "You feel less protected."); sfx(target, 111, 0); +SPELL happy-curse (target : PC) : "#N12" = + LET level = 1 + school = NATURE + IN (MANA 13, CASTTIME 1000, + REQUIRE skill(caster, MAGIC) > level, + REQUIRE skill(caster, school) > level, + (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["GingerBreadMan"]), + REQUIRE rdistance(location(target), location(caster)) < 1 + spellpower / 100) + => EFFECT CALL adjust_spellpower(school); + CALL default_effect(); + FOR i = 0 TO (spellpower / 10) DO (emote(target, 3); WAIT 500;); + CALL gain_xp(1); -LOCAL SPELL rain : "#flosh" = +LOCAL SPELL rain : "#N13" = LET level = 1 school = NATURE - IN (MANA 20, CASTTIME 3000, + IN (MANA 17, CASTTIME 3000, REQUIRE skill(caster, MAGIC) > level, REQUIRE skill(caster, school) > level, (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["BottleOfWater"])) => EFFECT CALL adjust_spellpower(school); CALL default_effect(); + CALL gain_xp(1); range = min(MAX_RAIN_SPELL_RADIUS, 3 + spellpower / 30); area = rbox(location(caster), range); FOR i = 0 TO spellpower DO ( FOR j = 0 TO spellpower / 100 DO ( location = random_location(area); - sfx(location, 25, 0); + sfx(location, SFX_RAIN, 0); FOREACH TARGET target IN rbox(location, 1) DO IF element(target) = ELT_FIRE THEN injure(caster, target, 5 + random(5 + spellpower / 10), 0); @@ -468,63 +548,54 @@ LOCAL SPELL rain : "#flosh" = WAIT 300 - min(spellpower, 200) + random(100); ); -SPELL happy-curse (target : PC) : "#happy" = +SPELL barrier (target : PC) : "#A10" = LET level = 1 - school = NATURE - IN (MANA 10, CASTTIME 1000, - REQUIRE skill(caster, MAGIC) > level, - REQUIRE skill(caster, school) > level, - (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["WhiteFur"]), - REQUIRE rdistance(location(target), location(caster)) < 1 + spellpower / 100) - => EFFECT CALL adjust_spellpower(school); - CALL default_effect(); - FOR i = 0 TO (spellpower / 10) DO (emote(target, 3); WAIT 500;); - -SPELL barrier (target : PC) : "#iso" = - LET level = 1 - school = NATURE - IN (MANA 18, CASTTIME 1000, + school = ASTRAL + IN (MANA 16, CASTTIME 1000, REQUIRE skill(caster, MAGIC) > level, REQUIRE skill(caster, school) > level, - (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["HardSpike"]), + (REQUIRE skill(caster, school) > 3 OR COMPONENTS ["SmallMushroom"]), REQUIRE rdistance(location(target), location(caster)) < 2 + spellpower / 30) => EFFECT CALL adjust_spellpower(school); sfx(target, SFX_BARRIER, 0); IF (caster <> target) THEN CALL default_effect(); - status_change(target, SC_MBARRIER, 30 + max(30, spellpower / 8), 0, 0, 0, 2000 + (spellpower * 200)); + status_change(target, SC_MBARRIER, 20 + max(30, spellpower / 8), 0, 0, 0, 2000 + (spellpower * 200)); message (target, "You are surrounded by a magical barrier."); + CALL gain_xp(3); ATEND message (target, "Your magical barrier disspiates."); sfx(target, SFX_UNBARRIER, 0); -LOCAL SPELL summon-scorps : "#kbms" = +LOCAL SPELL summon-scorps : "#A11" = LET level = 1 school = ASTRAL - IN (MANA 25, CASTTIME 3000, + IN (MANA 33, CASTTIME 3000, REQUIRE skill(caster, MAGIC) > level, REQUIRE skill(caster, school) > level, COMPONENTS ["ScorpionStinger"]) => EFFECT CALL adjust_spellpower(school); CALL default_effect(); - CALL summon_spell(1003, 1 + spellpower / 30, 5000 - (spellpower * 9), spellpower * 400, 2); + CALL gain_xp(1); + CALL summon_spell(1003, 1 + spellpower / 140, 5000 - (spellpower * 9), spellpower * 400, 2); -LOCAL SPELL summon-red-scorps : "#kbmq" = +LOCAL SPELL summon-red-scorps : "#A12" = LET level = 1 school = ASTRAL - IN (MANA 30, CASTTIME 3000, + IN (MANA 39, CASTTIME 3000, REQUIRE skill(caster, MAGIC) > level, REQUIRE skill(caster, school) > level, COMPONENTS ["RedScorpionStinger"]) => EFFECT CALL adjust_spellpower(school); CALL default_effect(); - CALL summon_spell(1004, 1 + spellpower / 40, 5000 - (spellpower * 8), spellpower * 350, 3); + CALL gain_xp(1); + CALL summon_spell(1004, 1 + spellpower / 230 + spellpower / 430, 5000 - (spellpower * 8), spellpower * 350, 3); -SPELL detect-players : "#ewm" = +SPELL detect-players : "#G10" = LET level = 1 school = MAGIC - IN (MANA 10, CASTTIME 300, + IN (MANA 7, CASTTIME 300, REQUIRE skill(caster, MAGIC) > level, REQUIRE skill(caster, school) > level) => EFFECT CALL adjust_spellpower(school); @@ -542,42 +613,99 @@ SPELL detect-players : "#ewm" = THEN message(caster, "You sense no-one else nearby."); ELSE message(caster, "You sense the following: " + message); +SPELL reveal : "#G11" = + LET level = 1 + school = MAGIC + IN (MANA 18, CASTTIME 3000, + REQUIRE skill(caster, MAGIC) > level, + REQUIRE skill(caster, school) > level) + => EFFECT CALL adjust_spellpower(school); + CALL default_effect(); + FOREACH PC target IN rbox(location(caster), 1 + spellpower / 100) + DO IF has_shroud(target) && level(caster) * 2 > level(target) + THEN (unshroud(target); + sfx(target, SFX_DEFAULT, 500);) + - -SPELL lay-on-hands (target : STRING) : "#loh" = +SPELL enchant-lifestone : "#G12" = LET level = 1 - school = LIFE - IN (MANA 8, CASTTIME 400, - REQUIRE hp(caster) > max_hp(caster) / 20, + school = MAGIC + IN (MANA 15, CASTTIME 4000, REQUIRE skill(caster, MAGIC) > level, - REQUIRE if_then_else(failed(pc(target)), 1, - (rdistance(location(caster), - location(pc(target))) < 2 + (spellpower / 50)) - && not (running_status_update(pc(target), SC_HALT_REGENERATE)) - )) + REQUIRE skill(caster, school) > level, + (COMPONENTS ["BugLeg"] OR COMPONENTS["MaggotSlime"])) => EFFECT CALL adjust_spellpower(school); - IF failed(pc(target)) - THEN target = caster; # quest handling goes here - ELSE target = pc(target); - needed = max_hp(target) - hp(target); - pay_fraction = max(80, 200 - (vit(caster) + (spellpower / 10))); # Pay at least 40% - payment = (needed * pay_fraction) / 200; - available = hp(caster) - (max_hp(caster) / 20); + CALL default_effect(); + create_item(caster, "LifeStone", 1); + CALL gain_xp(1); - IF payment < available - THEN power = needed; - ELSE (payment = available; - power = (available * 200) / pay_fraction; +SPELL sense-spouse : "#G13" = + LET level = 1 + school = MAGIC + IN (MANA 7, CASTTIME 400, + REQUIRE skill(caster, MAGIC) > level, + REQUIRE skill(caster, school) > level, + REQUIRE is_married(caster), + REQUIRE is_equipped(caster, "WeddingRing")) + => EFFECT CALL adjust_spellpower(school); + CALL default_effect(); + IF (failed(partner(caster)) || not(is_equipped(partner(caster), "WeddingRing"))) + THEN (message(caster, "You cannot sense your partner."); + ABORT;) + partner = partner(caster); + name = name_of(partner); + IF (is_dead(partner) || (map_nr(location(partner)) <> map_nr(location(caster)))) + THEN (message(caster, "You cannot sense " + name + " nearby."); + ABORT;) + IF (map_level(location(partner)) > 2 && map_level(location(caster)) < map_level(location(partner))) + THEN (message(caster, "You sense " + name + " somewhere below."); + ABORT;) + IF (map_level(location(caster)) > 2 && map_level(location(partner)) < map_level(location(caster))) + THEN (message(caster, "You sense " + name + " somewhere above."); + ABORT;) + IF (map_level(location(caster)) <> map_level(location(partner))) + THEN message(caster, "You sense " + name + " somewhere in the vincinity."); + ELSE (distance = rdistance(location(caster), location(partner)); + dir = dir_towards(location(caster), location(partner), 1); + IF (distance < 3) + THEN message(caster, "You sense " + name + " right next to you."); + ELSE IF (distance < 30) + THEN message(caster, "You sense " + name + " close by, towards the " + dir + "."); + ELSE IF (distance < 200) + THEN message(caster, "You sense " + name + " nearby, towards the " + dir + "."); + ELSE message(caster, "You sense " + name + " in the " + dir + "."); ) - - instaheal(caster, 0 - payment, 0); - CALL quickheal(target, power); - status_change(caster, SC_HALT_REGENERATE, 0, 0, 0, 0, 10000); + #-------------------------------------------------------------------------------- # Level 2 spells #-------------------------------------------------------------------------------- +SPELL fire-ball : "#pof" = + LET level = 2 + school = WAR + IN (MANA 30, CASTTIME 1000, + REQUIRE skill(caster, MAGIC) > level, + REQUIRE skill(caster, school) > level, + COMPONENTS ["PileOfAsh"]) + => EFFECT CALL adjust_spellpower(school); + damage = min(50 + skill(caster, school) * 40, + 30 + ((spellpower * 3) / 2)); + damage_bonus = level(caster) + spellpower * 2; + radius = 2 + spellpower / 50; + CALL install_attack_spell(1 + spellpower / 60, + 5000, + 10, 31); + ATTRIGGER CALL attack_check(target); + loc = location(target); + #WAIT 500; + sfx(loc, 16, 0); + FOREACH TARGET target IN rbox(loc, radius) + DO IF line_of_sight(loc, location(target)) + THEN (divisor = (3 + rdistance(loc, location(target))); + CALL elt_damage (target, (damage * 3) / divisor, (damage_bonus * 3) / divisor, ELT_WATER, ELT_FIRE, 15); + ) + SPELL summon-partner : "#aid" = LET level = 2 school = ASTRAL @@ -595,6 +723,8 @@ SPELL summon-partner : "#aid" = WAIT (max (5000, 30000 - (spellpower * 60))); IF (failed (partner (caster))) THEN message (caster, "Your partner has abandoned you."); + ELSE IF (is_dead (partner (caster))) + THEN message (caster, "Something seems to have happened to " + (name_of(partner(caster))) + "."); ELSE (sfx(location(partner(caster)), SFX_TELEPORT, 0); dest = awayfrom(location(caster), random_dir(1), 1); warp(partner(caster), dest); |