move goal logic to macro sim
Some checks reported errors
studiorailgun/Renderer/pipeline/head Something is wrong with the build of this commit
Some checks reported errors
studiorailgun/Renderer/pipeline/head Something is wrong with the build of this commit
This commit is contained in:
parent
c893e0568a
commit
9963c4aa78
@ -1706,6 +1706,7 @@ Major work on CharacterService
|
||||
Move character utils classe to macro data
|
||||
Move CharacterService to service package
|
||||
Convert character service to singleton
|
||||
Start moving character goal logic from behavior trees to macro level simulation
|
||||
|
||||
|
||||
|
||||
|
||||
@ -179,7 +179,7 @@ public class ImGuiAI {
|
||||
GriddedDataCellManager griddedDataCellManager = (GriddedDataCellManager)realm.getDataCellManager();
|
||||
Entity serverEnt = EntityLookupUtils.getServerEquivalent(Globals.playerEntity);
|
||||
Vector3d spawnPos = griddedDataCellManager.getMacroEntryPoint(new Vector3d(EntityUtils.getPosition(serverEnt)).add(50,0,0));
|
||||
CharacterUtils.spawnCharacter(realm, spawnPos);
|
||||
CharacterUtils.spawnCharacter(realm, spawnPos, CharacterUtils.DEFAULT_RACE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -68,6 +68,12 @@ public class MacroCharacterGoalNode implements AITreeNode {
|
||||
Vector3d targetPos = offset;//griddedDataCellManager.getMacroEntryPoint(offset).add(10,0,0);
|
||||
blackboard.put(BlackboardKeys.POINT_TARGET, targetPos);
|
||||
} break;
|
||||
case BUILD_STRUCTURE: {
|
||||
throw new Error("Not implemented yet");
|
||||
} //break;
|
||||
case ACQUIRE_ITEM: {
|
||||
throw new Error("Not implemented yet");
|
||||
} //break;
|
||||
}
|
||||
if(type == goal.getType()){
|
||||
return AITreeNodeResult.SUCCESS;
|
||||
|
||||
@ -1,15 +1,19 @@
|
||||
package electrosphere.server.ai.trees.character.goals;
|
||||
|
||||
import electrosphere.engine.Globals;
|
||||
import electrosphere.entity.state.movement.groundmove.ClientGroundMovementTree.MovementRelativeFacing;
|
||||
import electrosphere.server.ai.blackboard.BlackboardKeys;
|
||||
import electrosphere.server.ai.nodes.AITreeNode;
|
||||
import electrosphere.server.ai.nodes.actions.move.FaceTargetNode;
|
||||
import electrosphere.server.ai.nodes.actions.move.MoveStartNode;
|
||||
import electrosphere.server.ai.nodes.checks.spatial.BeginStructureNode;
|
||||
import electrosphere.server.ai.nodes.macro.MacroCharacterGoalNode;
|
||||
import electrosphere.server.ai.nodes.meta.collections.SelectorNode;
|
||||
import electrosphere.server.ai.nodes.meta.collections.SequenceNode;
|
||||
import electrosphere.server.ai.nodes.meta.debug.PublishStatusNode;
|
||||
import electrosphere.server.ai.nodes.meta.decorators.RunnerNode;
|
||||
import electrosphere.server.ai.trees.creature.resource.AcquireItemTree;
|
||||
import electrosphere.server.ai.trees.struct.BuildStructureTree;
|
||||
import electrosphere.server.macro.character.goal.CharacterGoal.CharacterGoalType;
|
||||
|
||||
/**
|
||||
@ -30,11 +34,26 @@ public class CharacterGoalTree {
|
||||
|
||||
//character's goal is to leave sim range
|
||||
new SequenceNode(
|
||||
//check if we're trying to leave sim range
|
||||
MacroCharacterGoalNode.create(CharacterGoalType.LEAVE_SIM_RANGE),
|
||||
new PublishStatusNode("Leaving simulation range"),
|
||||
new FaceTargetNode(BlackboardKeys.POINT_TARGET),
|
||||
new RunnerNode(new MoveStartNode(MovementRelativeFacing.FORWARD))
|
||||
),
|
||||
|
||||
//character's goal is to build a structure
|
||||
new SequenceNode(
|
||||
MacroCharacterGoalNode.create(CharacterGoalType.BUILD_STRUCTURE),
|
||||
new PublishStatusNode("Construct a shelter"),
|
||||
new BeginStructureNode(Globals.gameConfigCurrent.getStructureData().getTypes().iterator().next()),
|
||||
BuildStructureTree.create()
|
||||
),
|
||||
|
||||
//character's goal is to acquire an item
|
||||
new SequenceNode(
|
||||
MacroCharacterGoalNode.create(CharacterGoalType.ACQUIRE_ITEM),
|
||||
new PublishStatusNode("Acquire building material"),
|
||||
//try to find building materials
|
||||
AcquireItemTree.create(BlackboardKeys.BUILDING_MATERIAL_CURRENT)
|
||||
)
|
||||
)
|
||||
);
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
package electrosphere.server.ai.trees.hierarchy.safety;
|
||||
|
||||
import electrosphere.server.ai.nodes.AITreeNode;
|
||||
import electrosphere.server.ai.nodes.meta.collections.SelectorNode;
|
||||
import electrosphere.server.ai.nodes.meta.collections.SequenceNode;
|
||||
import electrosphere.server.ai.nodes.meta.debug.PublishStatusNode;
|
||||
import electrosphere.server.ai.trees.hierarchy.safety.shelter.ShelterTree;
|
||||
|
||||
/**
|
||||
* A tree that runs all of the tier 1 maslow need trees
|
||||
@ -22,9 +22,10 @@ public class MaslowSafetyTree {
|
||||
public static AITreeNode create(){
|
||||
return new SequenceNode(
|
||||
new PublishStatusNode("Evaluate safety"),
|
||||
FleeTree.create(),
|
||||
CombatTree.create(),
|
||||
ShelterTree.create()
|
||||
new SelectorNode(
|
||||
FleeTree.create(),
|
||||
CombatTree.create()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -10,10 +10,11 @@ import electrosphere.server.ai.nodes.checks.inventory.InventoryContainsNode;
|
||||
import electrosphere.server.ai.nodes.meta.collections.SelectorNode;
|
||||
import electrosphere.server.ai.nodes.meta.collections.SequenceNode;
|
||||
import electrosphere.server.ai.nodes.meta.debug.PublishStatusNode;
|
||||
import electrosphere.server.ai.nodes.meta.decorators.InverterNode;
|
||||
import electrosphere.server.ai.nodes.meta.decorators.RunnerNode;
|
||||
import electrosphere.server.ai.nodes.meta.decorators.SucceederNode;
|
||||
import electrosphere.server.ai.nodes.solvers.SolveBuildMaterialNode;
|
||||
import electrosphere.server.ai.trees.creature.MoveToTree;
|
||||
import electrosphere.server.ai.trees.creature.resource.AcquireItemTree;
|
||||
|
||||
/**
|
||||
* A tree to build whatever the current structure target is
|
||||
@ -23,10 +24,10 @@ public class BuildStructureTree {
|
||||
/**
|
||||
* Name of the tree
|
||||
*/
|
||||
public static final String TREE_NAME = "ConstructShelterTree";
|
||||
public static final String TREE_NAME = "BuildStructureTree";
|
||||
|
||||
/**
|
||||
* Creates a construct shelter tree
|
||||
* Creates a construct structure tree
|
||||
* @return The root node of the tree
|
||||
*/
|
||||
public static AITreeNode create(){
|
||||
@ -54,10 +55,10 @@ public class BuildStructureTree {
|
||||
),
|
||||
//does not have building materials
|
||||
new SequenceNode(
|
||||
new PublishStatusNode("Acquire building material"),
|
||||
//try to find building materials
|
||||
AcquireItemTree.create(BlackboardKeys.BUILDING_MATERIAL_CURRENT)
|
||||
new InverterNode(new SolveBuildMaterialNode()),
|
||||
new RunnerNode(new PublishStatusNode("Waiting on macro character to set goal to find materials to build with"))
|
||||
),
|
||||
//has building materials AND we've already built the structure
|
||||
new SucceederNode(null)
|
||||
)
|
||||
);
|
||||
|
||||
@ -67,17 +67,17 @@ public class MacroData {
|
||||
// }
|
||||
|
||||
//generate initial races
|
||||
if(Globals.gameConfigCurrent.getRaceMap().getSymbolismMap().size() < 3){
|
||||
for(Race race : Globals.gameConfigCurrent.getRaceMap().getSymbolismMap()){
|
||||
if(Globals.gameConfigCurrent.getRaceMap().getRaces().size() < 3){
|
||||
for(Race race : Globals.gameConfigCurrent.getRaceMap().getRaces()){
|
||||
rVal.races.add(race);
|
||||
}
|
||||
} else {
|
||||
RaceMap raceMap = Globals.gameConfigCurrent.getRaceMap();
|
||||
int numRacesToGenerate = 3 + random.nextInt(Math.min(raceMap.getSymbolismMap().size() - 3,7));
|
||||
int numRacesToGenerate = 3 + random.nextInt(Math.min(raceMap.getRaces().size() - 3,7));
|
||||
for(int i = 0; i < numRacesToGenerate; i++){
|
||||
Race raceToAdd = raceMap.getSymbolismMap().get(random.nextInt(raceMap.getSymbolismMap().size()));
|
||||
Race raceToAdd = raceMap.getRaces().get(random.nextInt(raceMap.getRaces().size()));
|
||||
while(rVal.races.contains(raceToAdd)){
|
||||
raceToAdd = raceMap.getSymbolismMap().get(random.nextInt(raceMap.getSymbolismMap().size()));
|
||||
raceToAdd = raceMap.getRaces().get(random.nextInt(raceMap.getRaces().size()));
|
||||
}
|
||||
rVal.races.add(raceToAdd);
|
||||
}
|
||||
|
||||
@ -35,23 +35,45 @@ public class Character implements MacroObject {
|
||||
Vector3d pos = new Vector3d();
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Gets the id of the character
|
||||
* @return The id of the character
|
||||
*/
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the id of the character
|
||||
* @param id The id of the character
|
||||
*/
|
||||
public void setId(int id){
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Puts data on the character
|
||||
* @param key The key for the data
|
||||
* @param item The data itself
|
||||
*/
|
||||
public void putData(String key, CharacterData item){
|
||||
data.put(key,item);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the character has a type of data
|
||||
* @param key The key to check
|
||||
* @return true if the character has data at that key, false otherwise
|
||||
*/
|
||||
public boolean containsKey(String key){
|
||||
return data.containsKey(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the data at a given key on the character
|
||||
* @param key The key
|
||||
* @return The data if it exists, null otherwise
|
||||
*/
|
||||
public CharacterData getData(String key){
|
||||
return data.get(key);
|
||||
}
|
||||
|
||||
@ -3,6 +3,7 @@ package electrosphere.server.macro.character;
|
||||
import org.joml.Vector3d;
|
||||
|
||||
import electrosphere.engine.Globals;
|
||||
import electrosphere.entity.types.creature.CreatureTemplate;
|
||||
import electrosphere.server.datacell.Realm;
|
||||
import electrosphere.server.macro.character.data.CharacterDataStrings;
|
||||
import electrosphere.server.macro.character.diety.Diety;
|
||||
@ -15,6 +16,11 @@ import electrosphere.server.service.CharacterService;
|
||||
* Utility functions for dealing with characters
|
||||
*/
|
||||
public class CharacterUtils {
|
||||
|
||||
/**
|
||||
* Default human for character stuff
|
||||
*/
|
||||
public static final String DEFAULT_RACE = "human";
|
||||
|
||||
/**
|
||||
* Adds diety data for the character
|
||||
@ -53,12 +59,16 @@ public class CharacterUtils {
|
||||
/**
|
||||
* Spawns a character
|
||||
* @param realm The realm to spawn the character within
|
||||
* @param position The position to create the character at
|
||||
* @param race The race of the character to create
|
||||
* @return The character
|
||||
*/
|
||||
public static Character spawnCharacter(Realm realm, Vector3d position){
|
||||
Character rVal = Globals.characterService.createCharacter(null, CharacterService.NO_PLAYER);
|
||||
public static Character spawnCharacter(Realm realm, Vector3d position, String race){
|
||||
Race raceData = Globals.gameConfigCurrent.getRaceMap().getRace(race);
|
||||
String creatureType = raceData.getAssociatedCreature();
|
||||
Character rVal = Globals.characterService.createCharacter(CreatureTemplate.createDefault(creatureType), CharacterService.NO_PLAYER);
|
||||
rVal.setPos(position);
|
||||
Race.setRace(rVal, Race.create("human", "human"));
|
||||
Race.setRace(rVal, Race.create(race, creatureType));
|
||||
realm.getDataCellManager().evaluateMacroObject(rVal);
|
||||
return rVal;
|
||||
}
|
||||
|
||||
@ -17,6 +17,14 @@ public class CharacterGoal extends CharacterData {
|
||||
* Goals is generally to leave simulation range
|
||||
*/
|
||||
LEAVE_SIM_RANGE,
|
||||
/**
|
||||
* Build a structure
|
||||
*/
|
||||
BUILD_STRUCTURE,
|
||||
/**
|
||||
* Acquire an item
|
||||
*/
|
||||
ACQUIRE_ITEM,
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -12,12 +12,12 @@ public class Race extends CharacterData {
|
||||
/**
|
||||
* The name of the race
|
||||
*/
|
||||
String name;
|
||||
String raceId;
|
||||
|
||||
/**
|
||||
* The associated creature for the race
|
||||
*/
|
||||
String associatedCreature;
|
||||
String associatedCreatureId;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
@ -31,7 +31,7 @@ public class Race extends CharacterData {
|
||||
* @return The name of the race
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
return raceId;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -39,7 +39,7 @@ public class Race extends CharacterData {
|
||||
* @return The associated creature data
|
||||
*/
|
||||
public String getAssociatedCreature() {
|
||||
return associatedCreature;
|
||||
return associatedCreatureId;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -50,8 +50,8 @@ public class Race extends CharacterData {
|
||||
*/
|
||||
public static Race create(String name, String creatureName){
|
||||
Race race = new Race();
|
||||
race.name = name;
|
||||
race.associatedCreature = creatureName;
|
||||
race.raceId = name;
|
||||
race.associatedCreatureId = creatureName;
|
||||
return race;
|
||||
}
|
||||
|
||||
|
||||
@ -7,10 +7,31 @@ import java.util.List;
|
||||
*/
|
||||
public class RaceMap {
|
||||
|
||||
/**
|
||||
* The list of races
|
||||
*/
|
||||
List<Race> raceMap;
|
||||
|
||||
public List<Race> getSymbolismMap() {
|
||||
/**
|
||||
* Gets the list of races
|
||||
* @return The list of races
|
||||
*/
|
||||
public List<Race> getRaces() {
|
||||
return raceMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets race data from its name
|
||||
* @param raceName The name of the race
|
||||
* @return The data for the race
|
||||
*/
|
||||
public Race getRace(String raceName){
|
||||
for(Race race : raceMap){
|
||||
if(race.getName().equals(raceName)){
|
||||
return race;
|
||||
}
|
||||
}
|
||||
throw new Error("Failed to find race " + raceName);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -4,6 +4,7 @@ import java.util.List;
|
||||
|
||||
import electrosphere.engine.Globals;
|
||||
import electrosphere.server.macro.character.Character;
|
||||
import electrosphere.server.macro.character.CharacterUtils;
|
||||
import electrosphere.server.macro.character.data.CharacterDataStrings;
|
||||
|
||||
/**
|
||||
@ -62,7 +63,7 @@ public class MacroSimulation {
|
||||
If no town
|
||||
fashion makeshift shelter
|
||||
*/
|
||||
if(!chara.containsKey(CharacterDataStrings.SHELTER)){
|
||||
if(CharacterUtils.getShelter(chara) != null){
|
||||
// Vector2i charPos = CharacterUtils.getDiscretePosition(chara);
|
||||
// Town nearbyTown = Town.getTownAtPosition(charPos.x,charPos.y);
|
||||
// if(nearbyTown != null){
|
||||
|
||||
Loading…
Reference in New Issue
Block a user