diff --git a/core/src/com/riiablo/CharacterClass.java b/core/src/com/riiablo/CharacterClass.java index c5f0caeb..4c7348f9 100644 --- a/core/src/com/riiablo/CharacterClass.java +++ b/core/src/com/riiablo/CharacterClass.java @@ -8,38 +8,66 @@ public enum CharacterClass { AMAZON ("am", 0) {{ name = 4011; description = 5128; + spellsBackground = "skltree_a_back"; + spellIcons = "AmSkillicon"; + firstSpell = 6; + lastSpell = 36; }}, SORCERESS ("so", 1) {{ name = 4010; description = 5131; + spellsBackground = "skltree_s_back"; + spellIcons = "SoSkillicon"; + firstSpell = 36; + lastSpell = 66; fws = bws = nu3s = true; blendSpecial = BlendMode.LUMINOSITY; }}, NECROMANCER("ne", 2) {{ name = 4009; description = 5129; + spellsBackground = "skltree_n_back"; + spellIcons = "NeSkillicon"; + firstSpell = 66; + lastSpell = 96; fws = bws = nu3s = true; blendSpecial = BlendMode.LUMINOSITY; }}, PALADIN ("pa", 3) {{ name = 4008; description = 5132; + spellsBackground = "skltree_p_back"; + spellIcons = "PaSkillicon"; + firstSpell = 96; + lastSpell = 126; fws = true; blendSpecial = BlendMode.ID; }}, BARBARIAN ("ba", 4) {{ name = 4007; description = 5130; + spellsBackground = "skltree_b_back"; + spellIcons = "BaSkillicon"; + firstSpell = 126; + lastSpell = 156; fws = true; blendSpecial = BlendMode.ID; }}, DRUID ("dz", 5) {{ name = 4012; description = 22518; + spellsBackground = "skltree_d_back"; + spellIcons = "DrSkillicon"; + firstSpell = 221; + lastSpell = 251; }}, ASSASSIN ("as", 6) {{ name = 4013; description = 22519; + spellsBackground = "skltree_i_back"; + spellIcons = "AsSkillicon"; + firstSpell = 251; + lastSpell = 281; }}, ; @@ -48,6 +76,9 @@ public enum CharacterClass { public int name, description; public boolean nu3s = false, fws = false, bws = false; public int blendSpecial = BlendMode.NONE; + public String spellsBackground; + public String spellIcons; + public int firstSpell, lastSpell; CharacterClass(String shortName, int id) { this.shortName = shortName; diff --git a/core/src/com/riiablo/Files.java b/core/src/com/riiablo/Files.java index 2b9422e7..d28ca1c4 100644 --- a/core/src/com/riiablo/Files.java +++ b/core/src/com/riiablo/Files.java @@ -36,6 +36,8 @@ import com.riiablo.codec.excel.RarePrefix; import com.riiablo.codec.excel.RareSuffix; import com.riiablo.codec.excel.Runes; import com.riiablo.codec.excel.SetItems; +import com.riiablo.codec.excel.SkillDesc; +import com.riiablo.codec.excel.Skills; import com.riiablo.codec.excel.Sounds; import com.riiablo.codec.excel.Speech; import com.riiablo.codec.excel.UniqueItems; @@ -75,6 +77,8 @@ public class Files { public final RareSuffix RareSuffix; public final Runes Runes; public final SetItems SetItems; + public final Skills skills; + public final SkillDesc skilldesc; public final Sounds Sounds; public final UniqueItems UniqueItems; //public final UniquePrefix UniquePrefix; @@ -115,6 +119,8 @@ public class Files { PlrType = load(assets, PlrType.class); QualityItems = load(assets, QualityItems.class); SetItems = load(assets, SetItems.class, Excel.EXPANSION); + skills = load(assets, Skills.class); + skilldesc = load(assets, SkillDesc.class); Sounds = load(assets, Sounds.class); UniqueItems = load(assets, UniqueItems.class, Excel.EXPANSION); //UniquePrefix = load(assets, UniquePrefix.class); diff --git a/core/src/com/riiablo/codec/excel/SkillDesc.java b/core/src/com/riiablo/codec/excel/SkillDesc.java new file mode 100644 index 00000000..14076c1f --- /dev/null +++ b/core/src/com/riiablo/codec/excel/SkillDesc.java @@ -0,0 +1,133 @@ +package com.riiablo.codec.excel; + +public class SkillDesc extends Excel { + public static class Entry extends Excel.Entry { + @Override + public String toString() { + return skilldesc; + } + + @Key + @Column + public String skilldesc; + @Column public int SkillPage; + @Column public int SkillRow; + @Column public int SkillColumn; + @Column public int ListRow; + @Column public int ListPool; + @Column public int IconCel; + @Column(format = "str name") + public String str_name; + @Column(format = "str short") + public String str_short; + @Column(format = "str long") + public String str_long; + @Column(format = "str alt") + public String str_alt; + @Column(format = "str mana") + public String str_mana; + @Column public String descdam; + @Column(format = "ddam calc1") + public String ddam_calc1; + @Column(format = "ddam calc2") + public String ddam_calc2; + @Column public String p1dmelem; + @Column public String p1dmmin; + @Column public String p1dmmax; + @Column public String p2dmelem; + @Column public String p2dmmin; + @Column public String p2dmmax; + @Column public String p3dmelem; + @Column public String p3dmmin; + @Column public String p3dmmax; + @Column public String descatt; + @Column public String descmissile1; + @Column public String descmissile2; + @Column public String descmissile3; + @Column public String descline1; + @Column public String desctexta1; + @Column public String desctextb1; + @Column public String desccalca1; + @Column public String desccalcb1; + @Column public String descline2; + @Column public String desctexta2; + @Column public String desctextb2; + @Column public String desccalca2; + @Column public String desccalcb2; + @Column public String descline3; + @Column public String desctexta3; + @Column public String desctextb3; + @Column public String desccalca3; + @Column public String desccalcb3; + @Column public String descline4; + @Column public String desctexta4; + @Column public String desctextb4; + @Column public String desccalca4; + @Column public String desccalcb4; + @Column public String descline5; + @Column public String desctexta5; + @Column public String desctextb5; + @Column public String desccalca5; + @Column public String desccalcb5; + @Column public String descline6; + @Column public String desctexta6; + @Column public String desctextb6; + @Column public String desccalca6; + @Column public String desccalcb6; + @Column public String dsc2line1; + @Column public String dsc2texta1; + @Column public String dsc2textb1; + @Column public String dsc2calca1; + @Column public String dsc2calcb1; + @Column public String dsc2line2; + @Column public String dsc2texta2; + @Column public String dsc2textb2; + @Column public String dsc2calca2; + @Column public String dsc2calcb2; + @Column public String dsc2line3; + @Column public String dsc2texta3; + @Column public String dsc2textb3; + @Column public String dsc2calca3; + @Column public String dsc2calcb3; + @Column public String dsc2line4; + @Column public String dsc2texta4; + @Column public String dsc2textb4; + @Column public String dsc2calca4; + @Column public String dsc2calcb4; + @Column public String dsc3line1; + @Column public String dsc3texta1; + @Column public String dsc3textb1; + @Column public String dsc3calca1; + @Column public String dsc3calcb1; + @Column public String dsc3line2; + @Column public String dsc3texta2; + @Column public String dsc3textb2; + @Column public String dsc3calca2; + @Column public String dsc3calcb2; + @Column public String dsc3line3; + @Column public String dsc3texta3; + @Column public String dsc3textb3; + @Column public String dsc3calca3; + @Column public String dsc3calcb3; + @Column public String dsc3line4; + @Column public String dsc3texta4; + @Column public String dsc3textb4; + @Column public String dsc3calca4; + @Column public String dsc3calcb4; + @Column public String dsc3line5; + @Column public String dsc3texta5; + @Column public String dsc3textb5; + @Column public String dsc3calca5; + @Column public String dsc3calcb5; + @Column public String dsc3line6; + @Column public String dsc3texta6; + @Column public String dsc3textb6; + @Column public String dsc3calca6; + @Column public String dsc3calcb6; + @Column public String dsc3line7; + @Column public String dsc3texta7; + @Column public String dsc3textb7; + @Column public String dsc3calca7; + @Column public String dsc3calcb7; + } +} diff --git a/core/src/com/riiablo/codec/excel/Skills.java b/core/src/com/riiablo/codec/excel/Skills.java new file mode 100644 index 00000000..6d527d1b --- /dev/null +++ b/core/src/com/riiablo/codec/excel/Skills.java @@ -0,0 +1,24 @@ +package com.riiablo.codec.excel; + +public class Skills extends Excel { + public static class Entry extends Excel.Entry { + @Override + public String toString() { + return skill; + } + + @Key + @Column + public int Id; + @Column public String skill; + @Column public String charclass; + @Column public String skilldesc; + @Column public String stsound; + @Column public String castoverlay; + @Column public String anim; + @Column public String seqtrans; + @Column public String monanim; + @Column public int seqnum; + @Column public int seqinput; + } +} diff --git a/core/src/com/riiablo/entity/Player.java b/core/src/com/riiablo/entity/Player.java index 1c4c743c..a8e7b40c 100644 --- a/core/src/com/riiablo/entity/Player.java +++ b/core/src/com/riiablo/entity/Player.java @@ -86,6 +86,7 @@ public class Player extends Entity { boolean alternate; boolean ignoreUpdate; public Stats stats; + public final CharacterClass charClass; Array inventory = new Array<>(); @@ -115,6 +116,7 @@ public class Player extends Entity { Player(String name, int classId) { super(Type.PLR, "player", TOKENS[classId]); + charClass = CharacterClass.get(classId); setMode(MODE_TN); setWalkSpeed(6); setRunSpeed(9); diff --git a/core/src/com/riiablo/panel/ControlPanel.java b/core/src/com/riiablo/panel/ControlPanel.java index 00a6a4c2..212d900c 100644 --- a/core/src/com/riiablo/panel/ControlPanel.java +++ b/core/src/com/riiablo/panel/ControlPanel.java @@ -228,7 +228,7 @@ public class ControlPanel extends WidgetGroup implements Disposable { } else if (actor == btnInventory) { gameScreen.inventoryPanel.setVisible(!gameScreen.inventoryPanel.isVisible()); } else if (actor == btnSkillTree) { - + gameScreen.spellsPanel.setVisible(!gameScreen.spellsPanel.isVisible()); } else if (actor == btnParty) { } else if (actor == btnMap) { diff --git a/core/src/com/riiablo/panel/MobilePanel.java b/core/src/com/riiablo/panel/MobilePanel.java index 0acd73f2..306b6024 100644 --- a/core/src/com/riiablo/panel/MobilePanel.java +++ b/core/src/com/riiablo/panel/MobilePanel.java @@ -42,7 +42,7 @@ public class MobilePanel extends Table implements Disposable { } else if (actor == btnInventory) { gameScreen.inventoryPanel.setVisible(!gameScreen.inventoryPanel.isVisible()); } else if (actor == btnSkillTree) { - + gameScreen.spellsPanel.setVisible(!gameScreen.spellsPanel.isVisible()); } else if (actor == btnParty) { } else if (actor == btnMap) { diff --git a/core/src/com/riiablo/panel/SpellsPanel.java b/core/src/com/riiablo/panel/SpellsPanel.java new file mode 100644 index 00000000..413d7f51 --- /dev/null +++ b/core/src/com/riiablo/panel/SpellsPanel.java @@ -0,0 +1,123 @@ +package com.riiablo.panel; + +import com.badlogic.gdx.assets.AssetDescriptor; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.Touchable; +import com.badlogic.gdx.scenes.scene2d.ui.WidgetGroup; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; +import com.badlogic.gdx.utils.Disposable; +import com.riiablo.CharacterClass; +import com.riiablo.Riiablo; +import com.riiablo.codec.DC6; +import com.riiablo.codec.excel.SkillDesc; +import com.riiablo.codec.excel.Skills; +import com.riiablo.loader.DC6Loader; +import com.riiablo.screen.GameScreen; +import com.riiablo.widget.Button; + +public class SpellsPanel extends WidgetGroup implements Disposable { + private static final String TAG = "SpellsPanel"; + private static final String SPELLS_PATH = "data\\global\\ui\\SPELLS\\"; + + final AssetDescriptor skltreeDescriptor; + TextureRegion skltree; + TextureRegion skltreeTabs[]; + + final AssetDescriptor SkilliconDescriptor; + DC6 Skillicon; + + final GameScreen gameScreen; + + public SpellsPanel(final GameScreen gameScreen) { + this.gameScreen = gameScreen; + + CharacterClass charClass = gameScreen.player.charClass; + skltreeDescriptor = new AssetDescriptor<>(SPELLS_PATH + charClass.spellsBackground + ".dc6", DC6.class, DC6Loader.DC6Parameters.COMBINE); + Riiablo.assets.load(skltreeDescriptor); + Riiablo.assets.finishLoadingAsset(skltreeDescriptor); + skltree = Riiablo.assets.get(skltreeDescriptor).getTexture(0); + setSize(skltree.getRegionWidth(), skltree.getRegionHeight()); + setTouchable(Touchable.enabled); + setVisible(false); + + SkilliconDescriptor = new AssetDescriptor<>(SPELLS_PATH + charClass.spellIcons + ".dc6", DC6.class, DC6Loader.DC6Parameters.COMBINE); + Riiablo.assets.load(SkilliconDescriptor); + Riiablo.assets.finishLoadingAsset(SkilliconDescriptor); + Skillicon = Riiablo.assets.get(SkilliconDescriptor); + + final Tab[] tabs = new Tab[4]; + for (int i = 1; i < tabs.length; i++) { + Tab tab = tabs[i] = new Tab(Riiablo.assets.get(skltreeDescriptor).getTexture(i)); + tab.setSize(getWidth(), getHeight()); + tab.setPosition(0, 0); + tab.setVisible(false); + addActor(tab); + } + + float x = getWidth() - 90, y = 0; + Actor[] actors = new Actor[3]; + for (int i = 0; i < actors.length; i++) { + final Actor actor = actors[i] = new Actor(); + actor.setPosition(x, y); + actor.setSize(90, getHeight() / 4); + actor.setUserObject(tabs[i + 1]); + actor.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + for (Tab tab : tabs) if (tab != null) tab.setVisible(false); + Tab tab = (Tab) actor.getUserObject(); + tab.setVisible(true); + } + }); + addActor(actor); + y += actor.getHeight(); + } + + float[] X = { 0, 15, 84, 153 }; + float[] Y = { 0, 370, 302, 234, 166, 98, 30 }; + for (int i = charClass.firstSpell; i < charClass.lastSpell; i++) { + Skills.Entry skill = Riiablo.files.skills.get(i); + SkillDesc.Entry desc = Riiablo.files.skilldesc.get(skill.skilldesc); + Button button = new Button(new Button.ButtonStyle( + new TextureRegionDrawable(Skillicon.getTexture(desc.IconCel)), + new TextureRegionDrawable(Skillicon.getTexture(desc.IconCel + 1)))); + button.setPosition(X[desc.SkillColumn], Y[desc.SkillRow]); + button.setSize(48, 48); + + Tab tab = tabs[desc.SkillPage]; + tab.addActor(button); + } + + setDebug(true, true); + } + + @Override + public void draw(Batch batch, float parentAlpha) { + batch.draw(skltree, getX(), getY()); + super.draw(batch, parentAlpha); + } + + @Override + public void dispose() { + Riiablo.assets.unload(skltreeDescriptor.fileName); + Riiablo.assets.unload(SkilliconDescriptor.fileName); + } + + private static class Tab extends WidgetGroup { + TextureRegion background; + + public Tab(TextureRegion background) { + this.background = background; + } + + @Override + public void draw(Batch batch, float parentAlpha) { + batch.draw(background, getX(), getY()); + super.draw(batch, parentAlpha); + } + } +} diff --git a/core/src/com/riiablo/screen/GameScreen.java b/core/src/com/riiablo/screen/GameScreen.java index 67b96f55..a0fbcd38 100644 --- a/core/src/com/riiablo/screen/GameScreen.java +++ b/core/src/com/riiablo/screen/GameScreen.java @@ -53,6 +53,7 @@ import com.riiablo.panel.ControlPanel; import com.riiablo.panel.EscapePanel; import com.riiablo.panel.InventoryPanel; import com.riiablo.panel.MobilePanel; +import com.riiablo.panel.SpellsPanel; import com.riiablo.panel.StashPanel; import com.riiablo.server.Connect; import com.riiablo.server.ConnectResponse; @@ -95,6 +96,7 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable MobilePanel mobilePanel; public InventoryPanel inventoryPanel; public CharacterPanel characterPanel; + public SpellsPanel spellsPanel; public StashPanel stashPanel; MappedKeyStateAdapter mappedKeyStateListener; @@ -210,6 +212,11 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable stage.getWidth() - inventoryPanel.getWidth(), stage.getHeight() - inventoryPanel.getHeight()); + spellsPanel = new SpellsPanel(this); + spellsPanel.setPosition( + stage.getWidth() - spellsPanel.getWidth(), + stage.getHeight() - spellsPanel.getHeight()); + characterPanel = new CharacterPanel(this); characterPanel.setPosition( 0, @@ -227,6 +234,7 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable stage.addActor(controlPanel); stage.addActor(escapePanel); stage.addActor(inventoryPanel); + stage.addActor(spellsPanel); stage.addActor(characterPanel); stage.addActor(stashPanel); controlPanel.toFront(); @@ -263,8 +271,10 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable } else if (input.isVisible()) { input.setVisible(false); } else if (inventoryPanel.isVisible() + || spellsPanel.isVisible() || characterPanel.isVisible()) { inventoryPanel.setVisible(false); + spellsPanel.setVisible(false); characterPanel.setVisible(false); } else { escapePanel.setVisible(true); @@ -287,6 +297,8 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable } } else if (key == Keys.Inventory) { inventoryPanel.setVisible(!inventoryPanel.isVisible()); + } else if (key == Keys.Spells) { + spellsPanel.setVisible(!spellsPanel.isVisible()); } else if (key == Keys.Character) { stashPanel.setVisible(false); characterPanel.setVisible(!characterPanel.isVisible()); @@ -564,6 +576,7 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable Keys.Esc.addStateListener(mappedKeyStateListener); Keys.Inventory.addStateListener(mappedKeyStateListener); + Keys.Spells.addStateListener(mappedKeyStateListener); Keys.Character.addStateListener(mappedKeyStateListener); Keys.Stash.addStateListener(mappedKeyStateListener); Keys.SwapWeapons.addStateListener(mappedKeyStateListener); @@ -608,6 +621,7 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable Keys.Esc.removeStateListener(mappedKeyStateListener); Keys.Inventory.removeStateListener(mappedKeyStateListener); + Keys.Spells.removeStateListener(mappedKeyStateListener); Keys.Character.removeStateListener(mappedKeyStateListener); Keys.Stash.removeStateListener(mappedKeyStateListener); Keys.SwapWeapons.removeStateListener(mappedKeyStateListener); @@ -624,6 +638,7 @@ public class GameScreen extends ScreenAdapter implements LoadingScreen.Loadable escapePanel.dispose(); controlPanel.dispose(); inventoryPanel.dispose(); + spellsPanel.dispose(); characterPanel.dispose(); if (mobilePanel != null) mobilePanel.dispose(); if (Riiablo.assets.isLoaded(touchpadBackgroundDescriptor)) Riiablo.assets.load(touchpadBackgroundDescriptor);