Release 1.10.5.0 - Autumn Update 2025

This commit is contained in:
Regalis11
2025-09-17 13:44:21 +03:00
parent d13836ce87
commit caa0326cf8
120 changed files with 2584 additions and 635 deletions
@@ -6,6 +6,7 @@ using Microsoft.Xna.Framework.Input;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
namespace Barotrauma
@@ -50,9 +51,15 @@ namespace Barotrauma
}
private RichString selectedTip;
private string selectedTipString;
private ImmutableArray<RichTextData>? selectedTipRichTextData;
private void SetSelectedTip(LocalizedString tip)
{
selectedTip = RichString.Rich(tip);
selectedTipString = string.Empty;
selectedTipRichTextData = null;
}
public float LoadState;
@@ -165,13 +172,20 @@ namespace Barotrauma
textPos.Y += GUIStyle.LargeFont.MeasureString(loadText.ToUpper()).Y * 1.2f;
}
if (GUIStyle.Font.HasValue && selectedTip != null)
if (GUIStyle.Font.HasValue && selectedTip != null && !selectedTip.SanitizedValue.IsNullOrEmpty())
{
string wrappedTip = ToolBox.WrapText(selectedTip.SanitizedValue, GameMain.GraphicsWidth * 0.3f, GUIStyle.Font.Value);
string[] lines = wrappedTip.Split('\n');
float lineHeight = GUIStyle.Font.MeasureString(selectedTip).Y;
//store the string value of the LocalizedString to prevent the text from changing if/when new text packs are loaded during the loading screen
if (selectedTipString.IsNullOrEmpty())
{
selectedTipString = selectedTip.SanitizedValue;
selectedTipRichTextData = selectedTip.RichTextData;
}
if (selectedTip.RichTextData != null)
string wrappedTip = ToolBox.WrapText(selectedTipString, GameMain.GraphicsWidth * 0.3f, GUIStyle.Font.Value);
string[] lines = wrappedTip.Split('\n');
float lineHeight = GUIStyle.Font.MeasureString(selectedTipString).Y;
if (selectedTipRichTextData != null)
{
int rtdOffset = 0;
for (int i = 0; i < lines.Length; i++)
@@ -179,7 +193,7 @@ namespace Barotrauma
GUIStyle.Font.DrawStringWithColors(spriteBatch, lines[i],
new Vector2(textPos.X, (int)(textPos.Y + i * lineHeight)),
Color.White,
0f, Vector2.Zero, 1f, SpriteEffects.None, 0f, selectedTip.RichTextData.Value, rtdOffset);
0f, Vector2.Zero, 1f, SpriteEffects.None, 0f, selectedTipRichTextData.Value, rtdOffset);
rtdOffset += lines[i].Length;
}
}
@@ -860,26 +860,22 @@ namespace Barotrauma
FilterStoreItems(category, searchBox.Text);
}
private static KeyValuePair<Identifier, float>? GetReputationRequirement(PriceInfo priceInfo)
private static float GetReputationRequirement(PriceInfo priceInfo, Identifier faction)
{
return GameMain.GameSession?.Campaign is not null
? priceInfo.MinReputation.FirstOrNull()
: null;
return priceInfo.MinReputation.GetValueOrDefault(faction);
}
private static KeyValuePair<Identifier, float>? GetTooLowReputation(PriceInfo priceInfo)
private static bool ReputationRequirementsMet(PriceInfo priceInfo, Identifier faction)
{
if (priceInfo.MinReputation.None()) { return true; }
if (GameMain.GameSession?.Campaign is CampaignMode campaign)
{
foreach (var minRep in priceInfo.MinReputation)
if (priceInfo.MinReputation.TryGetValue(faction, out float requirement))
{
if (MathF.Round(campaign.GetReputation(minRep.Key)) < minRep.Value)
{
return minRep;
}
return MathF.Round(campaign.GetReputation(faction)) >= requirement;
}
}
return null;
return false;
}
int prevDailySpecialCount, prevRequestedGoodsCount, prevSubRequestedGoodsCount;
@@ -948,7 +944,7 @@ namespace Barotrauma
SetPriceGetters(itemFrame, true);
}
SetItemFrameStatus(itemFrame, hasPermissions && quantity > 0 && !GetTooLowReputation(priceInfo).HasValue);
SetItemFrameStatus(itemFrame, hasPermissions && quantity > 0 && ReputationRequirementsMet(priceInfo, ActiveStore.GetMerchantOrLocationFactionIdentifier()));
existingItemFrames.Add(itemFrame);
}
}
@@ -1464,8 +1460,9 @@ namespace Barotrauma
PriceInfo priceInfo2 = item2.ItemPrefab.GetPriceInfo(ActiveStore);
if (priceInfo1 != null && priceInfo2 != null)
{
var requiredReputation1 = GetTooLowReputation(priceInfo1)?.Value ?? 0.0f;
var requiredReputation2 = GetTooLowReputation(priceInfo2)?.Value ?? 0.0f;
Identifier faction = ActiveStore.GetMerchantOrLocationFactionIdentifier();
float requiredReputation1 = ReputationRequirementsMet(priceInfo1, faction) ? 0.0f : GetReputationRequirement(priceInfo1, faction);
float requiredReputation2 = ReputationRequirementsMet(priceInfo2, faction) ? 0.0f : GetReputationRequirement(priceInfo2, faction);
return requiredReputation1.CompareTo(requiredReputation2);
}
return 0;
@@ -1942,14 +1939,15 @@ namespace Barotrauma
var campaign = GameMain.GameSession?.Campaign;
if (priceInfo != null && campaign != null)
{
var requiredReputation = GetReputationRequirement(priceInfo);
if (requiredReputation != null)
Identifier faction = ActiveStore.GetMerchantOrLocationFactionIdentifier();
float requiredReputation = GetReputationRequirement(priceInfo, faction);
if (requiredReputation > 0)
{
var repStr = TextManager.GetWithVariables(
"campaignstore.reputationrequired",
("[amount]", ((int)requiredReputation.Value.Value).ToString()),
("[faction]", TextManager.Get("faction." + requiredReputation.Value.Key).Value));
Color color = MathF.Round(campaign.GetReputation(requiredReputation.Value.Key)) < requiredReputation.Value.Value ?
("[amount]", ((int)requiredReputation).ToString()),
("[faction]", TextManager.Get("faction." + faction).Value));
Color color = MathF.Round(campaign.GetReputation(faction)) < requiredReputation ?
GUIStyle.Orange : GUIStyle.Green;
toolTip += $"\n‖color:{color.ToStringHex()}‖{repStr}‖color:end‖";
}
@@ -1743,12 +1743,12 @@ namespace Barotrauma
}
}
static void CreateMaterialCosts(GUIListBox list, UpgradePrefab prefab, int targetLevel)
static void CreateMaterialCosts(GUIListBox list, UpgradePrefab upgradePrefab, int targetLevel)
{
list.Content.ClearChildren();
var allItems = CargoManager.FindAllItemsOnPlayerAndSub(Character.Controlled);
var resources = prefab.GetApplicableResources(targetLevel);
var resources = upgradePrefab.GetApplicableResources(targetLevel);
foreach (ApplicableResourceCollection collection in resources)
{
@@ -1769,7 +1769,7 @@ namespace Barotrauma
bool hasItems = collection.Cost.Amount <= allItems.Count(collection.Cost.MatchesItem);
Sprite icon = defaultItemPrefab.InventoryIcon ?? prefab.Sprite;
Sprite icon = defaultItemPrefab.InventoryIcon ?? defaultItemPrefab.Sprite;
Color iconColor = defaultItemPrefab.InventoryIcon is null ? defaultItemPrefab.SpriteColor : defaultItemPrefab.InventoryIconColor;
GUIImage itemIcon = new GUIImage(new RectTransform(Vector2.One, itemFrame.RectTransform, scaleBasis: ScaleBasis.Smallest, anchor: Anchor.Center), sprite: icon, scaleToFit: true)
@@ -1798,7 +1798,7 @@ namespace Barotrauma
if (index > length) { index = 0; }
ItemPrefab currentPrefab = collection.MatchingItems[(int)MathF.Floor(index)];
Sprite icon = currentPrefab.InventoryIcon ?? prefab.Sprite;
Sprite icon = currentPrefab.InventoryIcon ?? currentPrefab.Sprite;
Color iconColor = currentPrefab.InventoryIcon is null ? currentPrefab.SpriteColor : currentPrefab.InventoryIconColor;
itemIcon.Sprite = icon;
itemIcon.Color = hasItems ? iconColor : iconColor * 0.9f;