From b08d008a08cad697038e81737fe4b58f7f42acdd Mon Sep 17 00:00:00 2001 From: austin Date: Thu, 3 Apr 2025 15:05:13 -0400 Subject: [PATCH] recursive foliage definition files --- assets/Data/entity/foliage.json | 249 +----------------- assets/Data/entity/foliage/bushes.json | 17 ++ assets/Data/entity/foliage/grass.json | 30 +++ assets/Data/entity/foliage/trees.json | 214 +++++++++++++++ docs/src/progress/renderertodo.md | 1 + .../terrain/foliage/FoliageCellManager.java | 2 +- .../client/terrain/foliage/FoliageModel.java | 2 +- .../ui/components/SpawnSelectionPanel.java | 2 +- .../ingame/MenuGeneratorsLevelEditor.java | 2 +- .../entity/types/foliage/FoliageUtils.java | 4 +- .../entity/types/tree/ProceduralTree.java | 2 +- .../java/electrosphere/game/data/Config.java | 61 ++++- .../data/foliage/type/FoliageTypeLoader.java | 49 ++++ .../foliage/type/model/FoliageTypeMap.java | 18 +- .../entity/SpawnAllEntitiesTests.java | 6 +- 15 files changed, 397 insertions(+), 262 deletions(-) create mode 100644 assets/Data/entity/foliage/bushes.json create mode 100644 assets/Data/entity/foliage/grass.json create mode 100644 assets/Data/entity/foliage/trees.json create mode 100644 src/main/java/electrosphere/game/data/foliage/type/FoliageTypeLoader.java diff --git a/assets/Data/entity/foliage.json b/assets/Data/entity/foliage.json index 5fde21e9..487b7da7 100644 --- a/assets/Data/entity/foliage.json +++ b/assets/Data/entity/foliage.json @@ -1,248 +1,9 @@ { "foliageList" : [ - { - "id" : "Green Grass", - "tokens" : [ - "AMBIENT", - "REACTS_TO_WIND", - "GROWS_BACK", - "FLAMMABLE" - ], - "growthModel": { - "growthRate" : 0.001 - }, - "grassData": { - "baseColor": {"x": 0.25, "y": 0.6, "z": 0.43}, - "tipColor": {"x": 0.17, "y": 0.71, "z": 0.12}, - "maxTipCurve" : 0.27, - "minHeight" : 0.7, - "maxHeight" : 1.3 - }, - "graphicsTemplate": { - "model": { - "path" : "Models/foliage/grass2.fbx" - } - } - }, - { - "id" : "pine", - "tokens" : [ - "TREE", - "REACTS_TO_WIND", - "GROWS_BACK", - "FLAMMABLE", - "SEEDED" - ], - "growthModel": { - "growthRate" : 0.001 - }, - "ambientAudio": { - "responseWindAudioFilePath": "Audio/ambienceWind1SeamlessMono.ogg", - "responseWindLoops": true, - "randomizeOffset": true, - "gainMultiplier": 0.9, - "emitterSpatialOffset": [0,3,0] - }, - "graphicsTemplate": { - "proceduralModel": { - "treeModel": { - "trunkModel": { - "trunkScalarFalloffFactor": 0.2, - "minimumTrunkScalar": 0.2, - "maximumTrunkSegments": 6, - "physicsCutoff": 3, - "centralTrunk": true - }, - "branchModel": { - "limbScalarFalloffFactor": 0.3, - "minimumLimbScalar": 0.25, - "maximumLimbDispersion": 0.5, - "minimumLimbDispersion": 0.3, - "minimumNumberForks": 3, - "maximumNumberForks": 5, - "maximumBranchSegments": 3, - "maxBranchSegmentFalloffFactor": 1, - "minimumSegmentToSpawnLeaves": 2 - }, - "minBranchHeightToStartSpawningLeaves": 1.5, - "maxBranchHeightToStartSpawningLeaves": 3.01, - "leafIncrement": 0.5, - "minLeavesToSpawnPerPoint": 3, - "maxLeavesToSpawnPerPoint": 5, - "leafDistanceFromCenter": 1.2, - "peelVariance": 0.2, - "peelMinimum": 0.1, - "swaySigmoidFactor": 2, - "minimumSwayTime": 500, - "swayTimeVariance": 500, - "yawVariance": 0.2, - "yawMinimum": 0.1, - "minimumScalarToGenerateSwayTree": 0.5, - "maximumScalarToGenerateSwayTree": 1.0, - "branchHeight": 3, - "physicsBody": { - "type" : "CYLINDER", - "dimension1" : 0.5, - "dimension2" : 3, - "dimension3" : 0.5, - "rotX": 0, - "rotY": 0, - "rotZ": 0, - "rotW": 1, - "offsetX" : 0, - "offsetY" : 1.5, - "offsetZ" : 0 - } - } - } - } - }, - { - "id" : "oak", - "tokens" : [ - "TREE", - "REACTS_TO_WIND", - "GROWS_BACK", - "FLAMMABLE", - "SEEDED" - ], - "growthModel": { - "growthRate" : 0.001 - }, - "ambientAudio": { - "responseWindAudioFilePath": "Audio/ambienceWind1SeamlessMono.ogg", - "responseWindLoops": true, - "randomizeOffset": true, - "gainMultiplier": 0.9, - "emitterSpatialOffset": [0,3,0] - }, - "graphicsTemplate": { - "proceduralModel": { - "treeModel": { - "trunkModel": { - "maximumTrunkSegments": 4, - "physicsCutoff": 3, - "centralTrunk": false - }, - "branchModel": { - "limbScalarFalloffFactor": 0.3, - "minimumLimbScalar": 0.25, - "maximumLimbDispersion": 0.5, - "minimumLimbDispersion": 0.3, - "minimumNumberForks": 3, - "maximumNumberForks": 5, - "maximumBranchSegments": 3, - "maxBranchSegmentFalloffFactor": 1, - "minimumSegmentToSpawnLeaves": 2 - }, - "minBranchHeightToStartSpawningLeaves": 1.5, - "maxBranchHeightToStartSpawningLeaves": 3.01, - "leafIncrement": 0.5, - "minLeavesToSpawnPerPoint": 3, - "maxLeavesToSpawnPerPoint": 5, - "leafDistanceFromCenter": 1.2, - "peelVariance": 0.2, - "peelMinimum": 0.1, - "swaySigmoidFactor": 2, - "minimumSwayTime": 500, - "swayTimeVariance": 500, - "yawVariance": 0.2, - "yawMinimum": 0.1, - "minimumScalarToGenerateSwayTree": 0.5, - "maximumScalarToGenerateSwayTree": 1.0, - "branchHeight": 3, - "physicsBody": { - "type" : "CYLINDER", - "dimension1" : 0.5, - "dimension2" : 3, - "dimension3" : 0.5, - "rotX": 0, - "rotY": 0, - "rotZ": 0, - "rotW": 1, - "offsetX" : 0, - "offsetY" : 1.5, - "offsetZ" : 0 - } - } - } - } - }, - { - "id" : "pine2", - "tokens" : [ - "TREE", - "FLAMMABLE" - ], - "hitboxes" : [ - { - "type": "hurt", - "offset": [0, 0.045, 0], - "radius": 0.175 - }, - { - "type": "hurt", - "offset": [0, 0.6, 0], - "radius": 0.175 - }, - { - "type": "hurt", - "offset": [0, 1.2, 0], - "radius": 0.175 - }, - { - "type": "hurt", - "offset": [0, 1.8, 0], - "radius": 0.175 - } - ], - "collidable" : { - "type" : "CYLINDER", - "dimension1" : 0.2, - "dimension2" : 1.6, - "dimension3" : 0.2, - "linearFriction": 0.001, - "mass": 0.3, - "rotX": 0, - "rotY": 0, - "rotZ": 0, - "rotW": 1, - "offsetX" : 0, - "offsetY" : 0.8, - "offsetZ" : 0, - "kinematic" : true - }, - "healthSystem" : { - "maxHealth" : 50, - "onDamageIFrames" : 5, - "lootPool" : { - "tickets" : [ - { - "itemId" : "Log", - "rarity" : 0.8, - "minQuantity" : 0, - "maxQuantity" : 2 - } - ] - } - }, - "graphicsTemplate": { - "model": { - "path" : "Models/foliage/tree4.glb" - } - } - }, - { - "id" : "bush4", - "tokens" : [ - "FLAMMABLE" - ], - "graphicsTemplate": { - "model": { - "path" : "Models/foliage/bush4.glb" - } - } - } - + ], + "files" : [ + "Data/entity/foliage/grass.json", + "Data/entity/foliage/trees.json", + "Data/entity/foliage/bushes.json" ] } diff --git a/assets/Data/entity/foliage/bushes.json b/assets/Data/entity/foliage/bushes.json new file mode 100644 index 00000000..f1a6acca --- /dev/null +++ b/assets/Data/entity/foliage/bushes.json @@ -0,0 +1,17 @@ +{ + "foliageList" : [ + { + "id" : "bush4", + "tokens" : [ + "FLAMMABLE" + ], + "graphicsTemplate": { + "model": { + "path" : "Models/foliage/bush4.glb" + } + } + } + ], + "files" : [ + ] +} diff --git a/assets/Data/entity/foliage/grass.json b/assets/Data/entity/foliage/grass.json new file mode 100644 index 00000000..cbb4f2c2 --- /dev/null +++ b/assets/Data/entity/foliage/grass.json @@ -0,0 +1,30 @@ +{ + "foliageList" : [ + { + "id" : "Green Grass", + "tokens" : [ + "AMBIENT", + "REACTS_TO_WIND", + "GROWS_BACK", + "FLAMMABLE" + ], + "growthModel": { + "growthRate" : 0.001 + }, + "grassData": { + "baseColor": {"x": 0.25, "y": 0.6, "z": 0.43}, + "tipColor": {"x": 0.17, "y": 0.71, "z": 0.12}, + "maxTipCurve" : 0.27, + "minHeight" : 0.7, + "maxHeight" : 1.3 + }, + "graphicsTemplate": { + "model": { + "path" : "Models/foliage/grass2.fbx" + } + } + } + ], + "files" : [ + ] +} diff --git a/assets/Data/entity/foliage/trees.json b/assets/Data/entity/foliage/trees.json new file mode 100644 index 00000000..75dfeb7e --- /dev/null +++ b/assets/Data/entity/foliage/trees.json @@ -0,0 +1,214 @@ +{ + "foliageList" : [ + { + "id" : "pine", + "tokens" : [ + "TREE", + "REACTS_TO_WIND", + "GROWS_BACK", + "FLAMMABLE", + "SEEDED" + ], + "growthModel": { + "growthRate" : 0.001 + }, + "ambientAudio": { + "responseWindAudioFilePath": "Audio/ambienceWind1SeamlessMono.ogg", + "responseWindLoops": true, + "randomizeOffset": true, + "gainMultiplier": 0.9, + "emitterSpatialOffset": [0,3,0] + }, + "graphicsTemplate": { + "proceduralModel": { + "treeModel": { + "trunkModel": { + "trunkScalarFalloffFactor": 0.2, + "minimumTrunkScalar": 0.2, + "maximumTrunkSegments": 6, + "physicsCutoff": 3, + "centralTrunk": true + }, + "branchModel": { + "limbScalarFalloffFactor": 0.3, + "minimumLimbScalar": 0.25, + "maximumLimbDispersion": 0.5, + "minimumLimbDispersion": 0.3, + "minimumNumberForks": 3, + "maximumNumberForks": 5, + "maximumBranchSegments": 3, + "maxBranchSegmentFalloffFactor": 1, + "minimumSegmentToSpawnLeaves": 2 + }, + "minBranchHeightToStartSpawningLeaves": 1.5, + "maxBranchHeightToStartSpawningLeaves": 3.01, + "leafIncrement": 0.5, + "minLeavesToSpawnPerPoint": 3, + "maxLeavesToSpawnPerPoint": 5, + "leafDistanceFromCenter": 1.2, + "peelVariance": 0.2, + "peelMinimum": 0.1, + "swaySigmoidFactor": 2, + "minimumSwayTime": 500, + "swayTimeVariance": 500, + "yawVariance": 0.2, + "yawMinimum": 0.1, + "minimumScalarToGenerateSwayTree": 0.5, + "maximumScalarToGenerateSwayTree": 1.0, + "branchHeight": 3, + "physicsBody": { + "type" : "CYLINDER", + "dimension1" : 0.5, + "dimension2" : 3, + "dimension3" : 0.5, + "rotX": 0, + "rotY": 0, + "rotZ": 0, + "rotW": 1, + "offsetX" : 0, + "offsetY" : 1.5, + "offsetZ" : 0 + } + } + } + } + }, + { + "id" : "oak", + "tokens" : [ + "TREE", + "REACTS_TO_WIND", + "GROWS_BACK", + "FLAMMABLE", + "SEEDED" + ], + "growthModel": { + "growthRate" : 0.001 + }, + "ambientAudio": { + "responseWindAudioFilePath": "Audio/ambienceWind1SeamlessMono.ogg", + "responseWindLoops": true, + "randomizeOffset": true, + "gainMultiplier": 0.9, + "emitterSpatialOffset": [0,3,0] + }, + "graphicsTemplate": { + "proceduralModel": { + "treeModel": { + "trunkModel": { + "maximumTrunkSegments": 4, + "physicsCutoff": 3, + "centralTrunk": false + }, + "branchModel": { + "limbScalarFalloffFactor": 0.3, + "minimumLimbScalar": 0.25, + "maximumLimbDispersion": 0.5, + "minimumLimbDispersion": 0.3, + "minimumNumberForks": 3, + "maximumNumberForks": 5, + "maximumBranchSegments": 3, + "maxBranchSegmentFalloffFactor": 1, + "minimumSegmentToSpawnLeaves": 2 + }, + "minBranchHeightToStartSpawningLeaves": 1.5, + "maxBranchHeightToStartSpawningLeaves": 3.01, + "leafIncrement": 0.5, + "minLeavesToSpawnPerPoint": 3, + "maxLeavesToSpawnPerPoint": 5, + "leafDistanceFromCenter": 1.2, + "peelVariance": 0.2, + "peelMinimum": 0.1, + "swaySigmoidFactor": 2, + "minimumSwayTime": 500, + "swayTimeVariance": 500, + "yawVariance": 0.2, + "yawMinimum": 0.1, + "minimumScalarToGenerateSwayTree": 0.5, + "maximumScalarToGenerateSwayTree": 1.0, + "branchHeight": 3, + "physicsBody": { + "type" : "CYLINDER", + "dimension1" : 0.5, + "dimension2" : 3, + "dimension3" : 0.5, + "rotX": 0, + "rotY": 0, + "rotZ": 0, + "rotW": 1, + "offsetX" : 0, + "offsetY" : 1.5, + "offsetZ" : 0 + } + } + } + } + }, + { + "id" : "pine2", + "tokens" : [ + "TREE", + "FLAMMABLE" + ], + "hitboxes" : [ + { + "type": "hurt", + "offset": [0, 0.045, 0], + "radius": 0.175 + }, + { + "type": "hurt", + "offset": [0, 0.6, 0], + "radius": 0.175 + }, + { + "type": "hurt", + "offset": [0, 1.2, 0], + "radius": 0.175 + }, + { + "type": "hurt", + "offset": [0, 1.8, 0], + "radius": 0.175 + } + ], + "collidable" : { + "type" : "CYLINDER", + "dimension1" : 0.2, + "dimension2" : 1.6, + "dimension3" : 0.2, + "linearFriction": 0.001, + "mass": 0.3, + "rotX": 0, + "rotY": 0, + "rotZ": 0, + "rotW": 1, + "offsetX" : 0, + "offsetY" : 0.8, + "offsetZ" : 0, + "kinematic" : true + }, + "healthSystem" : { + "maxHealth" : 50, + "onDamageIFrames" : 5, + "lootPool" : { + "tickets" : [ + { + "itemId" : "Log", + "rarity" : 0.8, + "minQuantity" : 0, + "maxQuantity" : 2 + } + ] + } + }, + "graphicsTemplate": { + "model": { + "path" : "Models/foliage/tree4.glb" + } + } + } + ], + "files" : [ + ] +} diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index d1a3e21f..97c46e9a 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1423,6 +1423,7 @@ Add rock and stick items Update ServerEntityUtils.repositionEntityRecursive behavior Add bush entity Add bushes to forest biome +Make foliage data files recursive diff --git a/src/main/java/electrosphere/client/terrain/foliage/FoliageCellManager.java b/src/main/java/electrosphere/client/terrain/foliage/FoliageCellManager.java index 9896b25c..165fb801 100644 --- a/src/main/java/electrosphere/client/terrain/foliage/FoliageCellManager.java +++ b/src/main/java/electrosphere/client/terrain/foliage/FoliageCellManager.java @@ -176,7 +176,7 @@ public class FoliageCellManager { */ public void init(){ //queue ambient foliage models - for(FoliageType foliageType : Globals.gameConfigCurrent.getFoliageMap().getFoliageList()){ + for(FoliageType foliageType : Globals.gameConfigCurrent.getFoliageMap().getTypes()){ if(foliageType.getTokens().contains(FoliageType.TOKEN_AMBIENT)){ Globals.assetManager.addModelPathToQueue(foliageType.getGraphicsTemplate().getModel().getPath()); Globals.assetManager.addShaderToQueue(FoliageCell.vertexPath, FoliageCell.fragmentPath); diff --git a/src/main/java/electrosphere/client/terrain/foliage/FoliageModel.java b/src/main/java/electrosphere/client/terrain/foliage/FoliageModel.java index 318b147f..d8e66b3f 100644 --- a/src/main/java/electrosphere/client/terrain/foliage/FoliageModel.java +++ b/src/main/java/electrosphere/client/terrain/foliage/FoliageModel.java @@ -181,7 +181,7 @@ public class FoliageModel { Random placementRandomizer = new Random(); //get type String foliageTypeName = foliageTypesSupported.get(0); - FoliageType foliageType = Globals.gameConfigCurrent.getFoliageMap().getFoliage(foliageTypeName); + FoliageType foliageType = Globals.gameConfigCurrent.getFoliageMap().getType(foliageTypeName); CommonEntityUtils.setCommonData(rVal, foliageType); CommonEntityUtils.setEntityType(rVal, EntityType.FOLIAGE); CommonEntityUtils.setEntitySubtype(rVal, foliageType.getId()); diff --git a/src/main/java/electrosphere/client/ui/components/SpawnSelectionPanel.java b/src/main/java/electrosphere/client/ui/components/SpawnSelectionPanel.java index 5e92fa8e..92f1b35d 100644 --- a/src/main/java/electrosphere/client/ui/components/SpawnSelectionPanel.java +++ b/src/main/java/electrosphere/client/ui/components/SpawnSelectionPanel.java @@ -94,7 +94,7 @@ public class SpawnSelectionPanel { //get relevant types List types = new LinkedList(); types.addAll(Globals.gameConfigCurrent.getCreatureTypeLoader().getTypes()); - types.addAll(Globals.gameConfigCurrent.getFoliageMap().getFoliageList()); + types.addAll(Globals.gameConfigCurrent.getFoliageMap().getTypes()); types.addAll(Globals.gameConfigCurrent.getItemMap().getTypes()); types.addAll(Globals.gameConfigCurrent.getObjectTypeMap().getTypes()); types = types.stream().filter((type) -> type.getId().toLowerCase().contains(searchString.toLowerCase())).toList(); diff --git a/src/main/java/electrosphere/client/ui/menu/ingame/MenuGeneratorsLevelEditor.java b/src/main/java/electrosphere/client/ui/menu/ingame/MenuGeneratorsLevelEditor.java index b98c5cb2..68a87dff 100644 --- a/src/main/java/electrosphere/client/ui/menu/ingame/MenuGeneratorsLevelEditor.java +++ b/src/main/java/electrosphere/client/ui/menu/ingame/MenuGeneratorsLevelEditor.java @@ -230,7 +230,7 @@ public class MenuGeneratorsLevelEditor { })); //button for spawning all foliage types - for(FoliageType data : Globals.gameConfigCurrent.getFoliageMap().getFoliageList()){ + for(FoliageType data : Globals.gameConfigCurrent.getFoliageMap().getTypes()){ //spawn foliage button scrollable.addChild(Button.createButton("Spawn " + data.getId(), () -> { LoggerInterface.loggerEngine.INFO("spawn " + data.getId() + "!"); diff --git a/src/main/java/electrosphere/entity/types/foliage/FoliageUtils.java b/src/main/java/electrosphere/entity/types/foliage/FoliageUtils.java index 0b0efcb3..a5f0f4fb 100644 --- a/src/main/java/electrosphere/entity/types/foliage/FoliageUtils.java +++ b/src/main/java/electrosphere/entity/types/foliage/FoliageUtils.java @@ -33,7 +33,7 @@ public class FoliageUtils { * @return The entity for the foliage */ public static Entity clientSpawnBasicFoliage(String type, long seed){ - FoliageType rawType = Globals.gameConfigCurrent.getFoliageMap().getFoliage(type); + FoliageType rawType = Globals.gameConfigCurrent.getFoliageMap().getType(type); Entity rVal; if( rawType.getGraphicsTemplate().getProceduralModel() != null && @@ -78,7 +78,7 @@ public class FoliageUtils { * @return the tree entity */ public static Entity serverSpawnTreeFoliage(Realm realm, Vector3d position, String type, long seed){ - FoliageType rawType = Globals.gameConfigCurrent.getFoliageMap().getFoliage(type); + FoliageType rawType = Globals.gameConfigCurrent.getFoliageMap().getType(type); Entity rVal; if( rawType.getGraphicsTemplate().getProceduralModel() != null && diff --git a/src/main/java/electrosphere/entity/types/tree/ProceduralTree.java b/src/main/java/electrosphere/entity/types/tree/ProceduralTree.java index f9a0f7eb..4c1d71c3 100644 --- a/src/main/java/electrosphere/entity/types/tree/ProceduralTree.java +++ b/src/main/java/electrosphere/entity/types/tree/ProceduralTree.java @@ -101,7 +101,7 @@ public class ProceduralTree { Random treeRandom = new Random(seed); //call recursive branching routine to generate branches from trunk + leaf blobs - FoliageType foliageType = Globals.gameConfigCurrent.getFoliageMap().getFoliage(type); + FoliageType foliageType = Globals.gameConfigCurrent.getFoliageMap().getType(type); TreeModel treeModel = foliageType.getGraphicsTemplate().getProceduralModel().getTreeModel(); //generate trunk diff --git a/src/main/java/electrosphere/game/data/Config.java b/src/main/java/electrosphere/game/data/Config.java index 3e176867..6ac59c7e 100644 --- a/src/main/java/electrosphere/game/data/Config.java +++ b/src/main/java/electrosphere/game/data/Config.java @@ -14,6 +14,8 @@ import electrosphere.game.data.creature.type.CreatureData; import electrosphere.game.data.creature.type.CreatureTypeLoader; import electrosphere.game.data.creature.type.attack.AttackMoveResolver; import electrosphere.game.data.creature.type.model.CreatureTypeMap; +import electrosphere.game.data.foliage.type.FoliageType; +import electrosphere.game.data.foliage.type.FoliageTypeLoader; import electrosphere.game.data.foliage.type.model.FoliageTypeMap; import electrosphere.game.data.item.ItemDataMap; import electrosphere.game.data.projectile.ProjectileTypeHolder; @@ -31,13 +33,22 @@ import electrosphere.util.FileUtils; */ public class Config { + /** + * The container for all creature definitions + */ CreatureTypeLoader creatureTypeLoader; /** * The container for all item definitions */ ItemDataMap itemMap; - FoliageTypeMap foliageMap; + + /** + * The container for all foliage definitions + */ + FoliageTypeLoader foliageMap; + + CommonEntityMap objectTypeLoader; SymbolMap symbolMap; RaceMap raceMap; @@ -85,10 +96,10 @@ public class Config { */ public static Config loadDefaultConfig(){ Config config = new Config(); - config.creatureTypeLoader = loadCreatureTypes("Data/entity/creatures.json"); + config.creatureTypeLoader = Config.loadCreatureTypes("Data/entity/creatures.json"); config.itemMap = ItemDataMap.loadItemFiles("Data/entity/items.json"); - config.foliageMap = FileUtils.loadObjectFromAssetPath("Data/entity/foliage.json", FoliageTypeMap.class); - config.objectTypeLoader = loadCommonEntityTypes("Data/entity/objects.json"); + config.foliageMap = Config.loadFoliageTypes("Data/entity/foliage.json"); + config.objectTypeLoader = Config.loadCommonEntityTypes("Data/entity/objects.json"); config.symbolMap = FileUtils.loadObjectFromAssetPath("Data/game/symbolism.json", SymbolMap.class); config.raceMap = FileUtils.loadObjectFromAssetPath("Data/game/races.json", RaceMap.class); config.voxelData = FileUtils.loadObjectFromAssetPath("Data/game/voxelTypes.json", VoxelData.class); @@ -163,7 +174,7 @@ public class Config { } //push types from any other files for(String filepath : typeMap.getFiles()){ - List parsedTypeList = readCreatureTypeFile(filepath); + List parsedTypeList = Config.readCreatureTypeFile(filepath); for(CreatureData type : parsedTypeList){ typeList.add(type); } @@ -178,7 +189,7 @@ public class Config { */ static CreatureTypeLoader loadCreatureTypes(String initialPath) { CreatureTypeLoader loader = new CreatureTypeLoader(); - List typeList = readCreatureTypeFile(initialPath); + List typeList = Config.readCreatureTypeFile(initialPath); for(CreatureData type : typeList){ if(type.getAttackMoves() != null){ type.setAttackMoveResolver(new AttackMoveResolver(type.getAttackMoves())); @@ -194,6 +205,42 @@ public class Config { return loader; } + /** + * Reads a child foliage defintion file + * @param filename The filename + * @return The list of foliage in the file + */ + static List readFoliageTypeFile(String filename){ + List typeList = new LinkedList(); + FoliageTypeMap typeMap = FileUtils.loadObjectFromAssetPath(filename, FoliageTypeMap.class); + //push the types from this file + for(FoliageType foliage : typeMap.getFoliageList()){ + typeList.add(foliage); + } + //push types from any other files + for(String filepath : typeMap.getFiles()){ + List parsedTypeList = Config.readFoliageTypeFile(filepath); + for(FoliageType type : parsedTypeList){ + typeList.add(type); + } + } + return typeList; + } + + /** + * Loads all creature definition files recursively + * @param initialPath The initial path to recurse from + * @return The creature defintion interface + */ + static FoliageTypeLoader loadFoliageTypes(String initialPath) { + FoliageTypeLoader loader = new FoliageTypeLoader(); + List typeList = Config.readFoliageTypeFile(initialPath); + for(FoliageType type : typeList){ + loader.putType(type.getId(), type); + } + return loader; + } + /** * Gets the interface for creature definitions loaded into memory * @return The interface @@ -214,7 +261,7 @@ public class Config { * Gets the data on all foliage types in memory * @return The foliage data */ - public FoliageTypeMap getFoliageMap() { + public FoliageTypeLoader getFoliageMap() { return foliageMap; } diff --git a/src/main/java/electrosphere/game/data/foliage/type/FoliageTypeLoader.java b/src/main/java/electrosphere/game/data/foliage/type/FoliageTypeLoader.java new file mode 100644 index 00000000..98d4b21f --- /dev/null +++ b/src/main/java/electrosphere/game/data/foliage/type/FoliageTypeLoader.java @@ -0,0 +1,49 @@ +package electrosphere.game.data.foliage.type; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +public class FoliageTypeLoader { + + /** + * The map of entity id -> entity data + */ + Map idTypeMap = new HashMap(); + + /** + * Adds entity data to the loader + * @param name The id of the entity + * @param type The entity data + */ + public void putType(String name, FoliageType type){ + idTypeMap.put(name,type); + } + + /** + * Gets entity data from the id of the type + * @param id The id of the type + * @return The entity data if it exists, null otherwise + */ + public FoliageType getType(String id){ + return idTypeMap.get(id); + } + + /** + * Gets the collection of all entity data + * @return the collection of all entity data + */ + public Collection getTypes(){ + return idTypeMap.values(); + } + + /** + * Gets the set of all entity data id's stored in the loader + * @return the set of all entity data ids + */ + public Set getTypeIds(){ + return idTypeMap.keySet(); + } + +} diff --git a/src/main/java/electrosphere/game/data/foliage/type/model/FoliageTypeMap.java b/src/main/java/electrosphere/game/data/foliage/type/model/FoliageTypeMap.java index cd8e3e22..b501c175 100644 --- a/src/main/java/electrosphere/game/data/foliage/type/model/FoliageTypeMap.java +++ b/src/main/java/electrosphere/game/data/foliage/type/model/FoliageTypeMap.java @@ -8,9 +8,17 @@ import java.util.List; */ public class FoliageTypeMap { - //The list of all foliage types + /** + * List of all the foliage types in this file + */ List foliageList; + /** + * The list of sub-files under this file + */ + List files; + + /** * Gets the list of all foliage types * @return The list of all foliage types @@ -32,5 +40,13 @@ public class FoliageTypeMap { } return null; } + + /** + * Gets the list of files under this file + * @return The list of files + */ + public List getFiles(){ + return files; + } } diff --git a/src/test/java/electrosphere/entity/SpawnAllEntitiesTests.java b/src/test/java/electrosphere/entity/SpawnAllEntitiesTests.java index 79571eaf..a7a00f88 100644 --- a/src/test/java/electrosphere/entity/SpawnAllEntitiesTests.java +++ b/src/test/java/electrosphere/entity/SpawnAllEntitiesTests.java @@ -16,7 +16,7 @@ import electrosphere.game.data.common.CommonEntityType; import electrosphere.game.data.creature.type.CreatureData; import electrosphere.game.data.creature.type.CreatureTypeLoader; import electrosphere.game.data.foliage.type.FoliageType; -import electrosphere.game.data.foliage.type.model.FoliageTypeMap; +import electrosphere.game.data.foliage.type.FoliageTypeLoader; import electrosphere.game.data.item.Item; import electrosphere.game.data.item.ItemDataMap; import electrosphere.test.annotations.IntegrationTest; @@ -44,8 +44,8 @@ public class SpawnAllEntitiesTests extends EntityTestTemplate { ItemUtils.serverSpawnBasicItem(Globals.realmManager.first(), new Vector3d(0.1,0.1,0.1), item.getId()); } - FoliageTypeMap foliageTypeMap = Globals.gameConfigCurrent.getFoliageMap(); - for(FoliageType foliage : foliageTypeMap.getFoliageList()){ + FoliageTypeLoader foliageTypeMap = Globals.gameConfigCurrent.getFoliageMap(); + for(FoliageType foliage : foliageTypeMap.getTypes()){ FoliageUtils.serverSpawnTreeFoliage(Globals.realmManager.first(), new Vector3d(0.1,0.1,0.1), foliage.getId(), 0); }