From d570fddbc8c9bcea3dc16e9447397a3d639f8a58 Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 19 Oct 2026 19:27:34 +0200 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B4=D0=BD=D0=B0=20=D0=BA=D0=B0=D1=80?= =?UTF-8?q?=D1=82=D0=B0=20=D0=BC=D0=B8=D1=80=D0=B0:=20=D1=83=D0=B4=D0=B0?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BC=D0=B0=D0=BB=D0=B5=D0=BD=D1=8C?= =?UTF-8?q?=D0=BA=D0=B0=D1=8F=20=D0=BA=D0=B0=D1=80=D1=82=D0=B0=20Meta/Worl?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - удалены WorldSystem, WorldMapPanel, WorldData, WorldLine и окно Panel_World из сцены города - кнопка «МИР» в городе открывает большую карту (сцена WorldMap) через UIPanelManager.Open("World") - перенос сохранений: солдаты из походов старой карты возвращаются в город при загрузке (отправленные, а если отряд шёл назад — выжившие); добыча таких походов не переносится - ArmyBridge.TroopsInMarches: панель «Войска» показывает воинов в походах большой карты - HUDPanelsBuilder: кнопка «МИР» без отдельной панели - документы World, Army, README обновлены Co-Authored-By: Claude Opus 5.5 --- Assets/Editor/HUDPanelsBuilder.cs | 2 +- Assets/Scenes/MVP1.unity | 536 ------------------ Assets/Scripts/Meta/Core/GameProgress.cs | 28 +- Assets/Scripts/Meta/Core/ProgressData.cs | 20 +- Assets/Scripts/Meta/Panels/TroopsPanel.cs | 2 +- Assets/Scripts/Meta/World.meta | 8 - Assets/Scripts/Meta/World/WorldData.cs | 126 ---- Assets/Scripts/Meta/World/WorldData.cs.meta | 2 - Assets/Scripts/Meta/World/WorldLine.cs | 34 -- Assets/Scripts/Meta/World/WorldLine.cs.meta | 2 - Assets/Scripts/Meta/World/WorldMapPanel.cs | 383 ------------- .../Scripts/Meta/World/WorldMapPanel.cs.meta | 2 - Assets/Scripts/Meta/World/WorldSystem.cs | 415 -------------- Assets/Scripts/Meta/World/WorldSystem.cs.meta | 2 - Assets/Scripts/UI/UIPanelManager.cs | 11 + Assets/Scripts/WorldMap/ArmyBridge.cs | 11 + Docs/Modules/Army.md | 3 +- Docs/Modules/README.md | 1 + Docs/Modules/World.md | 7 +- 19 files changed, 70 insertions(+), 1525 deletions(-) delete mode 100644 Assets/Scripts/Meta/World.meta delete mode 100644 Assets/Scripts/Meta/World/WorldData.cs delete mode 100644 Assets/Scripts/Meta/World/WorldData.cs.meta delete mode 100644 Assets/Scripts/Meta/World/WorldLine.cs delete mode 100644 Assets/Scripts/Meta/World/WorldLine.cs.meta delete mode 100644 Assets/Scripts/Meta/World/WorldMapPanel.cs delete mode 100644 Assets/Scripts/Meta/World/WorldMapPanel.cs.meta delete mode 100644 Assets/Scripts/Meta/World/WorldSystem.cs delete mode 100644 Assets/Scripts/Meta/World/WorldSystem.cs.meta diff --git a/Assets/Editor/HUDPanelsBuilder.cs b/Assets/Editor/HUDPanelsBuilder.cs index 07253f6..a5235e0 100644 --- a/Assets/Editor/HUDPanelsBuilder.cs +++ b/Assets/Editor/HUDPanelsBuilder.cs @@ -37,7 +37,7 @@ public class HUDPanelsBuilder new Entry("Nav_Arena", "Arena", "АРЕНА", typeof(ArenaPanel), true), new Entry("Nav_Troops", "Troops", "ВОЙСКА", typeof(TroopsPanel), false), new Entry("Nav_Shop", "Shop", "МАГАЗИН", typeof(ShopPanel), true), - new Entry("Nav_World", "World", "КАРТА МИРА", typeof(WorldMapPanel), true), // кнопки нет -- билдер создаст + new Entry("Nav_World", "World", null, null, false), // кнопка "МИР" -> сцена большой карты (UIPanelManager.Open) new Entry("Nav_Home", "Home", null, null, false), // без панели: закрывает всё }; diff --git a/Assets/Scenes/MVP1.unity b/Assets/Scenes/MVP1.unity index e429202..8d717c9 100644 --- a/Assets/Scenes/MVP1.unity +++ b/Assets/Scenes/MVP1.unity @@ -3971,143 +3971,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 328760585} m_CullTransparentMesh: 1 ---- !u!1 &334263487 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 334263488} - - component: {fileID: 334263490} - - component: {fileID: 334263489} - m_Layer: 0 - m_Name: X - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &334263488 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 334263487} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1708139837} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &334263489 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 334263487} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: X - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: 0 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 44 - m_fontSizeBase: 44 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_characterHorizontalScale: 1 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_TextWrappingMode: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 0 - m_ActiveFontFeatures: 6e72656b - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_EmojiFallbackSupport: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &334263490 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 334263487} - m_CullTransparentMesh: 1 --- !u!1 &341518303 GameObject: m_ObjectHideFlags: 0 @@ -4627,41 +4490,6 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &397755583 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 397755584} - m_Layer: 0 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &397755584 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 397755583} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 510675372} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -50} - m_SizeDelta: {x: -40, y: -140} - m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &398822858 GameObject: m_ObjectHideFlags: 0 @@ -6474,97 +6302,6 @@ MonoBehaviour: m_StringArgument: Troops m_BoolArgument: 0 m_CallState: 2 ---- !u!1 &510675368 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 510675372} - - component: {fileID: 510675371} - - component: {fileID: 510675370} - - component: {fileID: 510675369} - m_Layer: 0 - m_Name: Panel_World - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!114 &510675369 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 510675368} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 8c8463f829cbc0840b0b660e08974aa6, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::WorldMapPanel ---- !u!114 &510675370 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 510675368} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image - m_Material: {fileID: 0} - m_Color: {r: 0.1, g: 0.12, b: 0.15, a: 0.97} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &510675371 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 510675368} - m_CullTransparentMesh: 1 ---- !u!224 &510675372 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 510675368} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 923071314} - - {fileID: 397755584} - - {fileID: 1708139837} - m_Father: {fileID: 649118781} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 25} - m_SizeDelta: {x: -32, y: -340} - m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &520651314 GameObject: m_ObjectHideFlags: 0 @@ -8362,7 +8099,6 @@ RectTransform: - {fileID: 504179948} - {fileID: 589304973} - {fileID: 1203581059} - - {fileID: 510675372} m_Father: {fileID: 1094697982} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -12103,143 +11839,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 909229333} m_CullTransparentMesh: 1 ---- !u!1 &923071313 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 923071314} - - component: {fileID: 923071316} - - component: {fileID: 923071315} - m_Layer: 0 - m_Name: Title - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &923071314 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 923071313} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 510675372} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 110} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &923071315 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 923071313} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 0 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: "\u041A\u0410\u0420\u0422\u0410 \u041C\u0418\u0420\u0410" - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 0.95, g: 0.75, b: 0.25, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: 0 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 52 - m_fontSizeBase: 52 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 1 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_characterHorizontalScale: 1 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_TextWrappingMode: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 0 - m_ActiveFontFeatures: 6e72656b - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_EmojiFallbackSupport: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &923071316 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 923071313} - m_CullTransparentMesh: 1 --- !u!1 &933469920 GameObject: m_ObjectHideFlags: 0 @@ -13903,8 +13502,6 @@ MonoBehaviour: panel: {fileID: 589304972} - id: Shop panel: {fileID: 1203581058} - - id: World - panel: {fileID: 510675368} --- !u!114 &1094697985 MonoBehaviour: m_ObjectHideFlags: 0 @@ -19233,139 +18830,6 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1684877102} m_CullTransparentMesh: 1 ---- !u!1 &1708139836 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1708139837} - - component: {fileID: 1708139840} - - component: {fileID: 1708139839} - - component: {fileID: 1708139838} - m_Layer: 0 - m_Name: CloseButton - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1708139837 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1708139836} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 334263488} - m_Father: {fileID: 510675372} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -12, y: -10} - m_SizeDelta: {x: 90, y: 90} - m_Pivot: {x: 1, y: 1} ---- !u!114 &1708139838 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1708139836} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1708139839} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 1094697984} - m_TargetAssemblyTypeName: UIPanelManager, Assembly-CSharp - m_MethodName: CloseAll - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 ---- !u!114 &1708139839 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1708139836} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image - m_Material: {fileID: 0} - m_Color: {r: 0.6, g: 0.15, b: 0.15, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1708139840 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1708139836} - m_CullTransparentMesh: 1 --- !u!1 &1753763060 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Meta/Core/GameProgress.cs b/Assets/Scripts/Meta/Core/GameProgress.cs index 71d0b07..478c213 100644 --- a/Assets/Scripts/Meta/Core/GameProgress.cs +++ b/Assets/Scripts/Meta/Core/GameProgress.cs @@ -72,7 +72,6 @@ public class GameProgress : MonoBehaviour nextTick = Time.unscaledTime + 1f; EnsureDailyAndWeekly(); ProcessTraining(); - WorldSystem.Process(); UpdateBuildingsCount(); UpdatePowerResource(); } @@ -150,9 +149,7 @@ public class GameProgress : MonoBehaviour if (Data.training == null) Data.training = new List(); if (Data.arenaOpponents == null) Data.arenaOpponents = new List(); if (Data.eventClaimed == null) Data.eventClaimed = new List(); - if (Data.settlements == null) Data.settlements = new List(); - if (Data.marches == null) Data.marches = new List(); - if (Data.reports == null) Data.reports = new List(); + ReturnLegacyWorldMarches(); if (Data.sashaMarches == null) Data.sashaMarches = new List(); if (Data.sashaMarchUnits == null) Data.sashaMarchUnits = new List(); if (Data.level < 1) Data.level = 1; @@ -176,6 +173,29 @@ public class GameProgress : MonoBehaviour catch (Exception e) { Debug.LogWarning("[ПРОГРЕСС] Не удалось сохранить: " + e.Message); } } + // Старая маленькая карта мира удалена: солдаты из её походов возвращаются в город. + // Ещё идут к цели -- возвращаются все отправленные; уже идут обратно -- выжившие. Добыча таких походов не переносится. + void ReturnLegacyWorldMarches() + { + if (Data.marches == null || Data.marches.Count == 0) { Data.marches = new List(); return; } + + int returned = 0; + foreach (var m in Data.marches) + { + int[] back = m.returning ? m.survivors : m.units; + if (back == null) continue; + for (int i = 0; i < back.Length && i < Data.troops.Length; i++) + { + Data.troops[i] += Mathf.Max(0, back[i]); + returned += Mathf.Max(0, back[i]); + } + } + Data.marches.Clear(); + dirty = true; + SaveSoon(); + Debug.Log($"[ПРОГРЕСС] Старая карта мира удалена: в город вернулось воинов из её походов: {returned}."); + } + // СБРОС СОХРАНЕНИЙ: прогресс (progress.json) + все модули (save.json): ресурсы, здания, Ратуша, походы. // Кнопка в Настройках и меню Tools -> Сбросить сохранения. Документ: Docs/Modules/Save.md public void ResetAll() diff --git a/Assets/Scripts/Meta/Core/ProgressData.cs b/Assets/Scripts/Meta/Core/ProgressData.cs index a672d68..08c519d 100644 --- a/Assets/Scripts/Meta/Core/ProgressData.cs +++ b/Assets/Scripts/Meta/Core/ProgressData.cs @@ -104,16 +104,15 @@ public class ProgressData public long arenaTicketTicks = 0; public List arenaOpponents = new List(); - // --- Глобальная карта --- - public List settlements = new List(); - public List marches = new List(); - public List reports = new List(); - public int nextMarchId = 1; + // --- Карта мира (статистика для заданий; походы ведёт модуль Мира) --- + // Старая маленькая карта (панель "МИР", Meta/World) удалена 19.10.2026 -- осталась одна большая карта. + // marches оставлено только для переноса: солдаты из её походов возвращаются в город при загрузке. + public List marches = new List(); public int marchesSent; public int worldWins; public int worldLosses; - // --- Большая карта мира (сцена WorldMap, код Саши) --- + // --- Карта мира (сцена WorldMap) --- public List sashaMarches = new List(); public List sashaMarchUnits = new List(); @@ -123,3 +122,12 @@ public class ProgressData public int eventTroopRemainder; public List eventClaimed = new List(); } + +// Поход старой маленькой карты -- только чтобы при загрузке вернуть солдат в город (см. GameProgress.FixData) +[Serializable] +public class LegacyWorldMarch +{ + public int[] units = new int[4]; // отправлено + public int[] survivors = new int[4]; // вернутся домой + public bool returning; +} diff --git a/Assets/Scripts/Meta/Panels/TroopsPanel.cs b/Assets/Scripts/Meta/Panels/TroopsPanel.cs index 96f8c4b..d2d0b39 100644 --- a/Assets/Scripts/Meta/Panels/TroopsPanel.cs +++ b/Assets/Scripts/Meta/Panels/TroopsPanel.cs @@ -23,7 +23,7 @@ public class TroopsPanel : BasePanel var army = UIKit.Card(list, UIKit.Theme.CardDark); ProfilePanel.Header(army, "Армия"); ProfilePanel.KV(army, "Всего воинов в городе", GP.TotalTroops.ToString("N0")); - ProfilePanel.KV(army, "В походе на карте мира", WorldSystem.TroopsInMarches.ToString("N0")); + ProfilePanel.KV(army, "В походе на карте мира", ArmyBridge.TroopsInMarches.ToString("N0")); ProfilePanel.KV(army, "Сила войск", GP.TroopsPower.ToString("N0")); ProfilePanel.KV(army, "Сила армии с героем", GP.ArmyPower.ToString("N0")); UIKit.Button(army, "Отправить армию на карте мира", UIKit.Theme.Green, () => OpenPanel("World"), -1, 80, 26); diff --git a/Assets/Scripts/Meta/World.meta b/Assets/Scripts/Meta/World.meta deleted file mode 100644 index a4563e5..0000000 --- a/Assets/Scripts/Meta/World.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 29c363642fd8d494cb9127032e7e2083 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Meta/World/WorldData.cs b/Assets/Scripts/Meta/World/WorldData.cs deleted file mode 100644 index 298ef07..0000000 --- a/Assets/Scripts/Meta/World/WorldData.cs +++ /dev/null @@ -1,126 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -// ГЛОБАЛЬНАЯ КАРТА: таблицы. Характеристики юнитов, поселения на карте, скорость походов. -// Баланс правится здесь. Логика -- в WorldSystem.cs, отображение -- в WorldMapPanel.cs. - -// Боевые характеристики одного воина (индексы совпадают с GameData.Troops) -public class UnitStats -{ - public int hp; // здоровье - public int attack; // урон за раунд - public int defense; // снижает получаемый урон (каждая единица = -8%) - public float speed; // скорость на карте (1 = обычная). Армия идёт со скоростью самого медленного - public int carry; // сколько ресурсов уносит один воин - - public UnitStats(int hp, int attack, int defense, float speed, int carry) - { - this.hp = hp; this.attack = attack; this.defense = defense; this.speed = speed; this.carry = carry; - } -} - -// Поселение на карте -public class SettlementDef -{ - public string id; - public string name; - public Vector2 pos; // позиция на карте, 0..1 по ширине и высоте - public bool isHome; // город игрока - public int[] baseGarrison; // защитники на 1 уровне (по типам войск) - public RewardItem[] baseLoot; // что можно унести на 1 уровне - public float respawnMinutes; // через сколько поселение отстраивается после разграбления - public Color color; - - public SettlementDef(string id, string name, float x, float y, Color color) - { - this.id = id; this.name = name; pos = new Vector2(x, y); this.color = color; - } -} - -public static class WorldData -{ - // Индексы: 0 Пехота, 1 Лучники, 2 Кавалерия, 3 Осадные - public static readonly UnitStats[] Units = - { - new UnitStats(hp: 10, attack: 3, defense: 3, speed: 1.0f, carry: 10), - new UnitStats(hp: 7, attack: 5, defense: 1, speed: 1.0f, carry: 8), - new UnitStats(hp: 14, attack: 6, defense: 2, speed: 1.6f, carry: 15), - new UnitStats(hp: 20, attack: 12, defense: 1, speed: 0.6f, carry: 5), - }; - - // Сколько секунд идёт армия со скоростью 1 через всю карту (расстояние 1.0). - // Для тестов маленькое -- поход туда-обратно занимает около минуты-двух. - public const float SecondsPerMapUnit = 90f; - - public const int MaxMarches = 2; // одновременно в походе - public const int MaxRounds = 10; // раундов в бою, потом атакующий отступает - public const float DefenderBonus = 0.1f; // защитники бьют на 10% сильнее (стены) - public const float GarrisonRegenMinutes = 3f; // недобитый гарнизон восстанавливается - - public static readonly List Settlements = Build(); - - static List Build() - { - var home = new SettlementDef("home", "Ваш город", 0.18f, 0.5f, new Color(0.25f, 0.5f, 0.9f)); - home.isHome = true; - - var bandits = new SettlementDef("bandits", "Деревня разбойников", 0.55f, 0.25f, new Color(0.75f, 0.55f, 0.25f)); - bandits.baseGarrison = new[] { 8, 4, 0, 0 }; - bandits.baseLoot = new[] { new RewardItem(ResourceType.Wood, 400), new RewardItem(ResourceType.Food, 400), new RewardItem(ResourceType.Gold, 150) }; - bandits.respawnMinutes = 3f; - - var fortress = new SettlementDef("fortress", "Крепость варваров", 0.82f, 0.72f, new Color(0.75f, 0.25f, 0.25f)); - fortress.baseGarrison = new[] { 25, 15, 8, 2 }; - fortress.baseLoot = new[] { new RewardItem(ResourceType.Stone, 900), new RewardItem(ResourceType.Iron, 600), new RewardItem(ResourceType.Gold, 500), new RewardItem(ResourceType.Gems, 20) }; - fortress.respawnMinutes = 10f; - - return new List { home, bandits, fortress }; - } - - public static SettlementDef Get(string id) { return Settlements.Find(s => s.id == id); } - public static SettlementDef Home { get { return Settlements[0]; } } - - // С каждым разграблением поселение отстраивается на уровень выше: больше защитников и добычи - public static float LevelMultiplier(int level) { return 1f + 0.5f * (level - 1); } - - public static int UnitPower(int index) { return GameData.Troops[index].power; } -} - -// --- Сохраняемое состояние (часть ProgressData) --- - -[Serializable] -public class SettlementState -{ - public string id; - public int level = 1; - public int[] garrison = new int[4]; // текущие защитники - public long ruinedUntilTicks; // > сейчас -- поселение разграблено и пустует - public long lastBattleTicks; - public int timesRaided; -} - -[Serializable] -public class WorldMarch -{ - public int id; - public string targetId; - public int[] units = new int[4]; // отправлено - public int[] survivors = new int[4]; // вернутся домой - public long startTicks; - public long arriveTicks; - public long returnTicks; - public bool returning; - public bool recalled; - public float turnPoint = 1f; // где развернулись: 1 = у цели, меньше -- отозвали по дороге - public List loot = new List(); -} - -[Serializable] -public class BattleReport -{ - public long ticks; - public string title; - public string text; - public bool win; -} diff --git a/Assets/Scripts/Meta/World/WorldData.cs.meta b/Assets/Scripts/Meta/World/WorldData.cs.meta deleted file mode 100644 index 251b5c9..0000000 --- a/Assets/Scripts/Meta/World/WorldData.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: bb78904d07b16a64682697f8a240feb5 \ No newline at end of file diff --git a/Assets/Scripts/Meta/World/WorldLine.cs b/Assets/Scripts/Meta/World/WorldLine.cs deleted file mode 100644 index c24916e..0000000 --- a/Assets/Scripts/Meta/World/WorldLine.cs +++ /dev/null @@ -1,34 +0,0 @@ -using UnityEngine; - -// Линия-маршрут на карте между двумя точками (координаты 0..1 внутри родителя). -// Пересчитывается каждый кадр, поэтому не зависит от размера экрана. -[RequireComponent(typeof(RectTransform))] -public class WorldLine : MonoBehaviour -{ - public Vector2 from; - public Vector2 to; - public float thickness = 6f; - - RectTransform rt; - RectTransform parent; - - void Awake() - { - rt = (RectTransform)transform; - parent = (RectTransform)transform.parent; - rt.pivot = new Vector2(0f, 0.5f); - } - - void LateUpdate() - { - if (parent == null) return; - Vector2 size = parent.rect.size; - Vector2 a = Vector2.Scale(from, size); - Vector2 b = Vector2.Scale(to, size); - Vector2 d = b - a; - rt.anchorMin = rt.anchorMax = from; - rt.anchoredPosition = Vector2.zero; - rt.sizeDelta = new Vector2(d.magnitude, thickness); - rt.localRotation = Quaternion.Euler(0, 0, Mathf.Atan2(d.y, d.x) * Mathf.Rad2Deg); - } -} diff --git a/Assets/Scripts/Meta/World/WorldLine.cs.meta b/Assets/Scripts/Meta/World/WorldLine.cs.meta deleted file mode 100644 index f8ec38d..0000000 --- a/Assets/Scripts/Meta/World/WorldLine.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 7dda3d4605bc23a4fa4655209a6c30ba \ No newline at end of file diff --git a/Assets/Scripts/Meta/World/WorldMapPanel.cs b/Assets/Scripts/Meta/World/WorldMapPanel.cs deleted file mode 100644 index 008ec33..0000000 --- a/Assets/Scripts/Meta/World/WorldMapPanel.cs +++ /dev/null @@ -1,383 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.UI; -using TMPro; - -// ГЛОБАЛЬНАЯ КАРТА (панель "Мир"). -// Слева/сверху -- карта: ваш город, два тестовых поселения, маршруты, армии в пути с таймерами. -// Справа/снизу -- информация: армия в городе, выбранное поселение, походы, отчёты о боях, -// и окно отправки войск (сколько каких воинов, время в пути, шанс победы). -public class WorldMapPanel : BasePanel -{ - string selectedId = "bandits"; - bool sendMode; - readonly int[] sendUnits = new int[4]; - - // то, что обновляется каждый кадр без перерисовки - class MarchView { public WorldMarch m; public RectTransform marker; public TextMeshProUGUI label; public TextMeshProUGUI timer; } - readonly List marchViews = new List(); - readonly List> listTimers = new List>(); - readonly Dictionary ruinTimers = new Dictionary(); - readonly TextMeshProUGUI[] sendCounts = new TextMeshProUGUI[4]; - TextMeshProUGUI sendSummary; - Button sendButton; - - protected override void OnEnable() - { - base.OnEnable(); - sendMode = false; - } - - protected override void Build(RectTransform root) - { - marchViews.Clear(); listTimers.Clear(); ruinTimers.Clear(); sendSummary = null; sendButton = null; - for (int i = 0; i < 4; i++) sendCounts[i] = null; - - bool wide = root.rect.width > root.rect.height * 1.2f; - RectTransform layout; - if (wide) - { - layout = UIKit.Stretch(UIKit.Row(root, -1, 16)); - } - else - { - layout = UIKit.Stretch(UIKit.Card(root, new Color(0, 0, 0, 0), 0, 12)); - } - - // --- карта --- - var mapHolder = UIKit.Box(layout, new Color(0.16f, 0.27f, 0.17f)); - var mapLe = UIKit.Size(mapHolder, -1, -1, 1); - mapLe.flexibleHeight = wide ? 1 : 1.3f; - BuildMap((RectTransform)mapHolder.transform); - - // --- боковая колонка --- - var side = UIKit.Make("Side", layout); - var sideLe = UIKit.Size(side, wide ? 640 : -1, -1); - sideLe.flexibleHeight = 1; - if (!wide) sideLe.flexibleWidth = 1; - var list = ScrollList(side, 12); - - if (sendMode) BuildSend(list); else BuildInfo(list); - Tick(); - } - - // ===================== КАРТА ===================== - - void BuildMap(RectTransform map) - { - map.gameObject.AddComponent(); - - // декорации: "леса", "горы", "озеро" -- просто пятна, чтобы карта не была пустой - var rnd = new System.Random(7); - for (int i = 0; i < 26; i++) - { - float x = (float)rnd.NextDouble(), y = (float)rnd.NextDouble(); - int kind = rnd.Next(3); - Color c = kind == 0 ? new Color(0.11f, 0.21f, 0.12f) : (kind == 1 ? new Color(0.35f, 0.35f, 0.33f) : new Color(0.2f, 0.32f, 0.45f)); - float s = 30 + (float)rnd.NextDouble() * 60; - var blob = UIKit.Box(map, c); - blob.raycastTarget = false; - var brt = blob.rectTransform; - brt.anchorMin = brt.anchorMax = new Vector2(x, y); - brt.sizeDelta = new Vector2(s, s * 0.7f); - brt.localRotation = Quaternion.Euler(0, 0, rnd.Next(0, 90)); - } - // сетка - for (int i = 1; i < 5; i++) - { - Line(map, new Vector2(i / 5f, 0), new Vector2(i / 5f, 1), new Color(1, 1, 1, 0.05f), 2); - Line(map, new Vector2(0, i / 5f), new Vector2(1, i / 5f), new Color(1, 1, 1, 0.05f), 2); - } - - var home = WorldData.Home; - // постоянные дороги от города к поселениям - foreach (var s in WorldData.Settlements) - if (!s.isHome) Line(map, home.pos, s.pos, new Color(0.85f, 0.75f, 0.5f, 0.25f), 5); - - // активные маршруты -- ярче - foreach (var m in GP.Data.marches) - { - var target = WorldData.Get(m.targetId); - if (target == null) continue; - Line(map, home.pos, target.pos, m.returning ? new Color(0.4f, 0.9f, 0.5f, 0.8f) : new Color(1f, 0.55f, 0.2f, 0.85f), 8); - } - - // поселения - foreach (var s in WorldData.Settlements) SettlementIcon(map, s); - - // армии в пути - foreach (var m in GP.Data.marches) - { - var v = new MarchView { m = m }; - var marker = UIKit.Box(map, m.returning ? new Color(0.2f, 0.7f, 0.3f) : new Color(0.95f, 0.5f, 0.15f)); - marker.raycastTarget = false; - v.marker = marker.rectTransform; - v.marker.sizeDelta = new Vector2(64, 64); - v.label = UIKit.Text(v.marker, WorldSystem.Count(m.returning ? m.survivors : m.units).ToString(), 26, Color.white, TextAlignmentOptions.Center); - UIKit.Stretch(v.label.rectTransform); - v.label.fontStyle = FontStyles.Bold; - v.timer = UIKit.Text(v.marker, "", 24, Color.white, TextAlignmentOptions.Center); - var trt = v.timer.rectTransform; - trt.anchorMin = new Vector2(0.5f, 1); trt.anchorMax = new Vector2(0.5f, 1); - trt.pivot = new Vector2(0.5f, 0); trt.sizeDelta = new Vector2(220, 34); trt.anchoredPosition = new Vector2(0, 4); - v.timer.outlineWidth = 0.25f; v.timer.outlineColor = Color.black; - marchViews.Add(v); - } - Frame(); - } - - void SettlementIcon(RectTransform map, SettlementDef s) - { - var st = s.isHome ? null : WorldSystem.State(s.id); - bool ruined = !s.isHome && WorldSystem.IsRuined(s.id, System.DateTime.UtcNow.Ticks); - bool selected = s.id == selectedId; - - float size = s.isHome ? 130 : 110; - if (selected) - { - // золотая рамка выбранного поселения (под иконкой) - var ring = UIKit.Box(map, UIKit.Theme.Gold); - ring.raycastTarget = false; - ring.rectTransform.anchorMin = ring.rectTransform.anchorMax = s.pos; - ring.rectTransform.sizeDelta = new Vector2(size + 16, size + 16); - } - var holder = UIKit.Make("Settlement_" + s.id, map); - holder.anchorMin = holder.anchorMax = s.pos; - holder.sizeDelta = new Vector2(size, size); - var img = holder.gameObject.AddComponent(); - img.color = ruined ? new Color(0.3f, 0.3f, 0.3f) : s.color; - var btn = holder.gameObject.AddComponent