/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Unity.Mathematics; using static Unity.Mathematics.math; using static Unity.Mathematics.noise; public abstract class Behavior { public BehaviorData Data { get; } public EquippedItem Item { get; } private ConsumableItemEffect Consumable { get; } protected ItemManager ItemManager { get; } protected Entity Entity => Item?.Entity ?? Consumable.Entity; public float Temperature => Item?.Temperature ?? Consumable.Entity.MaxTemp; public float3 Direction { get { if(Item != null) { var hardpoint = Entity.Hardpoints[Item.Position.x, Item.Position.y]; if (hardpoint != null && Entity.HardpointTransforms.TryGetValue(hardpoint, out var hardpointTransform)) { return normalize(hardpointTransform.direction); } else { var itemDirection = Entity.Direction.Rotate(Item.EquippableItem.Rotation); return float3(itemDirection.x, 0, itemDirection.y); } } return float3(Entity.Direction.x, 0, Entity.Direction.y); } } protected Behavior(BehaviorData data, EquippedItem item) { Data = data; Item = item; ItemManager = Item.ItemManager; } protected Behavior(BehaviorData data, ConsumableItemEffect consumable) { Data = data; Consumable = consumable; ItemManager = consumable.Entity.ItemManager; } public float Evaluate(PerformanceStat stat) => Item?.Evaluate(stat) ?? Consumable.Evaluate(stat); protected void AddHeat(float heat) => Item?.AddHeat(heat); // TODO: Heat for Consumables protected void CauseDamage(float damage) { if (Item != null) { Item.EquippableItem.Durability -= damage; Entity.ItemDamage.OnNext((Item, damage)); } else { Consumable.Entity.Hull.Durability -= damage; Consumable.Entity.HullDamage.OnNext(damage); } } protected void CauseWearDamage(float multiplier) { if (Item != null) { CauseDamage(Item.Wear * multiplier); } } public virtual bool Execute(float dt) { return true; } } public interface IActivatedBehavior { void Activate(); void Deactivate(); } public interface IAnalogBehavior { float Axis { get; set; } } public interface IEventBehavior { void ResetEvents(); } public interface IInitializableBehavior { void Initialize(); } public interface IInteractiveBehavior { bool Exposed { get; } } public interface IAlwaysUpdatedBehavior { void Update(float delta); } public interface IProgressBehavior { float Progress { get; } } public interface IOrderedBehavior { int Order { get; } } public interface IPersistentBehavior// where T : IBehavior { PersistentBehaviorData Store(); void Restore(PersistentBehaviorData data); } public interface IPopulationAssignment { int AssignedPopulation { get; set; } } public abstract class PersistentBehaviorData { } [Inspectable] public abstract class BehaviorData { [Inspectable, LegacyPayloadKey(0)] public int Group; public abstract Behavior CreateInstance(EquippedItem item); public abstract Behavior CreateInstance(ConsumableItemEffect consumable); public override string ToString() { return base.ToString().FormatTypeName(); } }