diff --git a/core/src/com/riiablo/ai/Npc.java b/core/src/com/riiablo/ai/Npc.java index b66262f7..4d78064f 100644 --- a/core/src/com/riiablo/ai/Npc.java +++ b/core/src/com/riiablo/ai/Npc.java @@ -11,6 +11,7 @@ import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.IntSet; import com.riiablo.Riiablo; @@ -23,6 +24,8 @@ import com.riiablo.engine.server.component.MenuWrapper; import com.riiablo.engine.server.component.PathWrapper; import com.riiablo.engine.server.component.Pathfind; import com.riiablo.engine.server.event.NpcInteractionEvent; +import com.riiablo.item.Item; +import com.riiablo.item.VendorGenerator; import com.riiablo.map.DS1; import com.riiablo.screen.panel.VendorPanel; import com.riiablo.widget.NpcDialogBox; @@ -60,6 +63,8 @@ public class Npc extends AI { String name; MonStats.Entry monstats; + protected VendorGenerator vendors; + public Npc(int entityId) { super(entityId); } @@ -116,7 +121,15 @@ public class Npc extends AI { menu.addItem(3334, new ClickListener() { // trade/repair @Override public void clicked(InputEvent event, float x, float y) { - Riiablo.game.vendorPanel.config(VendorPanel.SMITHY); + // TODO: create inventory component + Array items; + try { + items = vendors.generate(monstats.Id); + } catch (Throwable t) { + items = new Array<>(false, 0, Item.class); + Gdx.app.error(TAG, t.getMessage(), t); + } + Riiablo.game.vendorPanel.config(VendorPanel.SMITHY, items); Riiablo.game.setLeftPanel(Riiablo.game.vendorPanel); } }); @@ -124,7 +137,15 @@ public class Npc extends AI { menu.addItem(3396, new ClickListener() { // trade @Override public void clicked(InputEvent event, float x, float y) { - Riiablo.game.vendorPanel.config(VendorPanel.TRADER); + // TODO: create inventory component + Array items; + try { + items = vendors.generate(monstats.Id); + } catch (Throwable t) { + items = new Array<>(false, 0, Item.class); + Gdx.app.error(TAG, t.getMessage(), t); + } + Riiablo.game.vendorPanel.config(VendorPanel.TRADER, items); Riiablo.game.setLeftPanel(Riiablo.game.vendorPanel); } }); @@ -138,7 +159,8 @@ public class Npc extends AI { menu.addItem(3398, new ClickListener() { // gamble @Override public void clicked(InputEvent event, float x, float y) { - Riiablo.game.vendorPanel.config(VendorPanel.GAMBLER); + // TODO: generate special gamble inventory each time + Riiablo.game.vendorPanel.config(VendorPanel.GAMBLER, new Array(false, 0, Item.class)); Riiablo.game.setLeftPanel(Riiablo.game.vendorPanel); } }); diff --git a/core/src/com/riiablo/item/VendorGenerator.java b/core/src/com/riiablo/item/VendorGenerator.java index 1369920d..60878d49 100644 --- a/core/src/com/riiablo/item/VendorGenerator.java +++ b/core/src/com/riiablo/item/VendorGenerator.java @@ -7,17 +7,24 @@ import net.mostlyoriginal.api.system.core.PassiveSystem; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.utils.Array; +import com.riiablo.Riiablo; import com.riiablo.codec.excel.Excel; import com.riiablo.codec.excel.ItemEntry; public class VendorGenerator extends PassiveSystem { - public ItemGenerator generator; + protected ItemGenerator generator; + + public Array generate(String vendor) throws Exception { + Array items = new Array<>(true, 64, Item.class); + generate(vendor, items, Riiablo.files.armor); + generate(vendor, items, Riiablo.files.weapons); + generate(vendor, items, Riiablo.files.misc); + return items; + } public void generate(String vendor, Array items, Excel excel) throws Exception { Class entryClass = excel.getEntryClass(); Field field = entryClass.getField(vendor); - - items.clear(); for (ItemEntry base : excel) { int[] vendorData = (int[]) field.get(base); if (vendorData[1] > 0) { diff --git a/core/src/com/riiablo/screen/GameScreen.java b/core/src/com/riiablo/screen/GameScreen.java index 87388acb..26542bb9 100644 --- a/core/src/com/riiablo/screen/GameScreen.java +++ b/core/src/com/riiablo/screen/GameScreen.java @@ -103,6 +103,8 @@ import com.riiablo.engine.server.component.Velocity; import com.riiablo.engine.server.event.ZoneChangeEvent; import com.riiablo.graphics.PaletteIndexedColorDrawable; import com.riiablo.item.Item; +import com.riiablo.item.ItemGenerator; +import com.riiablo.item.VendorGenerator; import com.riiablo.key.MappedKey; import com.riiablo.key.MappedKeyStateAdapter; import com.riiablo.map.Act1MapBuilder; @@ -567,6 +569,8 @@ public class GameScreen extends ScreenAdapter implements GameLoadingScreen.Loada builder.with(new CursorMovementSystem()); } if (socket == null) { + builder.with(new ItemGenerator()); + builder.with(new VendorGenerator()); builder.with(new AIStepper()); } builder diff --git a/core/src/com/riiablo/screen/panel/VendorPanel.java b/core/src/com/riiablo/screen/panel/VendorPanel.java index 70278eea..6a5d5ba4 100644 --- a/core/src/com/riiablo/screen/panel/VendorPanel.java +++ b/core/src/com/riiablo/screen/panel/VendorPanel.java @@ -20,9 +20,7 @@ import com.riiablo.codec.DC6; import com.riiablo.codec.excel.Inventory; import com.riiablo.graphics.BlendMode; import com.riiablo.item.Item; -import com.riiablo.item.ItemGenerator; import com.riiablo.item.Stat; -import com.riiablo.item.VendorGenerator; import com.riiablo.loader.DC6Loader; import com.riiablo.widget.Button; import com.riiablo.widget.Label; @@ -242,35 +240,6 @@ public class VendorPanel extends WidgetGroup implements Disposable { addActor(grid); } - ItemGenerator generator = new ItemGenerator(); - VendorGenerator vendors = new VendorGenerator(); - vendors.generator = generator; - - Array items = new Array<>(Item.class); - try { - int count; - vendors.generate("akara", items, Riiablo.files.armor); - count = tabs[TAB_ARMOR].grid.drain(items); - if (count == 0) tabs[TAB_ARMOR].setVisible(false); - Gdx.app.debug(TAG, "Dropping " + items); - - vendors.generate("akara", items, Riiablo.files.weapons); - count = tabs[TAB_WEAPONS].grid.drain(items); - if (count == 0) tabs[TAB_WEAPONS].setVisible(false); - - count = tabs[TAB_WEAPONS2].grid.drain(items); - if (count == 0) tabs[TAB_WEAPONS2].setVisible(false); - Gdx.app.debug(TAG, "Dropping " + items); - - vendors.generate("akara", items, Riiablo.files.misc); - count = tabs[TAB_MISC].grid.drain(items); - if (count == 0) tabs[TAB_MISC].setVisible(false); - Gdx.app.debug(TAG, "Dropping " + items); - } catch (Throwable t) { - Gdx.app.error(TAG, t.getMessage(), t); - } - - setTab(TAB_MISC); setDebug(true, true); } @@ -305,7 +274,7 @@ public class VendorPanel extends WidgetGroup implements Disposable { } } - public void config(int flags) { + public void config(int flags, Array items) { buttonGroup.uncheckAll(); btnBuy.setVisible((flags & BUY) == BUY); btnSell.setVisible((flags & SELL) == SELL); @@ -315,6 +284,43 @@ public class VendorPanel extends WidgetGroup implements Disposable { for (int i = 0; i < btnBlank.length; i++) { btnBlank[i].setVisible((flags & BLANK_MASKS[i]) == 0); } + + // TODO: supply cleaner API grid.drain(items, "misc") or similar + Array tmp = new Array<>(true, items.size, Item.class); + try { + int count; + collect(items, tmp, "armo"); + count = tabs[TAB_ARMOR].grid.drain(tmp); + tabs[TAB_ARMOR].setVisible(count > 0); + Gdx.app.debug(TAG, "Dropping " + tmp); + + collect(items, tmp, "weap"); + count = tabs[TAB_WEAPONS].grid.drain(tmp); + tabs[TAB_WEAPONS].setVisible(count > 0); + + count = tabs[TAB_WEAPONS2].grid.drain(tmp); + tabs[TAB_WEAPONS2].setVisible(count > 0); + Gdx.app.debug(TAG, "Dropping " + tmp); + + collect(items, tmp, "misc"); + count = tabs[TAB_MISC].grid.drain(tmp); + tabs[TAB_MISC].setVisible(count > 0); + Gdx.app.debug(TAG, "Dropping " + tmp); + } catch (Throwable t) { + Gdx.app.error(TAG, t.getMessage(), t); + } + + setTab(TAB_MISC); + } + + private static Array collect(Array items, Array to, String page) { + to.clear(); + for (Item item : items) { + if (item.typeEntry.StorePage.equalsIgnoreCase(page)) { + to.add(item); + } + } + return to; } void setTab(Tab tab) { diff --git a/server/d2gs/src/com/riiablo/server/d2gs/D2GS.java b/server/d2gs/src/com/riiablo/server/d2gs/D2GS.java index 7782501f..9860d730 100644 --- a/server/d2gs/src/com/riiablo/server/d2gs/D2GS.java +++ b/server/d2gs/src/com/riiablo/server/d2gs/D2GS.java @@ -69,6 +69,8 @@ import com.riiablo.engine.server.ServerNetworkIdManager; import com.riiablo.engine.server.VelocityAdder; import com.riiablo.engine.server.WarpInteractor; import com.riiablo.engine.server.component.Networked; +import com.riiablo.item.ItemGenerator; +import com.riiablo.item.VendorGenerator; import com.riiablo.map.Act1MapBuilder; import com.riiablo.map.DS1; import com.riiablo.map.DS1Loader; @@ -260,10 +262,12 @@ public class D2GS extends ApplicationAdapter { .with(new SerializationManager()) .with(mapManager) .with(itemManager) + .with(new ItemGenerator()) .with(new CofManager()) .with(new ObjectInitializer()) .with(new ObjectInteractor(), new WarpInteractor(), new ItemInteractor()) + .with(new VendorGenerator()) .with(new AIStepper()) .with(new Pathfinder()) diff --git a/server/netty/src/com/riiablo/server/d2gs_netty/Main.java b/server/netty/src/com/riiablo/server/d2gs_netty/Main.java index 531e1e9a..911b0aff 100644 --- a/server/netty/src/com/riiablo/server/d2gs_netty/Main.java +++ b/server/netty/src/com/riiablo/server/d2gs_netty/Main.java @@ -51,6 +51,8 @@ import com.riiablo.engine.server.ServerItemManager; import com.riiablo.engine.server.ServerNetworkIdManager; import com.riiablo.engine.server.VelocityAdder; import com.riiablo.engine.server.WarpInteractor; +import com.riiablo.item.ItemGenerator; +import com.riiablo.item.VendorGenerator; import com.riiablo.map.Act1MapBuilder; import com.riiablo.map.DS1; import com.riiablo.map.DS1Loader; @@ -207,10 +209,12 @@ public class Main extends ApplicationAdapter { .with(new SerializationManager()) .with(mapManager) .with(itemManager) + .with(new ItemGenerator()) .with(new CofManager()) .with(new ObjectInitializer()) .with(new ObjectInteractor(), new WarpInteractor(), new ItemInteractor()) + .with(new VendorGenerator()) .with(new AIStepper()) .with(new Pathfinder()) diff --git a/tools/src/com/riiablo/map/MapViewer.java b/tools/src/com/riiablo/map/MapViewer.java index c85552b5..cd7e2d9e 100644 --- a/tools/src/com/riiablo/map/MapViewer.java +++ b/tools/src/com/riiablo/map/MapViewer.java @@ -79,6 +79,8 @@ import com.riiablo.engine.server.component.Classname; import com.riiablo.engine.server.component.Position; import com.riiablo.graphics.BlendMode; import com.riiablo.graphics.PaletteIndexedBatch; +import com.riiablo.item.ItemGenerator; +import com.riiablo.item.VendorGenerator; import com.riiablo.loader.BitmapFontLoader; import com.riiablo.loader.COFLoader; import com.riiablo.loader.DC6Loader; @@ -207,6 +209,8 @@ public class MapViewer extends ApplicationAdapter { .with(new TagManager()) .with(mapManager) .with(new ItemManager()) + .with(new ItemGenerator()) // TODO: remove when support for inventory component added + .with(new VendorGenerator()) // TODO: remove when support for inventory component added .with(new CofManager()) .with(new ObjectInitializer()) .with(new ObjectInteractor(), new WarpInteractor(), new ItemInteractor())