Exemplo n.º 1
0
    public override bool OnFirstHeartbeat(GameObject attachee, GameObject triggerer)
    {
        // Respawn
        if ((!GetGlobalFlag(912)))
        {
            StartTimer(604800000, () => respawn(attachee)); // 604800000ms is 1 week
            SetGlobalFlag(912, true);
        }

        // The 'evac' routine
        if (ScriptDaemon.get_f("boatmens_tavern_evac_on") && SelectedPartyLeader.GetMap() == 5052)
        {
            StartTimer(300, () => ScriptDaemon.set_f("boatmens_tavern_evac_on", false));
            if (attachee.GetNameId() == 14133 && !ScriptDaemon.get_f("lodriss_killed_outside")) // For Lodriss
            {
                attachee.ClearObjectFlag(ObjectFlag.OFF);
            }
            else
            {
                // else : # For the others
                attachee.ClearObjectFlag(ObjectFlag.OFF);
            }
        }

        // game.new_sid = 0
        if (attachee.GetNameId() == 14152 && SelectedPartyLeader.GetMap() == 5051) // Tolub, outside
        {
            attachee.ClearObjectFlag(ObjectFlag.OFF);
        }

        return(RunDefault);
    }
Exemplo n.º 2
0
    public override void OnSpellEffect(SpellPacketBody spell)
    {
        Logger.Info("Obscuring Mist OnSpellEffect");
        spell.duration = 100 * spell.casterLevel;
        locXY locc_;

        if (spell.caster.GetNameId() == 8002 && SelectedPartyLeader.GetMap() == 5005) // Lareth in Moathouse
        {
            locc_ = new locXY(483, 534);
        }
        else
        {
            locc_ = spell.aoeCenter.location;
        }

        // spawn one spell_object object
        var spell_obj = GameSystems.MapObject.CreateObject(OBJECT_SPELL_GENERIC, locc_);
        // add to d20initiative
        var caster_init_value = spell.caster.GetInitiative();

        spell_obj.InitD20Status();
        spell_obj.SetInitiative(caster_init_value);
        // put sp-Obscuring Mist condition on obj
        var spell_obj_partsys_id = AttachParticles("sp-Obscuring Mist", spell_obj);

        spell_obj.AddCondition("sp-Obscuring Mist", spell.spellId, spell.duration, 0, spell_obj_partsys_id);
        // Added by Sitra Achara	#
        spell_obj.SetInt(obj_f.secretdoor_dc, 333 + (1 << 15));
        // Mark it as an "obscuring mist" object.
        // 1<<15 - marks it as "active"
        // bits 16 and onward - random ID number

        Co8PersistentData.AddToSpellActiveList(OBSCURING_MIST_KEY, spell.spellId, spell_obj);
    }
Exemplo n.º 3
0
    public override void OnSpellEffect(SpellPacketBody spell)
    {
        Logger.Info("Entangle OnSpellEffect");
        spell.duration = 10 * spell.casterLevel;
        var outdoor_map_list = new[] { 5001, 5002, 5009, 5042, 5043, 5051, 5062, 5068, 5069, 5070, 5071, 5072, 5073, 5074, 5075, 5076, 5077, 5078, 5091, 5093, 5094, 5095, 5096, 5097, 5099, 5100, 5108, 5110, 5111, 5112, 5113, 5119, 5120, 5121, 5132, 5142, 5189 };

        if (outdoor_map_list.Contains(SelectedPartyLeader.GetMap()) || !Co8Settings.EntangleOutdoorsOnly)
        {
            // spawn one Entangle scenery object
            var entangle_obj = GameSystems.MapObject.CreateObject(OBJECT_SPELL_GENERIC, spell.aoeCenter);
            // add to d20initiative
            var caster_init_value = spell.caster.GetInitiative();
            entangle_obj.InitD20Status();
            entangle_obj.SetInitiative(caster_init_value);
            // put sp-Entangle condition on obj
            var entangle_partsys_id = AttachParticles("sp-Entangle-Area", entangle_obj);
            entangle_obj.AddCondition("sp-Entangle", spell.spellId, spell.duration, 0, entangle_partsys_id);
            // entangle_obj.condition_add_arg_x( 3, entangle_partsys_id )
            // objectevent_id = entangle_obj.condition_get_arg_x( 2 )
            // Added by Sitra Achara	#
            entangle_obj.SetInt(obj_f.secretdoor_dc, 153 + (1 << 15));
            // Mark it as an "obscuring mist" object.
            // 1<<15 - marks it as "active"
            // bits 16 and onward - random ID number
            Co8PersistentData.AddToSpellActiveList(ENTANGLE_KEY, spell.spellId, entangle_obj);
        }
        else
        {
            // End of Section	#
            // No plants to entangle with
            AttachParticles("Fizzle", spell.caster);
            spell.caster.FloatMesFileLine("mes/spell.mes", 30000);
            spell.caster.FloatMesFileLine("mes/spell.mes", 16014);
        }
    }
Exemplo n.º 4
0
    public static void traders_runoff(GameObject attachee)
    {
        AttachParticles("orb-summon-fire-elemental", PartyLeader);
        var gremag = Utilities.find_npc_near(attachee, 8049);
        var rannos = Utilities.find_npc_near(attachee, 8048);

        if (gremag != null)
        {
            gremag.RunOff();
        }

        if (rannos != null)
        {
            rannos.RunOff(gremag.GetLocation().OffsetTiles(-3, 0));
        }

        if (!PartyLeader.HasReputation(23))
        {
            PartyLeader.AddReputation(23);
        }

        if (SelectedPartyLeader.GetMap() == 5051)
        {
            GameSystems.RandomEncounter.RemoveQueuedEncounter(3159);
        }

        attachee.Destroy();
        return;
    }
Exemplo n.º 5
0
    public override void OnSpellEffect(SpellPacketBody spell)
    {
        Logger.Info("Produce Flame OnSpellEffect");
        var(xx, yy) = spell.caster.GetLocation();
        if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
        {
            // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA
            AttachParticles("swirled gas", spell.caster);
            spell.caster.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
            Sound(7581, 1);
            Sound(7581, 1);
        }
        else
        {
            spell.duration = 10 * spell.casterLevel;
            if (spell.casterLevel > 5)
            {
                spell.casterLevel = 5;
            }

            var target = spell.Targets[0];
            target.Object.AddCondition("sp-Produce Flame", spell.spellId, spell.duration, 0);
            target.ParticleSystem = AttachParticles("sp-Produce Flame", target.Object);
        }
    }
Exemplo n.º 6
0
    public static bool check_sleep_encounter(RandomEncounterQuery setup, RandomEncounter encounter)
    {
        if ((RandomRange(1, 10) == 1))
        {
            encounter.Id = 4000;

            if ((SelectedPartyLeader.GetArea() == 1))
            {
                return(false);
            }
            else if ((SelectedPartyLeader.GetArea() == 2))
            {
                if ((SelectedPartyLeader.GetMap() == 5002))
                {
                    var enemy_list = new[] { (14057, 1, 3, 1), (14089, 2, 4, 1), (14291, 1, 4, 6), (14050, 2, 3, 1), (14094, 1, 2, 3), (14090, 2, 4, 1), (14056, 4, 9, 1), (14088, 1, 3, 1), (14047, 2, 4, 1), (14070, 2, 5, 1) };
Exemplo n.º 7
0
    public override bool OnInsertItem(GameObject attachee, GameObject triggerer)
    {
        if (((triggerer.GetNameId() == 8048) || (triggerer.GetNameId() == 8049) || (triggerer.GetNameId() == 1204)))
        {
            QueueRandomEncounter(3000);
        }
        else if (triggerer.GetNameId() == 1004 && SelectedPartyLeader.GetMap() == 5010) // 5010- Trader's shop
        {
            if (!GameSystems.RandomEncounter.IsEncounterQueued(3000))
            {
                QueueRandomEncounter(3000);
            }
        }
        else if (triggerer.GetNameId() == 1001 && SelectedPartyLeader.GetMap() == 5001 && (new[] { 1, 3006, 4120, 6097, 6098, 6099, 6100 }).Contains(attachee.GetNameId())) // note: for some reason most of Lareth's item have a "name" field of 1, and another has 3006. Will be fixed in the future inside Protos.tab, for now this is a hotfix
        {
            GameObject bro_smith = null;
            foreach (var npc in ObjList.ListVicinity(triggerer.GetLocation(), ObjectListFilter.OLC_NPC))
            {
                if (npc.GetNameId() == 20005)
                {
                    bro_smith = npc;
                }
            }

            if (bro_smith == null)
            {
                return(SkipDefault);
            }

            GameObject pc_dude;
            if (Utilities.is_safe_to_talk(bro_smith, SelectedPartyLeader))
            {
                pc_dude = SelectedPartyLeader;
            }
            else
            {
                pc_dude = Utilities.party_closest(bro_smith, true, 0);
            }

            if ((GetGlobalVar(452) & (0x40)) == 0)
            {
                if (pc_dude != null && pc_dude.type == ObjectType.pc)
                {
                    var cur_money = pc_dude.GetMoney();
                    UiSystems.CharSheet.Hide();
                    StartTimer(450, () => smith_refund(cur_money), true);              // give money back to Smith
                    StartTimer(750, () => pc_give_item_back(pc_dude, attachee), true); // get item back
                    SetGlobalVar(452, GetGlobalVar(452) | 0x40);
                    pc_dude.BeginDialog(bro_smith, 1000);
                }
            }
            else if ((attachee.GetInt(obj_f.item_wear_flags) & 256) != 0 && attachee.GetScriptId(ObjScriptEvent.InsertItem) == 186) // Lareth's plate boots
            {
                var cur_money = pc_dude.GetMoney();
                UiSystems.CharSheet.Hide();
                StartTimer(450, () => smith_refund(cur_money), true);              // give money back to Smith
                StartTimer(750, () => pc_give_item_back(pc_dude, attachee), true); // get item back
                pc_dude.BeginDialog(bro_smith, 1050);
            }
        }

        return(SkipDefault);
    }
Exemplo n.º 8
0
    public override void OnSpellEffect(SpellPacketBody spell)
    {
        Logger.Info("Flame Strike OnSpellEffect");
        var remove_list = new List <GameObject>();
        // damage is split between FIRE and DIVINE damage
        var dam = Dice.D6;

        dam = dam.WithCount(Math.Min(15, spell.casterLevel));
        var dam_over2 = Dice.Constant(0);

        dam_over2   = dam_over2.WithModifier(dam.Roll() / 2);
        var(xx, yy) = spell.caster.GetLocation();  // caster is in chamber
        if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
        {
            // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA
            AttachParticles("swirled gas", spell.caster);
            spell.caster.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
            Sound(7581, 1);
            Sound(7581, 1);
            foreach (var target_item in spell.Targets)
            {
                remove_list.Add(target_item.Object);
            }

            spell.EndSpell();
            return;
        }

        (xx, yy) = spell.aoeCenter.location; // center of targeting circle in chamber
        if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
        {
            // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA
            var tro = GameSystems.MapObject.CreateObject(14070, spell.aoeCenter);
            SpawnParticles("swirled gas", spell.aoeCenter);
            spell.caster.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
            tro.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
            tro.Destroy();
            Sound(7581, 1);
            Sound(7581, 1);
            foreach (var target_item in spell.Targets)
            {
                remove_list.Add(target_item.Object);
            }

            spell.EndSpell();
            return;
        }

        SpawnParticles("sp-Flame Strike", spell.aoeCenter);
        // get all targets in a 10ft radius
        var soundfizzle = 0;

        foreach (var target_item in spell.Targets)
        {
            (xx, yy) = target_item.Object.GetLocation(); // center of targeting circle in chamber
            if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
            {
                // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA
                SpawnParticles("swirled gas", target_item.Object.GetLocation());
                target_item.Object.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
                soundfizzle = 1;
                spell.RemoveTarget(target_item.Object);
                remove_list.Add(target_item.Object);
                continue;
            }

            // do reflex saving throw on FIRE damage, then do damage/save check for DIVINE damage
            if (target_item.Object.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam_over2, DamageType.Fire, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId))
            {
                target_item.Object.FloatMesFileLine("mes/spell.mes", 30001);
                // check for evasion
                if ((!target_item.Object.HasFeat(FeatId.EVASION)) && (!target_item.Object.HasFeat(FeatId.IMPROVED_EVASION)))
                {
                    // saving throw successful, apply half damage
                    target_item.Object.DealReducedSpellDamage(spell.caster, DamageType.Magic, dam_over2, D20AttackPower.UNSPECIFIED, DAMAGE_REDUCTION_HALF, D20ActionType.CAST_SPELL, spell.spellId);
                }
            }
            else
            {
                target_item.Object.FloatMesFileLine("mes/spell.mes", 30002);
                if (!target_item.Object.HasFeat(FeatId.IMPROVED_EVASION))
                {
                    // saving throw unsuccessful, apply full damage
                    target_item.Object.DealSpellDamage(spell.caster, DamageType.Magic, dam_over2, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId);
                }
                else
                {
                    // saving throw successful, apply half damage because of IMPROVED EVASION
                    target_item.Object.DealReducedSpellDamage(spell.caster, DamageType.Magic, dam_over2, D20AttackPower.UNSPECIFIED, DAMAGE_REDUCTION_HALF, D20ActionType.CAST_SPELL, spell.spellId);
                }
            }

            remove_list.Add(target_item.Object);
        }

        if (soundfizzle == 1)
        {
            Sound(7581, 1);
            Sound(7581, 1);
        }

        spell.RemoveTargets(remove_list);
        spell.EndSpell();
    }
Exemplo n.º 9
0
    public override void OnSpellEffect(SpellPacketBody spell)
    {
        Logger.Info("Burning Hands OnSpellEffect");
        var remove_list = new List <GameObject>();
        var dam         = Dice.D4;

        dam = dam.WithCount(Math.Min(5, spell.casterLevel));
        if (spell.caster.GetNameId() == 14540) // Hell Hound's Breath Weapon
        {
            dam      = Dice.Parse("2d6");
            spell.dc = 13;
        }

        var(xx, yy) = spell.caster.GetLocation();
        if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
        {
            // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA
            AttachParticles("swirled gas", spell.caster);
            spell.caster.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
            Sound(7581, 1);
            Sound(7581, 1);
        }
        else
        {
            // else: # caster himself is outside Chamber, now check the targets:
            var soundfizzle = 0;
            AttachParticles("sp-Burning Hands", spell.caster);
            var npc = spell.caster;
            // Caster is NOT in game party
            if (npc.type != ObjectType.pc && npc.GetLeader() == null)
            {
                var range       = 15;
                var target_list = ObjList.ListCone(spell.caster, ObjectListFilter.OLC_CRITTERS, range, -30, 150);
                foreach (var obj in target_list)
                {
                    if (obj == spell.caster)
                    {
                        continue;
                    }

                    (xx, yy) = obj.GetLocation();
                    if (obj.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
                    {
                        obj.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
                        SpawnParticles("swirled gas", obj.GetLocation());
                        soundfizzle = 1;
                    }
                    else
                    {
                        if (obj.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam, DamageType.Fire, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId))
                        {
                            // saving throw successful
                            obj.FloatMesFileLine("mes/spell.mes", 30001);
                        }
                        else
                        {
                            // saving throw unsuccessful
                            obj.FloatMesFileLine("mes/spell.mes", 30002);
                        }
                    }
                }
            }

            // Caster is in game party
            if (npc.type == ObjectType.pc || npc.GetLeader() != null)
            {
                // get all targets in a 10ft cone (180')
                soundfizzle = 0;
                foreach (var target_item in spell.Targets)
                {
                    remove_list.Add(target_item.Object);
                    (xx, yy) = target_item.Object.GetLocation();
                    if (target_item.Object.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
                    {
                        // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA
                        target_item.Object.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
                        SpawnParticles("swirled gas", target_item.Object.GetLocation());
                        soundfizzle = 1;
                        spell.RemoveTarget(target_item.Object);
                    }
                    else
                    {
                        if (target_item.Object.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam, DamageType.Fire, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId))
                        {
                            // saving throw successful
                            target_item.Object.FloatMesFileLine("mes/spell.mes", 30001);
                        }
                        else
                        {
                            // saving throw unsuccessful
                            target_item.Object.FloatMesFileLine("mes/spell.mes", 30002);
                        }
                    }
                }
            }

            if (soundfizzle == 1)
            {
                Sound(7581, 1);
                Sound(7581, 1);
            }
        }

        spell.RemoveTargets(remove_list);
        spell.EndSpell();
    }
Exemplo n.º 10
0
    public override void OnSpellEffect(SpellPacketBody spell)
    {
        Logger.Info("Cone of Cold OnSpellEffect");
        var remove_list = new List <GameObject>();
        var dam         = Dice.D6;

        dam = dam.WithCount(Math.Min(15, spell.casterLevel));
        if (Co8Settings.ElementalSpellsAtElementalNodes)
        {
            if (SelectedPartyLeader.GetMap() == 5083) // Fire node - water spells do 1/2 damage
            {
                dam = dam.WithCount(dam.Count / 2);
            }
            else if (SelectedPartyLeader.GetMap() == 5084) // Water node - water spells do X2 damage
            {
                dam = dam.WithCount(dam.Count * 2);
            }
        }

        AttachParticles("sp-Cone of Cold", spell.caster);
        var npc = spell.caster;

        // Caster is NOT in game party
        if (npc.type != ObjectType.pc && npc.GetLeader() == null)
        {
            // range = 25 + 5 * int(spell.caster_level/2)
            var range       = 60;
            var target_list = ObjList.ListCone(spell.caster, ObjectListFilter.OLC_CRITTERS, range, -30, 60);
            foreach (var obj in target_list)
            {
                if (obj == spell.caster)
                {
                    continue;
                }
                if (obj.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam, DamageType.Cold, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId))
                {
                    // saving throw successful
                    obj.FloatMesFileLine("mes/spell.mes", 30001);
                }
                else
                {
                    // saving throw unsuccessful
                    obj.FloatMesFileLine("mes/spell.mes", 30002);
                }
            }
        }

        // Caster is in game party
        if (npc.type == ObjectType.pc || npc.GetLeader() != null)
        {
            // get all targets in a 25ft + 2ft/level cone (60')
            foreach (var target_item in spell.Targets)
            {
                if (target_item.Object.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam, DamageType.Cold, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId))
                {
                    // saving throw successful
                    target_item.Object.FloatMesFileLine("mes/spell.mes", 30001);
                }
                else
                {
                    // saving throw unsuccessful
                    target_item.Object.FloatMesFileLine("mes/spell.mes", 30002);
                }

                remove_list.Add(target_item.Object);
            }
        }

        spell.RemoveTargets(remove_list);
        spell.EndSpell();
    }
Exemplo n.º 11
0
    public override void OnSpellEffect(SpellPacketBody spell)
    {
        Logger.Info("Fire Shield OnSpellEffect");
        // Solves Radial menu problem for Wands/NPCs
        var spell_arg = spell.GetMenuArg(RadialMenuParam.MinSetting);

        if (spell_arg != 1 && spell_arg != 2)
        {
            spell_arg = RandomRange(1, 2);
        }

        SpellDescriptor element_type;
        string          partsys_type;

        if (spell_arg == 1)
        {
            element_type = SpellDescriptor.COLD;
            partsys_type = "sp-Fire Shield-Cold";
        }
        else if (spell_arg == 2)
        {
            element_type = SpellDescriptor.FIRE;
            partsys_type = "sp-Fire Shield-Warm";
        }
        else
        {
            Logger.Error("Fire shield cast with an unknown spell arg: {0}", spell_arg);
            return;
        }

        spell.duration = 1 * spell.casterLevel;
        var npc = spell.caster; // added so NPC's can use wand/potion/scroll

        if (npc.type != ObjectType.pc && npc.GetLeader() == null && spell.duration <= 0)
        {
            spell.duration    = 10;
            spell.casterLevel = 10;
        }

        var target_item = spell.Targets[0];

        var(xx, yy) = target_item.Object.GetLocation();
        if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
        {
            // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA
            AttachParticles("swirled gas", target_item.Object);
            target_item.Object.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
            Sound(7581, 1);
            Sound(7581, 1);
        }
        else
        {
            (xx, yy) = spell.caster.GetLocation();
            if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
            {
                AttachParticles("swirled gas", spell.caster);
                spell.caster.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
                Sound(7581, 1);
                Sound(7581, 1);
            }
            else
            {
                target_item.Object.AddCondition("sp-Fire Shield", spell.spellId, spell.duration, element_type);
                target_item.ParticleSystem = AttachParticles(partsys_type, target_item.Object);
            }
        }
    }
Exemplo n.º 12
0
    public override void OnSpellEffect(SpellPacketBody spell)
    {
        Logger.Info("Fire Storm OnSpellEffect");
        var remove_list = new List <GameObject>();
        var damage_list = new List <GameObject>();
        var dam         = Dice.D6;

        dam         = dam.WithCount(Math.Min(20, spell.casterLevel));
        var(xx, yy) = spell.caster.GetLocation();  // caster is in chamber
        if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
        {
            // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA
            AttachParticles("swirled gas", spell.caster);
            spell.caster.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
            Sound(7581, 1);
            Sound(7581, 1);
            spell.EndSpell();
            return;
        }

        foreach (var target_item in spell.Targets)
        {
            (xx, yy) = target_item.Object.GetLocation(); // target in chamber
            if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
            {
                // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA
                var tro = GameSystems.MapObject.CreateObject(14070, target_item.Object.GetLocation());
                SpawnParticles("swirled gas", target_item.Object.GetLocation());
                // spell.caster.float_mesfile_line( 'mes\\skill_ui.mes', 2000 , 1 )
                tro.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
                tro.Destroy();
                Sound(7581, 1);
                Sound(7581, 1);
                remove_list.Add(target_item.Object);
                continue;
            }
            else
            {
                // create a rectangle around target for two 10 x 10 ft. cubes (10 x 20 ft. area of effect)
                var(target_xx, target_yy) = target_item.Object.GetLocation();
                // generate location of the rectangle (centered on the target) and randomize the placement of it (since you can not place it)
                var a = RandomRange(1, 2);
                var b = RandomRange(1, 2);
                int targetX, targetY;
                if (a == 1)
                {
                    targetX = 5;
                    if (b == 1)
                    {
                        targetY = 7;
                    }
                    else
                    {
                        targetY = 10;
                    }
                }
                else
                {
                    targetY = 5;
                    if (b == 1)
                    {
                        targetX = 7;
                    }
                    else
                    {
                        targetX = 10;
                    }
                }

                SpawnParticles("sp-Flame Strike", new locXY(target_xx - (int)(targetX / 2), target_yy - (int)(targetY / 2)));
                SpawnParticles("sp-Flame Strike", new locXY(target_xx + (int)(targetX / 2), target_yy + (int)(targetY / 2)));
                // create damage list
                foreach (var critter in ObjList.ListVicinity(target_item.Object.GetLocation(), ObjectListFilter.OLC_CRITTERS))
                {
                    (xx, yy) = critter.GetLocation();
                    if ((xx >= (target_xx - targetX) && xx <= (target_xx + targetX)) && (yy >= (target_yy - targetY) && yy <= (target_yy + targetY)))
                    {
                        if (critter.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
                        {
                            // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA
                            critter.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
                            AttachParticles("swirled gas", critter);
                            Sound(7581, 1);
                            Sound(7581, 1);
                            continue;
                        }
                        else
                        {
                            if (!(damage_list).Contains(critter))
                            {
                                damage_list.Add(critter);
                            }
                        }
                    }
                }
            }

            remove_list.Add(target_item.Object);
        }

        // deal damage
        foreach (var damage_target in damage_list)
        {
            if (!damage_target.D20Query(D20DispatcherKey.QUE_Dead))
            {
                AttachParticles("hit-FIRE-burst", damage_target);
                if (damage_target.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam, DamageType.Fire, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId))
                {
                    // saving throw successful
                    damage_target.FloatMesFileLine("mes/spell.mes", 30001);
                }
                else
                {
                    // saving throw unsuccessful
                    damage_target.FloatMesFileLine("mes/spell.mes", 30002);
                }
            }
        }

        spell.RemoveTargets(remove_list);
        spell.EndSpell();
    }
    public override void OnSpellEffect(SpellPacketBody spell)
    {
        Logger.Info("Delayed Blast Fireball OnSpellEffect");
        AttachParticles("sp-Fireball-conjure", spell.caster);
        var remove_list = new List <GameObject>();
        var dam         = Dice.D6;

        dam = dam.WithCount(Math.Min(20, spell.casterLevel)); // edited by Allyx
        if (Co8Settings.ElementalSpellsAtElementalNodes)
        {
            if (SelectedPartyLeader.GetMap() == 5083) // Fire node - fire spells do x2 damage
            {
                dam = dam.WithCount(dam.Count * 2);
            }
            else if (SelectedPartyLeader.GetMap() == 5084) // Water node - fire spells do 1/2 damage
            {
                dam = dam.WithCount(dam.Count / 2);
            }
        }

        var(xx, yy) = spell.aoeCenter.location;
        if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
        {
            // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA
            var tro = GameSystems.MapObject.CreateObject(14070, spell.aoeCenter);
            SpawnParticles("swirled gas", spell.aoeCenter);
            tro.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
            tro.Destroy();
            Sound(7581, 1);
            Sound(7581, 1);
            foreach (var target_item in spell.Targets)
            {
                remove_list.Add(target_item.Object);
            }

            spell.RemoveTargets(remove_list);
            spell.EndSpell();
            return;
        }

        SpawnParticles("sp-Fireball-Hit", spell.aoeCenter);
        var soundfizzle = 0;

        foreach (var target_item in spell.Targets)
        {
            (xx, yy) = target_item.Object.GetLocation();
            if (target_item.Object.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
            {
                // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA
                target_item.Object.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
                AttachParticles("swirled gas", target_item.Object);
                soundfizzle = 1;
                remove_list.Add(target_item.Object);
                continue;
            }

            if (target_item.Object.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam, DamageType.Fire, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId))
            {
                // saving throw successful
                target_item.Object.FloatMesFileLine("mes/spell.mes", 30001);
            }
            else
            {
                // saving throw unsuccessful
                target_item.Object.FloatMesFileLine("mes/spell.mes", 30002);
            }

            remove_list.Add(target_item.Object);
        }

        if (soundfizzle == 1)
        {
            Sound(7581, 1);
            Sound(7581, 1);
        }

        spell.RemoveTargets(remove_list);
        spell.EndSpell();
    }
Exemplo n.º 14
0
    public override void OnEndProjectile(SpellPacketBody spell, GameObject projectile, int index_of_target)
    {
        Logger.Info("Fireball OnEndProjectile");
        var remove_list = new List <GameObject>();

        spell.duration = 0;
        var dam = Dice.D6;

        dam = dam.WithCount(Math.Min(10, spell.casterLevel));
        if (Co8Settings.ElementalSpellsAtElementalNodes)
        {
            if (SelectedPartyLeader.GetMap() == 5083) // Fire node - fire spells do double damage
            {
                dam = dam.WithCount(dam.Count * 2);
            }
            else if (SelectedPartyLeader.GetMap() == 5084) // Water node - fire spells do half damage
            {
                dam = dam.WithCount(dam.Count / 2);
            }
        }

        EndProjectileParticles(projectile);
        var(xx, yy) = spell.aoeCenter.location;
        if (SelectedPartyLeader.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
        {
            // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA
            // This is for the projectile hitting inside the chamber - total fizzle
            var tro = GameSystems.MapObject.CreateObject(14070, spell.aoeCenter);
            SpawnParticles("swirled gas", spell.aoeCenter);
            tro.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
            tro.Destroy();
            Sound(7581, 1);
            Sound(7581, 1);
            foreach (var target_item in spell.Targets)
            {
                remove_list.Add(target_item.Object);
            }
        }
        else
        {
            // else: # suppose the fireball projectile lands outside the chamber, check individual targets
            SpawnParticles("sp-Fireball-Hit", spell.aoeCenter);
            var soundfizzle = 0;
            foreach (var target_item in spell.Targets)
            {
                (xx, yy) = target_item.Object.GetLocation();
                if (target_item.Object.GetMap() == 5067 && (xx >= 521 && xx <= 555) && (yy >= 560 && yy <= 610))
                {
                    // Water Temple Pool Enchantment prevents fire spells from working inside the chamber, according to the module -SA
                    SpawnParticles("swirled gas", target_item.Object.GetLocation());
                    target_item.Object.FloatMesFileLine("mes/skill_ui.mes", 2000, TextFloaterColor.Red);
                    soundfizzle = 1;
                    spell.RemoveTarget(target_item.Object);
                }
                else
                {
                    if (target_item.Object.ReflexSaveAndDamage(spell.caster, spell.dc, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, dam, DamageType.Fire, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId))
                    {
                        // saving throw successful
                        target_item.Object.FloatMesFileLine("mes/spell.mes", 30001);
                    }
                    else
                    {
                        // saving throw unsuccessful
                        target_item.Object.FloatMesFileLine("mes/spell.mes", 30002);
                    }
                }

                remove_list.Add(target_item.Object);
            }

            if (soundfizzle == 1)
            {
                Sound(7581, 1);
                Sound(7581, 1);
            }
        }

        spell.RemoveTargets(remove_list);
        spell.EndSpell();
    }
Exemplo n.º 15
0
    public static void council_events()
    {
        // this script is fired from first_heartbeat in the Hommlet Exterior map 5001
        if ((SelectedPartyLeader.GetMap() == 5001 && GetGlobalVar(435) == 4 && !GetGlobalFlag(435) && GetGlobalFlag(432)))
        {
            // spawns everyone that was inside Towne Hall
            SetGlobalFlag(435, true);
            var burne = GameSystems.MapObject.CreateObject(14453, new locXY(578, 406));
            burne.RemoveScript(ObjScriptEvent.FirstHeartbeat);
            burne.RemoveScript(ObjScriptEvent.Heartbeat);
            burne.SetInt(obj_f.critter_description_unknown, 20000);
            burne.Move(new locXY(578, 406), 0f, 0f);
            burne.Rotation = 1;
            ScriptDaemon.destroy_weapons(burne, 4058, 0, 0);
            var jaroo = GameSystems.MapObject.CreateObject(14005, new locXY(583, 412));
            jaroo.RemoveScript(ObjScriptEvent.FirstHeartbeat);
            jaroo.RemoveScript(ObjScriptEvent.Heartbeat);
            jaroo.SetInt(obj_f.critter_description_unknown, 20001);
            jaroo.Move(new locXY(583, 412), 0f, 0f);
            jaroo.Rotation = 0;
            ScriptDaemon.destroy_weapons(jaroo, 4047, 4111, 0);
            var rufus = GameSystems.MapObject.CreateObject(14006, new locXY(571, 407));
            rufus.RemoveScript(ObjScriptEvent.FirstHeartbeat);
            rufus.RemoveScript(ObjScriptEvent.Heartbeat);
            rufus.SetInt(obj_f.critter_description_unknown, 8071);
            rufus.Move(new locXY(571, 407), 0f, 0f);
            rufus.Rotation = 3;
            var terjon = GameSystems.MapObject.CreateObject(14007, new locXY(570, 412));
            terjon.RemoveScript(ObjScriptEvent.FirstHeartbeat);
            terjon.RemoveScript(ObjScriptEvent.Heartbeat);
            terjon.SetInt(obj_f.critter_description_unknown, 20003);
            terjon.Move(new locXY(570, 412), 0f, 0f);
            terjon.Rotation = 4.5f;
            ScriptDaemon.destroy_weapons(terjon, 4124, 6054, 0);
            var renton = GameSystems.MapObject.CreateObject(14012, new locXY(583, 409));
            renton.RemoveScript(ObjScriptEvent.FirstHeartbeat);
            renton.RemoveScript(ObjScriptEvent.Heartbeat);
            renton.SetInt(obj_f.critter_description_unknown, 20007);
            renton.Move(new locXY(583, 409), 0f, 0f);
            renton.Rotation = 1;
            ScriptDaemon.destroy_weapons(renton, 4096, 4036, 6074);
            var nevets = GameSystems.MapObject.CreateObject(14102, new locXY(576, 407));
            nevets.RemoveScript(ObjScriptEvent.FirstHeartbeat);
            nevets.RemoveScript(ObjScriptEvent.Heartbeat);
            nevets.SetInt(obj_f.critter_description_unknown, 20058);
            nevets.Move(new locXY(576, 407), 0f, 0f);
            nevets.Rotation = 3;
            var miller = GameSystems.MapObject.CreateObject(14031, new locXY(571, 412));
            miller.RemoveScript(ObjScriptEvent.FirstHeartbeat);
            miller.RemoveScript(ObjScriptEvent.Heartbeat);
            miller.SetInt(obj_f.critter_description_unknown, 20026);
            miller.Move(new locXY(571, 412), 3f, 0f);
            miller.Rotation = 3;
            miller.AddCondition("Prone", 0, 0);
            var gundi = GameSystems.MapObject.CreateObject(14016, new locXY(582, 411));
            gundi.RemoveScript(ObjScriptEvent.FirstHeartbeat);
            gundi.RemoveScript(ObjScriptEvent.Heartbeat);
            gundi.SetInt(obj_f.critter_description_unknown, 20011);
            gundi.Move(new locXY(582, 411), -10f, -10f);
            gundi.Rotation = 3;
            gundi.AddCondition("Prone", 0, 0);
            var crybaby = GameSystems.MapObject.CreateObject(14002, new locXY(575, 417));
            crybaby.Move(new locXY(575, 417), 0f, 0f);
            crybaby.RemoveScript(ObjScriptEvent.FirstHeartbeat);
            crybaby.RemoveScript(ObjScriptEvent.Heartbeat);
            crybaby.Rotation = 5.5f;
            crybaby.RemoveScript(ObjScriptEvent.Heartbeat);
            crybaby.ClearObjectFlag(ObjectFlag.OFF);
            if ((GetGlobalVar(436) == 4))
            {
                StartTimer(2000, () => proactivity(crybaby, 3000));
            }
            else
            {
                StartTimer(7000, () => proactivity(crybaby, 3000));
            }

            var randy1 = RandomRange(1, 2);
            randy1 = 2;
            // remove randomness for testing purposes
            if ((randy1 == 1))
            {
                var gremag = GameSystems.MapObject.CreateObject(14014, new locXY(365, 653));
                gremag.AddCondition("Invisible", 0, 0);
                gremag.SetObjectFlag(ObjectFlag.DONTDRAW);
                var rannos = GameSystems.MapObject.CreateObject(14018, new locXY(366, 655));
                rannos.AddCondition("Invisible", 0, 0);
                rannos.SetObjectFlag(ObjectFlag.DONTDRAW);
                var dlg_popup = GameSystems.MapObject.CreateObject(14806, new locXY(364, 653));
            }
            else
            {
                var gremag = GameSystems.MapObject.CreateObject(14014, new locXY(318, 495));
                gremag.AddCondition("Invisible", 0, 0);
                gremag.SetObjectFlag(ObjectFlag.DONTDRAW);
                var rannos = GameSystems.MapObject.CreateObject(14018, new locXY(320, 496));
                rannos.AddCondition("Invisible", 0, 0);
                rannos.SetObjectFlag(ObjectFlag.DONTDRAW);
                var dlg_popup = GameSystems.MapObject.CreateObject(14806, new locXY(317, 494));
            }

            // dlg_popup.object_flag_unset(OF_DONTDRAW)
            // dlg_popup.object_flag_unset(OF_CLICK_THROUGH)
            // damage section, tough ones:
            if ((GetGlobalVar(436) != 4))
            {
                lightly_damage(renton);
                lightly_damage(terjon);
                lightly_damage(rufus);
                lightly_damage(jaroo);
                lightly_damage(burne);
                StartTimer(8500, () => heal_script(terjon, rufus));
                StartTimer(9500, () => heal_script(jaroo, renton));
            }

            // damage section, frail but important ones:
            if ((GetGlobalVar(436) != 4))
            {
                if ((GetGlobalVar(436) != 6 && GetGlobalVar(436) != 7))
                {
                    lightly_damage(nevets);
                    lightly_damage(gundi);
                    StartTimer(700, () => heal_script(jaroo, gundi));
                    StartTimer(5800, () => heal_script(jaroo, nevets));
                }
                else
                {
                    heavily_damage(nevets);
                    heavily_damage(gundi);
                }
            }

            // damage section, frail and unimportant ones:
            if ((ScriptDaemon.get_v(436) != 4))
            {
                if ((ScriptDaemon.get_v(436) == 3))
                {
                    lightly_damage(miller);
                    StartTimer(3500, () => float_comment(terjon, 3000));
                    StartTimer(3510, () => heal_script(terjon, miller));
                }
                else
                {
                    heavily_damage(miller);
                }
            }
        }

        return;
    }
Exemplo n.º 16
0
    public static bool should_display_dialog_node(string node_name)
    {
        var cur_map = SelectedPartyLeader.GetMap();

        if (node_name == "Temple Entrance")
        {
            if (cur_map == 5064)
            {
                return(false);
            }
        }
        else if (node_name == "Temple Tower Exterior")
        {
            if (cur_map == 5113)
            {
                return(false);
            }

            if (ScriptDaemon.get_f("visited_temple_tower_exterior"))
            {
                return(true);
            }
        }
        else if (node_name == "More Upper Proper")
        {
            var option_count = 0;
            if (cur_map != 5064)
            {
                option_count += 1;
            }

            if (cur_map != 5113 && ScriptDaemon.get_f("visited_temple_tower_exterior"))
            {
                option_count += 1;
            }

            if (cur_map != 5065 && ScriptDaemon.get_f("visited_temple_tower_interior"))
            {
                option_count += 1;
            }

            if (cur_map != 5093 && ScriptDaemon.get_f("visited_temple_burnt_farmhouse"))
            {
                option_count += 1;
            }

            if (cur_map != 5092 && ScriptDaemon.get_f("visited_temple_escape_tunnel"))
            {
                option_count += 1;
            }

            if (cur_map != 5112 && ScriptDaemon.get_f("visited_temple_ruined_building"))
            {
                option_count += 1;
            }

            return(option_count >= 5);
        }
        else if (node_name == "Level 1")
        {
            if (cur_map == 5066)
            {
                return(false);
            }

            if (ScriptDaemon.get_f("visited_level_1_north_entrance") || ScriptDaemon.get_f("visited_level_1_south_entrance") || ScriptDaemon.get_f("visited_level_1_south_entrance") || SelectedPartyLeader.HasReputation(11) || ScriptDaemon.get_f("visited_secret_spiral_staircase"))
            {
                return(true);
            }
        }
        else if (node_name == "Level 1 - North")
        {
            if (ScriptDaemon.get_f("visited_level_1_north_entrance"))
            {
                return(true);
            }
        }
        else if (node_name == "Level 1 - South")
        {
            if (ScriptDaemon.get_f("visited_level_1_south_entrance"))
            {
                return(true);
            }
        }
        else if (node_name == "Level 1 - Romag")
        {
            if (SelectedPartyLeader.HasReputation(11))
            {
                return(true);
            }
        }
        else if (node_name == "Secret Spiral Staircase")
        {
            if (ScriptDaemon.get_f("visited_secret_spiral_staircase"))
            {
                return(true);
            }
        }
        else if (node_name == "Level 2")
        {
            if (cur_map == 5067)
            {
                return(false);
            }

            if (ScriptDaemon.get_f("visited_level_2_north_west_entrance") || ScriptDaemon.get_f("visited_level_2_centre_entrance") || SelectedPartyLeader.HasReputation(13) || SelectedPartyLeader.HasReputation(12) || SelectedPartyLeader.HasReputation(10))
            {
                return(true);
            }
        }
        else if (node_name == "Level 2 - North West")
        {
            if (ScriptDaemon.get_f("visited_level_2_north_west_entrance"))
            {
                return(true);
            }
        }
        else if (node_name == "Level 2 - Centre")
        {
            if (ScriptDaemon.get_f("visited_level_2_centre_entrance"))
            {
                return(true);
            }
        }
        else if (node_name == "Level 2 - Alrrem")
        {
            if (SelectedPartyLeader.HasReputation(13))
            {
                return(true);
            }
        }
        else if (node_name == "Level 2 - Belsornig")
        {
            if (SelectedPartyLeader.HasReputation(12))
            {
                return(true);
            }
        }
        else if (node_name == "Level 2 - Kelno")
        {
            if (SelectedPartyLeader.HasReputation(10))
            {
                return(true);
            }
        }
        else if (node_name == "Level 2 More")
        {
            var option_count = 0;
            if (ScriptDaemon.get_f("visited_level_2_north_west_entrance"))
            {
                option_count += 1;
            }

            if (ScriptDaemon.get_f("visited_level_2_centre_entrance"))
            {
                option_count += 1;
            }

            if (SelectedPartyLeader.HasReputation(13))
            {
                option_count += 1;
            }

            if (SelectedPartyLeader.HasReputation(12))
            {
                option_count += 1;
            }

            if (SelectedPartyLeader.HasReputation(10))
            {
                option_count += 1;
            }

            return(option_count >= 5);
        }
        else if (node_name == "Secret Spiral Staircase")
        {
            if (ScriptDaemon.get_f("visited_secret_spiral_staircase"))
            {
                return(true);
            }
        }
        else if (node_name == "Level 3")
        {
            if (cur_map == 5105)
            {
                return(false);
            }

            if (ScriptDaemon.get_f("visited_level_3_east_entrance") || ScriptDaemon.get_f("visited_level_3_west_entrance") || ScriptDaemon.get_f("visited_level_3_south_west_entrance") || ScriptDaemon.get_f("visited_level_3_falrinth"))
            {
                return(true);
            }
        }
        else if (node_name == "Level 3 - East")
        {
            if (ScriptDaemon.get_f("visited_level_3_east_entrance"))
            {
                return(true);
            }
        }
        else if (node_name == "Level 3 - West")
        {
            if (ScriptDaemon.get_f("visited_level_3_west_entrance"))
            {
                return(true);
            }
        }
        else if (node_name == "Level 3 - South")
        {
            if (ScriptDaemon.get_f("visited_level_3_south_west_entrance"))
            {
                return(true);
            }
        }
        else if (node_name == "Level 3 - Falrinth")
        {
            if (ScriptDaemon.get_f("visited_level_3_falrinth"))
            {
                return(true);
            }
        }
        else if (node_name == "Level 4")
        {
            if (cur_map == 5080)
            {
                return(false);
            }

            if (ScriptDaemon.get_f("visited_level_4_main_entrance") || ScriptDaemon.get_f("visited_level_4_nexus") || ScriptDaemon.get_f("visited_level_4_hedrack"))
            {
                return(true);
            }
        }
        else if (node_name == "Level 4 - Main")
        {
            if (ScriptDaemon.get_f("visited_level_4_main_entrance"))
            {
                return(true);
            }
        }
        else if (node_name == "Level 4 - Nexus")
        {
            if (ScriptDaemon.get_f("visited_level_4_nexus"))
            {
                return(true);
            }
        }
        else if (node_name == "Level 4 - Hedrack")
        {
            if (ScriptDaemon.get_f("visited_level_4_hedrack"))
            {
                return(true);
            }
        }
        else if (node_name == "Nodes")
        {
            if (ScriptDaemon.get_f("visited_air_node") || ScriptDaemon.get_f("visited_earth_node") || ScriptDaemon.get_f("visited_fire_node") || ScriptDaemon.get_f("visited_water_node"))
            {
                return(true);
            }
        }
        else if (node_name == "Air Node")
        {
            if (ScriptDaemon.get_f("visited_air_node"))
            {
                return(true);
            }
        }
        else if (node_name == "Earth Node")
        {
            if (ScriptDaemon.get_f("visited_earth_node"))
            {
                return(true);
            }
        }
        else if (node_name == "Fire Node")
        {
            if (ScriptDaemon.get_f("visited_fire_node"))
            {
                return(true);
            }
        }
        else if (node_name == "Water Node")
        {
            if (ScriptDaemon.get_f("visited_water_node"))
            {
                return(true);
            }
        }
        else if (node_name == "Zuggtmoy Level")
        {
            if (cur_map == 5079)
            {
                return(false);
            }

            if (ScriptDaemon.get_f("visited_zuggtmoy_level"))
            {
                return(true);
            }
        }

        return(true);
    }