Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion src/Core/ContractTypeBuilders/ConditionalBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ private void BuildConditional(JObject conditionalObject) {
case "TimerStatus": BuildTimerStatusConditional(conditionalObject); break;
case "WhoDied": BuildWhoDiedConditional(conditionalObject); break;
case "WhoKilled": BuildWhoKilledConditional(conditionalObject); break;
case "LanceVisibleToPlayer": BuildLanceVisibleToPlayerConditional(conditionalObject); break;
case "PlayerTonnage": BuildPlayerTonnageConditional(conditionalObject); break;
default:
Main.Logger.LogError($"[ChunkTypeBuilder.{contractTypeKey}] No valid conditional was built for '{type}'");
Expand Down Expand Up @@ -423,6 +424,22 @@ private void BuildWhoKilledConditional(JObject conditionalObject) {
conditionalList.Add(new EncounterConditionalBox(conditional));
}

private void BuildLanceVisibleToPlayerConditional(JObject conditionalObject) {
Main.LogDebug("[BuildLanceVisibleToPlayerConditional] Building 'LanceVisibleToPlayer' conditional");
string targetLanceGuid = conditionalObject.ContainsKey("TargetLanceGuid") ? conditionalObject["TargetLanceGuid"].ToString() : null;
if (targetLanceGuid == null && conditionalObject.ContainsKey("LanceGuid")) targetLanceGuid = conditionalObject["LanceGuid"].ToString();

if (string.IsNullOrEmpty(targetLanceGuid)) {
Main.Logger.LogError("[BuildLanceVisibleToPlayerConditional] You have not provided a 'TargetLanceGuid' or 'LanceGuid'.");
return;
}

LanceVisibleToPlayerConditional conditional = ScriptableObject.CreateInstance<LanceVisibleToPlayerConditional>();
conditional.TargetLanceGuid = targetLanceGuid;

conditionalList.Add(new EncounterConditionalBox(conditional));
}

private void BuildPlayerTonnageConditional(JObject conditionalObject) {
Main.LogDebug("[BuildPlayerTonnageConditional] Building 'PlayerTonnage' conditional");
string operation = conditionalObject["Operation"].ToString();
Expand All @@ -439,4 +456,4 @@ private void BuildPlayerTonnageConditional(JObject conditionalObject) {
conditionalList.Add(new EncounterConditionalBox(conditional));
}
}
}
}
53 changes: 53 additions & 0 deletions src/Core/EncounterConditionals/LanceVisibleToPlayerConditional.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using BattleTech;
using BattleTech.Framework;

namespace MissionControl.Conditional {
public class LanceVisibleToPlayerConditional : DesignConditional {
public string TargetLanceGuid { get; set; }

public override bool Evaluate(MessageCenterMessage message, string responseName) {
base.Evaluate(message, responseName);

if (string.IsNullOrEmpty(TargetLanceGuid)) {
Main.Logger.LogError($"[LanceVisibleToPlayerConditional] TargetLanceGuid is empty. '{responseName}'");
return false;
}

VisibilityLevelIncreasedMessage visibilityMessage = message as VisibilityLevelIncreasedMessage;
if (visibilityMessage == null) {
return false;
}

CombatGameState combat = UnityGameInstance.BattleTechGame?.Combat;
if (combat == null) {
Main.Logger.LogError($"[LanceVisibleToPlayerConditional] Combat state is unavailable. '{responseName}'");
return false;
}

VisibilityLevelAndAttribution visibility = visibilityMessage.VisibilityLevelAndAttribution;
if (visibility.SpottingTeamGUID != combat.LocalPlayerTeamGuid) {
return false;
}

if (visibility.VisibilityLevel <= VisibilityLevel.None) {
return false;
}

AbstractActor targetActor = combat.FindActorByGUID(visibilityMessage.TargetUnitGUID);
if (targetActor == null) {
return false;
}

if (targetActor.lance == null || string.IsNullOrEmpty(targetActor.lance.GUID)) {
return false;
}

if (targetActor.lance.GUID.Contains(TargetLanceGuid)) {
Main.LogDebug($"[LanceVisibleToPlayerConditional] Player visibility matches target lance guid '{TargetLanceGuid}'. '{responseName}'");
return true;
}

return false;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
using System;
using System.Collections.Generic;

using BattleTech;
using MissionControl.Conditional;
using MissionControl.Rules;
using MissionControl.Trigger;
using MissionControl.Messages;
Expand All @@ -27,10 +29,12 @@ public AddPlayer2LanceWithDestroyObjectiveBatch(EncounterRules encounterRules, s
SpawnLogic.LookDirection.AWAY_FROM_TARGET, minDistance, maxDistance));

if (showObjectiveOnLanceDetected) {
encounterRules.EncounterLogic.Add(new ShowObjectiveTrigger(MessageCenterMessageType.OnLanceDetected, lanceGuid, objectiveGuid, false));
LanceVisibleToPlayerConditional lanceVisibleToPlayerConditional = ScriptableObject.CreateInstance<LanceVisibleToPlayerConditional>();
lanceVisibleToPlayerConditional.TargetLanceGuid = lanceGuid;
encounterRules.EncounterLogic.Add(new ShowObjectiveTrigger(MessageCenterMessageType.OnVisibilityIncreased, lanceGuid, objectiveGuid, false, lanceVisibleToPlayerConditional));
}

encounterRules.ObjectReferenceQueue.Add(spawnerName);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
using System;
using System.Collections.Generic;

using BattleTech;
using UnityEngine;

using MissionControl.Data;
using MissionControl.Conditional;
using MissionControl.Rules;
using MissionControl.Trigger;

Expand All @@ -27,10 +31,12 @@ public AddTargetLanceWithDestroyObjectiveBatch(EncounterRules encounterRules, st
SpawnLogic.LookDirection.AWAY_FROM_TARGET, mustBeBeyondDistance, mustBeWithinDistance));

if (showObjectiveOnLanceDetected) {
encounterRules.EncounterLogic.Add(new ShowObjectiveTrigger(MessageCenterMessageType.OnLanceDetected, lanceGuid, objectiveGuid, false));
LanceVisibleToPlayerConditional lanceVisibleToPlayerConditional = ScriptableObject.CreateInstance<LanceVisibleToPlayerConditional>();
lanceVisibleToPlayerConditional.TargetLanceGuid = lanceGuid;
encounterRules.EncounterLogic.Add(new ShowObjectiveTrigger(MessageCenterMessageType.OnVisibilityIncreased, lanceGuid, objectiveGuid, false, lanceVisibleToPlayerConditional));
}

encounterRules.ObjectReferenceQueue.Add(spawnerName);
}
}
}
}