From 95ab92102af1b9cc47750d8a229d6add2a98262e Mon Sep 17 00:00:00 2001 From: pairofdocs Date: Mon, 27 Sep 2021 20:27:25 -0500 Subject: [PATCH] add sharedstash code from m4ke --- gomule/src/gomule/d2s/D2Character.java | 145 +++++++++++++++++++-- gomule/src/gomule/d2s/SharedStashPage.java | 51 ++++++++ gomule/src/gomule/gui/D2ViewChar.java | 54 +++++++- 3 files changed, 238 insertions(+), 12 deletions(-) create mode 100644 gomule/src/gomule/d2s/SharedStashPage.java diff --git a/gomule/src/gomule/d2s/D2Character.java b/gomule/src/gomule/d2s/D2Character.java index a3ca2df..ba40e83 100644 --- a/gomule/src/gomule/d2s/D2Character.java +++ b/gomule/src/gomule/d2s/D2Character.java @@ -66,6 +66,16 @@ public class D2Character extends D2ItemListAdapter public static final int CUBESIZEX = 3; public static final int CUBESIZEY = 4; + // m4ke + public static final int NUM_SHAREDPAGES = 3; + private ArrayList sharedStash; + private SharedStashPage currSharedPage; + private int currSharedPageNum; + private int currStashPage; + private String sharedStashFileName; + private ArrayList currStashItems; + // /m4ke + private D2BitReader iReader; private ArrayList iCharItems; private D2Item iCharCursorItem; @@ -133,10 +143,95 @@ public D2Character(String pFileName) throws Exception{ iMercItems = new ArrayList(); iReader = new D2BitReader(iFileName); readChar(); + + // m4ke + sharedStash = new ArrayList<>(); + currStashItems = new ArrayList<>(); + currStashPage = 0; + if(iHC) sharedStashFileName = "SharedStashHardCoreV2.d2i"; + else sharedStashFileName = "SharedStashSoftCoreV2.d2i"; + sharedStashFileName = pFileName.substring(0, pFileName.lastIndexOf(File.separator)+1) + sharedStashFileName; + readSharedStash(); + // /m4ke + // clear status setModified(false); } + // m4ke + public void setStashPage(int num) { + if(currStashPage==0) { + for(int i=0; i 0) { + // System.err.println("lNextJM: find JM " + lNextJM); + // get numItems and read items + br.set_byte_pos(lNextJM + 2); + numItems2 = br.read(16); + // System.err.println("numItems2: " + numItems2); + + lLastItemEnd = lNextJM + 4; // JM + numItems(2bytes) + SharedStashPage ssp = new SharedStashPage(); + for ( int j = 0 ; j < numItems2 ; j++ ) + { + // System.err.println("lLastItemEnd: " + lLastItemEnd); + lItemStart2 = lLastItemEnd; + + D2Item lItem = new D2Item(sharedStashFileName, br, lItemStart2, 1); + lLastItemEnd = lItemStart2 + lItem.getItemLength(); + ssp.addItem(lItem); + } + sharedStash.add(ssp); + lNextJM = br.findNextFlag("JM", lLastItemEnd); + i++; + } + currSharedPage = sharedStash.get(0); + currSharedPageNum = 0; + } + // /m4ke + private void readChar() throws Exception{ iReader.set_byte_pos(4); long lVersion = iReader.read(32); @@ -1048,7 +1143,11 @@ public boolean unmarkMercGrid(D2Item i) { } public void addCharItem(D2Item pItem){ - iCharItems.add(pItem); + int panel = pItem.get_panel(); + if(pItem.get_panel()!=5 || currStashPage==0) + iCharItems.add(pItem); + else + currSharedPage.addItem(pItem); pItem.setCharLvl((int)iCharLevel); setModified(true); } @@ -1066,7 +1165,10 @@ public void addMercItem(D2Item pItem){ } public void removeCharItem(int i){ - iCharItems.remove(i); + if(i >= iCharItems.size()) + currSharedPage.removeItemAt(i - iCharItems.size()); + else + iCharItems.remove(i); setModified(true); } @@ -1291,16 +1393,28 @@ public int getCharItemIndex(int panel, int x, int y){ // iRow, iCol are input } } }else{ - for (int i = 0; i < iCharItems.size(); i++){ - D2Item temp_item = (D2Item) iCharItems.get(i); - if (temp_item.get_panel() == panel) { - int col = temp_item.get_col(); - int row = temp_item.get_row(); - if ((x >= col) && (x <= col + temp_item.get_width() - 1) && (y >= row) && (y <= row + temp_item.get_height() - 1)) { - return i; + // m4ke + if(currStashPage>0 && panel == 5) { + for (int i = 0; i < currSharedPage.getItems().size(); i++){ + //D2Item temp_item = (D2Item) iCharItems.get(i); + D2Item temp_item = (D2Item) currSharedPage.getItemAt(i); + if (temp_item.get_panel() == panel) { + int row = temp_item.get_col(); + int col = temp_item.get_row(); + if (x >= row && x <= row + temp_item.get_width() - 1 && y >= col && y <= col + temp_item.get_height() - 1)return iCharItems.size() + i; + } + } + } else { + for (int i = 0; i < iCharItems.size(); i++){ + D2Item temp_item = (D2Item) iCharItems.get(i); + if (temp_item.get_panel() == panel) { + int row = temp_item.get_col(); + int col = temp_item.get_row(); + if (x >= row && x <= row + temp_item.get_width() - 1 && y >= col && y <= col + temp_item.get_height() - 1)return i; } } } + // /m4ke } return -1; } @@ -1680,7 +1794,18 @@ public int getCharBlock() { public void addItem(D2Item item){equipItem(item);}; public D2Item getCursorItem(){return iCharCursorItem;} - public D2Item getCharItem(int i){return (D2Item) iCharItems.get(i);} + // m4ke + //public D2Item getCharItem(int i){return (D2Item) iCharItems.get(i);} + public D2Item getCharItem(int i) { + D2Item d2i = null; + if(i>=iCharItems.size()) { + d2i = currSharedPage.getItemAt(i - iCharItems.size()); + } else { + d2i = (D2Item) iCharItems.get(i); + } + return d2i; + } + // /m4ke public D2Item getMercItem(int i){return (D2Item) iMercItems.get(i);} public D2Item getCorpseItem(int i){return (D2Item) iCorpseItems.get(i);} public D2Item getGolemItem() {return golemItem;} diff --git a/gomule/src/gomule/d2s/SharedStashPage.java b/gomule/src/gomule/d2s/SharedStashPage.java new file mode 100644 index 0000000..ada9b1b --- /dev/null +++ b/gomule/src/gomule/d2s/SharedStashPage.java @@ -0,0 +1,51 @@ +package gomule.item; + +import java.util.ArrayList; + +public class SharedStashPage { + + private final long MAX_STASHGOLD = 2500000; + + private ArrayList items; + private long gold; + + public SharedStashPage() { + items = new ArrayList<>(); + gold = 0; + } + + public void addItem(D2Item d2i) { + items.add(d2i); + } + + public D2Item getItemAt(int i) { + return items.get(i); + } + + public ArrayList getItems() { + return items; + } + + public D2Item removeItemAt(int i) { + return items.remove(i); + } + + public long getGold(long x) { + long tmp = x; + + if(x>gold) tmp = gold; + gold -= tmp; + + return tmp; + } + + + public long putGold(long x) { + long tmp = x; + + if(gold+x>MAX_STASHGOLD) tmp = (gold+x) - MAX_STASHGOLD; + gold += tmp; + + return tmp; + } +} diff --git a/gomule/src/gomule/gui/D2ViewChar.java b/gomule/src/gomule/gui/D2ViewChar.java index 60da6bb..103bdad 100644 --- a/gomule/src/gomule/gui/D2ViewChar.java +++ b/gomule/src/gomule/gui/D2ViewChar.java @@ -22,14 +22,17 @@ import gomule.d2s.*; import gomule.item.*; + import java.awt.*; import java.awt.event.*; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; + import javax.swing.*; import javax.swing.event.*; + import randall.util.*; /** @@ -1310,6 +1313,17 @@ public void mouseReleased(MouseEvent pEvent) { int lX = pEvent.getX(); int lY = pEvent.getY(); + // m4ke + if(lX>=309 && lX <=340 && lY>=392 && lY <=423) + setStash(0); + else if(lX>=346 && lX <=377 && lY>=392 && lY <=423) + setStash(1); + else if(lX>=383 && lX <=414 && lY>=392 && lY <=423) + setStash(2); + else if(lX>=420 && lX <=451 && lY>=392 && lY <=423) + setStash(3); + // /m4ke + if (((lX >= 16 + 308 && lX <= 45 + 308) || (lX >= 247 + 308 && lX <= 276 + 308)) && (lY >= 24 && lY <= 44)) { setWeaponSlot(1); @@ -1577,6 +1591,13 @@ public void setWeaponSlot(int pWeaponSlot) // repaint(); } + // m4ke + public void setStash(int n) { + iCharacter.setStashPage(n); + build(); + } + // /m4ke + public void build() { Image lEmptyBackground; @@ -1601,9 +1622,38 @@ public void build() if ( iCharacter != null ) { - for (int i = 0; i < iCharacter.getCharItemNr(); i++) + // m4ke + Font font = new Font("Lucida", Font.BOLD, 20); + lGraphics.setFont(font); + lGraphics.setColor(Color.BLACK); + lGraphics.drawString("P", 318, 415); + lGraphics.drawString("S1", 350, 415); + lGraphics.drawString("S2", 386, 415); + lGraphics.drawString("S3", 423, 415); + lGraphics.setColor(Color.WHITE); + lGraphics.drawString("Stash: "+iCharacter.getStashPageNum(), 460, 415); + + ArrayList tempList = new ArrayList<>(); + for(int i=0; i