From 206875d2a0748a4826ef3f4d68e41d3c3374cd74 Mon Sep 17 00:00:00 2001 From: Collin Smith Date: Sun, 31 May 2020 01:00:46 -0700 Subject: [PATCH] Introduced ItemController interface and ClientItemManager ItemController created to allow swappable interfacing between CharData and ClientItemManager ClientItemManager engine system added (defers to Riiablo.charData temporarily) Added dependency injection for ItemController to allow wiring Changed item management panels to use ItemController injection instead of Riiablo.charData directly --- .../engine/client/ClientItemManager.java | 73 +++++++++++++++++++ core/src/com/riiablo/save/CharData.java | 13 +++- core/src/com/riiablo/save/ItemController.java | 19 +++++ core/src/com/riiablo/screen/GameScreen.java | 23 +++++- .../riiablo/screen/panel/ControlPanel.java | 11 ++- .../com/riiablo/screen/panel/CubePanel.java | 11 ++- .../riiablo/screen/panel/HirelingPanel.java | 11 ++- .../riiablo/screen/panel/InventoryPanel.java | 17 +++-- .../com/riiablo/screen/panel/StashPanel.java | 11 ++- 9 files changed, 168 insertions(+), 21 deletions(-) create mode 100644 core/src/com/riiablo/engine/client/ClientItemManager.java create mode 100644 core/src/com/riiablo/save/ItemController.java diff --git a/core/src/com/riiablo/engine/client/ClientItemManager.java b/core/src/com/riiablo/engine/client/ClientItemManager.java new file mode 100644 index 00000000..c50848d4 --- /dev/null +++ b/core/src/com/riiablo/engine/client/ClientItemManager.java @@ -0,0 +1,73 @@ +package com.riiablo.engine.client; + +import com.riiablo.Riiablo; +import com.riiablo.engine.server.ItemManager; +import com.riiablo.item.BodyLoc; +import com.riiablo.item.Item; +import com.riiablo.item.StoreLoc; +import com.riiablo.save.ItemController; + +import net.mostlyoriginal.api.system.core.PassiveSystem; + +// sends item events +// receives item events and applies changes +public class ClientItemManager extends PassiveSystem implements ItemController { + private static final String TAG = "ClientItemManager"; + + protected ItemManager items; + + @Override + public void groundToCursor(Item item) { + Riiablo.charData.groundToCursor(item); + } + + @Override + public void cursorToGround() { + Riiablo.charData.cursorToGround(); + } + + @Override + public void storeToCursor(int i) { + Riiablo.charData.storeToCursor(i); + } + + @Override + public void cursorToStore(StoreLoc storeLoc, int x, int y) { + Riiablo.charData.cursorToStore(storeLoc, x, y); + } + + @Override + public void swapStoreItem(int i, StoreLoc storeLoc, int x, int y) { + Riiablo.charData.swapStoreItem(i, storeLoc, x, y); + } + + @Override + public void bodyToCursor(BodyLoc bodyLoc, boolean merc) { + Riiablo.charData.bodyToCursor(bodyLoc, merc); + } + + @Override + public void cursorToBody(BodyLoc bodyLoc, boolean merc) { + Riiablo.charData.cursorToBody(bodyLoc, merc); + } + + @Override + public void swapBodyItem(BodyLoc bodyLoc, boolean merc) { + Riiablo.charData.swapBodyItem(bodyLoc, merc); + } + + @Override + public void beltToCursor(int i) { + Riiablo.charData.beltToCursor(i); + } + + @Override + public void cursorToBelt(int x, int y) { + Riiablo.charData.cursorToBelt(x, y); + } + + @Override + public void swapBeltItem(int i) { + Riiablo.charData.swapBeltItem(i); + } +} diff --git a/core/src/com/riiablo/save/CharData.java b/core/src/com/riiablo/save/CharData.java index 8e1e795f..66ae2141 100644 --- a/core/src/com/riiablo/save/CharData.java +++ b/core/src/com/riiablo/save/CharData.java @@ -25,7 +25,7 @@ import java.nio.ByteBuffer; import java.util.Arrays; // TODO: support pooling CharData for multiplayer -public class CharData implements ItemData.UpdateListener, Pool.Poolable { +public class CharData implements ItemController, ItemData.UpdateListener, Pool.Poolable { private static final String TAG = "CharData"; private static final boolean DEBUG = true; private static final boolean DEBUG_ITEMS = DEBUG && !true; @@ -380,11 +380,13 @@ public class CharData implements ItemData.UpdateListener, Pool.Poolable { return itemData; } + @Override public void groundToCursor(Item item) { if (DEBUG_ITEMS) Gdx.app.log(TAG, "groundToCursor " + item); itemData.pickup(item); } + @Override public void cursorToGround() { if (DEBUG_ITEMS) Gdx.app.log(TAG, "cursorToGround"); itemData.drop(); @@ -395,16 +397,19 @@ public class CharData implements ItemData.UpdateListener, Pool.Poolable { itemData.pickup(i); } + @Override public void storeToCursor(int i) { if (DEBUG_ITEMS) Gdx.app.log(TAG, "storeToCursor " + i); itemToCursor(i); } + @Override public void cursorToStore(StoreLoc storeLoc, int x, int y) { if (DEBUG_ITEMS) Gdx.app.log(TAG, "cursorToStore " + storeLoc + "," + x + "," + y); itemData.storeCursor(storeLoc, x, y); } + @Override public void swapStoreItem(int i, StoreLoc storeLoc, int x, int y) { if (DEBUG_ITEMS) Gdx.app.log(TAG, "swapStoreItem " + i + "," + storeLoc + "," + x + "," + y); cursorToStore(storeLoc, x, y); @@ -423,6 +428,7 @@ public class CharData implements ItemData.UpdateListener, Pool.Poolable { swapBodyItem(bodyLoc, false); } + @Override public void bodyToCursor(BodyLoc bodyLoc, boolean merc) { if (DEBUG_ITEMS) Gdx.app.log(TAG, "bodyToCursor " + bodyLoc + "," + (merc ? "merc" : "player")); assert itemData.cursor == ItemData.INVALID_ITEM; @@ -437,6 +443,7 @@ public class CharData implements ItemData.UpdateListener, Pool.Poolable { itemData.setLocation(item, Location.CURSOR); } + @Override public void cursorToBody(BodyLoc bodyLoc, boolean merc) { if (DEBUG_ITEMS) Gdx.app.log(TAG, "cursorToBody " + bodyLoc + "," + (merc ? "merc" : "player")); assert itemData.cursor != ItemData.INVALID_ITEM; @@ -457,6 +464,7 @@ public class CharData implements ItemData.UpdateListener, Pool.Poolable { * was being called out of order for setting the cursor, causing the cursor to be unset * within the UI immediately after being changed. */ + @Override public void swapBodyItem(BodyLoc bodyLoc, boolean merc) { if (DEBUG_ITEMS) Gdx.app.log(TAG, "swapBodyItem " + bodyLoc + "," + (merc ? "merc" : "player")); @@ -485,11 +493,13 @@ public class CharData implements ItemData.UpdateListener, Pool.Poolable { itemData.setLocation(newCursorItem, Location.CURSOR); } + @Override public void beltToCursor(int i) { if (DEBUG_ITEMS) Gdx.app.log(TAG, "beltToCursor"); itemToCursor(i); } + @Override public void cursorToBelt(int x, int y) { if (DEBUG_ITEMS) Gdx.app.log(TAG, "cursorToBelt"); assert itemData.cursor != ItemData.INVALID_ITEM; @@ -508,6 +518,7 @@ public class CharData implements ItemData.UpdateListener, Pool.Poolable { * was being called out of order for setting the cursor, causing the cursor to be unset * within the UI immediately after being changed. */ + @Override public void swapBeltItem(int i) { if (DEBUG_ITEMS) Gdx.app.log(TAG, "swapBeltItem"); diff --git a/core/src/com/riiablo/save/ItemController.java b/core/src/com/riiablo/save/ItemController.java new file mode 100644 index 00000000..51749d30 --- /dev/null +++ b/core/src/com/riiablo/save/ItemController.java @@ -0,0 +1,19 @@ +package com.riiablo.save; + +import com.riiablo.item.BodyLoc; +import com.riiablo.item.Item; +import com.riiablo.item.StoreLoc; + +public interface ItemController { + void groundToCursor(Item item); + void cursorToGround(); + void storeToCursor(int i); + void cursorToStore(StoreLoc storeLoc, int x, int y); + void swapStoreItem(int i, StoreLoc storeLoc, int x, int y); + void bodyToCursor(BodyLoc bodyLoc, boolean merc); + void cursorToBody(BodyLoc bodyLoc, boolean merc); + void swapBodyItem(BodyLoc bodyLoc, boolean merc); + void beltToCursor(int i); + void cursorToBelt(int x, int y); + void swapBeltItem(int i); +} diff --git a/core/src/com/riiablo/screen/GameScreen.java b/core/src/com/riiablo/screen/GameScreen.java index c732951b..47edbffa 100644 --- a/core/src/com/riiablo/screen/GameScreen.java +++ b/core/src/com/riiablo/screen/GameScreen.java @@ -44,6 +44,7 @@ import com.riiablo.engine.EntityFactory; import com.riiablo.engine.client.AnimationStepper; import com.riiablo.engine.client.AutoInteracter; import com.riiablo.engine.client.ClientEntityFactory; +import com.riiablo.engine.client.ClientItemManager; import com.riiablo.engine.client.CofAlphaHandler; import com.riiablo.engine.client.CofLayerCacher; import com.riiablo.engine.client.CofLayerLoader; @@ -56,8 +57,8 @@ import com.riiablo.engine.client.CursorMovementSystem; import com.riiablo.engine.client.DialogManager; import com.riiablo.engine.client.DirectionResolver; import com.riiablo.engine.client.HoveredManager; -import com.riiablo.engine.client.ItemLoader; import com.riiablo.engine.client.ItemEffectManager; +import com.riiablo.engine.client.ItemLoader; import com.riiablo.engine.client.LabelManager; import com.riiablo.engine.client.MenuManager; import com.riiablo.engine.client.MissileLoader; @@ -198,6 +199,8 @@ public class GameScreen extends ScreenAdapter implements GameLoadingScreen.Loada IsometricCamera iso; InputProcessor testingInputProcessor; + ClientItemManager itemController; + public EscapePanel escapePanel; public ControlPanel controlPanel; MobilePanel mobilePanel; @@ -484,12 +487,14 @@ public class GameScreen extends ScreenAdapter implements GameLoadingScreen.Loada iso = renderer.iso(); scaledStage = new Stage(new ScreenViewport(iso), Riiablo.batch); factory = new ClientEntityFactory(); + itemController = new ClientItemManager(); WorldConfiguration config = getWorldConfiguration(); config .register("iso", iso) .register("map", map) .register("factory", factory) + .register("itemController", itemController) .register("batch", Riiablo.batch) .register("shapes", Riiablo.shapes) .register("stage", stage) @@ -506,6 +511,8 @@ public class GameScreen extends ScreenAdapter implements GameLoadingScreen.Loada if (mobileControls != null) engine.inject(mobileControls); + injectPanels(); + // TODO: better place to put this? charData.getItems().addLocationListener(Riiablo.cursor); charData.getMerc().getItems().addLocationListener(Riiablo.cursor); @@ -513,6 +520,18 @@ public class GameScreen extends ScreenAdapter implements GameLoadingScreen.Loada loadingScreen = new GameLoadingScreen(map, getDependencies()); } + private void injectPanels() { + engine.inject(inventoryPanel); + engine.inject(hirelingPanel); + engine.inject(controlPanel); + engine.inject(cubePanel); + engine.inject(stashPanel); +// TODO: maybe it would be better to do more like?: +// for (Actor actor : stage.getActors()) { +// engine.inject(actor); +// } + } + protected WorldConfiguration getWorldConfiguration() { return getWorldConfigurationBuilder().build(); } @@ -523,7 +542,7 @@ public class GameScreen extends ScreenAdapter implements GameLoadingScreen.Loada .with(new EventSystem()) .with(new TagManager()) .with(mapManager) - .with(new ItemManager()) + .with(itemController, new ItemManager()) .with(new CofManager()) .with(new ObjectInitializer()) .with(new ObjectInteractor(), new WarpInteractor(), new ItemInteractor()) diff --git a/core/src/com/riiablo/screen/panel/ControlPanel.java b/core/src/com/riiablo/screen/panel/ControlPanel.java index 0c456958..599915de 100644 --- a/core/src/com/riiablo/screen/panel/ControlPanel.java +++ b/core/src/com/riiablo/screen/panel/ControlPanel.java @@ -1,5 +1,6 @@ package com.riiablo.screen.panel; +import com.artemis.annotations.Wire; import com.badlogic.gdx.Application; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; @@ -33,6 +34,7 @@ import com.riiablo.item.Location; import com.riiablo.item.Stat; import com.riiablo.key.MappedKey; import com.riiablo.loader.DC6Loader; +import com.riiablo.save.ItemController; import com.riiablo.save.ItemData; import com.riiablo.widget.Button; import com.riiablo.widget.HotkeyButton; @@ -64,6 +66,9 @@ public class ControlPanel extends Table implements Disposable, EscapeController final AssetDescriptor CharSkilliconDescriptor[]; DC6 CharSkillicon[]; + @Wire(name = "itemController") + protected ItemController itemController; + private static int getClassId(String charClass) { if (charClass.isEmpty()) return -1; switch (charClass.charAt(0)) { @@ -384,17 +389,17 @@ public class ControlPanel extends Table implements Disposable, EscapeController @Override public void onDrop(int x, int y) { - Riiablo.charData.cursorToBelt(x, y); + itemController.cursorToBelt(x, y); } @Override public void onPickup(int i) { - Riiablo.charData.beltToCursor(i); + itemController.beltToCursor(i); } @Override public void onSwap(int i, int x, int y) { - Riiablo.charData.swapBeltItem(i); + itemController.swapBeltItem(i); } private class MinipanelWidget extends WidgetGroup implements Disposable { diff --git a/core/src/com/riiablo/screen/panel/CubePanel.java b/core/src/com/riiablo/screen/panel/CubePanel.java index 99589dc9..1347361f 100644 --- a/core/src/com/riiablo/screen/panel/CubePanel.java +++ b/core/src/com/riiablo/screen/panel/CubePanel.java @@ -1,5 +1,6 @@ package com.riiablo.screen.panel; +import com.artemis.annotations.Wire; import com.badlogic.gdx.assets.AssetDescriptor; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.TextureRegion; @@ -17,6 +18,7 @@ import com.riiablo.codec.excel.Inventory; import com.riiablo.item.Item; import com.riiablo.item.StoreLoc; import com.riiablo.loader.DC6Loader; +import com.riiablo.save.ItemController; import com.riiablo.save.ItemData; import com.riiablo.widget.Button; @@ -34,6 +36,9 @@ public class CubePanel extends WidgetGroup implements Disposable, ItemGrid.GridL final Inventory.Entry inventory; + @Wire(name = "itemController") + protected ItemController itemController; + public CubePanel() { Riiablo.assets.load(supertransmogrifierDescriptor); Riiablo.assets.finishLoadingAsset(supertransmogrifierDescriptor); @@ -103,16 +108,16 @@ public class CubePanel extends WidgetGroup implements Disposable, ItemGrid.GridL @Override public void onDrop(int x, int y) { - Riiablo.charData.cursorToStore(StoreLoc.CUBE, x, y); + itemController.cursorToStore(StoreLoc.CUBE, x, y); } @Override public void onPickup(int i) { - Riiablo.charData.storeToCursor(i); + itemController.storeToCursor(i); } @Override public void onSwap(int i, int x, int y) { - Riiablo.charData.swapStoreItem(i, StoreLoc.CUBE, x, y); + itemController.swapStoreItem(i, StoreLoc.CUBE, x, y); } } diff --git a/core/src/com/riiablo/screen/panel/HirelingPanel.java b/core/src/com/riiablo/screen/panel/HirelingPanel.java index c4af93f9..52e97ed2 100644 --- a/core/src/com/riiablo/screen/panel/HirelingPanel.java +++ b/core/src/com/riiablo/screen/panel/HirelingPanel.java @@ -1,5 +1,6 @@ package com.riiablo.screen.panel; +import com.artemis.annotations.Wire; import com.badlogic.gdx.assets.AssetDescriptor; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Pixmap; @@ -26,6 +27,7 @@ import com.riiablo.item.BodyLoc; import com.riiablo.item.Item; import com.riiablo.loader.DC6Loader; import com.riiablo.save.CharData; +import com.riiablo.save.ItemController; import com.riiablo.save.ItemData; import com.riiablo.widget.Button; import com.riiablo.widget.Label; @@ -52,6 +54,9 @@ public class HirelingPanel extends WidgetGroup implements Disposable { final Color backgroundColorG; final Color backgroundColorR; + @Wire(name = "itemController") + protected ItemController itemController; + public HirelingPanel() { Riiablo.assets.load(NpcInvDescriptor); Riiablo.assets.finishLoadingAsset(NpcInvDescriptor); @@ -317,14 +322,14 @@ public class HirelingPanel extends WidgetGroup implements Disposable { Riiablo.audio.play(cursor.getDropSound(), true); if (item != null) { - Riiablo.charData.swapBodyItem(BodyPart.this.bodyLoc, true); + itemController.swapBodyItem(BodyPart.this.bodyLoc, true); } else { - Riiablo.charData.cursorToBody(BodyPart.this.bodyLoc, true); + itemController.cursorToBody(BodyPart.this.bodyLoc, true); } item = cursor; } else { item = null; - Riiablo.charData.bodyToCursor(BodyPart.this.bodyLoc, true); + itemController.bodyToCursor(BodyPart.this.bodyLoc, true); } } }); diff --git a/core/src/com/riiablo/screen/panel/InventoryPanel.java b/core/src/com/riiablo/screen/panel/InventoryPanel.java index c89d3769..efc0ff93 100644 --- a/core/src/com/riiablo/screen/panel/InventoryPanel.java +++ b/core/src/com/riiablo/screen/panel/InventoryPanel.java @@ -1,5 +1,6 @@ package com.riiablo.screen.panel; +import com.artemis.annotations.Wire; import com.badlogic.gdx.assets.AssetDescriptor; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Pixmap; @@ -28,6 +29,7 @@ import com.riiablo.item.Item; import com.riiablo.item.Stat; import com.riiablo.item.StoreLoc; import com.riiablo.loader.DC6Loader; +import com.riiablo.save.ItemController; import com.riiablo.save.ItemData; import com.riiablo.widget.Button; import com.riiablo.widget.Label; @@ -64,6 +66,9 @@ public class InventoryPanel extends WidgetGroup implements Disposable, ItemGrid. final Color backgroundColorG; final Color backgroundColorR; + @Wire(name = "itemController") + protected ItemController itemController; + public InventoryPanel() { Riiablo.assets.load(invcharDescriptor); Riiablo.assets.finishLoadingAsset(invcharDescriptor); @@ -319,17 +324,17 @@ public class InventoryPanel extends WidgetGroup implements Disposable, ItemGrid. @Override public void onDrop(int x, int y) { - Riiablo.charData.cursorToStore(StoreLoc.INVENTORY, x, y); + itemController.cursorToStore(StoreLoc.INVENTORY, x, y); } @Override public void onPickup(int i) { - Riiablo.charData.storeToCursor(i); + itemController.storeToCursor(i); } @Override public void onSwap(int i, int x, int y) { - Riiablo.charData.swapStoreItem(i, StoreLoc.INVENTORY, x, y); + itemController.swapStoreItem(i, StoreLoc.INVENTORY, x, y); } private class BodyPart extends Actor { @@ -357,14 +362,14 @@ public class InventoryPanel extends WidgetGroup implements Disposable, ItemGrid. Riiablo.audio.play(cursor.getDropSound(), true); if (item != null) { - Riiablo.charData.swapBodyItem(BodyPart.this.bodyLoc); + itemController.swapBodyItem(BodyPart.this.bodyLoc, false); } else { - Riiablo.charData.cursorToBody(BodyPart.this.bodyLoc); + itemController.cursorToBody(BodyPart.this.bodyLoc, false); } item = cursor; } else { item = null; - Riiablo.charData.bodyToCursor(BodyPart.this.bodyLoc); + itemController.bodyToCursor(BodyPart.this.bodyLoc, false); } } }); diff --git a/core/src/com/riiablo/screen/panel/StashPanel.java b/core/src/com/riiablo/screen/panel/StashPanel.java index b3679cdf..c422d4b8 100644 --- a/core/src/com/riiablo/screen/panel/StashPanel.java +++ b/core/src/com/riiablo/screen/panel/StashPanel.java @@ -1,5 +1,6 @@ package com.riiablo.screen.panel; +import com.artemis.annotations.Wire; import com.badlogic.gdx.assets.AssetDescriptor; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.TextureRegion; @@ -18,6 +19,7 @@ import com.riiablo.item.Item; import com.riiablo.item.Stat; import com.riiablo.item.StoreLoc; import com.riiablo.loader.DC6Loader; +import com.riiablo.save.ItemController; import com.riiablo.save.ItemData; import com.riiablo.widget.Button; import com.riiablo.widget.Label; @@ -36,6 +38,9 @@ public class StashPanel extends WidgetGroup implements Disposable, ItemGrid.Grid final Inventory.Entry inventory; + @Wire(name = "itemController") + protected ItemController itemController; + public StashPanel() { Riiablo.assets.load(TradeStashDescriptor); Riiablo.assets.finishLoadingAsset(TradeStashDescriptor); @@ -105,17 +110,17 @@ public class StashPanel extends WidgetGroup implements Disposable, ItemGrid.Grid @Override public void onDrop(int x, int y) { - Riiablo.charData.cursorToStore(StoreLoc.STASH, x, y); + itemController.cursorToStore(StoreLoc.STASH, x, y); } @Override public void onPickup(int i) { - Riiablo.charData.storeToCursor(i); + itemController.storeToCursor(i); } @Override public void onSwap(int i, int x, int y) { - Riiablo.charData.swapStoreItem(i, StoreLoc.STASH, x, y); + itemController.swapStoreItem(i, StoreLoc.STASH, x, y); } @Override