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); }
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); }
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); } } } }
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); }
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); }
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); }
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); } } }
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); }
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); }
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); }
// 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(); }
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); }
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); } }
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); }
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(); }
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(); }
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); }
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(); }
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); }
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); }
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); }
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); }
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); } }
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); }