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
This commit is contained in:
Collin Smith 2020-05-31 01:00:46 -07:00
parent 94e2b379e7
commit 206875d2a0
9 changed files with 168 additions and 21 deletions

View File

@ -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);
}
}

View File

@ -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");

View File

@ -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);
}

View File

@ -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())

View File

@ -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<DC6> 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 {

View File

@ -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);
}
}

View File

@ -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);
}
}
});

View File

@ -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);
}
}
});

View File

@ -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