mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
Eye Travel Ordering (#1051)
## Minor features - Add `afterTraveler` to custom Eye Travelers to place them after a base game traveler in the campfire order (resolves #1037) ## Improvements - Fix order of travelers at the Eye when both base game guests have been gathered and custom travelers are used
This commit is contained in:
commit
52a1b0e4ce
@ -1,6 +1,7 @@
|
|||||||
using NewHorizons.External.Modules.Props.Audio;
|
using NewHorizons.External.Modules.Props.Audio;
|
||||||
using NewHorizons.External.Modules.Props.Dialogue;
|
using NewHorizons.External.Modules.Props.Dialogue;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Converters;
|
||||||
|
|
||||||
namespace NewHorizons.External.Modules.Props.EyeOfTheUniverse
|
namespace NewHorizons.External.Modules.Props.EyeOfTheUniverse
|
||||||
{
|
{
|
||||||
@ -46,5 +47,23 @@ namespace NewHorizons.External.Modules.Props.EyeOfTheUniverse
|
|||||||
/// The dialogue to use for this traveler. If omitted, the first CharacterDialogueTree in the object will be used.
|
/// The dialogue to use for this traveler. If omitted, the first CharacterDialogueTree in the object will be used.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public DialogueInfo dialogue;
|
public DialogueInfo dialogue;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The name of the base game traveler to position this traveler after at the campfire, starting clockwise from Riebeck. Defaults to the end of the list (right before Riebeck).
|
||||||
|
/// </summary>
|
||||||
|
public TravelerName? afterTraveler;
|
||||||
|
|
||||||
|
|
||||||
|
[JsonConverter(typeof(StringEnumConverter))]
|
||||||
|
public enum TravelerName
|
||||||
|
{
|
||||||
|
Riebeck,
|
||||||
|
Chert,
|
||||||
|
Esker,
|
||||||
|
Felspar,
|
||||||
|
Gabbro,
|
||||||
|
Solanum,
|
||||||
|
Prisoner,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -266,29 +266,49 @@ namespace NewHorizons.Handlers
|
|||||||
|
|
||||||
var quantumCampsiteController = Object.FindObjectOfType<QuantumCampsiteController>();
|
var quantumCampsiteController = Object.FindObjectOfType<QuantumCampsiteController>();
|
||||||
|
|
||||||
var travelers = new List<Transform>()
|
var travelers = new List<Transform>();
|
||||||
{
|
|
||||||
quantumCampsiteController._travelerControllers[0].transform, // Riebeck
|
|
||||||
quantumCampsiteController._travelerControllers[2].transform, // Chert
|
|
||||||
quantumCampsiteController._travelerControllers[6].transform, // Esker
|
|
||||||
quantumCampsiteController._travelerControllers[1].transform, // Felspar
|
|
||||||
quantumCampsiteController._travelerControllers[3].transform, // Gabbro
|
|
||||||
};
|
|
||||||
|
|
||||||
if (quantumCampsiteController._hasMetSolanum)
|
var hasMetSolanum = quantumCampsiteController._hasMetSolanum;
|
||||||
|
var hasMetPrisoner = quantumCampsiteController._hasMetPrisoner;
|
||||||
|
|
||||||
|
// The order of the travelers in the base game differs depending on if the player has met both Solanum and the Prisoner or not.
|
||||||
|
if (hasMetPrisoner && hasMetSolanum)
|
||||||
{
|
{
|
||||||
|
travelers.Add(quantumCampsiteController._travelerControllers[0].transform); // Riebeck
|
||||||
|
travelers.Add(quantumCampsiteController._travelerControllers[5].transform); // Prisoner
|
||||||
|
travelers.Add(quantumCampsiteController._travelerControllers[6].transform); // Esker
|
||||||
|
travelers.Add(quantumCampsiteController._travelerControllers[1].transform); // Felspar
|
||||||
|
travelers.Add(quantumCampsiteController._travelerControllers[3].transform); // Gabbro
|
||||||
travelers.Add(quantumCampsiteController._travelerControllers[4].transform); // Solanum
|
travelers.Add(quantumCampsiteController._travelerControllers[4].transform); // Solanum
|
||||||
|
travelers.Add(quantumCampsiteController._travelerControllers[2].transform); // Chert
|
||||||
}
|
}
|
||||||
if (quantumCampsiteController._hasMetPrisoner)
|
else
|
||||||
{
|
{
|
||||||
|
travelers.Add(quantumCampsiteController._travelerControllers[0].transform); // Riebeck
|
||||||
|
travelers.Add(quantumCampsiteController._travelerControllers[2].transform); // Chert
|
||||||
|
travelers.Add(quantumCampsiteController._travelerControllers[6].transform); // Esker
|
||||||
|
travelers.Add(quantumCampsiteController._travelerControllers[1].transform); // Felspar
|
||||||
|
travelers.Add(quantumCampsiteController._travelerControllers[3].transform); // Gabbro
|
||||||
|
if (hasMetSolanum)
|
||||||
|
travelers.Add(quantumCampsiteController._travelerControllers[4].transform); // Solanum
|
||||||
|
if (hasMetPrisoner)
|
||||||
travelers.Add(quantumCampsiteController._travelerControllers[5].transform); // Prisoner
|
travelers.Add(quantumCampsiteController._travelerControllers[5].transform); // Prisoner
|
||||||
}
|
}
|
||||||
|
|
||||||
// Custom travelers (starting at index 7)
|
// Custom travelers (starting at index 7, after Esker). We loop through the array instead of the list of custom travelers in case a non-NH mod added their own.
|
||||||
for (int i = 7; i < quantumCampsiteController._travelerControllers.Length; i++)
|
for (int i = 7; i < quantumCampsiteController._travelerControllers.Length; i++)
|
||||||
|
{
|
||||||
|
var travelerInfo = GetActiveCustomEyeTravelers().FirstOrDefault(t => t.controller == quantumCampsiteController._travelerControllers[i]);
|
||||||
|
var travelerName = travelerInfo?.info?.afterTraveler;
|
||||||
|
if (travelerName.HasValue)
|
||||||
|
{
|
||||||
|
InsertTravelerAfter(quantumCampsiteController, travelers, travelerInfo.info.afterTraveler.ToString(), quantumCampsiteController._travelerControllers[i].transform);
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
travelers.Add(quantumCampsiteController._travelerControllers[i].transform);
|
travelers.Add(quantumCampsiteController._travelerControllers[i].transform);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var radius = 2f + 0.2f * travelers.Count;
|
var radius = 2f + 0.2f * travelers.Count;
|
||||||
var angle = Mathf.PI * 2f / travelers.Count;
|
var angle = Mathf.PI * 2f / travelers.Count;
|
||||||
@ -312,6 +332,22 @@ namespace NewHorizons.Handlers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void InsertTravelerAfter(QuantumCampsiteController campsite, List<Transform> travelers, string travelerName, Transform newTraveler)
|
||||||
|
{
|
||||||
|
if (travelerName == "Prisoner")
|
||||||
|
travelerName = "Prisoner_Campfire";
|
||||||
|
var existingTraveler = campsite._travelerControllers.FirstOrDefault(c => c.name == travelerName);
|
||||||
|
if (existingTraveler != null)
|
||||||
|
{
|
||||||
|
var index = travelers.IndexOf(existingTraveler.transform);
|
||||||
|
travelers.Insert(index + 1, newTraveler);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
travelers.Add(newTraveler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class EyeTravelerData
|
public class EyeTravelerData
|
||||||
{
|
{
|
||||||
public string id;
|
public string id;
|
||||||
|
|||||||
@ -1078,6 +1078,17 @@
|
|||||||
"dialogue": {
|
"dialogue": {
|
||||||
"description": "The dialogue to use for this traveler. If omitted, the first CharacterDialogueTree in the object will be used.",
|
"description": "The dialogue to use for this traveler. If omitted, the first CharacterDialogueTree in the object will be used.",
|
||||||
"$ref": "#/definitions/DialogueInfo"
|
"$ref": "#/definitions/DialogueInfo"
|
||||||
|
},
|
||||||
|
"afterTraveler": {
|
||||||
|
"description": "The name of the base game traveler to position this traveler after at the campfire, starting clockwise from Riebeck. Defaults to the end of the list (right before Riebeck).",
|
||||||
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"type": "null"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$ref": "#/definitions/TravelerName"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1522,6 +1533,28 @@
|
|||||||
"none"
|
"none"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"TravelerName": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "",
|
||||||
|
"x-enumNames": [
|
||||||
|
"Riebeck",
|
||||||
|
"Chert",
|
||||||
|
"Esker",
|
||||||
|
"Felspar",
|
||||||
|
"Gabbro",
|
||||||
|
"Solanum",
|
||||||
|
"Prisoner"
|
||||||
|
],
|
||||||
|
"enum": [
|
||||||
|
"Riebeck",
|
||||||
|
"Chert",
|
||||||
|
"Esker",
|
||||||
|
"Felspar",
|
||||||
|
"Gabbro",
|
||||||
|
"Solanum",
|
||||||
|
"Prisoner"
|
||||||
|
]
|
||||||
|
},
|
||||||
"InstrumentZoneInfo": {
|
"InstrumentZoneInfo": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user