From 3eceb93559acc56d165ee417cf3490e90617cd57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Przemys=C5=82aw=20Pluta?= Date: Fri, 26 Aug 2022 11:29:14 +0200 Subject: [PATCH] Add support for chests --- data.mv.db | Bin 28672 -> 36864 bytes maps/551e1afc-9cda-4d9f-8817-bfd831fc0a75.dat | Bin 42521 -> 28141 bytes maps/f845355e-b9ad-4884-a217-dd3a4c18a3fa.dat | Bin 15577 -> 15736 bytes .../bartlomiejpluta/demo/entity/Chest.java | 42 ++++++++++++++++++ .../demo/entity/MapObject.java | 13 ++++-- .../bartlomiejpluta/demo/gui/LootWindow.java | 8 +++- .../demo/map/BaseMapHandler.java | 11 ++--- .../demo/menu/MenuManager.java | 9 +++- .../demo/runner/DemoRunner.java | 5 +++ .../d78413cd-0dad-4b51-8dd1-54e33535fe53.xml | 4 +- 10 files changed, 78 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/bartlomiejpluta/demo/entity/Chest.java diff --git a/data.mv.db b/data.mv.db index 8d20fc067a793e757e4d132d9a69e3908fea1245..f981dbf4966ac8bb1f173b639360b21bcb03a439 100644 GIT binary patch literal 36864 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 delta 3128 zcmZozz|`=7QPsoBNGB;LKRMgV6ha4QR;5}Q8W!FfcGMO-e~N)+x!%O|>#gH8e;w zGB(#KOD!tS%+CWk+IVujL*(QG4s48xn~ysr@iP`r)(V)+_DP(|abyqmw^})G@M8E(*0`vWuU* zE_8V!%N$0K`ThktiJ5uv$r-7|B@p8k?L-+E85y_?4luAD69dz1uR=srS#uK$^voC- zSSDI~F^Dj5fg?xH$Ra5f&P+B$FpVZ33`;e&UVA6CMBiIBhkO|Oe zFoi_JWQRyu7oh%1|~?+Z(?L&g6sejBMVE2 z0}PQIkZg$E0kAw^j?DqE1c-0|I0P^qV2SJiPunHX3i^Gpp55c*8a zEG@3lVNlt8AX7XgCaRG%!LM4UwQm zLl_h8MuRY^BNo`ys^ImIiyrGjt(KdJ*vP;;QcQ;Zx4 zNl>s#8p4Ctb;eL0q^^VVpmiOL2dU~{JZL2i(Psjw>R@u_;HnPBgXKV|QfLl@@}M~o q!h_{N2oIJ6p*%3 diff --git a/maps/551e1afc-9cda-4d9f-8817-bfd831fc0a75.dat b/maps/551e1afc-9cda-4d9f-8817-bfd831fc0a75.dat index 5fc70436cdb767bea4fa2575ee9596bd1e5f7755..f89f1830b1f4704ac427370e70f61211b25f8611 100644 GIT binary patch delta 196 zcmbPvhUx8X#tjwf+_yrwSbP&R^Q10@OrEG7J$ZpT&twH1fyo#2c_t@-F~?>Zje3F2 zb@sDZHhcK>Fl|lt&*TLfY?CzjHcM&L3virg z;ouaImpZX|p~YH8wv@#5^wgrsj4ry9w+D&{K)6bp)?5(Q3c3 zEF2sH@=}Mvrmz;5=NF|w4UuNI=7R9w*@#1B6rB_Vz+#%#LI+tm*ahUJc7b&=C*_xe z^`!?&v08J1c<*e)!J>*z3am-_<(k%;XIRW;VdU8C$hX9j6$0~cy=>wzV5PwomoskVzZx98xzMVkk=K+ar7w` z4lV(5b#jxflZR}boC1nu`;%Oq++^FyLxD~uGX2RdK(0f z>$&t2Q&K!jQgb!(Qp**R^Kx&C4vw%+J$MD$mbPNzIE-EGo(` QSJF{1HqhK`sk?w50B593=>Px# delta 53 zcmexSb+dBAR2l9iid-zdiJ5s)vlTZlklD${@qn2_Sb$sV=4MOf?ToDXNm;4MlVx;e KH{aBq&kq0>vl7?< 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"/>