Added support for distinct vendor inventories

Added support for distinct vendor inventories
No inventory component yet -- generated each time vendor loaded
Moved VendorPanel inventory management to Npc for time being (from UI to a system)
Modified VendorPanel#config signature to include inventory item list
Created VendorGenerator#generate(String) to generate an inventory for a specified vendor
Added ItemGenerator and VendorGenerator systems to various engines
This commit is contained in:
Collin Smith 2020-07-12 17:11:05 -07:00
parent bda2b7152b
commit 2e774fd953
7 changed files with 89 additions and 38 deletions

View File

@ -11,6 +11,7 @@ import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.IntSet; import com.badlogic.gdx.utils.IntSet;
import com.riiablo.Riiablo; 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.PathWrapper;
import com.riiablo.engine.server.component.Pathfind; import com.riiablo.engine.server.component.Pathfind;
import com.riiablo.engine.server.event.NpcInteractionEvent; 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.map.DS1;
import com.riiablo.screen.panel.VendorPanel; import com.riiablo.screen.panel.VendorPanel;
import com.riiablo.widget.NpcDialogBox; import com.riiablo.widget.NpcDialogBox;
@ -60,6 +63,8 @@ public class Npc extends AI {
String name; String name;
MonStats.Entry monstats; MonStats.Entry monstats;
protected VendorGenerator vendors;
public Npc(int entityId) { public Npc(int entityId) {
super(entityId); super(entityId);
} }
@ -116,7 +121,15 @@ public class Npc extends AI {
menu.addItem(3334, new ClickListener() { // trade/repair menu.addItem(3334, new ClickListener() { // trade/repair
@Override @Override
public void clicked(InputEvent event, float x, float y) { public void clicked(InputEvent event, float x, float y) {
Riiablo.game.vendorPanel.config(VendorPanel.SMITHY); // TODO: create inventory component
Array<Item> 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); Riiablo.game.setLeftPanel(Riiablo.game.vendorPanel);
} }
}); });
@ -124,7 +137,15 @@ public class Npc extends AI {
menu.addItem(3396, new ClickListener() { // trade menu.addItem(3396, new ClickListener() { // trade
@Override @Override
public void clicked(InputEvent event, float x, float y) { public void clicked(InputEvent event, float x, float y) {
Riiablo.game.vendorPanel.config(VendorPanel.TRADER); // TODO: create inventory component
Array<Item> 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); Riiablo.game.setLeftPanel(Riiablo.game.vendorPanel);
} }
}); });
@ -138,7 +159,8 @@ public class Npc extends AI {
menu.addItem(3398, new ClickListener() { // gamble menu.addItem(3398, new ClickListener() { // gamble
@Override @Override
public void clicked(InputEvent event, float x, float y) { 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<Item>(false, 0, Item.class));
Riiablo.game.setLeftPanel(Riiablo.game.vendorPanel); Riiablo.game.setLeftPanel(Riiablo.game.vendorPanel);
} }
}); });

View File

@ -7,17 +7,24 @@ import net.mostlyoriginal.api.system.core.PassiveSystem;
import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import com.riiablo.Riiablo;
import com.riiablo.codec.excel.Excel; import com.riiablo.codec.excel.Excel;
import com.riiablo.codec.excel.ItemEntry; import com.riiablo.codec.excel.ItemEntry;
public class VendorGenerator extends PassiveSystem { public class VendorGenerator extends PassiveSystem {
public ItemGenerator generator; protected ItemGenerator generator;
public Array<Item> generate(String vendor) throws Exception {
Array<Item> 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<Item> items, Excel<? extends ItemEntry> excel) throws Exception { public void generate(String vendor, Array<Item> items, Excel<? extends ItemEntry> excel) throws Exception {
Class<? extends ItemEntry> entryClass = excel.getEntryClass(); Class<? extends ItemEntry> entryClass = excel.getEntryClass();
Field field = entryClass.getField(vendor); Field field = entryClass.getField(vendor);
items.clear();
for (ItemEntry base : excel) { for (ItemEntry base : excel) {
int[] vendorData = (int[]) field.get(base); int[] vendorData = (int[]) field.get(base);
if (vendorData[1] > 0) { if (vendorData[1] > 0) {

View File

@ -103,6 +103,8 @@ import com.riiablo.engine.server.component.Velocity;
import com.riiablo.engine.server.event.ZoneChangeEvent; import com.riiablo.engine.server.event.ZoneChangeEvent;
import com.riiablo.graphics.PaletteIndexedColorDrawable; import com.riiablo.graphics.PaletteIndexedColorDrawable;
import com.riiablo.item.Item; import com.riiablo.item.Item;
import com.riiablo.item.ItemGenerator;
import com.riiablo.item.VendorGenerator;
import com.riiablo.key.MappedKey; import com.riiablo.key.MappedKey;
import com.riiablo.key.MappedKeyStateAdapter; import com.riiablo.key.MappedKeyStateAdapter;
import com.riiablo.map.Act1MapBuilder; import com.riiablo.map.Act1MapBuilder;
@ -567,6 +569,8 @@ public class GameScreen extends ScreenAdapter implements GameLoadingScreen.Loada
builder.with(new CursorMovementSystem()); builder.with(new CursorMovementSystem());
} }
if (socket == null) { if (socket == null) {
builder.with(new ItemGenerator());
builder.with(new VendorGenerator());
builder.with(new AIStepper()); builder.with(new AIStepper());
} }
builder builder

View File

@ -20,9 +20,7 @@ import com.riiablo.codec.DC6;
import com.riiablo.codec.excel.Inventory; import com.riiablo.codec.excel.Inventory;
import com.riiablo.graphics.BlendMode; import com.riiablo.graphics.BlendMode;
import com.riiablo.item.Item; import com.riiablo.item.Item;
import com.riiablo.item.ItemGenerator;
import com.riiablo.item.Stat; import com.riiablo.item.Stat;
import com.riiablo.item.VendorGenerator;
import com.riiablo.loader.DC6Loader; import com.riiablo.loader.DC6Loader;
import com.riiablo.widget.Button; import com.riiablo.widget.Button;
import com.riiablo.widget.Label; import com.riiablo.widget.Label;
@ -242,35 +240,6 @@ public class VendorPanel extends WidgetGroup implements Disposable {
addActor(grid); addActor(grid);
} }
ItemGenerator generator = new ItemGenerator();
VendorGenerator vendors = new VendorGenerator();
vendors.generator = generator;
Array<Item> 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); 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<Item> items) {
buttonGroup.uncheckAll(); buttonGroup.uncheckAll();
btnBuy.setVisible((flags & BUY) == BUY); btnBuy.setVisible((flags & BUY) == BUY);
btnSell.setVisible((flags & SELL) == SELL); btnSell.setVisible((flags & SELL) == SELL);
@ -315,6 +284,43 @@ public class VendorPanel extends WidgetGroup implements Disposable {
for (int i = 0; i < btnBlank.length; i++) { for (int i = 0; i < btnBlank.length; i++) {
btnBlank[i].setVisible((flags & BLANK_MASKS[i]) == 0); btnBlank[i].setVisible((flags & BLANK_MASKS[i]) == 0);
} }
// TODO: supply cleaner API grid.drain(items, "misc") or similar
Array<Item> 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<Item> collect(Array<Item> items, Array<Item> to, String page) {
to.clear();
for (Item item : items) {
if (item.typeEntry.StorePage.equalsIgnoreCase(page)) {
to.add(item);
}
}
return to;
} }
void setTab(Tab tab) { void setTab(Tab tab) {

View File

@ -69,6 +69,8 @@ import com.riiablo.engine.server.ServerNetworkIdManager;
import com.riiablo.engine.server.VelocityAdder; import com.riiablo.engine.server.VelocityAdder;
import com.riiablo.engine.server.WarpInteractor; import com.riiablo.engine.server.WarpInteractor;
import com.riiablo.engine.server.component.Networked; 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.Act1MapBuilder;
import com.riiablo.map.DS1; import com.riiablo.map.DS1;
import com.riiablo.map.DS1Loader; import com.riiablo.map.DS1Loader;
@ -260,10 +262,12 @@ public class D2GS extends ApplicationAdapter {
.with(new SerializationManager()) .with(new SerializationManager())
.with(mapManager) .with(mapManager)
.with(itemManager) .with(itemManager)
.with(new ItemGenerator())
.with(new CofManager()) .with(new CofManager())
.with(new ObjectInitializer()) .with(new ObjectInitializer())
.with(new ObjectInteractor(), new WarpInteractor(), new ItemInteractor()) .with(new ObjectInteractor(), new WarpInteractor(), new ItemInteractor())
.with(new VendorGenerator())
.with(new AIStepper()) .with(new AIStepper())
.with(new Pathfinder()) .with(new Pathfinder())

View File

@ -51,6 +51,8 @@ import com.riiablo.engine.server.ServerItemManager;
import com.riiablo.engine.server.ServerNetworkIdManager; import com.riiablo.engine.server.ServerNetworkIdManager;
import com.riiablo.engine.server.VelocityAdder; import com.riiablo.engine.server.VelocityAdder;
import com.riiablo.engine.server.WarpInteractor; 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.Act1MapBuilder;
import com.riiablo.map.DS1; import com.riiablo.map.DS1;
import com.riiablo.map.DS1Loader; import com.riiablo.map.DS1Loader;
@ -207,10 +209,12 @@ public class Main extends ApplicationAdapter {
.with(new SerializationManager()) .with(new SerializationManager())
.with(mapManager) .with(mapManager)
.with(itemManager) .with(itemManager)
.with(new ItemGenerator())
.with(new CofManager()) .with(new CofManager())
.with(new ObjectInitializer()) .with(new ObjectInitializer())
.with(new ObjectInteractor(), new WarpInteractor(), new ItemInteractor()) .with(new ObjectInteractor(), new WarpInteractor(), new ItemInteractor())
.with(new VendorGenerator())
.with(new AIStepper()) .with(new AIStepper())
.with(new Pathfinder()) .with(new Pathfinder())

View File

@ -79,6 +79,8 @@ import com.riiablo.engine.server.component.Classname;
import com.riiablo.engine.server.component.Position; import com.riiablo.engine.server.component.Position;
import com.riiablo.graphics.BlendMode; import com.riiablo.graphics.BlendMode;
import com.riiablo.graphics.PaletteIndexedBatch; import com.riiablo.graphics.PaletteIndexedBatch;
import com.riiablo.item.ItemGenerator;
import com.riiablo.item.VendorGenerator;
import com.riiablo.loader.BitmapFontLoader; import com.riiablo.loader.BitmapFontLoader;
import com.riiablo.loader.COFLoader; import com.riiablo.loader.COFLoader;
import com.riiablo.loader.DC6Loader; import com.riiablo.loader.DC6Loader;
@ -207,6 +209,8 @@ public class MapViewer extends ApplicationAdapter {
.with(new TagManager()) .with(new TagManager())
.with(mapManager) .with(mapManager)
.with(new ItemManager()) .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 CofManager())
.with(new ObjectInitializer()) .with(new ObjectInitializer())
.with(new ObjectInteractor(), new WarpInteractor(), new ItemInteractor()) .with(new ObjectInteractor(), new WarpInteractor(), new ItemInteractor())