diff --git a/data.mv.db b/data.mv.db index 8d20fc0..f981dbf 100644 Binary files a/data.mv.db and b/data.mv.db differ diff --git a/maps/551e1afc-9cda-4d9f-8817-bfd831fc0a75.dat b/maps/551e1afc-9cda-4d9f-8817-bfd831fc0a75.dat index 5fc7043..f89f183 100644 Binary files a/maps/551e1afc-9cda-4d9f-8817-bfd831fc0a75.dat and b/maps/551e1afc-9cda-4d9f-8817-bfd831fc0a75.dat differ diff --git a/maps/f845355e-b9ad-4884-a217-dd3a4c18a3fa.dat b/maps/f845355e-b9ad-4884-a217-dd3a4c18a3fa.dat index 7eac761..065b7fd 100644 Binary files a/maps/f845355e-b9ad-4884-a217-dd3a4c18a3fa.dat and b/maps/f845355e-b9ad-4884-a217-dd3a4c18a3fa.dat differ diff --git a/src/main/java/com/bartlomiejpluta/demo/entity/Chest.java b/src/main/java/com/bartlomiejpluta/demo/entity/Chest.java new file mode 100644 index 0000000..50ad4f1 --- /dev/null +++ b/src/main/java/com/bartlomiejpluta/demo/entity/Chest.java @@ -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!"); + } +} diff --git a/src/main/java/com/bartlomiejpluta/demo/entity/MapObject.java b/src/main/java/com/bartlomiejpluta/demo/entity/MapObject.java index 1cb13ed..39b8303 100644 --- a/src/main/java/com/bartlomiejpluta/demo/entity/MapObject.java +++ b/src/main/java/com/bartlomiejpluta/demo/entity/MapObject.java @@ -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 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() + : 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; } diff --git a/src/main/java/com/bartlomiejpluta/demo/gui/LootWindow.java b/src/main/java/com/bartlomiejpluta/demo/gui/LootWindow.java index c3a5d23..297d77d 100644 --- a/src/main/java/com/bartlomiejpluta/demo/gui/LootWindow.java +++ b/src/main/java/com/bartlomiejpluta/demo/gui/LootWindow.java @@ -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(); } diff --git a/src/main/java/com/bartlomiejpluta/demo/map/BaseMapHandler.java b/src/main/java/com/bartlomiejpluta/demo/map/BaseMapHandler.java index 9021908..6b0919c 100644 --- a/src/main/java/com/bartlomiejpluta/demo/map/BaseMapHandler.java +++ b/src/main/java/com/bartlomiejpluta/demo/map/BaseMapHandler.java @@ -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) { diff --git a/src/main/java/com/bartlomiejpluta/demo/menu/MenuManager.java b/src/main/java/com/bartlomiejpluta/demo/menu/MenuManager.java index 6382758..b315937 100644 --- a/src/main/java/com/bartlomiejpluta/demo/menu/MenuManager.java +++ b/src/main/java/com/bartlomiejpluta/demo/menu/MenuManager.java @@ -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() { diff --git a/src/main/java/com/bartlomiejpluta/demo/runner/DemoRunner.java b/src/main/java/com/bartlomiejpluta/demo/runner/DemoRunner.java index acf15d5..82728f7 100644 --- a/src/main/java/com/bartlomiejpluta/demo/runner/DemoRunner.java +++ b/src/main/java/com/bartlomiejpluta/demo/runner/DemoRunner.java @@ -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(); } diff --git a/widgets/d78413cd-0dad-4b51-8dd1-54e33535fe53.xml b/widgets/d78413cd-0dad-4b51-8dd1-54e33535fe53.xml index 887729f..2503ae1 100644 --- a/widgets/d78413cd-0dad-4b51-8dd1-54e33535fe53.xml +++ b/widgets/d78413cd-0dad-4b51-8dd1-54e33535fe53.xml @@ -10,6 +10,7 @@ Loot - + fontSize="30f"/>