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.NonNull;
public class MapObject extends NamedCharacter {
public abstract class MapObject extends NamedCharacter {
private final PathExecutor<MapObject> pathExecutor = new PathExecutor<>(this);
private final DB.model.MapObjectModel template;
private final Short frame;
@@ -46,6 +46,7 @@ public class MapObject extends NamedCharacter {
.wait(0.05f)
.turn(Direction.UP, frame)
.wait(0.5f)
.suspend(this::shouldGoFurther)
.turn(Direction.RIGHT, frame)
.wait(0.05f)
.turn(Direction.LEFT, frame)
@@ -53,21 +54,25 @@ public class MapObject extends NamedCharacter {
.turn(Direction.DOWN, frame)
.wait(0.5f)
.run(this::finishInteraction)
: new CharacterPath<MapObject>()
: new CharacterPath<>()
);
}
protected boolean shouldGoFurther(MapObject object) {
return true;
}
public void interact(Creature creature) {
interacting = true;
}
private void startInteraction() {
protected void startInteraction() {
if (interactSound != null) {
context.playSound(interactSound);
}
}
private void finishInteraction() {
protected void finishInteraction() {
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.gui.*;
import com.bartlomiejpluta.base.lib.gui.Label;
import com.bartlomiejpluta.base.lib.gui.VGridOptionChoice;
import com.bartlomiejpluta.demo.entity.Enemy;
import com.bartlomiejpluta.demo.entity.Player;
@@ -13,6 +14,9 @@ import java.util.Map;
public class LootWindow extends DecoratedWindow implements Inflatable {
private final Player player;
@Ref("title")
private Label titleLbl;
@Ref("loot")
private VGridOptionChoice lootMenu;
@@ -40,8 +44,8 @@ public class LootWindow extends DecoratedWindow implements Inflatable {
public void onOpen(WindowManager manager, Object[] args) {
super.onOpen(manager, args);
var creature = (Enemy) args[0];
this.loot = creature.getLoot();
this.loot = (Item[]) args[0];
this.titleLbl.setText((String) args[1]);
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.util.world.CharacterSpawner;
import com.bartlomiejpluta.base.util.world.Warp;
import com.bartlomiejpluta.demo.entity.Chest;
import com.bartlomiejpluta.demo.entity.Enemy;
import com.bartlomiejpluta.demo.entity.MapObject;
import com.bartlomiejpluta.demo.entity.Player;
@@ -101,11 +102,11 @@ public abstract class BaseMapHandler implements MapHandler {
return enemy;
}
public MapObject object(ObjectLayer layer, int x, int y, @NonNull String id) {
var object = new MapObject(id);
object.setCoordinates(x, y);
layer.addEntity(object);
return object;
public Chest chest(ObjectLayer layer, int x, int y, @NonNull String id) {
var chest = new Chest(id);
chest.setCoordinates(x, y);
layer.addEntity(chest);
return chest;
}
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.KeyAction;
import com.bartlomiejpluta.base.api.input.KeyEvent;
import com.bartlomiejpluta.demo.entity.Chest;
import com.bartlomiejpluta.demo.entity.Enemy;
import com.bartlomiejpluta.demo.gui.EquipmentWindow;
import com.bartlomiejpluta.demo.gui.GameMenuWindow;
@@ -104,7 +105,13 @@ public class MenuManager {
public void openLootWindow(@NonNull Enemy enemy) {
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() {

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

View File

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