diff --git a/GPIS/Assets/Art/Spirits/Dungeon AI Background.png b/GPIS/Assets/Art/Spirits/Dungeon AI Background.png new file mode 100644 index 0000000..d8ce518 Binary files /dev/null and b/GPIS/Assets/Art/Spirits/Dungeon AI Background.png differ diff --git a/GPIS/Assets/Art/Spirits/Dungeon AI Background.png.meta b/GPIS/Assets/Art/Spirits/Dungeon AI Background.png.meta new file mode 100644 index 0000000..85d6e90 --- /dev/null +++ b/GPIS/Assets/Art/Spirits/Dungeon AI Background.png.meta @@ -0,0 +1,114 @@ +fileFormatVersion: 2 +guid: 29a729f579452e64cae07fcb75674760 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 600 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/GPIS/Assets/Prefabs/Cards/TestEnemy.prefab b/GPIS/Assets/Prefabs/Cards/TestEnemy.prefab new file mode 100644 index 0000000..2a64918 --- /dev/null +++ b/GPIS/Assets/Prefabs/Cards/TestEnemy.prefab @@ -0,0 +1,137 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &768140246156693964 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6759275103442967911} + - component: {fileID: 4207017103617078005} + - component: {fileID: 3084895200950069452} + - component: {fileID: 1529852536303303054} + - component: {fileID: 1280950840100716311} + m_Layer: 0 + m_Name: TestEnemy + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6759275103442967911 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 768140246156693964} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} + m_LocalPosition: {x: 3.88, y: -1.43, z: -0.014921064} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} +--- !u!212 &4207017103617078005 +SpriteRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 768140246156693964} + 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_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: 21300000, guid: 9324671103bf2814293aeff4fb3d65a5, 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: 2} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_MaskInteraction: 0 + m_SpriteSortPoint: 0 +--- !u!114 &3084895200950069452 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 768140246156693964} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 80c2ef17a3e84e3428c0480baebe0ddf, type: 3} + m_Name: + m_EditorClassIdentifier: + enemy: {fileID: 11400000, guid: 374b2a7b48e0be841bdbec4cb2b41733, type: 2} +--- !u!114 &1529852536303303054 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 768140246156693964} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9adfa200dbd117b41a2b687940884d5e, type: 3} + m_Name: + m_EditorClassIdentifier: + enemyDisplay: {fileID: 3084895200950069452} + highlightColor: {r: 1, g: 0, b: 0, a: 1} +--- !u!65 &1280950840100716311 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 768140246156693964} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1.28, y: 1.28, z: 0.2} + m_Center: {x: 0, y: 0, z: 0} diff --git a/GPIS/Assets/Prefabs/Cards/TestEnemy.prefab.meta b/GPIS/Assets/Prefabs/Cards/TestEnemy.prefab.meta new file mode 100644 index 0000000..f31a98a --- /dev/null +++ b/GPIS/Assets/Prefabs/Cards/TestEnemy.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 98fdf4d871cf84a4b8ec449f5e018c2c +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/GPIS/Assets/Scenes/battle.unity b/GPIS/Assets/Scenes/battle.unity index 8c4f0a1..15f8813 100644 --- a/GPIS/Assets/Scenes/battle.unity +++ b/GPIS/Assets/Scenes/battle.unity @@ -158,7 +158,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: -280, y: -194} + m_AnchoredPosition: {x: -280, y: -305} m_SizeDelta: {x: 100, y: 40} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &34549751 @@ -255,6 +255,37 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 34549749} m_CullTransparentMesh: 1 +--- !u!1 &53562457 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 53562458} + m_Layer: 0 + m_Name: EnemySpawnPoint1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &53562458 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 53562457} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} + m_LocalPosition: {x: -4.33, y: -1.13, z: -0.105745226} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!1 &109435354 GameObject: m_ObjectHideFlags: 0 @@ -283,7 +314,7 @@ Transform: m_GameObject: {fileID: 109435354} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -1.79, y: 0.64, z: -0.014921064} + m_LocalPosition: {x: -1.79, y: -1.53, z: -0.014921064} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -559,7 +590,7 @@ SpriteRenderer: m_SortingLayerID: 0 m_SortingLayer: 0 m_SortingOrder: 0 - m_Sprite: {fileID: 7482667652216324306, guid: 311925a002f4447b3a28927169b83ea6, type: 3} + m_Sprite: {fileID: 21300000, guid: 29a729f579452e64cae07fcb75674760, type: 3} m_Color: {r: 1, g: 0.57169807, b: 0.7212016, a: 1} m_FlipX: 0 m_FlipY: 0 @@ -579,8 +610,8 @@ Transform: m_GameObject: {fileID: 368907960} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -6.66, y: -0.03, z: 1} - m_LocalScale: {x: 17.7888, y: 10.13, z: 0} + m_LocalPosition: {x: -6.66, y: 0.01, z: 1} + m_LocalScale: {x: 12.580239, y: 14.25291, z: 0} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} @@ -627,7 +658,7 @@ Transform: m_GameObject: {fileID: 456229066} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -11.69, y: 0.16298583, z: -0.021998707} + m_LocalPosition: {x: -11.69, y: -2.14, z: -0.021998707} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 1 m_Children: [] @@ -716,8 +747,9 @@ MonoBehaviour: - {fileID: 11400000, guid: 65de830c44661614ba10a62c01855229, type: 2} - {fileID: 11400000, guid: 65de830c44661614ba10a62c01855229, type: 2} - {fileID: 11400000, guid: 65de830c44661614ba10a62c01855229, type: 2} - - {fileID: 11400000, guid: 65de830c44661614ba10a62c01855229, type: 2} - - {fileID: 11400000, guid: 65de830c44661614ba10a62c01855229, type: 2} + - {fileID: 11400000, guid: dcd48a9e785a3a84db84ed76f83be3c6, type: 2} + - {fileID: 11400000, guid: dcd48a9e785a3a84db84ed76f83be3c6, type: 2} + - {fileID: 11400000, guid: dcd48a9e785a3a84db84ed76f83be3c6, type: 2} x: 0 --- !u!1 &519420028 GameObject: @@ -825,7 +857,7 @@ Camera: far clip plane: 1000 field of view: 34 orthographic: 1 - orthographic size: 5 + orthographic size: 7.7316136 m_Depth: -1 m_CullingMask: serializedVersion: 2 @@ -990,118 +1022,11 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 533417903} m_CullTransparentMesh: 1 ---- !u!1 &611442356 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 611442357} - - component: {fileID: 611442359} - - component: {fileID: 611442358} - - component: {fileID: 611442360} - m_Layer: 0 - m_Name: TestEnemy - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &611442357 +--- !u!4 &611442357 stripped Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 611442356} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} - m_LocalPosition: {x: 4.67, y: 0.62, z: -0.014921064} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1426549337} - m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} ---- !u!114 &611442358 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 611442356} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 80c2ef17a3e84e3428c0480baebe0ddf, type: 3} - m_Name: - m_EditorClassIdentifier: - enemy: {fileID: 11400000, guid: 374b2a7b48e0be841bdbec4cb2b41733, type: 2} ---- !u!212 &611442359 -SpriteRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 611442356} - 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_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: 21300000, guid: 9324671103bf2814293aeff4fb3d65a5, 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: 2} - m_AdaptiveModeThreshold: 0.5 - m_SpriteTileMode: 0 - m_WasSpriteAssigned: 1 - m_MaskInteraction: 0 - m_SpriteSortPoint: 0 ---- !u!114 &611442360 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 6759275103442967911, guid: 98fdf4d871cf84a4b8ec449f5e018c2c, type: 3} + m_PrefabInstance: {fileID: 1874997450053382483} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 611442356} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9adfa200dbd117b41a2b687940884d5e, type: 3} - m_Name: - m_EditorClassIdentifier: - enemyDisplay: {fileID: 611442358} --- !u!1 &619394800 GameObject: m_ObjectHideFlags: 0 @@ -1220,7 +1145,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 283, y: -194} + m_AnchoredPosition: {x: 283, y: -305} m_SizeDelta: {x: 100, y: 40} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &941434414 @@ -1569,8 +1494,15 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: handManager: {fileID: 1777082796} - activeEnemy: {fileID: 611442360} + activeEnemies: [] + selectedEnemy: {fileID: 0} + playerCombat: {fileID: 456229069} playerDeck: {fileID: 456229071} + enemySpawnPoints: + - {fileID: 53562458} + - {fileID: 1720612990} + - {fileID: 1694293800} + enemyPrefab: {fileID: 768140246156693964, guid: 98fdf4d871cf84a4b8ec449f5e018c2c, type: 3} --- !u!4 &1618460288 Transform: m_ObjectHideFlags: 0 @@ -1729,6 +1661,68 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1694293799 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1694293800} + m_Layer: 0 + m_Name: EnemySpawnPoint3 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1694293800 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1694293799} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} + m_LocalPosition: {x: -3.35, y: -2.73, z: -0.105745226} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} +--- !u!1 &1720612989 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1720612990} + m_Layer: 0 + m_Name: EnemySpawnPoint2 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1720612990 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1720612989} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 1, z: 0, w: 0} + m_LocalPosition: {x: -5.05, y: -1.98, z: -0.105745226} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0} --- !u!1 &1777082795 GameObject: m_ObjectHideFlags: 0 @@ -1783,7 +1777,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: -201} + m_AnchoredPosition: {x: 0, y: -373} m_SizeDelta: {x: 400, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &1830551214 @@ -1830,6 +1824,67 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1830551214} m_CullTransparentMesh: 1 +--- !u!1001 &1874997450053382483 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1426549337} + m_Modifications: + - target: {fileID: 768140246156693964, guid: 98fdf4d871cf84a4b8ec449f5e018c2c, type: 3} + propertyPath: m_Name + value: TestEnemy + objectReference: {fileID: 0} + - target: {fileID: 768140246156693964, guid: 98fdf4d871cf84a4b8ec449f5e018c2c, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6759275103442967911, guid: 98fdf4d871cf84a4b8ec449f5e018c2c, type: 3} + propertyPath: m_LocalPosition.x + value: 3.88 + objectReference: {fileID: 0} + - target: {fileID: 6759275103442967911, guid: 98fdf4d871cf84a4b8ec449f5e018c2c, type: 3} + propertyPath: m_LocalPosition.y + value: -1.43 + objectReference: {fileID: 0} + - target: {fileID: 6759275103442967911, guid: 98fdf4d871cf84a4b8ec449f5e018c2c, type: 3} + propertyPath: m_LocalPosition.z + value: -0.014921064 + objectReference: {fileID: 0} + - target: {fileID: 6759275103442967911, guid: 98fdf4d871cf84a4b8ec449f5e018c2c, type: 3} + propertyPath: m_LocalRotation.w + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6759275103442967911, guid: 98fdf4d871cf84a4b8ec449f5e018c2c, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6759275103442967911, guid: 98fdf4d871cf84a4b8ec449f5e018c2c, type: 3} + propertyPath: m_LocalRotation.y + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 6759275103442967911, guid: 98fdf4d871cf84a4b8ec449f5e018c2c, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6759275103442967911, guid: 98fdf4d871cf84a4b8ec449f5e018c2c, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 6759275103442967911, guid: 98fdf4d871cf84a4b8ec449f5e018c2c, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 180 + objectReference: {fileID: 0} + - target: {fileID: 6759275103442967911, guid: 98fdf4d871cf84a4b8ec449f5e018c2c, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 98fdf4d871cf84a4b8ec449f5e018c2c, type: 3} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 @@ -1841,3 +1896,6 @@ SceneRoots: - {fileID: 456229068} - {fileID: 1426549337} - {fileID: 1652560724} + - {fileID: 53562458} + - {fileID: 1720612990} + - {fileID: 1694293800} diff --git a/GPIS/Assets/Scenes/dungeonLoop.unity b/GPIS/Assets/Scenes/dungeonLoop.unity index efbd538..0cc52f9 100644 --- a/GPIS/Assets/Scenes/dungeonLoop.unity +++ b/GPIS/Assets/Scenes/dungeonLoop.unity @@ -122,6 +122,51 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &9378605 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9378607} + - component: {fileID: 9378606} + m_Layer: 0 + m_Name: GameManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &9378606 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9378605} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a35b8649a387a04eaa2c0195651961e, type: 3} + m_Name: + m_EditorClassIdentifier: + dungeonRoot: {fileID: 1121947641} +--- !u!4 &9378607 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9378605} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -7.3976054, y: -0.3796487, z: -0.0971602} + 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!4 &10623282 stripped Transform: m_CorrespondingSourceObject: {fileID: 2927116884387759558, guid: a61ad24127787be4abc298d344f1595b, type: 3} @@ -218,16 +263,16 @@ RectTransform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 155825595} - m_LocalRotation: {x: 0.27563733, y: 0, z: 0, w: 0.96126175} - m_LocalPosition: {x: 0, y: 0, z: 15} + m_LocalRotation: {x: 0.27563733, y: -0, z: -0, w: 0.96126175} + m_LocalPosition: {x: 0, y: 0, z: 15.09716} m_LocalScale: {x: 20, y: 0, z: 32.5} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 0} + m_Father: {fileID: 1121947642} m_LocalEulerAnglesHint: {x: 32, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} + m_AnchoredPosition: {x: 13.307535, y: 0.34482598} m_SizeDelta: {x: 100, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &155825600 @@ -744,13 +789,13 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 528574102} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 7.3976054, y: 0.3796487, z: 0.0971602} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - {fileID: 684126150} - m_Father: {fileID: 0} + m_Father: {fileID: 1121947642} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &528574104 MonoBehaviour: @@ -920,12 +965,12 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 619394800} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 7.3976054, y: 0.3796487, z: 0.0971602} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 0} + m_Father: {fileID: 1121947642} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &668817618 GameObject: @@ -952,12 +997,12 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 668817618} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -28, y: 0, z: 2} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -20.602394, y: 0.3796487, z: 2.09716} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 0} + m_Father: {fileID: 1121947642} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &668817621 MonoBehaviour: @@ -1309,12 +1354,12 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1046045718} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 7.3976054, y: 0.3796487, z: 0.0971602} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 0} + m_Father: {fileID: 1121947642} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!224 &1068772687 stripped RectTransform: @@ -1332,6 +1377,47 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: ccb0dbd83c24d6f4686fa10cdf7de859, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &1121947641 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1121947642} + m_Layer: 0 + m_Name: Dungeon + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1121947642 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1121947641} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -7.3976054, y: -0.3796487, z: -0.0971602} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 528574103} + - {fileID: 1346433704} + - {fileID: 707614613} + - {fileID: 1418963620} + - {fileID: 619394802} + - {fileID: 155825599} + - {fileID: 668817620} + - {fileID: 1947525223} + - {fileID: 1046045721} + - {fileID: 2119863156} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1236234656 PrefabInstance: m_ObjectHideFlags: 0 @@ -1597,11 +1683,11 @@ Transform: m_GameObject: {fileID: 1346433699} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: -2, z: -26} + m_LocalPosition: {x: 7.3976054, y: -1.6203513, z: -25.90284} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 0} + m_Father: {fileID: 1121947642} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1418963619 GameObject: @@ -1627,8 +1713,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1418963619} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: 0} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 7.3976054, y: 1.3796487, z: 0.0971602} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -1638,7 +1724,7 @@ Transform: - {fileID: 8021054552880621645} - {fileID: 3942573087693516172} - {fileID: 9017830391643844341} - m_Father: {fileID: 0} + m_Father: {fileID: 1121947642} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1439889515 PrefabInstance: @@ -1646,7 +1732,7 @@ PrefabInstance: serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1121947642} m_Modifications: - target: {fileID: 3171452937993347930, guid: a61ad24127787be4abc298d344f1595b, type: 3} propertyPath: m_Name @@ -1658,15 +1744,15 @@ PrefabInstance: objectReference: {fileID: 684126151} - target: {fileID: 6099033089838067477, guid: a61ad24127787be4abc298d344f1595b, type: 3} propertyPath: m_LocalPosition.x - value: 0 + value: 7.3976054 objectReference: {fileID: 0} - target: {fileID: 6099033089838067477, guid: a61ad24127787be4abc298d344f1595b, type: 3} propertyPath: m_LocalPosition.y - value: -2 + value: -1.6203513 objectReference: {fileID: 0} - target: {fileID: 6099033089838067477, guid: a61ad24127787be4abc298d344f1595b, type: 3} propertyPath: m_LocalPosition.z - value: -5 + value: -4.9028397 objectReference: {fileID: 0} - target: {fileID: 6099033089838067477, guid: a61ad24127787be4abc298d344f1595b, type: 3} propertyPath: m_LocalRotation.w @@ -1674,15 +1760,15 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 6099033089838067477, guid: a61ad24127787be4abc298d344f1595b, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6099033089838067477, guid: a61ad24127787be4abc298d344f1595b, type: 3} propertyPath: m_LocalRotation.y - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6099033089838067477, guid: a61ad24127787be4abc298d344f1595b, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 6099033089838067477, guid: a61ad24127787be4abc298d344f1595b, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2354,11 +2440,11 @@ Transform: m_GameObject: {fileID: 1947525219} serializedVersion: 2 m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: -2, z: -26} + m_LocalPosition: {x: 7.3976054, y: -1.6203513, z: -25.90284} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] - m_Father: {fileID: 0} + m_Father: {fileID: 1121947642} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &2092023845 GameObject: @@ -2608,7 +2694,7 @@ RectTransform: m_Children: - {fileID: 1641592019} - {fileID: 2092023846} - m_Father: {fileID: 0} + m_Father: {fileID: 1121947642} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} @@ -3016,13 +3102,5 @@ Transform: SceneRoots: m_ObjectHideFlags: 0 m_Roots: - - {fileID: 528574103} - - {fileID: 1346433704} - - {fileID: 1439889515} - - {fileID: 1418963620} - - {fileID: 619394802} - - {fileID: 155825599} - - {fileID: 668817620} - - {fileID: 1947525223} - - {fileID: 1046045721} - - {fileID: 2119863156} + - {fileID: 9378607} + - {fileID: 1121947642} diff --git a/GPIS/Assets/ScriptableObjects/World/BattleTileDef.cs b/GPIS/Assets/ScriptableObjects/World/BattleTileDef.cs index c3db7b0..5576f46 100644 --- a/GPIS/Assets/ScriptableObjects/World/BattleTileDef.cs +++ b/GPIS/Assets/ScriptableObjects/World/BattleTileDef.cs @@ -1,6 +1,8 @@ using System.Collections.Generic; using UnityEngine; +using UnityEngine.SceneManagement; // Used to call 'loadScene()' for entering the 'battle' scene. + /// /// Tile for Dungeon Battles /// @@ -16,5 +18,7 @@ public class BattleTileDef : BaseTileDef, IDungeonTileOnLand public void OnLand(DungeonHandler dungeon, int tileIndex) { Debug.Log("Landed on Battle tile!"); + + GameManager.Instance.EnterBattle(); // Equivalent to "SceneManager.LoadScene("battle", LoadSceneMode.Additive);" using the GameManager: } } diff --git a/GPIS/Assets/Scripts/Cards/CardInteraction.cs b/GPIS/Assets/Scripts/Cards/CardInteraction.cs index 3e05848..f330ab2 100644 --- a/GPIS/Assets/Scripts/Cards/CardInteraction.cs +++ b/GPIS/Assets/Scripts/Cards/CardInteraction.cs @@ -53,6 +53,27 @@ public void OnCardClicked() public void SetSelected(bool selected) { + // Allows only 2 cards to be selected at a time before pressing "Play Cards": + if (selected && !IsSelected) + { + var handManager = GetComponentInParent(); + if (handManager != null) + { + int selectedCount = 0; + foreach (var c in handManager.GetSelectedCards()) + { + selectedCount++; + if (selectedCount >= 2) break; + } + + if (selectedCount >= 2) + { + Debug.Log("Maximum of 2 cards may be selected at once."); + return; + } + } + } + IsSelected = selected; if (selectionHighlight) selectionHighlight.enabled = selected; } diff --git a/GPIS/Assets/Scripts/Cards/EnemyCombat.cs b/GPIS/Assets/Scripts/Cards/EnemyCombat.cs index 6fe8a17..bbf06cc 100644 --- a/GPIS/Assets/Scripts/Cards/EnemyCombat.cs +++ b/GPIS/Assets/Scripts/Cards/EnemyCombat.cs @@ -12,10 +12,44 @@ public class EnemyCombat : MonoBehaviour public int CurrentHP { get; private set; } // "Auto-Implemented Get/Set" - C# shortcut that allows "CurrentHP" to be accessed publicly, set privately. public int MaxHP => enemyDisplay.enemy.maxHealth; // Lambda Operator '=>' - Shorthand Getter definition for 'MaxHP'. + private bool isHighlighted = false; + + // Renderers for Spirit Highlights: + private SpriteRenderer[] spriteRenderers; + private Color[] spriteOriginalColors; + private Renderer[] otherRenderers; + private Color[] otherOriginalColors; + + [SerializeField] private Color highlightColor = Color.red; + void Awake() { if (!enemyDisplay) enemyDisplay = GetComponent(); CurrentHP = MaxHP; // Set HP at Awake(): + + CombatManager.enemyCount += 1; + + // Cache sprite renderers and their original colors: + spriteRenderers = GetComponentsInChildren(true); + spriteOriginalColors = new Color[spriteRenderers.Length]; + for (int i = 0; i < spriteRenderers.Length; i++) + spriteOriginalColors[i] = spriteRenderers[i].color; + + // Cache other renderers (exclude sprite renderers): + var allRenderers = GetComponentsInChildren(true); + var list = new List(); + foreach (var r in allRenderers) + { + if (r is SpriteRenderer) continue; + list.Add(r); + } + otherRenderers = list.ToArray(); + otherOriginalColors = new Color[otherRenderers.Length]; + for (int i = 0; i < otherRenderers.Length; i++) + { + // Store material color if available: + otherOriginalColors[i] = otherRenderers[i].material.color; + } } // Takes in final damage number (calculated outside of 'EnemyCombat' Class) to apply to this enemy. @@ -24,7 +58,41 @@ public void TakeDamage(int amount) CurrentHP -= amount; Debug.Log($"Enemy took {amount} damage. HP: {CurrentHP}/{MaxHP}"); - if (CurrentHP <= 0) { Destroy(gameObject); } + if (CurrentHP <= 0) { + // Notify CombatManager to destroy Enemy: + var manager = Object.FindObjectOfType(); + if (manager != null) manager.OnEnemyDeath(this); + else { + Destroy(gameObject); + CombatManager.enemyCount -= 1; + CombatManager.isBattleOver(); + } + } + } + + public void SetHighlighted(bool on) + { + isHighlighted = on; + + // Update sprite renderers: + if (spriteRenderers != null) + { + for (int i = 0; i < spriteRenderers.Length; i++) + { + if (spriteRenderers[i] == null) continue; + spriteRenderers[i].color = on ? highlightColor : spriteOriginalColors[i]; + } + } + + // Update other renderers: + if (otherRenderers != null) + { + for (int i = 0; i < otherRenderers.Length; i++) + { + if (otherRenderers[i] == null) continue; + otherRenderers[i].material.color = on ? highlightColor : otherOriginalColors[i]; + } + } } public int GetAttackValue() @@ -40,4 +108,13 @@ public void PerformAttack(PlayerCombat player) player.TakeDamage(dmg); Debug.Log($"Enemy attacked Player for {dmg} damage!"); } -} + + // Selects enemy when clicked to target for attack cards. + void OnMouseDown() + { + Debug.Log($"EnemyCombat.OnMouseDown on {gameObject.name}"); + + var manager = Object.FindObjectOfType(); + if (manager != null) manager.SelectEnemy(this); + } +} \ No newline at end of file diff --git a/GPIS/Assets/Scripts/Managers/CombatManager.cs b/GPIS/Assets/Scripts/Managers/CombatManager.cs index ac3bbcc..ba7a8e5 100644 --- a/GPIS/Assets/Scripts/Managers/CombatManager.cs +++ b/GPIS/Assets/Scripts/Managers/CombatManager.cs @@ -1,52 +1,190 @@ // Manager to resolve combat actions between player & enemy Elementals. -/* -Need to Add: - - Player Game Object (to take damage from Enemies) X - - Turn Manager X - - Enemy Turn X - - Enemy Attacking X - - Deck System X - - Draw Step X -*/ - using System.Collections; using System.Collections.Generic; using UnityEngine; +using UnityEngine.SceneManagement; public class CombatManager : MonoBehaviour { + public static CombatManager Instance { get; private set; } + [Header("Game Object Wiring")] public HandManager handManager; - public EnemyCombat activeEnemy; + + // List of active enemies in the current battle: + public List activeEnemies = new(); + public EnemyCombat selectedEnemy; + + public PlayerCombat playerCombat; public PlayerDeck playerDeck; + [Header("Enemy Spawning")] + public Transform[] enemySpawnPoints; + public GameObject enemyPrefab; + + public static int enemyCount; + + public void Start() + { + SpawnEnemies(); + } + + void Awake() + { + if (Instance != null && Instance != this) Destroy(this); + else Instance = this; + } + + void Update() + { + // Handle mouse clicks for enemy selection: + if (Input.GetMouseButtonDown(0)) + { + var cam = Camera.main; + if (cam == null) return; + + // Create a 2D Raycast to collide with Enemy: + Vector3 worldPoint = cam.ScreenToWorldPoint(Input.mousePosition); + Vector2 wp2 = new Vector2(worldPoint.x, worldPoint.y); + var hit2D = Physics2D.Raycast(wp2, Vector2.zero); + if (hit2D.collider != null) + { + var enemy = hit2D.collider.GetComponentInParent(); + if (enemy != null) + { + Debug.Log($"CombatManager: clicked 2D enemy {enemy.name}"); + SelectEnemy(enemy); + return; + } + } + } + } + // Calculates damage based on stats of passed 'ElementalCombat.Def'. private int ComputeAttackDamage(ElementalCombat elemental) { float raw = elemental.Def.baseDmg; // Damage = baseDmg - return Mathf.Max(0, Mathf.RoundToInt(raw)); // 'Mathf.Max()' - Returns higher number of inputs. | 'RoundToInt()' - Rounds non-ints to nearest int. + return Mathf.Max(0, Mathf.RoundToInt(raw)); + } + + // Spawns enemies at fixed spawn points (variable chance to spawn at each spot). + public void SpawnEnemies() + { + activeEnemies.Clear(); + + if (enemySpawnPoints == null || enemySpawnPoints.Length == 0 || enemyPrefab == null) + return; + + while (activeEnemies.Count <= 0) + { + foreach (var sp in enemySpawnPoints) + { + if (sp == null) continue; + if (Random.value <= 0.6f) + { + var go = Instantiate(enemyPrefab, sp.position, sp.rotation); + var ec = go.GetComponent(); + if (ec != null) + { + activeEnemies.Add(ec); + } + } + } + } + + // Update "enemyCount" with List: + enemyCount = activeEnemies.Count; + } + + // Select or toggle an enemy as the current target. + public void SelectEnemy(EnemyCombat enemy) + { + Debug.Log($"CombatManager.SelectEnemy called for: { (enemy != null ? enemy.name : "null") }"); + + if (selectedEnemy == enemy) + { + if (selectedEnemy != null) selectedEnemy.SetHighlighted(false); + selectedEnemy = null; + return; + } + + if (selectedEnemy != null) selectedEnemy.SetHighlighted(false); + selectedEnemy = enemy; + if (selectedEnemy != null) selectedEnemy.SetHighlighted(true); + } + + // Allows CombatManager to remove dead enemy from lists for clean up. + public void OnEnemyDeath(EnemyCombat enemy) + { + if (enemy == null) return; + + // Remove from active list if present: + if (activeEnemies.Contains(enemy)) activeEnemies.Remove(enemy); + + // Update global count and clear selection if necessary: + enemyCount = activeEnemies.Count; + if (selectedEnemy == enemy) selectedEnemy = null; + + // Destroy enemy GameObject: + if (enemy.gameObject != null) + Destroy(enemy.gameObject); + + // Check for end of battle: + isBattleOver(); } // Implements the Resolve Step when the "Play Cards" button is pressed. public void OnPlayCardsPressed() { - if (!activeEnemy) return; // There is no enemy to fight: - var toDiscard = new System.Collections.Generic.List(); // Creates a new Generic 'List' container to hold played cards so they can be discarded. + if (enemyCount <= 0) return; // Require at least one enemy alive: + + var toDiscard = new System.Collections.Generic.List(); foreach (var card in handManager.GetSelectedCards()) { - if (card.ownerElemental == null) continue; // No current Elemental on the field connected to this card: + if (card.ownerElemental == null) continue; + + if (card.Display.playableCard.actionType == CardActionType.Attack) + { + // Choose target (If not enemy selected, then default to first enemy in list): + EnemyCombat target = selectedEnemy; + if (target == null && activeEnemies.Count > 0) target = activeEnemies[0]; + if (target == null) continue; // No target available: - int dmg = ComputeAttackDamage(card.ownerElemental); - activeEnemy.TakeDamage(dmg); - toDiscard.Add(card); // Adds played cards to the List 'toDiscard' to "mark" them for removal. + int dmg = ComputeAttackDamage(card.ownerElemental); + target.TakeDamage(dmg); + } + else if (card.Display.playableCard.actionType == CardActionType.Defend) + { + playerCombat.Heal(1); + } + + toDiscard.Add(card); } - foreach (var c in toDiscard) // For each played card that has been added to 'toDiscard': + foreach (var c in toDiscard) { handManager.Discard(c, playerDeck); } } + + public static void isBattleOver() + { + // Try using Instance "activeEnemies" count if available: + int remaining = (Instance != null) ? Instance.activeEnemies.Count : enemyCount; + + if (remaining <= 0) + { + Debug.Log("All enemies defeated! Battle Over."); + + // Find the hand manager in scene and clear it: + var hm = Object.FindObjectOfType(); + if (hm != null) + hm.ClearHand(); + + GameManager.Instance.ExitBattle(); + } + } } diff --git a/GPIS/Assets/Scripts/Managers/GameManager.cs b/GPIS/Assets/Scripts/Managers/GameManager.cs new file mode 100644 index 0000000..3e458e9 --- /dev/null +++ b/GPIS/Assets/Scripts/Managers/GameManager.cs @@ -0,0 +1,34 @@ +using UnityEngine; +using UnityEngine.SceneManagement; + +public class GameManager : MonoBehaviour +{ + public static GameManager Instance { get; private set; } + + [Header("Scenes")] + public GameObject dungeonRoot; + + private void Awake() + { + if (Instance != this && Instance != null) + { + Destroy(gameObject); + return; + } + + Instance = this; + DontDestroyOnLoad(gameObject); + } + + public void EnterBattle() + { + if (dungeonRoot) dungeonRoot.SetActive(false); + SceneManager.LoadSceneAsync("battle", LoadSceneMode.Additive); + } + + public void ExitBattle() + { + if (dungeonRoot) dungeonRoot.SetActive(true); + SceneManager.UnloadSceneAsync("battle"); + } +} \ No newline at end of file diff --git a/GPIS/Assets/Scripts/Managers/GameManager.cs.meta b/GPIS/Assets/Scripts/Managers/GameManager.cs.meta new file mode 100644 index 0000000..94a3b61 --- /dev/null +++ b/GPIS/Assets/Scripts/Managers/GameManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2a35b8649a387a04eaa2c0195651961e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/GPIS/Assets/Scripts/Managers/HandManager.cs b/GPIS/Assets/Scripts/Managers/HandManager.cs index 03167de..97276d6 100644 --- a/GPIS/Assets/Scripts/Managers/HandManager.cs +++ b/GPIS/Assets/Scripts/Managers/HandManager.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using UnityEditor; using UnityEngine; @@ -8,6 +9,10 @@ public class HandManager : MonoBehaviour [SerializeField] private GameObject cardPrefab; // assign PlayableCard_UI prefab here [SerializeField] private ElementalCombat defaultOwnerElemental; + public const int maxHandsize = 5; + //public static int handSize = 0; + public int HandSize => Hand.Count; + [Header("Curve Settings (parabola)")] [SerializeField] private RectTransform Vertex; [Tooltip("Horizontal spacing between card centers")] @@ -85,6 +90,7 @@ public void AddToHand(CardInteraction card) if (!Hand.Contains(card)) { Hand.Add(card); + //handSize += 1; // Ensures correct visual layer ordering (left = bottom, right = top) card.transform.SetSiblingIndex(Hand.Count - 1); @@ -117,7 +123,25 @@ public void RemoveFromHand(CardInteraction card) // Recalculate positions on the curve UpdateCardTargets(); + + //HandManager.handSize -= 1; + } + } + + // Clears all cards from the hand and destroys their GameObjects. + public void ClearHand() + { + // iterate over a copy to avoid modifying the collection while enumerating + foreach (var card in Hand.ToArray()) + { + if (card == null) continue; + RemoveFromHand(card); + if (card.gameObject != null) + Destroy(card.gameObject); } + + Hand.Clear(); + UpdateCardTargets(); } // ------------------- diff --git a/GPIS/Assets/Scripts/Managers/TurnManager.cs b/GPIS/Assets/Scripts/Managers/TurnManager.cs index e5173d5..d49c344 100644 --- a/GPIS/Assets/Scripts/Managers/TurnManager.cs +++ b/GPIS/Assets/Scripts/Managers/TurnManager.cs @@ -1,3 +1,5 @@ +// Manager for Player & Enemy turns during a battle. + using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -14,7 +16,7 @@ public enum Phase { Player, Enemy } public HandManager handManager; [Header("Turn Settings")] - public int startingHandSize = 5; + public int startingHandSize; public int drawPerPlayerTurn = 1; void Start() @@ -35,9 +37,16 @@ private void StartEnemyTurn() CurrentPhase = Phase.Enemy; // --- Enemy AI Decision Tree implementation would go here, but simple attack for now! --- - if (combatManager && combatManager.activeEnemy) + if (combatManager != null && combatManager.activeEnemies != null && combatManager.activeEnemies.Count > 0) { - combatManager.activeEnemy.PerformAttack(player); + foreach (var enemy in combatManager.activeEnemies) + { + if (enemy != null) + if (Random.value <= 0.30f) // Enemies attack player with 35% chance each turn: + enemy.PerformAttack(player); + else + Debug.Log("Enemy missed!"); + } } StartPlayerTurn(); // Switch the turn back to the Player after enemy attacks: @@ -52,7 +61,8 @@ private void StartPlayerTurn() private void DrawStep(int n) { - if (!playerDeck || !handManager || n <= 0) return; + // Use the HandManager instance's HandSize instead of the old static counter + if (!playerDeck || !handManager || n <= 0 || handManager.HandSize >= HandManager.maxHandsize) return; var buffer = new List(); int drawn = playerDeck.TryDraw(n, buffer); diff --git a/GPIS/Assets/Scripts/Player/PlayerCombat.cs b/GPIS/Assets/Scripts/Player/PlayerCombat.cs index 2bee497..4a270b3 100644 --- a/GPIS/Assets/Scripts/Player/PlayerCombat.cs +++ b/GPIS/Assets/Scripts/Player/PlayerCombat.cs @@ -33,4 +33,15 @@ public void TakeDamage (int amount) // --- Add Player Lose logic here! --- } } + + public void Heal(int amount) + { + if (CurrentHP != MaxHP) + { + amount = Mathf.Max(0, amount); + CurrentHP = Mathf.Min(MaxHP, CurrentHP + amount); + + Debug.Log($"Player healed {amount} HP. HP: {CurrentHP}/{MaxHP}"); + } + } } diff --git a/GPIS/Assets/_SO/Cards/HealCard.asset b/GPIS/Assets/_SO/Cards/HealCard.asset new file mode 100644 index 0000000..6c2f30b --- /dev/null +++ b/GPIS/Assets/_SO/Cards/HealCard.asset @@ -0,0 +1,29 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 295301ef53d963243b1a76482c655e03, type: 3} + m_Name: HealCard + m_EditorClassIdentifier: + cardId: 1 + displayName: Heal Card + description: Heals the Player for 1 HP. + artwork: {fileID: 0} + cardViewPrefab: {fileID: 0} + element: 0 + rarity: 0 + tags: + isUpgradeable: 1 + maxUpgradeLevel: 2 + actionType: 1 + targetingMode: 1 + requiresTargetSelection: 0 + effects: [] + upgradeOverrides: [] diff --git a/GPIS/Assets/_SO/Cards/HealCard.asset.meta b/GPIS/Assets/_SO/Cards/HealCard.asset.meta new file mode 100644 index 0000000..5b3f2bf --- /dev/null +++ b/GPIS/Assets/_SO/Cards/HealCard.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dcd48a9e785a3a84db84ed76f83be3c6 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/GPIS/Assets/_SO/Enemies/_testEnemy.asset b/GPIS/Assets/_SO/Enemies/_testEnemy.asset index 0b9689c..2f4fb54 100644 --- a/GPIS/Assets/_SO/Enemies/_testEnemy.asset +++ b/GPIS/Assets/_SO/Enemies/_testEnemy.asset @@ -16,7 +16,7 @@ MonoBehaviour: npcName: Test Enemy portrait: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} description: Test Enemy - maxHealth: 15 + maxHealth: 2 attack: 1 defense: 3 maxElementals: 2 diff --git a/GPIS/ProjectSettings/EditorBuildSettings.asset b/GPIS/ProjectSettings/EditorBuildSettings.asset index d40f2db..9a2ed19 100644 --- a/GPIS/ProjectSettings/EditorBuildSettings.asset +++ b/GPIS/ProjectSettings/EditorBuildSettings.asset @@ -14,5 +14,11 @@ EditorBuildSettings: - enabled: 1 path: Assets/Scenes/Doors/Shop.unity guid: 9cc3740e1f69e324c9c3b0f7d568b49c + - enabled: 1 + path: Assets/Scenes/dungeonLoop.unity + guid: 53b95f5ccc808d5409d0e7a7a07a429c + - enabled: 1 + path: Assets/Scenes/battle.unity + guid: 8a5a10fa96309904da052ee7a9162b8a m_configObjects: com.unity.addressableassets: {fileID: 11400000, guid: 1c2dd5e21cc86c64cbfedde65941d8d2, type: 2}