Ejemplo n.º 1
0
        public static float GetVisualScanRange(AbstractActor source)
        {
            // FIXME: Dirty hack here. Assuming that night vision mode only comes on during a unit's turn / selection, then goes away
            float visRange = ModState.IsNightVisionMode ? ModState.GetMapConfig().nightVisionVisualIDRange : ModState.GetMapConfig().visualIDRange;

            return(GetVisualRange(visRange, source));
        }
Ejemplo n.º 2
0
        public static void Prefix(AbstractActor __instance, int stackItemID)
        {
            if (stackItemID == -1 || __instance == null || __instance.HasBegunActivation)
            {
                // For some bloody reason DoneWithActor() invokes OnActivationBegin, EVEN THOUGH IT DOES NOTHING. GAH!
                return;
            }

            // Draw stealth if applicable
            EWState actorState = new EWState(__instance);

            if (actorState.HasStealth())
            {
                Mod.Log.Debug?.Write($"-- Sending message to update stealth");
                StealthChangedMessage message = new StealthChangedMessage(__instance.GUID);
                __instance.Combat.MessageCenter.PublishMessage(message);
            }

            // If friendly, reset the map visibility
            if (__instance.TeamId != __instance.Combat.LocalPlayerTeamGuid &&
                __instance.Combat.HostilityMatrix.IsLocalPlayerFriendly(__instance.TeamId))
            {
                Mod.Log.Info?.Write($"{CombatantUtils.Label(__instance)} IS FRIENDLY, REBUILDING FOG OF WAR");

                if (actorState.HasNightVision() && ModState.GetMapConfig().isDark)
                {
                    Mod.Log.Info?.Write($"Enabling night vision mode.");
                    VfxHelper.EnableNightVisionEffect(__instance);
                }
                else
                {
                    // TODO: This is likely never triggered due to the patch below... remove?
                    if (ModState.IsNightVisionMode)
                    {
                        VfxHelper.DisableNightVisionEffect();
                    }
                }

                VfxHelper.RedrawFogOfWar(__instance);
            }
        }
Ejemplo n.º 3
0
        // Records actor selected events to allow id of the last player unit a player selected
        public static void OnActorSelectedMessage(MessageCenterMessage message)
        {
            ActorSelectedMessage actorSelectedMessage = message as ActorSelectedMessage;
            AbstractActor        actor = Combat.FindActorByGUID(actorSelectedMessage.affectedObjectGuid);

            if (actor.team.IsLocalPlayer)
            {
                Mod.Log.Info?.Write($"Updating last activated actor to: ({CombatantUtils.Label(actor)})");
                ModState.LastPlayerActorActivated = actor;

                EWState actorState = new EWState(actor);
                if (actorState.HasNightVision() && ModState.GetMapConfig().isDark)
                {
                    Mod.Log.Info?.Write($"Enabling night vision mode.");
                    VfxHelper.EnableNightVisionEffect(actor);
                }
                else
                {
                    if (ModState.IsNightVisionMode)
                    {
                        VfxHelper.DisableNightVisionEffect();
                    }
                }

                // Refresh the unit's vision
                VfxHelper.RedrawFogOfWar(actor);
                actor.VisibilityCache.RebuildCache(actor.Combat.GetAllImporantCombatants());
                CombatHUDHelper.ForceNameRefresh(actor.Combat);

                // Hack - turn on Vision indicator?
                VisRangeIndicator visRangeIndicator = VisRangeIndicator.Instance;
                visRangeIndicator.SetState(VisRangeIndicator.VisRangeIndicatorState.On);

                // Refresh any CombatHUDMarkDisplays
                foreach (CombatHUDMarkDisplay chudMD in ModState.MarkContainerRefs.Keys)
                {
                    chudMD.RefreshInfo();
                }
            }
        }
        private static string BuildToolTip(AbstractActor actor)
        {
            //Mod.Log.Debug?.Write($"EW State for actor:{CombatantUtils.Label(actor)} = {ewState}");

            List <string> details = new List <string>();

            // Visuals check
            float visualLockRange = VisualLockHelper.GetVisualLockRange(actor);
            float visualScanRange = VisualLockHelper.GetVisualScanRange(actor);

            details.Add(
                new Text(Mod.LocalizedText.StatusPanel[ModText.LT_PANEL_VISUALS],
                         new object[] { visualLockRange, visualScanRange, ModState.GetMapConfig().UILabel() })
                .ToString()
                );

            // Sensors check
            EWState ewState = new EWState(actor);

            int            totalDetails = ewState.GetCurrentEWCheck() + ewState.AdvancedSensorsMod();
            SensorScanType checkLevel   = SensorScanTypeHelper.DetectionLevelForCheck(totalDetails);

            float rawRangeMulti = SensorLockHelper.GetAllSensorRangeMultipliers(actor);
            float rangeMulti    = rawRangeMulti + ewState.GetSensorsRangeMulti();

            float  sensorsRange = SensorLockHelper.GetSensorsRange(actor);
            string sensorColor  = ewState.GetCurrentEWCheck() >= 0 ? "00FF00" : "FF0000";

            details.Add(
                new Text(Mod.LocalizedText.StatusPanel[ModText.LT_PANEL_SENSORS],
                         new object[] { sensorColor, sensorsRange, sensorColor, rangeMulti, checkLevel.Label() })
                .ToString()
                );

            // Details
            //{ LT_PANEL_DETAILS, "  Total: <color=#{0}>{1:+0;-#}</color><size=90%> Roll: <color=#{2}>{3:+0;-#}</color> Tactics: <color=#00FF00>{4:+0;-#}</color> AdvSen: <color=#{5}>{6:+0;-#}</color>\n"
            string totalColor  = totalDetails >= 0 ? "00FF00" : "FF0000";
            string checkColor  = ewState.GetRawCheck() >= 0 ? "00FF00" : "FF0000";
            string advSenColor = ewState.AdvancedSensorsMod() >= 0 ? "00FF00" : "FF0000";

            details.Add(
                new Text(Mod.LocalizedText.StatusPanel[ModText.LT_PANEL_DETAILS],
                         new object[] { totalColor, totalDetails, checkColor, ewState.GetRawCheck(), ewState.GetRawTactics(), advSenColor, ewState.AdvancedSensorsMod() })
                .ToString()
                );

            //  Heat Vision
            if (ewState.GetRawHeatVision() != null)
            {
                // { LT_PANEL_HEAT, "<b>Thermals</b><size=90%> Mod:<color=#{0}>{1:+0;-#}</color> / {2} heat Range:{3}m\n" },
                HeatVision heatVis = ewState.GetRawHeatVision();
                // Positive is bad, negative is good
                string modColor = heatVis.AttackMod >= 0 ? "FF0000" : "00FF00";
                details.Add(
                    new Text(Mod.LocalizedText.StatusPanel[ModText.LT_PANEL_HEAT],
                             new object[] { modColor, heatVis.AttackMod, heatVis.HeatDivisor, heatVis.MaximumRange })
                    .ToString()
                    );
            }

            //  Zoom Vision
            if (ewState.GetRawZoomVision() != null)
            {
                // { LT_PANEL_ZOOM, "<b>Zoom</b><size=90%> Mod:<color=#{0}>{1:+0;-#}</color? Cap:<color=#{2}>{3:+0;-#}</color> Range:{4}m\n" },
                ZoomVision zoomVis = ewState.GetRawZoomVision();
                // Positive is bad, negative is good
                string modColor = zoomVis.AttackMod >= 0 ? "FF0000" : "00FF00";
                string capColor = zoomVis.AttackCap >= 0 ? "FF0000" : "00FF00";
                details.Add(
                    new Text(Mod.LocalizedText.StatusPanel[ModText.LT_PANEL_ZOOM],
                             new object[] { modColor, zoomVis.AttackMod, capColor, zoomVis.AttackCap, zoomVis.MaximumRange })
                    .ToString()
                    );
            }

            string tooltipText = String.Join("", details.ToArray());

            return(tooltipText);
        }