From 2ad0d598eb32c780fe720701d47a4c09bcc1ff2e Mon Sep 17 00:00:00 2001 From: Grimm Date: Tue, 9 Aug 2022 18:38:43 +0200 Subject: [PATCH] Added multiplayer fights --- .../adventure/character/CharacterSprite.java | 9 +- .../src/forge/adventure/data/EnemyData.java | 3 + .../src/forge/adventure/scene/DuelScene.java | 149 +++++++++++------- .../stage/ConsoleCommandInterpreter.java | 7 + .../src/forge/adventure/stage/WorldStage.java | 13 +- .../Shandalar/sprites/goblin_group.atlas | 75 +++++++++ .../Shandalar/sprites/goblin_group.png | Bin 0 -> 25802 bytes .../adventure/Shandalar/world/enemies.json | 51 ++++++ 8 files changed, 244 insertions(+), 63 deletions(-) create mode 100644 forge-gui/res/adventure/Shandalar/sprites/goblin_group.atlas create mode 100644 forge-gui/res/adventure/Shandalar/sprites/goblin_group.png diff --git a/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java b/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java index 8197085fffd..d4b988ca42b 100644 --- a/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java +++ b/forge-gui-mobile/src/forge/adventure/character/CharacterSprite.java @@ -19,7 +19,7 @@ public class CharacterSprite extends MapActor { private Animation currentAnimation = null; private AnimationTypes currentAnimationType = AnimationTypes.Idle; private AnimationDirections currentAnimationDir = AnimationDirections.None; - private Sprite avatar; + private Array avatar=new Array<>(); public boolean hidden = false; public CharacterSprite(int id,String path) { @@ -45,7 +45,7 @@ public class CharacterSprite extends MapActor { animations.clear(); for (AnimationTypes stand : AnimationTypes.values()) { if (stand == AnimationTypes.Avatar) { - avatar = atlas.createSprite(stand.toString()); + avatar.addAll(atlas.createSprites(stand.toString())); continue; } HashMap> dirs = new HashMap<>(); @@ -227,7 +227,10 @@ public class CharacterSprite extends MapActor { } public Sprite getAvatar() { - return avatar; + return avatar.first(); + } + public Sprite getAvatar(int index) { + return avatar.get(index); } public enum AnimationTypes { diff --git a/forge-gui-mobile/src/forge/adventure/data/EnemyData.java b/forge-gui-mobile/src/forge/adventure/data/EnemyData.java index b7321491e94..b4cb9db9622 100644 --- a/forge-gui-mobile/src/forge/adventure/data/EnemyData.java +++ b/forge-gui-mobile/src/forge/adventure/data/EnemyData.java @@ -24,6 +24,9 @@ public class EnemyData { public String[] equipment; public String colors = ""; + public EnemyData nextEnemy; + public int teamNumber=-1; + public EnemyData() { } public EnemyData(EnemyData enemyData) { name = enemyData.name; diff --git a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java index 20dcc49108e..3535f7451d1 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/DuelScene.java @@ -9,6 +9,7 @@ import forge.LobbyPlayer; import forge.adventure.character.EnemySprite; import forge.adventure.character.PlayerSprite; import forge.adventure.data.EffectData; +import forge.adventure.data.EnemyData; import forge.adventure.data.ItemData; import forge.adventure.player.AdventurePlayer; import forge.adventure.util.Config; @@ -51,7 +52,7 @@ public class DuelScene extends ForgeScene { PlayerSprite player; RegisteredPlayer humanPlayer; private EffectData dungeonEffect; - Deck playerDeck, enemyDeck; + Deck playerDeck; boolean chaosBattle = false; boolean callbackExit = false; List playerExtras = new ArrayList<>(); @@ -134,7 +135,7 @@ public class DuelScene extends ForgeScene { changeStartCards+= data.changeStartCards; startCards.addAll(data.startBattleWithCards()); } - player.setCardsOnBattlefield(startCards); + player.addExtraCardsOnBattlefield(startCards); player.setStartingLife(Math.max(1,lifeMod+player.getStartingLife())); player.setStartingHand(player.getStartingHand()+changeStartCards); } @@ -154,25 +155,41 @@ public class DuelScene extends ForgeScene { int missingCards= Config.instance().getConfigData().minDeckSize-playerDeck.getMain().countAll(); if( missingCards > 0 ) //Replace unknown cards for a Wastes. playerDeck.getMain().add("Wastes",missingCards); - humanPlayer = RegisteredPlayer.forVariants(2, appliedVariants,playerDeck, null, false, null, null); - LobbyPlayer playerObject = GamePlayerUtil.getGuiPlayer(); - FSkin.getAvatars().put(90001, advPlayer.avatar()); - playerObject.setAvatarIndex(90001); - humanPlayer.setPlayer(playerObject); - humanPlayer.setStartingLife(advPlayer.getLife()); - Current.setLatestDeck(enemyDeck); - RegisteredPlayer aiPlayer = RegisteredPlayer.forVariants(2, appliedVariants, Current.latestDeck(), null, false, null, null); - LobbyPlayer enemyPlayer = GamePlayerUtil.createAiPlayer(this.enemy.getData().name, selectAI(this.enemy.getData().ai)); - if(!enemy.nameOverride.isEmpty()) enemyPlayer.setName(enemy.nameOverride); //Override name if defined in the map. - FSkin.getAvatars().put(90000, this.enemy.getAvatar()); - enemyPlayer.setAvatarIndex(90000); + int playerCount=1; + EnemyData currentEnemy=enemy.getData(); + for(int i=0;i<8&¤tEnemy!=null;i++) + { + playerCount++; + currentEnemy=currentEnemy.nextEnemy; + } - aiPlayer.setPlayer(enemyPlayer); - aiPlayer.setStartingLife(Math.round((float)enemy.getData().life*advPlayer.getDifficulty().enemyLifeFactor)); + humanPlayer = RegisteredPlayer.forVariants(playerCount, appliedVariants,playerDeck, null, false, null, null); + LobbyPlayer playerObject = GamePlayerUtil.getGuiPlayer(); + FSkin.getAvatars().put(90000, advPlayer.avatar()); + playerObject.setAvatarIndex(90000); + humanPlayer.setPlayer(playerObject); + humanPlayer.setTeamNumber(0); + humanPlayer.setStartingLife(advPlayer.getLife()); Array playerEffects = new Array<>(); Array oppEffects = new Array<>(); + + Map, List>> deckProxyMapMap = null; + DeckProxy deckProxy =null; + if(chaosBattle) + { + deckProxyMapMap = DeckProxy.getAllQuestChallenges(); + List decks = new ArrayList<>(deckProxyMapMap.keySet()); + deckProxy = Aggregates.random(decks); + //playerextras + List playerCards = new ArrayList<>(); + for (String s : deckProxyMapMap.get(deckProxy).getLeft()) { + playerCards.add(QuestUtil.readExtraCard(s)); + } + humanPlayer.addExtraCardsOnBattlefield(playerCards); + } + //Collect and add items effects first. for(String playerItem:advPlayer.getEquippedItems()) { ItemData item=ItemData.getItem(playerItem); @@ -183,13 +200,6 @@ public class DuelScene extends ForgeScene { System.err.printf("Item %s not found.", playerItem); } } - if(enemy.getData().equipment!=null) { - for(String oppItem:enemy.getData().equipment) { - ItemData item=ItemData.getItem(oppItem); - oppEffects.add(item.effect); - if(item.effect.opponent !=null) playerEffects.add(item.effect.opponent); - } - } //Collect and add player blessings. if(advPlayer.getBlessing() != null){ @@ -212,16 +222,62 @@ public class DuelScene extends ForgeScene { } addEffects(humanPlayer,playerEffects); - addEffects(aiPlayer,oppEffects); - //add extra cards for challenger mode - if (chaosBattle) { - humanPlayer.addExtraCardsOnBattlefield(playerExtras); - aiPlayer.addExtraCardsOnBattlefield(AIExtras); + currentEnemy=enemy.getData(); + for(int i=0;i<8&¤tEnemy!=null;i++) + { + Deck deck=null; + + if (this.chaosBattle) { //random challenge for chaos mode + //aiextras + List aiCards = new ArrayList<>(); + for (String s : deckProxyMapMap.get(deck).getRight()) { + aiCards.add(QuestUtil.readExtraCard(s)); + } + this.AIExtras = aiCards; + deck = deckProxy.getDeck(); + } else { + deck=currentEnemy.copyPlayerDeck ? this.playerDeck : currentEnemy.generateDeck(Current.player().isFantasyMode(), Current.player().getDifficulty().name.equalsIgnoreCase("Hard")); + } + RegisteredPlayer aiPlayer = RegisteredPlayer.forVariants(playerCount, appliedVariants, deck, null, false, null, null); + + LobbyPlayer enemyPlayer = GamePlayerUtil.createAiPlayer(currentEnemy.name, selectAI(currentEnemy.ai)); + if(!enemy.nameOverride.isEmpty()) enemyPlayer.setName(enemy.nameOverride); //Override name if defined in the map.(only supported for 1 enemy atm) + FSkin.getAvatars().put(90001+i, enemy.getAvatar(i)); + enemyPlayer.setAvatarIndex(90001+i); + aiPlayer.setPlayer(enemyPlayer); + aiPlayer.setTeamNumber(currentEnemy.teamNumber); + aiPlayer.setStartingLife(Math.round((float)currentEnemy.life*advPlayer.getDifficulty().enemyLifeFactor)); + + Array equipmentEffects = new Array<>(); + if(currentEnemy.equipment!=null) { + for(String oppItem:currentEnemy.equipment) { + ItemData item=ItemData.getItem(oppItem); + equipmentEffects.add(item.effect); + if(item.effect.opponent !=null) playerEffects.add(item.effect.opponent); + } + } + addEffects(aiPlayer,oppEffects); + addEffects(aiPlayer,equipmentEffects); + + + //add extra cards for challenger mode + if (chaosBattle) { + aiPlayer.addExtraCardsOnBattlefield(AIExtras); + } + + players.add(aiPlayer); + + + + Current.setLatestDeck(deck); + + currentEnemy=currentEnemy.nextEnemy; } + + players.add(humanPlayer); - players.add(aiPlayer); final Map guiMap = new HashMap<>(); guiMap.put(humanPlayer, MatchController.instance); @@ -253,7 +309,7 @@ public class DuelScene extends ForgeScene { "It's all or nothing!","It's all on the line!","You can't back down now!","Do you have what it takes?","What will happen next?", "Don't blink!","You can't lose here!","There's no turning back!","It's all or nothing now!"); String message = Aggregates.random(list); - FThreads.delayInEDT(600, () -> FThreads.invokeInEdtNowOrLater(() -> FOptionPane.showMessageDialog(message, aiPlayer.getPlayer().getName(), new FBufferedImage(120, 120) { + FThreads.delayInEDT(600, () -> FThreads.invokeInEdtNowOrLater(() -> FOptionPane.showMessageDialog(message, enemy.getName(), new FBufferedImage(120, 120) { @Override protected void draw(Graphics g, float w, float h) { if (FSkin.getAvatars().get(90000) != null) @@ -285,34 +341,11 @@ public class DuelScene extends ForgeScene { this.enemy = enemySprite; this.playerDeck = (Deck)AdventurePlayer.current().getSelectedDeck().copyTo("PlayerDeckCopy"); this.chaosBattle = this.enemy.getData().copyPlayerDeck && Current.player().isFantasyMode(); - if (this.chaosBattle) { //random challenge for chaos mode - Map, List>> deckProxyMapMap = DeckProxy.getAllQuestChallenges(); - List decks = new ArrayList<>(deckProxyMapMap.keySet()); - DeckProxy deck = Aggregates.random(decks); - //playerextras - List playerCards = new ArrayList<>(); - for (String s : deckProxyMapMap.get(deck).getLeft()) { - playerCards.add(QuestUtil.readExtraCard(s)); - } - this.playerExtras = playerCards; - //aiextras - List aiCards = new ArrayList<>(); - for (String s : deckProxyMapMap.get(deck).getRight()) { - aiCards.add(QuestUtil.readExtraCard(s)); - } - this.AIExtras = aiCards; - this.enemyDeck = deck.getDeck(); - } else { - this.AIExtras.clear(); - this.playerExtras.clear(); - this.enemyDeck = this.enemy.getData().copyPlayerDeck ? this.playerDeck : this.enemy.getData().generateDeck(Current.player().isFantasyMode(), Current.player().getDifficulty().name.equalsIgnoreCase("Hard")); - } - } - public Deck getPlayerDeck() { - return this.playerDeck; - } - public Deck getEnemyDeck() { - return this.enemyDeck; + + + this.AIExtras.clear(); + this.playerExtras.clear(); + } private String selectAI(String ai) { //Decide opponent AI. diff --git a/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java b/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java index 245dfec284c..35e9463de0e 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java +++ b/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java @@ -117,6 +117,13 @@ public class ConsoleCommandInterpreter { WorldStage.getInstance().GetPlayer().setPosition(poi.getPosition()); return "Teleported to " + s[0] + "(" + poi.getPosition() + ")"; }); + registerCommand(new String[]{"spawn","enemy"}, s -> { + if(s.length<1) return "Command needs 1 parameter: enemy name."; + + if(WorldStage.getInstance().spawn(s[0])) + return "Spawn " + s[0]; + return "Can not find enemy "+s[0]; + }); registerCommand(new String[]{"give", "gold"}, s -> { if(s.length<1) return "Command needs 1 parameter: Amount."; int amount; diff --git a/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java index 6c07f0c094b..7f09143041a 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/WorldStage.java @@ -202,6 +202,10 @@ public class WorldStage extends GameStage implements SaveFileContent { return WorldSave.getCurrentSave().getWorld().collidingTile(boundingRect); } + public boolean spawn(String enemy) + { + return spawn(WorldData.getEnemy(enemy)); + } private void HandleMonsterSpawn(float delta) { World world = WorldSave.getCurrentSave().getWorld(); @@ -223,8 +227,12 @@ public class WorldStage extends GameStage implements SaveFileContent { if (list == null) return; EnemyData enemyData = data.getEnemy( 1.0f ); + spawn(enemyData); + } + + private boolean spawn(EnemyData enemyData) { if (enemyData == null) - return; + return false; EnemySprite sprite = new EnemySprite(enemyData); float unit = Scene.getIntendedHeight() / 6f; Vector2 spawnPos = new Vector2(1, 1); @@ -242,11 +250,12 @@ public class WorldStage extends GameStage implements SaveFileContent { { enemies.add(Pair.of(globalTimer,sprite)); foregroundSprites.addActor(sprite); - return; + return true; } int g=0; } } + return false; } @Override diff --git a/forge-gui/res/adventure/Shandalar/sprites/goblin_group.atlas b/forge-gui/res/adventure/Shandalar/sprites/goblin_group.atlas new file mode 100644 index 00000000000..38564aede93 --- /dev/null +++ b/forge-gui/res/adventure/Shandalar/sprites/goblin_group.atlas @@ -0,0 +1,75 @@ + +goblin_group.png +size: 64,96 +format: RGBA8888 +filter: Nearest,Nearest +repeat: none +Avatar + xy: 0, 0 + size: 16, 16 +Avatar + xy: 16, 0 + size: 16, 16 +Avatar + xy: 32, 0 + size: 16, 16 +Idle + xy: 0, 16 + size: 32, 16 +Idle + xy: 32, 16 + size: 32, 16 +Idle + xy: 64, 16 + size: 32, 16 +Idle + xy: 96, 16 + size: 32, 16 +Walk + xy: 0, 32 + size: 32, 16 +Walk + xy: 32, 32 + size: 32, 16 +Walk + xy: 64, 32 + size: 32, 16 +Walk + xy: 96, 32 + size: 32, 16 +Attack + xy: 0, 48 + size: 32, 16 +Attack + xy: 32, 48 + size: 32, 16 +Attack + xy: 64, 48 + size: 32, 16 +Attack + xy: 96, 48 + size: 32, 16 +Hit + xy: 0, 64 + size: 32, 16 +Hit + xy: 32, 64 + size: 32, 16 +Hit + xy: 64, 64 + size: 32, 16 +Hit + xy: 96, 64 + size: 32, 16 +Death + xy: 0, 80 + size: 32, 16 +Death + xy: 32, 80 + size: 32, 16 +Death + xy: 64, 80 + size: 32, 16 +Death + xy: 96, 80 + size: 32, 16 \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/sprites/goblin_group.png b/forge-gui/res/adventure/Shandalar/sprites/goblin_group.png new file mode 100644 index 0000000000000000000000000000000000000000..548c62dfaac6ecaed5407297e91f83ed13465158 GIT binary patch literal 25802 zcmV(-K-|BHP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+SR>Tk|epcW&5wAxI<6?3P3R&bSm;@@P=P&!6TB% z?vj+^Pi2tNxSN}yInCau(`*0#|KE50&;R^S$hExJlj~brDL4N;?P;;|m-qhpubH%jr>CqF;`9zWZX)vseCq`P-9f zEV+dG@cR?*T1(^aZ@iz%xh)r(>iPUXKIm`%ef@rEWKD6WkZyi|U19S7F?IfY&+m=b zgjD!DpUm$e{aPuv6|cMU_xAf-|M&m?x0PSNm;UQs|LRKr_}kxH_524neVqgS{gU)I zH&p)k^B;aaxxP?tMKMRxbDEqxRLPvI@Ej)`1h~B{m*+%++aS({IbD* z58r|7A36L*xYD`k#0xWj{^(Jt>(?7_M64jQn2@-EyM&ZO33rY0sv&TYFBjBVdQ49o zTuaC~E*2S|lnR%F7Vz2pObzFyF~^@TV+gs3oXUmzz1&devYsa+KlOQ$p`KHIa?T~! z{N|Q>Nkt7S1+$7p?KRb>Vqixb-bgEKI1jhd}f|y*7?ph`-&?q^mvt3*Sp&4J8VR0KRfTT>wb6J z{X^8g^gUnx%2&VlYuDHRxV2x``ggzngIf!~ZY`dh@`d$}TjQ&>{(g&~ImzA`Hx{43 zg;#GNq$@`6?0&=ZL~qVJyIVvna%7R&%UQu2;|8A{V*bJ(clVc@%NM5ezjALE7ZLv( zH+Ok;|HjSz{k{F8TU-4Y;&g6EHS|#Lg!X*_jm50&$<_4AZ`iX?KmHbX%j=nS-z+Ex zRHTMo>R0ltv3_%my;AyGeObd-_T~iVH%eW7v zZehJ)cNW|S3q}ZX?0da;>NVtD<7-dJ)$Aivr-pD=P?>C5-}*yVUXv>w6m z^iycNt*4IA-?G14SBeYg5Lx=yMs2-rw7<;}IT4QOuA{J|%Kmd(aXzcE%*9WBaoosU z?6LNasI)c|HpC*m-<%bfP_J{AJLS%$ROEH23+5a-qqb(-xnTLO&3}-#>(HrHMRJRi#6`Dkc#g`zTzA^ zf33}c03lglp1IU#VB~R=U*#vc;h0lzp_S3wjL%%^;l-Z;IWGyJ8Kd!mU+Ab<8uOlC z<&?v0C^?7d3GMxGhjlOH`P~98wq83*yTiBG<7zu}RO;1t^RF`Qb2pp&-6$w8EqPaN zwWq;yGx9wq?glkLYVM63WiIbUYMxs0W~DTaKlW#o-19rR>zC{JxWDFG&z1o#C|&yo zo8iWv+R&z}&Nf;Y-^$O2VVnry*Pd|1{@#^cV#q4G)lj4DTX7W=X~5i~;17yAzi0RB z@6Z3=IR56)0 zgnIIJeRs8+WurhDgM4$&1-rp+Hpert$1iWTMgW=3g?#Yq6Vkm%Hdnb9c0D|8Rs>;u zeLeea>ny$uWeRM0Zj3wlG9rdW!{3MU75;+W+;6?gUL4N*h3f6GKfGTH9_#+ziA-=; z=o-7ke8h*JUKKxaZxAGAi)&pUdeg75L*wK#a)b#7Z*tV^5I-2l>}6th2G(fyir|9S zDrQlWv&sk@#E)H_v0m&PL%TQDP$kAlDG-R@)Yd!|K*g?cxbg1s<$w1-{`2~0-_YjI z6~CFj#D{mhE;4qk!Huuj89{!y=+;VVNECn_h56o%D(8Wjxltjk70zcr_!Wd3!RFvF z&>IHxeD_8~_@u-SXv49YZz}bgYx8e>Lff3jxA!qc-(7KPC=rg47b9QctL;P45b%{M zW)o>e2|2tka&Hed8-+jv@~f6CE^P3AFWyb#{Pc-&dB*<2y+`ejHgXkgB%}b*{mPSe zjU5ny%<-vfPX+BoG&{Vnqj>pyF*mCw@WZV2YkGTx0w1JB2#b}XEIWWK-ny?CzzUJ$ z`BK+ebBe?5%!y-6vwRU3h3UiY^uP~38xQeyg!SE^Equ(!u|DfU7*s)A2wsP?V#7y@ zGoty{wdM}I!>wE*^~av=en(E0{c#%c(I2OA;WFCo**ydQ_tuE6g9R5J64BaH94?!M z@lOum1GoW31QNlMtWdYN;IFQV-p3bf_p$qzJvB}&cEG{_sv${u{eHJEJ>QQn1u&(K zOyQvgBuVG_N&L8MkDq1i7*zQcv`SB&PaYUmv&4iw)mLVBw^EDJ0f83Fc~D5;s2F>VUO;Tz6;_y)
    )7^3vd9kEr29XKnqya^`J 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