示例#1
0
        private static void HandleTrapDetected(CLRScriptBase s, ALFA.Shared.ActiveTrap trap, uint detector)
        {
            trap.Detected = true;

            NWEffect vfx = s.SupernaturalEffect(s.EffectNWN2SpecialEffectFile(trap.TrapTriggerVFX, OBJECT_INVALID, s.Vector(0.0f, 0.0f, 0.0f)));

            s.ApplyEffectToObject(DURATION_TYPE_PERMANENT, vfx, s.GetObjectByTag(trap.Tag, 0), 0.0f);

            uint detectWidget = s.CreateObject(OBJECT_TYPE_PLACEABLE, "acr_trap_disarm", s.GetLocation(detector), TRUE, trap.Tag + "_");

            if (!String.IsNullOrEmpty(trap.Description))
            {
                s.SetDescription(detectWidget, trap.Description);
            }
            s.SetFirstName(detectWidget, String.Format("Disarm the {0} trap", trap.SpellTrap ? "Spell" : "Mechanical"));

            // If they clicked to walk, let's stop them from walking into the hazard they just found.
            if (s.GetCurrentAction(detector) == ACTION_MOVETOPOINT)
            {
                s.AssignCommand(detector, delegate { s.ClearAllActions(0); });
            }
            s.PlaySound("alert", FALSE);
            s.ApplyEffectToObject(DURATION_TYPE_TEMPORARY, s.SupernaturalEffect(s.EffectNWN2SpecialEffectFile("fx_bang", detector, s.Vector(0.0f, 0.0f, 0.0f))), detector, 6.0f);
            s.SendMessageToPC(detector, "You spot a trap!");
        }
        public bool recalculate(CLRScriptBase script)
        {
            // Ensure that both our hide and our creature are still valid.
            if (script.GetIsObjectValid(m_oCreature) == CLRScriptBase.FALSE || script.GetIsObjectValid(m_oCreature) == CLRScriptBase.FALSE)
            {
                return(false);
            }

            // Recreate the hide.
            script.AssignCommand(m_oCreature, delegate { script.ClearAllActions(CLRScriptBase.FALSE); });
            uint oOldHide = getHide(script);

            m_oHide = script.CreateItemOnObject("acr_pchide", m_oCreature, 1, "acr_pchide", CLRScriptBase.FALSE);

            // Temp variables to store bonuses, to allow stacking from different sources.
            Dictionary <int, int>    saveBonuses  = new Dictionary <int, int>();
            Dictionary <int, int>    skillBonuses = new Dictionary <int, int>();
            Dictionary <string, int> otherBonuses = new Dictionary <string, int>();

            // Initialize dictionaries.
            for (int i = 0; i < 68; i++)
            {
                skillBonuses.Add(i, 0);
            }
            for (int i = 0; i < 4; i++)
            {
                saveBonuses.Add(i, 0);
            }

            #region Skill Focus feats
            // Handle all new shiny skill focus feats.
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_BALANCE, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_BALANCE] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CLIMB, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_CLIMB] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CRFT_ALCH, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_CRAFT_ALCHEMY] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CRFT_ARM, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_CRAFT_ARMORSMITHING] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CRFT_BOW, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_CRAFT_BOWMAKING] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CRFT_WPN, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_CRAFT_WEAPONSMITHING] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_DECIPHER, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_DECIPHER_SCRIPT] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_DISGUISE, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_DISGUISE] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_ESC_ART, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_ESCAPE_ARTIST] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_HAND_ANIM, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_HANDLE_ANIMAL] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_JUMP, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_JUMP] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_ARC, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_ARCANA] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_DUNG, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_DUNGEONEERING] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_ENG, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_ENGINEERING] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_GEO, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_GEOGRAPHY] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_HIST, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_HISTORY] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_LOC, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_LOCAL] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_NATR, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_NATURE] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_NOBL, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_NOBILITY] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_PLAN, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_THE_PLANES] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_RELG, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_RELIGION] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_ACT, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_PERFORM_ACT] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_COMD, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_PERFORM_COMEDY] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_DANC, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_PERFORM_DANCE] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_KEYB, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_PERFORM_KEYBOARD] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_ORAT, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_PERFORM_ORATORY] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_PERC, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_PERFORM_PERCUSSION] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_SING, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_PERFORM_SING] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_STRG, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_PERFORM_STRING_INSTRUMENTS] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_WIND, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_PERFORM_WIND_INSTRUMENTS] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PROF, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_PROFESSION] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_RIDE, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_RIDE] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_SENS_MOTV, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_SPEAK_LANGUAGE] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_SPK_LANG, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_LOCAL] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_SWIM, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_SWIM] += 3;
            }
            if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_USE_ROPE, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                skillBonuses[(int)SKILLS.SKILL_USE_ROPE] += 3;
            }
            #endregion

            // Artist is one bad-ass feat.
            if (script.GetHasFeat(CLRScriptBase.FEAT_ARTIST, m_oCreature, 1) == CLRScriptBase.TRUE)
            {
                // Previously: +2 perform, +2 diplomacy
                // Currently: +2 perform (all), 3 extra bardic music uses per day
                skillBonuses[CLRScriptBase.SKILL_DIPLOMACY]                -= 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_ACT]                += 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_COMEDY]             += 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_DANCE]              += 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_KEYBOARD]           += 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_ORATORY]            += 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_PERCUSSION]         += 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_SING]               += 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_STRING_INSTRUMENTS] += 2;
                skillBonuses[(int)SKILLS.SKILL_PERFORM_WIND_INSTRUMENTS]   += 2;
            }

            // Add skill bonuses to item.
            foreach (int skill in skillBonuses.Keys)
            {
                if (skillBonuses[skill] == 0)
                {
                    continue;
                }
                else if (skillBonuses[skill] > 0)
                {
                    script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skill, skillBonuses[skill]), m_oHide, 0.0f);
                }
                else if (skillBonuses[skill] < 0)
                {
                    script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertyDecreaseSkill(skill, Math.Abs(skillBonuses[skill])), m_oHide, 0.0f);
                }
            }

            // Add save bonuses to item.
            foreach (int save in saveBonuses.Keys)
            {
                if (saveBonuses[save] == 0)
                {
                    continue;
                }
                else if (saveBonuses[save] > 0)
                {
                    script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrow(save, saveBonuses[save]), m_oHide, 0.0f);
                }
                else if (saveBonuses[save] < 0)
                {
                    script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertyReducedSavingThrow(save, Math.Abs(saveBonuses[save])), m_oHide, 0.0f);
                }
            }

            // Make the person equip the new item.
            script.AssignCommand(m_oCreature, delegate { script.ClearAllActions(CLRScriptBase.FALSE); });
            script.AssignCommand(m_oCreature, delegate { script.ActionEquipItem(m_oHide, CLRScriptBase.INVENTORY_SLOT_CARMOUR); });
            script.DestroyObject(oOldHide, 0.0f, CLRScriptBase.FALSE);
            script.SendMessageToPC(m_oCreature, "PC Hide refreshed.");

            // Everything looks fine, return our success.
            return(true);
        }