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