Skip to content

Commit

Permalink
Merge pull request #458 from tonihele/feature/training-impl
Browse files Browse the repository at this point in the history
Feature/training impl
  • Loading branch information
tonihele authored Jul 5, 2024
2 parents ac235e8 + 62029d5 commit 0436f14
Show file tree
Hide file tree
Showing 19 changed files with 538 additions and 168 deletions.
10 changes: 9 additions & 1 deletion src/toniarts/openkeeper/game/component/TaskComponent.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,23 @@ public class TaskComponent implements EntityComponent {
public Point targetLocation;
public TaskType taskType;

/**
* How long we have contributed to the task
*/
public float taskDuration;
public boolean taskStarted;

public TaskComponent() {
// For serialization
}

public TaskComponent(long taskId, EntityId targetEntity, Point targetLocation, TaskType taskType) {
public TaskComponent(long taskId, EntityId targetEntity, Point targetLocation, TaskType taskType, float taskDuration, boolean taskStarted) {
this.taskId = taskId;
this.targetEntity = targetEntity;
this.targetLocation = targetLocation;
this.taskType = taskType;
this.taskDuration = taskDuration;
this.taskStarted = taskStarted;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ public void createNewGame() {
navigationService = new NavigationService(gameWorldController.getMapController(), positionSystem);

// Initialize tasks
taskManager = new TaskManager(entityData, gameWorldController, gameWorldController.getMapController(), gameWorldController.getObjectsController(), gameWorldController.getCreaturesController(), navigationService, playerControllers.values(), this, positionSystem);
taskManager = new TaskManager(entityData, gameWorldController, gameWorldController.getMapController(), gameWorldController.getObjectsController(), gameWorldController.getCreaturesController(), navigationService, playerControllers.values(), this, positionSystem, gameSettings);

// The triggers
partyTriggerState = new PartyTriggerLogicController(this, this, this, gameWorldController.getMapController(), gameWorldController.getCreaturesController());
Expand Down
105 changes: 53 additions & 52 deletions src/toniarts/openkeeper/game/controller/RoomControllerFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import toniarts.openkeeper.game.controller.room.TempleController;
import toniarts.openkeeper.game.controller.room.ThreeByThreeController;
import toniarts.openkeeper.game.controller.room.TortureChamberController;
import toniarts.openkeeper.game.controller.room.TrainingRoomController;
import toniarts.openkeeper.game.controller.room.TreasuryController;
import toniarts.openkeeper.game.controller.room.WorkshopController;
import toniarts.openkeeper.tools.convert.map.KwdFile;
Expand All @@ -54,70 +55,70 @@ private RoomControllerFactory() {

public static IRoomController constructRoom(KwdFile kwdFile, RoomInstance roomInstance, IObjectsController objectsController,
Map<Variable.MiscVariable.MiscType, Variable.MiscVariable> gameSettings, IGameTimer gameTimer) {

String roomName = roomInstance.getRoom().getName();

switch (roomInstance.getRoom().getTileConstruction()) {
case _3_BY_3:
case _3_BY_3 -> {
return new ThreeByThreeController(kwdFile, roomInstance, objectsController);

case HERO_GATE:
//return new HeroGateConstructor(assetManager, roomInstance);
case HERO_GATE_FRONT_END:
}
case HERO_GATE, HERO_GATE_FRONT_END -> {
return new HeroGateFrontEndController(kwdFile, roomInstance, objectsController);
case HERO_GATE_2_BY_2:
//return new HeroGateTwoByTwoConstructor(assetManager, roomInstance);
// case HERO_GATE_3_BY_1:
}
case HERO_GATE_2_BY_2 -> {
return new NormalRoomController(kwdFile, roomInstance, objectsController);
//return new HeroGateThreeByOneConstructor(assetManager, roomInstance);
case _5_BY_5_ROTATED:
}
case _5_BY_5_ROTATED -> {
return new FiveByFiveRotatedController(kwdFile, roomInstance, objectsController, gameSettings, gameTimer);
}
case NORMAL -> {
return constructNormal(roomName, kwdFile, roomInstance, objectsController, gameTimer, gameSettings);
}
case DOUBLE_QUAD -> {
return constructDoubleQuad(roomName, kwdFile, roomInstance, objectsController, gameTimer);
}
default -> {
// TODO
logger.log(Level.WARNING, "Room {0} not exist", roomName);
return new NormalRoomController(kwdFile, roomInstance, objectsController);
}
}
}

private static IRoomController constructDoubleQuad(String roomName, KwdFile kwdFile, RoomInstance roomInstance, IObjectsController objectsController, IGameTimer gameTimer) {
if (roomName.equalsIgnoreCase("Prison")) {
return new PrisonController(kwdFile, roomInstance, objectsController, gameTimer);
} else if (roomName.equalsIgnoreCase("Combat Pit")) {
return new CombatPitController(kwdFile, roomInstance, objectsController);
} else if (roomName.equalsIgnoreCase("Temple")) {
return new TempleController(kwdFile, roomInstance, objectsController);
}

case NORMAL:
if (roomName.equalsIgnoreCase("Lair")) {
return new LairController(kwdFile, roomInstance, objectsController, gameTimer);
} else if (roomName.equalsIgnoreCase("Library")) {
return new LibraryController(kwdFile, roomInstance, objectsController, gameTimer);
// } //else if (roomName.equalsIgnoreCase("Training Room")) {
// return new TrainingRoom(assetManager, roomInstance, objectLoader, worldState, effectManager);
// } else
} else if (roomName.equalsIgnoreCase("Work Shop")) {
return new WorkshopController(kwdFile, roomInstance, objectsController);
return new DoubleQuadController(kwdFile, roomInstance, objectsController);
}

private static IRoomController constructNormal(String roomName, KwdFile kwdFile, RoomInstance roomInstance, IObjectsController objectsController, IGameTimer gameTimer, Map<Variable.MiscVariable.MiscType, Variable.MiscVariable> gameSettings) {
if (roomName.equalsIgnoreCase("Lair")) {
return new LairController(kwdFile, roomInstance, objectsController, gameTimer);
} else if (roomName.equalsIgnoreCase("Library")) {
return new LibraryController(kwdFile, roomInstance, objectsController, gameTimer);
} else if (roomName.equalsIgnoreCase("Training Room")) {
return new TrainingRoomController(kwdFile, roomInstance, objectsController, gameTimer);
} else if (roomName.equalsIgnoreCase("Work Shop")) {
return new WorkshopController(kwdFile, roomInstance, objectsController);
// } else if (roomName.equalsIgnoreCase("Guard Room")) {
// return new GuardRoom(assetManager, roomInstance, objectLoader, worldState, effectManager);
} else if (roomName.equalsIgnoreCase("Casino")) {
return new CasinoController(kwdFile, roomInstance, objectsController);
} else if (roomName.equalsIgnoreCase("Casino")) {
return new CasinoController(kwdFile, roomInstance, objectsController);
// } else if (roomName.equalsIgnoreCase("Graveyard")) {
// return new Graveyard(assetManager, roomInstance, objectLoader, worldState, effectManager);
} else if (roomName.equalsIgnoreCase("Torture Chamber")) {
return new TortureChamberController(kwdFile, roomInstance, objectsController, gameTimer);
} else if (roomName.equalsIgnoreCase("Treasury")) {
return new TreasuryController(kwdFile, roomInstance, objectsController, gameSettings, gameTimer);
} else if (roomName.equalsIgnoreCase("Hatchery")) {
return new HatcheryController(kwdFile, roomInstance, objectsController, gameTimer);
}
return new NormalRoomController(kwdFile, roomInstance, objectsController);

// case QUAD:
// if (roomName.equalsIgnoreCase("Hero Stone Bridge") || roomName.equalsIgnoreCase("Stone Bridge")) {
// return new StoneBridge(assetManager, roomInstance, objectLoader, worldState, effectManager);
// }
// return new QuadConstructor(assetManager, roomInstance);
//
case DOUBLE_QUAD:
if (roomName.equalsIgnoreCase("Prison")) {
return new PrisonController(kwdFile, roomInstance, objectsController, gameTimer);
} else if (roomName.equalsIgnoreCase("Combat Pit")) {
return new CombatPitController(kwdFile, roomInstance, objectsController);
} else if (roomName.equalsIgnoreCase("Temple")) {
return new TempleController(kwdFile, roomInstance, objectsController);
}
return new DoubleQuadController(kwdFile, roomInstance, objectsController);
default:

// TODO
logger.log(Level.WARNING, "Room {0} not exist", roomName);
return new NormalRoomController(kwdFile, roomInstance, objectsController);
} else if (roomName.equalsIgnoreCase("Torture Chamber")) {
return new TortureChamberController(kwdFile, roomInstance, objectsController, gameTimer);
} else if (roomName.equalsIgnoreCase("Treasury")) {
return new TreasuryController(kwdFile, roomInstance, objectsController, gameSettings, gameTimer);
} else if (roomName.equalsIgnoreCase("Hatchery")) {
return new HatcheryController(kwdFile, roomInstance, objectsController, gameTimer);
}

return new NormalRoomController(kwdFile, roomInstance, objectsController);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,6 @@ public class CreatureController extends EntityController implements ICreatureCon
// TODO: All the data is not supposed to be on entities as they become too big, but I don't want these here either
private final Creature creature;
private final StateMachine<ICreatureController, CreatureState> stateMachine;
private float taskDuration = 0.0f;
private boolean taskStarted = false;
private float motionless = 0;

public CreatureController(EntityId entityId, EntityData entityData, Creature creature, INavigationService navigationService,
Expand Down Expand Up @@ -264,7 +262,6 @@ public void unassingCurrentTask() {
assignedTask.unassign(this);
entityData.removeComponent(entityId, TaskComponent.class);
}
taskStarted = false;
}

@Override
Expand Down Expand Up @@ -395,9 +392,12 @@ public boolean isWorker() {

@Override
public void executeAssignedTask() {
taskStarted = true;
TaskComponent taskComponent = entityData.getComponent(entityId, TaskComponent.class);
if (!taskComponent.taskStarted) {
entityData.setComponent(entityId, new TaskComponent(taskComponent.taskId, taskComponent.targetEntity, taskComponent.targetLocation, taskComponent.taskType, taskComponent.taskDuration, true));
}
if (isAssignedTaskValid()) {
getAssignedTask().executeTask(this, taskDuration);
getAssignedTask().executeTask(this, taskComponent.taskDuration);
}
}

Expand Down Expand Up @@ -828,8 +828,9 @@ public void processTick(float tpf, double gameTime) {
}

// Task timer
if (taskStarted) {
taskDuration += tpf;
TaskComponent taskComponent = entityData.getComponent(entityId, TaskComponent.class);
if (taskComponent != null && taskComponent.taskStarted) {
entityData.setComponent(entityId, new TaskComponent(taskComponent.taskId, taskComponent.targetEntity, taskComponent.targetLocation, taskComponent.taskType, taskComponent.taskDuration + tpf, taskComponent.taskStarted));
}

stateMachine.update();
Expand Down Expand Up @@ -908,9 +909,8 @@ public void setAssignedTask(Task task) {
// Unassign previous task
unassingCurrentTask();

taskDuration = 0.0f;
//workNavigationRequired = true;
entityData.setComponent(entityId, new TaskComponent(task.getId(), task.getTaskTarget(), task.getTaskLocation(), task.getTaskType()));
entityData.setComponent(entityId, new TaskComponent(task.getId(), task.getTaskTarget(), task.getTaskLocation(), task.getTaskType(), 0.0f, false));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public abstract class AbstractRoomController implements IRoomController {
*/
public enum ObjectType {

GOLD, LAIR, SPELL_BOOK, SPECIAL, RESEARCHER, PRISONER, TORTUREE, FOOD;
GOLD, LAIR, SPELL_BOOK, SPECIAL, RESEARCHER, PRISONER, TORTUREE, FOOD, TRAINEE;

};

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* Copyright (C) 2014-2023 OpenKeeper
*
* OpenKeeper is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenKeeper is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenKeeper. If not, see <http://www.gnu.org/licenses/>.
*/
package toniarts.openkeeper.game.controller.room;

import toniarts.openkeeper.common.RoomInstance;
import toniarts.openkeeper.game.controller.IGameTimer;
import toniarts.openkeeper.game.controller.IObjectsController;
import toniarts.openkeeper.game.controller.room.storage.RoomTraineeControl;
import toniarts.openkeeper.tools.convert.map.KwdFile;

/**
* The training room
*
* @author Toni Helenius <[email protected]>
*/
public class TrainingRoomController extends NormalRoomController {

public TrainingRoomController(KwdFile kwdFile, RoomInstance roomInstance, IObjectsController objectsController,
IGameTimer gameTimer) {
super(kwdFile, roomInstance, objectsController);

addObjectControl(new RoomTraineeControl(kwdFile, this, objectsController, gameTimer) {

@Override
protected int getNumberOfAccessibleTiles() {
return getFurnitureCount();
}
});
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
/*
* Copyright (C) 2014-2023 OpenKeeper
*
* OpenKeeper is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenKeeper is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenKeeper. If not, see <http://www.gnu.org/licenses/>.
*/
package toniarts.openkeeper.game.controller.room.storage;

import com.simsilica.es.EntityId;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import toniarts.openkeeper.game.component.Position;
import toniarts.openkeeper.game.controller.IGameTimer;
import toniarts.openkeeper.game.controller.IObjectsController;
import toniarts.openkeeper.game.controller.room.AbstractRoomController.ObjectType;
import toniarts.openkeeper.game.controller.room.IRoomController;
import toniarts.openkeeper.tools.convert.map.KwdFile;
import toniarts.openkeeper.utils.WorldUtils;

/**
* Holds out the trainees populating a room
*
* @author Toni Helenius <[email protected]>
*/
public abstract class RoomTraineeControl extends AbstractRoomObjectControl<EntityId> {

protected RoomTraineeControl(KwdFile kwdFile, IRoomController parent, IObjectsController objectsController, IGameTimer gameTimer) {
super(kwdFile, parent, objectsController, gameTimer);
}

@Override
public int getCurrentCapacity() {
return objectsByCoordinate.size();
}

@Override
protected int getObjectsPerTile() {
return 1;
}

@Override
public ObjectType getObjectType() {
return ObjectType.TRAINEE;
}

@Override
public EntityId addItem(EntityId trainee, Point p) {
setRoomStorageToItem(trainee, false);

return trainee;
}

@Override
public void destroy() {

// TODO: The trainee can't do his/her job
}

@Override
public void captured(short playerId) {

}

@Override
protected Collection<Point> getCoordinates() {

// Only furniture
List<Point> coordinates = new ArrayList<>(parent.getFloorFurnitureCount() + parent.getWallFurnitureCount());
for (EntityId oc : parent.getFloorFurniture()) {
coordinates.add(WorldUtils.vectorToPoint(objectsController.getEntityData().getComponent(oc, Position.class).position));
}
for (EntityId oc : parent.getWallFurniture()) {
coordinates.add(WorldUtils.vectorToPoint(objectsController.getEntityData().getComponent(oc, Position.class).position));
}

return coordinates;
}

}
Loading

0 comments on commit 0436f14

Please sign in to comment.