Build 0.20.4.0

This commit is contained in:
Markus Isberg
2022-11-11 17:57:23 +02:00
parent edaf4b09fe
commit 54712b5dc9
201 changed files with 7618 additions and 2020 deletions
@@ -61,7 +61,7 @@ namespace Barotrauma
private LocationType addInitialMissionsForType;
public bool Discovered { get; private set; }
public bool Discovered => GameMain.GameSession?.Map?.IsDiscovered(this) ?? false;
public readonly Dictionary<LocationTypeChange.Requirement, int> ProximityTimer = new Dictionary<LocationTypeChange.Requirement, int>();
public (LocationTypeChange typeChange, int delay, MissionPrefab parentMission)? PendingLocationTypeChange;
@@ -287,12 +287,12 @@ namespace Barotrauma
var characters = GameSession.GetSessionCrewCharacters(CharacterType.Both);
if (characters.Any())
{
if (Location.Reputation?.Faction is { } faction && faction.IsAffiliated())
if (Location.Reputation?.Faction is { } faction && faction.GetPlayerAffiliationStatus() is FactionAffiliation.Affiliated)
{
price *= 1f - characters.Max(static c => c.GetStatValue(StatTypes.StoreBuyMultiplierAffiliated));
}
price *= 1f - characters.Max(static c => c.GetStatValue(StatTypes.StoreBuyMultiplier));
price *= 1f + characters.Max(c => item.Tags.Sum(tag => c.Info.GetSavedStatValue(StatTypes.StoreBuyMultiplier, tag)));
price *= 1f - characters.Max(static c => c.GetStatValue(StatTypes.StoreBuyMultiplier, includeSaved: false));
price *= 1f - characters.Max(c => item.Tags.Sum(tag => c.Info.GetSavedStatValue(StatTypes.StoreBuyMultiplier, tag)));
}
// Price should never go below 1 mk
return Math.Max((int)price, 1);
@@ -497,7 +497,6 @@ namespace Barotrauma
baseName = element.GetAttributeString("basename", "");
Name = element.GetAttributeString("name", "");
MapPosition = element.GetAttributeVector2("position", Vector2.Zero);
Discovered = element.GetAttributeBool("discovered", false);
PriceMultiplier = element.GetAttributeFloat("pricemultiplier", 1.0f);
IsGateBetweenBiomes = element.GetAttributeBool("isgatebetweenbiomes", false);
MechanicalPriceMultiplier = element.GetAttributeFloat("mechanicalpricemultipler", 1.0f);
@@ -1292,14 +1291,17 @@ namespace Barotrauma
return characters.Sum(c => (int)c.GetStatValue(StatTypes.ExtraSpecialSalesCount));
}
public void Discover(bool checkTalents = true)
public int HighestSubmarineTierAvailable(SubmarineClass submarineClass)
{
if (Discovered) { return; }
Discovered = true;
if (checkTalents)
{
GameSession.GetSessionCrewCharacters(CharacterType.Both).ForEach(c => c.CheckTalents(AbilityEffectType.OnLocationDiscovered, new AbilityLocation(this)));
}
if (!HasOutpost()) { return 0; }
return Biome?.HighestSubmarineTierAvailable(submarineClass, Type.Identifier) ?? SubmarineInfo.HighestTier;
}
public int HighestSubmarineTierAvailable() => HighestSubmarineTierAvailable(SubmarineClass.Undefined);
public bool IsSubmarineAvailable(SubmarineInfo info)
{
return Biome?.IsSubmarineAvailable(info, Type.Identifier) ?? true;
}
public void Reset()
@@ -1313,7 +1315,6 @@ namespace Barotrauma
ClearMissions();
LevelData?.EventHistory?.Clear();
UnlockInitialMissions();
Discovered = false;
}
public XElement Save(Map map, XElement parentElement)
@@ -1324,7 +1325,6 @@ namespace Barotrauma
new XAttribute("basename", BaseName),
new XAttribute("name", Name),
new XAttribute("biome", Biome?.Identifier.Value ?? string.Empty),
new XAttribute("discovered", Discovered),
new XAttribute("position", XMLExtensions.Vector2ToString(MapPosition)),
new XAttribute("pricemultiplier", PriceMultiplier),
new XAttribute("isgatebetweenbiomes", IsGateBetweenBiomes),
@@ -1453,7 +1453,7 @@ namespace Barotrauma
HireManager?.Remove();
}
class AbilityLocation : AbilityObject, IAbilityLocation
public class AbilityLocation : AbilityObject, IAbilityLocation
{
public AbilityLocation(Location location)
{
@@ -24,6 +24,7 @@ namespace Barotrauma
public readonly Dictionary<int, int> MinCountPerZone = new Dictionary<int, int>();
public readonly LocalizedString Name;
public readonly LocalizedString Description;
public readonly float BeaconStationChance;
@@ -70,6 +71,13 @@ namespace Barotrauma
public Sprite Sprite { get; private set; }
public Sprite RadiationSprite { get; }
private readonly Identifier forceOutpostGenerationParamsIdentifier;
/// <summary>
/// If set to true, only event sets that explicitly define this location type in <see cref="EventSet.LocationTypeIdentifiers"/> can be selected at this location. Defaults to false.
/// </summary>
public bool IgnoreGenericEvents { get; }
public Color SpriteColor
{
get;
@@ -96,6 +104,7 @@ namespace Barotrauma
public LocationType(ContentXElement element, LocationTypesFile file) : base(file, element.GetAttributeIdentifier("identifier", element.Name.LocalName))
{
Name = TextManager.Get("LocationName." + Identifier, "unknown");
Description = TextManager.Get("LocationDescription." + Identifier, "");
BeaconStationChance = element.GetAttributeFloat("beaconstationchance", 0.0f);
@@ -110,6 +119,10 @@ namespace Barotrauma
ReplaceInRadiation = element.GetAttributeIdentifier(nameof(ReplaceInRadiation), Identifier.Empty);
forceOutpostGenerationParamsIdentifier = element.GetAttributeIdentifier("forceoutpostgenerationparams", Identifier.Empty);
IgnoreGenericEvents = element.GetAttributeBool(nameof(IgnoreGenericEvents), false);
string teamStr = element.GetAttributeString("outpostteam", "FriendlyNPC");
Enum.TryParse(teamStr, out OutpostTeam);
@@ -261,6 +274,15 @@ namespace Barotrauma
}
}
public OutpostGenerationParams GetForcedOutpostGenerationParams()
{
if (OutpostGenerationParams.OutpostParams.TryGet(forceOutpostGenerationParamsIdentifier, out var parameters))
{
return parameters;
}
return null;
}
public override void Dispose() { }
}
}
@@ -68,10 +68,15 @@ namespace Barotrauma
public List<Location> Locations { get; private set; }
private readonly List<Location> locationsDiscovered = new List<Location>();
private readonly List<Location> outpostsVisited = new List<Location>();
public List<LocationConnection> Connections { get; private set; }
public Radiation Radiation;
private bool wasLocationDiscoveryOrderTracked = true;
public Map(CampaignSettings settings)
{
generationParams = MapGenerationParams.Instance;
@@ -282,7 +287,12 @@ namespace Barotrauma
}
}
CurrentLocation.Discover(true);
if (campaign.IsSinglePlayer && campaign.Settings.TutorialEnabled && LocationType.Prefabs.TryGet("tutorialoutpost", out var tutorialOutpost))
{
CurrentLocation.ChangeType(tutorialOutpost);
}
Discover(CurrentLocation);
Visit(CurrentLocation);
CurrentLocation.CreateStores();
foreach (var location in Locations)
@@ -820,7 +830,8 @@ namespace Barotrauma
SelectedConnection.Passed = true;
CurrentLocation = SelectedLocation;
CurrentLocation.Discover();
Discover(CurrentLocation);
Visit(CurrentLocation);
SelectedLocation = null;
CurrentLocation.CreateStores();
@@ -851,7 +862,7 @@ namespace Barotrauma
Location prevLocation = CurrentLocation;
CurrentLocation = Locations[index];
CurrentLocation.Discover();
Discover(CurrentLocation);
CurrentLocation.CreateStores();
if (prevLocation != CurrentLocation)
@@ -1184,6 +1195,51 @@ namespace Barotrauma
partial void ClearAnimQueue();
public void Discover(Location location, bool checkTalents = true)
{
if (location is null) { return; }
if (locationsDiscovered.Contains(location)) { return; }
locationsDiscovered.Add(location);
if (checkTalents)
{
GameSession.GetSessionCrewCharacters(CharacterType.Both).ForEach(c => c.CheckTalents(AbilityEffectType.OnLocationDiscovered, new Location.AbilityLocation(location)));
}
}
public void Visit(Location location)
{
if (location is null) { return; }
if (!location.HasOutpost()) { return; }
if (outpostsVisited.Contains(location)) { return; }
outpostsVisited.Add(location);
}
public void ClearLocationHistory()
{
locationsDiscovered.Clear();
outpostsVisited.Clear();
}
public int? GetDiscoveryIndex(Location location)
{
if (!wasLocationDiscoveryOrderTracked) { return null; }
if (location is null) { return -1; }
return locationsDiscovered.IndexOf(location);
}
public int? GetVisitIndex(Location location)
{
if (!wasLocationDiscoveryOrderTracked) { return null; }
if (location is null) { return -1; }
return outpostsVisited.IndexOf(location);
}
public bool IsDiscovered(Location location)
{
if (location is null) { return false; }
return locationsDiscovered.Contains(location);
}
/// <summary>
/// Load a previously saved map from an xml element
/// </summary>
@@ -1211,6 +1267,7 @@ namespace Barotrauma
return;
}
ClearLocationHistory();
foreach (var subElement in element.Elements())
{
switch (subElement.Name.ToString().ToLowerInvariant())
@@ -1226,19 +1283,12 @@ namespace Barotrauma
}
}
location.LoadLocationTypeChange(subElement);
// Backwards compatibility
if (subElement.GetAttributeBool("discovered", false))
{
location.Discover(checkTalents: false);
}
if (location.Discovered)
{
#if CLIENT
RemoveFogOfWar(location);
#endif
if (furthestDiscoveredLocation == null || location.MapPosition.X > furthestDiscoveredLocation.MapPosition.X)
{
furthestDiscoveredLocation = location;
}
Discover(location);
wasLocationDiscoveryOrderTracked = false;
}
Identifier locationType = subElement.GetAttributeIdentifier("type", Identifier.Empty);
@@ -1268,6 +1318,36 @@ namespace Barotrauma
case "radiation":
Radiation = new Radiation(this, generationParams.RadiationParams, subElement);
break;
case "discovered":
foreach (var childElement in subElement.GetChildElements("location"))
{
int index = childElement.GetAttributeInt("i", -1);
if (index < 0) { continue; }
if (Locations[index] is not Location l) { continue; }
Discover(l);
}
break;
case "visited":
foreach (var childElement in subElement.GetChildElements("location"))
{
int index = childElement.GetAttributeInt("i", -1);
if (index < 0) { continue; }
if (Locations[index] is not Location l) { continue; }
Visit(l);
}
break;
}
}
void Discover(Location location)
{
this.Discover(location, checkTalents: false);
#if CLIENT
RemoveFogOfWar(location);
#endif
if (furthestDiscoveredLocation == null || location.MapPosition.X > furthestDiscoveredLocation.MapPosition.X)
{
furthestDiscoveredLocation = location;
}
}
@@ -1343,6 +1423,30 @@ namespace Barotrauma
mapElement.Add(Radiation.Save());
}
if (locationsDiscovered.Any())
{
var discoveryElement = new XElement("discovered");
foreach (Location location in locationsDiscovered)
{
int index = Locations.IndexOf(location);
var locationElement = new XElement("location", new XAttribute("i", index));
discoveryElement.Add(locationElement);
}
mapElement.Add(discoveryElement);
}
if (outpostsVisited.Any())
{
var visitElement = new XElement("visited");
foreach (Location location in outpostsVisited)
{
int index = Locations.IndexOf(location);
var locationElement = new XElement("location", new XAttribute("i", index));
visitElement.Add(locationElement);
}
mapElement.Add(visitElement);
}
element.Add(mapElement);
}