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.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<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);
}
});
@ -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<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);
}
});
@ -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<Item>(false, 0, Item.class));
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.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<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 {
Class<? extends ItemEntry> entryClass = excel.getEntryClass();
Field field = entryClass.getField(vendor);
items.clear();
for (ItemEntry base : excel) {
int[] vendorData = (int[]) field.get(base);
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.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

View File

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

View File

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

View File

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

View File

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