示例#1
0
    public static int grate_strength()
    {
        var strength_array = new List <int>();

        foreach (var obj in PartyLeader.GetPartyMembers())
        {
            strength_array.Add(obj.GetStat(Stat.strength));
        }

        strength_array.Sort();
        strength_array.Reverse();
        if (strength_array[0] >= 24)
        {
            return(2);
        }

        if (strength_array.Count >= 3)
        {
            if (strength_array[0] + strength_array[1] + strength_array[2] >= 60)
            {
                return(1);
            }
        }

        return(0);
    }
    public override void OnEndProjectile(SpellPacketBody spell, GameObject projectile, int index_of_target)
    {
        Logger.Info("Magic Missile OnEndProjectile");
        EndProjectileParticles(projectile);
        var target      = spell.Targets[index_of_target];
        var damage_dice = Dice.D4;

        damage_dice = damage_dice.WithModifier(1);
        var target_item_obj = target.Object;

        if ((!((PartyLeader.GetPartyMembers()).Contains(spell.caster))) && target_item_obj.D20Query(D20DispatcherKey.QUE_Critter_Is_Charmed))
        {
            // NPC enemy is trying to cast on a charmed target - this is mostly meant for the Cult of the Siren encounter
            target_item_obj = Utilities.party_closest(spell.caster, exclude_warded: true); // select nearest conscious PC instead, who isn't already charmed
            if (target_item_obj == null)
            {
                target_item_obj = target.Object;
            }
        }

        // always hits
        target_item_obj.AddCondition("sp-Magic Missile", spell.spellId, spell.duration, damage_dice.Roll());
        target.ParticleSystem = AttachParticles("sp-magic missle-hit", target_item_obj);
        // special scripting for NPCs no longer necessary - NPCs will launch multiple projectiles now
        // spell.target_list.remove_target_by_index( index_of_target )
        spell.RemoveProjectile(projectile);
        if (spell.projectiles.Length == 0)
        {
            // loc = target.obj.location
            // target.obj.destroy()
            // mxcr = game.obj_create( 12021, loc )
            // game.global_vars[30] = game.global_vars[30] + 1
            spell.EndSpell(true);
        }
    }
    public static bool trap(GameObject attachee, GameObject triggerer)
    {
        AttachParticles("Mon-EarthElem-Unconceal", triggerer);
        AttachParticles("Mon-EarthElem-body120", triggerer);
        AttachParticles("Orb-Summon-Earth Elemental", triggerer);
        AttachParticles("sp-Calm Animals", triggerer);
        AttachParticles("sp-Quench", triggerer);
        Sound(4042, 1);
        foreach (var obj in PartyLeader.GetPartyMembers())
        {
            var damage_dice = Dice.Parse("4d8");
            obj.FloatMesFileLine("mes/float.mes", 3);
            AttachParticles("hit-BLUDGEONING-medium", obj);
            if ((obj.ReflexSaveAndDamage(null, 20, D20SavingThrowReduction.Half, D20SavingThrowFlag.NONE, damage_dice, DamageType.Bludgeoning, D20AttackPower.UNSPECIFIED, D20ActionType.UNSPECIFIED_MOVE)))
            {
                triggerer.FloatMesFileLine("mes/spell.mes", 30001);
            }
            else
            {
                triggerer.FloatMesFileLine("mes/spell.mes", 30002);
            }
        }

        return(RunDefault);
    }
示例#4
0
    public static bool look_spugnoir(GameObject attachee, GameObject triggerer)
    {
        foreach (var npc in PartyLeader.GetPartyMembers())
        {
            if ((npc.GetNameId() == 8072 && npc.GetLeader() != null && !GetGlobalFlag(819)))
            {
                var curr = npc.GetStat(Stat.hp_current);
                if ((curr >= 1))
                {
                    foreach (var target in PartyLeader.GetPartyMembers())
                    {
                        if ((npc.DistanceTo(target) <= 20 && target.type == ObjectType.pc && npc.GetNameId() != 8072))
                        {
                            npc.TurnTowards(target);
                            target.BeginDialog(npc, 1000);
                            return(SkipDefault);
                        }
                    }
                }
            }
        }

        attachee.Attack(triggerer);
        return(RunDefault);
    }
    public override bool OnStartCombat(GameObject attachee, GameObject triggerer)
    {
        foreach (var target in PartyLeader.GetPartyMembers())
        {
            return(SkipDefault);
        }

        return(RunDefault);
    }
示例#6
0
    public static void ghouls_harpies_join_in(GameObject attachee)
    {
        foreach (var obj in ObjList.ListVicinity(attachee.GetLocation(), ObjectListFilter.OLC_NPC))
        {
            if ((new[] { 14095, 14128, 14129 }).Contains(obj.GetNameId()) && ScriptDaemon.within_rect_by_corners(obj, 415, 556, 419, 590) && obj.GetLeader() == null)
            {
                // ghouls in the eastern room - should join the fray, per the module
                obj.Attack(SelectedPartyLeader);
            }

            if (obj.GetNameId() == 14243 && obj.GetLeader() == null)
            {
                // other harpies
                obj.Attack(SelectedPartyLeader);
            }
        }

        if (attachee.GetMap() == 5066 && (!ScriptDaemon.get_f("j_ghouls_corridor_temple_1"))) // temple level 1
        {
            ScriptDaemon.set_f("j_ghouls_corridor_temple_1");
            var yyp_max = 556;
            var yyp_o   = 561;
            foreach (var pc in PartyLeader.GetPartyMembers())
            {
                var(xxp, yyp) = pc.GetLocation();
                if (xxp >= 433 && yyp >= 561)
                {
                    if (yyp > yyp_max)
                    {
                        yyp_max = yyp;
                    }
                }
            }

            var y_ghoul = yyp_max + 18;
            y_ghoul = Math.Min(603, y_ghoul);
            var y_ghoul_add   = new[] { 0, 0, 2, 2, -2 };
            var x_ghoul_add   = new[] { 0, 2, 0, 2, 0 };
            var x_ghoul       = 433;
            var ghoul_counter = 0;
            foreach (var npc in ObjList.ListVicinity(new locXY(463, 603), ObjectListFilter.OLC_NPC))
            {
                if (npc.GetNameId() == 14129 && npc.GetLeader() == null && !npc.IsUnconscious())
                {
                    npc.Move(new locXY(x_ghoul + x_ghoul_add[ghoul_counter], y_ghoul + y_ghoul_add[ghoul_counter]), 0, 0);
                    ghoul_counter += 1;
                    npc.Attack(SelectedPartyLeader);
                }
            }
        }
    }
示例#7
0
    public override bool OnStartCombat(GameObject attachee, GameObject triggerer)
    {
        if ((attachee.AddCondition("Rend")))
        {
            Logger.Info("Added Rend to Oohlgrist");
        }

        if (((Utilities.obj_percent_hp(attachee) < 50) && (!GetGlobalFlag(350)) && ((ScriptDaemon.get_v(454) & (0x20 + (1 << 7))) == 0))) // if he hasn't already been intimidated or regrouped
        {
            GameObject found_pc = null;
            foreach (var pc in GameSystems.Party.PartyMembers)
            {
                if (pc.type == ObjectType.pc)
                {
                    found_pc = pc;
                    attachee.AIRemoveFromShitlist(pc);
                }
            }

            if (found_pc != null)
            {
                SetGlobalFlag(349, true);
                found_pc.BeginDialog(attachee, 70);
                return(SkipDefault);
            }
        }

        // THIS IS USED FOR BREAK FREE
        foreach (var obj in PartyLeader.GetPartyMembers())
        {
            if ((obj.DistanceTo(attachee) <= 9 && obj.GetStat(Stat.hp_current) >= -9))
            {
                return(RunDefault);
            }
        }

        while ((attachee.FindItemByName(8903) != null))
        {
            attachee.FindItemByName(8903).Destroy();
        }

        // if (attachee.d20_query(Q_Is_BreakFree_Possible)): # workaround no longer necessary!
        // create_item_in_inventory( 8903, attachee )
        // attachee.d20_send_signal(S_BreakFree)
        if (attachee.GetLeader() != null) // Don't wanna f**k up charmed enemies
        {
            return(RunDefault);
        }

        return(RunDefault);
    }
示例#8
0
    public static int alldie()
    {
        foreach (var obj in ObjList.ListVicinity(PartyLeader.GetLocation(), ObjectListFilter.OLC_CRITTERS))
        {
            if (!(PartyLeader.GetPartyMembers()).Contains(obj) && obj.GetNameId() != 14455)
            {
                obj.KillWithDeathEffect();
            }
        }

        // damage_dice = dice_new( '104d20' )
        // obj.damage( OBJ_HANDLE_NULL, 0, damage_dice )
        return(1);
    }
示例#9
0
    public static void spawn_grate_object()
    {
        if (!ScriptDaemon.get_f("harpy_grate"))
        {
            var should_drop_grate = false;
            foreach (var pc in PartyLeader.GetPartyMembers())
            {
                var(xx, yy) = pc.GetLocation();
                if (xx <= 415 && yy < 580 && yy > 500)
                {
                    should_drop_grate = true;
                }

                if (should_drop_grate)
                {
                    ScriptDaemon.set_f("harpy_grate");
                    GameObject grate_obj = null;
                    foreach (var obj in ObjList.ListVicinity(new locXY(415, 556), ObjectListFilter.OLC_PORTAL))
                    {
                        if (obj.GetNameId() == 120)
                        {
                            grate_obj = obj;
                        }
                    }

                    if (grate_obj == null)
                    {
                        grate_obj = GameSystems.MapObject.CreateObject(120, new locXY(415, 556));
                        grate_obj.Move(new locXY(415, 556), 0, 11f);
                        grate_obj.Rotation = 1.57f * 3 / 2;
                        grate_obj.SetPortalFlag(PortalFlag.JAMMED);
                        grate_obj.SetObjectFlag(ObjectFlag.SHOOT_THROUGH);
                        grate_obj.SetObjectFlag(ObjectFlag.SEE_THROUGH);
                        grate_obj.SetObjectFlag(ObjectFlag.CLICK_THROUGH);
                        grate_obj.SetObjectFlag(ObjectFlag.TRANSLUCENT);
                        grate_obj.SetObjectFlag(ObjectFlag.NO_BLOCK);
                        grate_obj.SetObjectFlag(ObjectFlag.NOHEIGHT);
                    }

                    // game.timevent_add( grate_npc_timed_event, (  ), 250, 1 )
                    AttachParticles("Orb-Summon-Earth Elemental", grate_obj);
                    GameSystems.Scroll.ShakeScreen(50, 500);
                    Sound(4180, 1);
                }
            }
        }
    }
    public override bool OnHeartbeat(GameObject attachee, GameObject triggerer)
    {
        if ((!GameSystems.Combat.IsCombatActive()))
        {
            if ((!attachee.HasMet(PartyLeader)))
            {
                if ((is_better_to_talk(attachee, PartyLeader)))
                {
                    if ((!Utilities.critter_is_unconscious(PartyLeader)))
                    {
                        if ((PartyLeader.GetPartyMembers().Any(o => o.HasFollowerByName(8002))))
                        {
                            attachee.TurnTowards(PartyLeader);
                            PartyLeader.BeginDialog(attachee, 70);
                        }
                        else
                        {
                            attachee.TurnTowards(PartyLeader);
                            PartyLeader.BeginDialog(attachee, 1);
                        }
                    }
                }
                else
                {
                    foreach (var obj in ObjList.ListVicinity(attachee.GetLocation(), ObjectListFilter.OLC_PC))
                    {
                        if ((Utilities.is_safe_to_talk(attachee, obj)))
                        {
                            if ((obj.GetPartyMembers().Any(o => o.HasFollowerByName(8002))))
                            {
                                attachee.TurnTowards(obj);
                                obj.BeginDialog(attachee, 70);
                            }
                            else
                            {
                                attachee.TurnTowards(obj);
                                obj.BeginDialog(attachee, 1);
                            }
                        }
                    }
                }
            }
        }

        return(RunDefault);
    }
示例#11
0
    public static void restup()
    {
        foreach (var pc in PartyLeader.GetPartyMembers())
        {
            pc.PendingSpellsToMemorized(); // Memorizes Spells
            pc.SetInt(obj_f.hp_damage, 0); // Removes all damage (doesn't work for companions?)
            if (pc.GetStat(Stat.level_bard) >= 1)
            {
                pc.ResetCastSpells(Stat.level_bard);
            }

            if (pc.GetStat(Stat.level_sorcerer) >= 1)
            {
                pc.ResetCastSpells(Stat.level_sorcerer);
            }
        }
    }
示例#12
0
    public override bool OnEnterCombat(GameObject attachee, GameObject triggerer)
    {
        AttachParticles("DesecrateEarth", attachee);
        foreach (var obj in PartyLeader.GetPartyMembers())
        {
            if (obj.DistanceTo(attachee) <= 60 || attachee.HasLineOfSight(obj))
            {
                if (!obj.HasCondition(SpellEffects.SpellProtectionFromAlignment) && !obj.IsMonsterCategory(MonsterCategory.undead))
                {
                    var alignment = obj.GetAlignment();
                    if (((alignment.IsEvil())))
                    {
                        AttachParticles("Barbarian Rage-end", obj);
                        Utilities.create_item_in_inventory(12752, obj);
                        Utilities.create_item_in_inventory(12752, obj);
                        obj.FloatMesFileLine("mes/combat.mes", 6016);
                    }
                    else if (((alignment.IsGood())))
                    {
                        AttachParticles("Barbarian Rage-end", obj);
                        Utilities.create_item_in_inventory(12750, obj);
                        Utilities.create_item_in_inventory(12750, obj);
                        obj.FloatMesFileLine("mes/combat.mes", 6016);
                    }
                    else if (((alignment.IsLawful())))
                    {
                        AttachParticles("Barbarian Rage-end", obj);
                        Utilities.create_item_in_inventory(12749, obj);
                        Utilities.create_item_in_inventory(12749, obj);
                        obj.FloatMesFileLine("mes/combat.mes", 6016);
                    }
                    else if (((alignment.IsChaotic())))
                    {
                        AttachParticles("Barbarian Rage-end", obj);
                        Utilities.create_item_in_inventory(12751, obj);
                        Utilities.create_item_in_inventory(12751, obj);
                        obj.FloatMesFileLine("mes/combat.mes", 6016);
                    }
                }
            }
        }

        return(RunDefault);
    }
示例#13
0
    public override bool OnDying(GameObject attachee, GameObject triggerer)
    {
        if (CombatStandardRoutines.should_modify_CR(attachee))
        {
            CombatStandardRoutines.modify_CR(attachee, CombatStandardRoutines.get_av_level());
        }

        if ((attachee.GetStat(Stat.subdual_damage) >= 48 && !GetGlobalFlag(813) && attachee.GetMap() == 5080 && attachee.GetStat(Stat.hp_current) >= 1 && !GameSystems.Combat.IsCombatActive()))
        {
            // dice = dice_new("1d1+9")
            // attachee.healsubdual( OBJ_HANDLE_NULL, dice )
            foreach (var target in PartyLeader.GetPartyMembers())
            {
                if ((attachee.GetNameId() == 14262))
                {
                    if ((attachee.DistanceTo(target) <= 30 && target.type == ObjectType.pc))
                    {
                        if ((target.GetSkillLevel(attachee, SkillId.intimidate) >= 10 || target.GetSkillLevel(attachee, SkillId.diplomacy) >= 12 || target.GetSkillLevel(attachee, SkillId.bluff) >= 10))
                        {
                            DetachScript();
                            var dice = Dice.Parse("1d1+9");
                            attachee.HealSubdual(null, dice);
                            attachee.AIRemoveFromShitlist(target);
                            target.BeginDialog(attachee, 1000);
                            return(SkipDefault);
                        }
                        else
                        {
                            DetachScript();
                            var dice = Dice.Parse("1d1+9");
                            attachee.HealSubdual(null, dice);
                            attachee.AIRemoveFromShitlist(target);
                            target.BeginDialog(attachee, 2000);
                            return(SkipDefault);
                        }
                    }
                }
            }
        }

        return(RunDefault);
    }
示例#14
0
    public static bool remove_boroquin(GameObject attachee, GameObject triggerer)
    {
        if (triggerer.GetPartyMembers().Any(o => o.HasFollowerByName(8767)))
        {
            foreach (var npc in PartyLeader.GetPartyMembers())
            {
                if ((npc.GetNameId() == 8767 && npc.GetLeader() != null))
                {
                    triggerer.RemoveFollower(npc);
                    foreach (var pc in GameSystems.Party.PartyMembers)
                    {
                        npc.AIRemoveFromShitlist(pc);
                        npc.SetReaction(pc, 50);
                    }
                }
            }
        }

        SetGlobalVar(549, 1);
        return(RunDefault);
    }
示例#15
0
    // game.particles( "sp-necromancy-conjure", spell.caster )

    public override void OnSpellEffect(SpellPacketBody spell)
    {
        Logger.Info("Harpy Song OnSpellEffect");
        // remove_list = []
        var npc = spell.caster;

        if (npc.GetNameId() == 14243) // Harpy
        {
            spell.dc = 16;
        }

        spell.duration = 5;
        Sound(4187, 1);
        foreach (var target_item in spell.Targets)
        {
            if (!((PartyLeader.GetPartyMembers()).Contains(target_item.Object)))
            {
                continue;
            }

            if (!target_item.Object.SavingThrowSpell(spell.dc, SavingThrowType.Will, D20SavingThrowFlag.NONE, spell.caster, spell.spellId))
            {
                // saving throw unsuccessful
                target_item.Object.FloatMesFileLine("mes/spell.mes", 30002);
                // target_item.obj.condition_add_with_args( 'Fascinate', spell.id, spell.duration, 0 )
                target_item.Object.AddCondition("Captivating Song", spell.spellId, spell.duration, 0, 0, 0, 0, 0, 0);
            }
            else
            {
                // target_item.partsys_id = game.particles( 'sp-Fear-Hit', target_item.obj )
                // saving throw successful
                target_item.Object.FloatMesFileLine("mes/spell.mes", 30001);
            }
        }

        // spell.target_list.remove_list( remove_list )
        spell.EndSpell();
    }
示例#16
0
    public static bool break_free(GameObject npc, int range = 3)
    {
        foreach (var obj in PartyLeader.GetPartyMembers())
        {
            if ((obj.DistanceTo(npc) <= range && obj.GetStat(Stat.hp_current) >= -9))
            {
                return(RunDefault);
            }
        }

        while ((npc.FindItemByName(8903) != null))
        {
            npc.FindItemByName(8903).Destroy();
        }

        if ((npc.D20Query(D20DispatcherKey.QUE_Is_BreakFree_Possible)))
        {
            Utilities.create_item_in_inventory(8903, npc);
            return(true);
        }

        return(false);
    }
示例#17
0
    public bool CheckPrecondition(GameObject npc, GameObject pc, int lineNumber, out string originalScript)
    {
        switch (lineNumber)
        {
        case 4:
        case 5:
            originalScript = "pc.skill_level_get(npc,skill_bluff) >= 5 and anyone(game.party[0].group_list(), \"has_wielded\", 3005)";
            return(pc.GetSkillLevel(npc, SkillId.bluff) >= 5 && PartyLeader.GetPartyMembers().Any(o => o.HasEquippedByName(3005)));

        case 6:
            originalScript = "pc != game.party[0] and game.party[0].distance_to(pc) <= 40 and not critter_is_unconscious(game.party[0]) and anyone(game.party[0].group_list(), \"has_wielded\", 3005)";
            return(pc != PartyLeader && PartyLeader.DistanceTo(pc) <= 40 && !Utilities.critter_is_unconscious(PartyLeader) && PartyLeader.GetPartyMembers().Any(o => o.HasEquippedByName(3005)));

        case 12:
        case 13:
            originalScript = "pc.skill_level_get(npc,skill_intimidate) >= 6";
            return(pc.GetSkillLevel(npc, SkillId.intimidate) >= 6);

        default:
            originalScript = null;
            return(true);
        }
    }
示例#18
0
    public override bool OnStartCombat(GameObject attachee, GameObject triggerer)
    {
        romag_call_help(attachee);
        if ((Utilities.obj_percent_hp(attachee) < 50 && (!attachee.HasMet(triggerer))))
        {
            GameObject found_pc = null;
            foreach (var pc in PartyLeader.GetPartyMembers())
            {
                attachee.AIRemoveFromShitlist(pc);
                if (pc.type == ObjectType.pc)
                {
                    found_pc = pc;
                }
            }

            if (found_pc != null)
            {
                ScriptDaemon.record_time_stamp(501);
                foreach (var pc in PartyLeader.GetPartyMembers())
                {
                    foreach (var npc in ObjList.ListVicinity(attachee.GetLocation(), ObjectListFilter.OLC_NPC))
                    {
                        if ((new[] { 14162, 14163, 14165, 14337, 14339, 14156 }).Contains(npc.GetNameId()) && npc.GetLeader() == null)
                        {
                            npc.AIRemoveFromShitlist(pc);
                        }
                    }
                }

                found_pc.BeginDialog(attachee, 200);
                return(SkipDefault);
            }
        }

        return(RunDefault);
    }
示例#19
0
    public override void OnSpellEffect(SpellPacketBody spell)
    {
        Logger.Info("Doom OnSpellEffect");
        spell.duration = 10 * spell.casterLevel;
        var target = spell.Targets[0];
        var npc    = spell.caster; // added so NPC's will choose valid targets

        if (npc.type != ObjectType.pc && npc.GetLeader() == null)
        {
            if ((target.Object.type == ObjectType.pc || target.Object.type == ObjectType.npc) && !Utilities.critter_is_unconscious(target.Object) && !target.Object.D20Query(D20DispatcherKey.QUE_Prone))
            {
                npc = spell.caster;
            }
            else
            {
                SetGlobalFlag(811, false);
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.DistanceTo(npc) <= 5 && !Utilities.critter_is_unconscious(obj) && !GetGlobalFlag(811) && !obj.D20Query(D20DispatcherKey.QUE_Prone) && (obj.type == ObjectType.pc || obj.type == ObjectType.npc))
                    {
                        target.Object = obj;
                        SetGlobalFlag(811, true);
                    }
                }

                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.DistanceTo(npc) <= 10 && !Utilities.critter_is_unconscious(obj) && !GetGlobalFlag(811) && !obj.D20Query(D20DispatcherKey.QUE_Prone) && (obj.type == ObjectType.pc || obj.type == ObjectType.npc))
                    {
                        target.Object = obj;
                        SetGlobalFlag(811, true);
                    }
                }

                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.DistanceTo(npc) <= 15 && !Utilities.critter_is_unconscious(obj) && !GetGlobalFlag(811) && !obj.D20Query(D20DispatcherKey.QUE_Prone) && (obj.type == ObjectType.pc || obj.type == ObjectType.npc))
                    {
                        target.Object = obj;
                        SetGlobalFlag(811, true);
                    }
                }

                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.DistanceTo(npc) <= 20 && !Utilities.critter_is_unconscious(obj) && !GetGlobalFlag(811) && !obj.D20Query(D20DispatcherKey.QUE_Prone) && (obj.type == ObjectType.pc || obj.type == ObjectType.npc))
                    {
                        target.Object = obj;
                        SetGlobalFlag(811, true);
                    }
                }

                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.DistanceTo(npc) <= 25 && !Utilities.critter_is_unconscious(obj) && !GetGlobalFlag(811) && !obj.D20Query(D20DispatcherKey.QUE_Prone) && (obj.type == ObjectType.pc || obj.type == ObjectType.npc))
                    {
                        target.Object = obj;
                        SetGlobalFlag(811, true);
                    }
                }

                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.DistanceTo(npc) <= 30 && !Utilities.critter_is_unconscious(obj) && !GetGlobalFlag(811) && !obj.D20Query(D20DispatcherKey.QUE_Prone) && (obj.type == ObjectType.pc || obj.type == ObjectType.npc))
                    {
                        target.Object = obj;
                        SetGlobalFlag(811, true);
                    }
                }

                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.DistanceTo(npc) <= 100 && !Utilities.critter_is_unconscious(obj) && !GetGlobalFlag(811) && !obj.D20Query(D20DispatcherKey.QUE_Prone) && (obj.type == ObjectType.pc || obj.type == ObjectType.npc))
                    {
                        target.Object = obj;
                        SetGlobalFlag(811, true);
                    }
                }
            }
        }

        if ((target.Object.type == ObjectType.pc) || (target.Object.type == ObjectType.npc))
        {
            // allow Will saving throw to negate
            if (target.Object.SavingThrowSpell(spell.dc, SavingThrowType.Will, D20SavingThrowFlag.NONE, spell.caster, spell.spellId))
            {
                // saving throw successful
                target.Object.FloatMesFileLine("mes/spell.mes", 30001);
                AttachParticles("Fizzle", target.Object);
                spell.RemoveTarget(target.Object);
            }
            else
            {
                // saving throw unsuccessful
                target.Object.FloatMesFileLine("mes/spell.mes", 30002);
                // HTN - apply condition DOOM
                target.Object.AddCondition("sp-Doom", spell.spellId, spell.duration, 0);
                target.ParticleSystem = AttachParticles("sp-Doom", target.Object);
            }
        }

        spell.EndSpell();
    }
示例#20
0
    public override void OnSpellEffect(SpellPacketBody spell)
    {
        Logger.Info("Command OnSpellEffect");
        spell.duration = 1;
        var target_item = spell.Targets[0];
        var npc         = spell.caster; // added so NPC's will choose valid targets

        // if npc.name == 14424 or npc.name = 8091:			##  added so NPC's will choose valid targets
        if (npc.type != ObjectType.pc && npc.GetLeader() == null)
        {
            if (!target_item.Object.IsMonsterCategory(MonsterCategory.animal) && (GameSystems.Stat.DispatchGetSizeCategory(target_item.Object) < SizeCategory.Large || target_item.Object.IsMonsterCategory(MonsterCategory.humanoid)) && !Utilities.critter_is_unconscious(target_item.Object) && !target_item.Object.D20Query(D20DispatcherKey.QUE_Prone))
            {
                npc = spell.caster;
            }
            else
            {
                SetGlobalFlag(811, false);
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.DistanceTo(npc) <= 5 && !Utilities.critter_is_unconscious(obj) && !obj.IsMonsterCategory(MonsterCategory.animal) && GameSystems.Stat.DispatchGetSizeCategory(obj) < SizeCategory.Large && !GetGlobalFlag(811) && !obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        target_item.Object = obj;
                        SetGlobalFlag(811, true);
                    }
                }

                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.DistanceTo(npc) <= 10 && !Utilities.critter_is_unconscious(obj) && !obj.IsMonsterCategory(MonsterCategory.animal) && GameSystems.Stat.DispatchGetSizeCategory(obj) < SizeCategory.Large && !GetGlobalFlag(811) && !obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        target_item.Object = obj;
                        SetGlobalFlag(811, true);
                    }
                }

                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.DistanceTo(npc) <= 15 && !Utilities.critter_is_unconscious(obj) && !obj.IsMonsterCategory(MonsterCategory.animal) && GameSystems.Stat.DispatchGetSizeCategory(obj) < SizeCategory.Large && !GetGlobalFlag(811) && !obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        target_item.Object = obj;
                        SetGlobalFlag(811, true);
                    }
                }

                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.DistanceTo(npc) <= 20 && !Utilities.critter_is_unconscious(obj) && !obj.IsMonsterCategory(MonsterCategory.animal) && GameSystems.Stat.DispatchGetSizeCategory(obj) < SizeCategory.Large && !GetGlobalFlag(811) && !obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        target_item.Object = obj;
                        SetGlobalFlag(811, true);
                    }
                }

                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.DistanceTo(npc) <= 25 && !Utilities.critter_is_unconscious(obj) && !obj.IsMonsterCategory(MonsterCategory.animal) && GameSystems.Stat.DispatchGetSizeCategory(obj) < SizeCategory.Large && !GetGlobalFlag(811) && !obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        target_item.Object = obj;
                        SetGlobalFlag(811, true);
                    }
                }

                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.DistanceTo(npc) <= 30 && !Utilities.critter_is_unconscious(obj) && !obj.IsMonsterCategory(MonsterCategory.animal) && GameSystems.Stat.DispatchGetSizeCategory(obj) < SizeCategory.Large && !GetGlobalFlag(811) && !obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        target_item.Object = obj;
                        SetGlobalFlag(811, true);
                    }
                }

                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.DistanceTo(npc) <= 100 && !Utilities.critter_is_unconscious(obj) && !obj.IsMonsterCategory(MonsterCategory.animal) && GameSystems.Stat.DispatchGetSizeCategory(obj) < SizeCategory.Large && !GetGlobalFlag(811) && !obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        target_item.Object = obj;
                        SetGlobalFlag(811, true);
                    }
                }
            }
        }

        // Solves Radial menu problem for Wands/NPCs
        var spell_arg = spell.GetMenuArg(RadialMenuParam.MinSetting);

        if (spell_arg != 1 && spell_arg != 2 && spell_arg != 3 && spell_arg != 4)
        {
            spell_arg = 2;
        }

        if (npc.type != ObjectType.pc && npc.GetLeader() == null)
        {
            spell_arg = 2;
        }

        if (!target_item.Object.IsFriendly(spell.caster))
        {
            if ((target_item.Object.type == ObjectType.pc) || (target_item.Object.type == ObjectType.npc))
            {
                if (!target_item.Object.IsMonsterCategory(MonsterCategory.animal))
                {
                    if ((GameSystems.Stat.DispatchGetSizeCategory(target_item.Object) < SizeCategory.Large || target_item.Object.IsMonsterCategory(MonsterCategory.humanoid)))
                    {
                        if (!target_item.Object.SavingThrowSpell(spell.dc, SavingThrowType.Will, D20SavingThrowFlag.NONE, spell.caster, spell.spellId))
                        {
                            // saving throw unsuccessful
                            target_item.Object.FloatMesFileLine("mes/spell.mes", 30002);
                            if (npc.type != ObjectType.pc && npc.GetLeader() == null)
                            {
                                target_item.Object.AddCondition("sp-Command", spell.spellId, spell.duration, 2);
                            }
                            else
                            {
                                // else:			##  added so NPC's can cast Command
                                target_item.Object.AddCondition("sp-Command", spell.spellId, spell.duration, spell_arg);
                            }

                            target_item.ParticleSystem = AttachParticles("sp-Command", target_item.Object);
                        }
                        else
                        {
                            // add target to initiative, just in case
                            // target_item.obj.add_to_initiative()
                            // game.update_combat_ui()
                            // saving throw successful
                            target_item.Object.FloatMesFileLine("mes/spell.mes", 30001);
                            AttachParticles("Fizzle", target_item.Object);
                            spell.RemoveTarget(target_item.Object);
                        }
                    }
                    else
                    {
                        // not medium sized or smaller
                        // Note: I've added an exception for humanoids (i.e. magically enlarged party members) -SA
                        target_item.Object.FloatMesFileLine("mes/spell.mes", 30000);
                        target_item.Object.FloatMesFileLine("mes/spell.mes", 31005);
                        AttachParticles("Fizzle", target_item.Object);
                        spell.RemoveTarget(target_item.Object);
                    }
                }
                else
                {
                    // a monster
                    target_item.Object.FloatMesFileLine("mes/spell.mes", 30000);
                    target_item.Object.FloatMesFileLine("mes/spell.mes", 31004);
                    AttachParticles("Fizzle", target_item.Object);
                    spell.RemoveTarget(target_item.Object);
                }
            }
            else
            {
                // not a person
                target_item.Object.FloatMesFileLine("mes/spell.mes", 30000);
                target_item.Object.FloatMesFileLine("mes/spell.mes", 31001);
                AttachParticles("Fizzle", target_item.Object);
                spell.RemoveTarget(target_item.Object);
            }
        }
        else
        {
            // can't target friendlies
            target_item.Object.FloatMesFileLine("mes/spell.mes", 30003);
            AttachParticles("Fizzle", target_item.Object);
            spell.RemoveTarget(target_item.Object);
        }

        spell.EndSpell();
    }
示例#21
0
    public override bool OnFirstHeartbeat(GameObject attachee, GameObject triggerer)
    {
        if ((!GetGlobalFlag(500)))
        {
            attachee.SetObjectFlag(ObjectFlag.OFF);
        }
        else
        {
            if ((attachee.GetLeader() == null))
            {
                if ((attachee.GetMap() == 5011))
                {
                    if ((GetGlobalVar(501) == 4 || GetGlobalVar(501) == 5 || GetGlobalVar(501) == 6 || GetGlobalVar(510) == 2))
                    {
                        attachee.SetObjectFlag(ObjectFlag.OFF);
                    }
                    else
                    {
                        attachee.ClearObjectFlag(ObjectFlag.OFF);
                    }
                }
                else if ((attachee.GetMap() == 5013))
                {
                    if ((GetGlobalVar(510) != 2))
                    {
                        if ((GetGlobalVar(501) == 4 || GetGlobalVar(501) == 5 || GetGlobalVar(501) == 6))
                        {
                            attachee.ClearObjectFlag(ObjectFlag.OFF);
                        }
                    }
                    else
                    {
                        attachee.SetObjectFlag(ObjectFlag.OFF);
                    }
                }
            }

            var finale = attachee.GetInt(obj_f.npc_pad_i_5);
            if (((PartyLeader.GetPartyMembers().Any(o => o.HasFollowerByName(8025))) || (PartyLeader.GetPartyMembers().Any(o => o.HasFollowerByName(8026))))) // Tuelk and Pintark
            {
                SetGlobalVar(693, 2);
            }

            var half_orc   = false;
            var Grummshite = false;
            foreach (var pc in GameSystems.Party.PartyMembers)
            {
                if (pc.GetRace() == RaceId.half_orc)
                {
                    half_orc = true;
                }

                if ((pc.GetDeity() == DeityId.GRUUMSH && pc.GetStat(Stat.level_cleric) >= 1))
                {
                    Grummshite = true;
                }
            }

            if (half_orc)
            {
                SetGlobalVar(693, 1);
            }

            if (Grummshite)
            {
                SetGlobalVar(693, 3);
            }
        }

        return(RunDefault);
    }
示例#22
0
    public override bool OnEnterCombat(GameObject attachee, GameObject triggerer)
    {
        if (SelectedPartyLeader.GetPartyMembers().Any(o => o.HasFollowerByName(8730)))
        {
            var ron = Utilities.find_npc_near(SelectedPartyLeader, 8730);
            if (ron != null)
            {
                SelectedPartyLeader.RemoveFollower(ron);
            }
        }

        if ((!GetGlobalFlag(816) && !GetGlobalFlag(818)))
        {
            SetGlobalFlag(818, true);
            foreach (var target in PartyLeader.GetPartyMembers())
            {
                if ((target.GetNameId() != 8072 && attachee.DistanceTo(target) <= 20 && target.type == ObjectType.pc))
                {
                    attachee.TurnTowards(target);
                    target.BeginDialog(attachee, 2000);
                    return(SkipDefault);
                }
            }

            attachee.FloatLine(2010, triggerer);
            var terjonLoc = attachee.GetLocation();
            terjonLoc.locx -= 4;
            var terjon = GameSystems.MapObject.CreateObject(14007, terjonLoc);
            AttachParticles("sp-Dimension Door", terjon);
            terjon.TurnTowards(attachee);
            var calmert = attachee.GetInitiative();
            terjon.AddToInitiative();
            terjon.SetInitiative(calmert);
            UiSystems.Combat.Initiative.UpdateIfNeeded();
            terjon.Attack(triggerer);
        }

        foreach (var npc in PartyLeader.GetPartyMembers())
        {
            if ((npc.GetNameId() == 8072 && npc.GetLeader() != null && !GetGlobalFlag(819)))
            {
                var curr = npc.GetStat(Stat.hp_current);
                if ((curr >= 1))
                {
                    foreach (var target in PartyLeader.GetPartyMembers())
                    {
                        if ((target.GetNameId() != 8072 && npc.DistanceTo(target) <= 20 && target.type == ObjectType.pc))
                        {
                            npc.TurnTowards(target);
                            target.BeginDialog(npc, 1000);
                            return(SkipDefault);
                        }
                    }
                }
            }
        }

        if (triggerer.GetPartyMembers().Any(o => o.HasFollowerByName(8000)))
        {
            var elmo = Utilities.find_npc_near(triggerer, 8000);
            if ((elmo != null))
            {
                triggerer.RemoveFollower(elmo);
                elmo.FloatLine(12021, triggerer);
                elmo.Attack(triggerer);
            }
        }

        if (triggerer.GetPartyMembers().Any(o => o.HasFollowerByName(8001)))
        {
            var paida = Utilities.find_npc_near(triggerer, 8001);
            if ((paida != null))
            {
                triggerer.RemoveFollower(paida);
                paida.FloatLine(12021, triggerer);
                paida.Attack(triggerer);
            }
        }

        if (triggerer.GetPartyMembers().Any(o => o.HasFollowerByName(8014)))
        {
            var otis = Utilities.find_npc_near(triggerer, 8014);
            if ((otis != null))
            {
                triggerer.RemoveFollower(otis);
                otis.FloatLine(12021, triggerer);
                otis.Attack(triggerer);
            }
        }

        if (triggerer.GetPartyMembers().Any(o => o.HasFollowerByName(8015)))
        {
            var meleny = Utilities.find_npc_near(triggerer, 8015);
            if ((meleny != null))
            {
                triggerer.RemoveFollower(meleny);
                meleny.FloatLine(12021, triggerer);
                meleny.Attack(triggerer);
            }
        }

        if (triggerer.GetPartyMembers().Any(o => o.HasFollowerByName(8021)))
        {
            var ydey = Utilities.find_npc_near(triggerer, 8021);
            if ((ydey != null))
            {
                triggerer.RemoveFollower(ydey);
                ydey.FloatLine(12021, triggerer);
                ydey.Attack(triggerer);
            }
        }

        if (triggerer.GetPartyMembers().Any(o => o.HasFollowerByName(8022)))
        {
            var murfles = Utilities.find_npc_near(triggerer, 8022);
            if ((murfles != null))
            {
                triggerer.RemoveFollower(murfles);
                murfles.FloatLine(12021, triggerer);
                murfles.Attack(triggerer);
            }
        }

        if (triggerer.GetPartyMembers().Any(o => o.HasFollowerByName(8031)))
        {
            var thrommel = Utilities.find_npc_near(triggerer, 8031);
            if ((thrommel != null))
            {
                triggerer.RemoveFollower(thrommel);
                thrommel.FloatLine(12021, triggerer);
                thrommel.Attack(triggerer);
            }
        }

        if (triggerer.GetPartyMembers().Any(o => o.HasFollowerByName(8039)))
        {
            var taki = Utilities.find_npc_near(triggerer, 8039);
            if ((taki != null))
            {
                triggerer.RemoveFollower(taki);
                taki.FloatLine(12021, triggerer);
                taki.Attack(triggerer);
            }
        }

        if (triggerer.GetPartyMembers().Any(o => o.HasFollowerByName(8054)))
        {
            var burne = Utilities.find_npc_near(triggerer, 8054);
            if ((burne != null))
            {
                triggerer.RemoveFollower(burne);
                burne.FloatLine(12021, triggerer);
                burne.Attack(triggerer);
            }
        }

        if (triggerer.GetPartyMembers().Any(o => o.HasFollowerByName(8060)))
        {
            var morgan = Utilities.find_npc_near(triggerer, 8060);
            if ((morgan != null))
            {
                triggerer.RemoveFollower(morgan);
                morgan.FloatLine(12021, triggerer);
                morgan.Attack(triggerer);
            }
        }

        if (triggerer.GetPartyMembers().Any(o => o.HasFollowerByName(8069)))
        {
            var pishella = Utilities.find_npc_near(triggerer, 8069);
            if ((pishella != null))
            {
                triggerer.RemoveFollower(pishella);
                pishella.FloatLine(12021, triggerer);
                pishella.Attack(triggerer);
            }
        }

        if (triggerer.GetPartyMembers().Any(o => o.HasFollowerByName(8071)))
        {
            var rufus = Utilities.find_npc_near(triggerer, 8071);
            if ((rufus != null))
            {
                triggerer.RemoveFollower(rufus);
                rufus.FloatLine(12021, triggerer);
                rufus.Attack(triggerer);
            }
        }

        if (triggerer.GetPartyMembers().Any(o => o.HasFollowerByName(8714)))
        {
            var holly = Utilities.find_npc_near(triggerer, 8714);
            if ((holly != null))
            {
                triggerer.RemoveFollower(holly);
                holly.FloatLine(1000, triggerer);
                holly.Attack(triggerer);
            }
        }

        return(RunDefault);
    }
    public override void OnSpellEffect(SpellPacketBody spell)
    {
        Logger.Info("Inflict Moderate Wounds OnSpellEffect");
        var dice = Dice.Parse("2d8");

        dice = dice.WithModifier(Math.Min(10, spell.casterLevel));
        var target = spell.Targets[0];
        var npc    = spell.caster; // added so NPC's will choose valid targets

        if (npc.type != ObjectType.pc && npc.GetLeader() == null)
        {
            if (!Utilities.critter_is_unconscious(target.Object) && !target.Object.D20Query(D20DispatcherKey.QUE_Prone))
            {
                npc = spell.caster;
            }
            else
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.DistanceTo(npc) <= 10 && !Utilities.critter_is_unconscious(obj) && !obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        target.Object = obj;
                    }
                }
            }
        }

        // check if target is friendly (willing target)
        if (target.Object.IsFriendly(spell.caster))
        {
            // check if target is undead
            if (target.Object.IsMonsterCategory(MonsterCategory.undead))
            {
                target.Object.HealFromSpell(spell.caster, dice, D20ActionType.CAST_SPELL, spell.spellId);
            }
            else
            {
                // damage target
                if (target.Object.SavingThrowSpell(spell.dc, SavingThrowType.Will, D20SavingThrowFlag.NONE, spell.caster, spell.spellId))
                {
                    target.Object.FloatMesFileLine("mes/spell.mes", 30001);
                    // saving throw succesful, damage target, 1/2 damage
                    target.Object.DealReducedSpellDamage(spell.caster, DamageType.NegativeEnergy, dice, D20AttackPower.UNSPECIFIED, DAMAGE_REDUCTION_HALF, D20ActionType.CAST_SPELL, spell.spellId);
                }
                else
                {
                    target.Object.FloatMesFileLine("mes/spell.mes", 30002);
                    // saving throw unsuccesful, damage target, full damage
                    target.Object.DealSpellDamage(spell.caster, DamageType.NegativeEnergy, dice, D20AttackPower.UNSPECIFIED, D20ActionType.CAST_SPELL, spell.spellId);
                }
            }
        }
        else
        {
            var attack_result = spell.caster.PerformTouchAttack(target.Object);
            if ((attack_result & D20CAF.HIT) != D20CAF.NONE)
            {
                // check if target is undead
                if (target.Object.IsMonsterCategory(MonsterCategory.undead))
                {
                    // check saving throw, heal target
                    if (target.Object.SavingThrowSpell(spell.dc, SavingThrowType.Will, D20SavingThrowFlag.NONE, spell.caster, spell.spellId))
                    {
                        // target.obj.float_mesfile_line( 'mes\\spell.mes', 30001 )
                        // saving throw succesful, heal target, 1/2 heal
                        target.Object.HealFromSpell(spell.caster, dice, D20ActionType.CAST_SPELL, spell.spellId);
                    }
                    else
                    {
                        // target.obj.float_mesfile_line( 'mes\\spell.mes', 30002 )
                        // saving throw unsuccesful, heal target, full heal
                        target.Object.HealFromSpell(spell.caster, dice, D20ActionType.CAST_SPELL, spell.spellId);
                    }
                }
                else
                {
                    // check saving throw, damage target
                    if (target.Object.SavingThrowSpell(spell.dc, SavingThrowType.Will, D20SavingThrowFlag.NONE, spell.caster, spell.spellId))
                    {
                        target.Object.FloatMesFileLine("mes/spell.mes", 30001);
                        // saving throw succesful, damage target, 1/2 damage
                        target.Object.DealSpellDamage(spell.caster, DamageType.NegativeEnergy, dice, D20AttackPower.UNSPECIFIED, DAMAGE_REDUCTION_HALF, D20ActionType.CAST_SPELL, spell.spellId, attack_result, 0);
                    }
                    else
                    {
                        target.Object.FloatMesFileLine("mes/spell.mes", 30002);
                        // saving throw unsuccesful, damage target, full damage
                        target.Object.DealSpellDamage(spell.caster, DamageType.NegativeEnergy, dice, D20AttackPower.UNSPECIFIED, 100, D20ActionType.CAST_SPELL, spell.spellId, attack_result, 0);
                    }
                }
            }
        }

        AttachParticles("sp-Inflict Moderate Wounds", target.Object);
        spell.RemoveTarget(target.Object);
        spell.EndSpell();
    }
示例#24
0
    public override bool OnHeartbeat(GameObject attachee, GameObject triggerer)
    {
        SetGlobalVar(726, GetGlobalVar(726) + 1);
        if ((GameSystems.Combat.IsCombatActive()))
        {
            return(RunDefault);
        }

        if ((attachee.GetLeader() == null && (!attachee.HasEquippedByName(1) || !attachee.HasEquippedByName(4071))))
        {
            attachee.WieldBestInAllSlots();
            attachee.WieldBestInAllSlots();
        }

        if ((GetGlobalVar(726) == 1 && attachee.GetLeader() == null && (PartyAlignment == Alignment.LAWFUL_NEUTRAL || PartyAlignment == Alignment.LAWFUL_EVIL || PartyAlignment == Alignment.LAWFUL_GOOD || PartyAlignment == Alignment.NEUTRAL)))
        {
            attachee.CastSpell(WellKnownSpells.DetectLaw, attachee);
            attachee.PendingSpellsToMemorized();
        }

        if ((GetGlobalVar(726) == 1 && attachee.GetLeader() == null && (PartyAlignment == Alignment.CHAOTIC_NEUTRAL || PartyAlignment == Alignment.CHAOTIC_GOOD || PartyAlignment == Alignment.CHAOTIC_EVIL)))
        {
            attachee.CastSpell(WellKnownSpells.DetectChaos, attachee);
            attachee.PendingSpellsToMemorized();
        }

        if ((GetGlobalVar(726) == 1 && PartyAlignment == Alignment.NEUTRAL_GOOD && attachee.GetLeader() == null))
        {
            attachee.CastSpell(WellKnownSpells.DetectGood, attachee);
            attachee.PendingSpellsToMemorized();
        }

        if ((GetGlobalVar(726) == 1 && PartyAlignment == Alignment.NEUTRAL_EVIL && attachee.GetLeader() == null))
        {
            attachee.CastSpell(WellKnownSpells.DetectEvil, attachee);
            attachee.PendingSpellsToMemorized();
        }

        foreach (var obj in PartyLeader.GetPartyMembers())
        {
            if ((attachee.DistanceTo(obj) <= 10 && GetGlobalVar(726) == 5))
            {
                if ((attachee.GetLeader() == null && (PartyAlignment == Alignment.LAWFUL_NEUTRAL || PartyAlignment == Alignment.LAWFUL_EVIL || PartyAlignment == Alignment.LAWFUL_GOOD || PartyAlignment == Alignment.NEUTRAL)))
                {
                    attachee.CastSpell(WellKnownSpells.MagicCircleAgainstLaw, attachee);
                    attachee.PendingSpellsToMemorized();
                }
            }
        }

        // return RUN_DEFAULT
        foreach (var obj in PartyLeader.GetPartyMembers())
        {
            if ((attachee.DistanceTo(obj) <= 10 && GetGlobalVar(726) == 5))
            {
                if ((attachee.GetLeader() == null && (PartyAlignment == Alignment.CHAOTIC_NEUTRAL || PartyAlignment == Alignment.CHAOTIC_GOOD || PartyAlignment == Alignment.CHAOTIC_EVIL)))
                {
                    attachee.CastSpell(WellKnownSpells.MagicCircleAgainstChaos, attachee);
                    attachee.PendingSpellsToMemorized();
                }
            }
        }

        // return RUN_DEFAULT
        foreach (var obj in PartyLeader.GetPartyMembers())
        {
            if ((attachee.DistanceTo(obj) <= 10 && GetGlobalVar(726) == 5))
            {
                if ((PartyAlignment == Alignment.NEUTRAL_GOOD && attachee.GetLeader() == null))
                {
                    attachee.CastSpell(WellKnownSpells.MagicCircleAgainstGood, attachee);
                    attachee.PendingSpellsToMemorized();
                }
            }
        }

        // return RUN_DEFAULT
        foreach (var obj in PartyLeader.GetPartyMembers())
        {
            if ((attachee.DistanceTo(obj) <= 10 && GetGlobalVar(726) == 5))
            {
                if ((PartyAlignment == Alignment.NEUTRAL_EVIL && attachee.GetLeader() == null))
                {
                    attachee.CastSpell(WellKnownSpells.MagicCircleAgainstEvil, attachee);
                    attachee.PendingSpellsToMemorized();
                }
            }
        }

        // return RUN_DEFAULT
        if ((GetGlobalVar(726) >= 200))
        {
            SetGlobalVar(726, 0);
        }

        return(RunDefault);
    }
示例#25
0
    public override bool OnStartCombat(GameObject attachee, GameObject triggerer)
    {
        var webbed = Livonya.break_free(attachee, 3);

        // MELEE TROOPS  #
        // dumb guys - orc rundors, gnoll troops, ettin troops, stone giant troops, hill giant troops  #
        if ((attachee.GetNameId() == 8896 || attachee.GetNameId() == 8897 || attachee.GetNameId() == 8898 || attachee.GetNameId() == 8904 || attachee.GetNameId() == 8905 || attachee.GetNameId() == 8906 || attachee.GetNameId() == 8907 || attachee.GetNameId() == 8908 || attachee.GetNameId() == 8619 || attachee.GetNameId() == 8620 || attachee.GetNameId() == 8621))
        {
            var leader = attachee.GetLeader();
            if ((Utilities.group_percent_hp(leader) >= 51))
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 545);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 547);
                    }
                }
            }
            else if ((Utilities.group_percent_hp(leader) <= 50))
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 545);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 546);
                    }
                }
            }
        }
        // dumb guys with rage - bugbear troops, orc fighters, ogre troops  #
        else if ((attachee.GetNameId() == 8911 || attachee.GetNameId() == 8614 || attachee.GetNameId() == 8615 || attachee.GetNameId() == 8618))
        {
            var leader = attachee.GetLeader();
            if ((Utilities.group_percent_hp(leader) >= 51))
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 560);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 559);
                    }
                }
            }
            else if ((Utilities.group_percent_hp(leader) <= 50))
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 560);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 561);
                    }
                }
            }
        }
        // smart guys - kallop, boonthag, naig lliht  #
        else if ((attachee.GetNameId() == 8815 || attachee.GetNameId() == 8816 || attachee.GetNameId() == 8813))
        {
            var leader = attachee.GetLeader();
            if ((Utilities.group_percent_hp(leader) >= 51))
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 545);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 550);
                    }
                }
            }
            else if ((Utilities.group_percent_hp(leader) <= 50))
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 545);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 546);
                    }
                }
            }
        }
        // smart guys with rage - hungous, orc trainer, ergo  #
        else if ((attachee.GetNameId() == 8803 || attachee.GetNameId() == 8922 || attachee.GetNameId() == 8814 || attachee.GetNameId() == 8617))
        {
            var leader = attachee.GetLeader();
            if ((Utilities.group_percent_hp(leader) >= 51))
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 560);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 558);
                    }
                }
            }
            else if ((Utilities.group_percent_hp(leader) <= 50))
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 560);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 561);
                    }
                }
            }
        }
        // mage seekers - krunch  #
        else if ((attachee.GetNameId() == 8802))
        {
            var leader = attachee.GetLeader();
            if ((Utilities.group_percent_hp(leader) >= 51))
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 545);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 548);
                    }
                }
            }
            else if ((Utilities.group_percent_hp(leader) <= 50))
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 545);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 546);
                    }
                }
            }
        }
        // mage seekers with rage - orc murderer, orc dominator  #
        else if ((attachee.GetNameId() == 8895))
        {
            var leader = attachee.GetLeader();
            if ((Utilities.group_percent_hp(leader) >= 51))
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 560);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 562);
                    }
                }
            }
            else if ((Utilities.group_percent_hp(leader) <= 50))
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 560);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 561);
                    }
                }
            }
        }
        // archery seekers - nobody atm  #
        // elif (attachee.name == xxxxx or attachee.name == xxxxx):
        // leader = attachee.leader_get()
        // if (group_percent_hp(leader) >= 51):
        // for obj in game.party[0].group_list():
        // if obj.d20_query(Q_Prone):
        // attachee.obj_set_int(obj_f_critter_strategy, 545)
        // else:
        // attachee.obj_set_int(obj_f_critter_strategy, 549)
        // elif (group_percent_hp(leader) <= 50):
        // for obj in game.party[0].group_list():
        // if obj.d20_query(Q_Prone):
        // attachee.obj_set_int(obj_f_critter_strategy, 545)
        // else:
        // attachee.obj_set_int(obj_f_critter_strategy, 546)
        // archery seekers with rage - orc sergeant, ruff  #
        else if ((attachee.GetNameId() == 8817 || attachee.GetNameId() == 8894))
        {
            var leader = attachee.GetLeader();
            if ((Utilities.group_percent_hp(leader) >= 51))
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 560);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 563);
                    }
                }
            }
            else if ((Utilities.group_percent_hp(leader) <= 50))
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 560);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 561);
                    }
                }
            }
        }
        // flankers - nobody atm  #
        // elif (attachee.name == xxxxx):
        // leader = attachee.leader_get()
        // if (group_percent_hp(leader) >= 51):
        // for obj in game.party[0].group_list():
        // if obj.d20_query(Q_Prone):
        // attachee.obj_set_int(obj_f_critter_strategy, 545)
        // else:
        // attachee.obj_set_int(obj_f_critter_strategy, 556)
        // elif (group_percent_hp(leader) <= 50):
        // for obj in game.party[0].group_list():
        // if obj.d20_query(Q_Prone):
        // attachee.obj_set_int(obj_f_critter_strategy, 545)
        // else:
        // attachee.obj_set_int(obj_f_critter_strategy, 553)
        // flankers with rage - orc assassin  #
        else if ((attachee.GetNameId() == 8616))
        {
            var leader = attachee.GetLeader();
            if ((Utilities.group_percent_hp(leader) >= 51))
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 560);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 564);
                    }
                }
            }
            else if ((Utilities.group_percent_hp(leader) <= 50))
            {
                foreach (var obj in PartyLeader.GetPartyMembers())
                {
                    if (obj.D20Query(D20DispatcherKey.QUE_Prone))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 560);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 561);
                    }
                }
            }
        }
        // concealed guys - ettins  #
        else if ((attachee.GetNameId() == 8912 || attachee.GetNameId() == 8913 || attachee.GetNameId() == 8914 || attachee.GetNameId() == 8915 || attachee.GetNameId() == 8916))
        {
            if ((Utilities.obj_percent_hp(attachee) <= 75))
            {
                attachee.SetInt(obj_f.critter_strategy, 547);
            }
            else if ((Utilities.obj_percent_hp(attachee) >= 76))
            {
                foreach (var obj in ObjList.ListVicinity(attachee.GetLocation(), ObjectListFilter.OLC_PC))
                {
                    if ((is_close(attachee, obj)))
                    {
                        attachee.SetInt(obj_f.critter_strategy, 547);
                    }
                    else
                    {
                        attachee.SetInt(obj_f.critter_strategy, 565);
                    }
                }
            }
        }
        // RANGED TROOPS  #
        // dumb guys - orc bowmen  #
        else if ((attachee.GetNameId() == 8899 || attachee.GetNameId() == 8900 || attachee.GetNameId() == 8917 || attachee.GetNameId() == 8918))
        {
            var leader = attachee.GetLeader();
            if ((Utilities.group_percent_hp(leader) >= 51))
            {
                attachee.SetInt(obj_f.critter_strategy, 552);
            }
            else if ((Utilities.group_percent_hp(leader) <= 50))
            {
                attachee.SetInt(obj_f.critter_strategy, 553);
            }
        }
        // smart guys - orc archers  #
        else if ((attachee.GetNameId() == 8901 || attachee.GetNameId() == 8902 || attachee.GetNameId() == 8919))
        {
            var leader = attachee.GetLeader();
            if ((Utilities.group_percent_hp(leader) >= 51))
            {
                attachee.SetInt(obj_f.critter_strategy, 551);
            }
            else if ((Utilities.group_percent_hp(leader) <= 50))
            {
                attachee.SetInt(obj_f.critter_strategy, 553);
            }
        }
        // mage seekers - orc snipers  #
        else if ((attachee.GetNameId() == 8903))
        {
            var leader = attachee.GetLeader();
            if ((Utilities.group_percent_hp(leader) >= 51))
            {
                attachee.SetInt(obj_f.critter_strategy, 555);
            }
            else if ((Utilities.group_percent_hp(leader) <= 50))
            {
                attachee.SetInt(obj_f.critter_strategy, 553);
            }
        }

        // archery seekers - nobody atm  #
        // elif (attachee.name == xxxxx):
        // leader = attachee.leader_get()
        // if (group_percent_hp(leader) >= 51):
        // attachee.obj_set_int(obj_f_critter_strategy, 554)
        // elif (group_percent_hp(leader) <= 50):
        // attachee.obj_set_int(obj_f_critter_strategy, 553)
        // spell responders - orc marksmen  #
        // elif (attachee.name == 14749):
        // for obj in game.party[0].group_list():
        // if (obj.stat_level_get(stat_level_wizard) >= 1 or obj.stat_level_get(stat_level_sorcerer) >= 1 or obj.stat_level_get(stat_level_druid) >= 1 or obj.stat_level_get(stat_level_bard) >= 1):
        // leader = attachee.leader_get()
        // if (group_percent_hp(leader) >= 34):
        // attachee.obj_set_int(obj_f_critter_strategy, 557)
        // elif (group_percent_hp(leader) <= 33):
        // attachee.obj_set_int(obj_f_critter_strategy, 553)
        // else:
        // leader = attachee.leader_get()
        // if (group_percent_hp(leader) >= 34):
        // attachee.obj_set_int(obj_f_critter_strategy, 554)
        // elif (group_percent_hp(leader) <= 33):
        // attachee.obj_set_int(obj_f_critter_strategy, 553)
        return(RunDefault);
    }
示例#26
0
    public override bool OnStartCombat(GameObject attachee, GameObject triggerer)
    {
        var leader = SelectedPartyLeader;

        if ((!attachee.HasMet(leader)) && (!GetGlobalFlag(164))) // Smigmal attacks first time party visits
        {
            SetCounter(0, GetCounter(0) + 1);
            if (((GetCounter(0) >= 2) && (Utilities.group_percent_hp(leader) > 30) && (!GetGlobalFlag(852))))
            {
                foreach (var pc in GameSystems.Party.PartyMembers)
                {
                    if (pc.type == ObjectType.pc)
                    {
                        attachee.AIRemoveFromShitlist(pc);
                    }
                }

                SetGlobalFlag(852, true);
                leader.BeginDialog(attachee, 1);
                // game.new_sid = 0	## removed by Livonya
                return(SkipDefault);
            }
        }
        else if ((!attachee.HasMet(leader)) && (GetGlobalFlag(164))) // Smigmal attacks if Falrinth has been confronted and is away but Smigmal has not yet been met
        {
            SetCounter(0, GetCounter(0) + 1);
            if (((GetCounter(0) >= 1) && (Utilities.group_percent_hp(leader) > 30) && (!GetGlobalFlag(996))))
            {
                foreach (var pc in GameSystems.Party.PartyMembers)
                {
                    if (pc.type == ObjectType.pc)
                    {
                        attachee.AIRemoveFromShitlist(pc);
                    }
                }

                SetGlobalFlag(996, true);
                leader.BeginDialog(attachee, 130);
                // game.new_sid = 0	## removed by Livonya
                return(SkipDefault);
            }
        }
        else if ((attachee.HasMet(leader)) && (GetGlobalFlag(167))) // Smigmal attacks if she has been met, then Falrinth has been confronted and left, and now both are back
        {
            SetCounter(0, GetCounter(0) + 1);
            if (((GetCounter(0) >= 4) && (Utilities.group_percent_hp(leader) > 30) && (!GetGlobalFlag(996))))
            {
                foreach (var pc in GameSystems.Party.PartyMembers)
                {
                    if (pc.type == ObjectType.pc)
                    {
                        attachee.AIRemoveFromShitlist(pc);
                    }
                }

                SetGlobalFlag(996, true);
                leader.BeginDialog(attachee, 120);
                // game.new_sid = 0	## removed by Livonya
                return(SkipDefault);
            }
        }

        // THIS IS USED FOR BREAK FREE
        foreach (var obj in PartyLeader.GetPartyMembers())
        {
            if ((obj.DistanceTo(attachee) <= 3 && obj.GetStat(Stat.hp_current) >= -9))
            {
                return(RunDefault);
            }
        }

        while ((attachee.FindItemByName(8903) != null))
        {
            attachee.FindItemByName(8903).Destroy();
        }

        // if (attachee.d20_query(Q_Is_BreakFree_Possible)): # workaround no longer necessary!
        // create_item_in_inventory( 8903, attachee )
        // attachee.d20_send_signal(S_BreakFree)
        return(RunDefault);
    }
示例#27
0
    public bool OnStartCombat(GameObject attachee, GameObject triggerer, bool generated_from_timed_event_call, int talk_stage)
    {
        if (attachee.IsUnconscious())
        {
            return(RunDefault);
        }

        // if !generated_from_timed_event_call and attachee.distance_to( party_closest(attachee) ) > 45:
        // attachee.move( party_closest(attachee).location, 0 , 0)
        // for pp in range(0, 41):
        // attachee.scripts[pp] = 998
        // game.leader.ai_follower_add(attachee)
        // #game.timevent_add( lareth_abandon, (attachee, triggerer), 20, 1)
        var curr = attachee.GetStat(Stat.hp_current) - attachee.GetStat(Stat.subdual_damage);
        var maxx = attachee.GetStat(Stat.hp_max);
        var xx   = attachee.GetLocation() & (65535);
        var hp_percent_lareth = 100 * curr / maxx;
        var ggv400            = GetGlobalVar(400);
        var ggv401            = GetGlobalVar(401);
        var pad3 = attachee.GetInt(obj_f.npc_pad_i_3);

        if ((attachee.GetMap() == 5005) && (party_too_far_from_lareth(attachee)) && !generated_from_timed_event_call)
        {
            if (((pad3 & 0x4) == 0))
            {
                // Delay for one round, letting him cast Shield of Faith - he'll need it :)
                pad3 |= 0x4;
                attachee.SetInt(obj_f.npc_pad_i_3, pad3);
                return(RunDefault);
            }

            // Party is too far from Lareth, gotta nudge him in the right direction
            // spawn a beacon and change Lareth's strat to approach it
            locXY beacon_loc;
            if (xx > 478)
            {
                beacon_loc = new locXY(498, 550);
            }
            else
            {
                beacon_loc = new locXY(487, 540);
            }

            var obj_beacon = GameSystems.MapObject.CreateObject(14074, beacon_loc);
            obj_beacon.SetObjectFlag(ObjectFlag.DONTDRAW);
            obj_beacon.SetObjectFlag(ObjectFlag.CLICK_THROUGH);
            obj_beacon.Move(beacon_loc, 0, 0);
            obj_beacon.SetBaseStat(Stat.dexterity, -30);
            obj_beacon.SetInt(obj_f.npc_pad_i_3, 0x100);
            obj_beacon.Attack(SelectedPartyLeader);
            obj_beacon.AddToInitiative();
            attachee.SetInt(obj_f.pad_i_0, attachee.GetInt(obj_f.critter_strategy)); // Record original strategy
            attachee.SetInt(obj_f.critter_strategy, 80);                             // set Lareth's strat to "seek beacon"
            var grease_detected = false;
            foreach (var spell_obj in ObjList.ListCone(attachee, ObjectListFilter.OLC_GENERIC, 40, 0, 360))
            {
                // Check for active GREASE spell object
                if (spell_obj.GetInt(obj_f.secretdoor_dc) == 200 + (1 << 15))
                {
                    grease_detected = true;
                }
            }

            if (grease_detected)
            {
                // In case Lareth slips and doesn't execute his san_end_combat (wherein the beacon object is destroyed) - spawn a couple of timed events to guarantee the beacon doesn't survive
                StartTimer(3700, () => kill_beacon_obj(obj_beacon, attachee), true);
                StartTimer(3900, () => kill_beacon_obj(obj_beacon, attachee), true);
            }

            return(RunDefault);
        }

        // strategy 81 - Approach Party strategy
        if (attachee.GetInt(obj_f.critter_strategy) == 81 && !generated_from_timed_event_call)
        {
            if (ScriptDaemon.can_see_party(attachee))
            {
                attachee.SetInt(obj_f.critter_strategy, 82);
            }
        }

        if (attachee.GetInt(obj_f.critter_strategy) != 81 && !generated_from_timed_event_call)
        {
            // Should Lareth cast Obscuring Mist?
            // First, find closest party member - the most likely target for an archer
            var closest_pc_1 = SelectedPartyLeader;
            foreach (var pc in PartyLeader.GetPartyMembers())
            {
                if (pc.DistanceTo(attachee) < closest_pc_1.DistanceTo(attachee))
                {
                    closest_pc_1 = pc;
                }
            }

            // Then, check for spell objects with the Obscuring Mist ID, which are also identified as active
            var player_in_obscuring_mist = 0;
            foreach (var spell_obj in ObjList.ListCone(closest_pc_1, ObjectListFilter.OLC_GENERIC, 30, 0, 360))
            {
                if (spell_obj.GetInt(obj_f.secretdoor_dc) == 333 + (1 << 15) && spell_obj.DistanceTo(closest_pc_1) <= 17.5f)
                {
                    player_in_obscuring_mist = 1;
                }
            }

            var player_cast_web      = false;
            var player_cast_entangle = false;
            foreach (var spell_obj in ObjList.ListVicinity(attachee.GetLocation(), ObjectListFilter.OLC_GENERIC))
            {
                if (spell_obj.GetInt(obj_f.secretdoor_dc) == 531 + (1 << 15))
                {
                    player_cast_web = true;
                }

                if (spell_obj.GetInt(obj_f.secretdoor_dc) == 153 + (1 << 15))
                {
                    player_cast_entangle = true;
                }
            }

            // Assess level of ranged weapon threat
            var ranged_threat = 0;
            foreach (var pc in PartyLeader.GetPartyMembers())
            {
                var pc_weap = pc.ItemWornAt(EquipSlot.WeaponPrimary).GetInt(obj_f.weapon_type);
                if ((new[] { 14, 17, 46, 48, 68 }).Contains(pc_weap) && !pc.IsUnconscious())
                {
                    // 14 - light crossbow
                    // 17 - heavy crossbow
                    // 46 - shortbow
                    // 48 - longbow
                    // 68 - repeating crossbow
                    if (ranged_threat == 0)
                    {
                        ranged_threat = 1;
                    }

                    if (pc.HasFeat(FeatId.POINT_BLANK_SHOT) || (pc.GetStat(Stat.level_fighter) + pc.GetStat(Stat.level_ranger)) >= 1)
                    {
                        if (ranged_threat < 2)
                        {
                            ranged_threat = 2;
                        }
                    }

                    if (pc.HasFeat(FeatId.PRECISE_SHOT) && (pc.GetStat(Stat.level_fighter) + pc.GetStat(Stat.level_ranger)) >= 1)
                    {
                        if (ranged_threat < 3)
                        {
                            ranged_threat = 3;
                        }
                    }
                }
            }

            if ((attachee.GetMap() == 5005 && xx > 478) && (((ggv401 >> 25) & 3) == 0) && ((ranged_threat == 3) || (ranged_threat > 1 && player_in_obscuring_mist == 1) || (ranged_threat > 0 && (player_cast_entangle || player_cast_web))))
            {
                // Cast Obscuring Mist, if:
                // 1. Haven't cast it yet  - (ggv401 >> 25) & 3
                // 2. Ranged threat exists (emphasized when player casts web or is in obscuring mist)
                // Give him a potion of Obscuring Mist, to simulate him having that scroll (just like I do...)
                if (attachee.FindItemByProto(8899) == null)
                {
                    attachee.GetItem(GameSystems.MapObject.CreateObject(8899, attachee.GetLocation()));
                }

                ggv401 += 1 << 25;
                SetGlobalVar(401, ggv401);
                var lareth_is_threatened = 0;
                if (closest_pc_1.DistanceTo(attachee) <= 3)
                {
                    lareth_is_threatened = 1;
                }

                if (lareth_is_threatened == 1)
                {
                    attachee.SetInt(obj_f.critter_strategy, 85); // Obscuring Mist + 5ft step
                }
                else
                {
                    attachee.SetInt(obj_f.critter_strategy, 86); // Just Obscuring Mist
                }
            }
            else if (((pad3 & (2)) == 0) && (player_cast_entangle || player_cast_web))
            {
                attachee.SetInt(obj_f.critter_strategy, 87); // Dispel strat
                pad3 |= (2);
                attachee.SetInt(obj_f.npc_pad_i_3, pad3);
            }
            else if (attachee.GetMap() == 5005 && player_entrenched_in_corridor(attachee))
            {
                attachee.SetInt(obj_f.critter_strategy, 89);
            }
            else
            {
                attachee.SetInt(obj_f.critter_strategy, 82);
            }
        }

        if ((hp_percent_lareth < 50) && (!generated_from_timed_event_call || generated_from_timed_event_call && talk_stage == 667))
        {
            if ((ggv400 & (0x40)) == 0)
            {
                GameObject found_pc = null;
                var        obj_list = new List <GameObject>();
                using var firstList = ObjList.ListVicinity(attachee.GetLocation(), ObjectListFilter.OLC_NPC);
                obj_list.AddRange(firstList);

                // Extending the range a little...
                foreach (var obj in ObjList.ListVicinity(attachee.GetLocation().OffsetTiles(-35, 0), ObjectListFilter.OLC_NPC))
                {
                    if (!((obj_list).Contains(obj)))
                    {
                        obj_list.Add(obj);
                    }
                }

                foreach (var obj in ObjList.ListVicinity(attachee.GetLocation().OffsetTiles(35, 0), ObjectListFilter.OLC_NPC))
                {
                    if (!((obj_list).Contains(obj)))
                    {
                        obj_list.Add(obj);
                    }
                }

                foreach (var obj in obj_list)
                {
                    foreach (var pc in SelectedPartyLeader.GetPartyMembers())
                    {
                        if (pc.type == ObjectType.pc && !pc.IsUnconscious())
                        {
                            found_pc = pc;
                        }

                        obj.AIRemoveFromShitlist(pc);
                        obj.SetReaction(pc, 50);
                        obj.RemoveFromInitiative();
                        if (pc.type == ObjectType.npc)
                        {
                            pc.AIRemoveFromShitlist(obj);
                        }
                    }

                    foreach (var obj2 in ObjList.ListVicinity(attachee.GetLocation(), ObjectListFilter.OLC_ALL))
                    {
                        if (obj2.type == ObjectType.pc || obj2.type == ObjectType.npc)
                        {
                            obj2.SetReaction(obj, 50);
                            try
                            {
                                obj2.AIRemoveFromShitlist(obj);
                            }
                            finally
                            {
                                var dummy = 1;
                            }

                            obj2.RemoveFromInitiative();
                        }
                    }
                }

                if (!generated_from_timed_event_call)
                {
                    StartTimer(100, () => OnStartCombat(attachee, triggerer, true, 667), true);
                }
                else if (found_pc != null)
                {
                    ggv400 |= 0x40;
                    SetGlobalVar(400, ggv400);
                    SetGlobalFlag(834, true);
                    found_pc.BeginDialog(attachee, 160);
                    return(SkipDefault);
                }
            }
        }
        else if (!generated_from_timed_event_call && !GetGlobalFlag(834))
        {
            if (((ggv401 >> 15) & 7) == 0)
            {
                ggv401 += 1 << 15;
                SetGlobalVar(401, ggv401);
            }
            else if (((ggv401 >> 15) & 7) == 1)
            {
                var closest_distance_1 = SelectedPartyLeader.DistanceTo(attachee);
                foreach (var pc in GameSystems.Party.PartyMembers)
                {
                    closest_distance_1 = Math.Min(closest_distance_1, pc.DistanceTo(attachee));
                }

                if (closest_distance_1 < 45)
                {
                    for (var ppq = 3; ppq < 26; ppq++)
                    {
                        StartTimer(ppq * 2500 + RandomRange(0, 20), () => OnStartCombat(attachee, triggerer, true, ppq), true);
                    }

                    ggv401 += 1 << 15;
                    SetGlobalVar(401, ggv401);
                }
            }
        }
        else if (generated_from_timed_event_call && !GetGlobalFlag(834))
        {
            if ((hp_percent_lareth > 75) && (ggv400 & 0x10) == 0 && !attachee.D20Query(D20DispatcherKey.QUE_Prone))
            {
                if (talk_stage >= 3 && ((ggv401 >> 15) & 31) == 2)
                {
                    attachee.FloatLine(6000, triggerer);
                    Sound(4201, 1);
                    Sound(4201, 1);
                    ggv401 += 1 << 15;
                    SetGlobalVar(401, ggv401);
                }
                else if (talk_stage >= 3 && ((ggv401 >> 15) & 31) == 3)
                {
                    Sound(4202, 1);
                    Sound(4202, 1);
                    ggv401 += 1 << 15;
                    SetGlobalVar(401, ggv401);
                }
                else if (talk_stage >= 3 && ((ggv401 >> 15) & 31) == 4)
                {
                    Sound(4203, 1);
                    Sound(4203, 1);
                    ggv401 += 1 << 15;
                    SetGlobalVar(401, ggv401);
                }
                else if (talk_stage >= 8 && ((ggv401 >> 15) & 31) == 5)
                {
                    attachee.FloatLine(6001, triggerer);
                    Sound(4204, 1);
                    Sound(4204, 1);
                    ggv401 += 1 << 15;
                    SetGlobalVar(401, ggv401);
                }
                else if (talk_stage >= 8 && ((ggv401 >> 15) & 31) == 6)
                {
                    Sound(4205, 1);
                    Sound(4205, 1);
                    ggv401 += 1 << 15;
                    SetGlobalVar(401, ggv401);
                }
                else if (talk_stage >= 13 && ((ggv401 >> 15) & 31) == 7)
                {
                    attachee.FloatLine(6002, triggerer);
                    Sound(4206, 1);
                    Sound(4206, 1);
                    ggv401 += 1 << 15;
                    SetGlobalVar(401, ggv401);
                }
                else if (talk_stage >= 13 && ((ggv401 >> 15) & 31) == 8)
                {
                    Sound(4207, 1);
                    Sound(4207, 1);
                    ggv401 += 1 << 15;
                    SetGlobalVar(401, ggv401);
                }
                else if (talk_stage >= 18 && ((ggv401 >> 15) & 31) == 9)
                {
                    attachee.FloatLine(6003, triggerer);
                    Sound(4208, 1);
                    Sound(4208, 1);
                    ggv401 += 1 << 15;
                    SetGlobalVar(401, ggv401);
                }
                else if (talk_stage >= 18 && ((ggv401 >> 15) & 31) == 10)
                {
                    Sound(4209, 1);
                    Sound(4209, 1);
                    ggv401 += 1 << 15;
                    SetGlobalVar(401, ggv401);
                }
                else if (talk_stage >= 22 && ((ggv401 >> 15) & 31) == 11)
                {
                    attachee.FloatLine(6004, triggerer);
                    Sound(4210, 1);
                    Sound(4210, 1);
                    ggv401 += 1 << 15;
                    SetGlobalVar(401, ggv401);
                }
                else if (talk_stage >= 22 && ((ggv401 >> 15) & 31) == 12)
                {
                    attachee.FloatLine(6004, triggerer);
                    Sound(4211, 1);
                    Sound(4211, 1);
                    ggv401 += 1 << 15;
                    SetGlobalVar(401, ggv401);
                }
                else if (talk_stage >= 22 && ((ggv401 >> 15) & 31) == 13)
                {
                    attachee.FloatLine(6004, triggerer);
                    Sound(4212, 1);
                    Sound(4212, 1);
                    ggv401 += 1 << 15;
                    SetGlobalVar(401, ggv401);
                }
            }
            else if ((hp_percent_lareth <= 75) && (ggv400 & 0x10) == 0)
            {
                if (((ggv401 >> 15) & 31) > 2)
                {
                    attachee.FloatLine(6005, triggerer);
                    Sound(4200, 1);
                    Sound(4200, 1);
                }

                StartTimer(5500, () => OnStartCombat(attachee, triggerer, true, 667), true);
                ggv400 |= 0x10;
                SetGlobalVar(400, ggv400);
            }
        }

        // Spiritual Weapon Shenanigens	#
        CombatStandardRoutines.Spiritual_Weapon_Begone(attachee);
        return(RunDefault);
    }
示例#28
0
    public override bool OnHeartbeat(GameObject attachee, GameObject triggerer)
    {
        if ((!GetGlobalFlag(854) && attachee.GetMap() == 5066))
        {
            SetGlobalFlag(854, true);
            var newNPC = GameSystems.MapObject.CreateObject(14459, new locXY(551, 600));
            newNPC = GameSystems.MapObject.CreateObject(14458, new locXY(511, 540));
            newNPC = GameSystems.MapObject.CreateObject(14452, new locXY(455, 535));
        }

        if ((attachee.GetNameId() == 14078 && attachee.GetLeader() == null && attachee.GetMap() == 5005 && GetGlobalVar(760) == 1))
        {
            SetGlobalVar(760, 2);
            DetachScript();
            return(RunDefault);
        }

        if ((attachee.GetNameId() == 14078 && attachee.GetLeader() == null && attachee.GetMap() == 5005))
        {
            if ((GetGlobalVar(760) == 2))
            {
                attachee.SetStandpoint(StandPointType.Night, 272);
                attachee.SetStandpoint(StandPointType.Day, 272);
            }

            if ((GetGlobalVar(760) == 13))
            {
                attachee.SetStandpoint(StandPointType.Night, 271);
                attachee.SetStandpoint(StandPointType.Day, 271);
            }

            SetGlobalVar(760, GetGlobalVar(760) + 1);
            if ((GetGlobalVar(760) >= 22))
            {
                SetGlobalVar(760, 2);
            }
        }

        if ((attachee.GetNameId() == 14635 && attachee.GetLeader() == null && attachee.GetMap() == 5066))
        {
            // Make the barbarian gnolls patrol around Temple level 1 near Ogre Chief
            var rr = RandomRange(1, 30);
            if ((rr == 1))
            {
                attachee.SetStandpoint(StandPointType.Night, 273);
                attachee.SetStandpoint(StandPointType.Day, 273);
            }

            if ((rr == 2))
            {
                attachee.SetStandpoint(StandPointType.Night, 274);
                attachee.SetStandpoint(StandPointType.Day, 274);
            }

            if ((rr == 3))
            {
                attachee.SetStandpoint(StandPointType.Night, 275);
                attachee.SetStandpoint(StandPointType.Day, 275);
            }

            if ((rr == 4))
            {
                attachee.SetStandpoint(StandPointType.Night, 276);
                attachee.SetStandpoint(StandPointType.Day, 276);
            }

            if ((rr == 5))
            {
                attachee.SetStandpoint(StandPointType.Night, 277);
                attachee.SetStandpoint(StandPointType.Day, 277);
            }

            rr = 0;
        }

        if ((attachee.GetNameId() == 14636 && attachee.GetLeader() == null && attachee.GetMap() == 5066))
        {
            // Make the goblin patrol around Temple level 1 near Ogre Chief
            var rr = RandomRange(1, 30);
            if ((rr == 1))
            {
                attachee.SetStandpoint(StandPointType.Night, 288);
                attachee.SetStandpoint(StandPointType.Day, 288);
            }

            if ((rr == 2))
            {
                attachee.SetStandpoint(StandPointType.Night, 289);
                attachee.SetStandpoint(StandPointType.Day, 289);
            }

            if ((rr == 3))
            {
                attachee.SetStandpoint(StandPointType.Night, 290);
                attachee.SetStandpoint(StandPointType.Day, 290);
            }

            rr = 0;
        }

        if ((!GameSystems.Combat.IsCombatActive() && attachee.GetNameId() == 14066 && attachee.GetMap() == 5005))
        {
            if ((!attachee.HasMet(PartyLeader)))
            {
                if ((is_better_to_talk(attachee, PartyLeader)))
                {
                    if ((!Utilities.critter_is_unconscious(PartyLeader)))
                    {
                        if ((PartyLeader.GetPartyMembers().Any(o => o.HasFollowerByName(8002))))
                        {
                            attachee.TurnTowards(PartyLeader);
                            PartyLeader.BeginDialog(attachee, 100);
                        }
                        else
                        {
                            attachee.TurnTowards(PartyLeader);
                            PartyLeader.BeginDialog(attachee, 1);
                        }
                    }
                }
                else
                {
                    foreach (var obj in ObjList.ListVicinity(attachee.GetLocation(), ObjectListFilter.OLC_PC))
                    {
                        if ((Utilities.is_safe_to_talk(attachee, obj)))
                        {
                            if ((PartyLeader.GetPartyMembers().Any(o => o.HasFollowerByName(8002))))
                            {
                                attachee.TurnTowards(obj);
                                obj.BeginDialog(attachee, 100);
                            }
                            else
                            {
                                attachee.TurnTowards(obj);
                                obj.BeginDialog(attachee, 1);
                            }
                        }
                    }
                }
            }
        }

        if ((GetGlobalFlag(288) && GetGlobalFlag(856) && GetGlobalFlag(857)))
        {
            DetachScript();
            if ((is_better_to_talk(attachee, PartyLeader)))
            {
                attachee.TurnTowards(PartyLeader);
                PartyLeader.BeginDialog(attachee, 200);
            }
            else
            {
                foreach (var obj in ObjList.ListVicinity(attachee.GetLocation(), ObjectListFilter.OLC_PC))
                {
                    if ((Utilities.is_safe_to_talk(attachee, obj)))
                    {
                        attachee.TurnTowards(obj);
                        obj.BeginDialog(attachee, 200);
                    }
                }
            }
        }

        return(RunDefault);
    }
    public bool CheckPrecondition(GameObject npc, GameObject pc, int lineNumber, out string originalScript)
    {
        switch (lineNumber)
        {
        case 2:
        case 8:
            originalScript = "game.global_flags[91] == 1";
            return(GetGlobalFlag(91));

        case 3:
        case 9:
            originalScript = "game.global_flags[92] == 1";
            return(GetGlobalFlag(92));

        case 12:
        case 73:
            originalScript = "pc != game.party[0] and game.party[0].distance_to(pc) <= 40 and not critter_is_unconscious(game.party[0]) and anyone(game.party[0].group_list(), \"has_wielded\", 3005)";
            return(pc != PartyLeader && PartyLeader.DistanceTo(pc) <= 40 && !Utilities.critter_is_unconscious(PartyLeader) && PartyLeader.GetPartyMembers().Any(o => o.HasEquippedByName(3005)));

        case 66:
        case 67:
            originalScript = "pc.skill_level_get(npc,skill_intimidate) >= 8";
            return(pc.GetSkillLevel(npc, SkillId.intimidate) >= 8);

        case 68:
        case 69:
            originalScript = "pc.skill_level_get(npc,skill_diplomacy) >= 7";
            return(pc.GetSkillLevel(npc, SkillId.diplomacy) >= 7);

        case 82:
        case 83:
            originalScript = "pc.skill_level_get(npc,skill_sense_motive) >= 11";
            return(pc.GetSkillLevel(npc, SkillId.sense_motive) >= 11);

        default:
            originalScript = null;
            return(true);
        }
    }
示例#30
0
    public override bool OnStartCombat(GameObject attachee, GameObject triggerer)
    {
        if (attachee.GetMap() == 5005) // Moathouse Dungeon
        {
            foreach (var npc in ObjList.ListVicinity(attachee.GetLocation(), ObjectListFilter.OLC_NPC))
            {
                if ((new[] { 14066, 14067, 14078, 14079, 14080 }).Contains(npc.GetNameId()) && npc.GetLeader() == null && npc.GetScriptId(ObjScriptEvent.StartCombat) == 0)
                {
                    npc.SetScriptId(ObjScriptEvent.StartCombat, 75);
                }
            }
        }
        else if (attachee.GetMap() == 5066) // Temple level 1
        {
            foreach (var npc in ObjList.ListVicinity(attachee.GetLocation(), ObjectListFilter.OLC_NPC))
            {
                if (npc.GetLeader() == null && npc.GetScriptId(ObjScriptEvent.StartCombat) == 0)
                {
                    npc.SetScriptId(ObjScriptEvent.StartCombat, 2);
                }
            }
        }

        if ((GetGlobalVar(709) == 2 && attachee.GetMap() == 5005))
        {
            SetGlobalVar(709, 3);
            foreach (var obj in ObjList.ListVicinity(attachee.GetLocation(), ObjectListFilter.OLC_NPC))
            {
                if ((obj.GetNameId() == 14079 || obj.GetNameId() == 14080 || obj.GetNameId() == 14067 || obj.GetNameId() == 14078 || obj.GetNameId() == 14066))
                {
                    obj.TurnTowards(triggerer);
                    obj.Attack(triggerer);
                }
            }
        }

        if (attachee.GetMap() == 5066 && (!ScriptDaemon.get_f("j_ogre_temple_1"))) // temple level 1 - gnolls near southern stairs
        {
            var(xx, yy) = attachee.GetLocation();
            if ((Math.Pow((xx - 564), 2) + Math.Pow((yy - 599), 2)) < 200)
            {
                ScriptDaemon.set_f("j_ogre_temple_1");
                var xxp_min = 564;
                var xxp_o   = 564;
                foreach (var pc in PartyLeader.GetPartyMembers())
                {
                    var(xxp, yyp) = pc.GetLocation();
                    if (yyp >= 599)
                    {
                        if (xxp < xxp_min)
                        {
                            xxp_min = xxp;
                        }
                    }
                    else if (yyp < 599 && xxp >= 519 && xxp <= 546 && yyp >= 589)
                    {
                        if (xxp < xxp_o)
                        {
                            xxp_o = xxp;
                        }
                    }
                }

                var x_ogre = Math.Min(xxp_min, xxp_o) - 20;
                x_ogre = Math.Max(507, x_ogre);
                foreach (var npc in ObjList.ListVicinity(new locXY(507, 603), ObjectListFilter.OLC_NPC))
                {
                    if (npc.GetNameId() == 14448 && npc.GetLeader() == null && !npc.IsUnconscious())
                    {
                        npc.Move(new locXY(x_ogre, 601), 0, 0);
                        npc.Attack(SelectedPartyLeader);
                    }
                }
            }
        }

        // THIS IS USED FOR BREAK FREE
        var found_nearby = 0;

        foreach (var obj in PartyLeader.GetPartyMembers())
        {
            if ((obj.DistanceTo(attachee) <= 3 && obj.GetStat(Stat.hp_current) >= -9))
            {
                found_nearby = 1;
            }
        }

        if (found_nearby == 0)
        {
            while ((attachee.FindItemByName(8903) != null))
            {
                attachee.FindItemByName(8903).Destroy();
            }
        }

        // if (attachee.d20_query(Q_Is_BreakFree_Possible)): # workaround no longer necessary!
        // create_item_in_inventory( 8903, attachee )
        // attachee.d20_send_signal(S_BreakFree)
        // Spiritual Weapon Shenanigens	#
        CombatStandardRoutines.Spiritual_Weapon_Begone(attachee);
        return(RunDefault);
    }