diff --git a/Assets/Scripts/Catalyst.meta b/Assets/Scripts/Catalyst.meta new file mode 100644 index 0000000..35b99e2 --- /dev/null +++ b/Assets/Scripts/Catalyst.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 530a136a208631a40badd6a022aa3678 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Catalyst/Catalyst.cs b/Assets/Scripts/Catalyst/Catalyst.cs new file mode 100644 index 0000000..12fb315 --- /dev/null +++ b/Assets/Scripts/Catalyst/Catalyst.cs @@ -0,0 +1,35 @@ +using UnityEngine; +using FractionGame.Utility; + +namespace FractionGame.Ingredients +{ + public class Catalyst : Draggable, IIngredient + { + [SerializeField] private int multiplierNumerator = 1; + [SerializeField] private int multiplierDenominator = 1; + [SerializeField] private string catalystName = "Catalyst"; + + public Fraction Multiplier => new Fraction(multiplierNumerator, multiplierDenominator); + + public Fraction Value + { + get + { + return new Fraction(0, 1); + } + } + + public IngredientType Type => IngredientType.CATALYST; + + public string Name => catalystName; + + void Start() + { + if (multiplierDenominator == 0) + { + Debug.LogError("Catalyst denominator cannot be zero."); + multiplierDenominator = 1; + } + } + } +} diff --git a/Assets/Scripts/Catalyst/Catalyst.cs.meta b/Assets/Scripts/Catalyst/Catalyst.cs.meta new file mode 100644 index 0000000..2559f80 --- /dev/null +++ b/Assets/Scripts/Catalyst/Catalyst.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: dc9f792f05eeeaf45843e5898161f86a \ No newline at end of file diff --git a/Assets/Scripts/Cauldron/Cauldron.cs b/Assets/Scripts/Cauldron/Cauldron.cs index 5bd287b..b8f7d00 100644 --- a/Assets/Scripts/Cauldron/Cauldron.cs +++ b/Assets/Scripts/Cauldron/Cauldron.cs @@ -13,20 +13,43 @@ public class Cauldron : MonoBehaviour public Fraction Value => value; public IReadOnlyList Ingredients => ingredients.AsReadOnly(); - public void AddIngredient(IIngredient ingredient) - { - if (ingredient == null) + public void AddIngredient(IIngredient ingredient) +{ + if (ingredient == null) + { + Debug.LogWarning("Tried to add a null ingredient to the cauldron."); + return; + } + + switch (ingredient.Type) + { + case IngredientType.CATALYST: + // Must cast to access multiplier + if (ingredient is Catalyst catalyst) { - Debug.LogWarning("Tried to add a null ingredient to the cauldron."); - return; + value = value * catalyst.Multiplier; + Debug.Log($"Catalyst '{catalyst.Name}' applied. Multiplier: {catalyst.Multiplier}. New total: {value}"); } + else + { + Debug.LogError("Ingredient is marked as CATALYST but not a Catalyst instance."); + } + break; + case IngredientType.PETAL: ingredients.Add(ingredient); value += ingredient.Value; - Debug.Log($"Added {ingredient.Type} '{ingredient.Name}' with value {ingredient.Value}. Total: {value}"); - } + break; + default: + Debug.LogWarning($"Unhandled ingredient type: {ingredient.Type}"); + break; + } + + // Optional: destroy used object + Destroy((ingredient as MonoBehaviour)?.gameObject); +} public void Subtraction() { if (ingredients.Count < 2) @@ -43,6 +66,8 @@ public void Subtraction() value = result; Debug.Log($"Performed subtraction. Resulting value: {value}"); + + } public void ResetCauldron() diff --git a/Assets/Scripts/Utility/Fraction.cs b/Assets/Scripts/Utility/Fraction.cs index b97ef2c..a992ff8 100644 --- a/Assets/Scripts/Utility/Fraction.cs +++ b/Assets/Scripts/Utility/Fraction.cs @@ -51,7 +51,7 @@ public override string ToString() { return $"{numerator}/{denominator}"; } - + public static Fraction operator +(Fraction a, Fraction b) { int numerator = a.numerator * b.denominator + b.numerator * a.denominator; @@ -61,9 +61,13 @@ public override string ToString() public static Fraction operator -(Fraction a, Fraction b) { - int numerator = a.numerator * b.denominator - b.numerator * a.denominator; - int denominator = a.denominator * b.denominator; - return new Fraction(numerator, denominator); + int numerator = a.numerator * b.denominator - b.numerator * a.denominator; + int denominator = a.denominator * b.denominator; + return new Fraction(numerator, denominator); + } + public static Fraction operator *(Fraction a, Fraction b) + { + return new Fraction(a.Numerator * b.Numerator, a.Denominator * b.Denominator); } } diff --git a/Assets/Tests/CauldronTestScene.unity b/Assets/Tests/CauldronTestScene.unity index 70d573b..9f01b63 100644 --- a/Assets/Tests/CauldronTestScene.unity +++ b/Assets/Tests/CauldronTestScene.unity @@ -663,6 +663,174 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 277690466} m_CullTransparentMesh: 1 +--- !u!1 &350238463 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 350238468} + - component: {fileID: 350238467} + - component: {fileID: 350238466} + - component: {fileID: 350238465} + - component: {fileID: 350238464} + m_Layer: 0 + m_Name: testCatalyst2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!58 &350238464 +CircleCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 350238463} + m_Enabled: 1 + serializedVersion: 3 + m_Density: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ForceSendLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ForceReceiveLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ContactCaptureLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_CallbackLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_IsTrigger: 0 + m_UsedByEffector: 0 + m_CompositeOperation: 0 + m_CompositeOrder: 0 + m_Offset: {x: 0, y: 0.21133333} + m_Radius: 0.5 +--- !u!50 &350238465 +Rigidbody2D: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 350238463} + m_BodyType: 0 + m_Simulated: 1 + m_UseFullKinematicContacts: 0 + m_UseAutoMass: 0 + m_Mass: 0.0001 + m_LinearDamping: 0 + m_AngularDamping: 0.05 + m_GravityScale: 0 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_Interpolate: 0 + m_SleepingMode: 1 + m_CollisionDetection: 0 + m_Constraints: 0 +--- !u!114 &350238466 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 350238463} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc9f792f05eeeaf45843e5898161f86a, type: 3} + m_Name: + m_EditorClassIdentifier: + multiplierNumerator: 3 + multiplierDenominator: 2 + catalystName: Catalyst +--- !u!212 &350238467 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 350238463} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 7482667652216324306, guid: 75f5f34dc1b5347e0b8351032682f224, type: 3} + m_Color: {r: 0.745283, g: 0.24256852, b: 0.24256852, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1, y: 1} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &350238468 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 350238463} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 6.05, y: 1.47, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &354389547 GameObject: m_ObjectHideFlags: 0 @@ -2052,6 +2220,174 @@ Rigidbody2D: m_SleepingMode: 1 m_CollisionDetection: 0 m_Constraints: 0 +--- !u!1 &1875519440 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1875519443} + - component: {fileID: 1875519442} + - component: {fileID: 1875519441} + - component: {fileID: 1875519445} + - component: {fileID: 1875519444} + m_Layer: 0 + m_Name: testCatalyst + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1875519441 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1875519440} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc9f792f05eeeaf45843e5898161f86a, type: 3} + m_Name: + m_EditorClassIdentifier: + multiplierNumerator: 2 + multiplierDenominator: 1 + catalystName: Catalyst +--- !u!212 &1875519442 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1875519440} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_Sprite: {fileID: 7482667652216324306, guid: 75f5f34dc1b5347e0b8351032682f224, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1, y: 1} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!4 &1875519443 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1875519440} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 4.7, y: 3.07, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!58 &1875519444 +CircleCollider2D: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1875519440} + m_Enabled: 1 + serializedVersion: 3 + m_Density: 1 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_ForceSendLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ForceReceiveLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_ContactCaptureLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_CallbackLayers: + serializedVersion: 2 + m_Bits: 4294967295 + m_IsTrigger: 0 + m_UsedByEffector: 0 + m_CompositeOperation: 0 + m_CompositeOrder: 0 + m_Offset: {x: 0, y: 0.21133333} + m_Radius: 0.5 +--- !u!50 &1875519445 +Rigidbody2D: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1875519440} + m_BodyType: 0 + m_Simulated: 1 + m_UseFullKinematicContacts: 0 + m_UseAutoMass: 0 + m_Mass: 0.0001 + m_LinearDamping: 0 + m_AngularDamping: 0.05 + m_GravityScale: 0 + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_Interpolate: 0 + m_SleepingMode: 1 + m_CollisionDetection: 0 + m_Constraints: 0 --- !u!1001 &1951300878 PrefabInstance: m_ObjectHideFlags: 0 @@ -2335,3 +2671,5 @@ SceneRoots: - {fileID: 864398700} - {fileID: 1429249797} - {fileID: 649550284} + - {fileID: 1875519443} + - {fileID: 350238468}