v1.6.17.0 (Unto the Breach update)

This commit is contained in:
Regalis11
2024-10-22 17:29:04 +03:00
parent e74b3cdb17
commit 6e6c17e100
417 changed files with 17166 additions and 5870 deletions
@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
@@ -7,31 +6,13 @@ namespace Barotrauma.Abilities
{
class AbilityConditionMission : AbilityConditionData
{
private readonly ImmutableHashSet<MissionType> missionType;
private readonly ImmutableHashSet<Identifier> missionType;
private readonly bool isAffiliated;
public AbilityConditionMission(CharacterTalent characterTalent, ContentXElement conditionElement) : base(characterTalent, conditionElement)
{
string[] missionTypeStrings = conditionElement.GetAttributeStringArray("missiontype", new []{ "None" })!;
HashSet<MissionType> missionTypes = new HashSet<MissionType>();
missionType = conditionElement.GetAttributeIdentifierImmutableHashSet("missiontype", ImmutableHashSet<Identifier>.Empty)!;
isAffiliated = conditionElement.GetAttributeBool("isaffiliated", false);
foreach (string missionTypeString in missionTypeStrings)
{
if (!Enum.TryParse(missionTypeString, out MissionType parsedMission) || parsedMission is MissionType.None)
{
if (!isAffiliated)
{
DebugConsole.ThrowError($"Error in AbilityConditionMission \"{characterTalent.DebugIdentifier}\" - \"{missionTypeString}\" is not a valid mission type.",
contentPackage: conditionElement.ContentPackage);
}
continue;
}
missionTypes.Add(parsedMission);
}
missionType = missionTypes.ToImmutableHashSet();
}
protected override bool MatchesConditionSpecific(AbilityObject abilityObject)
@@ -8,7 +8,7 @@ namespace Barotrauma.Abilities
protected override bool MatchesConditionSpecific()
{
foreach (Character c in GameSession.GetSessionCrewCharacters(CharacterType.Both))
foreach (Character c in Character.GetFriendlyCrew(character))
{
if (!c.IsDead && c.IsUnconscious)
{
@@ -1,18 +1,13 @@
using Barotrauma.Items.Components;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
namespace Barotrauma.Abilities
namespace Barotrauma.Abilities
{
class AbilityConditionHasSkill : AbilityConditionDataless
{
private readonly string skillIdentifier;
private readonly Identifier skillIdentifier;
private readonly float minValue;
public AbilityConditionHasSkill(CharacterTalent characterTalent, ContentXElement conditionElement) : base(characterTalent, conditionElement)
{
skillIdentifier = conditionElement.GetAttributeString("skillidentifier", string.Empty);
skillIdentifier = conditionElement.GetAttributeIdentifier("skillidentifier", Identifier.Empty);
minValue = conditionElement.GetAttributeFloat("minvalue", 0f);
}
@@ -9,7 +9,7 @@ namespace Barotrauma.Abilities
protected override bool MatchesCharacter(Character character)
{
int ownLevel = character.Info.GetCurrentLevel();
foreach (Character otherCharacter in GameSession.GetSessionCrewCharacters(CharacterType.Both))
foreach (Character otherCharacter in Character.GetFriendlyCrew(character))
{
if (otherCharacter == character) { continue; }
if (otherCharacter.Info.GetCurrentLevel() < ownLevel) { return false; }
@@ -13,13 +13,15 @@
{
if (GameMain.GameSession == null) { return false; }
foreach (Character character in GameMain.GameSession.Casualties)
foreach (Character deadCharacter in GameMain.GameSession.Casualties)
{
if (assistantsDontCount && character.Info?.Job?.Prefab.Identifier == "assistant")
if (deadCharacter.TeamID != character.TeamID) { continue; }
if (assistantsDontCount && deadCharacter.Info?.Job?.Prefab.Identifier == "assistant")
{
continue;
}
if (character.CauseOfDeath != null && character.CauseOfDeath.Type != CauseOfDeathType.Disconnected)
if (deadCharacter.CauseOfDeath != null && deadCharacter.CauseOfDeath.Type != CauseOfDeathType.Disconnected)
{
return false;
}
@@ -14,7 +14,8 @@
float waterVolume = 0.0f, totalVolume = 0.0f;
foreach (Hull hull in Hull.HullList)
{
if (hull.Submarine != character.Submarine) { continue; }
if (hull.Submarine is not { } hullSubmarine) { continue; }
if (hullSubmarine != character.Submarine || hullSubmarine.TeamID != character.TeamID) { continue; }
waterVolume += hull.WaterVolume;
totalVolume += hull.Volume;
}
@@ -26,7 +26,7 @@ namespace Barotrauma.Abilities
return;
}
foreach (Character character in GameSession.GetSessionCrewCharacters(CharacterType.Both))
foreach (Character character in Character.GetFriendlyCrew(Character))
{
JobPrefab? characterJob = character.Info?.Job?.Prefab;
if (characterJob is null) { continue; }
@@ -4,14 +4,14 @@
{
private readonly Identifier afflictionId;
private readonly float strength;
private readonly string multiplyStrengthBySkill;
private readonly Identifier multiplyStrengthBySkill;
private readonly bool setValue;
public CharacterAbilityGiveAffliction(CharacterAbilityGroup characterAbilityGroup, ContentXElement abilityElement) : base(characterAbilityGroup, abilityElement)
{
afflictionId = abilityElement.GetAttributeIdentifier("afflictionid", abilityElement.GetAttributeIdentifier("affliction", Identifier.Empty));
strength = abilityElement.GetAttributeFloat("strength", 0f);
multiplyStrengthBySkill = abilityElement.GetAttributeString("multiplystrengthbyskill", string.Empty);
multiplyStrengthBySkill = abilityElement.GetAttributeIdentifier("multiplystrengthbyskill", Identifier.Empty);
setValue = abilityElement.GetAttributeBool("setvalue", false);
if (afflictionId.IsEmpty)
@@ -52,7 +52,7 @@
return;
}
float strength = this.strength;
if (!string.IsNullOrEmpty(multiplyStrengthBySkill))
if (!multiplyStrengthBySkill.IsEmpty)
{
strength *= Character.GetSkillLevel(multiplyStrengthBySkill);
}
@@ -20,7 +20,7 @@ namespace Barotrauma.Abilities
{
if (!addingFirstTime) { return; }
foreach (Character character in GameSession.GetSessionCrewCharacters(CharacterType.Both))
foreach (Character character in Character.GetFriendlyCrew(Character))
{
if (character.Info is null) { return; }
character.Info.AdditionalTalentPoints += amount;
@@ -6,7 +6,7 @@ namespace Barotrauma.Abilities
{
private readonly StatTypes statType;
private readonly float maxValue;
private readonly string skillIdentifier;
private readonly Identifier skillIdentifier;
private readonly bool useAll;
private float lastValue = 0f;
public override bool AllowClientSimulation => true;
@@ -15,7 +15,7 @@ namespace Barotrauma.Abilities
{
statType = CharacterAbilityGroup.ParseStatType(abilityElement.GetAttributeString("stattype", ""), CharacterTalent.DebugIdentifier);
maxValue = abilityElement.GetAttributeFloat("maxvalue", 0f);
skillIdentifier = abilityElement.GetAttributeString("skillidentifier", string.Empty);
skillIdentifier = abilityElement.GetAttributeIdentifier("skillidentifier", Identifier.Empty);
useAll = skillIdentifier == "all";
}
@@ -5,6 +5,8 @@
private readonly float addedValue;
private readonly float multiplyValue;
public override bool AllowClientSimulation => true;
public CharacterAbilityModifyValue(CharacterAbilityGroup characterAbilityGroup, ContentXElement abilityElement) : base(characterAbilityGroup, abilityElement)
{
addedValue = abilityElement.GetAttributeFloat("addedvalue", 0f);
@@ -6,6 +6,7 @@ internal class CharacterAbilityUpgradeSubmarine : CharacterAbility
private readonly UpgradePrefab? upgradePrefab;
private readonly UpgradeCategory? upgradeCategory;
public readonly int level;
private readonly bool giveOnAddingFirstTime;
public override bool AllowClientSimulation => true;
@@ -13,7 +14,8 @@ internal class CharacterAbilityUpgradeSubmarine : CharacterAbility
{
var prefabIdentifier = abilityElement.GetAttributeIdentifier(nameof(upgradePrefab), Identifier.Empty);
var categoryIdentifier = abilityElement.GetAttributeIdentifier(nameof(upgradeCategory), Identifier.Empty);
giveOnAddingFirstTime = abilityElement.GetAttributeBool("giveonaddingfirsttime", characterAbilityGroup.AbilityEffectType == AbilityEffectType.None);
if (UpgradePrefab.Find(prefabIdentifier) is not { } foundUpgradePrefab)
{
DebugConsole.ThrowError($"Error in talent {CharacterTalent.DebugIdentifier}, {nameof(CharacterAbilityUpgradeSubmarine)} - {nameof(upgradePrefab)} not found.",
@@ -47,6 +49,14 @@ internal class CharacterAbilityUpgradeSubmarine : CharacterAbility
ApplyEffectSpecific();
}
public override void InitializeAbility(bool addingFirstTime)
{
if (addingFirstTime && giveOnAddingFirstTime)
{
ApplyEffectSpecific();
}
}
private void ApplyEffectSpecific()
{
if (upgradePrefab == null || upgradeCategory == null) { return; }
@@ -24,7 +24,11 @@ namespace Barotrauma.Abilities
foreach (Character enemyCharacter in enemyCharacters)
{
if (!enemyCharacter.IsHuman) { continue; }
if (enemyCharacter.Submarine == null || enemyCharacter.Submarine != Submarine.MainSub) { continue; }
if (enemyCharacter.Submarine == null ||
(Submarine.MainSub != null && enemyCharacter.Submarine != Submarine.MainSub))
{
continue;
}
if (enemyCharacter.IsDead) { continue; }
if (!enemyCharacter.LockHands) { continue; }
Character.GiveMoney(moneyAmount);
@@ -1,4 +1,4 @@
#nullable enable
#nullable enable
using System;
using Barotrauma.Extensions;
@@ -31,7 +31,7 @@ namespace Barotrauma.Abilities
if (!TalentTree.JobTalentTrees.TryGet(apprentice.Identifier, out TalentTree? talentTree)) { return; }
ImmutableHashSet<Character> characters = GameSession.GetSessionCrewCharacters(CharacterType.Both);
var characters = Character.GetFriendlyCrew(Character);
HashSet<ImmutableHashSet<Identifier>> talentsTrees = new HashSet<ImmutableHashSet<Identifier>>();
foreach (TalentSubTree subTree in talentTree.TalentSubTrees)
@@ -60,13 +60,14 @@ namespace Barotrauma.Abilities
talentsTrees.Add(identifiers.ToImmutableHashSet());
}
ImmutableHashSet<Identifier> selectedTalentTree = talentsTrees.GetRandomUnsynced();
foreach (Identifier identifier in selectedTalentTree)
ImmutableHashSet<Identifier>? selectedTalentTree = talentsTrees.GetRandomUnsynced();
if (selectedTalentTree != null)
{
if (Character.HasTalent(identifier)) { continue; }
Character.GiveTalent(identifier);
foreach (Identifier identifier in selectedTalentTree)
{
if (Character.HasTalent(identifier)) { continue; }
Character.GiveTalent(identifier);
}
}
static bool IsShowCaseTalent(Identifier identifier, TalentOption option)
@@ -12,14 +12,20 @@
internal class CharacterAbilityWarStories : CharacterAbility
{
private readonly Identifier targetStat;
private readonly float minCondition;
private readonly float normalQualityThreshold;
private readonly float goodQualityThreshold;
private readonly float excellentQualityThreshold;
private readonly float masterworkQualityThreshold;
private readonly ItemPrefab prefab;
public CharacterAbilityWarStories(CharacterAbilityGroup characterAbilityGroup, ContentXElement abilityElement) : base(characterAbilityGroup, abilityElement)
{
targetStat = abilityElement.GetAttributeIdentifier("target", Identifier.Empty);
minCondition = abilityElement.GetAttributeFloat("mincondition", 1);
normalQualityThreshold = abilityElement.GetAttributeFloat("normalqualitythreshold", 4);
goodQualityThreshold = abilityElement.GetAttributeFloat("goodqualitythreshold", 10);
excellentQualityThreshold = abilityElement.GetAttributeFloat("excellentqualitythreshold", 20);
masterworkQualityThreshold = abilityElement.GetAttributeFloat("masterworkqualitythreshold", 30);
if (targetStat.IsEmpty)
{
@@ -37,23 +43,28 @@ internal class CharacterAbilityWarStories : CharacterAbility
{
if (prefab is null || Character is null) { return; }
float condition = Character.Info?.GetSavedStatValue(StatTypes.None, targetStat) ?? 0;
if (condition < minCondition) { return; }
float statValue = Character.Info?.GetSavedStatValue(StatTypes.None, targetStat) ?? 0;
if (statValue < normalQualityThreshold) { return; }
int quality = 0;
if (statValue >= masterworkQualityThreshold) { quality = 3; }
else if (statValue >= excellentQualityThreshold) { quality = 2; }
else if (statValue >= goodQualityThreshold) { quality = 1; }
if (GameMain.GameSession?.RoundEnding ?? true)
{
Item item = new(prefab, Character.WorldPosition, Character.Submarine)
{
Condition = condition,
HealthMultiplier = condition
Quality = quality,
};
Character.Inventory.TryPutItem(item, Character, item.AllowedSlots);
}
else
{
Entity.Spawner?.AddItemToSpawnQueue(prefab, Character.Inventory, condition: condition, onSpawned: item =>
Entity.Spawner?.AddItemToSpawnQueue(prefab, Character.Inventory, quality: quality, onSpawned: item =>
{
item.HealthMultiplier = condition;
item.Quality = quality;
});
}
}
@@ -131,7 +131,7 @@ namespace Barotrauma
if (character.Info.GetTotalTalentPoints() - selectedTalents.Count <= 0) { return false; }
if (!JobTalentTrees.TryGet(character.Info.Job.Prefab.Identifier, out TalentTree talentTree)) { return false; }
if (IsTalentLocked(talentIdentifier)) { return false; }
if (IsTalentLocked(talentIdentifier, Character.GetFriendlyCrew(character))) { return false; }
if (character.Info.GetUnlockedTalentsInTree().Contains(talentIdentifier))
{
@@ -163,10 +163,8 @@ namespace Barotrauma
return false;
}
public static bool IsTalentLocked(Identifier talentIdentifier, ImmutableHashSet<Character> characterList = null)
public static bool IsTalentLocked(Identifier talentIdentifier, IEnumerable<Character> characterList)
{
characterList ??= GameSession.GetSessionCrewCharacters(CharacterType.Both);
foreach (Character c in characterList)
{
if (c.Info.GetSavedStatValue(StatTypes.LockedTalents, talentIdentifier) >= 1) { return true; }