From 6349dcbad81d905910e17d52f4e5a7971effeb89 Mon Sep 17 00:00:00 2001 From: Grimm Date: Fri, 1 Apr 2022 20:30:54 +0200 Subject: [PATCH] -added items/equipment -added 6 castle -added dialogs -fixed collision on maps -fixed layer rendering --- .../forge/adventure/editor/EnemyEdit.java | 16 + .../forge/adventure/editor/RewardsEditor.java | 2 + .../forge/adventure/editor/SwingAtlas.java | 2 +- .../adventure/editor/SwingAtlasPreview.java | 4 +- .../src/main/java/forge/token/TokenDb.java | 4 + .../adventure/character/CharacterSprite.java | 1 + .../adventure/character/DialogActor.java | 116 ++ .../adventure/character/EnemySprite.java | 2 +- .../forge/adventure/character/EntryActor.java | 6 +- .../forge/adventure/character/MapActor.java | 9 + .../forge/adventure/character/OnCollide.java | 1 + .../adventure/character/PlayerSprite.java | 5 +- .../forge/adventure/character/ShopActor.java | 12 +- .../adventure/character/TextureSprite.java | 2 +- .../src/forge/adventure/data/DialogData.java | 18 + .../forge/adventure/data/DifficultyData.java | 1 + .../src/forge/adventure/data/EnemyData.java | 2 + .../src/forge/adventure/data/ItemData.java | 97 + .../src/forge/adventure/data/RewardData.java | 24 +- .../src/forge/adventure/data/ShopData.java | 1 + .../adventure/player/AdventurePlayer.java | 112 +- .../src/forge/adventure/scene/DuelScene.java | 57 +- .../src/forge/adventure/scene/HudScene.java | 23 +- .../forge/adventure/scene/InventoryScene.java | 306 +++ .../forge/adventure/scene/RewardScene.java | 40 +- .../src/forge/adventure/scene/SceneType.java | 3 +- .../forge/adventure/scene/TileMapScene.java | 9 + .../src/forge/adventure/stage/GameHUD.java | 39 +- .../src/forge/adventure/stage/GameStage.java | 20 +- .../src/forge/adventure/stage/MapStage.java | 81 +- .../stage/PointOfInterestMapRenderer.java | 6 +- .../src/forge/adventure/stage/WorldStage.java | 2 - .../src/forge/adventure/util/CardUtil.java | 11 +- .../src/forge/adventure/util/Controls.java | 1 + .../src/forge/adventure/util/Current.java | 9 + .../forge/adventure/util/DrawOnPixmap.java | 5 +- .../src/forge/adventure/util/Paths.java | 4 + .../src/forge/adventure/util/Reward.java | 10 + .../src/forge/adventure/util/RewardActor.java | 26 +- .../adventure/util/TemplateTmxMapLoader.java | 10 +- .../src/forge/adventure/util/UIActor.java | 16 +- .../src/forge/adventure/world/World.java | 42 +- forge-gui/res/adventure/Shandalar/config.json | 9 +- .../adventure/Shandalar/decks/boss/akroma.dck | 27 + .../Shandalar/decks/boss/emrakul.dck | 22 + .../adventure/Shandalar/decks/boss/ghalta.dck | 15 + .../Shandalar/decks/boss/griselbrand.dck | 29 + .../Shandalar/decks/boss/lathliss.dck | 27 + .../Shandalar/decks/boss/lorthos.dck | 19 + .../Shandalar/decks/boss/sliver_queen.dck | 28 + .../Shandalar/dialogs/black_door.json | 19 + .../Shandalar/dialogs/blue_door.json | 19 + .../Shandalar/dialogs/colorless_door.json | 19 + .../Shandalar/dialogs/green_door.json | 19 + .../adventure/Shandalar/dialogs/red_door.json | 19 + .../Shandalar/dialogs/white_door.json | 19 + .../Shandalar/maps/main.tiled-session | 1697 ++++++++--------- .../Shandalar/maps/map/forest_town.tmx | 49 +- .../Shandalar/maps/map/island_town.tmx | 49 +- .../maps/map/main_story/black_castle.tmx | 50 + .../maps/map/main_story/blue_castle.tmx | 50 + .../maps/map/main_story/colorless_castle.tmx | 55 + .../maps/map/main_story/final_castle.tmx | 100 + .../maps/map/main_story/green_castle.tmx | 50 + .../maps/map/main_story/red_castle.tmx | 50 + .../maps/map/main_story/white_castle.tmx | 50 + .../Shandalar/maps/map/mountain_town.tmx | 49 +- .../Shandalar/maps/map/plains_town.tmx | 43 +- .../Shandalar/maps/map/swamp_town.tmx | 49 +- .../Shandalar/maps/map/waste_town.tmx | 49 +- .../res/adventure/Shandalar/maps/obj/gate.tx | 9 + .../res/adventure/Shandalar/maps/obj/gold.tx | 3 + .../res/adventure/Shandalar/maps/obj/item.tx | 11 + .../Shandalar/maps/tileset/buildings.atlas | 95 +- .../Shandalar/maps/tileset/buildings.png | Bin 199971 -> 236209 bytes .../Shandalar/maps/tileset/buildings.xcf | Bin 771466 -> 762123 bytes .../adventure/Shandalar/maps/tileset/main.png | Bin 323553 -> 339360 bytes .../adventure/Shandalar/maps/tileset/main.tsx | 705 ++++++- .../adventure/Shandalar/maps/tileset/main.xcf | Bin 1685729 -> 1582211 bytes .../Shandalar/skin/MiKrollFantasy(1).fnt | 102 + .../Shandalar/skin/MiKrollFantasy(2).fnt | 102 + .../Shandalar/skin/MiKrollFantasy(3).fnt | 102 + .../Shandalar/skin/MiKrollFantasy.fnt | 102 + .../res/adventure/Shandalar/skin/equip.png | Bin 0 -> 240 bytes .../adventure/Shandalar/skin/ui_skin.atlas | 66 +- .../res/adventure/Shandalar/skin/ui_skin.json | 33 +- .../res/adventure/Shandalar/skin/ui_skin.png | Bin 17309 -> 17752 bytes .../res/adventure/Shandalar/skin/uiskin.png | Bin 0 -> 17752 bytes .../adventure/Shandalar/sprites/1life.atlas | 17 + .../adventure/Shandalar/sprites/2life.atlas | 17 + .../adventure/Shandalar/sprites/3life.atlas | 17 + .../Shandalar/sprites/boss/akroma.atlas | 44 + .../Shandalar/sprites/boss/akroma.png | Bin 0 -> 25211 bytes .../Shandalar/sprites/boss/emrakul.atlas | 44 + .../Shandalar/sprites/boss/emrakul.png | Bin 0 -> 43159 bytes .../Shandalar/sprites/boss/ghalta.atlas | 44 + .../Shandalar/sprites/boss/ghalta.png | Bin 0 -> 24859 bytes .../Shandalar/sprites/boss/griselbrand.atlas | 44 + .../Shandalar/sprites/boss/griselbrand.png | Bin 0 -> 20616 bytes .../Shandalar/sprites/boss/lathiss.atlas | 44 + .../Shandalar/sprites/boss/lathiss.png | Bin 0 -> 24683 bytes .../Shandalar/sprites/boss/lorthos.atlas | 44 + .../Shandalar/sprites/boss/lorthos.png | Bin 0 -> 26891 bytes .../Shandalar/sprites/boss/sliver_queen.atlas | 44 + .../Shandalar/sprites/boss/sliver_queen.png | Bin 0 -> 35976 bytes .../adventure/Shandalar/sprites/items.atlas | 216 ++- .../res/adventure/Shandalar/sprites/items.png | Bin 1313 -> 277193 bytes .../adventure/Shandalar/sprites/treasure.png | Bin 1492 -> 20985 bytes .../res/adventure/Shandalar/ui/equipment.png | Bin 0 -> 1970 bytes forge-gui/res/adventure/Shandalar/ui/hud.json | 19 +- .../adventure/Shandalar/ui/hud_mobile.json | 20 +- .../res/adventure/Shandalar/ui/inventory.json | 115 ++ .../res/adventure/Shandalar/ui/items.json | 13 +- .../adventure/Shandalar/ui/items_mobile.json | 9 + .../res/adventure/Shandalar/world/black.json | 2 +- .../res/adventure/Shandalar/world/blue.json | 2 +- .../adventure/Shandalar/world/enemies.json | 205 +- .../res/adventure/Shandalar/world/green.json | 2 +- .../res/adventure/Shandalar/world/items.json | 482 +++++ .../Shandalar/world/points_of_interest.json | 179 +- .../res/adventure/Shandalar/world/red.json | 2 +- .../res/adventure/Shandalar/world/shops.json | 105 +- .../res/adventure/Shandalar/world/waste.json | 2 +- .../res/adventure/Shandalar/world/white.json | 2 +- .../res/adventure/Shandalar/world/world.json | 4 +- forge-gui/res/editions/Mirage.txt | 2 +- 126 files changed, 5597 insertions(+), 1310 deletions(-) create mode 100644 forge-gui-mobile/src/forge/adventure/character/DialogActor.java create mode 100644 forge-gui-mobile/src/forge/adventure/data/DialogData.java create mode 100644 forge-gui-mobile/src/forge/adventure/data/ItemData.java create mode 100644 forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java create mode 100644 forge-gui/res/adventure/Shandalar/decks/boss/akroma.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/boss/emrakul.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/boss/ghalta.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/boss/griselbrand.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/boss/lathliss.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/boss/lorthos.dck create mode 100644 forge-gui/res/adventure/Shandalar/decks/boss/sliver_queen.dck create mode 100644 forge-gui/res/adventure/Shandalar/dialogs/black_door.json create mode 100644 forge-gui/res/adventure/Shandalar/dialogs/blue_door.json create mode 100644 forge-gui/res/adventure/Shandalar/dialogs/colorless_door.json create mode 100644 forge-gui/res/adventure/Shandalar/dialogs/green_door.json create mode 100644 forge-gui/res/adventure/Shandalar/dialogs/red_door.json create mode 100644 forge-gui/res/adventure/Shandalar/dialogs/white_door.json create mode 100644 forge-gui/res/adventure/Shandalar/maps/map/main_story/black_castle.tmx create mode 100644 forge-gui/res/adventure/Shandalar/maps/map/main_story/blue_castle.tmx create mode 100644 forge-gui/res/adventure/Shandalar/maps/map/main_story/colorless_castle.tmx create mode 100644 forge-gui/res/adventure/Shandalar/maps/map/main_story/final_castle.tmx create mode 100644 forge-gui/res/adventure/Shandalar/maps/map/main_story/green_castle.tmx create mode 100644 forge-gui/res/adventure/Shandalar/maps/map/main_story/red_castle.tmx create mode 100644 forge-gui/res/adventure/Shandalar/maps/map/main_story/white_castle.tmx create mode 100644 forge-gui/res/adventure/Shandalar/maps/obj/gate.tx create mode 100644 forge-gui/res/adventure/Shandalar/maps/obj/item.tx create mode 100644 forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(1).fnt create mode 100644 forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(2).fnt create mode 100644 forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy(3).fnt create mode 100644 forge-gui/res/adventure/Shandalar/skin/MiKrollFantasy.fnt create mode 100644 forge-gui/res/adventure/Shandalar/skin/equip.png create mode 100644 forge-gui/res/adventure/Shandalar/skin/uiskin.png create mode 100644 forge-gui/res/adventure/Shandalar/sprites/1life.atlas create mode 100644 forge-gui/res/adventure/Shandalar/sprites/2life.atlas create mode 100644 forge-gui/res/adventure/Shandalar/sprites/3life.atlas create mode 100644 forge-gui/res/adventure/Shandalar/sprites/boss/akroma.atlas create mode 100644 forge-gui/res/adventure/Shandalar/sprites/boss/akroma.png create mode 100644 forge-gui/res/adventure/Shandalar/sprites/boss/emrakul.atlas create mode 100644 forge-gui/res/adventure/Shandalar/sprites/boss/emrakul.png create mode 100644 forge-gui/res/adventure/Shandalar/sprites/boss/ghalta.atlas create mode 100644 forge-gui/res/adventure/Shandalar/sprites/boss/ghalta.png create mode 100644 forge-gui/res/adventure/Shandalar/sprites/boss/griselbrand.atlas create mode 100644 forge-gui/res/adventure/Shandalar/sprites/boss/griselbrand.png create mode 100644 forge-gui/res/adventure/Shandalar/sprites/boss/lathiss.atlas create mode 100644 forge-gui/res/adventure/Shandalar/sprites/boss/lathiss.png create mode 100644 forge-gui/res/adventure/Shandalar/sprites/boss/lorthos.atlas create mode 100644 forge-gui/res/adventure/Shandalar/sprites/boss/lorthos.png create mode 100644 forge-gui/res/adventure/Shandalar/sprites/boss/sliver_queen.atlas create mode 100644 forge-gui/res/adventure/Shandalar/sprites/boss/sliver_queen.png create mode 100644 forge-gui/res/adventure/Shandalar/ui/equipment.png create mode 100644 forge-gui/res/adventure/Shandalar/ui/inventory.json create mode 100644 forge-gui/res/adventure/Shandalar/world/items.json diff --git a/forge-adventure/src/main/java/forge/adventure/editor/EnemyEdit.java b/forge-adventure/src/main/java/forge/adventure/editor/EnemyEdit.java index e01c685e5a0..8e3511063fc 100644 --- a/forge-adventure/src/main/java/forge/adventure/editor/EnemyEdit.java +++ b/forge-adventure/src/main/java/forge/adventure/editor/EnemyEdit.java @@ -21,6 +21,7 @@ public class EnemyEdit extends JComponent { JSpinner speed= new JSpinner(new SpinnerNumberModel(0.0, 0., 100., 1.0)); FilePicker deck=new FilePicker(new String[]{"dck","json"}); FilePicker atlas=new FilePicker(new String[]{"atlas"}); + JTextField equipment=new JTextField(); RewardsEditor rewards=new RewardsEditor(); SwingAtlasPreview preview=new SwingAtlasPreview(); private boolean updating=false; @@ -38,12 +39,19 @@ public class EnemyEdit extends JComponent { center.add(new JLabel("Speed:")); center.add(speed); center.add(new JLabel("Deck:")); center.add(deck); center.add(new JLabel("Sprite:")); center.add(atlas); + center.add(new JLabel("Equipment:")); center.add(equipment); BorderLayout layout=new BorderLayout(); setLayout(layout); add(center,BorderLayout.PAGE_START); add(rewards,BorderLayout.CENTER); add(preview,BorderLayout.LINE_START); + equipment.getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() { + @Override + public void run() { + EnemyEdit.this.updateEnemy(); + } + })); atlas.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() { @Override public void run() { @@ -107,6 +115,10 @@ public class EnemyEdit extends JComponent { currentData.name=nameField.getText(); currentData.life= (int) lifeFiled.getValue(); currentData.sprite= atlas.getEdit().getText(); + if(equipment.getText().isEmpty()) + currentData.equipment=null; + else + currentData.equipment=equipment.getText().split(","); currentData.speed= ((Double) speed.getValue()).floatValue(); currentData.spawnRate=((Double) spawnRate.getValue()).floatValue(); currentData.difficulty=((Double) difficulty.getValue()).floatValue(); @@ -131,6 +143,10 @@ public class EnemyEdit extends JComponent { nameField.setText(currentData.name); lifeFiled.setValue(currentData.life); atlas.getEdit().setText(currentData.sprite); + if(currentData.equipment!=null) + equipment.setText(String.join(",",currentData.equipment)); + else + equipment.setText(""); deck.getEdit().setText(currentData.deck); speed.setValue(new Float(currentData.speed).doubleValue()); spawnRate.setValue(new Float(currentData.spawnRate).doubleValue()); diff --git a/forge-adventure/src/main/java/forge/adventure/editor/RewardsEditor.java b/forge-adventure/src/main/java/forge/adventure/editor/RewardsEditor.java index bb7985e5594..a2d6cc0f617 100644 --- a/forge-adventure/src/main/java/forge/adventure/editor/RewardsEditor.java +++ b/forge-adventure/src/main/java/forge/adventure/editor/RewardsEditor.java @@ -138,6 +138,8 @@ public class RewardsEditor extends JComponent{ public void setRewards(RewardData[] rewards) { model.clear(); + if(rewards==null) + return; for (int i=0;i(data.getRegions())) diff --git a/forge-adventure/src/main/java/forge/adventure/editor/SwingAtlasPreview.java b/forge-adventure/src/main/java/forge/adventure/editor/SwingAtlasPreview.java index c67f5646601..3631e133a8c 100644 --- a/forge-adventure/src/main/java/forge/adventure/editor/SwingAtlasPreview.java +++ b/forge-adventure/src/main/java/forge/adventure/editor/SwingAtlasPreview.java @@ -32,11 +32,11 @@ public class SwingAtlasPreview extends Box { List>> labels=new ArrayList<>(); public void setSpritePath(String sprite) { + if(this.sprite==null||this.sprite.equals(sprite)) + return; removeAll(); counter=0; labels.clear(); - if(this.sprite.equals(sprite)) - return; this.sprite=sprite; SwingAtlas atlas=new SwingAtlas(Config.instance().getFile(sprite)); for(Map.Entry> element:atlas.getImages().entrySet()) diff --git a/forge-core/src/main/java/forge/token/TokenDb.java b/forge-core/src/main/java/forge/token/TokenDb.java index 4e5876131af..176d720e40c 100644 --- a/forge-core/src/main/java/forge/token/TokenDb.java +++ b/forge-core/src/main/java/forge/token/TokenDb.java @@ -34,6 +34,10 @@ public class TokenDb implements ITokenDatabase { this.editions = editions; } + public boolean containsRule(String rule) { + return this.rulesByName.containsKey(rule); + + } @Override public PaperToken getToken(String tokenName) { return getToken(tokenName, CardEdition.UNKNOWN.getName()); diff --git a/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java b/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java index fe8848c9807..9cce06611f6 100644 --- a/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java +++ b/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java @@ -26,6 +26,7 @@ public class CharacterSprite extends MapActor { private Sprite avatar; public CharacterSprite(String path) { + super(0); collisionHeight=0.4f; load(path); } diff --git a/forge-gui-mobile/src/forge/adventure/character/DialogActor.java b/forge-gui-mobile/src/forge/adventure/character/DialogActor.java new file mode 100644 index 00000000000..ac5987570d3 --- /dev/null +++ b/forge-gui-mobile/src/forge/adventure/character/DialogActor.java @@ -0,0 +1,116 @@ +package forge.adventure.character; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Json; +import forge.adventure.data.DialogData; +import forge.adventure.stage.MapStage; +import forge.adventure.util.Config; +import forge.adventure.util.Controls; +import forge.adventure.util.Current; + +/** + * Map actor that will open the Shop on collision + */ +public class DialogActor extends MapActor{ + private final MapStage stage; + private final String dialogPath; + private final TextureRegion textureRegion; + + + public DialogActor(MapStage stage, int id, String dialog, TextureRegion textureRegion) + { + super(id); + this.stage = stage; + this.dialogPath = dialog; + this.textureRegion = textureRegion; + } + + + @Override + public void onPlayerCollide() + { + Json json = new Json(); + FileHandle handle = Config.instance().getFile(dialogPath); + if (handle.exists()) { + Array data = json.fromJson(Array.class, DialogData.class, handle); + stage.resetPosition(); + stage.showDialog(); + + for(DialogData dialog:data) + { + if(isConditionOk(dialog.condition)) + { + loadDialog(dialog); + } + } + + } + } + + private void loadDialog(DialogData dialog) { + + setEffects(dialog.effect); + stage.getDialog().getContentTable().clear(); + stage.getDialog().getButtonTable().clear(); + stage.getDialog().text((dialog.text)); + if(dialog.options!=null) + { + for(DialogData option:dialog.options) + { + if( isConditionOk(option.condition) ) + { + stage.getDialog().getButtonTable().add(Controls.newTextButton(option.name,() -> { + loadDialog(option); + })); + } + } + stage.showDialog(); + } + else + { + stage.hideDialog(); + } + } + void setEffects(DialogData.EffectData[] data) + { + if(data==null) + return ; + for(DialogData.EffectData effectData:data) + { + Current.player().removeItem(effectData.removeItem); + if(effectData.deleteMapObject<0) + stage.deleteObject(getObjectId()); + else if(effectData.deleteMapObject>0) + stage.deleteObject(effectData.deleteMapObject); + + } + } + + boolean isConditionOk(DialogData.ConditionData[] data) + { + if(data==null) + return true; + for(DialogData.ConditionData condition:data) + { + if(condition.item!=null && !condition.item.equals("")) + { + if(!Current.player().hasItem(condition.item)) + { + return false; + } + } + } + return true; + } + + @Override + public void draw(Batch batch, float alpha) { + + batch.draw(textureRegion,getX(),getY(),getWidth(),getHeight()); + super.draw(batch,alpha); + } + +} diff --git a/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java b/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java index a27c074d9f6..87005bb98b7 100644 --- a/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java +++ b/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java @@ -46,7 +46,7 @@ public class EnemySprite extends CharacterSprite { return ret; for(RewardData rdata:data.rewards) { - ret.addAll(rdata.generate(false,Current.latestDeck()!=null? Current.latestDeck().getMain().toFlatList():null)); + ret.addAll(rdata.generate(false,Current.latestDeck()!=null? Current.latestDeck().getMain().toFlatList():null,data.equipment)); } return ret; } diff --git a/forge-gui-mobile/src/forge/adventure/character/EntryActor.java b/forge-gui-mobile/src/forge/adventure/character/EntryActor.java index 8ae5574f6b7..192888fa17c 100644 --- a/forge-gui-mobile/src/forge/adventure/character/EntryActor.java +++ b/forge-gui-mobile/src/forge/adventure/character/EntryActor.java @@ -10,13 +10,12 @@ import forge.adventure.stage.MapStage; */ public class EntryActor extends MapActor{ private final MapStage stage; - private final int id; String targetMap; public EntryActor(MapStage stage,String sourceMap, int id,String targetMap,float x,float y,float w,float h,String direction) { + super(id); this.stage = stage; - this.id = id; this.targetMap = targetMap; @@ -61,8 +60,5 @@ public class EntryActor extends MapActor{ } } - public int getObjectID() { - return id; - } } diff --git a/forge-gui-mobile/src/forge/adventure/character/MapActor.java b/forge-gui-mobile/src/forge/adventure/character/MapActor.java index 5625cd337b9..0e5c582858b 100644 --- a/forge-gui-mobile/src/forge/adventure/character/MapActor.java +++ b/forge-gui-mobile/src/forge/adventure/character/MapActor.java @@ -15,6 +15,15 @@ public class MapActor extends Actor { Texture debugTexture; float collisionHeight=1.0f; + final int objectId; + public MapActor(int objectId) + { + this.objectId=objectId; + } + public int getObjectId() + { + return objectId; + } private Texture getDebugTexture() { if (debugTexture == null) { Pixmap pixmap = new Pixmap((int) getWidth(), (int) getHeight(), Pixmap.Format.RGBA8888); diff --git a/forge-gui-mobile/src/forge/adventure/character/OnCollide.java b/forge-gui-mobile/src/forge/adventure/character/OnCollide.java index bed104c8e13..f74f60ccda0 100644 --- a/forge-gui-mobile/src/forge/adventure/character/OnCollide.java +++ b/forge-gui-mobile/src/forge/adventure/character/OnCollide.java @@ -7,6 +7,7 @@ public class OnCollide extends MapActor { Runnable onCollide; public OnCollide(Runnable func) { + super(0); onCollide = func; } diff --git a/forge-gui-mobile/src/forge/adventure/character/PlayerSprite.java b/forge-gui-mobile/src/forge/adventure/character/PlayerSprite.java index 9c01c767251..7431fbaf1f4 100644 --- a/forge-gui-mobile/src/forge/adventure/character/PlayerSprite.java +++ b/forge-gui-mobile/src/forge/adventure/character/PlayerSprite.java @@ -13,6 +13,7 @@ public class PlayerSprite extends CharacterSprite { private final float playerSpeed; private final Vector2 direction = Vector2.Zero.cpy(); private float playerSpeedModifier = 1f; + private float playerSpeedEquipmentModifier = 1f; GameStage gameStage; public PlayerSprite(GameStage gameStage) { super(AdventurePlayer.current().spriteName()); @@ -25,6 +26,7 @@ public class PlayerSprite extends CharacterSprite { } }); playerSpeed=Config.instance().getConfigData().playerBaseSpeed; + Current.player().onEquipmentChanged(() -> playerSpeedEquipmentModifier=Current.player().equipmentSpeed()); } private void updatePlayer() { @@ -55,11 +57,10 @@ public class PlayerSprite extends CharacterSprite { @Override public void act(float delta) { super.act(delta); - direction.setLength(playerSpeed * delta * playerSpeedModifier); + direction.setLength(playerSpeed * delta * playerSpeedModifier*playerSpeedEquipmentModifier); if(!direction.isZero()) { - gameStage.prepareCollision(pos(),direction,boundingRect); direction.set(gameStage.adjustMovement(direction,boundingRect)); moveBy(direction.x, direction.y); diff --git a/forge-gui-mobile/src/forge/adventure/character/ShopActor.java b/forge-gui-mobile/src/forge/adventure/character/ShopActor.java index cb0d5793123..d46b175406b 100644 --- a/forge-gui-mobile/src/forge/adventure/character/ShopActor.java +++ b/forge-gui-mobile/src/forge/adventure/character/ShopActor.java @@ -12,14 +12,15 @@ import forge.adventure.util.Reward; */ public class ShopActor extends MapActor{ private final MapStage stage; - private final int id; + private final boolean unlimited; Array rewardData; - public ShopActor(MapStage stage, int id, Array rewardData) + public ShopActor(MapStage stage, int id, Array rewardData, boolean unlimited) { + super(id); this.stage = stage; - this.id = id; this.rewardData = rewardData; + this.unlimited = unlimited; } @@ -37,7 +38,8 @@ public class ShopActor extends MapActor{ Forge.switchScene(SceneType.RewardScene.instance); } - public int getObjectID() { - return id; + + public boolean isUnlimited() { + return unlimited; } } diff --git a/forge-gui-mobile/src/forge/adventure/character/TextureSprite.java b/forge-gui-mobile/src/forge/adventure/character/TextureSprite.java index b64de572025..4ccb3ec7384 100644 --- a/forge-gui-mobile/src/forge/adventure/character/TextureSprite.java +++ b/forge-gui-mobile/src/forge/adventure/character/TextureSprite.java @@ -12,7 +12,7 @@ public class TextureSprite extends MapActor{ public TextureSprite(TextureRegion region) { - + super(0); this.region = region; setWidth(region.getRegionWidth()); setHeight(region.getRegionHeight()); diff --git a/forge-gui-mobile/src/forge/adventure/data/DialogData.java b/forge-gui-mobile/src/forge/adventure/data/DialogData.java new file mode 100644 index 00000000000..653e1bb88ce --- /dev/null +++ b/forge-gui-mobile/src/forge/adventure/data/DialogData.java @@ -0,0 +1,18 @@ +package forge.adventure.data; + +public class DialogData { + public EffectData[] effect; + public ConditionData[] condition; + public String name; + public String text; + public DialogData[] options; + + static public class EffectData { + public String removeItem; + public int deleteMapObject; + } + + static public class ConditionData { + public String item; + } +} diff --git a/forge-gui-mobile/src/forge/adventure/data/DifficultyData.java b/forge-gui-mobile/src/forge/adventure/data/DifficultyData.java index e7a354f9680..03e8534cc48 100644 --- a/forge-gui-mobile/src/forge/adventure/data/DifficultyData.java +++ b/forge-gui-mobile/src/forge/adventure/data/DifficultyData.java @@ -12,5 +12,6 @@ public class DifficultyData { public float enemyLifeFactor=1; public boolean startingDifficulty; public float sellFactor=0.2f; + public String[] startItems=new String[0]; } diff --git a/forge-gui-mobile/src/forge/adventure/data/EnemyData.java b/forge-gui-mobile/src/forge/adventure/data/EnemyData.java index c8d486e6d16..1d86cabb4ab 100644 --- a/forge-gui-mobile/src/forge/adventure/data/EnemyData.java +++ b/forge-gui-mobile/src/forge/adventure/data/EnemyData.java @@ -17,6 +17,7 @@ public class EnemyData { public float speed; public int life; public RewardData[] rewards; + public String[] equipment; public EnemyData() { @@ -30,6 +31,7 @@ public class EnemyData { difficulty =enemyData.difficulty ; speed =enemyData.speed; life =enemyData.life; + equipment =enemyData.equipment; if(enemyData.rewards==null) { rewards=null; diff --git a/forge-gui-mobile/src/forge/adventure/data/ItemData.java b/forge-gui-mobile/src/forge/adventure/data/ItemData.java new file mode 100644 index 00000000000..d85405da6a3 --- /dev/null +++ b/forge-gui-mobile/src/forge/adventure/data/ItemData.java @@ -0,0 +1,97 @@ +package forge.adventure.data; + +import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.g2d.Sprite; +import com.badlogic.gdx.graphics.g2d.TextureAtlas; +import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.utils.Json; +import forge.adventure.util.Config; +import forge.adventure.util.Paths; +import forge.item.IPaperCard; +import forge.model.FModel; + +import static forge.adventure.util.Paths.ITEMS_ATLAS; + +/** + * Data class that will be used to read Json configuration files + * ItemData + * contains the information possible hero sprite + */ +public class ItemData { + public String name; + public String equipmentSlot; + public int lifeModifier=0; + public int changeStartCards=0; + public String[] startBattleWithCard; + public String iconName; + public float moveSpeed=1.0f; + public boolean questItem=false; + public int cost=1000; + //not an item on it owns but effects will be applied to the opponent + public ItemData opponent; + + + public Sprite sprite() + { + if(itemAtlas==null) + { + itemAtlas=Config.instance().getAtlas(ITEMS_ATLAS); + } + return itemAtlas.createSprite(iconName); + } + + private static TextureAtlas itemAtlas; + private static Array itemList; + public static Array getAllItems() { + if (itemList == null) { + Json json = new Json(); + FileHandle handle = Config.instance().getFile(Paths.ITEMS); + if (handle.exists()) { + Array readJson = json.fromJson(Array.class, ItemData.class, handle); + itemList = readJson; + + } + + } + return itemList; + } + public static ItemData getItem(String name) { + for(ItemData data: new Array.ArrayIterator<>(getAllItems())) + { + if(data.name.equals(name)) + return data; + } + return null; + } + + public Array startBattleWithCards() { + + Array startCards=new Array<>(); + if(startBattleWithCard!=null) + { + for (String name:startBattleWithCard) + { + if(FModel.getMagicDb().getCommonCards().contains(name)) + startCards.add(FModel.getMagicDb().getCommonCards().getCard(name)); + else if (FModel.getMagicDb().getAllTokens().containsRule(name)) + startCards.add(FModel.getMagicDb().getAllTokens().getToken(name)); + else + { + System.err.print("Can not find card "+name+"\n"); + } + } + } + return startCards; + } + public String cardNames() { + String ret=""; + Array array=startBattleWithCards(); + for(int i =0;i allEnemyCards; public Array generate(boolean isForEnemy) { - return generate(isForEnemy,null); + return generate(isForEnemy,null,null); } - public Array generate(boolean isForEnemy,Iterable cards) + public Array generate(boolean isForEnemy,Iterable cards,String[] enemyItems) { if(allCards==null) { @@ -119,6 +119,26 @@ public class RewardData { } } break; + case "item": + if(itemName!=null&&!itemName.isEmpty()) + { + for(int i=0;i rewards; diff --git a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java index 96a126711a4..cfdebc7b56d 100644 --- a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java +++ b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java @@ -2,15 +2,12 @@ package forge.adventure.player; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.utils.Array; import com.google.common.collect.Lists; import forge.adventure.data.DifficultyData; import forge.adventure.data.HeroListData; -import forge.adventure.util.CardUtil; -import forge.adventure.util.Config; -import forge.adventure.util.Reward; -import forge.adventure.util.SaveFileContent; -import forge.adventure.util.SaveFileData; -import forge.adventure.util.SignalList; +import forge.adventure.data.ItemData; +import forge.adventure.util.*; import forge.adventure.world.WorldSave; import forge.deck.CardPool; import forge.deck.Deck; @@ -20,6 +17,10 @@ import forge.item.PaperCard; import forge.util.ItemPool; import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; /** * Class that represents the player (not the player sprite) @@ -41,6 +42,8 @@ public class AdventurePlayer implements Serializable, SaveFileContent { private Deck[] decks=new Deck[NUMBER_OF_DECKS]; private final DifficultyData difficultyData=new DifficultyData(); + private final Array inventoryItems=new Array<>(); + private final HashMap equippedItems=new HashMap<>(); public AdventurePlayer() { @@ -61,7 +64,8 @@ public class AdventurePlayer implements Serializable, SaveFileContent { private final ItemPool newCards=new ItemPool<>(InventoryItem.class); public void create(String n, Deck startingDeck, boolean male, int race, int avatar,DifficultyData difficultyData) { - + inventoryItems.clear(); + equippedItems.clear(); deck = startingDeck; decks[0]=deck; gold =difficultyData.staringMoney; @@ -83,6 +87,8 @@ public class AdventurePlayer implements Serializable, SaveFileContent { newCards.clear(); onGoldChangeList.emit(); onLifeTotalChangeList.emit(); + + inventoryItems.addAll(difficultyData.startItems); } public void setSelectedDeckSlot(int slot) { @@ -98,6 +104,9 @@ public class AdventurePlayer implements Serializable, SaveFileContent { public Deck getSelectedDeck() { return deck; } + public Array getItems() { + return inventoryItems; + } public Deck getDeck(int index) { return decks[index]; } @@ -154,6 +163,24 @@ public class AdventurePlayer implements Serializable, SaveFileContent { life = data.readInt("life"); maxLife = data.readInt("maxLife"); + inventoryItems.clear(); + equippedItems.clear(); + if(data.containsKey("inventory")) + { + String[] inv=(String[])data.readObject("inventory"); + inventoryItems.addAll(inv); + } + if(data.containsKey("equippedSlots")&&data.containsKey("equippedItems")) + { + String[] slots=(String[])data.readObject("equippedSlots"); + String[] items=(String[])data.readObject("equippedItems"); + + assert(slots.length==items.length); + for(int i=0;i slots=new ArrayList<>(); + ArrayList items=new ArrayList<>(); + for (Map.Entry entry : equippedItems.entrySet()) { + slots.add(entry.getKey()); + items.add(entry.getValue()); + } + data.storeObject("equippedSlots",slots.toArray(new String[0])); + data.storeObject("equippedItems",items.toArray(new String[0])); + data.storeObject("deckCards",deck.getMain().toCardList("\n").split("\n")); if(deck.get(DeckSection.Sideboard)!=null) @@ -253,6 +292,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { addGold(reward.getCount()); break; case Item: + inventoryItems.add(reward.getItem().name); break; case Life: addMaxLife(reward.getCount()); @@ -264,6 +304,7 @@ public class AdventurePlayer implements Serializable, SaveFileContent { SignalList onLifeTotalChangeList=new SignalList(); SignalList onGoldChangeList=new SignalList(); SignalList onPlayerChangeList=new SignalList(); + SignalList onEquipmentChange=new SignalList(); private void addGold(int goldCount) { gold+=goldCount; @@ -283,6 +324,11 @@ public class AdventurePlayer implements Serializable, SaveFileContent { o.run(); } + public void onEquipmentChanged(Runnable o) { + onEquipmentChange.add(o); + o.run(); + } + public void onGoldChange(Runnable o) { onGoldChangeList.add(o); o.run(); @@ -340,4 +386,56 @@ public class AdventurePlayer implements Serializable, SaveFileContent { cards.remove(card, result); addGold((int) price); } + + public void removeItem(String name) { + if(name==null||name.equals(""))return; + inventoryItems.removeValue(name,false); + if(equippedItems.values().contains(name)&&!inventoryItems.contains(name,false)) + { + equippedItems.values().remove(name); + } + } + + public void equip(ItemData item) { + if(equippedItems.get(item.equipmentSlot)!=null&&equippedItems.get(item.equipmentSlot).equals(item.name)) + { + equippedItems.remove(item.equipmentSlot); + } + else + { + equippedItems.put(item.equipmentSlot,item.name); + } + onEquipmentChange.emit(); + } + + public String itemInSlot(String key) { + return equippedItems.get(key); + } + + public Collection getEquippedItems() { + return equippedItems.values(); + } + + public float equipmentSpeed() { + float factor=1.0f; + for(String name:equippedItems.values()) + { + ItemData data=ItemData.getItem(name); + if(data.moveSpeed!=0.0) + { + factor*=data.moveSpeed; + } + } + return factor; + } + + public boolean hasItem(String name) { + return inventoryItems.contains(name, false); + } + + public void addItem(String name) { + ItemData item=ItemData.getItem(name); + if(item!=null) + inventoryItems.add(name); + } } diff --git a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java index ffe54b32f7a..107c0eb35e1 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java @@ -1,10 +1,12 @@ package forge.adventure.scene; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.utils.Array; import forge.Forge; import forge.LobbyPlayer; import forge.adventure.character.EnemySprite; import forge.adventure.character.PlayerSprite; +import forge.adventure.data.ItemData; import forge.adventure.player.AdventurePlayer; import forge.adventure.util.Config; import forge.adventure.util.Current; @@ -16,6 +18,7 @@ import forge.game.player.Player; import forge.game.player.RegisteredPlayer; import forge.gamemodes.match.HostedMatch; import forge.gui.interfaces.IGuiGame; +import forge.item.IPaperCard; import forge.player.GamePlayerUtil; import forge.player.PlayerControllerHuman; import forge.screens.FScreen; @@ -24,12 +27,7 @@ import forge.sound.MusicPlaylist; import forge.sound.SoundSystem; import forge.trackable.TrackableCollection; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * DuelScene @@ -42,6 +40,7 @@ public class DuelScene extends ForgeScene { EnemySprite enemy; PlayerSprite player; RegisteredPlayer humanPlayer; + public DuelScene() { } @@ -69,6 +68,26 @@ public class DuelScene extends ForgeScene { } + void addItemEffects(RegisteredPlayer player,Array items) + { + if(items==null) + return; + + int lifeMod=0; + int changeStartCards=0; + Array startCards=new Array<>(); + + for(ItemData data:items) + { + lifeMod+=data.lifeModifier; + changeStartCards+= data.changeStartCards; + startCards.addAll(data.startBattleWithCards()); + } + player.setCardsOnBattlefield(startCards); + player.setStartingLife(Math.max(1,lifeMod+player.getStartingLife())); + player.setStartingHand(player.getStartingHand()+changeStartCards); + } + @Override public void enter() { @@ -97,6 +116,32 @@ public class DuelScene extends ForgeScene { aiPlayer.setPlayer(enemyPlayer); aiPlayer.setStartingLife(Math.round((float)enemy.getData().life*Current.player().getDifficulty().enemyLifeFactor)); + + + Array playerItems=new Array<>(); + Array oppItems=new Array<>(); + + for(String playerItem:Current.player().getEquippedItems()) + { + ItemData item=ItemData.getItem(playerItem); + playerItems.add(item); + if(item.opponent !=null) + oppItems.add(item.opponent); + } + if(enemy.getData().equipment!=null) + { + for(String oppItem:enemy.getData().equipment) + { + ItemData item=ItemData.getItem(oppItem); + oppItems.add(item); + if(item.opponent !=null) + playerItems.add(item.opponent); + } + } + + addItemEffects(humanPlayer,playerItems); + addItemEffects(aiPlayer,oppItems); + players.add(humanPlayer); players.add(aiPlayer); diff --git a/forge-gui-mobile/src/forge/adventure/scene/HudScene.java b/forge-gui-mobile/src/forge/adventure/scene/HudScene.java index 5a4142880a6..b7f2827039f 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/HudScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/HudScene.java @@ -9,7 +9,7 @@ import forge.adventure.stage.GameStage; /** * Hud base scene */ -public class HudScene extends Scene implements InputProcessor { +public abstract class HudScene extends Scene implements InputProcessor { GameHUD hud; GameStage stage; @@ -63,6 +63,8 @@ public class HudScene extends Scene implements InputProcessor { if (hud.keyDown(keycode)) return true; + if(isInHudOnlyMode()) + return false; return stage.keyDown(keycode); } @@ -71,6 +73,8 @@ public class HudScene extends Scene implements InputProcessor { if (hud.keyUp(keycode)) return true; + if(isInHudOnlyMode()) + return false; return stage.keyUp(keycode); } @@ -79,6 +83,8 @@ public class HudScene extends Scene implements InputProcessor { if (hud.keyTyped(character)) return true; + if(isInHudOnlyMode()) + return false; return stage.keyTyped(character); } @@ -86,6 +92,8 @@ public class HudScene extends Scene implements InputProcessor { public boolean touchDown(int screenX, int screenY, int pointer, int button) { if (hud.touchDown(screenX, screenY, pointer, button)) return true; + if(isInHudOnlyMode()) + return false; return stage.touchDown(screenX, screenY, pointer, button); } @@ -93,6 +101,8 @@ public class HudScene extends Scene implements InputProcessor { public boolean touchUp(int screenX, int screenY, int pointer, int button) { if (hud.touchUp(screenX, screenY, pointer, button)) return true; + if(isInHudOnlyMode()) + return false; return stage.touchUp(screenX, screenY, pointer, button); } @@ -100,6 +110,8 @@ public class HudScene extends Scene implements InputProcessor { public boolean touchDragged(int screenX, int screenY, int pointer) { if (hud.touchDragged(screenX, screenY, pointer)) return true; + if(isInHudOnlyMode()) + return false; return stage.touchDragged(screenX, screenY, pointer); } @@ -107,6 +119,8 @@ public class HudScene extends Scene implements InputProcessor { public boolean mouseMoved(int screenX, int screenY) { if (hud.mouseMoved(screenX, screenY)) return true; + if(isInHudOnlyMode()) + return false; return stage.mouseMoved(screenX, screenY); } @@ -114,6 +128,13 @@ public class HudScene extends Scene implements InputProcessor { public boolean scrolled(float amountX, float amountY) { if (hud.scrolled(amountX, amountY)) return true; + if(isInHudOnlyMode()) + return false; return stage.scrolled(amountX, amountY); } + + public boolean isInHudOnlyMode() + { + return false; + } } \ No newline at end of file diff --git a/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java b/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java new file mode 100644 index 00000000000..ca244e0ec30 --- /dev/null +++ b/forge-gui-mobile/src/forge/adventure/scene/InventoryScene.java @@ -0,0 +1,306 @@ +package forge.adventure.scene; + +import com.badlogic.gdx.Input; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.ui.*; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import com.badlogic.gdx.utils.Align; +import com.badlogic.gdx.utils.Array; +import forge.Forge; +import forge.adventure.data.ItemData; +import forge.adventure.stage.GameHUD; +import forge.adventure.util.Config; +import forge.adventure.util.Controls; +import forge.adventure.util.Current; +import forge.adventure.util.Paths; + +import java.util.HashMap; +import java.util.Map; + +public class InventoryScene extends UIScene { + TextButton leave; + Button equipButton; + Label itemDescription; + Dialog confirm; + private Table inventory; + Array