From bf7b1bbbb21e3ca0c94737a96aec1b86cbe6b729 Mon Sep 17 00:00:00 2001 From: "Bob.Song" <605277374@qq.com> Date: Fri, 10 Oct 2025 17:57:36 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A8=E6=A0=BC=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Resources/config/configs.json | 630 ++++++++++-------- Assets/Scripts/Configs~/Cache.meta | 8 + .../Scripts/Configs~/Cache/ConfigContext.cs | 90 +++ .../Configs~/Cache/ConfigContext.cs.meta | 2 + Assets/Scripts/Configs~/Cache/Configs.cs | 27 + Assets/Scripts/Configs~/Cache/Configs.cs.meta | 2 + .../Configs~/Cache/TableNameAttribute.cs | 17 + .../Configs~/Cache/TableNameAttribute.cs.meta | 3 + Assets/Scripts/Configs~/ConfigAssets.Parse.cs | 68 ++ .../Configs~/ConfigAssets.Parse.cs.meta | 3 + Assets/Scripts/Configs~/ConfigAssets.cs | 30 + Assets/Scripts/Configs~/ConfigAssets.cs.meta | 3 + Assets/Scripts/Configs~/Editor.meta | 3 + .../Scripts/Configs~/Editor/CfgEditorUtil.cs | 197 ++++++ .../Configs~/Editor/CfgEditorUtil.cs.meta | 3 + Assets/Scripts/Configs~/Editor/CodeWriter.cs | 105 +++ .../Configs~/Editor/CodeWriter.cs.meta | 2 + .../Configs~/Editor/ConfigWarpTemplate | 65 ++ .../Configs~/Editor/ConfigWarpTemplate.meta | 7 + Assets/Scripts/Configs~/Extemds.meta | 3 + .../Scripts/Configs~/Extemds/JTokenExtends.cs | 138 ++++ .../Configs~/Extemds/JTokenExtends.cs.meta | 3 + Assets/Scripts/Configs~/Gen.meta | 3 + .../Scripts/Configs~/Gen/ConfigAssets.Gen.cs | 122 ++++ .../Configs~/Gen/ConfigAssets.Gen.cs.meta | 2 + Assets/Scripts/Configs~/Gen/Warps.meta | 3 + .../Configs~/Gen/Warps/BaitConfigWarp.cs | 65 ++ .../Configs~/Gen/Warps/BaitConfigWarp.cs.meta | 2 + .../Configs~/Gen/Warps/BobberConfigWarp.cs | 65 ++ .../Gen/Warps/BobberConfigWarp.cs.meta | 2 + .../Configs~/Gen/Warps/FeederConfigWarp.cs | 65 ++ .../Gen/Warps/FeederConfigWarp.cs.meta | 2 + .../Gen/Warps/FishAcceptConfigWarp.cs | 65 ++ .../Gen/Warps/FishAcceptConfigWarp.cs.meta | 2 + .../Configs~/Gen/Warps/FishConfigWarp.cs | 65 ++ .../Configs~/Gen/Warps/FishConfigWarp.cs.meta | 2 + .../Configs~/Gen/Warps/HookConfigWarp.cs | 65 ++ .../Configs~/Gen/Warps/HookConfigWarp.cs.meta | 2 + .../Configs~/Gen/Warps/LeadersConfigWarp.cs | 65 ++ .../Gen/Warps/LeadersConfigWarp.cs.meta | 2 + .../Configs~/Gen/Warps/LineConfigWarp.cs | 65 ++ .../Configs~/Gen/Warps/LineConfigWarp.cs.meta | 2 + .../Configs~/Gen/Warps/LureConfigWarp.cs | 65 ++ .../Configs~/Gen/Warps/LureConfigWarp.cs.meta | 2 + .../Configs~/Gen/Warps/ReelConfigWarp.cs | 65 ++ .../Configs~/Gen/Warps/ReelConfigWarp.cs.meta | 2 + .../Configs~/Gen/Warps/RingConfigWarp.cs | 65 ++ .../Configs~/Gen/Warps/RingConfigWarp.cs.meta | 2 + .../Configs~/Gen/Warps/RodConfigWarp.cs | 65 ++ .../Configs~/Gen/Warps/RodConfigWarp.cs.meta | 2 + .../Configs~/Gen/Warps/UnitConfigWarp.cs | 65 ++ .../Configs~/Gen/Warps/UnitConfigWarp.cs.meta | 2 + .../Configs~/Gen/Warps/WeightConfigWarp.cs | 65 ++ .../Gen/Warps/WeightConfigWarp.cs.meta | 2 + Assets/Scripts/Configs~/Mem.meta | 3 + Assets/Scripts/Configs~/Mem/BaitConfig.cs | 137 ++++ .../Scripts/Configs~/Mem/BaitConfig.cs.meta | 3 + Assets/Scripts/Configs~/Mem/BobberConfig.cs | 32 + .../Scripts/Configs~/Mem/BobberConfig.cs.meta | 3 + Assets/Scripts/Configs~/Mem/CameraCfg.cs | 68 ++ Assets/Scripts/Configs~/Mem/CameraCfg.cs.meta | 3 + Assets/Scripts/Configs~/Mem/ConfigBase.cs | 53 ++ .../Scripts/Configs~/Mem/ConfigBase.cs.meta | 3 + Assets/Scripts/Configs~/Mem/FeederConfig.cs | 25 + .../Scripts/Configs~/Mem/FeederConfig.cs.meta | 3 + .../Scripts/Configs~/Mem/FishAcceptConfig.cs | 12 + .../Configs~/Mem/FishAcceptConfig.cs.meta | 3 + Assets/Scripts/Configs~/Mem/FishConfig.cs | 134 ++++ .../Scripts/Configs~/Mem/FishConfig.cs.meta | 3 + Assets/Scripts/Configs~/Mem/HookConfig.cs | 167 +++++ .../Scripts/Configs~/Mem/HookConfig.cs.meta | 3 + Assets/Scripts/Configs~/Mem/LeadersConfig.cs | 19 + .../Configs~/Mem/LeadersConfig.cs.meta | 3 + Assets/Scripts/Configs~/Mem/LineConfig.cs | 28 + .../Scripts/Configs~/Mem/LineConfig.cs.meta | 3 + Assets/Scripts/Configs~/Mem/LureConfig.cs | 123 ++++ .../Scripts/Configs~/Mem/LureConfig.cs.meta | 3 + Assets/Scripts/Configs~/Mem/ReelConfig.cs | 30 + .../Scripts/Configs~/Mem/ReelConfig.cs.meta | 3 + Assets/Scripts/Configs~/Mem/RingConfig.cs | 7 + .../Scripts/Configs~/Mem/RingConfig.cs.meta | 3 + Assets/Scripts/Configs~/Mem/RodConfig.cs | 41 ++ Assets/Scripts/Configs~/Mem/RodConfig.cs.meta | 3 + Assets/Scripts/Configs~/Mem/UnitConfig.cs | 31 + .../Scripts/Configs~/Mem/UnitConfig.cs.meta | 3 + Assets/Scripts/Configs~/Mem/WeightConfig.cs | 26 + .../Scripts/Configs~/Mem/WeightConfig.cs.meta | 3 + Assets/Scripts/Fishing2/Helper/ProtoHelper.cs | 2 +- Assets/Scripts/Fishing2/Role/Role.cs | 2 +- Assets/Scripts/Generate/Config/BaitConfig.cs | 145 ++-- Assets/Scripts/Generate/Config/BasicConfig.cs | 85 +++ .../Generate/Config/BasicConfig.cs.meta | 2 + .../Scripts/Generate/Config/BobberConfig.cs | 145 ++-- .../Scripts/Generate/Config/FeederConfig.cs | 145 ++-- Assets/Scripts/Generate/Config/FishConfig.cs | 145 ++-- Assets/Scripts/Generate/Config/HookConfig.cs | 145 ++-- Assets/Scripts/Generate/Config/InitConfig.cs | 85 +++ .../Generate/Config/InitConfig.cs.meta | 2 + Assets/Scripts/Generate/Config/ItemConfig.cs | 89 +++ .../Generate/Config/ItemConfig.cs.meta | 2 + Assets/Scripts/Generate/Config/LineConfig.cs | 145 ++-- Assets/Scripts/Generate/Config/LureConfig.cs | 145 ++-- Assets/Scripts/Generate/Config/ReelConfig.cs | 145 ++-- Assets/Scripts/Generate/Config/RingConfig.cs | 145 ++-- Assets/Scripts/Generate/Config/RodConfig.cs | 145 ++-- Assets/Scripts/Generate/Config/Unit2Config.cs | 145 ++-- Assets/Scripts/Generate/Config/UnitConfig.cs | 145 ++-- .../Scripts/Generate/Config/WeightConfig.cs | 145 ++-- .../NetworkProtocol/CommonProtoData.cs | 10 +- Assets/Scripts/Init.cs | 5 + .../NBC/Runtime/Core/Config/ConfigContext.cs | 90 +++ .../Runtime/Core/Config/ConfigContext.cs.meta | 3 + .../Runtime/Core/Config/ConfigTableHelper.cs | 118 ++-- .../NBC/Runtime/Core/Config/IConfigTable.cs | 5 +- Config/BaitConfig.xlsx | Bin 10010 -> 0 bytes Config/BasicConfig.xlsx | Bin 0 -> 11320 bytes Config/BobberConfig.xlsx | Bin 11779 -> 0 bytes Config/FeederConfig.xlsx | Bin 9692 -> 0 bytes Config/FishConfig.xlsx | Bin 11721 -> 11709 bytes Config/Gear.xlsx | Bin 0 -> 30584 bytes Config/HookConfig.xlsx | Bin 11687 -> 0 bytes Config/Item.xlsx | Bin 0 -> 11766 bytes Config/LineConfig.xlsx | Bin 11629 -> 0 bytes Config/LureConfig.xlsx | Bin 9999 -> 0 bytes Config/ReelConfig.xlsx | Bin 11647 -> 0 bytes Config/RingConfig.xlsx | Bin 9555 -> 0 bytes Config/RodConfig.xlsx | Bin 11912 -> 0 bytes Config/UnitConfig.xlsx | Bin 10550 -> 0 bytes Config/WeightConfig.xlsx | Bin 11428 -> 0 bytes Config/~$BasicConfig.xlsx | 0 Config/~$fishing gear-渔具.xlsx | Bin 165 -> 0 bytes Config/新建 文本文档.txt | 0 Fishing2.sln.DotSettings.user | 1 + 133 files changed, 4481 insertions(+), 1366 deletions(-) create mode 100644 Assets/Scripts/Configs~/Cache.meta create mode 100644 Assets/Scripts/Configs~/Cache/ConfigContext.cs create mode 100644 Assets/Scripts/Configs~/Cache/ConfigContext.cs.meta create mode 100644 Assets/Scripts/Configs~/Cache/Configs.cs create mode 100644 Assets/Scripts/Configs~/Cache/Configs.cs.meta create mode 100644 Assets/Scripts/Configs~/Cache/TableNameAttribute.cs create mode 100644 Assets/Scripts/Configs~/Cache/TableNameAttribute.cs.meta create mode 100644 Assets/Scripts/Configs~/ConfigAssets.Parse.cs create mode 100644 Assets/Scripts/Configs~/ConfigAssets.Parse.cs.meta create mode 100644 Assets/Scripts/Configs~/ConfigAssets.cs create mode 100644 Assets/Scripts/Configs~/ConfigAssets.cs.meta create mode 100644 Assets/Scripts/Configs~/Editor.meta create mode 100644 Assets/Scripts/Configs~/Editor/CfgEditorUtil.cs create mode 100644 Assets/Scripts/Configs~/Editor/CfgEditorUtil.cs.meta create mode 100644 Assets/Scripts/Configs~/Editor/CodeWriter.cs create mode 100644 Assets/Scripts/Configs~/Editor/CodeWriter.cs.meta create mode 100644 Assets/Scripts/Configs~/Editor/ConfigWarpTemplate create mode 100644 Assets/Scripts/Configs~/Editor/ConfigWarpTemplate.meta create mode 100644 Assets/Scripts/Configs~/Extemds.meta create mode 100644 Assets/Scripts/Configs~/Extemds/JTokenExtends.cs create mode 100644 Assets/Scripts/Configs~/Extemds/JTokenExtends.cs.meta create mode 100644 Assets/Scripts/Configs~/Gen.meta create mode 100644 Assets/Scripts/Configs~/Gen/ConfigAssets.Gen.cs create mode 100644 Assets/Scripts/Configs~/Gen/ConfigAssets.Gen.cs.meta create mode 100644 Assets/Scripts/Configs~/Gen/Warps.meta create mode 100644 Assets/Scripts/Configs~/Gen/Warps/BaitConfigWarp.cs create mode 100644 Assets/Scripts/Configs~/Gen/Warps/BaitConfigWarp.cs.meta create mode 100644 Assets/Scripts/Configs~/Gen/Warps/BobberConfigWarp.cs create mode 100644 Assets/Scripts/Configs~/Gen/Warps/BobberConfigWarp.cs.meta create mode 100644 Assets/Scripts/Configs~/Gen/Warps/FeederConfigWarp.cs create mode 100644 Assets/Scripts/Configs~/Gen/Warps/FeederConfigWarp.cs.meta create mode 100644 Assets/Scripts/Configs~/Gen/Warps/FishAcceptConfigWarp.cs create mode 100644 Assets/Scripts/Configs~/Gen/Warps/FishAcceptConfigWarp.cs.meta create mode 100644 Assets/Scripts/Configs~/Gen/Warps/FishConfigWarp.cs create mode 100644 Assets/Scripts/Configs~/Gen/Warps/FishConfigWarp.cs.meta create mode 100644 Assets/Scripts/Configs~/Gen/Warps/HookConfigWarp.cs create mode 100644 Assets/Scripts/Configs~/Gen/Warps/HookConfigWarp.cs.meta create mode 100644 Assets/Scripts/Configs~/Gen/Warps/LeadersConfigWarp.cs create mode 100644 Assets/Scripts/Configs~/Gen/Warps/LeadersConfigWarp.cs.meta create mode 100644 Assets/Scripts/Configs~/Gen/Warps/LineConfigWarp.cs create mode 100644 Assets/Scripts/Configs~/Gen/Warps/LineConfigWarp.cs.meta create mode 100644 Assets/Scripts/Configs~/Gen/Warps/LureConfigWarp.cs create mode 100644 Assets/Scripts/Configs~/Gen/Warps/LureConfigWarp.cs.meta create mode 100644 Assets/Scripts/Configs~/Gen/Warps/ReelConfigWarp.cs create mode 100644 Assets/Scripts/Configs~/Gen/Warps/ReelConfigWarp.cs.meta create mode 100644 Assets/Scripts/Configs~/Gen/Warps/RingConfigWarp.cs create mode 100644 Assets/Scripts/Configs~/Gen/Warps/RingConfigWarp.cs.meta create mode 100644 Assets/Scripts/Configs~/Gen/Warps/RodConfigWarp.cs create mode 100644 Assets/Scripts/Configs~/Gen/Warps/RodConfigWarp.cs.meta create mode 100644 Assets/Scripts/Configs~/Gen/Warps/UnitConfigWarp.cs create mode 100644 Assets/Scripts/Configs~/Gen/Warps/UnitConfigWarp.cs.meta create mode 100644 Assets/Scripts/Configs~/Gen/Warps/WeightConfigWarp.cs create mode 100644 Assets/Scripts/Configs~/Gen/Warps/WeightConfigWarp.cs.meta create mode 100644 Assets/Scripts/Configs~/Mem.meta create mode 100644 Assets/Scripts/Configs~/Mem/BaitConfig.cs create mode 100644 Assets/Scripts/Configs~/Mem/BaitConfig.cs.meta create mode 100644 Assets/Scripts/Configs~/Mem/BobberConfig.cs create mode 100644 Assets/Scripts/Configs~/Mem/BobberConfig.cs.meta create mode 100644 Assets/Scripts/Configs~/Mem/CameraCfg.cs create mode 100644 Assets/Scripts/Configs~/Mem/CameraCfg.cs.meta create mode 100644 Assets/Scripts/Configs~/Mem/ConfigBase.cs create mode 100644 Assets/Scripts/Configs~/Mem/ConfigBase.cs.meta create mode 100644 Assets/Scripts/Configs~/Mem/FeederConfig.cs create mode 100644 Assets/Scripts/Configs~/Mem/FeederConfig.cs.meta create mode 100644 Assets/Scripts/Configs~/Mem/FishAcceptConfig.cs create mode 100644 Assets/Scripts/Configs~/Mem/FishAcceptConfig.cs.meta create mode 100644 Assets/Scripts/Configs~/Mem/FishConfig.cs create mode 100644 Assets/Scripts/Configs~/Mem/FishConfig.cs.meta create mode 100644 Assets/Scripts/Configs~/Mem/HookConfig.cs create mode 100644 Assets/Scripts/Configs~/Mem/HookConfig.cs.meta create mode 100644 Assets/Scripts/Configs~/Mem/LeadersConfig.cs create mode 100644 Assets/Scripts/Configs~/Mem/LeadersConfig.cs.meta create mode 100644 Assets/Scripts/Configs~/Mem/LineConfig.cs create mode 100644 Assets/Scripts/Configs~/Mem/LineConfig.cs.meta create mode 100644 Assets/Scripts/Configs~/Mem/LureConfig.cs create mode 100644 Assets/Scripts/Configs~/Mem/LureConfig.cs.meta create mode 100644 Assets/Scripts/Configs~/Mem/ReelConfig.cs create mode 100644 Assets/Scripts/Configs~/Mem/ReelConfig.cs.meta create mode 100644 Assets/Scripts/Configs~/Mem/RingConfig.cs create mode 100644 Assets/Scripts/Configs~/Mem/RingConfig.cs.meta create mode 100644 Assets/Scripts/Configs~/Mem/RodConfig.cs create mode 100644 Assets/Scripts/Configs~/Mem/RodConfig.cs.meta create mode 100644 Assets/Scripts/Configs~/Mem/UnitConfig.cs create mode 100644 Assets/Scripts/Configs~/Mem/UnitConfig.cs.meta create mode 100644 Assets/Scripts/Configs~/Mem/WeightConfig.cs create mode 100644 Assets/Scripts/Configs~/Mem/WeightConfig.cs.meta create mode 100644 Assets/Scripts/Generate/Config/BasicConfig.cs create mode 100644 Assets/Scripts/Generate/Config/BasicConfig.cs.meta create mode 100644 Assets/Scripts/Generate/Config/InitConfig.cs create mode 100644 Assets/Scripts/Generate/Config/InitConfig.cs.meta create mode 100644 Assets/Scripts/Generate/Config/ItemConfig.cs create mode 100644 Assets/Scripts/Generate/Config/ItemConfig.cs.meta create mode 100644 Assets/Scripts/NBC/Runtime/Core/Config/ConfigContext.cs create mode 100644 Assets/Scripts/NBC/Runtime/Core/Config/ConfigContext.cs.meta delete mode 100644 Config/BaitConfig.xlsx create mode 100644 Config/BasicConfig.xlsx delete mode 100644 Config/BobberConfig.xlsx delete mode 100644 Config/FeederConfig.xlsx create mode 100644 Config/Gear.xlsx delete mode 100644 Config/HookConfig.xlsx create mode 100644 Config/Item.xlsx delete mode 100644 Config/LineConfig.xlsx delete mode 100644 Config/LureConfig.xlsx delete mode 100644 Config/ReelConfig.xlsx delete mode 100644 Config/RingConfig.xlsx delete mode 100644 Config/RodConfig.xlsx delete mode 100644 Config/UnitConfig.xlsx delete mode 100644 Config/WeightConfig.xlsx create mode 100644 Config/~$BasicConfig.xlsx delete mode 100644 Config/~$fishing gear-渔具.xlsx create mode 100644 Config/新建 文本文档.txt diff --git a/Assets/Resources/config/configs.json b/Assets/Resources/config/configs.json index e2205386d..eb4f78711 100644 --- a/Assets/Resources/config/configs.json +++ b/Assets/Resources/config/configs.json @@ -1,7 +1,373 @@ { + "WeightConfig": [ + { + "Id": 100001, + "Model": "Weights/Weight2_5g", + "Type": 0, + "Weight": 3 + } + ], + "RingConfig": [ + { + "Id": 120001, + "Model": "rod_rings/rumoi/rumoi_oxiline_spin" + }, + { + "Id": 120002, + "Model": "rod_rings/smt/smt_pure_ceramic_bolo" + } + ], + "LureConfig": [ + { + "Id": 80001, + "Model": "lures/express_fishing/crankbaits_1/775/crankbaits_775", + "Hook": [ + 700102 + ], + "EfficacyBase": 50, + "Length": 0, + "Weight": 250 + }, + { + "Id": 80002, + "Model": "lures/express_fishing/poppers_1/poppers_590/poppers_590", + "Hook": [ + 700102 + ], + "EfficacyBase": 50, + "Length": 0, + "Weight": 120 + }, + { + "Id": 80003, + "Model": "lures/express_fishing/softplastic/ef_supergrab_6/softplastic_g_1622", + "Hook": [ + 0 + ], + "EfficacyBase": 50, + "Length": 0, + "Weight": 120 + }, + { + "Id": 80004, + "Model": "lures/express_fishing/softplastic/ef_superminnow_6/softplastic_m_1634", + "Hook": [ + 0 + ], + "EfficacyBase": 50, + "Length": 0, + "Weight": 120 + } + ], + "ItemConfig": [ + { + "Id": 10001, + "Model": "rods/syberia/tele_10037/tele_10037_t13", + "Type": 1, + "Max": 0, + "AutoUse": 0 + }, + { + "Id": 10002, + "Model": "rods/syberia/bolo_10021/bolo_10021_LB400", + "Type": 0, + "Max": 1100002, + "AutoUse": 0 + }, + { + "Id": 10003, + "Model": "rods/syberia/spin_10034/spin_10034_S60H", + "Type": 0, + "Max": 1100001, + "AutoUse": 0 + } + ], + "ReelConfig": [ + { + "Id": 40001, + "Model": "reels/syberia/spin_5002/spin_5002", + "Type": 0, + "GearRatio": [ + "7" + ], + "Size": 250, + "Strength": 40 + }, + { + "Id": 40002, + "Model": "reels/syberia/spin_5036/spin_5036", + "Type": 0, + "GearRatio": [ + "5" + ], + "Size": 120, + "Strength": 40 + } + ], + "LineConfig": [ + { + "Id": 60001, + "Model": "Lines/UFE Mono/UFE monoClear", + "Type": 0, + "Length": 7, + "Strength": 40, + "Size": 1 + }, + { + "Id": 60002, + "Model": "rods/syberia/bolo_10021/bolo_10021_LB400", + "Type": 0, + "Length": 5, + "Strength": 40, + "Size": 1 + } + ], + "HookConfig": [ + { + "Id": 90001, + "Model": "hooks/alliance/c_hook_20789_20794/c_hook_20789", + "Type": 1, + "Zadzior": 1, + "Length": 0, + "Weight": 1 + }, + { + "Id": 90002, + "Model": "hooks/berserk_hooks/triple_20569_20577/triple_20569", + "Type": 1, + "Zadzior": 1, + "Length": 0, + "Weight": 1 + } + ], + "RodConfig": [ + { + "Id": 30001, + "Model": "rods/syberia/tele_10037/tele_10037_t13", + "Type": 1, + "Ring": 0, + "Length": 7, + "Weight": 250, + "Strength": 40, + "MaxRange": 67, + "ConstructionType": 0 + }, + { + "Id": 30002, + "Model": "rods/syberia/bolo_10021/bolo_10021_LB400", + "Type": 0, + "Ring": 1100002, + "Length": 5, + "Weight": 120, + "Strength": 40, + "MaxRange": 30, + "ConstructionType": 0 + }, + { + "Id": 30003, + "Model": "rods/syberia/spin_10034/spin_10034_S60H", + "Type": 0, + "Ring": 1100001, + "Length": 5, + "Weight": 120, + "Strength": 40, + "MaxRange": 30, + "ConstructionType": 0 + } + ], + "FishConfig": [ + { + "Id": 210001, + "Model": [ + "Burbot_B" + ], + "Type": 0, + "SpeciesName": 10, + "MinWeight": 1, + "MaxWeight": 34, + "Accept": 2100001 + }, + { + "Id": 210002, + "Model": [ + "CarpCommon_B" + ], + "Type": 0, + "SpeciesName": 11, + "MinWeight": 1, + "MaxWeight": 34, + "Accept": 2100001 + }, + { + "Id": 210003, + "Model": [ + "CarpGrass_B" + ], + "Type": 0, + "SpeciesName": 14, + "MinWeight": 1, + "MaxWeight": 34, + "Accept": 2100001 + }, + { + "Id": 210004, + "Model": [ + "CarpCrucian_B" + ], + "Type": 0, + "SpeciesName": 16, + "MinWeight": 1, + "MaxWeight": 34, + "Accept": 2100001 + } + ], + "BasicConfig": [ + { + "Id": 1001, + "Name": "Weights/Weight2_5g", + "Val": [ + "0" + ] + } + ], + "InitConfig": [ + { + "Id": 1, + "ItemId": 30001, + "Amount": 1 + }, + { + "Id": 2, + "ItemId": 30002, + "Amount": 1 + }, + { + "Id": 3, + "ItemId": 30003, + "Amount": 1 + }, + { + "Id": 4, + "ItemId": 40001, + "Amount": 1 + }, + { + "Id": 5, + "ItemId": 50001, + "Amount": 1 + }, + { + "Id": 6, + "ItemId": 50002, + "Amount": 1 + }, + { + "Id": 7, + "ItemId": 50003, + "Amount": 1 + }, + { + "Id": 8, + "ItemId": 60001, + "Amount": 1 + }, + { + "Id": 9, + "ItemId": 70001, + "Amount": 1 + }, + { + "Id": 10, + "ItemId": 70002, + "Amount": 1 + }, + { + "Id": 11, + "ItemId": 80001, + "Amount": 1 + }, + { + "Id": 12, + "ItemId": 80002, + "Amount": 1 + }, + { + "Id": 13, + "ItemId": 80003, + "Amount": 1 + }, + { + "Id": 14, + "ItemId": 80004, + "Amount": 1 + }, + { + "Id": 15, + "ItemId": 90001, + "Amount": 1 + }, + { + "Id": 16, + "ItemId": 100001, + "Amount": 1 + }, + { + "Id": 17, + "ItemId": 10001, + "Amount": 100 + }, + { + "Id": 18, + "ItemId": 10002, + "Amount": 200 + } + ], + "BobberConfig": [ + { + "Id": 50001, + "Model": "bobbers/expressfishing/bob_25003/bob_25003", + "Type": 2, + "Weight": 1, + "Displacement": 40, + "NightLight": 0 + }, + { + "Id": 50002, + "Model": "bobbers/expressfishing/bob_25162_25163/bob_25162", + "Type": 0, + "Weight": 1, + "Displacement": 40, + "NightLight": 0 + }, + { + "Id": 50003, + "Model": "bobbers/expressfishing/bob_25166_25167/bob_25166", + "Type": 0, + "Weight": 1, + "Displacement": 40, + "NightLight": 0 + }, + { + "Id": 50004, + "Model": "bobbers/expressfishing/bob_25001/bob_25001", + "Type": 0, + "Weight": 1, + "Displacement": 40, + "NightLight": 0 + } + ], + "FeederConfig": [ + { + "Id": 110001, + "Model": "Feeders/Feeder 1/FeedTrash 1", + "Type": 0, + "Capacity": 100, + "Weight": 5 + } + ], "BaitConfig": [ { - "Id": 500001, + "Id": 70001, "Model": "baits/worm_01/worm_01", "EfficacyBase": 15, "Length": 0, @@ -20,7 +386,7 @@ ] }, { - "Id": 500002, + "Id": 70002, "Model": "baits/fly/fly", "EfficacyBase": 15, "Length": 0, @@ -37,7 +403,7 @@ ] }, { - "Id": 500003, + "Id": 70003, "Model": "baits/black_leech/black_leech", "EfficacyBase": 15, "Length": 0, @@ -50,7 +416,7 @@ ] }, { - "Id": 500004, + "Id": 70004, "Model": "baits/bread/bread", "EfficacyBase": 15, "Length": 0, @@ -63,261 +429,5 @@ "44|2" ] } - ], - "ReelConfig": [ - { - "Id": 200001, - "Model": "reels/syberia/spin_5002/spin_5002", - "Type": 0, - "GearRatio": [ - "7" - ], - "Size": 250, - "Strength": 40 - }, - { - "Id": 200002, - "Model": "reels/syberia/spin_5036/spin_5036", - "Type": 0, - "GearRatio": [ - "5" - ], - "Size": 120, - "Strength": 40 - } - ], - "FishConfig": [ - { - "Id": 2200001, - "Model": [ - "Burbot_B" - ], - "Type": 0, - "SpeciesName": 10, - "MinWeight": 1, - "MaxWeight": 34, - "Accept": 2100001 - }, - { - "Id": 2200002, - "Model": [ - "CarpCommon_B" - ], - "Type": 0, - "SpeciesName": 11, - "MinWeight": 1, - "MaxWeight": 34, - "Accept": 2100001 - }, - { - "Id": 2200003, - "Model": [ - "CarpGrass_B" - ], - "Type": 0, - "SpeciesName": 14, - "MinWeight": 1, - "MaxWeight": 34, - "Accept": 2100001 - }, - { - "Id": 2200004, - "Model": [ - "CarpCrucian_B" - ], - "Type": 0, - "SpeciesName": 16, - "MinWeight": 1, - "MaxWeight": 34, - "Accept": 2100001 - } - ], - "RodConfig": [ - { - "Id": 100001, - "Model": "rods/syberia/tele_10037/tele_10037_t13", - "Type": 1, - "Ring": 0, - "Length": 7, - "Weight": 250, - "Strength": 40, - "MaxRange": 67, - "ConstructionType": 0 - }, - { - "Id": 100002, - "Model": "rods/syberia/bolo_10021/bolo_10021_LB400", - "Type": 0, - "Ring": 1100002, - "Length": 5, - "Weight": 120, - "Strength": 40, - "MaxRange": 30, - "ConstructionType": 0 - }, - { - "Id": 100003, - "Model": "rods/syberia/spin_10034/spin_10034_S60H", - "Type": 0, - "Ring": 1100001, - "Length": 5, - "Weight": 120, - "Strength": 40, - "MaxRange": 30, - "ConstructionType": 0 - } - ], - "HookConfig": [ - { - "Id": 700001, - "Model": "hooks/alliance/c_hook_20789_20794/c_hook_20789", - "Type": 1, - "Zadzior": 1, - "Length": 0, - "Weight": 1 - }, - { - "Id": 700002, - "Model": "hooks/berserk_hooks/triple_20569_20577/triple_20569", - "Type": 1, - "Zadzior": 1, - "Length": 0, - "Weight": 1 - } - ], - "LureConfig": [ - { - "Id": 600001, - "Model": "lures/express_fishing/crankbaits_1/775/crankbaits_775", - "Hook": [ - 700102 - ], - "EfficacyBase": 50, - "Length": 0, - "Weight": 250 - }, - { - "Id": 600002, - "Model": "lures/express_fishing/poppers_1/poppers_590/poppers_590", - "Hook": [ - 700102 - ], - "EfficacyBase": 50, - "Length": 0, - "Weight": 120 - }, - { - "Id": 600003, - "Model": "lures/express_fishing/softplastic/ef_supergrab_6/softplastic_g_1622", - "Hook": [ - 0 - ], - "EfficacyBase": 50, - "Length": 0, - "Weight": 120 - }, - { - "Id": 600004, - "Model": "lures/express_fishing/softplastic/ef_superminnow_6/softplastic_m_1634", - "Hook": [ - 0 - ], - "EfficacyBase": 50, - "Length": 0, - "Weight": 120 - } - ], - "Unit2Config": [ - { - "Id": 1, - "Name": "Unit01", - "Model": "Unit01" - } - ], - "RingConfig": [ - { - "Id": 1100001, - "Model": "rod_rings/rumoi/rumoi_oxiline_spin" - }, - { - "Id": 1100002, - "Model": "rod_rings/smt/smt_pure_ceramic_bolo" - } - ], - "FeederConfig": [ - { - "Id": 900001, - "Model": "Feeders/Feeder 1/FeedTrash 1", - "Type": 0, - "Capacity": 100, - "Weight": 5 - } - ], - "BobberConfig": [ - { - "Id": 300001, - "Model": "bobbers/expressfishing/bob_25003/bob_25003", - "Type": 2, - "Weight": 1, - "Displacement": 40, - "NightLight": 0 - }, - { - "Id": 300002, - "Model": "bobbers/expressfishing/bob_25162_25163/bob_25162", - "Type": 0, - "Weight": 1, - "Displacement": 40, - "NightLight": 0 - }, - { - "Id": 300003, - "Model": "bobbers/expressfishing/bob_25166_25167/bob_25166", - "Type": 0, - "Weight": 1, - "Displacement": 40, - "NightLight": 0 - }, - { - "Id": 300004, - "Model": "bobbers/expressfishing/bob_25001/bob_25001", - "Type": 0, - "Weight": 1, - "Displacement": 40, - "NightLight": 0 - } - ], - "LineConfig": [ - { - "Id": 400001, - "Model": "Lines/UFE Mono/UFE monoClear", - "Type": 0, - "Length": 7, - "Strength": 40, - "Size": 1 - }, - { - "Id": 400002, - "Model": "rods/syberia/bolo_10021/bolo_10021_LB400", - "Type": 0, - "Length": 5, - "Strength": 40, - "Size": 1 - } - ], - "WeightConfig": [ - { - "Id": 800001, - "Model": "Weights/Weight2_5g", - "Type": 0, - "Weight": 3 - } - ], - "UnitConfig": [ - { - "Id": 1, - "Name": "Unit01", - "Model": "Unit01" - } ] } \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Cache.meta b/Assets/Scripts/Configs~/Cache.meta new file mode 100644 index 000000000..13ca635d5 --- /dev/null +++ b/Assets/Scripts/Configs~/Cache.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d89005a134404b88b748787a74946d20 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Configs~/Cache/ConfigContext.cs b/Assets/Scripts/Configs~/Cache/ConfigContext.cs new file mode 100644 index 000000000..4c1a3168d --- /dev/null +++ b/Assets/Scripts/Configs~/Cache/ConfigContext.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace NBF +{ + public interface IConfigContext + { + // 定义非泛型接口 + } + + public class ConfigContext : IConfigContext where T : ConfigBase + { + private static List _cacheList = new List(); + + #region Cache + + public void Association(List list) + { + if (list != null) + { + _cacheList = list; + } + } + + #endregion + + public int Count() + { + return _cacheList.Count; + } + + public int Count(Func predicate) + { + return _cacheList.Count(predicate); + } + + public T Get(int key) + { + return First(key); + } + + public T Fist() + { + return _cacheList.First(); + } + + public T Last() + { + return _cacheList.Last(); + } + + public T Fist(Predicate match) + { + return Get(match); + } + + public T Last(Predicate match) + { + return _cacheList.FindLast(match); + } + + public T Get(Predicate match) + { + return _cacheList.Find(match); + } + + public T GetRandom() + { + Random random = new Random(); + // 随机从列表中取一个对象 + return _cacheList[random.Next(_cacheList.Count)]; + } + + public List GetList() + { + return _cacheList; + } + + public List GetList(Predicate match) + { + return _cacheList.FindAll(match); + } + + private T First(int key) + { + return _cacheList.Find(t => t.id == key); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Cache/ConfigContext.cs.meta b/Assets/Scripts/Configs~/Cache/ConfigContext.cs.meta new file mode 100644 index 000000000..d6f758d4c --- /dev/null +++ b/Assets/Scripts/Configs~/Cache/ConfigContext.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 82dbb868b2724a85aa866e0bf9e88e91 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Cache/Configs.cs b/Assets/Scripts/Configs~/Cache/Configs.cs new file mode 100644 index 000000000..c4610a020 --- /dev/null +++ b/Assets/Scripts/Configs~/Cache/Configs.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace NBF +{ + public static class Configs + { + private static readonly Dictionary _dictionary = new Dictionary(); + + static Configs() + { + } + + public static ConfigContext Table() where T : ConfigBase + { + var type = typeof(T); + if (_dictionary.TryGetValue(type, out var context)) + { + return context as ConfigContext; + } + + var jsonContext = new ConfigContext(); + _dictionary[type] = jsonContext; + return jsonContext; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Cache/Configs.cs.meta b/Assets/Scripts/Configs~/Cache/Configs.cs.meta new file mode 100644 index 000000000..161d50cb5 --- /dev/null +++ b/Assets/Scripts/Configs~/Cache/Configs.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1881c9eee25240ddbaecbf99546a8750 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Cache/TableNameAttribute.cs b/Assets/Scripts/Configs~/Cache/TableNameAttribute.cs new file mode 100644 index 000000000..9a9676b9a --- /dev/null +++ b/Assets/Scripts/Configs~/Cache/TableNameAttribute.cs @@ -0,0 +1,17 @@ +using System; + +namespace NBF +{ + [AttributeUsage(AttributeTargets.Class)] + public class TableNameAttribute : Attribute + { + public string Name; + public string Key; + + public TableNameAttribute(string name, string key = "id") + { + Name = name; + Key = key; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Cache/TableNameAttribute.cs.meta b/Assets/Scripts/Configs~/Cache/TableNameAttribute.cs.meta new file mode 100644 index 000000000..05932f62f --- /dev/null +++ b/Assets/Scripts/Configs~/Cache/TableNameAttribute.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 737030131eba4fd6ba6067b47fcae5d3 +timeCreated: 1744862554 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/ConfigAssets.Parse.cs b/Assets/Scripts/Configs~/ConfigAssets.Parse.cs new file mode 100644 index 000000000..39efaff89 --- /dev/null +++ b/Assets/Scripts/Configs~/ConfigAssets.Parse.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using NBC; +using Newtonsoft.Json.Linq; +using UnityEngine; + +namespace NBF +{ + public partial class ConfigAssets + { + private static readonly Type CustomType = typeof(ICustomParse); + + private static List ParseLine(JToken[] arr, TableNameAttribute tableNameAttribute) where T : ConfigBase + { + List list = new List(); + var type = typeof(T); + foreach (var jToken in arr) + { + T instance = null; + try + { + if (CustomType.IsAssignableFrom(type)) //自定义解析 + { + instance = Activator.CreateInstance(); + } + else + { + instance = jToken.ToObject(); + } + } + catch (Exception e) + { + Log.Error(e); + } + + if (instance != null) + { + var key = jToken[tableNameAttribute.Key].ToInt(); + if (key < 1) + { + if (instance.id > 0) + { + key = instance.id; + } + } + + try + { + if (key < 1) continue; + if (instance is ICustomParse customParse) + { + customParse.Parse(jToken); + } + + instance.id = key; + list.Add(instance); + } + catch (Exception e) + { + Log.Error(e); + } + } + } + + return list; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/ConfigAssets.Parse.cs.meta b/Assets/Scripts/Configs~/ConfigAssets.Parse.cs.meta new file mode 100644 index 000000000..221b4caad --- /dev/null +++ b/Assets/Scripts/Configs~/ConfigAssets.Parse.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 09494bd809bd47b29be0723c8671afb8 +timeCreated: 1744898106 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/ConfigAssets.cs b/Assets/Scripts/Configs~/ConfigAssets.cs new file mode 100644 index 000000000..e78d4afef --- /dev/null +++ b/Assets/Scripts/Configs~/ConfigAssets.cs @@ -0,0 +1,30 @@ +using UnityEngine; + +namespace NBF +{ + public partial class ConfigAssets : ScriptableObject + { + // public static string SavePath => $"Assets/ResRaw/Config/ConfigAssets.asset"; + public static string SavePath => $"Assets/Resources/Config/ConfigAssets.asset"; + private static ConfigAssets _inst; + + public static ConfigAssets Instance => _inst; + + public static void Init() + { + var asset = Resources.Load("config/ConfigAssets"); + if (asset != null) + { + asset.AssociationContexts(); + _inst = asset; + } + + // var assetProvider = NBC.Asset.Assets.LoadAsset(SavePath); + // if (assetProvider != null && assetProvider.Asset is ConfigAssets asset) + // { + // asset.AssociationContexts(); + // _inst = asset; + // } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/ConfigAssets.cs.meta b/Assets/Scripts/Configs~/ConfigAssets.cs.meta new file mode 100644 index 000000000..a3398331b --- /dev/null +++ b/Assets/Scripts/Configs~/ConfigAssets.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3d8691ef03f74aedb6cfd67e53cf664f +timeCreated: 1742999693 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Editor.meta b/Assets/Scripts/Configs~/Editor.meta new file mode 100644 index 000000000..7d23eff71 --- /dev/null +++ b/Assets/Scripts/Configs~/Editor.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2178333fb882410eb05c0f66a95c8880 +timeCreated: 1742998269 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Editor/CfgEditorUtil.cs b/Assets/Scripts/Configs~/Editor/CfgEditorUtil.cs new file mode 100644 index 000000000..f8c33bf5a --- /dev/null +++ b/Assets/Scripts/Configs~/Editor/CfgEditorUtil.cs @@ -0,0 +1,197 @@ +using System; +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEngine; + +namespace NBF +{ + public static class CfgEditorUtil + { + [MenuItem("构建/配置表/生成脚本")] + public static void CreateScriptableObject() + { + EditorUtils.GetOrCreateAsset(ConfigAssets.SavePath); + GenConfigScripts(); + AssetDatabase.Refresh(); + } + + [MenuItem("构建/配置表/导表")] + public static void BuildExcel() + { + ExcelToJsonWindow.GenConfig(false); + AssetDatabase.Refresh(); + } + + [MenuItem("构建/配置表/导多语言")] + public static void BuildLanguage() + { + ExcelToJsonWindow.GenLanguage(); + AssetDatabase.Refresh(); + } + + #region 生成脚本 + + private static string GenPath = "Scripts/Configs/Gen"; + private static string TempPath = "Scripts/Configs/Editor/ConfigWarpTemplate"; + + public static void GenConfigScripts() + { + if (!Directory.Exists($"{Application.dataPath}/{GenPath}")) + { + return; + } + + var types = Reflection.GetAllNonAbstractDerivedTypes(); + Dictionary tableNameAttributes = new Dictionary(); + foreach (var type in types) + { + tableNameAttributes[type] = type.Name; + } + + // var canGen = CanGen(tableNameAttributes); + // + // if (!canGen) return; + GenParse(tableNameAttributes); + GenWarp(tableNameAttributes); + // GenBinder(tableNameAttributes); + AssetDatabase.Refresh(); + } + + private static bool CanGen(Dictionary tableNameAttributes) + { + // return true; + string filePath = Path.Combine(Application.dataPath, $"{GenPath}/Warps"); + if (!Directory.Exists(filePath)) return true; + var files = Directory.GetFiles(filePath); + List allFileName = new List(); + foreach (var file in files) + { + if (Path.GetExtension(file).ToLower() == ".meta") continue; + var fileName = Path.GetFileNameWithoutExtension(file); + allFileName.Add(fileName.Replace("Warp", "")); + } + + if (allFileName.Count != tableNameAttributes.Count) return true; + + foreach (var type in tableNameAttributes.Keys) + { + if (!allFileName.Contains(type.Name)) return true; + } + + return false; + } + + + private static void GenWarp(Dictionary tableNameAttributes) + { + // 为何使用生成式,不使用static静态泛型 ? 生成式扩展更强且不会破坏原类的集成结构,父类也不用是泛型类 + //否则比如 BaseConfig 类型来使用。集成结构会受很大限制,反而没有生成式来的灵活 + + string filePath = Path.Combine(Application.dataPath, TempPath); + if (File.Exists(filePath)) + { + // 读取文本内容 + string fileContent = File.ReadAllText(filePath); + var rootPath = $"{Application.dataPath}/{GenPath}/Warps"; + if (!Directory.Exists(rootPath)) + { + return; + } + + if (!Directory.Exists(rootPath)) + { + Directory.CreateDirectory(rootPath); + } + + foreach (var type in tableNameAttributes.Keys) + { + var content = fileContent.Replace("##NAME##", type.Name); + File.WriteAllText($"{rootPath}/{type.Name}Warp.cs", content); + } + } + else + { + Debug.LogError("生成代码模板不存在,请检查"); + } + } + + private static void GenParse(Dictionary tableNameAttributes) + { + if (!Directory.Exists($"{Application.dataPath}/{GenPath}")) + { + return; + } + + CodeWriter codeWriter = new CodeWriter(); + codeWriter.Writeln("/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/"); + codeWriter.Writeln(); + codeWriter.Writeln("using System;"); + codeWriter.Writeln("using System.Collections.Generic;"); + codeWriter.Writeln("using System.Reflection;"); + codeWriter.Writeln("using Newtonsoft.Json.Linq;"); + codeWriter.Writeln("using UnityEngine;"); + + codeWriter.Writeln(); + codeWriter.Writeln("namespace NBF"); + + codeWriter.StartBlock(); + + codeWriter.Writeln("public partial class ConfigAssets"); + codeWriter.StartBlock(); + + foreach (var type in tableNameAttributes.Keys) + { + // codeWriter.Writeln($"[HideInInspector] public List<{type.Name}> {type.Name}Arr;"); + codeWriter.Writeln($"public List<{type.Name}> {type.Name}Arr;"); + } + + codeWriter.Writeln(); + + codeWriter.Writeln("public void Parse(JToken[] arr, Type type)"); + codeWriter.StartBlock(); + codeWriter.Writeln("var tableNameAttribute = type.GetCustomAttribute();"); + codeWriter.Writeln("if (tableNameAttribute == null) return;"); + + foreach (var type in tableNameAttributes.Keys) + { + codeWriter.Writeln($"if (type == typeof({type.Name}))"); + codeWriter.StartBlock(); + codeWriter.Writeln($"{type.Name}Arr = ParseLine<{type.Name}>(arr, tableNameAttribute);"); + codeWriter.EndBlock(); + codeWriter.Writeln(); + } + + codeWriter.EndBlock(); + + codeWriter.Writeln(); + codeWriter.Writeln("public void AssociationContexts()"); + codeWriter.StartBlock(); + + foreach (var type in tableNameAttributes.Keys) + { + codeWriter.Writeln($"new ConfigContext<{type.Name}>().Association({type.Name}Arr);"); + } + + codeWriter.EndBlock(); + + + codeWriter.EndBlock(); + codeWriter.EndBlock(); + + codeWriter.Save($"{Application.dataPath}/{GenPath}/ConfigAssets.Gen.cs"); + } + + + private static void WriterCreateParse(CodeWriter codeWriter, Type type) + { + codeWriter.Writeln($"if (type == typeof({type.Name}))"); + codeWriter.StartBlock(); + codeWriter.Writeln($"return CreateParseTableTask<{type.Name}>();"); + codeWriter.EndBlock(); + codeWriter.Writeln(); + } + + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Editor/CfgEditorUtil.cs.meta b/Assets/Scripts/Configs~/Editor/CfgEditorUtil.cs.meta new file mode 100644 index 000000000..7c99811e6 --- /dev/null +++ b/Assets/Scripts/Configs~/Editor/CfgEditorUtil.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5bc0ac74b225496da64195b28ce14cb2 +timeCreated: 1742998279 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Editor/CodeWriter.cs b/Assets/Scripts/Configs~/Editor/CodeWriter.cs new file mode 100644 index 000000000..c7b2365de --- /dev/null +++ b/Assets/Scripts/Configs~/Editor/CodeWriter.cs @@ -0,0 +1,105 @@ +using System; +using System.IO; +using System.Text; + +namespace NBF +{ + public interface ICodeWriterConfig + { + string BlockStart { get; set; } + string BlockEnd { get; set; } + bool BlockFromNewLine { get; set; } + bool UsingTabs { get; set; } + string EndOfLine { get; set; } + } + + public class DefCSharpCodeWriterConfig : ICodeWriterConfig + { + public string BlockStart { get; set; } = "{"; + public string BlockEnd { get; set; } = "}"; + public bool BlockFromNewLine { get; set; } + public bool UsingTabs { get; set; } = true; + public string EndOfLine { get; set; } + } + + public class CodeWriter + { + private ICodeWriterConfig _config; + + private StringBuilder _stringBuilder = new StringBuilder(); + + private int _nowTabCount; + + public CodeWriter() + { + Init(); + } + + public CodeWriter(ICodeWriterConfig config) + { + Init(config); + } + + public void Write(string content) + { + _stringBuilder.Append(content); + } + + public void Writeln() + { + _stringBuilder.Append(Environment.NewLine); + } + + public void Writeln(string str) + { + _stringBuilder.Append(GetLinePrefix()); + _stringBuilder.Append(str); + _stringBuilder.Append(Environment.NewLine); + } + + public void StartBlock() + { + Writeln(_config.BlockStart); + _nowTabCount++; + } + + public void EndBlock() + { + _nowTabCount--; + Writeln(_config.BlockEnd); + } + + public void Save(string path) + { + var dirPath = Path.GetDirectoryName(path); + if (dirPath != null && !Directory.Exists(dirPath)) + { + Directory.CreateDirectory(dirPath); + } + + var content = _stringBuilder.ToString(); + File.WriteAllText(path, content); + } + + #region 内部方法 + + private void Init(ICodeWriterConfig config = null) + { + _config = config ?? new DefCSharpCodeWriterConfig(); + } + + private string GetLinePrefix() + { + string ret = string.Empty; + if (!_config.UsingTabs) return ret; + for (var i = 0; i < _nowTabCount; i++) + { + ret += "\t"; + } + + return ret; + } + + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Editor/CodeWriter.cs.meta b/Assets/Scripts/Configs~/Editor/CodeWriter.cs.meta new file mode 100644 index 000000000..d0d64bd8b --- /dev/null +++ b/Assets/Scripts/Configs~/Editor/CodeWriter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cf1ac73cd67e4bdc9de1a53a13f5b841 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Editor/ConfigWarpTemplate b/Assets/Scripts/Configs~/Editor/ConfigWarpTemplate new file mode 100644 index 000000000..51681f4f0 --- /dev/null +++ b/Assets/Scripts/Configs~/Editor/ConfigWarpTemplate @@ -0,0 +1,65 @@ +/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/ +using System; +using System.Collections.Generic; + +namespace NBF +{ + [Serializable] + public partial class ##NAME## + { + private static ConfigContext<##NAME##> _context; + + private static ConfigContext<##NAME##> Context => _context ??= Configs.Table<##NAME##>(); + + public static ##NAME## Get(int key) + { + return Context.Get(key); + } + + public static ##NAME## Get(Predicate<##NAME##> match) + { + return Context.Get(match); + } + + public static ##NAME## Fist() + { + return Context.Fist(); + } + + public static ##NAME## Last() + { + return Context.Last(); + } + + public static ##NAME## Fist(Predicate<##NAME##> match) + { + return Context.Fist(match); + } + + public static ##NAME## Last(Predicate<##NAME##> match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func<##NAME##, bool> predicate) + { + return Context.Count(predicate); + } + + + public static List<##NAME##> GetList() + { + return Context.GetList(); + } + + public static List<##NAME##> GetList(Predicate<##NAME##> match) + { + return Context.GetList(match); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Editor/ConfigWarpTemplate.meta b/Assets/Scripts/Configs~/Editor/ConfigWarpTemplate.meta new file mode 100644 index 000000000..fc3837842 --- /dev/null +++ b/Assets/Scripts/Configs~/Editor/ConfigWarpTemplate.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4b77eee728204f26bc602016c4a20c86 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Configs~/Extemds.meta b/Assets/Scripts/Configs~/Extemds.meta new file mode 100644 index 000000000..d674680a6 --- /dev/null +++ b/Assets/Scripts/Configs~/Extemds.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b8a50bb33d07439e9c7762e17bced2e0 +timeCreated: 1744862665 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Extemds/JTokenExtends.cs b/Assets/Scripts/Configs~/Extemds/JTokenExtends.cs new file mode 100644 index 000000000..e0b24a635 --- /dev/null +++ b/Assets/Scripts/Configs~/Extemds/JTokenExtends.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json.Linq; +using UnityEngine; + +namespace NBF +{ + public static class JTokenExtends + { + public static Vector2 ToVector2(this string str, string sp = ",") + { + Vector2 vector2 = Vector2.zero; + var arr = str.Split(sp); + if (arr.Length > 0) + { + float.TryParse(arr[0], out vector2.x); + if (arr.Length > 1) + { + float.TryParse(arr[1], out vector2.y); + } + } + + return vector2; + } + + public static Vector3 ToVector3(this string str, string sp = ",") + { + Vector3 vector2 = Vector3.zero; + var arr = str.Split(sp); + if (arr.Length > 0) + { + float.TryParse(arr[0], out vector2.x); + if (arr.Length > 1) + { + float.TryParse(arr[1], out vector2.y); + } + + if (arr.Length > 2) + { + float.TryParse(arr[2], out vector2.z); + } + } + + return vector2; + } + + public static T[] ToArr(this JToken token, string split = ",") where T : IConvertible + { + if (token is JArray array) + { + return array.ToObject(); + } + + if (token != null) + { + var str = token.ToString(); + if (string.IsNullOrWhiteSpace(str)) return Array.Empty(); + + var arr = str.Split(split); + try + { + return arr.Select(a => (T)Convert.ChangeType(a, typeof(T))).ToArray(); + } + catch (Exception e) + { + Console.WriteLine(e); + throw; + } + } + + return Array.Empty(); + } + + public static int ToInt(this JToken token) + { + if (token == null) + { + return 0; + } + + try + { + return (int)token; + } + catch (Exception e) + { + return 0; + } + } + + public static float ToFloat(this JToken token) + { + if (token == null) + { + return 0; + } + + try + { + return (float)token; + } + catch (Exception e) + { + return 0; + } + } + + public static string ToStr(this JToken token) + { + if (token != null) + { + return token.ToString(); + } + + return string.Empty; + } + + public static List ToList(this JToken token, string split = ",") where T : IConvertible + { + if (token is JArray array) + { + return array.ToObject>(); + } + + if (token != null) + { + var str = token.ToString(); + if (string.IsNullOrWhiteSpace(str)) return new List(); + var arr = str.Split(split); + return arr.Select( + a => string.IsNullOrWhiteSpace(a) ? default : (T)Convert.ChangeType(a, typeof(T))).ToList(); + } + + return new List(); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Extemds/JTokenExtends.cs.meta b/Assets/Scripts/Configs~/Extemds/JTokenExtends.cs.meta new file mode 100644 index 000000000..89797cceb --- /dev/null +++ b/Assets/Scripts/Configs~/Extemds/JTokenExtends.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3d6ce3cc850f41b8ba83653660b928ce +timeCreated: 1744862670 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen.meta b/Assets/Scripts/Configs~/Gen.meta new file mode 100644 index 000000000..0dc52f34e --- /dev/null +++ b/Assets/Scripts/Configs~/Gen.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0eceaba126fb407583191d01e32bb735 +timeCreated: 1756050728 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/ConfigAssets.Gen.cs b/Assets/Scripts/Configs~/Gen/ConfigAssets.Gen.cs new file mode 100644 index 000000000..63afd189c --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/ConfigAssets.Gen.cs @@ -0,0 +1,122 @@ +/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/ + +using System; +using System.Collections.Generic; +using System.Reflection; +using Newtonsoft.Json.Linq; +using UnityEngine; + +namespace NBF +{ + public partial class ConfigAssets + { + public List BaitConfigArr; + public List BobberConfigArr; + public List FeederConfigArr; + public List FishAcceptConfigArr; + public List FishConfigArr; + public List HookConfigArr; + public List LeadersConfigArr; + public List LineConfigArr; + public List LureConfigArr; + public List ReelConfigArr; + public List RingConfigArr; + public List RodConfigArr; + public List UnitConfigArr; + public List WeightConfigArr; + + public void Parse(JToken[] arr, Type type) + { + var tableNameAttribute = type.GetCustomAttribute(); + if (tableNameAttribute == null) return; + if (type == typeof(BaitConfig)) + { + BaitConfigArr = ParseLine(arr, tableNameAttribute); + } + + if (type == typeof(BobberConfig)) + { + BobberConfigArr = ParseLine(arr, tableNameAttribute); + } + + if (type == typeof(FeederConfig)) + { + FeederConfigArr = ParseLine(arr, tableNameAttribute); + } + + if (type == typeof(FishAcceptConfig)) + { + FishAcceptConfigArr = ParseLine(arr, tableNameAttribute); + } + + if (type == typeof(FishConfig)) + { + FishConfigArr = ParseLine(arr, tableNameAttribute); + } + + if (type == typeof(HookConfig)) + { + HookConfigArr = ParseLine(arr, tableNameAttribute); + } + + if (type == typeof(LeadersConfig)) + { + LeadersConfigArr = ParseLine(arr, tableNameAttribute); + } + + if (type == typeof(LineConfig)) + { + LineConfigArr = ParseLine(arr, tableNameAttribute); + } + + if (type == typeof(LureConfig)) + { + LureConfigArr = ParseLine(arr, tableNameAttribute); + } + + if (type == typeof(ReelConfig)) + { + ReelConfigArr = ParseLine(arr, tableNameAttribute); + } + + if (type == typeof(RingConfig)) + { + RingConfigArr = ParseLine(arr, tableNameAttribute); + } + + if (type == typeof(RodConfig)) + { + RodConfigArr = ParseLine(arr, tableNameAttribute); + } + + if (type == typeof(UnitConfig)) + { + UnitConfigArr = ParseLine(arr, tableNameAttribute); + } + + if (type == typeof(WeightConfig)) + { + WeightConfigArr = ParseLine(arr, tableNameAttribute); + } + + } + + public void AssociationContexts() + { + new ConfigContext().Association(BaitConfigArr); + new ConfigContext().Association(BobberConfigArr); + new ConfigContext().Association(FeederConfigArr); + new ConfigContext().Association(FishAcceptConfigArr); + new ConfigContext().Association(FishConfigArr); + new ConfigContext().Association(HookConfigArr); + new ConfigContext().Association(LeadersConfigArr); + new ConfigContext().Association(LineConfigArr); + new ConfigContext().Association(LureConfigArr); + new ConfigContext().Association(ReelConfigArr); + new ConfigContext().Association(RingConfigArr); + new ConfigContext().Association(RodConfigArr); + new ConfigContext().Association(UnitConfigArr); + new ConfigContext().Association(WeightConfigArr); + } + } +} diff --git a/Assets/Scripts/Configs~/Gen/ConfigAssets.Gen.cs.meta b/Assets/Scripts/Configs~/Gen/ConfigAssets.Gen.cs.meta new file mode 100644 index 000000000..ed730e0fd --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/ConfigAssets.Gen.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bd9bbc8f86e64a928533f493e39813ed \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps.meta b/Assets/Scripts/Configs~/Gen/Warps.meta new file mode 100644 index 000000000..15944082b --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 98e70a75b52b4728aec1e5b7f506695c +timeCreated: 1756050753 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/BaitConfigWarp.cs b/Assets/Scripts/Configs~/Gen/Warps/BaitConfigWarp.cs new file mode 100644 index 000000000..78fbf6fbf --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/BaitConfigWarp.cs @@ -0,0 +1,65 @@ +/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/ +using System; +using System.Collections.Generic; + +namespace NBF +{ + [Serializable] + public partial class BaitConfig + { + private static ConfigContext _context; + + private static ConfigContext Context => _context ??= Configs.Table(); + + public static BaitConfig Get(int key) + { + return Context.Get(key); + } + + public static BaitConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static BaitConfig Fist() + { + return Context.Fist(); + } + + public static BaitConfig Last() + { + return Context.Last(); + } + + public static BaitConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static BaitConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/BaitConfigWarp.cs.meta b/Assets/Scripts/Configs~/Gen/Warps/BaitConfigWarp.cs.meta new file mode 100644 index 000000000..62c32df08 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/BaitConfigWarp.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5c6bdb0bae4da2a4da6aacaf58a1abc0 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/BobberConfigWarp.cs b/Assets/Scripts/Configs~/Gen/Warps/BobberConfigWarp.cs new file mode 100644 index 000000000..b6d3fac39 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/BobberConfigWarp.cs @@ -0,0 +1,65 @@ +/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/ +using System; +using System.Collections.Generic; + +namespace NBF +{ + [Serializable] + public partial class BobberConfig + { + private static ConfigContext _context; + + private static ConfigContext Context => _context ??= Configs.Table(); + + public static BobberConfig Get(int key) + { + return Context.Get(key); + } + + public static BobberConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static BobberConfig Fist() + { + return Context.Fist(); + } + + public static BobberConfig Last() + { + return Context.Last(); + } + + public static BobberConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static BobberConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/BobberConfigWarp.cs.meta b/Assets/Scripts/Configs~/Gen/Warps/BobberConfigWarp.cs.meta new file mode 100644 index 000000000..53cac01ed --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/BobberConfigWarp.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 99b64c24f2bad454086ac41dd6aa7ffc \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/FeederConfigWarp.cs b/Assets/Scripts/Configs~/Gen/Warps/FeederConfigWarp.cs new file mode 100644 index 000000000..bb2f54b52 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/FeederConfigWarp.cs @@ -0,0 +1,65 @@ +/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/ +using System; +using System.Collections.Generic; + +namespace NBF +{ + [Serializable] + public partial class FeederConfig + { + private static ConfigContext _context; + + private static ConfigContext Context => _context ??= Configs.Table(); + + public static FeederConfig Get(int key) + { + return Context.Get(key); + } + + public static FeederConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static FeederConfig Fist() + { + return Context.Fist(); + } + + public static FeederConfig Last() + { + return Context.Last(); + } + + public static FeederConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static FeederConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/FeederConfigWarp.cs.meta b/Assets/Scripts/Configs~/Gen/Warps/FeederConfigWarp.cs.meta new file mode 100644 index 000000000..8bd74b4f9 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/FeederConfigWarp.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: dc082eda2a5880148843ce9c21ed4eed \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/FishAcceptConfigWarp.cs b/Assets/Scripts/Configs~/Gen/Warps/FishAcceptConfigWarp.cs new file mode 100644 index 000000000..b8081592e --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/FishAcceptConfigWarp.cs @@ -0,0 +1,65 @@ +/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/ +using System; +using System.Collections.Generic; + +namespace NBF +{ + [Serializable] + public partial class FishAcceptConfig + { + private static ConfigContext _context; + + private static ConfigContext Context => _context ??= Configs.Table(); + + public static FishAcceptConfig Get(int key) + { + return Context.Get(key); + } + + public static FishAcceptConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static FishAcceptConfig Fist() + { + return Context.Fist(); + } + + public static FishAcceptConfig Last() + { + return Context.Last(); + } + + public static FishAcceptConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static FishAcceptConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/FishAcceptConfigWarp.cs.meta b/Assets/Scripts/Configs~/Gen/Warps/FishAcceptConfigWarp.cs.meta new file mode 100644 index 000000000..e06497024 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/FishAcceptConfigWarp.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 23d45122e487d8f439bf063a4df7a4b7 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/FishConfigWarp.cs b/Assets/Scripts/Configs~/Gen/Warps/FishConfigWarp.cs new file mode 100644 index 000000000..6ea97f0fc --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/FishConfigWarp.cs @@ -0,0 +1,65 @@ +/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/ +using System; +using System.Collections.Generic; + +namespace NBF +{ + [Serializable] + public partial class FishConfig + { + private static ConfigContext _context; + + private static ConfigContext Context => _context ??= Configs.Table(); + + public static FishConfig Get(int key) + { + return Context.Get(key); + } + + public static FishConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static FishConfig Fist() + { + return Context.Fist(); + } + + public static FishConfig Last() + { + return Context.Last(); + } + + public static FishConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static FishConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/FishConfigWarp.cs.meta b/Assets/Scripts/Configs~/Gen/Warps/FishConfigWarp.cs.meta new file mode 100644 index 000000000..81486f4f3 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/FishConfigWarp.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d60d97e94b1432c4e985a5469fd01409 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/HookConfigWarp.cs b/Assets/Scripts/Configs~/Gen/Warps/HookConfigWarp.cs new file mode 100644 index 000000000..c03d22af3 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/HookConfigWarp.cs @@ -0,0 +1,65 @@ +/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/ +using System; +using System.Collections.Generic; + +namespace NBF +{ + [Serializable] + public partial class HookConfig + { + private static ConfigContext _context; + + private static ConfigContext Context => _context ??= Configs.Table(); + + public static HookConfig Get(int key) + { + return Context.Get(key); + } + + public static HookConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static HookConfig Fist() + { + return Context.Fist(); + } + + public static HookConfig Last() + { + return Context.Last(); + } + + public static HookConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static HookConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/HookConfigWarp.cs.meta b/Assets/Scripts/Configs~/Gen/Warps/HookConfigWarp.cs.meta new file mode 100644 index 000000000..a48eb7900 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/HookConfigWarp.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: fc38b93ab46f1bd4a83f81f1cd3b3e4c \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/LeadersConfigWarp.cs b/Assets/Scripts/Configs~/Gen/Warps/LeadersConfigWarp.cs new file mode 100644 index 000000000..ad4c8a8af --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/LeadersConfigWarp.cs @@ -0,0 +1,65 @@ +/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/ +using System; +using System.Collections.Generic; + +namespace NBF +{ + [Serializable] + public partial class LeadersConfig + { + private static ConfigContext _context; + + private static ConfigContext Context => _context ??= Configs.Table(); + + public static LeadersConfig Get(int key) + { + return Context.Get(key); + } + + public static LeadersConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static LeadersConfig Fist() + { + return Context.Fist(); + } + + public static LeadersConfig Last() + { + return Context.Last(); + } + + public static LeadersConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static LeadersConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/LeadersConfigWarp.cs.meta b/Assets/Scripts/Configs~/Gen/Warps/LeadersConfigWarp.cs.meta new file mode 100644 index 000000000..f11b68d93 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/LeadersConfigWarp.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7911fb1cf4470014eadb4d9db5db5861 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/LineConfigWarp.cs b/Assets/Scripts/Configs~/Gen/Warps/LineConfigWarp.cs new file mode 100644 index 000000000..7ae22d3ab --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/LineConfigWarp.cs @@ -0,0 +1,65 @@ +/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/ +using System; +using System.Collections.Generic; + +namespace NBF +{ + [Serializable] + public partial class LineConfig + { + private static ConfigContext _context; + + private static ConfigContext Context => _context ??= Configs.Table(); + + public static LineConfig Get(int key) + { + return Context.Get(key); + } + + public static LineConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static LineConfig Fist() + { + return Context.Fist(); + } + + public static LineConfig Last() + { + return Context.Last(); + } + + public static LineConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static LineConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/LineConfigWarp.cs.meta b/Assets/Scripts/Configs~/Gen/Warps/LineConfigWarp.cs.meta new file mode 100644 index 000000000..48a663dea --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/LineConfigWarp.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1acb019fe35da324cb5a26e45c54532d \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/LureConfigWarp.cs b/Assets/Scripts/Configs~/Gen/Warps/LureConfigWarp.cs new file mode 100644 index 000000000..e26f0145e --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/LureConfigWarp.cs @@ -0,0 +1,65 @@ +/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/ +using System; +using System.Collections.Generic; + +namespace NBF +{ + [Serializable] + public partial class LureConfig + { + private static ConfigContext _context; + + private static ConfigContext Context => _context ??= Configs.Table(); + + public static LureConfig Get(int key) + { + return Context.Get(key); + } + + public static LureConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static LureConfig Fist() + { + return Context.Fist(); + } + + public static LureConfig Last() + { + return Context.Last(); + } + + public static LureConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static LureConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/LureConfigWarp.cs.meta b/Assets/Scripts/Configs~/Gen/Warps/LureConfigWarp.cs.meta new file mode 100644 index 000000000..33df3e2ef --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/LureConfigWarp.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 74aae733a506d0840a1a7cc2623ed5fd \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/ReelConfigWarp.cs b/Assets/Scripts/Configs~/Gen/Warps/ReelConfigWarp.cs new file mode 100644 index 000000000..e7cb60301 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/ReelConfigWarp.cs @@ -0,0 +1,65 @@ +/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/ +using System; +using System.Collections.Generic; + +namespace NBF +{ + [Serializable] + public partial class ReelConfig + { + private static ConfigContext _context; + + private static ConfigContext Context => _context ??= Configs.Table(); + + public static ReelConfig Get(int key) + { + return Context.Get(key); + } + + public static ReelConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static ReelConfig Fist() + { + return Context.Fist(); + } + + public static ReelConfig Last() + { + return Context.Last(); + } + + public static ReelConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static ReelConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/ReelConfigWarp.cs.meta b/Assets/Scripts/Configs~/Gen/Warps/ReelConfigWarp.cs.meta new file mode 100644 index 000000000..30120eb5a --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/ReelConfigWarp.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6bfa9f163eb97be418e04f1f62c607de \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/RingConfigWarp.cs b/Assets/Scripts/Configs~/Gen/Warps/RingConfigWarp.cs new file mode 100644 index 000000000..209da8dfb --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/RingConfigWarp.cs @@ -0,0 +1,65 @@ +/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/ +using System; +using System.Collections.Generic; + +namespace NBF +{ + [Serializable] + public partial class RingConfig + { + private static ConfigContext _context; + + private static ConfigContext Context => _context ??= Configs.Table(); + + public static RingConfig Get(int key) + { + return Context.Get(key); + } + + public static RingConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static RingConfig Fist() + { + return Context.Fist(); + } + + public static RingConfig Last() + { + return Context.Last(); + } + + public static RingConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static RingConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/RingConfigWarp.cs.meta b/Assets/Scripts/Configs~/Gen/Warps/RingConfigWarp.cs.meta new file mode 100644 index 000000000..8a778e233 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/RingConfigWarp.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a52a98969f4fae44ba19533cb1ae552e \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/RodConfigWarp.cs b/Assets/Scripts/Configs~/Gen/Warps/RodConfigWarp.cs new file mode 100644 index 000000000..280781968 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/RodConfigWarp.cs @@ -0,0 +1,65 @@ +/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/ +using System; +using System.Collections.Generic; + +namespace NBF +{ + [Serializable] + public partial class RodConfig + { + private static ConfigContext _context; + + private static ConfigContext Context => _context ??= Configs.Table(); + + public static RodConfig Get(int key) + { + return Context.Get(key); + } + + public static RodConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static RodConfig Fist() + { + return Context.Fist(); + } + + public static RodConfig Last() + { + return Context.Last(); + } + + public static RodConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static RodConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/RodConfigWarp.cs.meta b/Assets/Scripts/Configs~/Gen/Warps/RodConfigWarp.cs.meta new file mode 100644 index 000000000..33ef28386 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/RodConfigWarp.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 81f057dddf36a734ead19cd98e19a2e0 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/UnitConfigWarp.cs b/Assets/Scripts/Configs~/Gen/Warps/UnitConfigWarp.cs new file mode 100644 index 000000000..0398f08b0 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/UnitConfigWarp.cs @@ -0,0 +1,65 @@ +/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/ +using System; +using System.Collections.Generic; + +namespace NBF +{ + [Serializable] + public partial class UnitConfig + { + private static ConfigContext _context; + + private static ConfigContext Context => _context ??= Configs.Table(); + + public static UnitConfig Get(int key) + { + return Context.Get(key); + } + + public static UnitConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static UnitConfig Fist() + { + return Context.Fist(); + } + + public static UnitConfig Last() + { + return Context.Last(); + } + + public static UnitConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static UnitConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/UnitConfigWarp.cs.meta b/Assets/Scripts/Configs~/Gen/Warps/UnitConfigWarp.cs.meta new file mode 100644 index 000000000..a260fdbd8 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/UnitConfigWarp.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 69acf2fddccdd7b4fae3ad883cbc50ec \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/WeightConfigWarp.cs b/Assets/Scripts/Configs~/Gen/Warps/WeightConfigWarp.cs new file mode 100644 index 000000000..7018eed48 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/WeightConfigWarp.cs @@ -0,0 +1,65 @@ +/**本脚本为自动生成,每次生成会覆盖!请勿手动修改**/ +using System; +using System.Collections.Generic; + +namespace NBF +{ + [Serializable] + public partial class WeightConfig + { + private static ConfigContext _context; + + private static ConfigContext Context => _context ??= Configs.Table(); + + public static WeightConfig Get(int key) + { + return Context.Get(key); + } + + public static WeightConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static WeightConfig Fist() + { + return Context.Fist(); + } + + public static WeightConfig Last() + { + return Context.Last(); + } + + public static WeightConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static WeightConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Gen/Warps/WeightConfigWarp.cs.meta b/Assets/Scripts/Configs~/Gen/Warps/WeightConfigWarp.cs.meta new file mode 100644 index 000000000..a14f49de5 --- /dev/null +++ b/Assets/Scripts/Configs~/Gen/Warps/WeightConfigWarp.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 43244884876723947bd6574d57b2349c \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem.meta b/Assets/Scripts/Configs~/Mem.meta new file mode 100644 index 000000000..23fea0283 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 9fbbf78150ef486581fecb379fc3b1cd +timeCreated: 1742998650 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/BaitConfig.cs b/Assets/Scripts/Configs~/Mem/BaitConfig.cs new file mode 100644 index 000000000..36e636948 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/BaitConfig.cs @@ -0,0 +1,137 @@ +using System; +using System.Linq; +using UnityEngine; + +namespace NBF +{ + [TableName("gameBaits")] + public partial class BaitConfig : ConfigGearBase + { + public enum Type + { + Natural = 0, + Spinning = 1 + } + + + public Type type; + + public FishSpecies[] acceptFish; + + public Vector2 weightFishAccept = new Vector2(0f, 3f); + + + public float weight = 10f; + + public float lenght; + + public int amount = 1; + + + public int Level = 1; + + private Vector2 startedbaitValues; + + + public virtual bool CheckIsFishAccept(FishSpecies fishSpecies, float fishWeight = 0f) + { + var fish = FishConfig.Get(t => t.speciesName == fishSpecies); + if (fish == null) return false; + if (fish.type == FishConfig.Type.Predator && type == Type.Spinning) + { + Vector2 vector = weightFishAccept; + Debug.Log("Startowa wartosc przynety:" + vector.ToString()); + vector = startedbaitValues; + Debug.Log("Kolejna wartosc przynety 1:" + vector.ToString()); + Vector2 vector2 = new Vector2(0f, 0f); + if (startedbaitValues == vector2) + { + if (weightFishAccept.x > 0.01f && weightFishAccept.x <= 2.5f) + { + weightFishAccept.x = 0.01f; + } + else if (weightFishAccept.x > 2.5f && weightFishAccept.x <= 9.2f) + { + weightFishAccept.x = 2.5f; + } + else if (weightFishAccept.x > 9.2f && weightFishAccept.x <= 20f) + { + weightFishAccept.x = 8f; + } + else if (weightFishAccept.x > 20f && weightFishAccept.x <= 50f) + { + weightFishAccept.x = 14f; + } + else if (weightFishAccept.x > 50f && weightFishAccept.x <= 700f) + { + weightFishAccept.x = 22f; + } + else if (weightFishAccept.x > 700f) + { + weightFishAccept.x = 150f; + } + + if (weightFishAccept.y > 0.1f && weightFishAccept.y <= 3f) + { + weightFishAccept.y = 3f; + } + else if (weightFishAccept.y > 3f && weightFishAccept.y <= 9f) + { + weightFishAccept.y = 12f; + } + else if (weightFishAccept.y > 9f && weightFishAccept.y <= 24f) + { + weightFishAccept.y = 60f; + } + else if (weightFishAccept.y > 24f && weightFishAccept.y <= 50f) + { + weightFishAccept.y = 120f; + } + else if (weightFishAccept.y > 50f && weightFishAccept.y <= 105f) + { + weightFishAccept.y = 350f; + } + else if (weightFishAccept.y > 105f && weightFishAccept.y <= 170f) + { + weightFishAccept.y = 650f; + } + else if (weightFishAccept.y > 170f && weightFishAccept.y <= 500f) + { + weightFishAccept.y = 900f; + } + else if (weightFishAccept.y > 500f) + { + weightFishAccept.y = 1800f; + } + + startedbaitValues = weightFishAccept; + vector = startedbaitValues; + Debug.Log("Kolejna wartosc przynety: 2" + vector.ToString()); + } + + if (fishWeight >= weightFishAccept.x && fishWeight <= weightFishAccept.y) + { + vector = weightFishAccept; + Debug.Log("Fish accept lure: " + vector.ToString() + " weight:" + fishWeight); + return true; + } + } + else if (fish.type == FishConfig.Type.WhiteFish && type == Type.Natural) + { + if (acceptFish.Contains(fishSpecies)) + { + Debug.Log("Fish accept bait weight:" + fishWeight); + return true; + } + } + else if (fish.type == FishConfig.Type.Predator && type == Type.Natural && + acceptFish.Contains(fishSpecies)) + { + Debug.Log("Fish accept bait predator weight:" + fishWeight); + return true; + } + + return false; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/BaitConfig.cs.meta b/Assets/Scripts/Configs~/Mem/BaitConfig.cs.meta new file mode 100644 index 000000000..320c10ff7 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/BaitConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 29ac65179e8d469d96caa04ce15021d6 +timeCreated: 1742999023 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/BobberConfig.cs b/Assets/Scripts/Configs~/Mem/BobberConfig.cs new file mode 100644 index 000000000..0457d38b6 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/BobberConfig.cs @@ -0,0 +1,32 @@ +using System; +using UnityEngine; + +namespace NBF +{ + [TableName("gameFloats")] + public partial class BobberConfig : ConfigGearBase + { + public enum Type + { + Slider = 0, + Waggler = 1, + PoleFloats = 2, + Sport = 3, + Ball = 4, + Sinker = 5 + } + + + public Type type; + + public float weight = 10f; + + public float displacement = 10f; + + public bool isNightLight; + + public int Level = 1; + + public int amount = 1; + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/BobberConfig.cs.meta b/Assets/Scripts/Configs~/Mem/BobberConfig.cs.meta new file mode 100644 index 000000000..af742927d --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/BobberConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6297ba097dac45eb8f14f55dc5ad7d7b +timeCreated: 1742999241 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/CameraCfg.cs b/Assets/Scripts/Configs~/Mem/CameraCfg.cs new file mode 100644 index 000000000..f09a3ae5b --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/CameraCfg.cs @@ -0,0 +1,68 @@ +using System; +using UnityEngine; + +namespace NBF +{ + public enum CameraUpdateMode + { + Smooth, + Immediate, + } + + public enum CameraMode + { + Third, + Free, + } + + [Serializable] + public class CameraCfg + { + public CameraMode Mode; + public CameraUpdateMode UpdateMode; + + public float SmoothTime; + + public float NearClipPlane = 1; + public float FarClipPlane = 500; + + public Vector3 Near; + public Vector3 Far; + public float BestRatio = 0.5f; + + public Vector3 Distance + { + get { return this.Far - this.Near; } + } + + public Vector3 Best + { + get + { + switch (Mode) + { + case CameraMode.Third: + return this.Near + (this.Far - this.Near) * this.BestRatio; + default: + return Quaternion.Euler(this.PitchBest, 0, 0) * + (Vector3.back * (this.Near + (this.Far - this.Near) * this.BestRatio).magnitude); + } + } + } + + public float Yaw; + public bool YawAtThird; + + public float PitchBest; + public float PitchMin; + public float PitchMax; + } + + [CreateAssetMenu(menuName = "ET/CreateCameraConfig", fileName = "CameraCfg", order = 1)] + public class CameraScriptObject : ScriptableObject + { + public float ScaleTime = 6; + public CameraCfg ThirdCfg; + public CameraCfg FreeCfg; + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/CameraCfg.cs.meta b/Assets/Scripts/Configs~/Mem/CameraCfg.cs.meta new file mode 100644 index 000000000..317f73ee2 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/CameraCfg.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 5f43c20e40ae42239e4381c12ad7cc00 +timeCreated: 1756823027 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/ConfigBase.cs b/Assets/Scripts/Configs~/Mem/ConfigBase.cs new file mode 100644 index 000000000..6c0934d5e --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/ConfigBase.cs @@ -0,0 +1,53 @@ +using System; +using Newtonsoft.Json.Linq; +using UnityEngine; +using Object = UnityEngine.Object; + +namespace NBF +{ + public interface IConfigJsonParse + { + void Parse(JToken row); + } + + public interface ICustomParse + { + void Parse(JToken row); + } + + [Serializable] + public abstract class ConfigBase + { + public string name; + + public int id; + } + + public abstract class ConfigGearBase : ConfigBase + { + public string modelPath = "Models/Rods/"; + + protected virtual string ModelRoot => "gfx/"; + + /// + /// 所属的组 + /// + public int group; + + public GameObject GetModelPrefab() + { + return Resources.Load(ModelRoot + modelPath) as GameObject; + } + + public GameObject Instantiate(Transform parent) + { + return Object.Instantiate(GetModelPrefab(), Vector3.zero, Quaternion.identity, parent); + } + + public GameObject Instantiate(Transform parent, Vector3 position, + Quaternion rotation) + { + return Object.Instantiate(GetModelPrefab(), position, rotation, parent); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/ConfigBase.cs.meta b/Assets/Scripts/Configs~/Mem/ConfigBase.cs.meta new file mode 100644 index 000000000..c41648f0c --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/ConfigBase.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: bfb754c68ea2417685d3e29804c996fa +timeCreated: 1742998658 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/FeederConfig.cs b/Assets/Scripts/Configs~/Mem/FeederConfig.cs new file mode 100644 index 000000000..ca386fad3 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/FeederConfig.cs @@ -0,0 +1,25 @@ +using System; +using UnityEngine; + +namespace NBF +{ + [TableName("gameFeeders")] + public partial class FeederConfig : ConfigGearBase + { + public enum Type + { + Feeder = 0 + } + + public Type type; + + public float weight = 10f; + + public float capacity = 10f; + + public int Level = 1; + + public int amount = 1; + + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/FeederConfig.cs.meta b/Assets/Scripts/Configs~/Mem/FeederConfig.cs.meta new file mode 100644 index 000000000..fb7067d21 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/FeederConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4a3acf5935cc49be8a1e655250ea28e9 +timeCreated: 1742999291 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/FishAcceptConfig.cs b/Assets/Scripts/Configs~/Mem/FishAcceptConfig.cs new file mode 100644 index 000000000..9b26f1d60 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/FishAcceptConfig.cs @@ -0,0 +1,12 @@ +namespace NBF +{ + [TableName("gameFishAccepts")] + public partial class FishAcceptConfig : ConfigBase + { + public int bait; + + public float min; + + public float max; + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/FishAcceptConfig.cs.meta b/Assets/Scripts/Configs~/Mem/FishAcceptConfig.cs.meta new file mode 100644 index 000000000..f6ec8cb3e --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/FishAcceptConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 315e92a457a44e67a23cc79710bebdb6 +timeCreated: 1744862496 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/FishConfig.cs b/Assets/Scripts/Configs~/Mem/FishConfig.cs new file mode 100644 index 000000000..56470fffc --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/FishConfig.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using Unity.VisualScripting; +using UnityEngine; + +namespace NBF +{ + [Serializable] + public class AcceptFishBait + { + public string baitName; + + public int baitId; + + public float min; + + public float max; + } + + [TableName("gameFish")] + public partial class FishConfig : ConfigBase + { + public static FishConfig Get(FishSpecies fishSpecies) + { + return Get(t => t.speciesName == fishSpecies); + } + + public enum Type + { + WhiteFish = 0, + Predator = 1 + } + + public FishSpecies speciesName; + + public bool isEnabled = true; + + public Type type = Type.Predator; + + public float maxWeight = 10f; + + public float speciesCoins = 4f; + + public int rankingPoint = 1; + + public string[] modelPath; + + public string[] imagePath; + + public string[] modelTrophyPath; + + public Vector2[] weightLenghtValues; + + public AnimationCurve weightLengthCurve; + + public List acceptFishBaits; + + public List acceptFishLures; + + public Sprite GetIconImage(int index) + { + return Resources.Load("Icons/Fish/" + imagePath[index]); + } + + public float ConvertWeightFishToLength(float weight) + { + // return FishWeightToLength.Instance.ConvertWeightFishToLength(speciesName, weight); + return 1; + } + + public void SetupCurvesWeight() + { + weightLengthCurve.keys = null; + for (int i = 0; i < weightLenghtValues.Length; i++) + { + weightLengthCurve.AddKey(weightLenghtValues[i].x, weightLenghtValues[i].y); + } + } + + public Vector3 GetFishScale(float weight) + { + // if (!FishWeightToLength.Instance) + // { + // return Vector3.one; + // } + // + // var p = FishWeightToLength.Instance.ConvertWeightFishToLength(speciesName, weight); + // float num = FishWeightToLength.Instance.ConvertWeightFishToLength(speciesName, weight) * 0.0185f; + // return Vector3.one * num; + return Vector3.one; + } + + public GameObject GetModelPrefab(string _modelPath) + { + return Resources.Load("GameItemsPrefabs/Fish/" + _modelPath) as GameObject; + } + + public GameObject GetTrophyModelPrefab(float weight) + { + if (weight > maxWeight) + { + weight = maxWeight; + } + + float num = maxWeight / (float)modelTrophyPath.Length; + int num2 = (int)(weight / num); + if (num2 >= modelTrophyPath.Length) + { + num2 = modelTrophyPath.Length - 1; + } + + return Resources.Load("GameItemsPrefabs/Fish Trophies/" + modelTrophyPath[num2]) as GameObject; + } + + public GameObject GetFishModel(float weight) + { + if (weight > maxWeight) + { + weight = maxWeight; + } + + float num = maxWeight / (float)modelPath.Length; + int num2 = (int)(weight / num); + if (num2 >= modelPath.Length) + { + num2 = modelPath.Length - 1; + } + + return GetModelPrefab(modelPath[num2]); + } + + + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/FishConfig.cs.meta b/Assets/Scripts/Configs~/Mem/FishConfig.cs.meta new file mode 100644 index 000000000..74a9d502f --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/FishConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 036e4898008747fda0a473707565667b +timeCreated: 1742999445 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/HookConfig.cs b/Assets/Scripts/Configs~/Mem/HookConfig.cs new file mode 100644 index 000000000..1c340ab28 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/HookConfig.cs @@ -0,0 +1,167 @@ +using System; +using UnityEngine; + +namespace NBF +{ + [TableName("gameHooks")] + public partial class HookConfig : ConfigGearBase + { + public enum Type + { + Aberdeen = 0, + Bait = 1, + Circle = 2, + Treble = 3, + Octopus = 4, + Carp = 5, + LiveBait = 6, + WideGap = 7 + } + + public enum Zadzior + { + None = 0, + Barbless = 1 + } + + public enum Size + { + _16 = 0, + _14 = 1, + _12 = 2, + _10 = 3, + _9 = 4, + _8 = 5, + _7 = 6, + _6 = 7, + _5 = 8, + _4 = 9, + _3 = 10, + _2 = 11, + _1 = 12, + _1x0 = 13, + _2x0 = 14, + _3x0 = 15, + _4x0 = 16, + _5x0 = 17, + _6x0 = 18, + _7x0 = 19, + _8x0 = 20, + _9x0 = 21, + _10x0 = 22, + _11x0 = 23, + _12x0 = 24, + _13x0 = 25, + _14x0 = 26 + } + + public string color = "Nickel"; + + public Type type; + + public Zadzior zadzior; + + public Size size; + + public int amount = 1; + + public int Level = 1; + + + public string GetSizetext() + { + return size.ToString().Replace("_", "#").Replace("x", "/"); + } + + public Vector2 GetFishAcceptWeightBySize() + { + Vector2 result = Vector2.zero; + switch (size) + { + case Size._16: + result = new Vector2(0f, 3.5f); + break; + case Size._14: + result = new Vector2(0.4f, 5.3f); + break; + case Size._12: + result = new Vector2(0.5f, 7.4f); + break; + case Size._10: + result = new Vector2(0.7f, 10.3f); + break; + case Size._9: + result = new Vector2(1f, 14.4f); + break; + case Size._8: + result = new Vector2(1.4f, 20.2f); + break; + case Size._7: + result = new Vector2(1.6f, 26.2f); + break; + case Size._6: + result = new Vector2(1.8f, 31.5f); + break; + case Size._5: + result = new Vector2(2.2f, 34.6f); + break; + case Size._4: + result = new Vector2(2.4f, 45f); + break; + case Size._3: + result = new Vector2(3.1f, 58.5f); + break; + case Size._2: + result = new Vector2(4.1f, 81.9f); + break; + case Size._1: + result = new Vector2(5.7f, 114.6f); + break; + case Size._1x0: + result = new Vector2(9.2f, 160.5f); + break; + case Size._2x0: + result = new Vector2(12.8f, 216.7f); + break; + case Size._3x0: + result = new Vector2(17.3f, 292.5f); + break; + case Size._4x0: + result = new Vector2(23.4f, 394.9f); + break; + case Size._5x0: + result = new Vector2(31.6f, 533.1f); + break; + case Size._6x0: + result = new Vector2(42.6f, 693f); + break; + case Size._7x0: + result = new Vector2(55.4f, 935f); + break; + case Size._8x0: + result = new Vector2(74.8f, 1122f); + break; + case Size._9x0: + result = new Vector2(89f, 1342f); + break; + case Size._10x0: + result = new Vector2(107f, 1616f); + break; + case Size._11x0: + result = new Vector2(129f, 1940f); + break; + case Size._12x0: + result = new Vector2(155f, 2328f); + break; + case Size._13x0: + result = new Vector2(186f, 2793f); + break; + case Size._14x0: + result = new Vector2(223f, 3352f); + break; + } + + return result; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/HookConfig.cs.meta b/Assets/Scripts/Configs~/Mem/HookConfig.cs.meta new file mode 100644 index 000000000..b67ac5c11 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/HookConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 163f314510a24a43b7f86e22854cde3b +timeCreated: 1742999185 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/LeadersConfig.cs b/Assets/Scripts/Configs~/Mem/LeadersConfig.cs new file mode 100644 index 000000000..6123c5244 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/LeadersConfig.cs @@ -0,0 +1,19 @@ +using System; +using UnityEngine; + +namespace NBF +{ + [TableName("gameLeaders")] + public partial class LeadersConfig : ConfigGearBase + { + public enum Type + { + Mono = 0, + Wire = 1, + Steel = 2, + Titanium = 3 + } + + public Type type; + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/LeadersConfig.cs.meta b/Assets/Scripts/Configs~/Mem/LeadersConfig.cs.meta new file mode 100644 index 000000000..196a20750 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/LeadersConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 4a5ae0258ce84be1b6b2c2cb6a9921f9 +timeCreated: 1742998962 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/LineConfig.cs b/Assets/Scripts/Configs~/Mem/LineConfig.cs new file mode 100644 index 000000000..747a5b153 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/LineConfig.cs @@ -0,0 +1,28 @@ +using System; +using UnityEngine; + +namespace NBF +{ + [TableName("gameLines")] + public partial class LineConfig : ConfigGearBase + { + protected override string ModelRoot => "GameItemsPrefabs/"; + + public enum Type + { + Mono = 0, + Braid = 1, + Fluro = 2 + } + + public Type type; + + public int length = 125; + + public float strength = 1f; + + public float size = 0.12f; + + public int Level = 1; + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/LineConfig.cs.meta b/Assets/Scripts/Configs~/Mem/LineConfig.cs.meta new file mode 100644 index 000000000..dbda52553 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/LineConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 8f09d37212e24ee2bb9f0b99ca69df42 +timeCreated: 1742998906 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/LureConfig.cs b/Assets/Scripts/Configs~/Mem/LureConfig.cs new file mode 100644 index 000000000..9a2b891da --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/LureConfig.cs @@ -0,0 +1,123 @@ +using UnityEngine; + +namespace NBF +{ + [TableName("gameLures")] + public partial class LureConfig : ConfigGearBase + { + public enum Type + { + Natural = 0, + Spinning = 1 + } + + + public Type type; + + public FishSpecies[] acceptFish; + + public Vector2 weightFishAccept = new Vector2(0f, 3f); + + public float weight = 10f; + + public float lenght; + + public int amount = 1; + + public int Level = 1; + + /// + /// 配的鱼钩 + /// + public int[] hook; + + private Vector2 startedbaitValues; + + private Vector2 _startedbaitValues; + + public bool CheckIsFishAccept(FishSpecies fishSpecies, float fishWeight = 0) + { + if (FishConfig.Get(fishSpecies).type == FishConfig.Type.Predator) + { + Vector2 vector = weightFishAccept; + Debug.Log("诱饵的初始值:" + vector.ToString()); + vector = _startedbaitValues; + Debug.Log("下一个诱饵值 1:" + vector.ToString()); + Vector2 vector2 = new Vector2(0f, 0f); + if (_startedbaitValues == vector2) + { + if (weightFishAccept.x > 0.01f && weightFishAccept.x <= 2.5f) + { + weightFishAccept.x = 0.01f; + } + else if (weightFishAccept.x > 2.5f && weightFishAccept.x <= 9.2f) + { + weightFishAccept.x = 2.5f; + } + else if (weightFishAccept.x > 9.2f && weightFishAccept.x <= 20f) + { + weightFishAccept.x = 8f; + } + else if (weightFishAccept.x > 20f && weightFishAccept.x <= 50f) + { + weightFishAccept.x = 14f; + } + else if (weightFishAccept.x > 50f && weightFishAccept.x <= 700f) + { + weightFishAccept.x = 22f; + } + else if (weightFishAccept.x > 700f) + { + weightFishAccept.x = 150f; + } + + if (weightFishAccept.y > 0.1f && weightFishAccept.y <= 3f) + { + weightFishAccept.y = 3f; + } + else if (weightFishAccept.y > 3f && weightFishAccept.y <= 9f) + { + weightFishAccept.y = 12f; + } + else if (weightFishAccept.y > 9f && weightFishAccept.y <= 24f) + { + weightFishAccept.y = 60f; + } + else if (weightFishAccept.y > 24f && weightFishAccept.y <= 50f) + { + weightFishAccept.y = 120f; + } + else if (weightFishAccept.y > 50f && weightFishAccept.y <= 105f) + { + weightFishAccept.y = 350f; + } + else if (weightFishAccept.y > 105f && weightFishAccept.y <= 170f) + { + weightFishAccept.y = 650f; + } + else if (weightFishAccept.y > 170f && weightFishAccept.y <= 500f) + { + weightFishAccept.y = 900f; + } + else if (weightFishAccept.y > 500f) + { + weightFishAccept.y = 1800f; + } + + _startedbaitValues = weightFishAccept; + vector = _startedbaitValues; + Debug.Log("另一个有价值的诱饵: 2" + vector.ToString()); + } + + if (fishWeight >= weightFishAccept.x && fishWeight <= weightFishAccept.y) + { + vector = weightFishAccept; + Debug.Log("Fish accept lure: " + vector.ToString() + " weight:" + fishWeight); + return true; + } + } + + return false; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/LureConfig.cs.meta b/Assets/Scripts/Configs~/Mem/LureConfig.cs.meta new file mode 100644 index 000000000..2ce12e541 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/LureConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 184995816e1944d2afc02384ef109693 +timeCreated: 1744898827 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/ReelConfig.cs b/Assets/Scripts/Configs~/Mem/ReelConfig.cs new file mode 100644 index 000000000..dab4e3b4e --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/ReelConfig.cs @@ -0,0 +1,30 @@ +using System; +using UnityEngine; + +namespace NBF +{ + [TableName("gameReels")] + public partial class ReelConfig : ConfigGearBase + { + // protected override string ModelRoot => "GameItemsPrefabs/"; + + public enum Type + { + Universal = 0, + Spinning = 1, + Casting = 2, + Feeder = 3 + } + + + public Type type; + + public float strength = 1f; + + public Vector2 gearRatio; + + public int size = 2000; + + public int Level = 1; + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/ReelConfig.cs.meta b/Assets/Scripts/Configs~/Mem/ReelConfig.cs.meta new file mode 100644 index 000000000..4f2cc54bc --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/ReelConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 13045659d27f4ee89aab30efb1740215 +timeCreated: 1742998847 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/RingConfig.cs b/Assets/Scripts/Configs~/Mem/RingConfig.cs new file mode 100644 index 000000000..f29cdfdb0 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/RingConfig.cs @@ -0,0 +1,7 @@ +namespace NBF +{ + [TableName("gameRings")] + public partial class RingConfig : ConfigGearBase + { + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/RingConfig.cs.meta b/Assets/Scripts/Configs~/Mem/RingConfig.cs.meta new file mode 100644 index 000000000..6d96a2839 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/RingConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 15f2ba6ac6404e9390d9cc2604f2016c +timeCreated: 1744861381 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/RodConfig.cs b/Assets/Scripts/Configs~/Mem/RodConfig.cs new file mode 100644 index 000000000..15e8976cb --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/RodConfig.cs @@ -0,0 +1,41 @@ +using System; +using UnityEngine; + +namespace NBF +{ + [TableName("gameRods")] + public partial class RodConfig : ConfigGearBase + { + + public enum Type + { + Universal = 0, + Tele = 1, + SpinningFloat = 2, + Spinning = 3, + } + + public enum Action + { + Slow = 0, + Medium = 1, + Fast = 2 + } + + + public Type type; + + public string length; + + public string weight; + + public float strength = 2f; + + public int maxRange = 15; + + /// + /// 使用的圈id + /// + public int ring; + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/RodConfig.cs.meta b/Assets/Scripts/Configs~/Mem/RodConfig.cs.meta new file mode 100644 index 000000000..7a1790a48 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/RodConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 01b7a315690b4a2d8f82aec56a3a3971 +timeCreated: 1742998702 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/UnitConfig.cs b/Assets/Scripts/Configs~/Mem/UnitConfig.cs new file mode 100644 index 000000000..7a39846f7 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/UnitConfig.cs @@ -0,0 +1,31 @@ +namespace NBF +{ + [TableName("gameUnit")] + public partial class UnitConfig : ConfigBase + { + public UnitType Type; + } + + public enum UnitType : byte + { + /// + /// 玩家 + /// + Player = 1, + + /// + /// 鱼 + /// + Fish = 2, + + /// + /// 船 + /// + Boat = 3, + + /// + /// 车 + /// + Car = 4, + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/UnitConfig.cs.meta b/Assets/Scripts/Configs~/Mem/UnitConfig.cs.meta new file mode 100644 index 000000000..daa9722a3 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/UnitConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 956ed7b067744c369fcff9a8baef77ee +timeCreated: 1756049614 \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/WeightConfig.cs b/Assets/Scripts/Configs~/Mem/WeightConfig.cs new file mode 100644 index 000000000..8d769f975 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/WeightConfig.cs @@ -0,0 +1,26 @@ +using System; +using UnityEngine; + +namespace NBF +{ + [TableName("gameWeights")] + public partial class WeightConfig : ConfigGearBase + { + protected override string ModelRoot => "GameItemsPrefabs/"; + + public enum Type + { + Ball = 0, + Teardrop = 1, + Olive = 2 + } + + public Type type; + + public float weight = 0.1f; + + public int Level = 1; + + public int amount = 1; + } +} \ No newline at end of file diff --git a/Assets/Scripts/Configs~/Mem/WeightConfig.cs.meta b/Assets/Scripts/Configs~/Mem/WeightConfig.cs.meta new file mode 100644 index 000000000..113ec42c7 --- /dev/null +++ b/Assets/Scripts/Configs~/Mem/WeightConfig.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 6bfe88a3b2474031aa65c995baebf6f6 +timeCreated: 1742999355 \ No newline at end of file diff --git a/Assets/Scripts/Fishing2/Helper/ProtoHelper.cs b/Assets/Scripts/Fishing2/Helper/ProtoHelper.cs index 0922b3380..a00cd5621 100644 --- a/Assets/Scripts/Fishing2/Helper/ProtoHelper.cs +++ b/Assets/Scripts/Fishing2/Helper/ProtoHelper.cs @@ -24,7 +24,7 @@ namespace NBF.Fishing2 ret.Country = self.BaseInfo.Country; ret.Head = self.BaseInfo.Head; ret.Level = self.BaseInfo.Level; - ret.Vip = self.BaseInfo.Vip; + // ret.Vip = self.BaseInfo.Vip; return ret; } diff --git a/Assets/Scripts/Fishing2/Role/Role.cs b/Assets/Scripts/Fishing2/Role/Role.cs index 6227a4827..8d1ccce56 100644 --- a/Assets/Scripts/Fishing2/Role/Role.cs +++ b/Assets/Scripts/Fishing2/Role/Role.cs @@ -37,7 +37,7 @@ namespace NBF.Fishing2 Head = Info.BaseInfo.Head, Country = Info.BaseInfo.Country, Level = Info.BaseInfo.Level, - Vip = Info.BaseInfo.Vip + // Vip = Info.BaseInfo.Vip }; return mapUnit; diff --git a/Assets/Scripts/Generate/Config/BaitConfig.cs b/Assets/Scripts/Generate/Config/BaitConfig.cs index 612b61cc7..443bc78f3 100644 --- a/Assets/Scripts/Generate/Config/BaitConfig.cs +++ b/Assets/Scripts/Generate/Config/BaitConfig.cs @@ -5,93 +5,15 @@ using System.Linq; using System.Reflection; using System.Collections.Generic; using System.Collections.Concurrent; -#if FANTASY_NET -using Fantasy.ConfigTable; -using Fantasy.Serialize; -#else using NBC; using NBC.Serialize; -#endif -// ReSharper disable CollectionNeverUpdated.Global -// ReSharper disable UnusedAutoPropertyAccessor.Global -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#pragma warning disable CS0169 -#pragma warning disable CS8618 -#pragma warning disable CS8625 -#pragma warning disable CS8603 namespace NBF { [ProtoContract] - public sealed partial class BaitConfigData : ASerialize, IConfigTable, IProto + public sealed partial class BaitConfig : ASerialize, IProto, IConfigTable { - [ProtoMember(1)] - public List List { get; set; } = new List(); -#if FANTASY_NET - [ProtoIgnore] - private readonly ConcurrentDictionary _configs = new ConcurrentDictionary(); -#else - [ProtoIgnore] - private readonly Dictionary _configs = new Dictionary(); -#endif - private static BaitConfigData _instance = null; - - public static BaitConfigData Instance - { - get { return _instance ??= ConfigTableHelper.Load(); } - private set => _instance = value; - } - - public BaitConfig Get(uint id, bool check = true) - { - if (_configs.ContainsKey(id)) - { - return _configs[id]; - } - if (check) - { - throw new Exception($"BaitConfig not find {id} Id"); - } - - return null; - } - public bool TryGet(uint id, out BaitConfig config) - { - config = null; - - if (!_configs.ContainsKey(id)) - { - return false; - } - - config = _configs[id]; - return true; - } - public override void AfterDeserialization() - { - foreach (var config in List) - { -#if FANTASY_NET - _configs.TryAdd(config.Id, config); -#else - _configs.Add(config.Id, config); -#endif - config.AfterDeserialization(); - } - - EndInit(); - } - - public override void Dispose() - { - Instance = null; - } - } - - [ProtoContract] - public sealed partial class BaitConfig : ASerialize, IProto - { [ProtoMember(1)] public uint Id { get; set; } // Id [ProtoMember(2)] @@ -106,5 +28,66 @@ namespace NBF public uint[] Arr { get; set; } = Array.Empty(); // 重量(克) [ProtoMember(7)] public string[] ArrStr { get; set; } = Array.Empty(); // 重量(克) - } -} \ No newline at end of file + [ProtoIgnore] + public uint Key => Id; + + #region Static + + private static ConfigContext Context => ConfigTableHelper.Table(); + + public static BaitConfig Get(uint key) + { + return Context.Get(key); + } + + public static BaitConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static BaitConfig Fist() + { + return Context.Fist(); + } + + public static BaitConfig Last() + { + return Context.Last(); + } + + public static BaitConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static BaitConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + public static void ParseJson(Newtonsoft.Json.Linq.JArray arr) + { + ConfigTableHelper.ParseLine(arr); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/BasicConfig.cs b/Assets/Scripts/Generate/Config/BasicConfig.cs new file mode 100644 index 000000000..6da196d61 --- /dev/null +++ b/Assets/Scripts/Generate/Config/BasicConfig.cs @@ -0,0 +1,85 @@ +using System; +using ProtoBuf; +using Fantasy; +using System.Linq; +using System.Reflection; +using System.Collections.Generic; +using System.Collections.Concurrent; +using NBC; +using NBC.Serialize; + +namespace NBF +{ + [ProtoContract] + public sealed partial class BasicConfig : ASerialize, IProto, IConfigTable + { + + [ProtoMember(1)] + public uint Id { get; set; } // Id + [ProtoMember(2)] + public string Name { get; set; } // 参数名 + [ProtoMember(3)] + public string[] Val { get; set; } = Array.Empty(); // 参数值 + [ProtoIgnore] + public uint Key => Id; + + #region Static + + private static ConfigContext Context => ConfigTableHelper.Table(); + + public static BasicConfig Get(uint key) + { + return Context.Get(key); + } + + public static BasicConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static BasicConfig Fist() + { + return Context.Fist(); + } + + public static BasicConfig Last() + { + return Context.Last(); + } + + public static BasicConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static BasicConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + public static void ParseJson(Newtonsoft.Json.Linq.JArray arr) + { + ConfigTableHelper.ParseLine(arr); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/BasicConfig.cs.meta b/Assets/Scripts/Generate/Config/BasicConfig.cs.meta new file mode 100644 index 000000000..7ef2cb87b --- /dev/null +++ b/Assets/Scripts/Generate/Config/BasicConfig.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5c900c2cd8da41740a01b749b9c8d844 \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/BobberConfig.cs b/Assets/Scripts/Generate/Config/BobberConfig.cs index b26f33a49..22e26e993 100644 --- a/Assets/Scripts/Generate/Config/BobberConfig.cs +++ b/Assets/Scripts/Generate/Config/BobberConfig.cs @@ -5,93 +5,15 @@ using System.Linq; using System.Reflection; using System.Collections.Generic; using System.Collections.Concurrent; -#if FANTASY_NET -using Fantasy.ConfigTable; -using Fantasy.Serialize; -#else using NBC; using NBC.Serialize; -#endif -// ReSharper disable CollectionNeverUpdated.Global -// ReSharper disable UnusedAutoPropertyAccessor.Global -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#pragma warning disable CS0169 -#pragma warning disable CS8618 -#pragma warning disable CS8625 -#pragma warning disable CS8603 namespace NBF { [ProtoContract] - public sealed partial class BobberConfigData : ASerialize, IConfigTable, IProto + public sealed partial class BobberConfig : ASerialize, IProto, IConfigTable { - [ProtoMember(1)] - public List List { get; set; } = new List(); -#if FANTASY_NET - [ProtoIgnore] - private readonly ConcurrentDictionary _configs = new ConcurrentDictionary(); -#else - [ProtoIgnore] - private readonly Dictionary _configs = new Dictionary(); -#endif - private static BobberConfigData _instance = null; - - public static BobberConfigData Instance - { - get { return _instance ??= ConfigTableHelper.Load(); } - private set => _instance = value; - } - - public BobberConfig Get(uint id, bool check = true) - { - if (_configs.ContainsKey(id)) - { - return _configs[id]; - } - if (check) - { - throw new Exception($"BobberConfig not find {id} Id"); - } - - return null; - } - public bool TryGet(uint id, out BobberConfig config) - { - config = null; - - if (!_configs.ContainsKey(id)) - { - return false; - } - - config = _configs[id]; - return true; - } - public override void AfterDeserialization() - { - foreach (var config in List) - { -#if FANTASY_NET - _configs.TryAdd(config.Id, config); -#else - _configs.Add(config.Id, config); -#endif - config.AfterDeserialization(); - } - - EndInit(); - } - - public override void Dispose() - { - Instance = null; - } - } - - [ProtoContract] - public sealed partial class BobberConfig : ASerialize, IProto - { [ProtoMember(1)] public uint Id { get; set; } // Id [ProtoMember(2)] @@ -104,5 +26,66 @@ namespace NBF public uint Displacement { get; set; } // 位移 [ProtoMember(6)] public uint NightLight { get; set; } // 是否夜光 - } -} \ No newline at end of file + [ProtoIgnore] + public uint Key => Id; + + #region Static + + private static ConfigContext Context => ConfigTableHelper.Table(); + + public static BobberConfig Get(uint key) + { + return Context.Get(key); + } + + public static BobberConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static BobberConfig Fist() + { + return Context.Fist(); + } + + public static BobberConfig Last() + { + return Context.Last(); + } + + public static BobberConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static BobberConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + public static void ParseJson(Newtonsoft.Json.Linq.JArray arr) + { + ConfigTableHelper.ParseLine(arr); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/FeederConfig.cs b/Assets/Scripts/Generate/Config/FeederConfig.cs index dfc491e21..3f9def404 100644 --- a/Assets/Scripts/Generate/Config/FeederConfig.cs +++ b/Assets/Scripts/Generate/Config/FeederConfig.cs @@ -5,93 +5,15 @@ using System.Linq; using System.Reflection; using System.Collections.Generic; using System.Collections.Concurrent; -#if FANTASY_NET -using Fantasy.ConfigTable; -using Fantasy.Serialize; -#else using NBC; using NBC.Serialize; -#endif -// ReSharper disable CollectionNeverUpdated.Global -// ReSharper disable UnusedAutoPropertyAccessor.Global -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#pragma warning disable CS0169 -#pragma warning disable CS8618 -#pragma warning disable CS8625 -#pragma warning disable CS8603 namespace NBF { [ProtoContract] - public sealed partial class FeederConfigData : ASerialize, IConfigTable, IProto + public sealed partial class FeederConfig : ASerialize, IProto, IConfigTable { - [ProtoMember(1)] - public List List { get; set; } = new List(); -#if FANTASY_NET - [ProtoIgnore] - private readonly ConcurrentDictionary _configs = new ConcurrentDictionary(); -#else - [ProtoIgnore] - private readonly Dictionary _configs = new Dictionary(); -#endif - private static FeederConfigData _instance = null; - - public static FeederConfigData Instance - { - get { return _instance ??= ConfigTableHelper.Load(); } - private set => _instance = value; - } - - public FeederConfig Get(uint id, bool check = true) - { - if (_configs.ContainsKey(id)) - { - return _configs[id]; - } - if (check) - { - throw new Exception($"FeederConfig not find {id} Id"); - } - - return null; - } - public bool TryGet(uint id, out FeederConfig config) - { - config = null; - - if (!_configs.ContainsKey(id)) - { - return false; - } - - config = _configs[id]; - return true; - } - public override void AfterDeserialization() - { - foreach (var config in List) - { -#if FANTASY_NET - _configs.TryAdd(config.Id, config); -#else - _configs.Add(config.Id, config); -#endif - config.AfterDeserialization(); - } - - EndInit(); - } - - public override void Dispose() - { - Instance = null; - } - } - - [ProtoContract] - public sealed partial class FeederConfig : ASerialize, IProto - { [ProtoMember(1)] public uint Id { get; set; } // Id [ProtoMember(2)] @@ -102,5 +24,66 @@ namespace NBF public uint Capacity { get; set; } // 能力 [ProtoMember(5)] public uint Weight { get; set; } // 重量(克) - } -} \ No newline at end of file + [ProtoIgnore] + public uint Key => Id; + + #region Static + + private static ConfigContext Context => ConfigTableHelper.Table(); + + public static FeederConfig Get(uint key) + { + return Context.Get(key); + } + + public static FeederConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static FeederConfig Fist() + { + return Context.Fist(); + } + + public static FeederConfig Last() + { + return Context.Last(); + } + + public static FeederConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static FeederConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + public static void ParseJson(Newtonsoft.Json.Linq.JArray arr) + { + ConfigTableHelper.ParseLine(arr); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/FishConfig.cs b/Assets/Scripts/Generate/Config/FishConfig.cs index a221dfd04..160825b91 100644 --- a/Assets/Scripts/Generate/Config/FishConfig.cs +++ b/Assets/Scripts/Generate/Config/FishConfig.cs @@ -5,93 +5,15 @@ using System.Linq; using System.Reflection; using System.Collections.Generic; using System.Collections.Concurrent; -#if FANTASY_NET -using Fantasy.ConfigTable; -using Fantasy.Serialize; -#else using NBC; using NBC.Serialize; -#endif -// ReSharper disable CollectionNeverUpdated.Global -// ReSharper disable UnusedAutoPropertyAccessor.Global -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#pragma warning disable CS0169 -#pragma warning disable CS8618 -#pragma warning disable CS8625 -#pragma warning disable CS8603 namespace NBF { [ProtoContract] - public sealed partial class FishConfigData : ASerialize, IConfigTable, IProto + public sealed partial class FishConfig : ASerialize, IProto, IConfigTable { - [ProtoMember(1)] - public List List { get; set; } = new List(); -#if FANTASY_NET - [ProtoIgnore] - private readonly ConcurrentDictionary _configs = new ConcurrentDictionary(); -#else - [ProtoIgnore] - private readonly Dictionary _configs = new Dictionary(); -#endif - private static FishConfigData _instance = null; - - public static FishConfigData Instance - { - get { return _instance ??= ConfigTableHelper.Load(); } - private set => _instance = value; - } - - public FishConfig Get(uint id, bool check = true) - { - if (_configs.ContainsKey(id)) - { - return _configs[id]; - } - if (check) - { - throw new Exception($"FishConfig not find {id} Id"); - } - - return null; - } - public bool TryGet(uint id, out FishConfig config) - { - config = null; - - if (!_configs.ContainsKey(id)) - { - return false; - } - - config = _configs[id]; - return true; - } - public override void AfterDeserialization() - { - foreach (var config in List) - { -#if FANTASY_NET - _configs.TryAdd(config.Id, config); -#else - _configs.Add(config.Id, config); -#endif - config.AfterDeserialization(); - } - - EndInit(); - } - - public override void Dispose() - { - Instance = null; - } - } - - [ProtoContract] - public sealed partial class FishConfig : ASerialize, IProto - { [ProtoMember(1)] public uint Id { get; set; } // Id [ProtoMember(2)] @@ -106,5 +28,66 @@ namespace NBF public uint MaxWeight { get; set; } // 最大重量(克) [ProtoMember(7)] public uint Accept { get; set; } // 接受饵 - } -} \ No newline at end of file + [ProtoIgnore] + public uint Key => Id; + + #region Static + + private static ConfigContext Context => ConfigTableHelper.Table(); + + public static FishConfig Get(uint key) + { + return Context.Get(key); + } + + public static FishConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static FishConfig Fist() + { + return Context.Fist(); + } + + public static FishConfig Last() + { + return Context.Last(); + } + + public static FishConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static FishConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + public static void ParseJson(Newtonsoft.Json.Linq.JArray arr) + { + ConfigTableHelper.ParseLine(arr); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/HookConfig.cs b/Assets/Scripts/Generate/Config/HookConfig.cs index e523a7021..4b58d6da9 100644 --- a/Assets/Scripts/Generate/Config/HookConfig.cs +++ b/Assets/Scripts/Generate/Config/HookConfig.cs @@ -5,93 +5,15 @@ using System.Linq; using System.Reflection; using System.Collections.Generic; using System.Collections.Concurrent; -#if FANTASY_NET -using Fantasy.ConfigTable; -using Fantasy.Serialize; -#else using NBC; using NBC.Serialize; -#endif -// ReSharper disable CollectionNeverUpdated.Global -// ReSharper disable UnusedAutoPropertyAccessor.Global -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#pragma warning disable CS0169 -#pragma warning disable CS8618 -#pragma warning disable CS8625 -#pragma warning disable CS8603 namespace NBF { [ProtoContract] - public sealed partial class HookConfigData : ASerialize, IConfigTable, IProto + public sealed partial class HookConfig : ASerialize, IProto, IConfigTable { - [ProtoMember(1)] - public List List { get; set; } = new List(); -#if FANTASY_NET - [ProtoIgnore] - private readonly ConcurrentDictionary _configs = new ConcurrentDictionary(); -#else - [ProtoIgnore] - private readonly Dictionary _configs = new Dictionary(); -#endif - private static HookConfigData _instance = null; - - public static HookConfigData Instance - { - get { return _instance ??= ConfigTableHelper.Load(); } - private set => _instance = value; - } - - public HookConfig Get(uint id, bool check = true) - { - if (_configs.ContainsKey(id)) - { - return _configs[id]; - } - if (check) - { - throw new Exception($"HookConfig not find {id} Id"); - } - - return null; - } - public bool TryGet(uint id, out HookConfig config) - { - config = null; - - if (!_configs.ContainsKey(id)) - { - return false; - } - - config = _configs[id]; - return true; - } - public override void AfterDeserialization() - { - foreach (var config in List) - { -#if FANTASY_NET - _configs.TryAdd(config.Id, config); -#else - _configs.Add(config.Id, config); -#endif - config.AfterDeserialization(); - } - - EndInit(); - } - - public override void Dispose() - { - Instance = null; - } - } - - [ProtoContract] - public sealed partial class HookConfig : ASerialize, IProto - { [ProtoMember(1)] public uint Id { get; set; } // Id [ProtoMember(2)] @@ -104,5 +26,66 @@ namespace NBF public uint Length { get; set; } // 长度(毫米) [ProtoMember(6)] public uint Weight { get; set; } // 重量(克) - } -} \ No newline at end of file + [ProtoIgnore] + public uint Key => Id; + + #region Static + + private static ConfigContext Context => ConfigTableHelper.Table(); + + public static HookConfig Get(uint key) + { + return Context.Get(key); + } + + public static HookConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static HookConfig Fist() + { + return Context.Fist(); + } + + public static HookConfig Last() + { + return Context.Last(); + } + + public static HookConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static HookConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + public static void ParseJson(Newtonsoft.Json.Linq.JArray arr) + { + ConfigTableHelper.ParseLine(arr); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/InitConfig.cs b/Assets/Scripts/Generate/Config/InitConfig.cs new file mode 100644 index 000000000..b409c69aa --- /dev/null +++ b/Assets/Scripts/Generate/Config/InitConfig.cs @@ -0,0 +1,85 @@ +using System; +using ProtoBuf; +using Fantasy; +using System.Linq; +using System.Reflection; +using System.Collections.Generic; +using System.Collections.Concurrent; +using NBC; +using NBC.Serialize; + +namespace NBF +{ + [ProtoContract] + public sealed partial class InitConfig : ASerialize, IProto, IConfigTable + { + + [ProtoMember(1)] + public uint Id { get; set; } // Id + [ProtoMember(2)] + public uint ItemId { get; set; } // 物品Id + [ProtoMember(3)] + public int Amount { get; set; } // 数量 + [ProtoIgnore] + public uint Key => Id; + + #region Static + + private static ConfigContext Context => ConfigTableHelper.Table(); + + public static InitConfig Get(uint key) + { + return Context.Get(key); + } + + public static InitConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static InitConfig Fist() + { + return Context.Fist(); + } + + public static InitConfig Last() + { + return Context.Last(); + } + + public static InitConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static InitConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + public static void ParseJson(Newtonsoft.Json.Linq.JArray arr) + { + ConfigTableHelper.ParseLine(arr); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/InitConfig.cs.meta b/Assets/Scripts/Generate/Config/InitConfig.cs.meta new file mode 100644 index 000000000..702b7732e --- /dev/null +++ b/Assets/Scripts/Generate/Config/InitConfig.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 4b10beb37dfb5064593be4f13c7a4d29 \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/ItemConfig.cs b/Assets/Scripts/Generate/Config/ItemConfig.cs new file mode 100644 index 000000000..df76a76ae --- /dev/null +++ b/Assets/Scripts/Generate/Config/ItemConfig.cs @@ -0,0 +1,89 @@ +using System; +using ProtoBuf; +using Fantasy; +using System.Linq; +using System.Reflection; +using System.Collections.Generic; +using System.Collections.Concurrent; +using NBC; +using NBC.Serialize; + +namespace NBF +{ + [ProtoContract] + public sealed partial class ItemConfig : ASerialize, IProto, IConfigTable + { + + [ProtoMember(1)] + public uint Id { get; set; } // Id + [ProtoMember(2)] + public string Model { get; set; } // 模型 + [ProtoMember(3)] + public uint Type { get; set; } // 类型 + [ProtoMember(4)] + public uint Max { get; set; } // 最大堆叠数量 + [ProtoMember(5)] + public uint AutoUse { get; set; } // 获得自动使用 + [ProtoIgnore] + public uint Key => Id; + + #region Static + + private static ConfigContext Context => ConfigTableHelper.Table(); + + public static ItemConfig Get(uint key) + { + return Context.Get(key); + } + + public static ItemConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static ItemConfig Fist() + { + return Context.Fist(); + } + + public static ItemConfig Last() + { + return Context.Last(); + } + + public static ItemConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static ItemConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + public static void ParseJson(Newtonsoft.Json.Linq.JArray arr) + { + ConfigTableHelper.ParseLine(arr); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/ItemConfig.cs.meta b/Assets/Scripts/Generate/Config/ItemConfig.cs.meta new file mode 100644 index 000000000..61c5ca698 --- /dev/null +++ b/Assets/Scripts/Generate/Config/ItemConfig.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: ab3487f65cb0c3b458c2ac0a75932642 \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/LineConfig.cs b/Assets/Scripts/Generate/Config/LineConfig.cs index 5a13c7ea7..e764bf58b 100644 --- a/Assets/Scripts/Generate/Config/LineConfig.cs +++ b/Assets/Scripts/Generate/Config/LineConfig.cs @@ -5,93 +5,15 @@ using System.Linq; using System.Reflection; using System.Collections.Generic; using System.Collections.Concurrent; -#if FANTASY_NET -using Fantasy.ConfigTable; -using Fantasy.Serialize; -#else using NBC; using NBC.Serialize; -#endif -// ReSharper disable CollectionNeverUpdated.Global -// ReSharper disable UnusedAutoPropertyAccessor.Global -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#pragma warning disable CS0169 -#pragma warning disable CS8618 -#pragma warning disable CS8625 -#pragma warning disable CS8603 namespace NBF { [ProtoContract] - public sealed partial class LineConfigData : ASerialize, IConfigTable, IProto + public sealed partial class LineConfig : ASerialize, IProto, IConfigTable { - [ProtoMember(1)] - public List List { get; set; } = new List(); -#if FANTASY_NET - [ProtoIgnore] - private readonly ConcurrentDictionary _configs = new ConcurrentDictionary(); -#else - [ProtoIgnore] - private readonly Dictionary _configs = new Dictionary(); -#endif - private static LineConfigData _instance = null; - - public static LineConfigData Instance - { - get { return _instance ??= ConfigTableHelper.Load(); } - private set => _instance = value; - } - - public LineConfig Get(uint id, bool check = true) - { - if (_configs.ContainsKey(id)) - { - return _configs[id]; - } - if (check) - { - throw new Exception($"LineConfig not find {id} Id"); - } - - return null; - } - public bool TryGet(uint id, out LineConfig config) - { - config = null; - - if (!_configs.ContainsKey(id)) - { - return false; - } - - config = _configs[id]; - return true; - } - public override void AfterDeserialization() - { - foreach (var config in List) - { -#if FANTASY_NET - _configs.TryAdd(config.Id, config); -#else - _configs.Add(config.Id, config); -#endif - config.AfterDeserialization(); - } - - EndInit(); - } - - public override void Dispose() - { - Instance = null; - } - } - - [ProtoContract] - public sealed partial class LineConfig : ASerialize, IProto - { [ProtoMember(1)] public uint Id { get; set; } // Id [ProtoMember(2)] @@ -104,5 +26,66 @@ namespace NBF public uint Strength { get; set; } // 强度 [ProtoMember(6)] public uint Size { get; set; } // 尺寸 - } -} \ No newline at end of file + [ProtoIgnore] + public uint Key => Id; + + #region Static + + private static ConfigContext Context => ConfigTableHelper.Table(); + + public static LineConfig Get(uint key) + { + return Context.Get(key); + } + + public static LineConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static LineConfig Fist() + { + return Context.Fist(); + } + + public static LineConfig Last() + { + return Context.Last(); + } + + public static LineConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static LineConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + public static void ParseJson(Newtonsoft.Json.Linq.JArray arr) + { + ConfigTableHelper.ParseLine(arr); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/LureConfig.cs b/Assets/Scripts/Generate/Config/LureConfig.cs index e9feda92f..db656c3a5 100644 --- a/Assets/Scripts/Generate/Config/LureConfig.cs +++ b/Assets/Scripts/Generate/Config/LureConfig.cs @@ -5,93 +5,15 @@ using System.Linq; using System.Reflection; using System.Collections.Generic; using System.Collections.Concurrent; -#if FANTASY_NET -using Fantasy.ConfigTable; -using Fantasy.Serialize; -#else using NBC; using NBC.Serialize; -#endif -// ReSharper disable CollectionNeverUpdated.Global -// ReSharper disable UnusedAutoPropertyAccessor.Global -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#pragma warning disable CS0169 -#pragma warning disable CS8618 -#pragma warning disable CS8625 -#pragma warning disable CS8603 namespace NBF { [ProtoContract] - public sealed partial class LureConfigData : ASerialize, IConfigTable, IProto + public sealed partial class LureConfig : ASerialize, IProto, IConfigTable { - [ProtoMember(1)] - public List List { get; set; } = new List(); -#if FANTASY_NET - [ProtoIgnore] - private readonly ConcurrentDictionary _configs = new ConcurrentDictionary(); -#else - [ProtoIgnore] - private readonly Dictionary _configs = new Dictionary(); -#endif - private static LureConfigData _instance = null; - - public static LureConfigData Instance - { - get { return _instance ??= ConfigTableHelper.Load(); } - private set => _instance = value; - } - - public LureConfig Get(uint id, bool check = true) - { - if (_configs.ContainsKey(id)) - { - return _configs[id]; - } - if (check) - { - throw new Exception($"LureConfig not find {id} Id"); - } - - return null; - } - public bool TryGet(uint id, out LureConfig config) - { - config = null; - - if (!_configs.ContainsKey(id)) - { - return false; - } - - config = _configs[id]; - return true; - } - public override void AfterDeserialization() - { - foreach (var config in List) - { -#if FANTASY_NET - _configs.TryAdd(config.Id, config); -#else - _configs.Add(config.Id, config); -#endif - config.AfterDeserialization(); - } - - EndInit(); - } - - public override void Dispose() - { - Instance = null; - } - } - - [ProtoContract] - public sealed partial class LureConfig : ASerialize, IProto - { [ProtoMember(1)] public uint Id { get; set; } // Id [ProtoMember(2)] @@ -104,5 +26,66 @@ namespace NBF public uint Length { get; set; } // 长度(毫米) [ProtoMember(6)] public uint Weight { get; set; } // 重量(克) - } -} \ No newline at end of file + [ProtoIgnore] + public uint Key => Id; + + #region Static + + private static ConfigContext Context => ConfigTableHelper.Table(); + + public static LureConfig Get(uint key) + { + return Context.Get(key); + } + + public static LureConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static LureConfig Fist() + { + return Context.Fist(); + } + + public static LureConfig Last() + { + return Context.Last(); + } + + public static LureConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static LureConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + public static void ParseJson(Newtonsoft.Json.Linq.JArray arr) + { + ConfigTableHelper.ParseLine(arr); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/ReelConfig.cs b/Assets/Scripts/Generate/Config/ReelConfig.cs index fa3a2a793..630d35e1f 100644 --- a/Assets/Scripts/Generate/Config/ReelConfig.cs +++ b/Assets/Scripts/Generate/Config/ReelConfig.cs @@ -5,93 +5,15 @@ using System.Linq; using System.Reflection; using System.Collections.Generic; using System.Collections.Concurrent; -#if FANTASY_NET -using Fantasy.ConfigTable; -using Fantasy.Serialize; -#else using NBC; using NBC.Serialize; -#endif -// ReSharper disable CollectionNeverUpdated.Global -// ReSharper disable UnusedAutoPropertyAccessor.Global -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#pragma warning disable CS0169 -#pragma warning disable CS8618 -#pragma warning disable CS8625 -#pragma warning disable CS8603 namespace NBF { [ProtoContract] - public sealed partial class ReelConfigData : ASerialize, IConfigTable, IProto + public sealed partial class ReelConfig : ASerialize, IProto, IConfigTable { - [ProtoMember(1)] - public List List { get; set; } = new List(); -#if FANTASY_NET - [ProtoIgnore] - private readonly ConcurrentDictionary _configs = new ConcurrentDictionary(); -#else - [ProtoIgnore] - private readonly Dictionary _configs = new Dictionary(); -#endif - private static ReelConfigData _instance = null; - - public static ReelConfigData Instance - { - get { return _instance ??= ConfigTableHelper.Load(); } - private set => _instance = value; - } - - public ReelConfig Get(uint id, bool check = true) - { - if (_configs.ContainsKey(id)) - { - return _configs[id]; - } - if (check) - { - throw new Exception($"ReelConfig not find {id} Id"); - } - - return null; - } - public bool TryGet(uint id, out ReelConfig config) - { - config = null; - - if (!_configs.ContainsKey(id)) - { - return false; - } - - config = _configs[id]; - return true; - } - public override void AfterDeserialization() - { - foreach (var config in List) - { -#if FANTASY_NET - _configs.TryAdd(config.Id, config); -#else - _configs.Add(config.Id, config); -#endif - config.AfterDeserialization(); - } - - EndInit(); - } - - public override void Dispose() - { - Instance = null; - } - } - - [ProtoContract] - public sealed partial class ReelConfig : ASerialize, IProto - { [ProtoMember(1)] public uint Id { get; set; } // Id [ProtoMember(2)] @@ -104,5 +26,66 @@ namespace NBF public uint Size { get; set; } // 尺寸 [ProtoMember(6)] public uint Strength { get; set; } // 强度 - } -} \ No newline at end of file + [ProtoIgnore] + public uint Key => Id; + + #region Static + + private static ConfigContext Context => ConfigTableHelper.Table(); + + public static ReelConfig Get(uint key) + { + return Context.Get(key); + } + + public static ReelConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static ReelConfig Fist() + { + return Context.Fist(); + } + + public static ReelConfig Last() + { + return Context.Last(); + } + + public static ReelConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static ReelConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + public static void ParseJson(Newtonsoft.Json.Linq.JArray arr) + { + ConfigTableHelper.ParseLine(arr); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/RingConfig.cs b/Assets/Scripts/Generate/Config/RingConfig.cs index 1dd9dbc84..9f3d61d31 100644 --- a/Assets/Scripts/Generate/Config/RingConfig.cs +++ b/Assets/Scripts/Generate/Config/RingConfig.cs @@ -5,96 +5,79 @@ using System.Linq; using System.Reflection; using System.Collections.Generic; using System.Collections.Concurrent; -#if FANTASY_NET -using Fantasy.ConfigTable; -using Fantasy.Serialize; -#else using NBC; using NBC.Serialize; -#endif -// ReSharper disable CollectionNeverUpdated.Global -// ReSharper disable UnusedAutoPropertyAccessor.Global -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#pragma warning disable CS0169 -#pragma warning disable CS8618 -#pragma warning disable CS8625 -#pragma warning disable CS8603 namespace NBF { [ProtoContract] - public sealed partial class RingConfigData : ASerialize, IConfigTable, IProto + public sealed partial class RingConfig : ASerialize, IProto, IConfigTable { - [ProtoMember(1)] - public List List { get; set; } = new List(); -#if FANTASY_NET - [ProtoIgnore] - private readonly ConcurrentDictionary _configs = new ConcurrentDictionary(); -#else - [ProtoIgnore] - private readonly Dictionary _configs = new Dictionary(); -#endif - private static RingConfigData _instance = null; - - public static RingConfigData Instance - { - get { return _instance ??= ConfigTableHelper.Load(); } - private set => _instance = value; - } - - public RingConfig Get(uint id, bool check = true) - { - if (_configs.ContainsKey(id)) - { - return _configs[id]; - } - if (check) - { - throw new Exception($"RingConfig not find {id} Id"); - } - - return null; - } - public bool TryGet(uint id, out RingConfig config) - { - config = null; - - if (!_configs.ContainsKey(id)) - { - return false; - } - - config = _configs[id]; - return true; - } - public override void AfterDeserialization() - { - foreach (var config in List) - { -#if FANTASY_NET - _configs.TryAdd(config.Id, config); -#else - _configs.Add(config.Id, config); -#endif - config.AfterDeserialization(); - } - - EndInit(); - } - - public override void Dispose() - { - Instance = null; - } - } - - [ProtoContract] - public sealed partial class RingConfig : ASerialize, IProto - { [ProtoMember(1)] public uint Id { get; set; } // Id [ProtoMember(2)] public string Model { get; set; } // 模型 - } -} \ No newline at end of file + [ProtoIgnore] + public uint Key => Id; + + #region Static + + private static ConfigContext Context => ConfigTableHelper.Table(); + + public static RingConfig Get(uint key) + { + return Context.Get(key); + } + + public static RingConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static RingConfig Fist() + { + return Context.Fist(); + } + + public static RingConfig Last() + { + return Context.Last(); + } + + public static RingConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static RingConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + public static void ParseJson(Newtonsoft.Json.Linq.JArray arr) + { + ConfigTableHelper.ParseLine(arr); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/RodConfig.cs b/Assets/Scripts/Generate/Config/RodConfig.cs index acadcef48..0c4d4fc12 100644 --- a/Assets/Scripts/Generate/Config/RodConfig.cs +++ b/Assets/Scripts/Generate/Config/RodConfig.cs @@ -5,93 +5,15 @@ using System.Linq; using System.Reflection; using System.Collections.Generic; using System.Collections.Concurrent; -#if FANTASY_NET -using Fantasy.ConfigTable; -using Fantasy.Serialize; -#else using NBC; using NBC.Serialize; -#endif -// ReSharper disable CollectionNeverUpdated.Global -// ReSharper disable UnusedAutoPropertyAccessor.Global -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#pragma warning disable CS0169 -#pragma warning disable CS8618 -#pragma warning disable CS8625 -#pragma warning disable CS8603 namespace NBF { [ProtoContract] - public sealed partial class RodConfigData : ASerialize, IConfigTable, IProto + public sealed partial class RodConfig : ASerialize, IProto, IConfigTable { - [ProtoMember(1)] - public List List { get; set; } = new List(); -#if FANTASY_NET - [ProtoIgnore] - private readonly ConcurrentDictionary _configs = new ConcurrentDictionary(); -#else - [ProtoIgnore] - private readonly Dictionary _configs = new Dictionary(); -#endif - private static RodConfigData _instance = null; - - public static RodConfigData Instance - { - get { return _instance ??= ConfigTableHelper.Load(); } - private set => _instance = value; - } - - public RodConfig Get(uint id, bool check = true) - { - if (_configs.ContainsKey(id)) - { - return _configs[id]; - } - if (check) - { - throw new Exception($"RodConfig not find {id} Id"); - } - - return null; - } - public bool TryGet(uint id, out RodConfig config) - { - config = null; - - if (!_configs.ContainsKey(id)) - { - return false; - } - - config = _configs[id]; - return true; - } - public override void AfterDeserialization() - { - foreach (var config in List) - { -#if FANTASY_NET - _configs.TryAdd(config.Id, config); -#else - _configs.Add(config.Id, config); -#endif - config.AfterDeserialization(); - } - - EndInit(); - } - - public override void Dispose() - { - Instance = null; - } - } - - [ProtoContract] - public sealed partial class RodConfig : ASerialize, IProto - { [ProtoMember(1)] public uint Id { get; set; } // Id [ProtoMember(2)] @@ -110,5 +32,66 @@ namespace NBF public uint MaxRange { get; set; } // 最大范围 [ProtoMember(9)] public uint ConstructionType { get; set; } // 结构类型 - } -} \ No newline at end of file + [ProtoIgnore] + public uint Key => Id; + + #region Static + + private static ConfigContext Context => ConfigTableHelper.Table(); + + public static RodConfig Get(uint key) + { + return Context.Get(key); + } + + public static RodConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static RodConfig Fist() + { + return Context.Fist(); + } + + public static RodConfig Last() + { + return Context.Last(); + } + + public static RodConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static RodConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + public static void ParseJson(Newtonsoft.Json.Linq.JArray arr) + { + ConfigTableHelper.ParseLine(arr); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/Unit2Config.cs b/Assets/Scripts/Generate/Config/Unit2Config.cs index 5e39bc1a7..39c7ae07c 100644 --- a/Assets/Scripts/Generate/Config/Unit2Config.cs +++ b/Assets/Scripts/Generate/Config/Unit2Config.cs @@ -5,98 +5,81 @@ using System.Linq; using System.Reflection; using System.Collections.Generic; using System.Collections.Concurrent; -#if FANTASY_NET -using Fantasy.ConfigTable; -using Fantasy.Serialize; -#else using NBC; using NBC.Serialize; -#endif -// ReSharper disable CollectionNeverUpdated.Global -// ReSharper disable UnusedAutoPropertyAccessor.Global -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#pragma warning disable CS0169 -#pragma warning disable CS8618 -#pragma warning disable CS8625 -#pragma warning disable CS8603 namespace NBF { [ProtoContract] - public sealed partial class Unit2ConfigData : ASerialize, IConfigTable, IProto + public sealed partial class Unit2Config : ASerialize, IProto, IConfigTable { - [ProtoMember(1)] - public List List { get; set; } = new List(); -#if FANTASY_NET - [ProtoIgnore] - private readonly ConcurrentDictionary _configs = new ConcurrentDictionary(); -#else - [ProtoIgnore] - private readonly Dictionary _configs = new Dictionary(); -#endif - private static Unit2ConfigData _instance = null; - - public static Unit2ConfigData Instance - { - get { return _instance ??= ConfigTableHelper.Load(); } - private set => _instance = value; - } - - public Unit2Config Get(uint id, bool check = true) - { - if (_configs.ContainsKey(id)) - { - return _configs[id]; - } - if (check) - { - throw new Exception($"Unit2Config not find {id} Id"); - } - - return null; - } - public bool TryGet(uint id, out Unit2Config config) - { - config = null; - - if (!_configs.ContainsKey(id)) - { - return false; - } - - config = _configs[id]; - return true; - } - public override void AfterDeserialization() - { - foreach (var config in List) - { -#if FANTASY_NET - _configs.TryAdd(config.Id, config); -#else - _configs.Add(config.Id, config); -#endif - config.AfterDeserialization(); - } - - EndInit(); - } - - public override void Dispose() - { - Instance = null; - } - } - - [ProtoContract] - public sealed partial class Unit2Config : ASerialize, IProto - { [ProtoMember(1)] public uint Id { get; set; } // Id [ProtoMember(2)] public string Name { get; set; } // 名称 [ProtoMember(3)] public string Model { get; set; } // 数据库类型 - } -} \ No newline at end of file + [ProtoIgnore] + public uint Key => Id; + + #region Static + + private static ConfigContext Context => ConfigTableHelper.Table(); + + public static Unit2Config Get(uint key) + { + return Context.Get(key); + } + + public static Unit2Config Get(Predicate match) + { + return Context.Get(match); + } + + public static Unit2Config Fist() + { + return Context.Fist(); + } + + public static Unit2Config Last() + { + return Context.Last(); + } + + public static Unit2Config Fist(Predicate match) + { + return Context.Fist(match); + } + + public static Unit2Config Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + public static void ParseJson(Newtonsoft.Json.Linq.JArray arr) + { + ConfigTableHelper.ParseLine(arr); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/UnitConfig.cs b/Assets/Scripts/Generate/Config/UnitConfig.cs index ce42a9f12..79a2ef587 100644 --- a/Assets/Scripts/Generate/Config/UnitConfig.cs +++ b/Assets/Scripts/Generate/Config/UnitConfig.cs @@ -5,98 +5,81 @@ using System.Linq; using System.Reflection; using System.Collections.Generic; using System.Collections.Concurrent; -#if FANTASY_NET -using Fantasy.ConfigTable; -using Fantasy.Serialize; -#else using NBC; using NBC.Serialize; -#endif -// ReSharper disable CollectionNeverUpdated.Global -// ReSharper disable UnusedAutoPropertyAccessor.Global -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#pragma warning disable CS0169 -#pragma warning disable CS8618 -#pragma warning disable CS8625 -#pragma warning disable CS8603 namespace NBF { [ProtoContract] - public sealed partial class UnitConfigData : ASerialize, IConfigTable, IProto + public sealed partial class UnitConfig : ASerialize, IProto, IConfigTable { - [ProtoMember(1)] - public List List { get; set; } = new List(); -#if FANTASY_NET - [ProtoIgnore] - private readonly ConcurrentDictionary _configs = new ConcurrentDictionary(); -#else - [ProtoIgnore] - private readonly Dictionary _configs = new Dictionary(); -#endif - private static UnitConfigData _instance = null; - - public static UnitConfigData Instance - { - get { return _instance ??= ConfigTableHelper.Load(); } - private set => _instance = value; - } - - public UnitConfig Get(uint id, bool check = true) - { - if (_configs.ContainsKey(id)) - { - return _configs[id]; - } - if (check) - { - throw new Exception($"UnitConfig not find {id} Id"); - } - - return null; - } - public bool TryGet(uint id, out UnitConfig config) - { - config = null; - - if (!_configs.ContainsKey(id)) - { - return false; - } - - config = _configs[id]; - return true; - } - public override void AfterDeserialization() - { - foreach (var config in List) - { -#if FANTASY_NET - _configs.TryAdd(config.Id, config); -#else - _configs.Add(config.Id, config); -#endif - config.AfterDeserialization(); - } - - EndInit(); - } - - public override void Dispose() - { - Instance = null; - } - } - - [ProtoContract] - public sealed partial class UnitConfig : ASerialize, IProto - { [ProtoMember(1)] public uint Id { get; set; } // Id [ProtoMember(2)] public string Name { get; set; } // 名称 [ProtoMember(3)] public string Model { get; set; } // 数据库类型 - } -} \ No newline at end of file + [ProtoIgnore] + public uint Key => Id; + + #region Static + + private static ConfigContext Context => ConfigTableHelper.Table(); + + public static UnitConfig Get(uint key) + { + return Context.Get(key); + } + + public static UnitConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static UnitConfig Fist() + { + return Context.Fist(); + } + + public static UnitConfig Last() + { + return Context.Last(); + } + + public static UnitConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static UnitConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + public static void ParseJson(Newtonsoft.Json.Linq.JArray arr) + { + ConfigTableHelper.ParseLine(arr); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Generate/Config/WeightConfig.cs b/Assets/Scripts/Generate/Config/WeightConfig.cs index 993973951..0c1431195 100644 --- a/Assets/Scripts/Generate/Config/WeightConfig.cs +++ b/Assets/Scripts/Generate/Config/WeightConfig.cs @@ -5,93 +5,15 @@ using System.Linq; using System.Reflection; using System.Collections.Generic; using System.Collections.Concurrent; -#if FANTASY_NET -using Fantasy.ConfigTable; -using Fantasy.Serialize; -#else using NBC; using NBC.Serialize; -#endif -// ReSharper disable CollectionNeverUpdated.Global -// ReSharper disable UnusedAutoPropertyAccessor.Global -#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member -#pragma warning disable CS0169 -#pragma warning disable CS8618 -#pragma warning disable CS8625 -#pragma warning disable CS8603 namespace NBF { [ProtoContract] - public sealed partial class WeightConfigData : ASerialize, IConfigTable, IProto + public sealed partial class WeightConfig : ASerialize, IProto, IConfigTable { - [ProtoMember(1)] - public List List { get; set; } = new List(); -#if FANTASY_NET - [ProtoIgnore] - private readonly ConcurrentDictionary _configs = new ConcurrentDictionary(); -#else - [ProtoIgnore] - private readonly Dictionary _configs = new Dictionary(); -#endif - private static WeightConfigData _instance = null; - - public static WeightConfigData Instance - { - get { return _instance ??= ConfigTableHelper.Load(); } - private set => _instance = value; - } - - public WeightConfig Get(uint id, bool check = true) - { - if (_configs.ContainsKey(id)) - { - return _configs[id]; - } - if (check) - { - throw new Exception($"WeightConfig not find {id} Id"); - } - - return null; - } - public bool TryGet(uint id, out WeightConfig config) - { - config = null; - - if (!_configs.ContainsKey(id)) - { - return false; - } - - config = _configs[id]; - return true; - } - public override void AfterDeserialization() - { - foreach (var config in List) - { -#if FANTASY_NET - _configs.TryAdd(config.Id, config); -#else - _configs.Add(config.Id, config); -#endif - config.AfterDeserialization(); - } - - EndInit(); - } - - public override void Dispose() - { - Instance = null; - } - } - - [ProtoContract] - public sealed partial class WeightConfig : ASerialize, IProto - { [ProtoMember(1)] public uint Id { get; set; } // Id [ProtoMember(2)] @@ -100,5 +22,66 @@ namespace NBF public uint Type { get; set; } // 类型 [ProtoMember(4)] public uint Weight { get; set; } // 重量(克) - } -} \ No newline at end of file + [ProtoIgnore] + public uint Key => Id; + + #region Static + + private static ConfigContext Context => ConfigTableHelper.Table(); + + public static WeightConfig Get(uint key) + { + return Context.Get(key); + } + + public static WeightConfig Get(Predicate match) + { + return Context.Get(match); + } + + public static WeightConfig Fist() + { + return Context.Fist(); + } + + public static WeightConfig Last() + { + return Context.Last(); + } + + public static WeightConfig Fist(Predicate match) + { + return Context.Fist(match); + } + + public static WeightConfig Last(Predicate match) + { + return Context.Last(match); + } + + public static int Count() + { + return Context.Count(); + } + + public static int Count(Func predicate) + { + return Context.Count(predicate); + } + + public static List GetList() + { + return Context.GetList(); + } + + public static List GetList(Predicate match) + { + return Context.GetList(match); + } + public static void ParseJson(Newtonsoft.Json.Linq.JArray arr) + { + ConfigTableHelper.ParseLine(arr); + } + #endregion + } +} \ No newline at end of file diff --git a/Assets/Scripts/Generate/NetworkProtocol/CommonProtoData.cs b/Assets/Scripts/Generate/NetworkProtocol/CommonProtoData.cs index d0ec126b8..8d46b5c99 100644 --- a/Assets/Scripts/Generate/NetworkProtocol/CommonProtoData.cs +++ b/Assets/Scripts/Generate/NetworkProtocol/CommonProtoData.cs @@ -26,7 +26,6 @@ namespace NBC Country = default; Level = default; Exp = default; - Vip = default; VipInfo = default; #if FANTASY_NET || FANTASY_UNITY GetScene().MessagePoolComponent.Return(this); @@ -43,8 +42,6 @@ namespace NBC [ProtoMember(5)] public int Exp { get; set; } [ProtoMember(6)] - public bool Vip { get; set; } - [ProtoMember(7)] public VipInfo VipInfo { get; set; } } [ProtoContract] @@ -148,7 +145,7 @@ namespace NBC [ProtoMember(5)] public int Level { get; set; } [ProtoMember(6)] - public bool Vip { get; set; } + public int Vip { get; set; } [ProtoMember(7)] public int MapId { get; set; } } @@ -164,6 +161,7 @@ namespace NBC } public override void Dispose() { + Level = default; OpenTime = default; ExpirationTime = default; #if FANTASY_NET || FANTASY_UNITY @@ -171,8 +169,10 @@ namespace NBC #endif } [ProtoMember(1)] - public long OpenTime { get; set; } + public int Level { get; set; } [ProtoMember(2)] + public long OpenTime { get; set; } + [ProtoMember(3)] public long ExpirationTime { get; set; } } /// diff --git a/Assets/Scripts/Init.cs b/Assets/Scripts/Init.cs index 4ec236387..0e4f0c9c6 100644 --- a/Assets/Scripts/Init.cs +++ b/Assets/Scripts/Init.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Threading.Tasks; using FairyGUI; using NBC; @@ -111,8 +112,12 @@ namespace NBF private void LoadData() { + Stopwatch stopwatch = new Stopwatch(); + stopwatch.Start(); var jsonAsset = Resources.Load("config/configs"); ConfigTableHelper.Initialize(jsonAsset.text); + stopwatch.Stop(); + Log.Info($"解析表格耗时={stopwatch.ElapsedMilliseconds}"); // ConfigAssets.Init(); } diff --git a/Assets/Scripts/NBC/Runtime/Core/Config/ConfigContext.cs b/Assets/Scripts/NBC/Runtime/Core/Config/ConfigContext.cs new file mode 100644 index 000000000..53c9ec1fe --- /dev/null +++ b/Assets/Scripts/NBC/Runtime/Core/Config/ConfigContext.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace NBC +{ + public interface IConfigContext + { + // 定义非泛型接口 + } + + public class ConfigContext : IConfigContext where T : IConfigTable + { + private static List _cacheList = new List(); + + #region Cache + + public void Association(List list) + { + if (list != null) + { + _cacheList = list; + } + } + + #endregion + + public int Count() + { + return _cacheList.Count; + } + + public int Count(Func predicate) + { + return _cacheList.Count(predicate); + } + + public T Get(uint key) + { + return First(key); + } + + public T Fist() + { + return _cacheList.First(); + } + + public T Last() + { + return _cacheList.Last(); + } + + public T Fist(Predicate match) + { + return Get(match); + } + + public T Last(Predicate match) + { + return _cacheList.FindLast(match); + } + + public T Get(Predicate match) + { + return _cacheList.Find(match); + } + + public T GetRandom() + { + Random random = new Random(); + // 随机从列表中取一个对象 + return _cacheList[random.Next(_cacheList.Count)]; + } + + public List GetList() + { + return _cacheList; + } + + public List GetList(Predicate match) + { + return _cacheList.FindAll(match); + } + + private T First(uint key) + { + return _cacheList.Find(t => t.Key == key); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/NBC/Runtime/Core/Config/ConfigContext.cs.meta b/Assets/Scripts/NBC/Runtime/Core/Config/ConfigContext.cs.meta new file mode 100644 index 000000000..e0d9e3f4d --- /dev/null +++ b/Assets/Scripts/NBC/Runtime/Core/Config/ConfigContext.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f916dd8f41b047068d570fc87f9163c2 +timeCreated: 1760064105 \ No newline at end of file diff --git a/Assets/Scripts/NBC/Runtime/Core/Config/ConfigTableHelper.cs b/Assets/Scripts/NBC/Runtime/Core/Config/ConfigTableHelper.cs index 447872f07..9f35d20ea 100644 --- a/Assets/Scripts/NBC/Runtime/Core/Config/ConfigTableHelper.cs +++ b/Assets/Scripts/NBC/Runtime/Core/Config/ConfigTableHelper.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; +using System.Reflection; using NBC.Serialize; using Newtonsoft.Json.Linq; @@ -11,23 +13,15 @@ namespace NBC /// public static class ConfigTableHelper { - // private static string _configTableBinaryDirectory; - // private static string _jsonData; - - private static readonly object Lock = new object(); - - // 配置表数据缓存字典 - private static readonly Dictionary ConfigDic = new(); - - private static readonly Dictionary Tokens = new(); - + private static readonly Dictionary _dictionary = new Dictionary(); + /// /// 初始化ConfigTableHelper /// public static void Initialize(string json) { - // _jsonData = json; var jsonObj = JObject.Parse(json); + Dictionary tokens = new(); foreach (var item in jsonObj) { try @@ -36,7 +30,7 @@ namespace NBC var value = item.Value; if (value is JArray jArray) { - Tokens[name] = jArray; + tokens[name] = jArray; } } catch (Exception e) @@ -44,44 +38,78 @@ namespace NBC Log.Error($"读表异常,请检查,name={item.Key} ex={e}"); } } - } - /// - /// 加载配置表数据 - /// - /// 配置表类型 - /// 配置表数据 - public static T Load() where T : ASerialize, new() - { - lock (Lock) + //反射获取所有IConfigTable的非抽象类 + var tableTypes = GetAllConfigTableTypes(); + foreach (var type in tableTypes) { - try + var name = type.Name; + if (tokens.TryGetValue(name, out var jArray)) { - var dataConfig = typeof(T).Name; - - if (ConfigDic.TryGetValue(dataConfig, out var aProto)) - { - return (T)aProto; - } - - var configName = typeof(T).Name; - if (!Tokens.TryGetValue(configName, out var jArray)) - { - // jArray.ToObject>() - // return new T(); - } - - // var configFile = GetConfigPath(dataConfig); - // var bytes = File.ReadAllBytes(configFile); - // var data = SerializerManager.GetSerializer(FantasySerializerType.ProtoBuf).Deserialize(bytes); - // ConfigDic[dataConfig] = data; - return new T(); - } - catch (Exception ex) - { - throw new Exception($"ConfigTableManage:{typeof(T).Name} 数据表加载之后反序列化时出错:{ex}"); + // 通过反射调用 ParseJson 方法 + var parseMethod = type.GetMethod("ParseJson", BindingFlags.Public | BindingFlags.Static); + parseMethod?.Invoke(null, new object[] { jArray }); } } + + } + + public static ConfigContext Table() where T : IConfigTable + { + var type = typeof(T); + if (_dictionary.TryGetValue(type, out var context)) + { + return context as ConfigContext; + } + + var jsonContext = new ConfigContext(); + _dictionary[type] = jsonContext; + return jsonContext; + } + + public static List ParseLine(JArray arr) where T : IConfigTable, new() + { + List list = new List(); + foreach (var jToken in arr) + { + T instance = jToken.ToObject(); + + if (instance != null) + { + list.Add(instance); + } + } + + var context = Table(); + context.Association(list); + + return list; + } + + + /// + /// 获取所有实现了 IConfigTable 接口的非抽象类 + /// + /// 所有非抽象的配置对象类 + private static List GetAllConfigTableTypes() + { + var types = new List(); + var interfaceType = typeof(IConfigTable); + + // 遍历当前程序集中的所有类型 + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + foreach (var type in assembly.GetTypes()) + { + // 检查是否实现了 IConfigTable 接口,并且不是抽象类 + if (interfaceType.IsAssignableFrom(type) && !type.IsAbstract && !type.IsInterface) + { + types.Add(type); + } + } + } + + return types; } } } \ No newline at end of file diff --git a/Assets/Scripts/NBC/Runtime/Core/Config/IConfigTable.cs b/Assets/Scripts/NBC/Runtime/Core/Config/IConfigTable.cs index a2160d2fe..bc708220d 100644 --- a/Assets/Scripts/NBC/Runtime/Core/Config/IConfigTable.cs +++ b/Assets/Scripts/NBC/Runtime/Core/Config/IConfigTable.cs @@ -3,5 +3,8 @@ /// /// 表示是一个配置文件 /// - public interface IConfigTable { } + public interface IConfigTable + { + public uint Key { get; } + } } \ No newline at end of file diff --git a/Config/BaitConfig.xlsx b/Config/BaitConfig.xlsx deleted file mode 100644 index 1f100b90a3fb70bd7afa0bde0cec4331dd2a165c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10010 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 diff --git a/Config/BasicConfig.xlsx b/Config/BasicConfig.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3d55edd2356b5c6caf045fa59b063be5afe7d62c GIT binary patch literal 11320 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 D7Z0Np literal 0 HcmV?d00001 diff --git a/Config/BobberConfig.xlsx b/Config/BobberConfig.xlsx deleted file mode 100644 index 7d1cc15e9e302c5d2f8f772b9c4e5cdd459ae5e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11779 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 N(E`4!(NxcR{|D$)Ofdie diff --git a/Config/FeederConfig.xlsx b/Config/FeederConfig.xlsx deleted file mode 100644 index c253564fc3464f874a877be9850abb43a517afc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9692 zcma)iWmud`(l)Mv;K6lpcai|XfH_5-`1AN*~&5{rcDx>6)o_{_XrJSGme8!JBuYB8fWl)(rs|K z#%BRw)SYvo-sp_x4*jk<+&5C+@r8Y1YU9xQ0KZ}oJP6OjTO21U2O$V=2`wNW&5TRVoRDgkGUvGb+o!oY zoMxILA3K{vI$Ho$)>yeWqt5^tiGQiUBBdyJtXfT zbnP=D>mYXcUb0jd)tL+Ce#aw@qaK)(d-w_J->Ht0Y$%riQ>_E08vUPC8`^-3pSbpj zk(cUV!3tP{eH89yRdwaqNaMCQ75XLyTJd&BWa-`wkOtouqJEYvP zq%T}X4r2s<&fp=Zf#?Ft7dQm!e0aXW@0nHdIF{i6H)%q6qp-_+WrDtBuSCwNFt0MsW&bF|*yVV=h!q^%T?+JrXkU`( z+i@i#0o!NT;&Q{QJReRXr+uO?M*?N>c#L-(=Z>l(UmGDWhKgNH#flk@bI7yr8eHG8 zdTR3XIu!=ySlDzyZsae2BG4=0`pWqEjp+yYoJ)7?O6wiwCOW}Er<>J>9cxeR?CaWf zeeKIs1oC5Zv$Xs4#t3WcP}qLVn5d|*c4w_9+HmSmQCE(q5?)Cq%)R$_k0CF}z9M}b z@CDc>k2=31C5CW``*AL|zVtiqUTtrNsldFWf_caMjduq-dmF1K=5wM)o|x}B@&z-` zCzHrH7gl3<54$SZHtQxaUOWn*l*kpnTN;X2tbi7P z3nTP?0mUNDcgqUJ5KV2mpoFLzgO&#gd204T`PA$j5JupS!Yee3wV#rtf}q~~qM|w@ z^7A`aE2BMkb4T&3`_{MlHw*!wU_E!gYs-{a+uL>@b{hv2cQE3dbtnG8t&UL@5<{qep;xarSXmaSdZWW|}1J62Xk;CwL1~e=GHTJYOzf7}Vx} zZa9swHU?jdpZj7@T9k#7g*>B0UmSswL2yammkIT;N?ptH@WW=$HJypFb`Na6RD}`G zB8#Mi@}yMbAnW{k%WV31{&3_VKg1KQ|J}eqgK2fP{ApVLI{@_;z{v&#v@SN*;7_B0ZW;q?Bxi7pc@Sn0@88>Jmt5FIiFz z5lip3Lt-$KEpmC!h~2$*H{x-6Ss1Q?JTof-m>A{j$sdLAF=W{o$UNU?=H$)ld{aHi zAyiGTj>yF}FjB#9*83jHoQr7cOO%~d_MJWBLV38!Ma(qyJQyzKv*Cj~(-P!+#MM+Y z(T#VEwWz_p1n-oUt(B3uX-nj*FtGfIqmwG57$VC$&6*~#uiJ@e*l)t@@^*Ew*#s6{ z6BK$2E#QJab|85m;55k1R*yWFq#L_E5WlOU#*+X@WVl3~g_gUgEkC32L$6Xedr+?y zbgV9zaxvIfAM=0_)9uPOpJ?WZJ{RHwKwrBpV?FMOFFs;3ERT?kP^~DvUFRgL_L^Sl zsy`Ail0>~u?n4=P$jRp|9wnTtDJ{B98eNkR(lWf#_a$_U#bfM!vo6G@rk!Cv4ad+A z*FeqSSG?>+ooj0=+S_*$>ZxLqlt3kIzgYTu4~Cm*tq_^FlqoCZbz->nW0YMFQRd|9 z_Oo5$u$W-l}V!1>IMl-FR77ru{d#u1=l|Hjn)t)SjO^t zW?~$&2|oGm=lw`H>jJbeYRo{d9qsgzKJ0Q<1aUh*g!mP8_0o0fk>4!+P~qPpe6r)fL^(xVhzem^I3WV;P+<%fkv z+bipWMk_>gf{xPMd3EF6-$+Z+U8+6Zs?fk174mSLhs<7qqB)N?AE-Srib!C6#vNdF zcW#@`d=k#u+BkD=s>f+&M0yO{ELeoPFcsw!Dezqf`A$=F_g-ICUTE`HvP{Y-5cZ6c z?j+j1{Z1Tt#b_NOMIm$tCaqIPen~o>n1Z+C&&5W&# z|L{$uiDF0RVId$$@qQWZf5U!)f7*isbr~B1ZnUNs+g@t>P0>bs6l~=1HTORQ@dY*s|T(7vR1jPr1Ggb4OKGpltTkqTT6wBq37kaQuD6Oi7o&ifrf-G*O`bw7KlW)nJM+vDa@=V2v5k7t^Ik< zkvssvyM3*EzoqI}sx&IAFR}rr*|1i^PG$Mh;t?lO5oG_HSMFCDO$Uhq+;=vm?-zl2UdW|_UmtJrJz2Je zuoxTRHm`3FGr4HVC7o0Mf&0~kD^4%mB!PF!os$0 z0WbT2jeo(4|UCb?>fkyV#E|LUVH?Q`7iwH_lJi#>L)jH8XTTe-iz& zQh3yI{bT-JQ%kDH)o!1vbtB73%j5a1O^fFaTsyx8o9oTR_?y%>9ydcObb67aV)3K$S=Gln zEk{Gku|^qrI(dIZ2EL0h8CJ)lLw+(9tw{0K1U<~11?ok9^5Lkk-Wj^=oH0lVQf9js zg5uTKNm*`-{8=T+SI6by{wO|qes>6p^kLJZ(wUtbAb$)CxI47InYSRGEuWA*WW##{_2z5*2EMua=#L-xzfxkV*5+fgO(lV&2juq3fu zY7^|+BIBEcC!BhrCAq)+AZ}BsAHnf$NKdB9G4{!$WXLLV>pAo$GF=h)S_zk=v6wJba^^Iy^(|E zCt28`=eatyb!4=5;wD5x)c>+8NGPopmLuI3!mnRe_tkqBq5*^JJV!QZy%q9^s_>qK zJO5s1+^lD^N1VDZLqt|yVd!+je8;~i8?S92R|j>r-%Y6(<`bAO5kvKDI9JO@bc73T zZkqsIKGH1!YoeP^m=I{@xykgUO+L;zMwv0fDMy{((fsEm-5;)q@hXwGzS#qI>63@M3nd&pjz&5lgxds^C~5E6>~b%lwDE?v4D( zjU2}aX-z;Fs8V9Pcbk~X0Bbe#)#SE|S)+N${JQYfe4)Lo`~1-~5t*7{)JzezW+W|F6P!3K;}x8Eow z=@J$(%s%_Z7uJDkBW-$z>WcxavY_)OLqGnI8!N^RI992^sxZDU=J+DyI5h2BA9(s+ zq!JgKs0-_iuq3B3JFDe0D@!vrFwh&Hj23@|M*(H(S;3^tKuNUS%#6bbmqIkVh}|qZ zqq4mAc(K9Mvrw)wjDb*27r#mJ&QYcz)HJE9g7umg8nqxJwON4tOew+F^4|hUKm7c`3OPxCKjEb=o1CvlPkWZOZ|#-pmxMFg}yP*^(qOzwZdR zL53!H197t5*6Ymp*E_9!#oOpol3_BI zN6S~2(>;?54{BLlLmLw*U0SZ5Ba#VTv5oY?eiF67R%qFfhoYMjDgb0tcRVaYQg(wV zoxfoF+rtDpW*ro_;!1tjF&0YH&?ICtS;YcbYt%z*yfUpH{OVwwz@qr6H9!K=GPS&B z>!31O>a9c(y|M6|W3G~9s_H1P^=Ooag$>D)10g;f>Qa$IPQthxPqUuD@IYUUpJBJ~ zc~Rl4HlIg_E1-;FtMb;|_hN73ov}Zi!)}$g-6Pgxcz8oh?pD^M> zxL)K7-dIQf%3RWq_G{(4TPLRu5tT$EC?r4SOU3h`Ubfg)Nx&9HowWo2ODX9@d6;gpJf~+flfV?EM_)T% zza4Rge}qyMA$5dJrL}nyVywV5Gsk5or!_BKvQ+U48Olj-c4lC$Z)7yD>R1ByCI{|I zVyd$wh7k-r?2Meb4QZkhSM{h#tC4gS8|S3V#1o|n_}E?E&PAhDT<*C!F}++Z0zcl7 zD@NFx@GO`76$|p!p>tLNBoM80w`{i{{jDF~cpYu-pnGr7gq3ssraw*y(Hso2J@oVm zRH%2Tr&4{$HiLSwm&gMEBFs@p~J=+~f8a(``V+S$cs!c9_t zPoqvAfRR8LZa)uT7F z$qDi{V#F1n&p_^w^*H8_xR;w(3=;)do$D7kO}F%k}Y_ zw1IgJZ1Ds+8Dv2+-aCVpa=#u$%FrmJ1q?N%Y-OMJ3XFjgNtbkWH8jlw>xM^Z(?s4A zX4}Jy9zLf{*KS01!(5lVgRfgZoJPLtUT$7wHPbJY`}wT7F@CKt>5VyXxGPyZs9ir= zWSdT`;6Pw31%7Qdtz9>CBh_8H-Bsm+UnvJJ@s=IPLE$W>QKX!B3?k7ZAgWw&OA7s$HeXEypYsedLQic z%mp}3a5?136ZPt06j`$(l|Lp^SLdj`qk!S9Xze{y-h0j4K>LHF=@Q!7oax?+=TpZE z(_Xyi9n({pk7l7Z3$g2xLlEN zH3Ly9jI?78w!3y_&mu=2?H}*XoL&sMezEDiRk&grUlGQL1vH9ll(kI9$SC@FeUTts z844{I(in<7CiIa(o5?Q1p|lNji1rArvVPuBDZyjcHV*15*gRlFjpZV043u~Pg$&~H z4mZwK46S9$Pcx1uBy+3}@{BR^*t5&!CnV11VQw)MAR8s%IDyFJG>K)Sm<@e4!@DCY zMrHYXgg!oKW=olN+Bi&U=fQ35ud+Y$dk=Id*H0oFG!v#&Gh>dYEz;3!Hhy1+gXA79 z9~uBl6#q<*X1mV%74)cukuAcz8ZLb=bJ0bSTW2F0s@3Zt!h;%3m3RziJCi^CjDC`XB@Ib zA5O8w#Ugd(Dburw(h%EeX33u{XCREX)Ng%vJV=OvXp6cXxmAN>~L>agY{s z7WP-La#+1tC(M#B5HBsBeD~nGq(6nA)~U#=!(Zj z-wCxh?)yk4bKt`U;q@^Ce&W7_>J1zXna${mTm2MyLaK7Wc&8K#1?l}#^fQ|um$4Yo|MQ3aD4bWVkPB}PB&l7|)phIa}c?Mx7mFX z)Mvs?8T2SkU#2M1wm6x~{r0%aYiD9*7tzQ+xRZ&%yc7=>zU1Kaj^7CYH@hIR&MAYJJf~azmP4 z+L|BaOv@3~T1z)_w482|u$aGcHD8$MV@=2+epL%a{h>Dj4#W|t)qd*ijyKs0_F%_B zDITRZZng^Ts6x5I!|L|SQxT|QgcnpZyXOGO&NxDR^s~=J9l}>LFgHrB_V6;Z3tYuN z_8&wu;oZ(nmV+Frv#GPOSdQ8Yz6mp`3Mu2NQnt}GDDJQp(yu6`q<*i*D99W}8qj5b zJ?Rv9&-a>T=Y)Ssbx_%fDVw!uU5hnbo&?&d(jVb#_?LobBz8NNh=|BHSg|rC@$d9u zmp_*2sSrH@E5A(k;!{_sIvo@QsIbnL z45wdBnT;i^2?^VWQn@Z6<1}V0n2j%6=?m6(tXwR*lVpVeS0v^4;v0jCwu;HQ75${y zhj@|+g@aD&4w37-72CmdL|PRy!z%CHZWK8_y-@-YZ9QLYh_MLiC!lqpoW%J2Tzr61 z83X&7bLASHnYxZ{rgz8t^om;yV4qB*=sDjo#F7bAKB)|x;)wf8 zDKHGAO-|CwlTMya5l^^Hfcvlka93pP0(>6f4DO~X8mr;O8o?bW|`Ruo;=CoC=lkvWUdcs}hcZ=1Opr7&Nx(*`0K2ckUOBgT{go z()r$yJ)gdP3i{5gY3fPBwc{d@`C(keCj?MSR;Zew0>~5G9>w)CVklO_xS0`_BIa{* zyj-{PPi)FqYmdIlgK1-Jp!J2n(&6`Fx!qtMUix7r1V<)hG#1Am!wxJ@uJn3?$M-{B zNZ_YV(x;Ogd;pyS>-=>?WXelnxP!d?# z@NW-Cv4*@3)84qVJ`AmipeD4iCT;^6Fs*StZu@3;;a4D}fgRa{ zCoK<-o~N?pQPLn>$S`i0lUHuH(_;-sVP0Nro{vX}L#VNPs@asZtZXTkV>N=06JBt3lM{0C=C&peLUSg zmzQiegqo^{0jxzHMm*j*pD#OQ{kZBTagY9XTIY>T18D_wL#t6Q(AS7Sa)vP)@#wKVVy4IvycP?H}4l>W(v)SW# z-1he-(b^y|J*q9((i3#_EvfoHqd7f2EF)18$UN&Y zFUk%H8m@?b*>3rH2fI74r--W4@{1}i0rA&Fw69M<=k;Bob)>Qw6P55D2KS8|EL^;x6_!SCnJ=meT+47_*xK<#usS~RA{T+~`xrhlFATUa>BCSW)wP3X zpU`O5Md82Hw!Vo6KS7m3bQ+XG&<_gy`kmJVC^Tr|8c@Cxt%*s_J^m#79sezprnzs1 zhj?>?q%ML)&!u;1$wFnIwKM&FIc4RZ&A8J9>FxVM?v&S_;_6jKj`wgbCv3zP(KduW zMV>6#X|KuIk#1)xZeK-b?&Am68^$ck3Chq_p;T2zwsXTBS5V$Dqd@0UJ{mbS=8sdK_sPaPcpxOpcJ;PSzC6lGRY0c zIUw@p=%nh0azryqj;S@0HRvG@`4|BiXWfxTy4kg?^TSr9iK$HqtS zZ%g1yF4)oj3&Zq;ERGqG>|{afe#*mcHp@6+qtDtilkdwId3eW5KaNsi#;6}OHwnr! zOw_|iCfsZ$Ex8*t5G;`DuzrbX^mUN;6|m`bY?eQEcUD{Q6)$RIT(^`Yo1fzIj_QsLVMH7{@2M@dC3{brO<)6K1J`slBtE||!V}CaJpo^u zPA7@BEmPKXgyqgr>hz8@xVqLAff!p_ysXg1rpAWHY&fp>B3i`pB)gTh$CS2@hmaGS zEOR7--Kq*YufbF)P6uiX-u^|3J;IqlZXG>&6 zy=12$Yii^#og!FH_j@K=e!tY^ooLvZg0KB3;5hqJa#T~;#@gQ4+Fn=5#n#wP`|0Xm z{AoZIiWMvHimJIITa#VURzFN%Z^bwtunIkK*~)Pqo9cUfnM$h%CFm2DB=PFtrseUj z>6s`!@B^jD#NuR;?u8nptZU9fkqODixYJbZcz?xqXLwFc=!&u9TMHI-_*UNnqNySY zT3*|T3P}30Q%J%gX^$%MF_vLxG!TVJ3w>5yT zpbD=wPEAo_2wGSyd9-4){jRryH6ph1Cg;qyH@A`BNtVCkrc-OpVR&YUh9D~rYZHwa5H5txfq@)YrX=^ive8cT>6&dJov!#u*!riJvF%dFZ=XM!GF)cK3SY!?WxEkis)aq<DT76$w+js#9c|1JLSGJ*fK=%*C;ulBTPeQ*>FY;OLS!0#-5C;o?h`g5Xx8nUNx zez62i@(;29Fl&G6`7?<6x1JGjg8sjSRR7fQXAJ0X4GI{)H2gav^#8y1WQ3oh|4IS= z{)YUS1pIr%j(>{%of7{(V!@j?E__vCN-)H`3 jO~aGyuU#wo581yf9OR^6e;!tJaE%Z=7}rAfB=`RSgG0_} diff --git a/Config/FishConfig.xlsx b/Config/FishConfig.xlsx index ae840be99beb215864730e8e9b46758ee5060c0b..608d6ec1576c083149adabe2c0259558cda27e06 100644 GIT binary patch delta 2118 zcmV-M2)XykTfJMbpaBIC;PR?RlcfPHf7LNd+u_uK;6SvZ_!g48E!dV}lcyw>A zI2zlwjoP%2;q%A%ZTaxrj~WWq?TP^^bIvkmfV#$%Rw%#D9FI!f`f6(3(rb_i1u7GgkdUNdd{L2U7Edxl-n-5x@4IwE zLGJtiPrM9c;!j6RCs}eeA|3!`pZoMjl;2QG0|b-6DH^jV1J?x!2ZyE0VFUmGcasPS zA%9zwsyGmS->Ur&6z>N_$8ogOQ*}g;hds5m?&UcHQKt#TT5T%6}mxE>DjGHicunr^30u1CeLn; z(!!P=R`h3lkkcuRu}|V_jteH8P@EwK@mH6$tQv10$xr!9D7rzeO*~47zSOk-yr*7# zc^XqvkrQ)blDjgrewIsjspXl+Jx2p%<%qsr%P-)#gyde+EM=b}-6kN+IzPAD&40O- zl@k|r6beD!!o_TNtr*FD#E`vRixv2tTCmLcJIY~Ik9;9L+ug2{6nN#uU{QS9*x$TW zX zjqDF{JK*$uVGz!fGo5pSnRUNWb8s%q;ar=0GiNdW$miMyQfq8PJ_BL8GC{!|FN5uxlA8rB0)LBEm54X+ zbhU(ah`I0^mx9E$fTIee@7u}ReFwth8nKfI;HgD;I>PV!nCggqA7S_i?jpjwh{Ih( zG=^}2rJPFv;p83?IQ=M0gi*xQmF!5E@xf8$b(iE1O1k zrVxnETZo1lpi|mG8?}}7WPi{p5%ZzC^rh~3NVgx+1tYp}M0Xg`MZ-FcBtG6AAxYY) zB+U(yBmxFVOXIVS@FfCEgnov+AYMl1CM$q1@O7tcGJ`- zVqZewZQVh-A{H;+eFGVIMeLsbu*(LBUL%|Ch+UR)|lcufss-5zl|mB z6sDv=W6J0>UqUpdjDNWI4P=NZRp)i-2#P~ZX)vYgdQ7RxQKlg7hnSLf3R6-5&+Q7v zm=(T+z_EiEvtr*shL}=y=BNrarNNY{>oKJ&N11}X#bZ>}h6-1;L?g=>iGGcN@H)1P znYeE;Lv(3M&mcO~wFY6Dvd5UF9i~ifeB{S_iO%>pM9*naS!WqOK{gWy8kx#njkso{ z6jGS+uY|$wuerOxCLF`WnmF)%aw3E^H?R%jevg=4ORGdBrpNRL?BswhLQ~joi(U4{ zE(v86rHs!$=`0Xl;5Nf&6o1xRXN#`VWMk7PnTm~D`liCvY22I3`Zc_bqjy;kU0IUJFn%7$`Z@b3&~!Fm3<|b+>c!J2?cb&SXf3`O ztjjwle_3Gk@?YS797m7o_)Ts$u#04?Qx~;mY<7cOun`~!BYp(^+^CMp3BoNe_wsev zDIV-O4hnMdc+^i`C-P@Qf~P)h>@6aWAK2mpsp;y@cavvw5>69Jr)gD5}&!;{1)GXdw5_$ZSF z5a9BvN0X2#Q~?N+0{{RN000000000103ZMW0J#&B-xC&-t}7}5 zdz0BKIst~06f8CYt&>YEKml5lj4V6>!;{G@I{{jg1ua1VjFU$#HXH|srOROi004Io w000;O0000000031AOHXW?+B9(2^tnqO9ci10000M02TmS1poj{C;$Ke0C57uWB>pF delta 2124 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 XB_jd(D*(O$c>|&j9II@U&wBp{MBodp diff --git a/Config/Item.xlsx b/Config/Item.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..64f00f7dbccf6ce3fd9e0275268f6e2abb3a5898 GIT binary patch literal 11766 zcmaJ{Wk8*|(#D}kiyXYT6n86b#odZ)aXA!sr?|TmE$+pNySrN{?oM$j-(lIi-Q~M` z^W!})VP=v%lT6-B9yv)!D0r~P5+Jk6|M>f#@&feo0cap+1GKiKmjj6bKoxL*h(Uz$ zHSvIhfr&zZfg%50OwZby&dJi^bM%M=BqMV7knvX^2&wcLawQ2-vW15 zTF^*SJ-sUgwvGLGeSzW%%g9lncDHXqsyPDa!7Mz?rrc*1Xwo!r<;1ayn0iuYUlgiC zKLRV7N@SX_H_p|2g%LS2`72FRn1C=E`U7RVUiXZ!9u-tFs}fFtxPv&QTQN%xTd5yC zy!rBEN(21spgt2j3SFUPn_k!z>PW|+iR53n$*vQ}D?>K8sO8Z;M6uH*5*medtYg{q zfkV|5;oPNjbKU%u@0Q5v`Pq$CO>pJ=l5<(HPNOoLWCIed9g0wr!LiHitLEi#CTHt& zO9s3EQ?~;X3ws?sYn1@;qaX8Mfd?}e{9zhGR1RU%{5?^ATJ1SGsK+hU$z5x1?h zLIDdany5-|exN&?hg2+bO5aA&H+y>BK>ZWySJmF`Vj!rsK~SUo9clxhjo~BK?$Pp+ z9Si{fCFlpCKG%e*sked)E0f;K{8d?37|{(SvtNjU9Bwaj4^+4SMD%rA>kV7l(Zh~k z;hS4$zp7vdlS4sgIMGT}_l-(cAR1GYhf}r{stbI&&>iFE4Z*h%5T8VZfr>!|7!n9Rph{14PK@WeA6suLE+jy*Gb82<~`${ipRtrYNviW{ZaZM#>~55Pf7e~ z!=oTVi1beva}oXKHntix^7t`{exxt5Lwp8JSaSRtYd_2WsNK2o;XZpvcfuCwO!v_o zTMzCwSVf6+tdsQ={)O~U*gf0$hRH#&zXZXK_7B+YZS8=TkHF_djXVP1bL0a8o<};F zc0RPm;2wHapl!}oe4=EOluSHN=x%8!QIXqeY;EoKs&T}XUah5{kps>EwnPEh9}7zG z<06t-g3p#Ek^!>nOkpWrH7X?sJi_$cx$>#W8EGi49}>6V9AN)*iVB=sGv?Ro%!oKy z7t0TOZl(@mm-nsj3a)AVZ31=Oe6K7%$6MdDdou&=tv%m4B&Y9NRPxAZvrF=>^kgJh zZ7UqBjAzkM=0++Nd!dBe^kVE|tYR5N$7C6$?BYR96eM}^SC5x@Je)08EDmb%zA~7B zTN{I|#mU3mlM-PdV<66K(G!CsqY+rr^PzkBP^G46aTvVWb46vOtknZuAo=wJ#}5Vx zapft=#zDq~^_IDeiGtyXL0+&&SpR!`fds+oWbrJroN&E-%K^e2=g-Ij5-0w0^s>KG2u&p_w_^vd!S2c>RQ8713g)f8L5zXJc-I)fg+5HqHTq)Dv?3=h+!4 zWh$dCBok9Pg)_P!Ga5t)d}w==dF%M_ymK~$cniv`lN^}}SeprBcowyulBIKU{*2t) zhz{bRc-fHK25yu^5l))?td@(+ZfoSh4)xQn*ve85H3|GEOD{ZhXPgL@ra+c9#~Nkz zQ(T#LW^L@s1{E+W3 zoLoFGL~E%vYIU+%Vrc4TvtP4B26LT%pPU|lZ#ZAT@8lL5B*kfCqGp#F$Sdm7BcJ8l ze)j6$-GKPyh7UG+j;2<|&m+Bei{5A|$QLxwU|_hhTwxT@O;dsaHg!K8Tbf7259cLd z!>VMw#pm=fD)^IM!y8^u-rkod{U~qEWbhx={m?HnUeT~WL3+Y*gViJOWnUM`(V3EZ zB{#00mSc8>B_O!ND$l0xU3ejinDQ)G5uaD#3WX(7|1$QJ2N>Cc<}NcBFW9y#H%amX zQL;oO4fvsiyd=aPr@fa3qWIs_jB$IhD)6B5*i47wx zg-1xbX3 zQPO3s!hz&^kyFhnUqoSRH2rD{-7H03jRZCKi2}Mmi#f)A?DSica>|C;(VzBXx1@|h z)Z30T3$3Q!sMHiD*sEU0vi0139z~rV9q#_EI&2a%%E18&DM)cXcgrr#L9+A-?9Ibk z&i2A~(huzfcq(zTl4WfA2j?ikBBr&|@|{zX9od-R6=4(_z1WWdavw_JLF{+Ruw zQInab?|EEEqS`*n^ty7}_8Yop;LsBIB|8v+!nbSg^#!A5vM&M!bbLFR0DaN%OXl=n z>6@1b7Ty$|kBaYc5%$HcE@eb{0^%7*F5KAO+Q(@5*Xq6g;WuDykE2>| zw0ph)IK>1alcB)Cd_dnhSpQG<50yUx(`VHsU^WM`2j9*w*v?x)v3b&x=;A7(^#m*X z`tOH44a=nYUT@df4t||;)i5#&#fl6GA*Huq8}W`{eeav8<+jzPEK^XCT5R2`dr7Mw z|D{WB_tzEs4U@xXiAZ81Z0hYv_q@1U`-?4t7__yKsVIdNuYj!NdQqZ&(WSCgk|FVp zif9amN@MOf5LVZ1WfC&tS)r$cN0%-_d~Zxw%w9#@VGvlf$Qs~$y&}u=AC=)43iP@v zGEi6PUeK_KY4M9eTQ^&+5JWteTBHBA*O`#VXpFvqKyOr6CbVaCz06m2I=B{|jiA5b z$JY|8)B5p6A5V@N)eq%*azd(M51G6eM=EN1x?KtyZ=WdHuDcvmnpZ)DhZb2X%fQ1{ zrimlc0OiF#e?(1BHgSbfWener9gkfP1pL}psPEbM6kQ67%|#>g@P)?%nn-yn0n2W;)l@;M#dL$5M7zbH$-?7I*HwLY?Hy=vAtq;J<)?3Kk?s@ zqu$O7qZioten+i;L!Xpbx!=Nq(o=A|jI&SRpgwkH4L~0LJkye(Z4mE`aJ9Eic_y%A zZ*!X4t!SVf*sb1<2$tnh&Q} zEbZIOUgeREi-%+`%77y(ROZNs&(ea6*9NI94Eh@qXjcR%AEGeF3aeI6S(x zy7zO<1BXv|5ZRSZL zN5Jb8;mm6~QmQeBEMJGnpLCGW*bdknV|0+$fxI7R${5vy`m>bw3Txq-94Yw^q)D2h z5?KSrnLgt+<(^eZx${g@66Try5Ogvk2z|AM^tzi0}TG6!~-62!Kh*0R%wRFKQuE;jUH~ zNDTy&Ab7IVxAN7QT6*Bo7NwLoLhl^j2YN%p5F^qsmbbU!K;j}=&}PInxaGJPW>l?+ zxy$!;ZsK@Fc;zlaOae1=TT^~X2_V%n0IoTOp>gJH^LyfrhGRS6A#f2Mjd%xX*aue`_*}y z?@}PH5%6r@Q!8Yd_4E?a>g$jmrmU^;>zVeHX%*h! z%Rpj8v+Q0uiuy*--KIrSAfXsi9$wkf+!ZwtcvwRp^kTi4g}hbT&j=@wOgd1aBKFcF zrK>>9JGN+d@*#EGkSAN;hPorK`l?*QM*V`g;3$UzytbAc4OQ3EaivDK&5_C<2abY( zD$fZISH>KkXfsQ)&N0-aCjeW}fvNpf&XGJRDfjl3^8MC(hccy689m_*7>y3Aj0gCJ zcEVJvowv>`bZ<&#aL+fjcXS~0HG9rA?u}a1ZYID0Q03#PAv={7OFxcS;fulh`8eG! z)te5I{n_t;WgmZ-=X)ZQ3DiB@;CL`>3j$~xVK%P1ahkP(miBuX+P*e!wn$5bhv&Pr zASp(&9Xli~OP1P(kg52{7um2fP7U$|RWXM_7-LPPC{K2H+ zJa0#ip`hhjw1oQ-(T*a8E0iWO@IphkuH^`)KTU?F!Ey9`=xIqKnnjT;E7Q5Vy6Iv* zIuFUqi%3i7z1cWBS(^~$+iIrifQ%K%T`4+hxw>7DZE8t#zufJ6Z`H_f((-UN2W;`! zfobPeXL7kdpWsX5bH5(i^89t&3BI&uV$m*2+Sc9>B-_YE<6XVeIy-oh*pk#mA=3Gk zpYh7!+u^`0#E(>x-Sz_mE~iTlu|NbT%Zt`k&d_Tq)Sf~1)lLX}Mv+TwN0{YL$peAM zCh;PNebX?V^R;Ha0WwdzD~h!7FHis%c9P32?-9X2*#ZCN$N-y z6GntO6NC0EOxZ=mH``x|EA zIfmZ(Z0W)-;nYsHvYu^G2qa%wANYY{8FXU1?`ZJVvL7H z5@;}szDK*;B-rxa;|q?Zj1(0O@n zHJER|j1K2VXS@OZt9%D0Dcu#~@T#z$q&vS}C#-BlnIl%6w?V=yoT%E}P~UOR%O`5v zC)8{@+wZ2;iVARz=Hk_*E!#lzRHn)w;onxpL&1<5XPw3z%7TAgOq>N%_9U@I= zVU#1!?s0rJ2{YecsHj%q(a=#}hA5R(fSDPpEc>mu)fKL>@9IK`SX&AL0;pu23o+-W z`rJ~IegLG3APSEavh%$Ra~Fd5x;F}@HgX)or8G!GZ7RjLd$;k)^#Q9{oKxG*CXJ@0 z3j?w0XG#>os#q-Q2@hdi?`)AAistzh6)8=2Kil1HIzUR0^Q-lww;tf}l4DPX%e~PM zCULq(7fSY=O^Y#S{q$l5XOYiTAu8pr7DZEFntPutb1b`Ajwgqvkx* zD=>aQy4D8;J1*70m__{A6WV{Iy8T)yMdx)f%^c!5PiO}kP|Eo3r4Ookl^K;65z29J zUc4wX>9NXJz*ocj5|&&+hoKpt`cJ1Hg)6bp@wxy%Uzg@Ie#vf$V`OMXH~-{?Lqv(Q z!l8gPjaWD(Jy05DJ3DJX!ln?#ENnZ+Osg!fHBq8JjTpjKjye#+>g+p3+&M}&^fF!Y zvT(fyQ@z$khN1xqsxdS@doL}U2x~GvMr{(XW{<6stQ9)nWKhw{oc}pb9IJ3i^P5(X z#vDoNMBB1IC*N#|3N4~E#+C%0>3xU)H3B3qAK1xuTf=wkIATmVr1^W;$1US`why-e z!O0eMCcg)r10QQadx5Qqo{ixLMLV0vBje+_+!B=W>)?ON_+3~z#>7%Ze=!jNoK3pW znO4>y^jQsBeQ7%XAkd`^peLpU(4+xg@mw7ley?iwFL-Ch{=>-Qr~A^NUa>y)aW&fO zkL~$LXRje}a_u)!=F8jk42>-zO*Fqv+PaHWAk8QGW>wbff26CLl&nKa7W7L&K6OEZ zr5mY0p0Km&%xXn9#bqUYMY8YG7*ql0W3HA703S=; zLGMb_etN$)-{Q^GK|%A*hHCSYRKu%Ni?izs#yXsWV5XDu{+EdX?&vD>dMevBN^>eS zvqU2l8|5k7#_@Y_L|W2;i9JNX8Eaupit>n}fc z#fQKx6b1Ln^1)9z4EU%ww(oiG8q6M8*Uj06& z=mUY~kNyc$Yzv=fKyG@!%ct7x8^d1%g`xr#7+h6MC6URaOrC^nj>h#>T1feP$^4C< zUS-o`2+y@USV_(3pUDW!-TO<6pnpdZ{$4SD1vzL+?6 z4{e9i#R{@oH>zsTx&p)uZIGXj*+g@{S`KH;*(9LecG?~SbdV{TB>^5zENv>Of3Va0>s(GRZ6$1 z1#8mu2w&^*uqJoWfo1td-00^~Ih?O5*poQA!`LqHXW!0r6OR0JmlW_=Ga+Zy913!p zxEB$s18^G{ucgPi86>l4_fs+x*u>N$NhTzZ5?9csbU-Y&+BdcmFBhiATFKZ&(RA_= zd!oM0Zp95XV8;(#Y{eEH>u_2wTa9`c)}o#9xT~yOF~hEGKv;B$rHK*@l6r+EA3Z(U za?$ZQk{ma`S*+6Gr`iBp_1G0g6Ko}$HSR+M#KdBMxXr*Xg5zwpTL>4QH6hvMQ|E@I zi%#B>OPz?1I>-9BB^dW7A&XWghAqFo#}PgNVzEYseC&r~4rS9HApSW)7L!|iENSs%N=o8zeDyM33!9wwQ4#ebXH1l1XAB@WNDV zS^bp?-yTJ>kVyDNR8^%f%HHi?Q3pyToHNu^ku?si8XlyKletgmk3X*sTn`VP%)VeY zc=Ho^srmNEZK-Z9WhMe9+^**|pk}LPW4E4IGJfIQrKVvizQuJw)x2+w3qI!C~9?c9Cl z=MWF963^**BJ=Cva{O7XC0v(#T|8CgMvtXKb!HqDT=b=S1GJ;<)9G9;94ud53j3xg z+$uxbI#Pc}?W4A?LK=S&$4318j~X|h><&_9N-1k|W_nLvO&`zAcygcm%uKg?o&^CH zJz37rF@DCaddsD)Lajp_4hKJbl?}ZAx{yt z-KNCb!NuO;$y?jl0^za6`F&S9gs<~n6fx8qDIK+6xN;$fgvn5LUBb5{!87o(G;}zI%ad!p zLU_~mo5@3LsbbF8itSyLb7}Z7V>YVOsZBMObajs#`OdKP(kJw$wyg~o(Jyez;MgxR zeeM$%8V*HW^bul*jbqI=V!`dK3o(N*&3zY^3Rg_~>P>G#6#trtt*Dv_$w>KVhG&S~ zPU=<3a6Q7*a;mgjxZWtRgpSR^)^7(d9}2+|+SZ?Scc7LAen!xnp2-ZmycJ1mWGXU? zihO@Y^An^YiyvLV0Y{%06qTWqp*fn!JMWDKnD6mfYZ^TPqwnnXz(iR}k^2YpF5Q2A zD;%GXj{tMYbcisiSZc#F*dB#t!=|C!t2%1HT&!74v;WZMR3JeAK62h!St<@rgic;6 zwUH>nfwMESC~|6N8$d%HnS*nz5vIkyyIzZ<_PM)sY)&hThF`?i{;Nanx#1dvL{2^< zyS)}r8Mj15a>i^bj`e^vX;PqB+k6KJeNrwyEK}{)oUmD~taevfYpQU-DkbU;JxR^@ zZ9^mj$+f>9b{{?IU{ynHrxZbEfxLBM)SX~^=sG6q=4Nz=JYdtPO;6+$;RSQFj#%Q( z+03a1GtFct-hp5=+hfh6aAOu7Sg|QOjuC0gqs0f~#GP^sm~q#%C0}ScO7+PiDuzI$ zGD}NN6+SPNG~f|Ipg=(3wiI0Dh?SMJQEDg&0vX?I)A3 zzfrVct*<6omvqnzyq4Hp$+Wfba--tm_7$C*W24R6zY{5jZ8*z4f>vSA&&HeN{*V6E_}%q#wT zd6AMc+*?O#$~;%hH5rn5oM<-m@Q z;w0f9frB;_deB4tkIIDF3tid)4Oi<<&?7Rw`g9r}aH8&P{%RWaPJO&Moa7}AW|1Lu z*+4+inTdDWA!frBM3dcQ%f18;i?@?BwzP&6duXC3hZ=h6?0fo(+3+t>9VX-fzAsG} z$-;&w+6+16Yw(8HyS7Y>65nsP{yeDFrG06s+*{|oq98G@+@e}wZN|u}QPPiffVH17 z6ssed&6JNJ&78=h-P4^6+PAtyXBw%O+LnXu8mKY@lza!Z9Hn)4eQ#r%tVKUM?JFE6KO^WfnKe$`}tV)Q@%K)(rgj==0I4fIoTuQq8_2Kl_ zk^$#zg7tJ;p@-5#rzKWTu)Ib*z0cn5=6Fcur0L$Bji$Jm0ny$ zqvmBZn4zF>f zsT6>g@a;8CR67X-d8sgIo~N_@4F%B(BY344M0B61;~P&8Zja-JlY7^gSIuH3&YJn{ z{Qi;YnK_D{gXe|i(z3stnd)wxX~Ks)h){`gyCc%yjQouB8UenL!u51X<{mLdR1W;~ zvw_d^df!yA-9P|cU+=EV*!bZaEEWNuyWOvqTjQ1+zc!5K5HGzVc-)FYH)-{l&95sJ z5C$6F1?p_L_ZjEvs)wjT}hq88*~`dkat=XzQ@AFuVW>$QEY0TJ?@?I z>qXZk>nmo(uRIYnHqk$<4T7yeThGF2ym} zwF4oqNt+3-=eqb;fIsMFgA6-C6Jj_+tLniB4nEedFlu1xvpx1N;(I-E z-IK;NrOlian%x29DYoJbr`UKctlN2U^IIDqjlQ9p!SEL8B{|=1QQ0Qbr4xw$EZWL7 z_TGiiQCT9aH|e|JYLK47E%QPmfU`ZGGehEcb5r*AJ%q9@rXx#U{k2+wVtF8%^5!@>f&tSvCz?H`)Pp?|MA^7*qC=BQWS;xlE z;`wcmD~Chl1L%KCprbItUov!$k|m%Ma3{ml33#(v+7TUP&W@gVU;2Z)SEAIzC^=fR z+Cg)ZfIQ7)J#0kM^=8VF+lL0+MM7=H-0(&pdwCyzV6Q{7{IQ#p>Y|TWanlr}vyyc? zRKxD6{;i+yCU@*S9ch%7o5Cnl02gJ9>DZ2v9Dh0&>$|+SdQKfEh5oFeciHWTaeG+!N9y7v9aeJ zIC7K-C@wLgMS7>{pQsr8eM7V5BTZ6|rVK$aS;o*c|HQ;rdt20)M%92Aryp6?-UBI9 zPv?5PGcT)-n9V6|k>kH(`Dd2-zropSF=w+6g0UV1Cl2Trlv#KZd%TYO&(ZZybfwKY z7?Axh{eK7yHphRCSCCk@kRV!^=JAT`jt`=JF?7~bTV_r4k?;#H5DEy>bU7rpusFgI zNG~-BTb4m3fxInU-gE?TV<~f#B@C>tb%Dc2ml7*40s?D*945mFz2{NF4kuq)8GDQ= z`#4^+q7!9}d}jM1ZyR3_BcI}X_=v82ZVv3Eahg65{Y#TO*q9XKn};L3`5N{s)WNO5 zGLCx^=vWf}=gqAQgc5|jAXJK25cB1CF6L9+DmG3v!Pfq{ z)bmPw$ySLxDz1UK%QGH#qZcB2aihb6!)#s_ER8L=QtbE)nPwqxsSVEPQ?qH>;09A+ zCExfXhzPqNF(3M;hF~A}XdeYh8k5W>cB}g$!5UC>3ihm9N~hP##EVp}+u!Ph^(P%` zzgG}u>Q7L?6Hs^$h=bZ#Z;!MSIbS1G0r;N8c!A+Gpg5o~6RzZCw7 zk{IdVBLDM_KHnl9+j&9>_;!%)e_sqfqQ7{k?%T3M#Wj7oqrBKIEq9V6S@OroPu&I5iT;nQ5owe%fW;><}4 z7;9=|^n^lpu%B!!Qe0yiyYScV4J=BvM%s8Y3w>i#9xx9!Z5g_D<@kY+`m@2QBus~X z6k0Tu$SiSx;$8nWderFDW4fjg0bvZJA!Vmt@2rp>6+|+t5_XWdvpA*a7nVG>vH*HG zi`A)=COF)X0aHf`UBOlRe&{voD3_4Q?UfaIPwF@`K*|y(OE6BL7#1%OHh(QvC5rl7UZ#~<{I-$ zhkOCkcSDnl`(1tO)d2D1<%KGn!`Vx|@b`jL&f(I0ebE70oq2hvC&g+zVm=^|ckQ%- zL5pje8qjZ+(VQ@1p5jeSB{r{tmTs=}@LP5Nd58)F^+2+Q7!%=oxFT78##_n!15k~Bl9-|E_+*kPno~rT7 z7^aF-Ou~A6QP457*-xfG=Oja!rw-Myk)M1E>cr5F;B^GOa*+9Z1b6 zR4ErUN+^0i+GOdI+rHZEb}FSdUQ)EF(7*S$0uc?6vV%;3HO8|3(258mR-{!a5A z#4w|ISzebpr`Rjsw?+HZ;`z75$S z%_YT0iS+$4{Mm{fkRI-Z!(0A-a~w{bc~ctyg=}NW#qFWm+ScY`rUQ&s0Y1z+aMzci~)410&*ZG zgn-==qIsg0G&sp&as7)}5pm%u#WAT31&M!glIsx~V! zUe?{paNpC+S?ubeUAX9mCeS`u*VF&nGA+UOw(|qCjgzg9uyb<8fn_zfj5fO@&stw* zqVX8Y1N0x51~IYO#wmMv5R*kozI?S4<=#){tCdT`T0BSw zvoP!9(Dm2_82eHp3}g(%S#5e^Fl03RD|&u(ubyhuH7$=mZS`GK87ph`K^93?8FDN$ zNQf&>OEwQPE^f5VXHFJET<*W#fR*T(cH!4C%YhRj#4@gfJX!Xg!Vua3>P4(n)FO?id9d>JzT+U za;|JANc}2k&K`yjJX2_1<)hQO7pE#C%Mv4-I;bi+7pxk^YAyR_W?E%gn80Rop&AmeiK zW0sOMbd##6;7GW;?-X-frX&)i{n`@+;YXQVvuioI%p|lZ;}YEW*Lid*>a*o0blKl< z6@+1er28{6iLO`-(x~Id4X=bpNt17fEX%H=%QxfJFTH8N41ag7=&z_vrD=(`13p-r z@NPps+#;ayt}I}Qn)&cPamW;%o|1#(A!(>2=_*d)P;#ThweFNRvba5l{znSk97RE$ z1U1)B1++jG3-p7ynYX4DludJEXHMgHq>O^pJ1(<}?PecPsVPjce)yiqHgXMkmvnn~ zc?GuXuu04+e+p7aL5%miUv+N{k)=;$Z~dm_<|O1O{nSZ-rxHIWSpkLK>|g}#b? zx?M>gSQ5g&Pj58n>_tmTW|Nio_MIMJF!ms6%yhQpd%-(IQEfkEdR@64r%hdRP)G^< z(p@k>@!NH;#-cHES=eBH9sh17z(7pGiUoZYed`Lr;+x`&G4cI(gah$ERx+b~00~zL z7NR=|PuW8Zm!52Iono~D>-BJ#1BPs!aI}L$m6>dAkV(GFau_ErZzAd>1t=#S3^qYE zF|T0nX&i3IqCZR;mH+eO|LWI6?P6nZ;b3ZH=s7}aeT(cmt$iNC5Bb{V>K4SB z+J~9flT3`m)V*9~Uhhk|@~hX0q#qK88lr@nIcwxRJt8jCM=8Uk_HgK7spnuQWFn>T zE|*I5W_)5M>I6eluM{yMI?Y=Lj3?!Otx%U?8pFkst@IW3w*Qp+8kahU#ZIK`or8iD zb1pZ{&GEHvA4z!dXttyTQ&yU7j4tR;43lJx`1v72m*tAQOp;W|mOfaov>!e!h z><*}Mm5&-0syioqu!VkPe!o6O^jMfDk!p;ubNH4OmTNSV8n-?y4dhd4T<2<7bo>t! zC)x`p_)P|d<`oqch*|R36j)6ga)W;7c90*67VQ_ttKkRg>(CvqK95>&*_ICXUE-!9 z&iRVgl4???gdEcKUae%lJ-{2pEpu@gaBvY9eO+u$wdh#=<4cWhfD!bDnl(etCKxtZ zOsA{@9I7GzAzYL;`_W*70ErNLw+cxn9c!lr$$eR*JWl04F#IudI9~#k7q6Slf$DE~!^Py0%LAx{*SuIFB z!+jreMTQrHwJ<78N&M)3WQEVUprkYI>mh9{r_nYNrV%yfn+qQ7;#kd+b}^G1E(U(~ zbOH(#H{l15XYwO;Q!KSY>vyAG@*VY9$U|Lty*64Xo5xF+zc2kLHGQXKz28bXm*m$D zIFRO_L#{dXb(u>!9do|Tqxb)A4%$4qS9cYbe!&VMgUxDacz#gkci!COmw%*A8fW1?JZyU;A`!A1^uw|&)L#N{v((BE0rp_fH5^!gy{Sc{HB?Zi$gUF`Pvmdo? z`#%@rui8>P;0J%*P>FEpL^^+i8~g#Pm(sJQ&?cUB5DNoWk*G=M9ef;yt5iR%D1AK= zawxr7v&g*zmqOq2ZI{Iv?>|SM=QIlV5#wlTWM%Z?TSp2nVQdk&>Jno8`o{cI><{5T zV$Pwuv<(hBatp?ekJ>>?wBbGp6ESoh&ku5ER3V8^xJ6p#i6|}&gp}_Z(FQ8{K4hDX zOMX~(r&xdz^VOcvS!WYY0lR_6vsa~7$TsimC!*EYAw5c2TOU3_Y-qH<&=Y7e7>3j{ z>nqnPzQvaTM~`9IyLJ)vkEFXxkD@?CF`_)WcA&X0X(I5pg*@!Xd@~1rr*x1RK_HoQ zs6<8Vt4B&#iBNE2+3D&>>bWUTwy^_oPhL}{T*^ibOI&oEM*&)2PyQNJ*T-e8PPW5^ zDi9lnf`F>P6%R+o0*+`aTe86=%(O2EOTd|_6DjXlo|Kep=UVw;Th+N-X-q~>XcOvv zmv!b7TvI1us`c($Hx{}#rL#B}TiUxi;Dwrf7w;d8+thC-K>!dH6RDxQ)s-vD$E;LG_No^G+d8FmB!w9QbP*S*-S+BQ~B`{>&K_MQ%i zE5%0_d$d3)MzUQ;L@g_p`lit7gece?Xc^Zgd4ifcxNS**lAyYl`6pP(&3p~XG4Nh! z5IMe2q~hFfM^7Li<=V7_20p(&juNU=n#{xt3){YtBb@m-6_yUeF<{u&mQFN>B3WLp zbANr?!+d-ZT2K&~p22gwdH!>KQj~YQm8J_kP9%S=_!T;ZEz@&Sr8+!tZejLu(< zc!*RqBgNX2bYJf-y;I&5}KD!Y5rJ^K=JuPS~Df`$Nb+JZw?~gON6Gx4>6RYdf{_=yM!Gf}>}b@ov*~PQ|2Oj01^PV`XtAW$j>c;Q!f4B672bR_#G;Z zqv(E3nW^M?Mjr~_Fdy}AvJQW_#rw7kp;yX8c#xp|hLl^e`3!4$$hmK2y}QBfl}fk! z>my!@ac&k#8-qEtecHVifi_jsC!g}Ml*`k_+08tFzeGuwuJ@0b?PJ6BpB@4fc!O_y zf&??@Pj#+iyh6t^3qH6a- ze8;}1n5^%dRJZT$yq{4oDZ(+P!v`DKbgh+-=nCiG+A+3pi=|q!sEcm>Ne4r*$WEju zWgI)_9A!!ir5ttsfbF+Mn5BBDqE>@PLq~lTs#IDDVs50e8nDsPP`u8*rwb-xYb5{( zqLOth#+aWT@JvZs21u2F6`v^N6#5$FFMitZ-7K2k%yW*AdQTc=UoF1Vzk^S%5BQPI zIlbd%+H6*~I25OGu0-)k4Ug3PzuT3zyl(bZP3~5*b;sL(k*;4@jlfd`bj>;QljMdR`3vO zX=Jld>Ta|B{1bjMzb6H-l#*~Do+kb$GMoi|D;I=EkG<`E{i!@6GENSWNf@#-*8@1iEz4`p&1s8gWN1aR z_~?sGM2Wq|p@2ApP&_R?R2JY*KRt&Cb1ETLeG0Jdgr$-WV8bP#5%HQ@!~X2CP}A@bULc>;w)_3k6n(R zzOJQC7~x`Jv_tAm39EDnL5;nFhdFF4oG(1UBNi0Pfb#C9_*w`J7T>&tCkkU$NP|WP zmnRj$fS!h|uLDp6Q(8)8#J^LhZ4MRg>_8HNAzX)9%y;uO$dEI1RFlXHy$tOaqkJoy z)ePl9;1)rcPSVoopSQibVvIV3sqJwIgcof4^y5xZ;eU9eqsBPDIQ{J>H;#g7%LX3ygVrWnSS3@o6 zRYiB>{6-ZAr)oRJlXHq4Anin>RTALWJ~9|0ZxC1dNeyii#=zqTEtBQu&-dXxil5`;S7!Z-2O(fS8^G{Xq*%43K^&1^PBN7SFB-SL}#b zU_fqB-Q!hj^^fJNgFsP%2yR6ELM4&KtxTSTZ1MVCm9(Jp#frt70ITWZ!GWLGBPmH& zX|l#Xs@}tkH$J+T!|HWM~NP5BB5W0#pQG51+F6hILKHe*K1|*%%VY1M|I>;JA5&5tUlTJ5znB(4S`a%r)NMzVN0 zqzI(4dm0m>S+M99mANb8HRgaMnwFZLwtw`x9#h-UDL-)zagEYlYSFqhJ$zLo9_G{@ znoW73F&ElJbRH*CC3_M_Z#df}{@mNyUc%8cFG+sybyIRy&5;n-$%l`2YH;b5)jvli z9u1ROvYAl$BO6K5^s7){g7OYDRCHm4mY%zzy~ zY^fbfXuQjHwfsl)(>E>JS?~Mm>NRt$>L&Ol=Qx^ZfeR0kzkWcgAw*aj|3+<>UUu7e(Qp=tEX;FE0^8YGk4{EU+G;d z!&O2buY0WPud8%?jwGUd;3UGfjXOBE#jgrReL(;I!U|bP-Q&T7fWWJPfB+N6KVDcz zH%p^G-qdN$C7bVRXg;Dpd@3|Mz=^RU4{vPQVke~Z&GH~ir-+F_i&L>=_17x>`xMDS zqu`cM)s%9TKXg{14wXr`WvZ(ozdy8YdXh3p=K4u*dvwvq?Xuuzlw; z+Msi}b&=Cby;SM{Vcmnap|Pw#=FsWBZ2ho)<9L~AHo1xghPK?Iq1B{*!@z@3XXSQJ zl?{5W(qe_H;!q9@eL0hiAYg4xB#&tach1YA;)q}Y|9;}kzZI?1szL_~7piU=4>`N_ zy*yf;_U`+LH=?*~w`p8bw<;$&Yik;P#{?Q#)!ScXT&3Iw6xynP-nMQ-&!oc_<3oyc zV$l_-U8TvaBHe3$ef5RPyL{X6fD*CfLPB@NF4zUZ&0-Sga>Sb>it}*{{(V(CPfWIs z_Hk!dF^#ZD{R3U0-TT{*j)y6;Wt8=Kv;7xHGbc;4K3wNrvoqPeH9hs#lJ;aMfj7mm zo+Q~%-ZvbL?fUuNoeBlsVfY&g0x3$w35{h^bA9->-^+C}ta5n9tFOaO*B{NE@Q6j){E#S%!fpO=1VANapf7%QFtMDW@Sv@;8WYnPnW| zUo9ahndcj`?R7VV?t!W2_oSu5OeF-p-WXELbjzvCp{a=-tsKjJLf@Uh`uRT138T2< zZPPVEm+p5BEz3D$80G~zSo8&WW4Myp1RHhSvOq8$!zm^`y^TE~JIK&Jmh({%sMv`8 zd z{%X-x44%1djA#KV#K3gz!A_XrcSXAudA#gXSKHMmXzEYBP?aBP0QJ&;Um83*#g>|v1 zBpR~c^oz{QQC+1aZZ9R4@r}5-8K1eC%KnJ)fM0kyChBW;`~!O1~b{Vhmhk(zYlDlAFK)w|Ve* zj^S{>uCNUZ)IaV{8r5uG8M7SF=dwKuU=7fd4pU=;wJ)n>2{QardouaF`vo`u!ozzk zFkFdp8TX5do&+BE;)3I$Hca(E`#dk9kKj|(Fzo|FKxtp;NSVRmUHWFH5m}blBdWyQ zhrp4U1YG=fW3#F_YeYfbWtZY85yq+)nrcF_GsbTb&FIt zvRl3mTD;PXZ$Ks?&N>;SquDWaePLokknWsku`U(6^I{WW3Lu)#*1g10%0}t>nP*c1A>WlU{LtKArpTRp6h30Ib8^*IGqoMu?L>%%nfD< zItL;Ek#?jgg8cZYlFU}yny4T09L!D^I1Ac>H$RgfU`#%c6%r)wCU&NGUR>RR7GBwUG)M%Ql>@VV{ z)>inB?MB67<9)5oSw|CXfvw}@9zy*|)+f{LNw$A7#?8jh6OX^dujpJaz0cFs7QNGf z--30WwFJA1MGZOJR8f4cHXJX9)~hUDF?gipF1IhipH^JSIt|_of%>hgl)+SA`w|V2fOSq0Rac)T=X-%p0iHmkSn4fBHPEm6*s;0q zN<57+GuzWuMv6B;cGTN9m9*(>^}y&a%|nz(o%jK+{g6gK^%FjU_OF; zP9tG9kz&;rxA04Aw}$=eas@KtFiC4tMGe{pd7+}3Zj|khXnE6B&5)>TF@T{{6Q>Ia zfLLvFE%XKc^Krcjc(71kUhpT;1|Di@Yz{k6=z#}~g!;?OV2jOCZndG)8GL{pA`6`l z-YnmGjClx&w(DWhYTAuy2ENsJS9Wi=Hm75*;cTMjr-aS4;v|Wcthnv`p|EC-d9Uy%%=;$v?8-YOia!`x{roU|V_1V``(Q;@WYjwWIf}SrV{8`d z&1UoMIy^GdBL|v56>Lt{@s{*NSd{gOs`qCx5>tb?bEk6gK{0M2LF2HnkFD=mgwHbW zwvlwge9kzc1-ER%$Zyk!0&qk!yzQNDH*az#RgYV|*u-UxRl?F+*BB@r?#tWKGMZyy zNMmtDK-LlYo4=($I-MWATVKftTY2&j5Y5L6rn}wf4ai?dlKIAaFDSszZi*Z-_Fy8* z1Gd@gl5sMzQwN(<3i}f!BzA&|pB)BMUKz9YGljIfp(HjAIl_A>2W@?b-8++$HQbROcO)TW89CeT&Jst{^GQ969-L2Ttd zptc5nXaSp)1of9H&$ZkUfB=^|Un&{!HFgiIOrlT~_-+Ke_&^AGPqu<@+17F_}#P2Db$tj>yGeUjE6stdfw2rudnY01>m zId{?@*mVNNmZU8{?~B8r;;82gaD~)IoyIwBkb+>-3Z9qx!obF5>_lYD43y^kTFLgy zEa;Oi@CvRO3^}v~>UEe zJ&=3M#EeTDa$Q2C!zx4wS@|L0mM6!1G*$KJ^Dvt%idYSPW{i)ymfD(!-XGVe%Fd?0P;<@;IcX^i}JjQU|~3%@+gR3mg`(#=-N zil<={&Jv+EV}3-lpOd^FpH07WtNe+ltJ;#E*q4@Ra5p8}PKc(xQ~kRD|1GY#1v=7b zEl-6prl5C}v1a4DN^*P|?^uNk-trod__MWG%UKVeiu7jS%Sm(fEK>!0G(p*M1UBE; z*c9)7Tjfs55gcWv-cX88bFz#=3-kBPnQKG75Qc(!J8JL5Gj!}C5%i_hm=;l3Gw`$G zr|+AZZFV$CeVQ@^pU5&tZullAw>vwc$KTfsiE##yW$!WJB&(w4aV zGnW6ZJO3{@`z`0~4}dT>0^!64o`JQ7Ut-T&WdF%<|BbG+c^3n6;8ox<|8Q$UT7rVa zhNT42;taQMRBu8EE$qm7UwyePksV}riMV2tQw%#2EA5BWEqQu6g&W6METVnr3w2<@9+;+x36UqS&Tvjxq?9nu~TzQ9t zqFDJ9|D$Jg<@58Pr%clIZP0RCyg9(5x<-MW?Md30J9pf;~@(1;TVP!U_>yKhbH(x*G9Y zmk5T_gTCpue}?kk^_ahGApS2@%?QMMMuBL41y&76exdqb8oxIaf596yU=GfRz;_(@ z=s(UqBlRjP&ea|^P*d<0v~z~Wv01ml?DWcsA`k(>eOG>QGPbTMG-Eoc8pxJ0bprq7 zA8rlj|KVzKaSt*M02i@^IoBQ!>AZ9{dD+h#&q=x-C!{Qa3~oTViza{2pDxtbouzX7 znL8eP3-t9o5;o?nbajX4sIPU060`{+!FTMb-Q>Nkw)x8AH$!)(yxc*jx{&D)&7bVcxN&Wlv3Jt3Otj*#Dj&H+w@x_yDmu z1nzJ=Gicrm+E_aRc^o=QZnj1aTF+IK(zqe(P6lM*tN2@_=z3-So$O*Nu+Ry*_qh{D zwui7GCzAMQw|6pNN?`H=5Gi6I%vayvF`w$zuyLvjv=7dwUR2{two4RHy&IapI_LH> zh859^ANwZojm_7RrMV49iXERJ%RKZgwZS=kY7R{Y%y25Ssil>7+#6aF1LWMv@qr?>tv>8XKAIK8zRfHP$ye% z4+z*v=&OT)H<1o!DK05c8Cdf3@Yf>=gwh%2WwKsh-JDuQT#xUz#rAd zU$nlL9s@cJ1Qdi2c$6alpZ@!0;D57wo@4p1_Dth(ApTF(e%a~E*#4~ZtJB0kb^dr+ z{$FR$!R}Xk?(Dh!g}M0mNxtMRJ`4Zq@6BJ;{>@~3Iog+Wyx-a}z(@VhPX9yBd#V1C zRrXsQ4#Sf~UB^8cssca++ILF&)Q|8k%&mx$+nexbDW zSGE6IFkaeuN$2`)$M4s8|3>cme}jJ}G5u=KvmFEm72x3iLTUQDmtT^ao;81s|NMpK z3yRar3B0V!|2E_f3~In3{8yF!rG=M;!rvCCF@9P2vuybP=Kpu+i2_TGz|Q}(tNi!L zzuZ^;-J|ti)qd|XzZ~+*;`eU@aA<$@`&YmJzd=7!Z+^9BrwzdTsr)Aq=XvD+JAgc| zy1&}9E*#lQ-T$n?f1mryRruM$FUNEJgM}As@=GjUvV(pby!fx_{5B;g3He6=Lcg7Ld*X=?>|Z?oR0j3F&U>Zlt?I%Ava(d4t~jh4*{+z5U0Y z!^~Q1@AF%S-`OkVq#>aYz@EoP+3y0+pZ^~4pbJB5135cu8+%4MkQfH&3%H+RsQ37M zeBfYU;t*h9D1Q~xv$0`tv9e5y9g~7&M(I8FJ4UgqFbfNgw+y|3MaFV3TrqH}Lpq=! zX4Tfn_!?~NnH?Ra~i?a4&6_Mps9xx9!Z5_JVdEbx21+?E!#A#R8 zdJ)MjJjpPZ=Nx@XPn1#o$j2SUFF=OauMp53UJ=|S0>?&M$VNc6K%RF}IT^p$fYC-( z>dR_9i^+usTtAWM2pf8=Dl&R_3d`pQA}p8TBwzw`z zs+j@4t5)TCgs(zqn~aX%hf$_Ej_g==8FQu$QepRum&{uSvZQQ~EIRw9wK;5sm5wr+ zpTMb$uRj&k&wY&QGog-MX{|L{U933F!mSNbI>1f!i6n(@4nUM9Uvp%hi}?XYaOtZV z^s>IYQA3>Tvi!@CZusG>*%(myVj21VOC>f*SR&P#aj=89ig|87nW{ z&4dxS3jHKJ;GSBOYM)rwT?Eg z)5EtiTZKE6)DJ?gbW5nr{z8GFiyEOcCv>VC=>3Fb2jOD7uM=Cu4b2w_jMY`)lPQU&jn zVn~~yEC~2Pbv$wAAE!J_lRs`V6=7tlzscSwU)g@N9CbV0S<$d%GRf^bLw8}5$w4%SxB$mhk3JtN<2=gPbP(a zF}%*;5&FAe=YqTBRM|KgxnzOx!|F(qBCpE?5O{ynGUm>x-ag381!n+TrhpQN4JBl| zjAZ`FZ`%sV07Y%CxE#M0jhYJqadzQS`ONf!Ec|r<60gt##z9)D3Y>b|tE$?psDyWJ zR)+f?W=;~E=BE!k z3MVR)*>u$T(MqL0sF8O4SO-|&u?=G5vW-*s@S&!Pl6?efCo8<3F4iiShqd{U4d&p0 z6R`ET1+Vr2Voc;rBw6ix5^&^nf~$Id3@@K*)U_;+Lbv*EXpEJ$`=E=Ys|>kTn4~0? zXQW$(nU^-&7c!@cMx%!L!Jc9LXM%wQ!Rli9lUn{+;N>p?XKOnPds8DLhu>)k)-qvJ z9|{bt2^kCw`#)rVsxbegBh{tI94-`3U9%@}^?M#IJ5qddoRNU&(waB8GFN8@6taG} zOo*~O$rY9j2dJ+R)2i-tskPaBW@(DX_{1?H36p|OuQ0q; z$@Rua2gL(J%q_SiZFH!BA{X`D6x@l7eW%L_f~ZwvB*?mp6(( zBB9HP<|qirdj!liyjOD3b#cX^>32gGP-XCOG&qMSw$qdHwHDko@f=HVMTVju{nAEVSYCWhyO8)KJ!%7)NIL>vUPtzi_qtp#30 zSL+ZMtR-;zD@RWucwS+-k8L98UAzMnD>T+)d+|pHh=k*1xkq36PhOy`LwUFv?BreD zA|CtaCZ4Uh=3fLh-{Zf~CWyD`e$|T_W^E{p=Hm^KvFS|`|E}E?@y40*yyz_umD@^U z&l6pT3KzMGHx|8(!csWS8%Ww*I*x8`xN2HUd3xJLR35^YLK3Ee#yaw}f0H=7J}IhP3fB5=aOS>2E@_>1kD7RZ zc0lFek#>(4+&UN{J!bR=WK6AMMdk_rZw{zp(Son^6edKIlpIidX_}o;?}-D%pr%AxT%4N<@y;{L4-PuU_srK{k1|%aTGUxCXaQ9fa#kE+tNrdD7-lE>Mh76&?gEO_g;ns1{|zbY8`d-ow9WLm%Ut5KYfhKN8SjS~=J;|O10 z;E3j2kOP;J^(#&*W?PVROjn?aKngx2=EzO!3c~0}x$b&RN+1FEutMA$Z2ekd?4wNK z9*;<&R2-c0H3jO4?GrY7ZI+NI{X_#3M{#DafT=S}c$)c={@wg|JU$Ow*}%vA12mE- z^fOJiK9e&_hEZD;4R~(B(sCq4mHukK1{1bd3iGNN)c)Pd=MKKC48B&~wd;;v+41bi zHqmQd$N}2+w0+#vFHe!VsK9Y*g4fw-Uslq_Px)bT8GC$+9~D{;By?R=yuS1P-%0NI z6a^wV2U8;}qu)+Z0Q|)9C1@}(BAj2Zm_NjR3jbuTLvZ8jn8yW&Q*2qWR6GpP&Y5KV=+MZ~vL zrB%o_@9QU~*ViRGN?ivIpCC0h*zVacXcylR$Uyk7UN)0rj^7mkXMroaXNwX6jK@m98UqjR`v z-$xuFCzdYcykmJXGTxmV<;QJRrwXNUSv`?W7|revnNJAKT|}Qh>~g!ZF;JGxy}sPi z+0}(C)atv`d^B!XzncQXfci4|Ic&GOa&_gH9ibF_@GXzWwMOejVu%-@STN*=2SY6vZ6kd8WUqgBvvKJOiP9T&_l8<}r1PWTNU0Y-z3H>-) zq*7@r6F)qB`&N!cB_np$>=lXZ4AhrDZfL+4w&+c7_Un$({Bl}fCqN`U#sso`j79%AJ)>0Z~N z!5f!rE{R}77ptp|?>ynR0JOeg&hI@C1k7UBILI<4t6$W_HE1~*SWdLa$kWINDAMs=hRZNJl^*dEt7t_@bR@q=-(99$;U^i54)33* z$<3Ppmn34ee7)r$`$^)H4))a4dH~VK4~MF;-@j;o}`e2N;6I|$*r!J zlDMh!QC~5nFkI`C9Xg|uT7{>b`yr(`^X~~dRhq`I{F*aAQ{)->7E-bv^>4Bdm)_xz z?n3F6u@D_3>QIvLDYl&BtPDBztpa-*U03;9^eRliU5P0e?M1?=d{q>_zMh7%orVW_?psX&Bttj8}8=AEKV>0y+kFCKCIwurJ+uT<1( z@aY(6ufvqeD#6T+RMrAEIvb0DoO|yf#B8jDFh0_}b1ibK`X-D@x;OBE z75`cfLyXqb%=3FK(UNCMbioqYCVm74o2N|u3vESkPJ8g1v?37X3i!_ z^M(!_tL?f~O4Y?HrCWG0$rs*@ZVfPbc7a(tBCyqE4{M3_Eeev?29mtFK9zy?5_SZBt7E{BQGNR+Oba~68>_^_lE_X~%}$!+lAYO9J4IN?Bzh?=WWsUDNt_c` zvtgx832qBM9n1WImlh7<2tOZYBnxt2-j82OT?T2|f9?~w<{)Ru~*j&aziY7x|} z2TTYGMG6!)iI+TFwijv6$Ket}6=>lW7>G2(7<3U(BDSw+Ua0Egx@Sl~q3mm3yWl6?IF=C5KUc zHGqO-p_Tj#X(KWXC-m|uoS}|`PWvNM3O?b)Le_CQL7vePnBBasDg^T=8P?IzX)da{ zyR?MAZB#`m9V3LQ!hqIt!G*qK+5V!o&GuuxM%y}Ld66*#p`2SKo}=-eLS_v7N4nlw z(anhY(2pKjnA^72^T(f^2^=1u{Ar5fy=1d#Ua_l1+g%rkdH)t#E)sURoP&H#4+>pC zk;}8MpFmxd=ITyb_Wq^tTp6p+u$B5?*v=$;_fba0hji zFV({s|7r)9hh<;G#0pOt9%pp zglHAYQ}Bc2MmU5uQ{=J>lM|!~iYPMBw>?z+#~bHbt^3ol(V!Be;UflzCHX251acNW zfQY1q;?p9svrvj<=HiQ-@OSh}(_%o)3xeUr4y%W^2moi=H-q%|-W^fKhlo4yk;r_$ zL)(X5OX$t&$L$2bwzaPu8uWL-SIx`chrAveX$5~!Q!%HfLhpa3T+ZNsg8n-fkg7Qc zpd*5T4XA>FA^nRB99%7pev-h9*0S|CHB4{u@7`auIw47Lq7H9uIN~M&`eu31Wz!_Y z;KiSD-s!Jb`u8c4heabSqp2z7D*JX-p$(Nwxn`=Xp=cg{Xnq2ir0||H+8kZ>@i}j~ z^}@3n6u1^1Hg4ZLk2UIEZC&QH(Joi|`vTqR8=K1eV-Fo4%7KUV8^FUuvRk32?N&G#qwBo@a8=&z8n!Q5FxJ%;&+^L-8tgmbI9TRF~Rc|-Qx&T}U6xyp# z@7lIuXVVdj382Nga2N{IuG3`KkRNm!UY62$Rct#PP$QLGO1)pT4R(IvYBBZtYQ&2x zn&-zjqGnY(e{8m{&T&_FF`cMb{Ubx6t>#^j!(r-NIdy&BT>mBV?8)++H}6IF+-&xf zX_)nL;)WCn!nrc#t(eHubgpV4hFVGrOV==M7D!cw+OdZ_ zUw0SIqsE>bo*vGfUyZosTld^4Tr*6q3!^2HwMb}uX`hRgQS|lBm&98i39A&+7>PQ; z^OZrF&n?9ww+V8L@eHf^fZSXy$z|U;Wj9c~bx8j*kpsUaNb-kW$S@A?Xv<>N2ryTE zj(#fnGuy^6*91M61FKw7a>_y>`Zhx`qG2+YvmJ??CV^};qk->ML~mr(xGaC4P}~pA zTxpXYYsXpbLYVD?@2oHUZ7m!t^-_t4O@+zTOc|4?OLa8cjBFdQ5Ikb!!vdl4lU}^1 z+G+T}137MPXao1IjzfWhQhngd0^Nu-UKU7Fdv{%`e znoDA!`%Oz_XOHSCE%AEcF}HRk&CLYN%~bYBjHkwH_xA32C9Q&H*@(*6O9rc$*{t4f z;N{4duv;h#&y)-urB*&*CacqO4NG_t>xrEq!n5LE(6{@|BEDpe)s;w!c@XMqIq;SG z%!Uj75odsr?5A9Q*!!X55z~2H39Fwf&yuQaP(Ep8LLcA%GW0aYG$qLa*uQ?rL|n>L zXsJ~#>x$=btE=5zY(=3M@vZh2_<{T=%o2Fjjl%J=o})Rk_SiiU@l!$o$!&&Q*AHsT zgu0CrusWW&KpP9}yVG*{K(^4vF)L}uOqyXU1ak_FQLEQDib?cEZ$6cn^42e_3=k$m zjygWFefBK)+}12 z*8Ex0jBR$tO8@;vpMQ`f8l-$#l6L->>7|vgi{Oqhx4OMF%$|`a zrUlG2bh4all{8gTppbYI#hOuJ{(&{>M@xYns2OXuS?9x0dtle!C zx?Tzu2#=~etj$Kg6vw-ynBTh~lj`||hl_fiP}(hgJr8xOMc zo+bGDLAYzMm&8J5nt*>&bZzVigm0NIAyUOq~V-%&w%tj~HuEO__x$ zycGe{mt46aIqNKTBAA6QS1BLk8%6;J&FN=_KsN+sTZzqKMH|J>1yzGYxkors$tAW)zxdsREZH27Lo^P?)Z?zf6;@o$yv@VAk_H^-WX48EpzB%eV`K$aLHS4P8p;ZhBx zF;&;m&GzZG&8)gZvlx(RkxB?=VrYy3nAL8Gq2^7ZiGO~r60b6Jh9waotw1-FF*8Fe zPc(BjOEB#|4VuG;KvSuas|9kT3uv0HYN>@4Zvjmf>MM)>B;^V9SMTYEG~MNT*vA_l z9JL@Lq>ITTUDj(0{G7LPJl$$Uk;8D&-FL@hVzqVcs5N4Pw#8eAj%G-Im@Yu1+jRnN z#7mSX()qXpohJ^R$Rf0QXKlb>=_zt25_ntys)Kbv=zK#>o4U;JeJ z$8WrvCSHUbyRMSip;IcpA!PN$C926PWQBq|kPhI zxcJwro?X&8OBCUC6g}c(vQi~b%S7)*l=Y_dv)OiI=*=vXm@Ju5*&z=|DncY=pU(C!C#J-= z3ERA{O5R~xuKS~DMF*y-DYsFSNwO}SsQKbFbfn&SaPWGu5qs^OFPtR#ahD3b_T@Hf z53tsIU(s=)&_OgsOZ~bDr4tO@v(}s?Gg(K^l439c#rgSS4T1c%%!@v=(%g`bqg657 zU6u*En7u)Lr4&7u`Ks8j2^v#S8lMGSHui)z5Wd73t3>qCd2F7NsDZv4?wWWHo(ia7 z;^4JgXKL}0$yZh2Sc3`2)K0>O*6~dexeW3+K=YM(rO$y*8;%sEt{uGaERFJ^G~$=p zj<-pmD~JlP9{mb1+F^lTzw;Vf2n`#%1y-)dXrhyFPCe^>!xd%FH1o^ylxS;~(uI@k zyYi_hU#<@N;6nRYNnX8gJ>@)2bZ1+_nfAs@LcPY&=@G{Dl!d@N#v0GJ)Qc%M;|&Qb z!rcPt9ZyX50d7!}LF|g0pbSk7QcZ1C7bna~75M`r5@Z4Slc967-oZi2o`&MWhw|MN zZB175r8gGrt*x!q2DqWcHQorm%Uy6%y7amcvx`+dtxqm z#qn7T>`+vtr$Cwe>xG~u2;L#Bls)~7uKu}z1Oqxf>)IJv{$4n8=W=R!0{ylMD(-;} z+W(Sac$O>!m9Bf3ewD7b+GLzDQ5PH-Ne*NTJ$;e@PvaEmvFe9yt%CA&(@n5Z$+ugn zs~(2Uua}8*nDZlB{2b-|1g!g=+T>3>T-28RBuZOnAYGMgx}ci(&h+mC{I_`H7a7Q6 zv^^BYSw6m@jx(FsRgx3Pc*8DQ!2Q;M)SsjEgWQL~GqK(b0y!DpuPZdc?#(c^T!AgO z*4D-QqicN0Il^PCv>Qq>X^xiBnBo2&IrHr(m!dE*++%i*{6ojiQXfmpjOmd?wE~kA zL%(fmwcFAq_i4!zhLUHF+zL!hZFhCXOlZ~&N$>=aXYW6evGnz9B)amm>q^+2(U&;? zpNZ^$g0tUp!R`PAV-pBYT+k;dp#3HG*Rb|q=*pOPGob`t2d)SXwPJ36S_wVr^Y#&1E|JssA!Y#OXA*gBetYAK=1c$0W`kOXJ9uw@)mJlTY2*o(o3!yZ`@tn`&?|24J%>e?jTb3znSP=je~HD5nUoi+#Q6QhXCXi}5^m>6rn7^- znfAX2b%m!I_9md99|@H3f37EM3R{10F#6!2tK@29WUu`k_?N{G$wDw=1YJ|Kb?0ib zD%$9U>%Ct$DkA$1Iepc^c9EFwcXE|Z{T@QlH#}96=kT`u>7n(77_CJpxyba&OsVdr z8n~=m-g2oiVce&)bj+jx#V!|Ec1_5tiIY2XCUw{jzheB^Qb}rFo5(6~+An9|cq0JM z8j=a7Q5O_D2ICHE_trNIt$r?x;c)XoTbO4%k)eCnZnV+Bv?+2{9(v%RC@I;ar z#WsgMAB7L_n95u1^E*DAhW@8H0Zv=a9d$<$*&!N&%vj8=2+|x4XLfj=0fZL7fcs-4KurWacDEZ$wYY>TODr)xRyJU8HYfRU31hrsxmWc$_3^1Ek1&H)1l zBLdAD#Q*50Uk3hn#(6gIt1qUT;NRTx`=Y-y(6h#`MYsRZ`S~C7-xhnWE&UqLO*qfv zFa0`yzscV_cAkZQtw;G+wSV>R{Jz`Yn^6ALjs-o^e=Pd%mXzPsfA6LEQyl@6?)+2z zkIst!cGJ&Y1HZ=eP3wVjXdt@zZwh}$37P0G{Pg=qep$kqZ%$Qp_ftL9Q`L{6EF=^H*i#EqSQC2s{da>0-IxMQ6deF|@0k=qVwj)@aKFTi zi1A z*vx`G&D~4Gmz)JJ0tMO{P8a+ei6`_aqrLWow;^_xow+o?F1s4XOFppF>Ev4oo_@PRjn4Qd(nw@BebOML^+8CZ{~c))fP>i+)LyYl zvYpJBfy>a3qJ18zHL33t>pBY|+kMT&PZ%g%bSk7pF%B+|5O5dL=Gj`A*l;ng?6sbq&5Nfj14Ue$qsi+gUve&|_L(R6u z#mfVS$GW-GjjiWkC~9L|sF}(v$qUaks=HIFP`|>Yp|Q4Oyxg2r`VJxLMUl-PTTQO) zol*p8_c03szF+I5B+Jhe9_I0%H<>Ch3N+sp?tqu}LDs|WC)-Qf_Us(;FJ9*`ejFiQ zuixx^&uK}m+DHde(90zY1mCq((agH%VdJB&-779|l5O2d025fo3cJg1ym11qF2@Er z&3TX=x8+OU?Za+5Ilk9nRE&uZ2r$L$UXPWVaE-+{U2+z1Th7})5EG zkmk93$4Wv3CZ2S6E{VDPPu#uR1&66XxTAn@fAJ68o!&bFY@U$MjTw1DzURmfggn1| z3d4MOoyi0AnsED^hxA10C)87G-F4H52a{H7KMNO}32dn{S|Bcz zi2Wk6Ws=_y8)OqS&6%Py!deU(E(FBsxeK*Z^K*)Df&gSbkvYu$^i*{?trncB+N`LA zH|{p3d!81~QdbXc;)OT#feyijp8nU?>4|o?9lmS;Cp&L(=ah_n>uP=leNI_{)t<~G z+im4z_3>@{4I*tqPssk?+w6NNw@q1y5C50B?7m5YOV0;nc4 zaO-2R_4xTXdvX%Yl+0vVtwvICl=Q;OMt+Pak2PAl)`y{6J=e5v)%1Fx3uUWJxt5q^ zq}8Tmn+91HHd^O0Cklt71_i*LVExbW1rh|StM#+Ua>9$k%>}|8|6h>>Bwzxtu`#oC ze9!V5^ko?k=-o%q%cNq*GD*$^+0{FWnno*u=2u{q{5ps?Dh_MOEq+NYL4cKoZ4cM4 zb^dyYq#Jje8v}hwrY&qKHti+{B^xKyYe?3s{qwdI2Agx6uixRuGbA`;Q+PveoSmOj z(4?^#Lb9?}P`hD?u)Tl?LkRDPv1%J1o_EWEkZwhvbycKP2WvNHiOi-mQnhhQDVR~@ zj_M>EN_-P`*T{#yD8WNtkllKj)oq71*r|Q`Exx+!gO&_YjExT=mK%N)dvh>*yGxy# z_9=lv$GhQ=3XdPW?mfNhDhlEyx9$0Wb#nV7L0P3*WWDM&EzK9L)(c?oW()kra|6)s zv0dFiU`y81>C_wKu*cDVoy~d49v#Yi@qKc7T*GX>P{`FYJVcJi!CcERD_B6%y+1X&_(FLxX`4Jd<>`u@?KS#li@>k5F9(q%xy@ zh^l!6Zz!iAt+CLCEy%NVTcEN@ztrSjfvWEg+D9aP*zL3fu8OaN@#gO5Dr zku*i7njZX6MoE@I!LBWHwdz}ZpNJ8Tia6zN3@0_zcp|p-C(1K)F4+_ToKKc`1!QJX zHew^>-AaRgFWaycnn$$y3JIm$nF5EH5=%*vK?7$ai2J9}ZT;Gh1eqzWt!5#D1m>v#5Ipr8a~<#O{HVfM%E z14qqgn!o4sB1`J~sWBNUZaZxnT7pB%5S8vgU>0$&dwne&wR{5~ENtN4#fsS%o49Pn zRK?V?OuX=_=weiQkC&t`VQo1x#v3#7O4&+sJMl4lfcessgWD-iFRr-goVe9>Xw;zeR{uPY?V3(MPOEbC=UWiRmKMbx zJFgPtT3TKHj-uD=CDxdjFu8*z_f3P8kjCAOTC}*YHVVHoQ{Lo0* zOsG%VuD=(5i4$#w^@d!`z{=8l>GKN%5z%1>XKd$Q49TGBA%`7$9XBeY9wk&Q_^pxp zeR8g0l7?6KDknwbr4VFmtNGLjjlB-Mas$-(P;T#of)^QZ=uax!%p29QuG<-?*={0V z6zoc4kBbgF6DqB!arl4hbMtR;EnXMtPZ$!6$8=j?!nocMGsZx`5I!T>!!hZj>0}sGP05Hoy`m{= zT+DRSfzkhrq>ieEB-`#ym&MFwVoG@}u7}t>D8h||b+p+Zx-xI7oYGdyjwf0N34@lQ z4Oy1!%USgkFY~&KMar+U)ziuL& zZ%eKj=%PJi*adctKWf}XVq+kDi)*nP-p9r6^r??6&BUxuR;?I?{Fc4&4G~^TG$7f) zJVl3vTXa*GV0+`Xpx_XCARaSsI|QCfTjPz!bqDEaUm0@h6_7=VzYVB#%a3k9P=fR> zAY+?}>lGw=xXN{+QU)_YJPRXNp2%>3Gd4BTF>V|piow7UMp(Idjqtq{yK?^Ot%vm; z@qZ6RPYD<3d&kk-%*O25XOSFX;^+cs3nsz){W)wq;K*DTA>A#bN5|`rt8g!&iq3Bavp4L1-h3o^rjSTOtKW>{#~QYZpoX zD8{=_(bUN3W;BP_@9FQ08;L*IK_B$uzM6%+Q{B&uB$fppsM3=87*Q}*BIO@jcewgd zcy20DZfrx{Q`JC)Fp|OJ`&31>|jh*pT z=?uZemi~?bWPxtah0epdNJ%qt^%};QfL;o>$t<2PuJ^_keQy zC948&#B$+=$6Ndl%-bTE3{5bb*WLIn`T!fJJ#2k{2haD&%SDG5y9^*H7Rnt*WIY@9 z`o^%S#Ax^&SOwQcCE}Vogdeh)s-jwYmZ9*nn|a!@qmbROV2VPa6w>_MBgatCimiHL zeaSD5qQxpzCo&1c!++c;l1zV`4F3ej)o0q%`iXQFUADa3;Qspd8{5%ESbl!grwoDH z&GVD>2}!{pE%cp`@e+Bf#Ye5zcMETtTR(YS?e=NdHZh;HKAz73T0iW-bO>m(y5C$( z2!0aux*7W6{qwjBe0km6xH-lY^ z!rQa2U2t;ME$^z4YT~}=I-6LJHOVW{Dg~&}^IwF^vpAO=3XrPnMoF~+4PWdmzFHC> z8;%a|ou&PpI|eRI!t@?TSgIB)HOFH~Ag4_2>bNo@0NJ;|{~k_-E_`NGF1u^fAppY? z<{qtYR@{N>hi}LpB0MmX*-T%sOXQ2St-WS>%sBxG@nH?|n42+q1BFV`h-g=G$bO{- zr-bxY2Z}U)>TJ|EOc_kKdZ1%_RC2TEq)RWP3}@aQQM>xr5p2K4%rvT8Gv9(&Y=^y@ zuLnzR35R!}j7nKa_7nAAQShrYo#8DFIQJ~CcQv@7sCT))I25EF<7bxzn9O4BG3+*r zv}%|?dY6x;UY;(@Z02J6%M^DSeps9Sab&uF;vqs!*w6hfNF<{TnmyAF%)ej3fXCjA zaKQMwz?oIfaFr~wCZY#;AJFTHn}eiq^xA+sL~NA@L%$p9JN`w*M19AEmP1#^{j^qb zA;DWlB8a|C*IK2>&IsYH?YCBLakPt8buld`jBwNooTNr_Z{ud2qsI83y$=d@ zT&|HNn=IWMI&h@6<3=^r;AIK@9MU*{c;^d%+`D@eKMboHOIjaN^yAR{L`gP^WA!S` zDzk@D_B;{ip&7rgA5ZPYs&TOhzhR!eEX!^BoYR`X!rX#o_0b2Plm>s5OBs0@sc1@m zpe*M7?5xuWhjI*?*!wv)1~nzUiBjWfq%e*OjDfJ%ZvInbU89UcC>gR>MH_WE+Vu_! z)QwP3P2m|id!KShaVHbwv?ejvo$%CC^up(xO)A^i3exkXaf_C9zvzYN%#o)}w66s6 z2+o$OGa$)h|BxZHc<2ngL4+g_1UuPoZ~TszK!yW{JpTauv}OD$z9nq9Cy0Ym9X{Es~F zWgE;~=`fs-P-E(zm!@Qc4NB%@iN7NEVEJ}C)mm8(&~!1T-^>IMmsNfcc=L0-Z?k8k z_T|#*7s7~xV=v)+6W$LU_$Rm(2mQFp;idX5Xy0M-E|XU=g2+F#phbp5jJ<{*p6@9> zHSl>XknX6x(H{du`a^NCIY=N7c~L;W$qKVh#koGU#C!Oj3m22lSb z0>%J<)i1B6|Q!gH4=3eqEW!7Tj_4@aF+3pq2UfRBpu7b>p?dQ zoYmSzNjdRMy%=zWs~yRfGQkRn)P+R-2mxMwxwM6q8ct+im4(>!z>;I*+RhH8rGae> zovIhB(Qd=antkWGe#{IZ5DF1C1~?_-ggVaF2#Z`+Tqt`os4Bv3o6rIcBFCPIY$$i? zkYdHVz(nV9#GYUkn`u0@XmMB5@~V$BLcuXS8Ye*eJ03hYaH_LZdSc8fS`pb=x?};} z3kQ?tgF*{;za7MmW9+*m#VqXM+ zUn_^ErI&asoJuZyzEGA2J}5>3mn$3#X*LV3=7>MfUIow-%AKR@)2VPR4{&gvX{aG}lVUJya9o{qEs^__QHl=A`iIn=AWPi>oLZ|iqL zytI#6h+U={ImeQm-cEgL*Nnmp9^G30T@Dr2nMF8 z2?hpA7Jt2$j&9awzh1~G-9^B6O)PK8HSY@Dc1SY3sDm3jj<|6-V~bqq(n&H>@FGz9 zX1rSI-=jhq7LBlop{e>=&9|cpW1vjNEmKPqP3OS2@lozw3f~En-Qh(Kzsr_;H$0n3 zzFWaT!;d?ckp_dyt&5x%y2VO=-*pd$hOcG4u?J4~W$Op^8%Im5GbvT(NV(6)!)&Hd?opk<2Id7?pFOcXLVJ(=ZIK4tNO3 z#l#I6GK4d=S2q%3j}NEzj=taI9s+U|9&q`4a|1XE#ps>%fE7{vD_;y+1s0^dVjttH zCOzP<3Jpwn*}OBd`MpQ_+Sf_P9In zr|NUCb0!R0J%2{m@l^PMJH`epPV}+Oi?1bm!Gg&WsgvR1Burj5`yOfg(`zM}^19o* zU*4~u2`&mg-Y<$*f7&6aY?*8xaJ-HVpoC|N#oj-vHJwmh$*{nXbUiaJiB>-&=aV#i z0mVU6EDoP$q-VNJR=Uu6XpJ$fdt9SiRpjOo=ASDMTW%EFs!R4BCW@`R&iahYV$x~A zk?IvPH=BYZBFZ9?s%73=j@_?m7FO^VlY_Y0y(I7{R9@9)OS+p^k;|hPlTY^PVmtD(0!_5`nGh1nfxX&0I!dUV$kupp$h>!r%>N6 zIp$uZBYXn~W6KOxb&Z)50fjBrKQbG27Xc5}f4hAU}E$2B~-#A>6LB^QgB*sO# zl1_Xi8!8nSr?3^|E~9-iQRlIebJ@qVJHXV~CxR z5Q`a+5R0CW5VKbzX#9yb9Q4^WoIC^<;dDhe#e(-oEF68hY~0K=_k%cn54+I}@K9O! z;fq`=<|SrX>qtG&N}{%n~?++^L+#rW64xOE;$e#Z|m3LG)jSR2784FQ`c z*Q`Y`V?)z=^=%aTE8$NI z&$m%hsv2#yujU>i#85A{huTmN6r|o*(ikoUs^tb*l?4eB>uYor^6(2g zQ>u!mV095?w`Ql4CVs4Hcn+1Fr}Rq<#OyXvM(Qw} zYE>w(4Rw2HQTq7GB2z;*&;hO(M`%6bTfCULOGf*Gzv7TYuvdA7nntB(fz>u zl{~IDW(mSli)`_%8o;BfU824zvoUlvo-d}A>7{Fzr}^g8-US;x!^B-Klv5Z9oXWd0 zMU=F}(TTD}6tuX%q}RWV^dudXwi*y9ms*>mVFUqGP#tIT%0A; zrHPvi(QrwhH4_Dki#4)^iZ)C63$6-4SKK7fMRVYEn&{;T=u%?lW`!E*3c5^JHPyn3 z>(T)Z+O-qwFEfL!GVO2nzQEuosmi`Q>9BeOeKaU}cWxd=g#DW8ay*Nivaw}DxrPFH zB+5N$u~_nctO}ZM(+_wYrCyxP@8N)Ol)Z2uh2Icfx(bG(Ehm*j=X9K07H`vosL;o+ zO|XTGHfh$7LDs@u%ti&*c|9tb0O^V=lZ@?1bKS4nJ3k zF%Z5A`bz~I3VNKPQ**Z51tdwh$m80`2S-Vz#bd*N6>JMG>L~aoW-(08J3h;7G;2&| zj!!A`)jg5|ejWP-c&srQ5%CyeVO%?p$BCVzpg3%@Pl7)*zfz6Q#zwU&LKK{)-iw&D zpPN%VIq?BKQ1njlQr*OhgpW6%JmyH^>L^0+nk;wI9vo2-Vjk{PrN+@K)=dfPa_261xu>}dO11KXB|o3vQ>7> z9w$!)CJ%w6Ay>QS;eMHgx%Z!gi=jJ45Td_CsOUfn`1OCMNgY*}b)E(;0a3$iQU|tX zkZy0O(neJv74Ce{###BfSG1!w>hB>si=0UFf~Lu%frMWR6zi zTd+U_A{{`@%VecP65v0pQF*{QSDhGcOSV@ioymclh^vJ6IRj$p_J7nwVL%_!1`cM{ z&yQt1xSX3FLH{j-l3>s`_rGKqpCn5`ElmS}@L8e#0Y0-J6CfTF$O6@Flj=m;C#hH6Z@lXWy!xW8x4Y%AJ@I1CK;h=Y^B zz>$kgP)X@q24r#Fz+{!s@0+@<_VmCWT?OJ$%FLk~p^1qf9qln=IyD1QJOPy1dyf>X zJzX1#ZUV0jq#RBeie3J{_2vHrXRq~~!#)VcuOK+_LBF7y!f&ysbFqJ?xc@>|-m;S! zE$}LENqDd&F+EXPX2V*BbYYs`C%QW^gaLl&yr;h0j?|vyGXVe!0MmRmB(<fqx&o&S&)Q|0)P6C@lVU4WW~EWzz6Dz-hy{b(>pd9HdvfqIZ+29LAmcJElkAK zHHKwO0juR$aLt_{L;WLc5&V6xCKh&~<1rB;w{U0M5}=(I&n7N=*%Ejt*5k$0WY8c@ zXm+ra_Ip2x^>k&a-zM`X;BSGym_xfvTIG*?YaGGD>OufNcjen)p@1Eow}? zn(=ma5iLa6IHS(zaa6kl_>f~+qO;pO1qf9LB@w7psSviS@4RfMhBX{KS|V-zb7>dV zM6zu%`Lw(Pb64m5UT@(gj1oqNMTR+itl67d3FJ75n6oUyxamyJnbLCT+u;V&U}awg zB1(w4BeNX_riI}h_vjym$i5?=P43qAM}{?_?h@(Qu#wNGS4fno-f+4zi0B6%>uV^B zvGyma6ACM9U?xCqZgfODN?fdysAKw{#QA{XH=;YEvldzF8fv+DW~M!&?Z!Ql@9zo} zUS%mq%ZUXOcPJ_+9OEd;ft*?0ojo0<{cca4J+;4a8UH!S=WNC&;otqe`n%e{xQ)+8`<$Wo zM>__z)c@-A-+aC2>d%R0f7IbY1gSsjf6>nV*QB2)RlnQQqzyrpN>CvGUkd+3X$%yk z{)+t12l{-Ac^C z|7-sLbe=t^<_PNi->1j_oc#0i<3Bwn|6T3RY4Y!=bv{q55pY;A81!o81 diff --git a/Config/RingConfig.xlsx b/Config/RingConfig.xlsx deleted file mode 100644 index e457fc523129529f70050c280879edde139d5e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9555 zcma)CWk6iXvc}!r9RdUh9tf_%gS$&`26wmM?iPY;2<}dBCwPG1gS!TKLvr`-E_dI3 zuYdHMnfa=^&)28xR9BU}G$a%P*i-u;w1CpP;9y{HA;7@U{t7d&wPkX(w#tkflY(SH>pk*6LbC@<;h@vaW1XPthKZG2rDR$| zHcR$LNbgmunNG z_BL;Rgs@Q^*z35%;;%rQrY@|+hXWx+t9%*6xQ4IOXk~%~tAnN1nFpBYf}#@(zV#*^ ziy0tixI3u%QL^AiqCi{0X`|ebc|xBu*=bJsh&TWU_**n=L?Bd8xdJB%WX+{H>S^51 zp(`6XXJY#}coy+!^MQ*S(7-JuL~BZVjj0+K5q{R1s~t4VQ5z0nHnR2FC{-S*00OPq z8Yldi9Csf#cMq>?SI;Dhoh2=;%kujLk|H}xiLak4;elLnU!)sqlp%C+5Q%qCf7p>W zm;h~gGD>T9LS2G%?hUQ#<)*wh!jDL^`N98A^#%~=Ed`=l7eqDsU#T_%*qc0Y?G>jd z-OY^kbp^UzWWXc2=I1(+^#>(bf5?fjH7$w5I{oxus)d8a^g69_TK=sp2cN6&(s5tg z82sNctE$qAO@w5FVO0bwFJkd+m)b@_?4@9o6=CH8!EhL>&Z+|~2VX*>7EJ1AKoPpe zRVD0U9b`;l84bC}v+|sxY<`tBk=nYOvZ{Q4muU^&7dUJS9|gaKXXE?nFccVq)$(>1 zRjCH7lLbrO-yY{}E}V}CamwVw{5US7WCXHg&0uhcMngT-4b71*KZhD zUq-=E9GjaZ-{-YNQ~*w~2MsaeVzdwzBpwUsIjXryPAtz#w-;2u~ zxb>WuE8*MvIfJtU{f$Em0#3q|f$MpBe`T_@Jpe_pqYdA!nSA7tTzGlDHwL<_=$ z61H1Hwn+BhwnjEWQ=cvQOk9gW$Ay46Gk>9SYIaT)K^Tb4D?E?2pP8--r_qL6Rr@JA z@twQ1@t&u-v&7YXhgk6qLy&!lzGuL-Rc4ayZI>S#z{%D}%sK7jzEw4!obGFB{?)$h zWE-I3vFcc~KK^IF`8FMW& zOG&CsOScTOEN-;VXHON6Mi29YJw4C=Y+)clw7OdTvMv7%K=}=D0oYqQn3h`(0lg$XsS zWTaB;PcHy}V(Jf7zatwhz-;TLN z!~td>E{ex3LJ}O4TR}@8Zd>BanElq6rW=lAG*Gw_fr8|6+LY`wStIgLsypjW7LB}AJO$D)B!PTBZi`wKcTowhWSGWa`0#N>(Qyz+fYO_tT!F5_qQXcrH$fCTPplo8jun`L<`K)2l?-!gn(LX20WoQjIs|VUyf1bTQ)+}HJ~=u&F@1XkVb~z|FOa-uX-H!Is;q;5mzG_5c-;jec5vcbh3e zmT#9%xv)eabPCjfLaK`Ax1lr)$9s*2`N1p{DsEOZswGtXym0uIgIY!hY;lc0=VeuN z3U^eJME|-DMY&!zf`JR8dVhbJQ>*7%@TYw6x)2xhFW#8A`X

%S~HBOY`+;bDg6x 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 diff --git a/Config/WeightConfig.xlsx b/Config/WeightConfig.xlsx deleted file mode 100644 index 13782d911b629748b13bf6da136b4fd92e4bc0a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11428 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 diff --git a/Config/~$BasicConfig.xlsx b/Config/~$BasicConfig.xlsx new file mode 100644 index 000000000..e69de29bb diff --git a/Config/~$fishing gear-渔具.xlsx b/Config/~$fishing gear-渔具.xlsx deleted file mode 100644 index fd5ec18548fa218ea975c406c092d06f02ee4679..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 fcmZQIGcYwWS0ELzGMF(KFqkqJF_<$b&>R8)fr}1P diff --git a/Config/新建 文本文档.txt b/Config/新建 文本文档.txt new file mode 100644 index 000000000..e69de29bb diff --git a/Fishing2.sln.DotSettings.user b/Fishing2.sln.DotSettings.user index 0f7534b34..0b43a3c02 100644 --- a/Fishing2.sln.DotSettings.user +++ b/Fishing2.sln.DotSettings.user @@ -12,6 +12,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded