Add support for chests
This commit is contained in:
BIN
data.mv.db
BIN
data.mv.db
Binary file not shown.
Binary file not shown.
Binary file not shown.
42
src/main/java/com/bartlomiejpluta/demo/entity/Chest.java
Normal file
42
src/main/java/com/bartlomiejpluta/demo/entity/Chest.java
Normal 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!");
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user