Add support for chests

This commit is contained in:
2022-08-26 11:29:14 +02:00
parent 9ccd509b19
commit 3eceb93559
10 changed files with 78 additions and 14 deletions

Binary file not shown.

View File

@@ -0,0 +1,42 @@
package com.bartlomiejpluta.demo.entity;
import com.bartlomiejpluta.base.api.context.ContextHolder;
import com.bartlomiejpluta.demo.runner.DemoRunner;
import com.bartlomiejpluta.demo.world.item.Item;
import lombok.Getter;
import lombok.NonNull;
public class Chest extends MapObject {
private final DemoRunner runner;
@Getter
private final Item[] content = new Item[Enemy.MAX_LOOT];
public Chest(@NonNull String id) {
super(id);
runner = ((DemoRunner) ContextHolder.INSTANCE.getContext().getGameRunner());
}
@Override
public void interact(Creature creature) {
super.interact(creature);
runner.openChestWindow(this);
}
@Override
protected boolean shouldGoFurther(MapObject object) {
return runner.openedWindows() == 0;
}
public Chest addItem(Item item) {
for (int i = 0; i < content.length; ++i) {
if (content[i] == null) {
content[i] = item;
return this;
}
}
throw new IllegalStateException("Chest is full!");
}
}

View File

@@ -7,7 +7,7 @@ import com.bartlomiejpluta.base.util.path.PathExecutor;
import lombok.Getter; import lombok.Getter;
import lombok.NonNull; import lombok.NonNull;
public class MapObject extends NamedCharacter { public abstract class MapObject extends NamedCharacter {
private final PathExecutor<MapObject> pathExecutor = new PathExecutor<>(this); private final PathExecutor<MapObject> pathExecutor = new PathExecutor<>(this);
private final DB.model.MapObjectModel template; private final DB.model.MapObjectModel template;
private final Short frame; private final Short frame;
@@ -46,6 +46,7 @@ public class MapObject extends NamedCharacter {
.wait(0.05f) .wait(0.05f)
.turn(Direction.UP, frame) .turn(Direction.UP, frame)
.wait(0.5f) .wait(0.5f)
.suspend(this::shouldGoFurther)
.turn(Direction.RIGHT, frame) .turn(Direction.RIGHT, frame)
.wait(0.05f) .wait(0.05f)
.turn(Direction.LEFT, frame) .turn(Direction.LEFT, frame)
@@ -53,21 +54,25 @@ public class MapObject extends NamedCharacter {
.turn(Direction.DOWN, frame) .turn(Direction.DOWN, frame)
.wait(0.5f) .wait(0.5f)
.run(this::finishInteraction) .run(this::finishInteraction)
: new CharacterPath<MapObject>() : new CharacterPath<>()
); );
} }
protected boolean shouldGoFurther(MapObject object) {
return true;
}
public void interact(Creature creature) { public void interact(Creature creature) {
interacting = true; interacting = true;
} }
private void startInteraction() { protected void startInteraction() {
if (interactSound != null) { if (interactSound != null) {
context.playSound(interactSound); context.playSound(interactSound);
} }
} }
private void finishInteraction() { protected void finishInteraction() {
interacting = false; interacting = false;
} }

View File

@@ -2,6 +2,7 @@ package com.bartlomiejpluta.demo.gui;
import com.bartlomiejpluta.base.api.context.Context; import com.bartlomiejpluta.base.api.context.Context;
import com.bartlomiejpluta.base.api.gui.*; import com.bartlomiejpluta.base.api.gui.*;
import com.bartlomiejpluta.base.lib.gui.Label;
import com.bartlomiejpluta.base.lib.gui.VGridOptionChoice; import com.bartlomiejpluta.base.lib.gui.VGridOptionChoice;
import com.bartlomiejpluta.demo.entity.Enemy; import com.bartlomiejpluta.demo.entity.Enemy;
import com.bartlomiejpluta.demo.entity.Player; import com.bartlomiejpluta.demo.entity.Player;
@@ -13,6 +14,9 @@ import java.util.Map;
public class LootWindow extends DecoratedWindow implements Inflatable { public class LootWindow extends DecoratedWindow implements Inflatable {
private final Player player; private final Player player;
@Ref("title")
private Label titleLbl;
@Ref("loot") @Ref("loot")
private VGridOptionChoice lootMenu; private VGridOptionChoice lootMenu;
@@ -40,8 +44,8 @@ public class LootWindow extends DecoratedWindow implements Inflatable {
public void onOpen(WindowManager manager, Object[] args) { public void onOpen(WindowManager manager, Object[] args) {
super.onOpen(manager, args); super.onOpen(manager, args);
var creature = (Enemy) args[0]; this.loot = (Item[]) args[0];
this.loot = creature.getLoot(); this.titleLbl.setText((String) args[1]);
updateSlots(); updateSlots();
} }

View File

@@ -14,6 +14,7 @@ import com.bartlomiejpluta.base.lib.camera.CameraController;
import com.bartlomiejpluta.base.lib.camera.FollowingCameraController; import com.bartlomiejpluta.base.lib.camera.FollowingCameraController;
import com.bartlomiejpluta.base.util.world.CharacterSpawner; import com.bartlomiejpluta.base.util.world.CharacterSpawner;
import com.bartlomiejpluta.base.util.world.Warp; import com.bartlomiejpluta.base.util.world.Warp;
import com.bartlomiejpluta.demo.entity.Chest;
import com.bartlomiejpluta.demo.entity.Enemy; import com.bartlomiejpluta.demo.entity.Enemy;
import com.bartlomiejpluta.demo.entity.MapObject; import com.bartlomiejpluta.demo.entity.MapObject;
import com.bartlomiejpluta.demo.entity.Player; import com.bartlomiejpluta.demo.entity.Player;
@@ -101,11 +102,11 @@ public abstract class BaseMapHandler implements MapHandler {
return enemy; return enemy;
} }
public MapObject object(ObjectLayer layer, int x, int y, @NonNull String id) { public Chest chest(ObjectLayer layer, int x, int y, @NonNull String id) {
var object = new MapObject(id); var chest = new Chest(id);
object.setCoordinates(x, y); chest.setCoordinates(x, y);
layer.addEntity(object); layer.addEntity(chest);
return object; return chest;
} }
public CharacterSpawner spawner(ObjectLayer layer, int x, int y) { public CharacterSpawner spawner(ObjectLayer layer, int x, int y) {

View File

@@ -9,6 +9,7 @@ import com.bartlomiejpluta.base.api.gui.WindowManager;
import com.bartlomiejpluta.base.api.input.Key; import com.bartlomiejpluta.base.api.input.Key;
import com.bartlomiejpluta.base.api.input.KeyAction; import com.bartlomiejpluta.base.api.input.KeyAction;
import com.bartlomiejpluta.base.api.input.KeyEvent; import com.bartlomiejpluta.base.api.input.KeyEvent;
import com.bartlomiejpluta.demo.entity.Chest;
import com.bartlomiejpluta.demo.entity.Enemy; import com.bartlomiejpluta.demo.entity.Enemy;
import com.bartlomiejpluta.demo.gui.EquipmentWindow; import com.bartlomiejpluta.demo.gui.EquipmentWindow;
import com.bartlomiejpluta.demo.gui.GameMenuWindow; import com.bartlomiejpluta.demo.gui.GameMenuWindow;
@@ -104,7 +105,13 @@ public class MenuManager {
public void openLootWindow(@NonNull Enemy enemy) { public void openLootWindow(@NonNull Enemy enemy) {
manager.closeAll(); manager.closeAll();
manager.open(loot, enemy); manager.open(loot, enemy.getLoot(), "Loot");
}
public void openChestWindow(@NonNull Chest chest) {
manager.closeAll();
manager.open(loot, chest.getContent(), chest.getName());
} }
public void closeAll() { public void closeAll() {

View File

@@ -5,6 +5,7 @@ import com.bartlomiejpluta.base.api.gui.GUI;
import com.bartlomiejpluta.base.api.runner.GameRunner; import com.bartlomiejpluta.base.api.runner.GameRunner;
import com.bartlomiejpluta.base.api.screen.Screen; import com.bartlomiejpluta.base.api.screen.Screen;
import com.bartlomiejpluta.base.util.profiler.FPSProfiler; import com.bartlomiejpluta.base.util.profiler.FPSProfiler;
import com.bartlomiejpluta.demo.entity.Chest;
import com.bartlomiejpluta.demo.entity.Enemy; import com.bartlomiejpluta.demo.entity.Enemy;
import com.bartlomiejpluta.demo.entity.Player; import com.bartlomiejpluta.demo.entity.Player;
import com.bartlomiejpluta.demo.menu.MenuManager; import com.bartlomiejpluta.demo.menu.MenuManager;
@@ -101,6 +102,10 @@ public class DemoRunner implements GameRunner {
menu.openLootWindow(enemy); menu.openLootWindow(enemy);
} }
public void openChestWindow(Chest chest) {
menu.openChestWindow(chest);
}
public void exit() { public void exit() {
context.close(); context.close();
} }

View File

@@ -10,6 +10,7 @@
<base:VLayout width="auto" height="auto"> <base:VLayout width="auto" height="auto">
<base:Label <base:Label
ref="title"
font="A.fonts.roboto_regular.uid" font="A.fonts.roboto_regular.uid"
width="relative" width="relative"
alignment="top|center" alignment="top|center"
@@ -17,8 +18,7 @@
green="1f" green="1f"
blue="1f" blue="1f"
alpha="0.5f" alpha="0.5f"
fontSize="30f">Loot fontSize="30f"/>
</base:Label>
<base:VGridOptionChoice ref="loot" columns="4" width="auto" height="auto"/> <base:VGridOptionChoice ref="loot" columns="4" width="auto" height="auto"/>