From 34d3400b6d6241e1d76bf04417a7dcb0e8f7092f Mon Sep 17 00:00:00 2001 From: laurids Date: Sat, 3 Oct 2020 22:02:45 +0200 Subject: [PATCH] Network Fixes, UI Fixes, AI Player --- Assets/GWConquest/Prefabs/Battle.prefab | 75 +++++ Assets/GWConquest/Prefabs/Battle.prefab.meta | 7 + Assets/GWConquest/Prefabs/Factory.prefab | 2 +- Assets/GWConquest/Prefabs/Formation.prefab | 4 +- Assets/GWConquest/Prefabs/Player.prefab | 2 +- Assets/GWConquest/Prefabs/Unit.prefab | 2 +- .../GWConquest/Resources/Database/Ships.csv | 51 ++-- .../GWConquest/Resources/Database/Units.csv | 217 +++++++------- Assets/GWConquest/Scenes/GalaxyMap.unity | 62 +++- Assets/GWConquest/Scripts/Battle.cs | 29 ++ Assets/GWConquest/Scripts/Battle.cs.meta | 11 + Assets/GWConquest/Scripts/BoltList.cs | 60 ++-- Assets/GWConquest/Scripts/DistrictFactory.cs | 22 +- Assets/GWConquest/Scripts/Formation.cs | 36 ++- Assets/GWConquest/Scripts/GameManager.cs | 23 ++ Assets/GWConquest/Scripts/GlobalCallbacks.cs | 1 + Assets/GWConquest/Scripts/Player.cs | 12 +- Assets/GWConquest/Scripts/ServerCallbacks.cs | 11 +- Assets/GWConquest/Scripts/SpawnAIUnits.cs | 27 ++ .../GWConquest/Scripts/SpawnAIUnits.cs.meta | 11 + Assets/GWConquest/Scripts/UI/DistrictIcon.cs | 3 +- Assets/GWConquest/Scripts/UI/GalaxyMapUI.cs | 2 +- .../Scripts/UI/PlanetIndicatorUI.cs | 4 +- .../GWConquest/Scripts/UI/ProductionMenu.cs | 1 + .../Scripts/UI/StrengthIndicator.cs | 7 +- Assets/GWConquest/Scripts/Unit.cs | 3 +- Assets/GWConquest/Scripts/UnitClass.cs | 20 +- Assets/GWConquest/Scripts/Util.cs | 11 +- Assets/GWConquest/Scripts/Zone.cs | 40 +++ .../PhotonBolt/assemblies/bolt.user.dll | Bin 33792 -> 42496 bytes .../PhotonBolt/assemblies/bolt.user.dll.mdb | Bin 13186 -> 17355 bytes Assets/Photon/PhotonBolt/project.json | 276 ++++++++++++++++++ .../resources/BoltPrefabDatabase.asset | 1 + 33 files changed, 812 insertions(+), 221 deletions(-) create mode 100644 Assets/GWConquest/Prefabs/Battle.prefab create mode 100644 Assets/GWConquest/Prefabs/Battle.prefab.meta create mode 100644 Assets/GWConquest/Scripts/Battle.cs create mode 100644 Assets/GWConquest/Scripts/Battle.cs.meta create mode 100644 Assets/GWConquest/Scripts/SpawnAIUnits.cs create mode 100644 Assets/GWConquest/Scripts/SpawnAIUnits.cs.meta diff --git a/Assets/GWConquest/Prefabs/Battle.prefab b/Assets/GWConquest/Prefabs/Battle.prefab new file mode 100644 index 0000000..1cbfa2d --- /dev/null +++ b/Assets/GWConquest/Prefabs/Battle.prefab @@ -0,0 +1,75 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &2057280478138210166 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2057280478138210155} + - component: {fileID: 2057280478138210152} + - component: {fileID: 2057280478138210153} + m_Layer: 0 + m_Name: Battle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2057280478138210155 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2057280478138210166} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 872.81177, y: -2957.7178, z: 666.5928} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2057280478138210152 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2057280478138210166} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -36112512, guid: 5b00bf8b25851d440940a40ec23344f4, type: 3} + m_Name: + m_EditorClassIdentifier: + _sceneGuid: + _serializerGuid: 4b486c12-bb55-4fb6-88f3-1a16218c67cf + _prefabId: 1 + _updateRate: 1 + _autoFreezeProxyFrames: 0 + _clientPredicted: 1 + _allowInstantiateOnClient: 1 + _persistThroughSceneLoads: 0 + _sceneObjectDestroyOnDetach: 1 + _sceneObjectAutoAttach: 1 + _alwaysProxy: 0 + _detachOnDisable: 1 + _allowFirstReplicationWhenFrozen: 0 + _autoRemoveChildEntities: 0 + _entityBehaviourQueryOption: 0 + _entityPriorityCalculatorQueryOption: 0 + _entityReplicationFilterQueryOption: 0 +--- !u!114 &2057280478138210153 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2057280478138210166} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 702759caf9c0c0142bf15cb9cb079f0b, type: 3} + m_Name: + m_EditorClassIdentifier: diff --git a/Assets/GWConquest/Prefabs/Battle.prefab.meta b/Assets/GWConquest/Prefabs/Battle.prefab.meta new file mode 100644 index 0000000..22e7c37 --- /dev/null +++ b/Assets/GWConquest/Prefabs/Battle.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 12e1714c02c111f4e9d6981ad8f8036b +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GWConquest/Prefabs/Factory.prefab b/Assets/GWConquest/Prefabs/Factory.prefab index 4a242dd..ca5c93c 100644 --- a/Assets/GWConquest/Prefabs/Factory.prefab +++ b/Assets/GWConquest/Prefabs/Factory.prefab @@ -95,7 +95,7 @@ MonoBehaviour: m_EditorClassIdentifier: _sceneGuid: _serializerGuid: 5b40b0d7-d27b-4407-968a-c0f4c722eb67 - _prefabId: 1 + _prefabId: 2 _updateRate: 1 _autoFreezeProxyFrames: 0 _clientPredicted: 1 diff --git a/Assets/GWConquest/Prefabs/Formation.prefab b/Assets/GWConquest/Prefabs/Formation.prefab index d942e35..58f6ad7 100644 --- a/Assets/GWConquest/Prefabs/Formation.prefab +++ b/Assets/GWConquest/Prefabs/Formation.prefab @@ -155,8 +155,6 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: b73507cdd59062e45a1e790e6f8d8fe8, type: 3} m_Name: m_EditorClassIdentifier: - unitIconPrefab: {fileID: 3490316418910827002, guid: 823be9508eb6c31478f39dff23361625, - type: 3} fleetIcon: {fileID: 3797021628422937969} movingArmyPrefab: {fileID: 7920185636364354306, guid: 233d61789cbb0504cb4f2605549a5fd2, type: 3} @@ -175,7 +173,7 @@ MonoBehaviour: m_EditorClassIdentifier: _sceneGuid: _serializerGuid: d7ecbbfb-2aa4-41e6-b745-72f55b565b31 - _prefabId: 2 + _prefabId: 3 _updateRate: 1 _autoFreezeProxyFrames: 0 _clientPredicted: 1 diff --git a/Assets/GWConquest/Prefabs/Player.prefab b/Assets/GWConquest/Prefabs/Player.prefab index 1ade3e4..7196c59 100644 --- a/Assets/GWConquest/Prefabs/Player.prefab +++ b/Assets/GWConquest/Prefabs/Player.prefab @@ -46,7 +46,7 @@ MonoBehaviour: m_EditorClassIdentifier: _sceneGuid: _serializerGuid: 59871d26-b925-463a-99f3-d6305974e7c3 - _prefabId: 3 + _prefabId: 4 _updateRate: 1 _autoFreezeProxyFrames: 0 _clientPredicted: 1 diff --git a/Assets/GWConquest/Prefabs/Unit.prefab b/Assets/GWConquest/Prefabs/Unit.prefab index 9de399d..6e72290 100644 --- a/Assets/GWConquest/Prefabs/Unit.prefab +++ b/Assets/GWConquest/Prefabs/Unit.prefab @@ -58,7 +58,7 @@ MonoBehaviour: m_EditorClassIdentifier: _sceneGuid: _serializerGuid: a3b5f966-83ae-4493-ac8f-90de2095ea63 - _prefabId: 4 + _prefabId: 5 _updateRate: 1 _autoFreezeProxyFrames: 0 _clientPredicted: 1 diff --git a/Assets/GWConquest/Resources/Database/Ships.csv b/Assets/GWConquest/Resources/Database/Ships.csv index 5620469..53adf3e 100644 --- a/Assets/GWConquest/Resources/Database/Ships.csv +++ b/Assets/GWConquest/Resources/Database/Ships.csv @@ -1,23 +1,28 @@ -Full Name,Short Name,Hitpoints,Attack Count,Damage,Penetration,Accuracy,Attack Timer,Armour,Evasion,Movement,Credit Cost,Recruit Cost,Ammo Cost,Fuel Cost,Build Time,Credit Upkeep,Food Upkeep,Min Factory Tier,Description -,,,,,,in %,in sec,,in %,,,,,,in sec,pro sec,pro sec,, -Strike Craft,StrikeCraft,10,1,10,1,90,5,2,50,2,200,10,10,10,10,2,2,1,Basic strike craft -Frigate,Frigate,10,1/2/3,10/20/30,1/1/1,95/80/50,1/2/1,2,50,2,200,10,10,10,10,2,2,3,Basic strike craft -Cruiser,Cruiser,10,1/2/3,10/20/30,1/1/1,95/80/50,1/2/1,2,50,2,200,10,10,10,10,2,2,3,Basic strike craft -Destroyer,Destroyer,10,1/2/3,10/20/30,1/1/1,95/80/50,1/2/1,2,50,2,200,10,10,10,10,2,2,3,Basic strike craft -Battleship,Battleship,10,1/2/3,10/20/30,1/1/1,95/80/50,1/2/1,2,50,2,200,10,10,10,10,2,2,1,Basic strike craft -Dreadnought,Dreadnought,10,1/2/3,10/20/30,1/1/1,95/80/50,1/2/1,2,50,2,200,10,10,10,10,2,2,1,Basic strike craft -Escort Carrier,EscortCarrier,10,1/2/3,10/20/30,1/1/1,95/80/50,1/2/1,2,50,2,200,10,10,10,10,2,2,1,Basic strike craft -Transport Frigate,TransportFrigate,10,1/2/3,10/20/30,1/1/1,95/80/50,1/2/1,2,50,2,200,10,10,10,10,2,2,2,Basic strike craft -Transport Cruiser,TransportCruiser,10,1/2/3,10/20/30,1/1/1,95/80/50,1/2/1,2,50,2,200,10,10,10,10,2,2,3,Basic strike craft -,,,,,,,,,,,,,,,,,,, -Ship Names:,,,,,,,,,,,,,,,,,,, -Dreaded Mauler,,,,,,,,,,,,,,,,,,, -Cursed Prince,,,,,,,,,,,,,,,,,,, -Avenging Son,,,,,,,,,,,,,,,,,,, -Unremembered Empire,,,,,,,,,,,,,,,,,,, -Ravager,,,,,,,,,,,,,,,,,,, -Silent Night,,,,,,,,,,,,,,,,,,, -Harrowing Hate,,,,,,,,,,,,,,,,,,, -Salvation in Death,,,,,,,,,,,,,,,,,,, -Edgelords of Sasel,,,,,,,,,,,,,,,,,,, -Boomers just wanna Grill,,,,,,,,,,,,,,,,,,, \ No newline at end of file +Full Name,Short Name,Hitpoints,Shields,Shield Regenerate,Attack Count,Damage,Penetration,Accuracy,Attack Timer,Armour,Evasion,Movement,Size,Credit Cost,Recruit Cost,Ammo Cost,Fuel Cost,Build Time,Credit Upkeep,Food Upkeep,Min Factory Tier,Description +,,,,,,,,in %,in sec,,in %,,,,,,,in sec,pro sec,pro sec,, +Strike Craft,StrikeCraft,10,10,3,1,10,1,90,5,2,50,2,3,200,10,10,10,10,2,2,1,Basic strike craft +Frigate,Frigate,10,10,3,1/2/3,10/20/30,1/1/1,95/80/50,1/2/1,2,50,2,20,200,10,10,10,10,2,2,3,Basic strike craft +Cruiser,Cruiser,10,10,3,1/2/3,10/20/30,1/1/1,95/80/50,1/2/1,2,50,2,20,200,10,10,10,10,2,2,3,Basic strike craft +Destroyer,Destroyer,10,10,3,1/2/3,10/20/30,1/1/1,95/80/50,1/2/1,2,50,2,20,200,10,10,10,10,2,2,3,Basic strike craft +Battleship,Battleship,10,10,3,1/2/3,10/20/30,1/1/1,95/80/50,1/2/1,2,50,2,20,200,10,10,10,10,2,2,1,Basic strike craft +Dreadnought,Dreadnought,10,10,3,1/2/3,10/20/30,1/1/1,95/80/50,1/2/1,2,50,2,20,200,10,10,10,10,2,2,1,Basic strike craft +Escort Carrier,EscortCarrier,10,10,3,1/2/3,10/20/30,1/1/1,95/80/50,1/2/1,2,50,2,20,200,10,10,10,10,2,2,1,Basic strike craft +Transport Frigate,TransportFrigate,10,10,3,1/2/3,10/20/30,1/1/1,95/80/50,1/2/1,2,50,2,20,200,10,10,10,10,2,2,2,Basic strike craft +Transport Cruiser,TransportCruiser,10,10,3,1/2/3,10/20/30,1/1/1,95/80/50,1/2/1,2,50,2,20,200,10,10,10,10,2,2,3,Basic strike craft +,,,,,,,,,,,,,,,,,,,,,, +Ship Names:,,,,,,,,,,,,,,,,,,,,,, +Dreaded Mauler,,,,,,,,,,,,,,,,,,,,,, +Cursed Prince,,,,,,,,,,,,,,,,,,,,,, +Avenging Son,,,,,,,,,,,,,,,,,,,,,, +Unremembered Empire,,,,,,,,,,,,,,,,,,,,,, +Ravager,,,,,,,,,,,,,,,,,,,,,, +Silent Night,,,,,,,,,,,,,,,,,,,,,, +Harrowing Hate,,,,,,,,,,,,,,,,,,,,,, +Salvation in Death,,,,,,,,,,,,,,,,,,,,,, +Edgelords of Sasel,,,,,,,,,,,,,,,,,,,,,, +Boomers just wanna Grill,,,,,,,,,,,,,,,,,,,,,, +Serpents Tail,,,,,,,,,,,,,,,,,,,,,, +Sunspear,,,,,,,,,,,,,,,,,,,,,, +Invincible Hand,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,, +Enteraktionen! sind A,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/Assets/GWConquest/Resources/Database/Units.csv b/Assets/GWConquest/Resources/Database/Units.csv index c1d6dd1..dc89356 100644 --- a/Assets/GWConquest/Resources/Database/Units.csv +++ b/Assets/GWConquest/Resources/Database/Units.csv @@ -1,105 +1,112 @@ -Full Name,Short Name,Factory Type,Hitpoints,Attack Count,Damage,Penetration,Accuracy,Attack Timer,Armour,Evasion,Movement,Morale,Defence Bonus,Credit Cost,Recruit Cost,Ammo Cost,Fuel Cost,Build Time,Credit Upkeep,Food Upkeep,Description -Militia,Militia,City,,,,,,,,,,,,100,5,0,,1,,,"Ordinary citizens defending their homeland, armed with everything that could be scrounged from storage. They are only rudimentarily trained and will not pose a real threat to any sizable force." -Conscripts,Conscripts,City,,,,,,,,,,,,300,5,2,,30,,,"These soldiers were pressed into service by the military authorities and armed only with subpar equipment. Consequently, their morale is quite low and they should not be expected to fight very hard." -Light Infantry,LightInfantry,Infantry,,,,,,,,,,,,,,,,,,, -Standard Infantry,StandardInfantry,Infantry,,,,,,,,,,,,,,,,,,, -Heavy Infantry,HeavyInfantry,Infantry,,,,,,,,,,,,,,,,,,, -Motorized Infantry,MotorizedInfantry,Infantry,,,,,,,,,,,,,,,,,,, -Mechanized Infantry,MechanizedInfantry,Infantry,,,,,,,,,,,,,,,,,,, -Pioneer Squad,Pioneer,Infantry,,,,,,,,,,,,,,,,,,, -Scout Vehicle,ScoutVehicle,Armour,,,,,,,,,,,,,,,,,,, -Light Tank,LightTank,Armour,,,,,,,,,,,,,,,,,,, -Medium Tank,MediumTank,Armour,,,,,,,,,,,,,,,,,,, -Heavy Tank,HeavyTank,Armour,,,,,,,,,,,,,,,,,,, -Super Heavy Tank,SuperHeavyTank,Armour,,,,,,,,,,,,,,,,,,, -Tankhunter,Tankhunter,Armour,,,,,,,,,,,,,,,,,,, -Light Anti Tank Gun,LightAntiTankGun,Armour,,,,,,,,,,,,,,,,,,, -Support Vehicle,SupportVehicle,Armour,,,,,,,,,,,,,,,,,,, -Transport Vehicle,TransportVehicle,Armour,,,,,,,,,,,,,,,,,,, -Flak Cannon,FlakCannon,Armour,,,,,,,,,,,,,,,,,,, -Flak Vehicle,FlakVehicle,Armour,,,,,,,,,,,,,,,,,,, -Flak Truck,FlakTruck,Armour,,,,,,,,,,,,,,,,,,, -Light Artillery Gun,LightArtilleryGun,Armour,,,,,,,,,,,,,,,,,,, -Artillery Gun,Artillery Gun,Armour,,,,,,,,,,,,,,,,,,, -Heavy Artillery Gun,Heavy Artillery Gun,Armour,,,,,,,,,,,,,,,,,,, -Super Heavy Artillery Gun,Super Heavy Artillery Gun,Armour,,,,,,,,,,,,,,,,,,, -Mountain Brigade,Mountain Brigade,Infantry,,,,,,,,,,,,,,,,,,, -Heavy Mountain Brigade,Heavy Mountain Brigade,Infantry,,,,,,,,,,,,,,,,,,, -Rocket Artillery,Rocket Artillery,Armour,,,,,,,,,,,,,,,,,,, -Heavy Rocket Artillery,Heavy Rocket Artillery,Armour,,,,,,,,,,,,,,,,,,, -Commando Unit,Commando Unit,Infantry,,,,,,,,,,,,,,,,,,, -Sniper Squad,Sniper Squad,Infantry,,,,,,,,,,,,,,,,,,, -Demolition Squad,Demolition Squad,Infantry,,,,,,,,,,,,,,,,,,, -Tank Hunter Squad,Tank Hunter Squad,Infantry,,,,,,,,,,,,,,,,,,, -Artillery Tank,Artillery Tank,Armour,,,,,,,,,,,,,,,,,,, -Breacher Squad,Breacher Squad,Infantry,,,,,,,,,,,,,,,,,,, -Marine Squad,Marine Squad,Infantry,,,,,,,,,,,,,,,,,,, -Grav-Chute Squad,Grav-Chute Squad,Infantry,,,,,,,,,,,,,,,,,,, -Heavy Anti Tank Gun,Heavy Anti Tank Gun,Armour,,,,,,,,,,,,,,,,,,, -Anti Tank Gun,Anti Tank Gun,Armour,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,, -Rokurant,,,,,,,,,,,,,,,,,,,,, -Heavy Artillery Tank,,,,,,,,,,,,,,,,,,,,, -Siegebreaker Tank,,,,,,,,,,,,,,,,,,,,, -Bulk Transporter,,,,,,,,,,,,,,,,,,,,, -Heavy Transport Vehicle,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,, -Voteine,,,,,,,,,,,,,,,,,,,,, -Fast Assault Tank,,,,,,,,,,,,,,,,,,,,, -Hover Tank,,,,,,,,,,,,,,,,,,,,, -Light Hover Tank,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,, -Whythler,,,,,,,,,,,,,,,,,,,,, -Jet-Bike Squads,,,,,,,,,,,,,,,,,,,,, -Hover Tank,,,,,,,,,,,,,,,,,,,,, -Wythler Squad,,,,,,,,,,,,,,,,,,,,, -Power Armour Squad,,,,,,,,,,,,,,,,,,,,, -Rabble,,,,,,,,,,,,,,,,,,,,, -Wyth Palace Guard,,,,,,,,,,,,,,,,,,,,, -Assassins,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,, -Elysia,,,,,,,,,,,,,,,,,,,,, -Light Commando Vehicle,,,,,,,,,,,,,,,,,,,,, -Elysian Knight Squad,,,,,,,,,,,,,,,,,,,,, -Elysian Mechs,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,, -Yar-Kassy,,,,,,,,,,,,,,,,,,,,, -Dervish Assault Squad,,,,,,,,,,,,,,,,,,,,, -Desert Raider Squad,,,,,,,,,,,,,,,,,,,,, -Elite Marksmen Squad,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,, -Arca,,,,,,,,,,,,,,,,,,,,, -Scum,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,, -Zami,,,,,,,,,,,,,,,,,,,,, -Cryo-Clone Squad,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,, -Stunteen,,,,,,,,,,,,,,,,,,,,, -Headtaker Commando,,,,,,,,,,,,,,,,,,,,, -Hareen Cari Immortals,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,, -Exan,,,,,,,,,,,,,,,,,,,,, -Clan Warriors,,,,,,,,,,,,,,,,,,,,, -Headtakers,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,, -Methaphor,,,,,,,,,,,,,,,,,,,,, -Republican Guard,,,,,,,,,,,,,,,,,,,,, -Green Guard (Elite Mountain Troops),,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,, -Noser,,,,,,,,,,,,,,,,,,,,, -Royal Guard,,,,,,,,,,,,,,,,,,,,, -Stalker Squad,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,, -Squad Upgrades:,,,,,,,,,,,,,,,,,,,,, -Anti Tank Set,,,,,,,,,,,,,,,,,,,,, -"Camoflage Set (Jungle, Desert, Standard Camo)",,,,,,,,,,,,,,,,,,,,, -Anti Tank Rifles,,,,,,,,,,,,,,,,,,,,, -Machine Gun,,,,,,,,,,,,,,,,,,,,, -Multilaser,,,,,,,,,,,,,,,,,,,,, -Flyer Fist,,,,,,,,,,,,,,,,,,,,, -Explosives,,,,,,,,,,,,,,,,,,,,, -,,,,,,,,,,,,,,,,,,,,, -Tank Upgrades:,,,,,,,,,,,,,,,,,,,,, -Command and Controll Module,,,,,,,,,,,,,,,,,,,,, -Tank Camo,,,,,,,,,,,,,,,,,,,,, -"Tracks (Jungle, Desert)",,,,,,,,,,,,,,,,,,,,, \ No newline at end of file +Full Name,Short Name,Factory Type,Hitpoints,Attack Count,Damage,Penetration,Accuracy,Armour,Shields,Shield Regenerate,Evasion,Movement,Size,Morale,Defence Bonus,Abilities,Credit Cost,Recruit Cost,Ammo Cost,Fuel Cost,Build Time,Credit Upkeep,Food Upkeep,Description +Militia,Militia,City,10,1,,,,0,0,,,,,,,,100,5,0,,20,,,"Ordinary citizens defending their homeland, armed with everything that could be scrounged from storage. They are only rudimentarily trained and will not pose a real threat to any sizable force." +Conscripts,Conscripts,City,10,1,,,,0,0,,,,,,,,300,5,2,,30,,,"These soldiers were pressed into service by the military authorities and armed only with subpar equipment. Consequently, their morale is quite low and they should not be expected to fight very hard." +Light Infantry,LightInfantry,Infantry,15,1,,,,0,0,,,,,,,,,,,,,,, +Standard Infantry,StandardInfantry,Infantry,20,1,,,,0.3,0,,,,,,,,,,,,,,, +Heavy Infantry,HeavyInfantry,Infantry,35,2,,,,0.5,0,,,,,,,,,,,,,,, +Motorized Infantry,MotorizedInfantry,Infantry,30,2,,,,1,0,,,,,,,,,,,,,,, +Mechanized Infantry,MechanizedInfantry,Infantry,30,2,,,,1,0,,,,,,,,,,,,,,, +Pioneer Squad,Pioneer,Infantry,,,,,,0.5,0,,,,,,,,,,,,,,, +Scout Vehicle,ScoutVehicle,Armour,40,,,1,0.7,1,0,,1,4,,,,,,,,,,,, +Light Tank,LightTank,Armour,60,3/5,5/4,2/1,0.6/0.6,2,0,,,3,45,,,,1000,,,,1,,, +Medium Tank,MediumTank,Armour,100,2/5,10/4,3/1,0.6/0.6,3,0,,,3,60,,,,1200,,,,1,,, +Heavy Tank,HeavyTank,Armour,140,1/4,15/4,4/2,0.6/0.6,4,0,,,2,90,,,,1600,,,,1,,, +Super Heavy Tank,SuperHeavyTank,Armour,200,1/3,20/4,5/2,0.6/0.6,5,0,,0,2,120,,,,2400,,,,1,,, +Tankhunter,Tankhunter,Armour,100,1/2,16/4,4/2,0.7/0.7,2,0,,,2,90,,,,1200,,,,1,,, +Light Anti Tank Gun,LightAntiTankGun,Armour,20,2,8,3,0.7,1,0,,,0.5,,,,,,,,,,,, +Support Vehicle,SupportVehicle,Armour,,,,,,1,0,,,,,,,,,,,,,,, +Transport Vehicle,TransportVehicle,Armour,,,,,,1,0,,,,,,,,,,,,,,, +Flak Cannon,FlakCannon,Armour,20,6,5,0.5,0.7,1,,,,0.5,,,,,,,,,,,, +Flak Vehicle,FlakVehicle,Armour,,,,,0.65,1,,,,,,,,,,,,,,,, +Flak Truck,FlakTruck,Armour,,,,,0.6,1,,,,,,,,,,,,,,,, +Light Artillery Gun,LightArtilleryGun,Armour,20,,,,0.4,1,,,,0.5,,,,,,,,,,,, +Artillery Gun,Artillery Gun,Armour,24,1,22,1,0.5,1,,,,0.5,,,,,,,,,,,, +Heavy Artillery Gun,Heavy Artillery Gun,Armour,35,1,30,1.5,0.4,1,,,,0.3,,,,,,,,,,,, +Super Heavy Artillery Gun,Super Heavy Artillery Gun,Armour,40,1,50,2,0.3,2,,,,0.2,,,,,,,,,,,, +Mountain Brigade,Mountain Brigade,Infantry,,,,,,0,,,,,,,,,,,,,,,, +Heavy Mountain Brigade,Heavy Mountain Brigade,Infantry,,,,,,0.3,,,,,,,,,,,,,,,, +Rocket Artillery,Rocket Artillery,Armour,,,,,,0,,,,,,,,,,,,,,,, +Heavy Rocket Artillery,Heavy Rocket Artillery,Armour,,,,,,1,,,,,,,,,,,,,,,, +Commando Unit,Commando Unit,Infantry,,,,,0.7,0.3,,,,,,,,,,,,,,,, +Sniper Squad,Sniper Squad,Infantry,,,,,0.9,0,,,,,,,,,,,,,,,, +Demolition Squad,Demolition Squad,Infantry,,,,,,0,,,,,,,,,,,,,,,, +Tank Hunter Squad,Tank Hunter Squad,Infantry,,,,,,0.3,,,,,,,,,,,,,,,, +Artillery Tank,Artillery Tank,Armour,,,,,,2,,,,,,,,,,,,,,,, +Breacher Squad,Breacher Squad,Infantry,,,,,,0.5,,,,,,,,,,,,,,,, +Marine Squad,Marine Squad,Infantry,,,,,,0,,,,,,,,,,,,,,,, +Grav-Chute Squad,Grav-Chute Squad,Infantry,,,,,,0,,,,,,,,,,,,,,,, +Heavy Anti Tank Gun,Heavy Anti Tank Gun,Armour,,,,,,1,,,,,,,,,,,,,,,, +Anti Tank Gun,Anti Tank Gun,Armour,,,,,,1,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,, +Rokurant,,,,,,,,,,,,,,,,,,,,,,,, +Heavy Artillery Tank,,,,,,,,3,,,,,,,,,,,,,,,, +Siegebreaker Tank,,,,,,,,3,,,,,,,,,,,,,,,, +Bulk Transporter,,,,,,,,3,,,,,,,,,,,,,,,, +Heavy Transport Vehicle,,,,,,,,3,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,, +Voteine,,,,,,,,,,,,,,,,,,,,,,,, +Fast Assault Tank,,,,,,,,1,1,,,,,,,,,,,,,,, +Hover Tank,,,,,,,,2,1,,,,,,,,,,,,,,, +Light Hover Tank,,,,,,,,1,1,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,, +Whythler,,,,,,,,,,,,,,,,,,,,,,,, +Jet-Bike Squads,,,,,,,,1,3,,,,,,,,,,,,,,, +Hover Tank,,,,,,,,2,4,,,,,,,,,,,,,,, +Wythler Squad,,,,,,,,1,2,,,,,,,,,,,,,,, +Power Armour Squad,,,,,,,,1,3,,,,,,,,,,,,,,, +Rabble,,,,,,,,0,0,,,,,,,,,,,,,,, +Wyth Palace Guard,,,,,,,,1,3,,,,,,,,,,,,,,, +Assassins,,,,,,,,0.3,1,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,, +Elysia,,,,,,,,,,,,,,,,,,,,,,,, +Light Commando Vehicle,,,,,,,,,,,,,,,,,,,,,,,, +Elysian Knight Squad,,,,,,,,,1,,,,,,,,,,,,,,, +Elysian Mechs,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,, +Yar-Kassy,,,,,,,,,,,,,,,,,,,,,,,, +Dervish Assault Tank,,,,,,,,,,,,,,,,,,,,,,,, +Desert Raider Squad,,,,,,,,,,,,,,,,,,,,,,,, +Elite Marksmen Squad,,,,,,,,,,,,,,,,,,,,,,,, +Ghar Haclem Achvenur Serpents,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,, +Arca,,,,,,,,,,,,,,,,,,,,,,,, +Scum,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,, +Zami,,,,,,,,,,,,,,,,,,,,,,,, +Cryo-Clone Squad,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,, +Stunteen,,,,,,,,,,,,,,,,,,,,,,,, +Headtaker Commando,,,,,,,,,,,,,,,,,,,,,,,, +Hareen Cari Immortals,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,, +Exan,,,,,,,,,,,,,,,,,,,,,,,, +Clan Warriors,,,,,,,,,,,,,,,,,,,,,,,, +Headtakers,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,, +Methaphor,,,,,,,,,,,,,,,,,,,,,,,, +Republican Guard,,,,,,,,,,,,,,,,,,,,,,,, +Green Guard (Elite Mountain Troops),,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,, +Noser,,,,,,,,,,,,,,,,,,,,,,,, +Royal Guard,,,,,,,,,,,,,,,,,,,,,,,, +Stalker Squad,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,, +Caer Bannoq,,,,,,,,,,,,,,,,,,,,,,,, +Realm Knights,,,,,,,,,,,,,,,,,,,,,,,, +Keepers of Secrets,,,,,,,,,,,,,,,,,,,,,,,, +Paladins,,,,,,,,,,,,,,,,,,,,,,,, +Seekers,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,, +Squad Upgrades:,,,,,,,,,,,,,,,,,,,,,,,, +Anti Tank Set,,,,,,,,,,,,,,,,,,,,,,,, +"Camoflage Set (Jungle, Desert, Standard Camo)",,,,,,,,,,,,,,,,,,,,,,,, +Anti Tank Rifles,,,,,,,,,,,,,,,,,,,,,,,, +Machine Gun,,,,,,,,,,,,,,,,,,,,,,,, +Multilaser,,,,,,,,,,,,,,,,,,,,,,,, +Flyer Fist,,,,,,,,,,,,,,,,,,,,,,,, +Explosives,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,, +Tank Upgrades:,,,,,,,,,,,,,,,,,,,,,,,, +Command and Controll Module,,,,,,,,,,,,,,,,,,,,,,,, +Tank Camo,,,,,,,,,,,,,,,,,,,,,,,, +"Tracks (Jungle, Desert)",,,,,,,,,,,,,,,,,,,,,,,, \ No newline at end of file diff --git a/Assets/GWConquest/Scenes/GalaxyMap.unity b/Assets/GWConquest/Scenes/GalaxyMap.unity index 1948923..41403cc 100644 --- a/Assets/GWConquest/Scenes/GalaxyMap.unity +++ b/Assets/GWConquest/Scenes/GalaxyMap.unity @@ -7648,7 +7648,7 @@ PrefabInstance: - target: {fileID: 8496026405921973180, guid: fc3eae9e9964d5446a5c38fbf9a203bb, type: 3} propertyPath: FactoryType - value: 1 + value: 2 objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: fc3eae9e9964d5446a5c38fbf9a203bb, type: 3} @@ -22098,7 +22098,7 @@ MonoBehaviour: PlayerColors: - {r: 1, g: 0.8901961, b: 0.5647059, a: 1} - {r: 0.8, g: 0.25490198, b: 0.14509805, a: 1} - - {r: 1, g: 0.8901961, b: 0.5647059, a: 1} + - {r: 0.8000001, g: 0.25490198, b: 0.14509805, a: 1} - {r: 0.8, g: 0.25490198, b: 0.14509805, a: 1} UnitClasses: [] PlanetData: @@ -22943,6 +22943,8 @@ MonoBehaviour: DistrictData: [] GroundTransitionLengthFactor: 30 SpaceTransitionLengthFactor: 1 + BattleTurnLength: 0 + SpawnAIPlayer: 1 --- !u!4 &426309784 Transform: m_ObjectHideFlags: 0 @@ -22951,7 +22953,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 426309782} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 1128.9474, y: -2490.3516, z: -893.0568} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} @@ -33177,6 +33179,52 @@ PrefabInstance: objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: f42e8fb7bcfdc474a979ee5023161dc3, type: 3} +--- !u!1 &692834478 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 692834480} + - component: {fileID: 692834479} + m_Layer: 0 + m_Name: GameObject + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &692834479 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 692834478} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e3fbe30dead34c49a8585bf21ae46af, type: 3} + m_Name: + m_EditorClassIdentifier: + unitName: Conscripts + unitCount: 5 + zone: {fileID: 801858043} +--- !u!4 &692834480 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 692834478} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1204.8986, y: -10800.732, z: 5110.4175} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 13 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &693605575 PrefabInstance: m_ObjectHideFlags: 0 @@ -39114,7 +39162,7 @@ PrefabInstance: - target: {fileID: 8496026405921973180, guid: fc3eae9e9964d5446a5c38fbf9a203bb, type: 3} propertyPath: FactoryType - value: 1 + value: 2 objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: fc3eae9e9964d5446a5c38fbf9a203bb, type: 3} @@ -53196,7 +53244,7 @@ PrefabInstance: - target: {fileID: 8496026405921973180, guid: fc3eae9e9964d5446a5c38fbf9a203bb, type: 3} propertyPath: FactoryType - value: 1 + value: 2 objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: fc3eae9e9964d5446a5c38fbf9a203bb, type: 3} @@ -93022,7 +93070,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!82 &1873289113 AudioSource: m_ObjectHideFlags: 0 @@ -98239,7 +98287,7 @@ PrefabInstance: - target: {fileID: 8496026405921973180, guid: fc3eae9e9964d5446a5c38fbf9a203bb, type: 3} propertyPath: FactoryType - value: 1 + value: 2 objectReference: {fileID: 0} m_RemovedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: fc3eae9e9964d5446a5c38fbf9a203bb, type: 3} diff --git a/Assets/GWConquest/Scripts/Battle.cs b/Assets/GWConquest/Scripts/Battle.cs new file mode 100644 index 0000000..ef2373b --- /dev/null +++ b/Assets/GWConquest/Scripts/Battle.cs @@ -0,0 +1,29 @@ +using UnityEngine; + +namespace GWConquest +{ + public class Battle : Bolt.EntityBehaviour + { + public EntityList FormationList; + + public Zone Zone { + get => Zone.GetFromId(state.Zone); + set => state.Zone = Zone.GetZoneId(value); + } + + public override void Attached() + { + FormationList = new EntityList(state, "FormationList"); + } + + public void AddFormation(Formation f) + { + FormationList.Add(f.entity); + } + + public void RemoveFormation(Formation f) + { + FormationList.Remove(f.entity); + } + } +} \ No newline at end of file diff --git a/Assets/GWConquest/Scripts/Battle.cs.meta b/Assets/GWConquest/Scripts/Battle.cs.meta new file mode 100644 index 0000000..4a0a2fc --- /dev/null +++ b/Assets/GWConquest/Scripts/Battle.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 702759caf9c0c0142bf15cb9cb079f0b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GWConquest/Scripts/BoltList.cs b/Assets/GWConquest/Scripts/BoltList.cs index 4e278cc..1713bea 100644 --- a/Assets/GWConquest/Scripts/BoltList.cs +++ b/Assets/GWConquest/Scripts/BoltList.cs @@ -7,7 +7,7 @@ using UdpKit; namespace GWConquest { - public class BoltList : IList + public abstract class BoltList : IList where TokenClass : BoltListToken, new() { private IState state; private string propertyName; @@ -15,22 +15,20 @@ namespace GWConquest private Func readMethod; private Action writeMethod; - public BoltList(IState _state, string _propertyName, Func _readMethod, Action _writeMethod) + public BoltList(IState _state, string _propertyName) { state = _state; propertyName = _propertyName; - readMethod = _readMethod; - writeMethod = _writeMethod; } - private BoltListToken Token + private TokenClass Token { get { - BoltListToken token = state.GetDynamic(propertyName) as BoltListToken; + TokenClass token = state.GetDynamic(propertyName) as TokenClass; if (token == null) { - return new BoltListToken(readMethod, writeMethod); + return new TokenClass(); } else { @@ -40,7 +38,7 @@ namespace GWConquest set => state.SetDynamic(propertyName, value); } - public void FromToken(BoltListToken token) + public void FromToken(TokenClass token) { Token = token; } @@ -64,13 +62,13 @@ namespace GWConquest if (!Contains(item)) { - Token = new BoltListToken(readMethod, writeMethod, Token.entries.Append(item)); + Token = new TokenClass().SetEntries(Token.entries.Append(item)) as TokenClass; } } public void Clear() { - Token = new BoltListToken(readMethod, writeMethod); + Token = new TokenClass(); } public bool Contains(T item) @@ -97,7 +95,7 @@ namespace GWConquest { List list = Token.entries.ToList(); list.Insert(index, item); - Token = new BoltListToken(readMethod, writeMethod, list); + Token = new TokenClass().SetEntries(list) as TokenClass; } public bool Remove(T item) @@ -105,7 +103,7 @@ namespace GWConquest List list = Token.entries.ToList(); if (list.Remove(item)) { - Token = new BoltListToken(readMethod, writeMethod, list); + Token = new TokenClass().SetEntries(list) as TokenClass; return true; } else return false; @@ -115,7 +113,7 @@ namespace GWConquest { List list = Token.entries.ToList(); list.RemoveAt(index); - Token = new BoltListToken(readMethod, writeMethod, list); + Token = new TokenClass().SetEntries(list) as TokenClass; } IEnumerator IEnumerable.GetEnumerator() @@ -124,25 +122,19 @@ namespace GWConquest } } - public class BoltListToken : IProtocolToken + public abstract class BoltListToken : IProtocolToken { - public BoltListToken(Func _readMethod, Action _writeMethod) + public BoltListToken() { entries = new T[0]; - readMethod = _readMethod; - writeMethod = _writeMethod; } - public BoltListToken(Func _readMethod, Action _writeMethod, IEnumerable _entities) + public BoltListToken SetEntries(IEnumerable _entities) { entries = _entities.ToArray(); - readMethod = _readMethod; - writeMethod = _writeMethod; + return this; } - private Func readMethod; - private Action writeMethod; - public T[] entries { get; private set; } public void Read(UdpPacket packet) @@ -152,7 +144,7 @@ namespace GWConquest entries = new T[count]; for (int i = 0; i < count; i++) { - entries[i] = readMethod(packet); + entries[i] = ReadEntry(packet); } BoltLog.Info("Finished reading Bolt list {0}", this); } @@ -163,7 +155,7 @@ namespace GWConquest packet.WriteInt(entries.Length); foreach (T e in entries) { - writeMethod(packet, e); + WriteEntry(packet, e); } BoltLog.Info("Finished writing Bolt list {0}", this); } @@ -173,14 +165,26 @@ namespace GWConquest return "BoltList " + Util.PrintEnumerable(entries); } + public abstract T ReadEntry(UdpPacket packet); + + public abstract void WriteEntry(UdpPacket packet, T entry); + } - public class ZoneList : BoltList - { - public ZoneList(IState _state, string _propertyName) : base(_state, _propertyName, packet => Zone.GetFromId(packet.ReadInt()), (packet, zone) => packet.WriteInt(Zone.GetZoneId(zone))) + public class ZoneListToken : BoltListToken { + public override Zone ReadEntry(UdpPacket packet) { + return Zone.GetFromId(packet.ReadInt()); + } + public override void WriteEntry(UdpPacket packet, Zone entry) + { + packet.WriteInt(Zone.GetZoneId(entry)); } + } + public class ZoneList : BoltList + { + public ZoneList(IState _state, string _propertyName) : base(_state, _propertyName) {} } } \ No newline at end of file diff --git a/Assets/GWConquest/Scripts/DistrictFactory.cs b/Assets/GWConquest/Scripts/DistrictFactory.cs index 463a184..bc387bf 100644 --- a/Assets/GWConquest/Scripts/DistrictFactory.cs +++ b/Assets/GWConquest/Scripts/DistrictFactory.cs @@ -31,7 +31,7 @@ namespace GWConquest { for(int i = 0; i < MaxQueueLength; i++) { - if(state.ProductionQueue[i].UnitClass == null) + if(Util.IsStringEmpty(state.ProductionQueue[i].UnitClass)) { return i; } @@ -44,7 +44,7 @@ namespace GWConquest { get { - return state.ProductionQueue[0].UnitClass != null; + return !Util.IsStringEmpty(state.ProductionQueue[0].UnitClass); } } @@ -60,7 +60,12 @@ namespace GWConquest public float GetProductionPercentage(int i) { - return GetProductionTime(i) / GetProductionQueueEntry(i).BuildTime; + var entry = GetProductionQueueEntry(i); + if(entry != null) + { + return GetProductionTime(i) / GetProductionQueueEntry(i).BuildTime; + } + else return 0; } public void RemoveProductionQueueEntry(int index) @@ -69,6 +74,7 @@ namespace GWConquest { state.ProductionQueue[index].UnitClass = null; state.ProductionQueue[index].TimeProduced = 0f; + state.ProductionQueue[index].Player = null; } else { @@ -77,18 +83,20 @@ namespace GWConquest var nextEntry = state.ProductionQueue[i + 1]; state.ProductionQueue[i].UnitClass = nextEntry.UnitClass; state.ProductionQueue[i].TimeProduced = nextEntry.TimeProduced; - if (nextEntry.UnitClass == null) + state.ProductionQueue[i].Player = nextEntry.Player; + if (Util.IsStringEmpty(nextEntry.UnitClass)) { return; } } state.ProductionQueue[MaxQueueLength - 1].UnitClass = null; state.ProductionQueue[MaxQueueLength - 1].TimeProduced = 0f; + state.ProductionQueue[MaxQueueLength - 1].Player = null; } } - public void AddProductionQueueEntry(string uc) + public void AddProductionQueueEntry(string uc, Player player) { int length = ProductionQueueLength; if(length < MaxQueueLength) @@ -96,6 +104,7 @@ namespace GWConquest BoltLog.Info("Adding unit {0} to production queue on district {1}", uc, gameObject.name); state.ProductionQueue[length].UnitClass = uc; state.ProductionQueue[length].TimeProduced = 0f; + state.ProductionQueue[length].Player = player.entity; } } @@ -112,8 +121,7 @@ namespace GWConquest Zone zone = GetComponent(); if(zone != null) { - // TODO correct player when zones are under control - Unit.SpawnUnit(zone, uc, Player.CurrentPlayer); + Unit.SpawnUnit(zone, uc, state.ProductionQueue[0].Player.GetComponent()); } else { diff --git a/Assets/GWConquest/Scripts/Formation.cs b/Assets/GWConquest/Scripts/Formation.cs index 04201d8..0ef3c6a 100644 --- a/Assets/GWConquest/Scripts/Formation.cs +++ b/Assets/GWConquest/Scripts/Formation.cs @@ -8,11 +8,6 @@ namespace GWConquest { public class Formation : Bolt.EntityBehaviour, IMovable { - public static Formation selectedFormation; - - [HideInInspector] - public GameObject unitIconPrefab; - private Zone lastZone; public Zone currentZone { @@ -23,29 +18,33 @@ namespace GWConquest set { state.CurrentZone = Zone.GetZoneId(value); + OnZoneChanged(); } } private void OnZoneChanged() - { + { Zone newZone = Zone.GetFromId(state.CurrentZone); - if(lastZone != null) - { - lastZone.OnFormationDeparting(this); - } - if(newZone != null) + if(lastZone != newZone) { - newZone.OnFormationArrived(this); - } - BoltLog.Info("Current zone changed from {0} to {1} on formation {2}", lastZone, newZone, this); - lastZone = newZone; + if(lastZone != null) + { + lastZone.OnFormationDeparting(this); + } + if(newZone != null) + { + newZone.OnFormationArrived(this); + } + BoltLog.Info("Current zone changed from {0} to {1} on formation {2}", lastZone, newZone, this); + lastZone = newZone; + } } public Player Player { get { - return state.Player.GetComponent(); + return state.Player?.GetComponent(); } set { @@ -111,8 +110,7 @@ namespace GWConquest evnt.TargetZone = Zone.GetZoneId(path[1]); if(path.Count > 2) { - BoltListToken zoneListToken = new BoltListToken( - packet => Zone.GetFromId(packet.ReadInt()), (packet, zone) => packet.WriteInt(Zone.GetZoneId(zone)), + var zoneListToken = new ZoneListToken().SetEntries( path.GetRange(2, path.Count-2).ToArray()); evnt.PathQueue = zoneListToken; @@ -155,7 +153,7 @@ namespace GWConquest { if(state.CurrentTransition.IsCurved) { movingArmyIcon = Instantiate(movingArmyPrefab); - movingArmyIcon.transform.SetParent(FindObjectOfType().DistrictIcons); + movingArmyIcon.transform.SetParent(FindObjectOfType().PlanetView.DistrictIcons); movingArmyIcon.transform.localRotation = Quaternion.identity; movingArmyIcon.GetComponent().target = transform; movingArmyIcon.GetComponentInChildren().color = Player.Color; diff --git a/Assets/GWConquest/Scripts/GameManager.cs b/Assets/GWConquest/Scripts/GameManager.cs index 37d4575..a52806a 100644 --- a/Assets/GWConquest/Scripts/GameManager.cs +++ b/Assets/GWConquest/Scripts/GameManager.cs @@ -12,6 +12,10 @@ namespace GWConquest public float GroundTransitionLengthFactor; public float SpaceTransitionLengthFactor; + public float BattleTurnLength; + + public bool SpawnAIPlayer; + private static GameManager _instance; public static GameManager Instance { @@ -19,6 +23,10 @@ namespace GWConquest if(_instance == null) { _instance = FindObjectOfType(); + if(_instance == null) + { + BoltLog.Warn("Found no Game Manager instance!"); + } } return _instance; } @@ -26,9 +34,24 @@ namespace GWConquest private void Awake() { + if(_instance == null) + { + _instance = this; + } + UnitClass.LoadClassMap(); PlanetRegistry.Load(); } + public void OnSceneLoadLocalDone() + { + if(SpawnAIPlayer) + { + BoltEntity playerEntity = BoltNetwork.Instantiate(BoltPrefabs.Player); + IPlayerState playerState = playerEntity.GetState(); ; + playerState.IsAI = true; + } + } + } } \ No newline at end of file diff --git a/Assets/GWConquest/Scripts/GlobalCallbacks.cs b/Assets/GWConquest/Scripts/GlobalCallbacks.cs index a454ed7..270b2a9 100644 --- a/Assets/GWConquest/Scripts/GlobalCallbacks.cs +++ b/Assets/GWConquest/Scripts/GlobalCallbacks.cs @@ -9,6 +9,7 @@ namespace GWConquest { Debug.Log("Calling global callbacks..."); BoltNetwork.RegisterTokenClass(); + BoltNetwork.RegisterTokenClass(); } } } \ No newline at end of file diff --git a/Assets/GWConquest/Scripts/Player.cs b/Assets/GWConquest/Scripts/Player.cs index f2955c4..0fcb05c 100644 --- a/Assets/GWConquest/Scripts/Player.cs +++ b/Assets/GWConquest/Scripts/Player.cs @@ -23,8 +23,12 @@ namespace GWConquest { state.PlayerId = PlayerList.IndexOf(this); GameManager gm = GameManager.Instance; - int color = state.PlayerId % gm.PlayerColors.Length; - Color = gm.PlayerColors[color]; + if(gm != null) + { + int color = state.PlayerId % gm.PlayerColors.Length; + Color = gm.PlayerColors[color]; + } + } } @@ -43,7 +47,7 @@ namespace GWConquest { get { - if(state.IsHost) + if(state.IsAI || state.IsHost) { return null; } @@ -60,7 +64,7 @@ namespace GWConquest { entity.TakeControl(); } - else + else if(!state.IsAI) { entity.AssignControl(Connection); } diff --git a/Assets/GWConquest/Scripts/ServerCallbacks.cs b/Assets/GWConquest/Scripts/ServerCallbacks.cs index 242e84c..9e925e6 100644 --- a/Assets/GWConquest/Scripts/ServerCallbacks.cs +++ b/Assets/GWConquest/Scripts/ServerCallbacks.cs @@ -1,4 +1,5 @@ using System.Linq; +using UnityEngine; namespace GWConquest { @@ -12,9 +13,13 @@ namespace GWConquest IPlayerState playerState = playerEntity.GetState(); ; playerState.IsHost = true; playerEntity.TakeControl(); + + foreach(GameObject go in FindObjectsOfType()) { + go.SendMessage("OnSceneLoadLocalDone", SendMessageOptions.DontRequireReceiver); + } } - public override void Connected(BoltConnection connection) + public override void SceneLoadRemoteDone(BoltConnection connection) { BoltEntity playerEntity = BoltNetwork.Instantiate(BoltPrefabs.Player); IPlayerState playerState = playerEntity.GetState(); @@ -53,7 +58,7 @@ namespace GWConquest formation.MoveToZone(targetZone); if(evnt.PathQueue != null) { - var queueToken = evnt.PathQueue as BoltListToken; + var queueToken = evnt.PathQueue as ZoneListToken; formation.PathQueue.FromToken(queueToken); } } @@ -61,7 +66,7 @@ namespace GWConquest public override void OnEvent(AddProductionEvent evnt) { DistrictFactory factory = evnt.Factory.GetComponent(); - factory.AddProductionQueueEntry(evnt.UnitClass); + factory.AddProductionQueueEntry(evnt.UnitClass, evnt.Player.GetComponent()); } } } \ No newline at end of file diff --git a/Assets/GWConquest/Scripts/SpawnAIUnits.cs b/Assets/GWConquest/Scripts/SpawnAIUnits.cs new file mode 100644 index 0000000..993c1aa --- /dev/null +++ b/Assets/GWConquest/Scripts/SpawnAIUnits.cs @@ -0,0 +1,27 @@ +using UnityEngine; +using System.Linq; + +namespace GWConquest { + + public class SpawnAIUnits : MonoBehaviour + { + + public string unitName; + public int unitCount; + public Zone zone; + + public void OnSceneLoadLocalDone() + { + BoltLog.Info("Spawning AI units"); + + Player player = FindObjectsOfType().FirstOrDefault(p => p.state.IsAI); + if(player != null) + { + for(int i = 0; i < unitCount; i++) + { + Unit.SpawnUnit(zone, UnitClass.FromName(unitName), player); + } + } + } + } +} \ No newline at end of file diff --git a/Assets/GWConquest/Scripts/SpawnAIUnits.cs.meta b/Assets/GWConquest/Scripts/SpawnAIUnits.cs.meta new file mode 100644 index 0000000..b60b385 --- /dev/null +++ b/Assets/GWConquest/Scripts/SpawnAIUnits.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4e3fbe30dead34c49a8585bf21ae46af +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GWConquest/Scripts/UI/DistrictIcon.cs b/Assets/GWConquest/Scripts/UI/DistrictIcon.cs index 11b0143..20f0113 100644 --- a/Assets/GWConquest/Scripts/UI/DistrictIcon.cs +++ b/Assets/GWConquest/Scripts/UI/DistrictIcon.cs @@ -29,7 +29,7 @@ namespace GWConquest { animator.SetTrigger("Pressed"); isSelected = true; - FindObjectOfType().SelectZone(district.Zone); + FindObjectOfType().PlanetView.SelectZone(district.Zone); } public void OnDeselected() @@ -73,6 +73,7 @@ namespace GWConquest if (enemyStrength > 0f) { Player enemyPlayer = formations.FirstOrDefault(f => f.Player != Player.CurrentPlayer)?.Player; + Debug.Log(enemyPlayer); EnemyIndicator.gameObject.SetActive(true); EnemyIndicator.UpdateContinuous(enemyStrength, enemyPlayer?.Color); diff --git a/Assets/GWConquest/Scripts/UI/GalaxyMapUI.cs b/Assets/GWConquest/Scripts/UI/GalaxyMapUI.cs index 24597db..0e1a619 100644 --- a/Assets/GWConquest/Scripts/UI/GalaxyMapUI.cs +++ b/Assets/GWConquest/Scripts/UI/GalaxyMapUI.cs @@ -39,7 +39,7 @@ namespace GWConquest Renderer r = PlanetSelection.GetComponentInChildren(); if(Player.CurrentPlayer != null) { - r.material.color.UpdateColorRGB(Player.CurrentPlayer.Color); + r.material.color = r.material.color.UpdateColorRGB(Player.CurrentPlayer.Color); } PlanetNameText.text = SelectedPlanet.planetName; diff --git a/Assets/GWConquest/Scripts/UI/PlanetIndicatorUI.cs b/Assets/GWConquest/Scripts/UI/PlanetIndicatorUI.cs index 1f0d913..e00ed4a 100644 --- a/Assets/GWConquest/Scripts/UI/PlanetIndicatorUI.cs +++ b/Assets/GWConquest/Scripts/UI/PlanetIndicatorUI.cs @@ -39,7 +39,7 @@ namespace GWConquest { PlayerIndicator.SetActive(true); PlayerIndicatorBar.fillAmount = Mathf.Clamp01(playerStrength / MaxFormationStrength) * MaxFillAmount; - PlayerIndicatorBar.color.UpdateColorRGB(Player.CurrentPlayer.Color); + PlayerIndicatorBar.color = PlayerIndicatorBar.color.UpdateColorRGB(Player.CurrentPlayer.Color); } else { @@ -53,7 +53,7 @@ namespace GWConquest Player enemyPlayer = formations.FirstOrDefault(f => f.Player != Player.CurrentPlayer)?.Player; if(enemyPlayer != null) { - EnemyIndicatorBar.color.UpdateColorRGB(enemyPlayer.Color); + EnemyIndicatorBar.color = EnemyIndicatorBar.color.UpdateColorRGB(enemyPlayer.Color); } } diff --git a/Assets/GWConquest/Scripts/UI/ProductionMenu.cs b/Assets/GWConquest/Scripts/UI/ProductionMenu.cs index 0d8e95a..0d4ac16 100644 --- a/Assets/GWConquest/Scripts/UI/ProductionMenu.cs +++ b/Assets/GWConquest/Scripts/UI/ProductionMenu.cs @@ -140,6 +140,7 @@ namespace GWConquest AddProductionEvent ev = AddProductionEvent.Create(Bolt.GlobalTargets.OnlyServer); ev.Factory = factory.entity; ev.UnitClass = uc.ShortName; + ev.Player = Player.CurrentPlayer.entity; ev.Send(); } } diff --git a/Assets/GWConquest/Scripts/UI/StrengthIndicator.cs b/Assets/GWConquest/Scripts/UI/StrengthIndicator.cs index 779ff64..e231054 100644 --- a/Assets/GWConquest/Scripts/UI/StrengthIndicator.cs +++ b/Assets/GWConquest/Scripts/UI/StrengthIndicator.cs @@ -15,14 +15,17 @@ namespace GWConquest StrengthBar.fillAmount = Mathf.Ceil(s) / MaxFillAmount; if(color.HasValue) { - StrengthBar.color.UpdateColorRGB(color.Value); + StrengthBar.color = StrengthBar.color.UpdateColorRGB(color.Value); } } public void UpdateContinuous(float strength, Color? color = null) { StrengthBar.fillAmount = Mathf.Clamp01(strength / MaxFormationStrength) * MaxFillAmount; - StrengthBar.color.UpdateColorRGB(Player.CurrentPlayer.Color); + if(color.HasValue) + { + StrengthBar.color = StrengthBar.color.UpdateColorRGB(color.Value); + } } } } \ No newline at end of file diff --git a/Assets/GWConquest/Scripts/Unit.cs b/Assets/GWConquest/Scripts/Unit.cs index 9738500..10ef829 100644 --- a/Assets/GWConquest/Scripts/Unit.cs +++ b/Assets/GWConquest/Scripts/Unit.cs @@ -44,14 +44,15 @@ namespace GWConquest BoltEntity formationEntity = BoltNetwork.Instantiate(BoltPrefabs.Formation); player.AssignControl(formationEntity); playerFormation = formationEntity.GetComponent(); - playerFormation.currentZone = zone; playerFormation.Player = player; + playerFormation.currentZone = zone; } BoltEntity unitEntity = BoltNetwork.Instantiate(BoltPrefabs.Unit); player.AssignControl(unitEntity); Unit unit = unitEntity.GetComponent(); unit.Class = uc; + unit.state.Hitpoints = uc.Hitpoints; unit.Formation = playerFormation; playerFormation.UnitEntities.Add(unitEntity); diff --git a/Assets/GWConquest/Scripts/UnitClass.cs b/Assets/GWConquest/Scripts/UnitClass.cs index bad11e9..7fa3a9c 100644 --- a/Assets/GWConquest/Scripts/UnitClass.cs +++ b/Assets/GWConquest/Scripts/UnitClass.cs @@ -46,11 +46,10 @@ namespace GWConquest int[] attackCounts = data.GetIntArray("Attack Count"); int[] damages = data.GetIntArray("Damage"); - int[] penetrations = data.GetIntArray("Penetration"); + float[] penetrations = data.GetFloatArray("Penetration"); float[] accuracies = data.GetFloatArray("Accuracy"); - float[] attackTimers = data.GetFloatArray("Attack Timer"); - if (Util.AllEqual(attackCounts.Length, damages.Length, penetrations.Length, accuracies.Length, attackTimers.Length)) + if (Util.AllEqual(attackCounts.Length, damages.Length, penetrations.Length, accuracies.Length)) { unitClass.WeaponStatsArray = new WeaponStats[attackCounts.Length]; for (int j = 0; j < attackCounts.Length; j++) @@ -61,7 +60,6 @@ namespace GWConquest Damage = damages[j], Penetration = penetrations[j], Accuracy = accuracies[j], - AttackTimer = attackTimers[j] }; } } @@ -70,9 +68,10 @@ namespace GWConquest throw new FormatException("Unequal length in weapon stats!"); } - unitClass.Armour = data.GetInt("Armour"); + unitClass.Armour = data.GetFloat("Armour"); unitClass.Evasion = data.GetFloat("Evasion"); unitClass.Movement = data.GetFloat("Movement"); + unitClass.Size = data.GetInt("Size"); unitClass.BuildCost = new BuildCost { @@ -131,6 +130,11 @@ namespace GWConquest { LoadClassMap(); } + if(Util.IsStringEmpty(name)) + { + BoltLog.Warn("UnitClass.FromName called with null name!"); + return null; + } if (classMap.ContainsKey(name)) { return classMap[name]; @@ -164,9 +168,10 @@ namespace GWConquest public float UnitStrength; public int Hitpoints; - public int Armour; + public float Armour; public float Evasion; public float Movement; + public int Size; public WeaponStats[] WeaponStatsArray; @@ -198,9 +203,8 @@ namespace GWConquest { public int AttackCount; public int Damage; - public int Penetration; + public float Penetration; public float Accuracy; - public float AttackTimer; } [System.Serializable] diff --git a/Assets/GWConquest/Scripts/Util.cs b/Assets/GWConquest/Scripts/Util.cs index 2495aef..986e412 100644 --- a/Assets/GWConquest/Scripts/Util.cs +++ b/Assets/GWConquest/Scripts/Util.cs @@ -103,11 +103,9 @@ namespace GWConquest } } - public static void UpdateColorRGB(this Color color, Color newColor) + public static Color UpdateColorRGB(this Color color, Color newColor) { - color.r = newColor.r; - color.g = newColor.g; - color.b = newColor.b; + return new Color(newColor.r, newColor.g, newColor.b, color.a); } public static Vector3 SmoothDampEulerAngles(Vector3 current, Vector3 target, ref Vector3 velocity, float smoothTime) @@ -177,6 +175,11 @@ namespace GWConquest return minArg; } + public static bool IsStringEmpty(string str) + { + return str == null || str == ""; + } + } } \ No newline at end of file diff --git a/Assets/GWConquest/Scripts/Zone.cs b/Assets/GWConquest/Scripts/Zone.cs index 5281277..6c2c425 100644 --- a/Assets/GWConquest/Scripts/Zone.cs +++ b/Assets/GWConquest/Scripts/Zone.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using UnityEngine; +using System.Linq; namespace GWConquest { @@ -10,6 +11,9 @@ namespace GWConquest [System.NonSerialized] public ZoneType zoneType; + [System.NonSerialized] + public Battle CurrentBattle; + [SerializeField] private int zoneId; @@ -76,12 +80,48 @@ namespace GWConquest { formations.Add(formation); OnFormationChanged(formation); + + if (BoltNetwork.IsServer) + { + if (CurrentBattle != null) + { + CurrentBattle.AddFormation(formation); + } + else + { + if (ShouldStartBattle()) + { + var battleEntity = BoltNetwork.Instantiate(BoltPrefabs.Battle); + CurrentBattle = battleEntity.GetComponent(); + CurrentBattle.Zone = this; + foreach (Formation f in formations) + { + CurrentBattle.AddFormation(f); + } + } + } + } + + } + + public bool ShouldStartBattle() + { + return formations.Select((f, i) => f.Player).Distinct().Count() > 1; } public void OnFormationDeparting(Formation formation) { formations.Remove(formation); OnFormationChanged(formation); + + if (BoltNetwork.IsServer) + { + if (CurrentBattle != null) + { + CurrentBattle.RemoveFormation(formation); + } + } + } public void OnFormationChanged(Formation formation) diff --git a/Assets/Photon/PhotonBolt/assemblies/bolt.user.dll b/Assets/Photon/PhotonBolt/assemblies/bolt.user.dll index 04f82234aa758f89b3103afcf9ce005fd681e443..b568d511a64156c7dde3cc0c9c9d596fd8a88eb7 100644 GIT binary patch literal 42496 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 literal 33792 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 Gz5fdy?D_Tp diff --git a/Assets/Photon/PhotonBolt/assemblies/bolt.user.dll.mdb b/Assets/Photon/PhotonBolt/assemblies/bolt.user.dll.mdb index 4957380a8bb00a77faf99467891d664bb1e6019c..63d01c1e35ac91b40c2c03b8d4fb38185b50d61d 100644 GIT binary patch literal 17355 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 literal 13186 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 BbgcjY diff --git a/Assets/Photon/PhotonBolt/project.json b/Assets/Photon/PhotonBolt/project.json index 664f0d0..e32c176 100644 --- a/Assets/Photon/PhotonBolt/project.json +++ b/Assets/Photon/PhotonBolt/project.json @@ -108,6 +108,23 @@ "ExtrapolationMaxFrames": 9, "SnapMagnitude": 10.0 } + }, + { + "Name": "CurrentBattle", + "Enabled": true, + "Expanded": true, + "ReplicationMode": 1, + "Priority": 1, + "PropertyType": { + "$type": "Bolt.Compiler.PropertyTypeEntity, bolt.compiler" + }, + "AssetSettings": { + "$type": "Bolt.Compiler.PropertyStateSettings, bolt.compiler", + "ExtrapolationErrorTolerance": 0.25, + "_ExtrapolationCorrectionFrames": 6, + "ExtrapolationMaxFrames": 9, + "SnapMagnitude": 10.0 + } } ], "PacketMaxBits": 512, @@ -358,6 +375,23 @@ "ExtrapolationMaxFrames": 9, "SnapMagnitude": 10.0 } + }, + { + "Name": "IsAI", + "Enabled": true, + "Expanded": true, + "ReplicationMode": 1, + "Priority": 1, + "PropertyType": { + "$type": "Bolt.Compiler.PropertyTypeBool, bolt.compiler" + }, + "AssetSettings": { + "$type": "Bolt.Compiler.PropertyStateSettings, bolt.compiler", + "ExtrapolationErrorTolerance": 0.25, + "_ExtrapolationCorrectionFrames": 6, + "ExtrapolationMaxFrames": 9, + "SnapMagnitude": 10.0 + } } ], "PacketMaxBits": 512, @@ -567,6 +601,42 @@ "ExtrapolationMaxFrames": 9, "SnapMagnitude": 10.0 } + }, + { + "Name": "Hitpoints", + "Enabled": true, + "Expanded": true, + "ReplicationMode": 1, + "Priority": 1, + "PropertyType": { + "$type": "Bolt.Compiler.PropertyTypeInteger, bolt.compiler", + "MaxValue": 255 + }, + "AssetSettings": { + "$type": "Bolt.Compiler.PropertyStateSettings, bolt.compiler", + "ExtrapolationErrorTolerance": 0.25, + "_ExtrapolationCorrectionFrames": 6, + "ExtrapolationMaxFrames": 9, + "SnapMagnitude": 10.0 + } + }, + { + "Name": "RevealState", + "Enabled": true, + "Expanded": true, + "ReplicationMode": 1, + "Priority": 1, + "PropertyType": { + "$type": "Bolt.Compiler.PropertyTypeInteger, bolt.compiler", + "MaxValue": 255 + }, + "AssetSettings": { + "$type": "Bolt.Compiler.PropertyStateSettings, bolt.compiler", + "ExtrapolationErrorTolerance": 0.25, + "_ExtrapolationCorrectionFrames": 6, + "ExtrapolationMaxFrames": 9, + "SnapMagnitude": 10.0 + } } ], "PacketMaxBits": 512, @@ -766,6 +836,19 @@ "AssetSettings": { "$type": "Bolt.Compiler.PropertyEventSettings, bolt.compiler" } + }, + { + "Name": "Player", + "Enabled": true, + "Expanded": true, + "ReplicationMode": 1, + "Priority": 1, + "PropertyType": { + "$type": "Bolt.Compiler.PropertyTypeEntity, bolt.compiler" + }, + "AssetSettings": { + "$type": "Bolt.Compiler.PropertyEventSettings, bolt.compiler" + } } ], "Name": "AddProductionEvent", @@ -818,11 +901,204 @@ "ExtrapolationMaxFrames": 9, "SnapMagnitude": 10.0 } + }, + { + "Name": "Player", + "Enabled": true, + "Expanded": true, + "ReplicationMode": 1, + "Priority": 1, + "PropertyType": { + "$type": "Bolt.Compiler.PropertyTypeEntity, bolt.compiler" + }, + "AssetSettings": { + "$type": "Bolt.Compiler.PropertyStateSettings, bolt.compiler", + "ExtrapolationErrorTolerance": 0.25, + "_ExtrapolationCorrectionFrames": 6, + "ExtrapolationMaxFrames": 9, + "SnapMagnitude": 10.0 + } } ], "Name": "QueueEntry", "Guid": "1cc5b915-f4e9-46d4-bae3-de6b38d6dd82", "Groups": [] + }, + { + "$type": "Bolt.Compiler.StateDefinition, bolt.compiler", + "Properties": [ + { + "Name": "FormationList", + "Enabled": true, + "Expanded": true, + "ReplicationMode": 1, + "Priority": 1, + "PropertyType": { + "$type": "Bolt.Compiler.PropertyTypeProtocolToken, bolt.compiler" + }, + "AssetSettings": { + "$type": "Bolt.Compiler.PropertyStateSettings, bolt.compiler", + "ExtrapolationErrorTolerance": 0.25, + "_ExtrapolationCorrectionFrames": 6, + "ExtrapolationMaxFrames": 9, + "SnapMagnitude": 10.0 + } + }, + { + "Name": "Zone", + "Enabled": true, + "Expanded": true, + "ReplicationMode": 1, + "Priority": 1, + "PropertyType": { + "$type": "Bolt.Compiler.PropertyTypeInteger, bolt.compiler", + "MaxValue": 255 + }, + "AssetSettings": { + "$type": "Bolt.Compiler.PropertyStateSettings, bolt.compiler", + "ExtrapolationErrorTolerance": 0.25, + "_ExtrapolationCorrectionFrames": 6, + "ExtrapolationMaxFrames": 9, + "SnapMagnitude": 10.0 + } + }, + { + "Name": "BattleName", + "Enabled": true, + "Expanded": true, + "ReplicationMode": 1, + "Priority": 1, + "PropertyType": { + "$type": "Bolt.Compiler.PropertyTypeString, bolt.compiler", + "MaxLength": 1 + }, + "AssetSettings": { + "$type": "Bolt.Compiler.PropertyStateSettings, bolt.compiler", + "ExtrapolationErrorTolerance": 0.25, + "_ExtrapolationCorrectionFrames": 6, + "ExtrapolationMaxFrames": 9, + "SnapMagnitude": 10.0 + } + } + ], + "PacketMaxBits": 512, + "PacketMaxProperties": 16, + "InitialPositionCompression": { + "Compression": [ + { + "MinValue": -1024, + "MaxValue": 1024, + "Accuracy": 0.01, + "Pack": 100.0, + "Read": 0.01, + "Shift": 1024.0, + "BitsRequired": 18 + }, + { + "MinValue": -1024, + "MaxValue": 1024, + "Accuracy": 0.01, + "Pack": 100.0, + "Read": 0.01, + "Shift": 1024.0, + "BitsRequired": 18 + }, + { + "MinValue": -1024, + "MaxValue": 1024, + "Accuracy": 0.01, + "Pack": 100.0, + "Read": 0.01, + "Shift": 1024.0, + "BitsRequired": 18 + } + ] + }, + "InitialRotationCompression": { + "EulerCompression": [ + { + "MaxValue": 360, + "Accuracy": 1.0, + "Pack": 1.0, + "Read": 1.0, + "BitsRequired": 9 + }, + { + "MaxValue": 360, + "Accuracy": 1.0, + "Pack": 1.0, + "Read": 1.0, + "BitsRequired": 9 + }, + { + "MaxValue": 360, + "Accuracy": 1.0, + "Pack": 1.0, + "Read": 1.0, + "BitsRequired": 9 + } + ], + "QuaternionCompression": { + "MinValue": -1, + "MaxValue": 1, + "Accuracy": 0.01, + "Pack": 100.0, + "Read": 0.01, + "Shift": 1.0, + "BitsRequired": 8 + } + }, + "Name": "BattleState", + "Guid": "4b486c12-bb55-4fb6-88f3-1a16218c67cf", + "Groups": [] + }, + { + "$type": "Bolt.Compiler.EventDefinition, bolt.compiler", + "Properties": [ + { + "Name": "Attacker", + "Enabled": true, + "Expanded": true, + "ReplicationMode": 1, + "Priority": 1, + "PropertyType": { + "$type": "Bolt.Compiler.PropertyTypeEntity, bolt.compiler" + }, + "AssetSettings": { + "$type": "Bolt.Compiler.PropertyEventSettings, bolt.compiler" + } + }, + { + "Name": "Target", + "Enabled": true, + "Expanded": true, + "ReplicationMode": 1, + "Priority": 1, + "PropertyType": { + "$type": "Bolt.Compiler.PropertyTypeEntity, bolt.compiler" + }, + "AssetSettings": { + "$type": "Bolt.Compiler.PropertyEventSettings, bolt.compiler" + } + }, + { + "Name": "Action", + "Enabled": true, + "Expanded": true, + "ReplicationMode": 1, + "Priority": 1, + "PropertyType": { + "$type": "Bolt.Compiler.PropertyTypeString, bolt.compiler", + "MaxLength": 1 + }, + "AssetSettings": { + "$type": "Bolt.Compiler.PropertyEventSettings, bolt.compiler" + } + } + ], + "Name": "AddBattleLogEvent", + "Guid": "7c2a7f70-ed97-4ff2-9a1b-dfcd08fe6c1e", + "Groups": [] } ], "ActiveGroup": "Everything" diff --git a/Assets/Photon/PhotonBolt/resources/BoltPrefabDatabase.asset b/Assets/Photon/PhotonBolt/resources/BoltPrefabDatabase.asset index 765dcc3..5ae9003 100644 --- a/Assets/Photon/PhotonBolt/resources/BoltPrefabDatabase.asset +++ b/Assets/Photon/PhotonBolt/resources/BoltPrefabDatabase.asset @@ -15,6 +15,7 @@ MonoBehaviour: DatabaseMode: 0 Prefabs: - {fileID: 0} + - {fileID: 2057280478138210166, guid: 12e1714c02c111f4e9d6981ad8f8036b, type: 3} - {fileID: 1355812926097278600, guid: fc3eae9e9964d5446a5c38fbf9a203bb, type: 3} - {fileID: 8292977142823461082, guid: 6af4ad43e05dcb344bfd726895735387, type: 3} - {fileID: 3262827332414082260, guid: f05198a1b03fe2b4e8042a9349c41aa3, type: 3}