Skip to content

Commit 0436f14

Browse files
authored
Merge pull request #458 from tonihele/feature/training-impl
Feature/training impl
2 parents ac235e8 + 62029d5 commit 0436f14

19 files changed

+538
-168
lines changed

src/toniarts/openkeeper/game/component/TaskComponent.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,23 @@ public class TaskComponent implements EntityComponent {
3333
public Point targetLocation;
3434
public TaskType taskType;
3535

36+
/**
37+
* How long we have contributed to the task
38+
*/
39+
public float taskDuration;
40+
public boolean taskStarted;
41+
3642
public TaskComponent() {
3743
// For serialization
3844
}
3945

40-
public TaskComponent(long taskId, EntityId targetEntity, Point targetLocation, TaskType taskType) {
46+
public TaskComponent(long taskId, EntityId targetEntity, Point targetLocation, TaskType taskType, float taskDuration, boolean taskStarted) {
4147
this.taskId = taskId;
4248
this.targetEntity = targetEntity;
4349
this.targetLocation = targetLocation;
4450
this.taskType = taskType;
51+
this.taskDuration = taskDuration;
52+
this.taskStarted = taskStarted;
4553
}
4654

4755
}

src/toniarts/openkeeper/game/controller/GameController.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ public void createNewGame() {
223223
navigationService = new NavigationService(gameWorldController.getMapController(), positionSystem);
224224

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

228228
// The triggers
229229
partyTriggerState = new PartyTriggerLogicController(this, this, this, gameWorldController.getMapController(), gameWorldController.getCreaturesController());

src/toniarts/openkeeper/game/controller/RoomControllerFactory.java

+53-52
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import toniarts.openkeeper.game.controller.room.TempleController;
3535
import toniarts.openkeeper.game.controller.room.ThreeByThreeController;
3636
import toniarts.openkeeper.game.controller.room.TortureChamberController;
37+
import toniarts.openkeeper.game.controller.room.TrainingRoomController;
3738
import toniarts.openkeeper.game.controller.room.TreasuryController;
3839
import toniarts.openkeeper.game.controller.room.WorkshopController;
3940
import toniarts.openkeeper.tools.convert.map.KwdFile;
@@ -54,70 +55,70 @@ private RoomControllerFactory() {
5455

5556
public static IRoomController constructRoom(KwdFile kwdFile, RoomInstance roomInstance, IObjectsController objectsController,
5657
Map<Variable.MiscVariable.MiscType, Variable.MiscVariable> gameSettings, IGameTimer gameTimer) {
57-
5858
String roomName = roomInstance.getRoom().getName();
5959

6060
switch (roomInstance.getRoom().getTileConstruction()) {
61-
case _3_BY_3:
61+
case _3_BY_3 -> {
6262
return new ThreeByThreeController(kwdFile, roomInstance, objectsController);
63-
64-
case HERO_GATE:
65-
//return new HeroGateConstructor(assetManager, roomInstance);
66-
case HERO_GATE_FRONT_END:
63+
}
64+
case HERO_GATE, HERO_GATE_FRONT_END -> {
6765
return new HeroGateFrontEndController(kwdFile, roomInstance, objectsController);
68-
case HERO_GATE_2_BY_2:
69-
//return new HeroGateTwoByTwoConstructor(assetManager, roomInstance);
70-
// case HERO_GATE_3_BY_1:
66+
}
67+
case HERO_GATE_2_BY_2 -> {
7168
return new NormalRoomController(kwdFile, roomInstance, objectsController);
72-
//return new HeroGateThreeByOneConstructor(assetManager, roomInstance);
73-
case _5_BY_5_ROTATED:
69+
}
70+
case _5_BY_5_ROTATED -> {
7471
return new FiveByFiveRotatedController(kwdFile, roomInstance, objectsController, gameSettings, gameTimer);
72+
}
73+
case NORMAL -> {
74+
return constructNormal(roomName, kwdFile, roomInstance, objectsController, gameTimer, gameSettings);
75+
}
76+
case DOUBLE_QUAD -> {
77+
return constructDoubleQuad(roomName, kwdFile, roomInstance, objectsController, gameTimer);
78+
}
79+
default -> {
80+
// TODO
81+
logger.log(Level.WARNING, "Room {0} not exist", roomName);
82+
return new NormalRoomController(kwdFile, roomInstance, objectsController);
83+
}
84+
}
85+
}
86+
87+
private static IRoomController constructDoubleQuad(String roomName, KwdFile kwdFile, RoomInstance roomInstance, IObjectsController objectsController, IGameTimer gameTimer) {
88+
if (roomName.equalsIgnoreCase("Prison")) {
89+
return new PrisonController(kwdFile, roomInstance, objectsController, gameTimer);
90+
} else if (roomName.equalsIgnoreCase("Combat Pit")) {
91+
return new CombatPitController(kwdFile, roomInstance, objectsController);
92+
} else if (roomName.equalsIgnoreCase("Temple")) {
93+
return new TempleController(kwdFile, roomInstance, objectsController);
94+
}
7595

76-
case NORMAL:
77-
if (roomName.equalsIgnoreCase("Lair")) {
78-
return new LairController(kwdFile, roomInstance, objectsController, gameTimer);
79-
} else if (roomName.equalsIgnoreCase("Library")) {
80-
return new LibraryController(kwdFile, roomInstance, objectsController, gameTimer);
81-
// } //else if (roomName.equalsIgnoreCase("Training Room")) {
82-
// return new TrainingRoom(assetManager, roomInstance, objectLoader, worldState, effectManager);
83-
// } else
84-
} else if (roomName.equalsIgnoreCase("Work Shop")) {
85-
return new WorkshopController(kwdFile, roomInstance, objectsController);
96+
return new DoubleQuadController(kwdFile, roomInstance, objectsController);
97+
}
98+
99+
private static IRoomController constructNormal(String roomName, KwdFile kwdFile, RoomInstance roomInstance, IObjectsController objectsController, IGameTimer gameTimer, Map<Variable.MiscVariable.MiscType, Variable.MiscVariable> gameSettings) {
100+
if (roomName.equalsIgnoreCase("Lair")) {
101+
return new LairController(kwdFile, roomInstance, objectsController, gameTimer);
102+
} else if (roomName.equalsIgnoreCase("Library")) {
103+
return new LibraryController(kwdFile, roomInstance, objectsController, gameTimer);
104+
} else if (roomName.equalsIgnoreCase("Training Room")) {
105+
return new TrainingRoomController(kwdFile, roomInstance, objectsController, gameTimer);
106+
} else if (roomName.equalsIgnoreCase("Work Shop")) {
107+
return new WorkshopController(kwdFile, roomInstance, objectsController);
86108
// } else if (roomName.equalsIgnoreCase("Guard Room")) {
87109
// return new GuardRoom(assetManager, roomInstance, objectLoader, worldState, effectManager);
88-
} else if (roomName.equalsIgnoreCase("Casino")) {
89-
return new CasinoController(kwdFile, roomInstance, objectsController);
110+
} else if (roomName.equalsIgnoreCase("Casino")) {
111+
return new CasinoController(kwdFile, roomInstance, objectsController);
90112
// } else if (roomName.equalsIgnoreCase("Graveyard")) {
91113
// return new Graveyard(assetManager, roomInstance, objectLoader, worldState, effectManager);
92-
} else if (roomName.equalsIgnoreCase("Torture Chamber")) {
93-
return new TortureChamberController(kwdFile, roomInstance, objectsController, gameTimer);
94-
} else if (roomName.equalsIgnoreCase("Treasury")) {
95-
return new TreasuryController(kwdFile, roomInstance, objectsController, gameSettings, gameTimer);
96-
} else if (roomName.equalsIgnoreCase("Hatchery")) {
97-
return new HatcheryController(kwdFile, roomInstance, objectsController, gameTimer);
98-
}
99-
return new NormalRoomController(kwdFile, roomInstance, objectsController);
100-
101-
// case QUAD:
102-
// if (roomName.equalsIgnoreCase("Hero Stone Bridge") || roomName.equalsIgnoreCase("Stone Bridge")) {
103-
// return new StoneBridge(assetManager, roomInstance, objectLoader, worldState, effectManager);
104-
// }
105-
// return new QuadConstructor(assetManager, roomInstance);
106-
//
107-
case DOUBLE_QUAD:
108-
if (roomName.equalsIgnoreCase("Prison")) {
109-
return new PrisonController(kwdFile, roomInstance, objectsController, gameTimer);
110-
} else if (roomName.equalsIgnoreCase("Combat Pit")) {
111-
return new CombatPitController(kwdFile, roomInstance, objectsController);
112-
} else if (roomName.equalsIgnoreCase("Temple")) {
113-
return new TempleController(kwdFile, roomInstance, objectsController);
114-
}
115-
return new DoubleQuadController(kwdFile, roomInstance, objectsController);
116-
default:
117-
118-
// TODO
119-
logger.log(Level.WARNING, "Room {0} not exist", roomName);
120-
return new NormalRoomController(kwdFile, roomInstance, objectsController);
114+
} else if (roomName.equalsIgnoreCase("Torture Chamber")) {
115+
return new TortureChamberController(kwdFile, roomInstance, objectsController, gameTimer);
116+
} else if (roomName.equalsIgnoreCase("Treasury")) {
117+
return new TreasuryController(kwdFile, roomInstance, objectsController, gameSettings, gameTimer);
118+
} else if (roomName.equalsIgnoreCase("Hatchery")) {
119+
return new HatcheryController(kwdFile, roomInstance, objectsController, gameTimer);
121120
}
121+
122+
return new NormalRoomController(kwdFile, roomInstance, objectsController);
122123
}
123124
}

src/toniarts/openkeeper/game/controller/creature/CreatureController.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,6 @@ public class CreatureController extends EntityController implements ICreatureCon
105105
// TODO: All the data is not supposed to be on entities as they become too big, but I don't want these here either
106106
private final Creature creature;
107107
private final StateMachine<ICreatureController, CreatureState> stateMachine;
108-
private float taskDuration = 0.0f;
109-
private boolean taskStarted = false;
110108
private float motionless = 0;
111109

112110
public CreatureController(EntityId entityId, EntityData entityData, Creature creature, INavigationService navigationService,
@@ -264,7 +262,6 @@ public void unassingCurrentTask() {
264262
assignedTask.unassign(this);
265263
entityData.removeComponent(entityId, TaskComponent.class);
266264
}
267-
taskStarted = false;
268265
}
269266

270267
@Override
@@ -395,9 +392,12 @@ public boolean isWorker() {
395392

396393
@Override
397394
public void executeAssignedTask() {
398-
taskStarted = true;
395+
TaskComponent taskComponent = entityData.getComponent(entityId, TaskComponent.class);
396+
if (!taskComponent.taskStarted) {
397+
entityData.setComponent(entityId, new TaskComponent(taskComponent.taskId, taskComponent.targetEntity, taskComponent.targetLocation, taskComponent.taskType, taskComponent.taskDuration, true));
398+
}
399399
if (isAssignedTaskValid()) {
400-
getAssignedTask().executeTask(this, taskDuration);
400+
getAssignedTask().executeTask(this, taskComponent.taskDuration);
401401
}
402402
}
403403

@@ -828,8 +828,9 @@ public void processTick(float tpf, double gameTime) {
828828
}
829829

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

835836
stateMachine.update();
@@ -908,9 +909,8 @@ public void setAssignedTask(Task task) {
908909
// Unassign previous task
909910
unassingCurrentTask();
910911

911-
taskDuration = 0.0f;
912912
//workNavigationRequired = true;
913-
entityData.setComponent(entityId, new TaskComponent(task.getId(), task.getTaskTarget(), task.getTaskLocation(), task.getTaskType()));
913+
entityData.setComponent(entityId, new TaskComponent(task.getId(), task.getTaskTarget(), task.getTaskLocation(), task.getTaskType(), 0.0f, false));
914914
}
915915

916916
@Override

src/toniarts/openkeeper/game/controller/room/AbstractRoomController.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public abstract class AbstractRoomController implements IRoomController {
4242
*/
4343
public enum ObjectType {
4444

45-
GOLD, LAIR, SPELL_BOOK, SPECIAL, RESEARCHER, PRISONER, TORTUREE, FOOD;
45+
GOLD, LAIR, SPELL_BOOK, SPECIAL, RESEARCHER, PRISONER, TORTUREE, FOOD, TRAINEE;
4646

4747
};
4848

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright (C) 2014-2023 OpenKeeper
3+
*
4+
* OpenKeeper is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* OpenKeeper is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with OpenKeeper. If not, see <http://www.gnu.org/licenses/>.
16+
*/
17+
package toniarts.openkeeper.game.controller.room;
18+
19+
import toniarts.openkeeper.common.RoomInstance;
20+
import toniarts.openkeeper.game.controller.IGameTimer;
21+
import toniarts.openkeeper.game.controller.IObjectsController;
22+
import toniarts.openkeeper.game.controller.room.storage.RoomTraineeControl;
23+
import toniarts.openkeeper.tools.convert.map.KwdFile;
24+
25+
/**
26+
* The training room
27+
*
28+
* @author Toni Helenius <[email protected]>
29+
*/
30+
public class TrainingRoomController extends NormalRoomController {
31+
32+
public TrainingRoomController(KwdFile kwdFile, RoomInstance roomInstance, IObjectsController objectsController,
33+
IGameTimer gameTimer) {
34+
super(kwdFile, roomInstance, objectsController);
35+
36+
addObjectControl(new RoomTraineeControl(kwdFile, this, objectsController, gameTimer) {
37+
38+
@Override
39+
protected int getNumberOfAccessibleTiles() {
40+
return getFurnitureCount();
41+
}
42+
});
43+
}
44+
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*
2+
* Copyright (C) 2014-2023 OpenKeeper
3+
*
4+
* OpenKeeper is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* OpenKeeper is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with OpenKeeper. If not, see <http://www.gnu.org/licenses/>.
16+
*/
17+
package toniarts.openkeeper.game.controller.room.storage;
18+
19+
import com.simsilica.es.EntityId;
20+
import java.awt.Point;
21+
import java.util.ArrayList;
22+
import java.util.Collection;
23+
import java.util.List;
24+
import toniarts.openkeeper.game.component.Position;
25+
import toniarts.openkeeper.game.controller.IGameTimer;
26+
import toniarts.openkeeper.game.controller.IObjectsController;
27+
import toniarts.openkeeper.game.controller.room.AbstractRoomController.ObjectType;
28+
import toniarts.openkeeper.game.controller.room.IRoomController;
29+
import toniarts.openkeeper.tools.convert.map.KwdFile;
30+
import toniarts.openkeeper.utils.WorldUtils;
31+
32+
/**
33+
* Holds out the trainees populating a room
34+
*
35+
* @author Toni Helenius <[email protected]>
36+
*/
37+
public abstract class RoomTraineeControl extends AbstractRoomObjectControl<EntityId> {
38+
39+
protected RoomTraineeControl(KwdFile kwdFile, IRoomController parent, IObjectsController objectsController, IGameTimer gameTimer) {
40+
super(kwdFile, parent, objectsController, gameTimer);
41+
}
42+
43+
@Override
44+
public int getCurrentCapacity() {
45+
return objectsByCoordinate.size();
46+
}
47+
48+
@Override
49+
protected int getObjectsPerTile() {
50+
return 1;
51+
}
52+
53+
@Override
54+
public ObjectType getObjectType() {
55+
return ObjectType.TRAINEE;
56+
}
57+
58+
@Override
59+
public EntityId addItem(EntityId trainee, Point p) {
60+
setRoomStorageToItem(trainee, false);
61+
62+
return trainee;
63+
}
64+
65+
@Override
66+
public void destroy() {
67+
68+
// TODO: The trainee can't do his/her job
69+
}
70+
71+
@Override
72+
public void captured(short playerId) {
73+
74+
}
75+
76+
@Override
77+
protected Collection<Point> getCoordinates() {
78+
79+
// Only furniture
80+
List<Point> coordinates = new ArrayList<>(parent.getFloorFurnitureCount() + parent.getWallFurnitureCount());
81+
for (EntityId oc : parent.getFloorFurniture()) {
82+
coordinates.add(WorldUtils.vectorToPoint(objectsController.getEntityData().getComponent(oc, Position.class).position));
83+
}
84+
for (EntityId oc : parent.getWallFurniture()) {
85+
coordinates.add(WorldUtils.vectorToPoint(objectsController.getEntityData().getComponent(oc, Position.class).position));
86+
}
87+
88+
return coordinates;
89+
}
90+
91+
}

0 commit comments

Comments
 (0)