summaryrefslogblamecommitdiff
path: root/world/map/conf/magic-procedures.sex
blob: 6157765dcabded8de45275ed137898dbc2e5080e (plain) (tree)

























































































































































































































































































                                                                                                                  
                                            


                                    
                                                                                                         

                                                                                                         


                                                            
                
                     




                                                           
                                                                                                                 







                                                                                                                   
                                                                                                             

                                                                                                              
                      
 
                                                                          




                                     


                                                    
                                                                                                                                     

                                                                                                                               



                     
                                     
























                                                                                                        




















                                                               
"Default sfx on caster"
(PROCEDURE default_effect ()
    (sfx caster
        (+
            (- school MAGIC)
            2)
        0))

(PROCEDURE sfx_generic (target)
    (sfx target SFX_DEFAULT 0))

(PROCEDURE sfx_lightning (target)
    (sfx target SFX_LIGHTNING 0))

(PROCEDURE set_var (name mask shift value)
    (set_script_variable caster name
        (|
            (&
                (script_int caster name)
                (neg
                    (<< mask shift)))
            (<<
                (& value mask)
                shift))))

"value is How many HP we healed"
"gain is how many life magic experience points we can potentially gain"
"heal_xp_value_divisor is 1 for instaheal, 2 for slow heal"
"base_exp_factor is the factor for how many base experience points (max) the player should be allowed to gain"
(PROCEDURE gain_heal_xp (value gain heal_xp_value_divisor base_exp_factor)
    (SET last_heal_xp
        (&
            (>>
                (script_int caster SCRIPT_XP)
                SCRIPT_HEALSPELL_SHIFT)
            SCRIPT_HEALSPELL_MASK))
    (IF (&&
            (!= target caster)
            (>
                (/ value heal_xp_value_divisor)
                (+
                    (+
                        (+ 10 last_heal_xp)
                        (random
                            (+ last_heal_xp 1)))
                    (random
                        (+ last_heal_xp 1)))))
        (BLOCK
            (SET heal_xp
                (+ last_heal_xp gain))
            (IF (> heal_xp SCRIPT_HEALSPELL_MASK)
                (SET heal_xp SCRIPT_HEALSPELL_MASK))
            (CALL set_var SCRIPT_XP SCRIPT_HEALSPELL_MASK SCRIPT_HEALSPELL_SHIFT heal_xp)))
    (IF (!= target caster)
        (gain_experience caster
            (* base_exp_factor
                (extract_healer_experience target value))
            0
            1)))

(PROCEDURE gain_xp (gain index)
    "Level 4 and 5 magic users don't gain anything from spell levels 0 resp. 0+1"
    (IF (>
            (+ level 3)
            (skill caster MAGIC))
        (BLOCK
            (SET last_index
                (&
                    (>>
                        (script_int caster SCRIPT_XP)
                        SCRIPT_LASTSPELL_SHIFT)
                    SCRIPT_LASTSPELL_MASK))
            (SET last_xp
                (&
                    (>>
                        (script_int caster SCRIPT_XP)
                        SCRIPT_XP_SHIFT)
                    SCRIPT_XP_MASK))
            (IF (!= index last_index)
                (BLOCK "Some variation observed"
                    (SET xp
                        (+ last_xp gain))
                    (IF (> xp SCRIPT_XP_MASK)
                        (SET 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
                        (message caster
                            (+ "Spell xp = " xp))))
                (IF DEBUG
                    (message caster
                        (+ "Re-cast same spell, xp remain at " last_xp)))))))

(PROCEDURE create_item (good_item count bad_item difficulty)
    (SET success 1)
    (SET score
        (+ experience
            (random
                (min spellpower
                    (+
                        (/ experience 3)
                        1)))))
    (IF (>= score difficulty)
        (create_item caster good_item count)
        (BLOCK
            (SET success 0)
            (SET score
                (+
                    (+ score
                        (random
                            (luk caster)))
                    (random
                        (luk caster))))
            (IF (< score
                    (/ difficulty 3))
                (BLOCK
                    (message caster "Your spell backfires!")
                    (IF (<
                            (random 110)
                            (luk caster))
                        (itemheal caster
                            (- 0
                                (*
                                    (*
                                        (+ level 1)
                                        (+ level 2))
                                    (+ 3
                                        (random 28))))
                            0)
                        (itemheal caster
                            (- 0
                                (+ level 1))
                            0)))
                (IF (< score
                        (/
                            (* difficulty 2)
                            3))
                    (BLOCK
                        (IF (==
                                (random 5)
                                0)
                            (BLOCK
                                (message caster "Your spell solidifies into the shape of a mysterious object!")
                                (create_item caster "Iten" 1))
                            (message caster "Your spell escapes!")))
                    (BLOCK
                        (message caster "Your spell takes on a mind of its own!")
                        (IF (==
                                (random 3)
                                0)
                            (create_item caster bad_item 1))))))))

"Increase spellpower by school and general magic skill"
(PROCEDURE adjust_spellpower (school)
    (SET experience
        (&
            (>>
                (script_int caster SCRIPT_XP)
                SCRIPT_XP_SHIFT)
            SCRIPT_XP_MASK))
    (SET spellpower
        (+ spellpower
            (*
                (+
                    (skill caster MAGIC)
                    (skill caster school))
                10)))
    "Below, we adjust by special items"
    (IF (&&
            (not
                (failed target))
            (||
                (== school LIFE)
                (== school NATURE)))
        (IF target
            (IF (==
                    (pc target)
                    (partner caster))
                (BLOCK
                    (SET spellpower
                        (+ spellpower 200))
                    (IF (is_equipped caster "WeddingRing")
                        (SET spellpower
                            (+ spellpower 50)))
                    (IF (is_equipped
                            (pc target)
                            "WeddingRing")
                        (SET spellpower
                            (+ spellpower 50))))))))

(PROCEDURE heal (target max_heal)
    (CALL default_effect)
    (IF (!= caster target)
        (sfx target SFX_HEAL 0))
    (SET power
        (+ spellpower
            (vit caster)))
    (SET power
        (min max_heal
            (/
                (* max_heal power)
                250)))
    (itemheal target power 0))

"Goes through instaheal instead of itemheal"
(PROCEDURE quickheal (target power)
    (CALL default_effect)
    (IF (!= caster target)
        (sfx target SFX_HEAL 0))
    (instaheal target power 0))

"Can attack the target? Imports attack_range from dynamic environment"
(PROCEDURE attack_check (target)
    (IF (not
            (line_of_sight
                (location caster)
                (location target)))
        (ABORT))
    (IF (not
            (<=
                (rdistance
                    (location caster)
                    (location target))
                attack_range))
        (ABORT)))

"Cause elemental damage.  bonus_elt grants an attack bonus, malus_elt reduces the attack. `effect' is the sfx ID."
(PROCEDURE elt_damage (target damage dmgplus bonus_elt malus_elt effect)
    (SET d
        (+ damage
            (random dmgplus)))
    (IF (==
            (element target)
            malus_elt)
        (SET d
            (/ d 3)))
    (IF (==
            (element target)
            bonus_elt)
        (SET d
            (/
                (* d
                    (+ 4
                        (element_level target)))
                4)))
    (sfx target effect 0)
    (injure caster target d 0))

(PROCEDURE melee_damage (target damage dmgplus)
    (CALL attack_check target)
    (SET d
        (+ damage
            (random dmgplus)))
    (SET evade
        (+
            (level target)
            (mdef target)))
    (IF (<
            (- spellpower
                (random 100))
            evade)
        (SET d 0))
    (injure caster target d 0))

(PROCEDURE install_attack_spell (charges base_delay range attack_animation)
    (CALL default_effect)
    (SET attack_range range)
    (override_attack caster charges
        (/
            (*
                (- 200
                    (agi caster))
                base_delay)
            200)
        range
        ATTACK_ICON_GENERIC
        attack_animation
        0))

(PROCEDURE install_melee_spell (charges base_delay attack_animation)
    (CALL install_attack_spell charges base_delay 1 attack_animation))

(PROCEDURE fightclub_check (onSelf onTarget)
    (IF (&&
            (is_in (location caster)
                (@+
                    (@ "009-7" (script_int caster "$@fightclub_x1") (script_int caster "$@fightclub_y1"))
                    (+ (- (script_int caster "$@fightclub_x2") (script_int caster "$@fightclub_x1")) 1)
                    (+ (- (script_int caster "$@fightclub_y2") (script_int caster "$@fightclub_y1")) 1)))
            (||
                (== (script_int caster "$@Duel_NoMagic") 1)
                (!= (script_int caster "@Duel_Fighter") 1)))
        (ABORT))
    (IF (== onSelf 1)
        (IF (&&
                (== (substr (location caster) 2 5) "009-7")
                (not
                    (is_in (location caster)
                        (@+
                            (@ "009-7" (script_int caster "$@fightclub_x1") (script_int caster "$@fightclub_y1"))
                            (+ (- (script_int caster "$@fightclub_x2") (script_int caster "$@fightclub_x1")) 1)
                            (+ (- (script_int caster "$@fightclub_y2") (script_int caster "$@fightclub_y1")) 1)))))
            (ABORT)))
    (IF (== onTarget 1)
        (IF (&&
                (!= (pc target) caster)
                (is_in (location (pc target))
                    (@+
                        (@ "009-7" (script_int caster "$@fightclub_x1") (script_int caster "$@fightclub_y1"))
                        (+ (- (script_int caster "$@fightclub_x2") (script_int caster "$@fightclub_x1")) 1)
                        (+ (- (script_int caster "$@fightclub_y2") (script_int caster "$@fightclub_y1")) 1))))
            (ABORT))))

(PROCEDURE summon_spell (mob_id count delay lifetime control_level school)
    (CALL default_effect)
    (sfx location SFX_SUMMON_START 0)
    (WAIT delay)
    (sfx location SFX_SUMMON_FIRE 0)
    (spawn
        (rbox location (if_then_else
                            (is_in (location caster)
                                (@+
                                    (@ "009-7" (- (script_int caster "$@fightclub_x1") 2) (- (script_int caster "$@fightclub_y1") 2))
                                    (+ (- (script_int caster "$@fightclub_x2") (script_int caster "$@fightclub_x1")) 5)
                                    (+ (- (script_int caster "$@fightclub_y2") (script_int caster "$@fightclub_y1")) 5))) 1 2))
        caster
        mob_id
        (if_then_else
            (>=
                (skill caster school)
                control_level)
            2
            1)
        count
        lifetime)) "pets when level is high enough"

(PROCEDURE abort_on_area_shield (pos)
    (IF (&&
            (==
                (is_exterior pos)
                1)
            (||
                (||
                    (==
                        (map_nr pos)
                        1)
                    (==
                        (map_nr pos)
                        9))
                (==
                    (map_nr pos)
                    20)))
        (BLOCK "1 is Tulimshar, 9 is Hurnscald and 20 is Nivalis"
            (message caster "A powerful magic drains your spell just as it is beginning to take shape!")
            (ABORT))))

(PROCEDURE script_split_str (d str v m)
    (FOR a 0 m
        (BLOCK
            (IF (< (strlen str) 1) (BREAK))
            (SET arglen (strlen str))
            (SET argoffset
                (if_then_else
                    (contains_string str d)
                    (strstr str d)
                    arglen))
            (SET arg
                (if_then_else (== arglen argoffset)
                    str
                    (substr str 0 argoffset)))
            (set_script_str caster (+ (+ "@" v) (+ a "$")) arg)
            (SET str
                (if_then_else
                    (> arglen (- argoffset 1))
                    (substr str (+ argoffset 1) arglen)
                    "")))))