HipMaestro, oddly enough, the immunities bug means that the Protector Against the Lessers usually survives longest versus a Horrid Wilting assault. When that happens (as has been typical on my plays through) Morag doesn't lose her level 9 and lower spell immunity until after that last Protector is gone. And, because of that, she and her remaining minions (the egg-sack spawns) are often at full health when I get around to them and I have had my hands pretty full with them. Now (with the fixed version), I am expecting that there may be a reload or two to finish this, since she will likely still have more of her immunities and more Protectors around to soak up Isaac's, empowered Firebrands, and so on. Though, at least the way I would approach her with a wizard PC, killing that Protector Against the Lessers will still be a priority and will open her biggest vulnerability.
One more thing, while I am in debug mode, so to speak. While updating the OnSpawn scripts for these protectors, I noticed another bug. The Protector Against the Storm isn't supposed to be immune from electrical attacks, but she is. I think that's the last obvious issue, but that area is a slightly more troubled than I would have thought.
Ideally, much of this would be best addressed by editing the area with the Toolset to remove or modify the items causing issues with those creatures. It can also be done via scripting, which might be easier and I guess also has the advantage that someone could plop the compiled script into their override when they start Chapter 4 and have the area work properly without having to use the Toolset. In addition to the blade barrier fix above, the script below, replacing
m4immunes.nss
should do the job with the Protectors
//::///////////////////////////////////////////////
//:: Name: M4Immunes.nss
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
This is the OnSpawn script for Morag's Protectors,
except the Protector Against the Lessers.
MrZork 2011/12/10: Modified to give appropriate
Protectors immunity (rather than vulnerability)
to magical, divine, and negative damage. Also
modified to remove the immunity from poison that
Morag's Venom protector gets from her helmet.
Also removed immunity from electrical attacks
from the Protector Against the Storm.
*/
// * all protectors are immune to magical damage, negative and divine
void main()
{
effect eImmunity = EffectDamageImmunityIncrease(DAMAGE_TYPE_MAGICAL,100);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eImmunity, OBJECT_SELF);
eImmunity = EffectDamageImmunityIncrease(DAMAGE_TYPE_NEGATIVE,100);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eImmunity, OBJECT_SELF);
eImmunity = EffectDamageImmunityIncrease(DAMAGE_TYPE_DIVINE,100);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eImmunity, OBJECT_SELF);
if (GetTag(OBJECT_SELF)=="M4Q1D08_IMM_POIS") // Protector Against Venom
{
object oItem = GetItemInSlot(INVENTORY_SLOT_HEAD,OBJECT_SELF);
itemproperty ipPoison = GetFirstItemProperty(oItem);
while (GetIsItemPropertyValid(ipPoison))
{
if (GetItemPropertyType(ipPoison)==ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS)
{
if (GetItemPropertySubType(ipPoison)==3) // from IPRP_IMMUNITY.2DA
{
RemoveItemProperty(oItem, ipPoison);
break;
}
}
ipPoison=GetNextItemProperty(oItem);
}
}
if (GetTag(OBJECT_SELF)=="M4Q1D08_IMM_ELEC") // Protector Against the Storm
{
object oItem = GetItemInSlot(INVENTORY_SLOT_BELT,OBJECT_SELF);
if (GetIsObjectValid(oItem))
{
DestroyObject(oItem);
}
}
}
I think that covers everything obvious in that scene that is probably a bug. One other thing that I changed was to rewrite Morag's OnDeath script so that her minions that spawn during the fight don't automatically die when she does, though the PC can still escape via the teleports that spawn after Morag dies. Obviously, that's a design decision rather than a bug, but I modified
m4q1d08_moragdea.nss
as follows to make it so that (on Hard Core or harder) the PC can take down those minions, too (and get the XP for it).
// Morag OnDeath script m4q1d08_moragdea.nss
//* MOrag dies, says one last line and then explodes
#include "nw_i0_plot"
// * blows things up at end of game
void KillObject(object oToKill)
{
effect eDamage = EffectDamage(1000);
float fRandom = IntToFloat(Random(100)) * 0.001;
DelayCommand(fRandom, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDamage, oToKill));
}
void main()
{
RewardXP("M4Q01_MAIN",100,GetLastKiller());
AddJournalQuestEntry("M4Q01_MAIN",99,GetLastKiller());
SetLocalInt(OBJECT_SELF,"NW_L_AMDEAD",10);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectResurrection(), OBJECT_SELF);
SetPlotFlag(OBJECT_SELF,TRUE);
effect eVis = EffectVisualEffect(VFX_IMP_SUNSTRIKE);
ApplyEffectAtLocation(DURATION_TYPE_PERMANENT, eVis, GetLocation(OBJECT_SELF));
SpeakOneLinerConversation();
SetPlotFlag(OBJECT_SELF,FALSE);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_FNF_IMPLOSION), GetNearestObjectByTag("ThroneEvil1"));
KillObject(GetNearestObjectByTag("M_FireWall_1"));
KillObject(GetNearestObjectByTag("M_FireWall_2"));
KillObject(GetNearestObjectByTag("M_FireWall_3"));
KillObject(GetNearestObjectByTag("M_FireWall_4"));
KillObject(GetNearestObjectByTag("ShaftofLightRed1"));
KillObject(GetNearestObjectByTag("ShaftofLightRed2"));
KillObject(GetNearestObjectByTag("ThroneEvil1"));
KillObject(GetNearestObjectByTag("M4Q1D08_IMM_FIRE"));
KillObject(GetNearestObjectByTag("M4Q1D2_FIRE"));
KillObject(GetNearestObjectByTag("M4Q1D08_IMM_COLD"));
KillObject(GetNearestObjectByTag("M4Q1D2_COLD"));
KillObject(GetNearestObjectByTag("M4Q1D08_IMM_OTHE"));
KillObject(GetNearestObjectByTag("M4Q1D2_OTHE"));
KillObject(GetNearestObjectByTag("M4Q1D08_IMM_BLUN"));
KillObject(GetNearestObjectByTag("M4Q1D2_BLUN"));
KillObject(GetNearestObjectByTag("M4Q1D08_IMM_PIER"));
KillObject(GetNearestObjectByTag("M4Q1D2_PIER"));
KillObject(GetNearestObjectByTag("M4Q1D08_IMM_ELEC"));
KillObject(GetNearestObjectByTag("M4Q1D2_ELEC"));
KillObject(GetNearestObjectByTag("M4Q1D08_IMM_SLAS"));
KillObject(GetNearestObjectByTag("M4Q1D2_SLAS"));
KillObject(GetNearestObjectByTag("M4Q1D08_IMM_POIS"));
KillObject(GetNearestObjectByTag("M4Q1D2_POIS"));
// MrZork 2011/12/09: Only kill these guys on the easier settings
if (GetGameDifficulty() < GAME_DIFFICULTY_CORE_RULES)
{
KillObject(GetNearestObjectByTag("m4sac1"));
KillObject(GetNearestObjectByTag("m4sac2"));
KillObject(GetNearestObjectByTag("m4sac3"));
KillObject(GetNearestObjectByTag("m4sac4"));
KillObject(GetNearestObjectByTag("m4sac1_c"));
KillObject(GetNearestObjectByTag("m4sac2_c"));
KillObject(GetNearestObjectByTag("M4_MIN_HULK"));
KillObject(GetNearestObjectByTag("M4_MIN_RENDER"));
}
DestroyObject(OBJECT_SELF, 1.0);
// * all the post-plot stuff requires this to work
SetLocalInt(GetModule(),"NW_G_MORAGDEAD", 10);
}
[EDIT: Sorry, I am not sure how to get the social boards to reliably preserve spacing and returns.]
Modifié par MrZork, 11 décembre 2011 - 12:32 .