diff --git a/res/card-pictures.txt b/res/card-pictures.txt index be0f57f8a2b..bd67a3d7c7a 100644 --- a/res/card-pictures.txt +++ b/res/card-pictures.txt @@ -38,6 +38,9 @@ snow_covered_mountain.jpg http://www.wizards.com/global/images/magic/gene snow_covered_mountain1.jpg http://www.wizards.com/global/images/magic/general/snow_covered_mountain.jpg snow_covered_mountain2.jpg http://www.magickartenmarkt.de/img/cards/Ice_Age/snow_covered_mountain.jpg snow_covered_mountain3.jpg http://www.magickartenmarkt.de/img/cards/Ice_Age/snow_covered_mountain.jpg +angelic_chorus.jpg http://www.wizards.com/global/images/magic/general/angelic_chorus.jpg +ajanis_pridemate.jpg http://www.wizards.com/global/images/magic/general/ajanis_pridemate.jpg +ageless_entity.jpg http://www.wizards.com/global/images/magic/general/ageless_entity.jpg inferno_titan.jpg http://www.wizards.com/global/images/magic/general/inferno_titan.jpg sylvan_ranger.jpg http://www.wizards.com/global/images/magic/general/sylvan_ranger.jpg manic_vandal.jpg http://www.wizards.com/global/images/magic/general/manic_vandal.jpg diff --git a/res/cards.txt b/res/cards.txt index 687a876ed42..7479139b8a9 100644 --- a/res/cards.txt +++ b/res/cards.txt @@ -1,3 +1,23 @@ +Angelic Chorus +3 W W +Enchantment +no text +WheneverKeyword:EntersBattleField:Type/Creature:Play:ModifyLife/Toughness:ControllingPlayer_Self:ASAP:No Condition:Initiator - OwnedByController:Whenever a creature enters the battlefield under your control, you gain life equal to its toughness. + +Ajani's Pridemate +1 W +Creature Cat Soldier +no text +2/2 +WheneverKeyword:GainLife:No_Initiator:Play:+1+1 Counters/1:Self:ASAP:No_Condition:No Special Condition:Whenever you gain life, you may put a +1/+1 counter on Ajani's Pridemate. + +Ageless Entity +3 G G +Creature Elemental +no text +4/4 +WheneverKeyword:GainLife:No_Initiator:Play:+1+1 Counters/Life_Gained:Self:ASAP:No_Condition:No Special Condition:Whenever you gain life, put that many +1/+1 counters on Ageless Entity. + Inferno Titan 4 R R Creature Giant diff --git a/src/forge/CardFactory.java b/src/forge/CardFactory.java index dcf6b1889cb..b9f8ed53f27 100644 --- a/src/forge/CardFactory.java +++ b/src/forge/CardFactory.java @@ -28,6 +28,9 @@ public class CardFactory implements NewConstants { private HashSet removedCardList; private Card blankCard = new Card(); //new code + // The Following "Cards" are used by the Whenever Keyword + public Card HumanNullCard = new Card(); + public Card ComputerNullCard = new Card(); public CardFactory(String filename) { this(new File(filename)); @@ -54,6 +57,11 @@ public class CardFactory implements NewConstants { blankCard.setOwner(Constant.Player.Human); blankCard.setController(Constant.Player.Human); + HumanNullCard.setOwner(Constant.Player.Human); + HumanNullCard.setController(Constant.Player.Human); + ComputerNullCard.setOwner(Constant.Player.Computer); + ComputerNullCard.setController(Constant.Player.Computer); + removedCardList = new HashSet(FileUtil.readFile(ForgeProps.getFile(REMOVED))); diff --git a/src/forge/CombatUtil.java b/src/forge/CombatUtil.java index c2e686d8f5b..2914ec32bfc 100644 --- a/src/forge/CombatUtil.java +++ b/src/forge/CombatUtil.java @@ -852,7 +852,7 @@ public class CombatUtil { //human does not have an "attackers_instantAbility" phase during his turn (yet), so triggers will happen at the beginning of declare blockers if( /*AllZone.Phase.getPhase().equals("Declare Blockers") ||*/ AllZone.Phase.getPhase().equals(Constant.Phase.Combat_Declare_Attackers_InstantAbility)) { - AllZone.GameAction.CheckWheneverKeyword(c,"Attacks"); + AllZone.GameAction.CheckWheneverKeyword(c,"Attacks",null); //Annihilator: if (!c.getCreatureAttackedThisCombat()) { diff --git a/src/forge/EndOfTurn.java b/src/forge/EndOfTurn.java index 74d174ac489..459b010e1ff 100644 --- a/src/forge/EndOfTurn.java +++ b/src/forge/EndOfTurn.java @@ -1,6 +1,5 @@ package forge; -import java.util.ArrayList; //import java.util.*; //handles "until end of turn" and "at end of turn" commands from cards @@ -18,7 +17,7 @@ public class EndOfTurn implements java.io.Serializable public void executeAt() { - AllZone.GameAction.CheckWheneverKeyword(new Card(),"BeginningOfEndStep"); + AllZone.GameAction.CheckWheneverKeyword(AllZone.CardFactory.HumanNullCard,"BeginningOfEndStep",null); //Pyrohemia and Pestilence CardList all = new CardList(); diff --git a/src/forge/GameAction.java b/src/forge/GameAction.java index 446e30fcc5f..4204a69a62e 100644 --- a/src/forge/GameAction.java +++ b/src/forge/GameAction.java @@ -663,7 +663,7 @@ public class GameAction { } // Whenever Keyword - public void CheckWheneverKeyword(Card Triggering_Card,String Event) { + public void CheckWheneverKeyword(Card Triggering_Card,String Event, Object[] Custom_Parameters) { CardList Cards_In_Play = new CardList(); Cards_In_Play.addAll(AllZone.getZone(Constant.Zone.Play, Constant.Player.Human).getCards()); Cards_In_Play.addAll(AllZone.getZone(Constant.Zone.Play, Constant.Player.Computer).getCards()); @@ -689,7 +689,7 @@ public class GameAction { String parse = card.getKeyword().get(WheneverKeyword_Number[CKeywords]).toString(); String k[] = parse.split(":"); if((k[1].equals(Event))) { - RunWheneverKeyword(Triggering_Card, Event); // Beached + RunWheneverKeyword(Triggering_Card, Event, Custom_Parameters); // Beached Triggered = true; } } @@ -697,7 +697,8 @@ public class GameAction { } } static boolean MultiTarget_Cancelled = false; - public void RunWheneverKeyword(Card c, String Event) { + public void RunWheneverKeyword(Card c, String Event, Object[] Custom_Parameters) { + final Card F_TriggeringCard = c; CardList Cards_In_Play = new CardList(); Cards_In_Play.addAll(AllZone.getZone(Constant.Zone.Play, Constant.Player.Human).getCards()); Cards_In_Play.addAll(AllZone.getZone(Constant.Zone.Play, Constant.Player.Computer).getCards()); @@ -725,7 +726,8 @@ public class GameAction { if((k[1].equals("PermanentIntoGraveyard")) && Event.equals("PermanentIntoGraveyard") || (k[1].equals("BeginningOfEndStep")) && Event.equals("BeginningOfEndStep") || (k[1].equals("Attacks")) && Event.equals("Attacks") - || (k[1].equals("EntersBattleField")) && Event.equals("EntersBattleField")) + || (k[1].equals("EntersBattleField")) && Event.equals("EntersBattleField") + || (k[1].equals("GainLife")) && Event.equals("GainLife") && c.getController().equals(card.getController())) { if(k[2].contains("Self")) { if(!card.equals(c)) k[4] = "Null"; @@ -738,6 +740,9 @@ public class GameAction { if(k[8].contains("Initiator - Other than Self")) { if(card.equals(c)) k[4] = "Null"; } + if(k[8].contains("Initiator - OwnedByController")) { + if(!c.getController().equals(card.getController())) k[4] = "Null"; + } if(k[8].contains("Initiator - Has Keyword")) { boolean Nullified = true; String KeywordParse = k[8]; @@ -754,17 +759,16 @@ public class GameAction { if(k[5].equals("ControllingPlayer_Self")) TargetPlayer = card.getController(); final String F_TargetPlayer = TargetPlayer; Card TargetCard = null; - final Card Destroyed = c; if(k[5].equals("Self")) TargetCard = F_card; final Card F_TargetCard = TargetCard; - // +1 +1 Counters if(k[4].contains("+1+1 Counters")) { String AmountParse = k[4]; String S_Amount = AmountParse.split("/")[1]; int I_Amount = 0; - if(S_Amount.equals("Power")) I_Amount = Destroyed.getNetAttack(); - else I_Amount = Integer.valueOf(S_Amount); + if(S_Amount.equals("Power")) I_Amount = F_TriggeringCard.getNetAttack(); + else if(S_Amount.equals("Life_Gained")) I_Amount = ((Integer)Custom_Parameters[0]); + else if(I_Amount == 0) I_Amount = Integer.valueOf(S_Amount); final int F_Amount = I_Amount; Ability ability = new Ability(F_TargetCard, "0") { @Override @@ -802,7 +806,7 @@ public class GameAction { String AmountParse = k[4]; String S_Amount = AmountParse.split("/")[1]; int I_Amount = 0; - if(S_Amount.equals("Some random condition not implemented yet")) I_Amount = 3; + if(S_Amount.equals("Toughness")) I_Amount = F_TriggeringCard.getNetDefense(); else I_Amount = Integer.valueOf(S_Amount); final int F_Amount = I_Amount; Ability ability = new Ability(card, "0") { @@ -993,7 +997,7 @@ public class GameAction { } }); - CheckWheneverKeyword(c, "PermanentIntoGraveyard"); + CheckWheneverKeyword(c, "PermanentIntoGraveyard",null); for(int i = 0; i < list.size(); i++) GameActionUtil.executeDestroyCardEffects(list.get(i), c); for(int i = 0; i < grv.size(); i++) diff --git a/src/forge/PlayerLife.java b/src/forge/PlayerLife.java index 3641e9cb2ab..619252c0687 100644 --- a/src/forge/PlayerLife.java +++ b/src/forge/PlayerLife.java @@ -20,7 +20,19 @@ public class PlayerLife extends MyObservable implements java.io.Serializable } public void addLife(int life2) { + Card WhoGainedLife = new Card(); + if(AllZone.Human_Life.getLife() != AllZone.Computer_Life.getLife()) { + if(AllZone.Human_Life.getLife() == life) WhoGainedLife = AllZone.CardFactory.HumanNullCard; + else WhoGainedLife = AllZone.CardFactory.ComputerNullCard; + } life += life2; + if(WhoGainedLife != AllZone.CardFactory.HumanNullCard && WhoGainedLife != AllZone.CardFactory.ComputerNullCard) { + if(AllZone.Human_Life.getLife() == life) WhoGainedLife = AllZone.CardFactory.HumanNullCard; + else WhoGainedLife = AllZone.CardFactory.ComputerNullCard; + } + Object[] Life_Whenever_Parameters = new Object[1]; + Life_Whenever_Parameters[0] = life2; + AllZone.GameAction.CheckWheneverKeyword(WhoGainedLife, "GainLife", Life_Whenever_Parameters); this.updateObservers(); } public void subtractLife(int life2) diff --git a/src/forge/PlayerZone_ComesIntoPlay.java b/src/forge/PlayerZone_ComesIntoPlay.java index 5956b0a0545..a7b4dff829a 100644 --- a/src/forge/PlayerZone_ComesIntoPlay.java +++ b/src/forge/PlayerZone_ComesIntoPlay.java @@ -46,7 +46,7 @@ public class PlayerZone_ComesIntoPlay extends DefaultPlayerZone { if(trigger) { c.setSickness(true);// summoning sickness c.comesIntoPlay(); - AllZone.GameAction.CheckWheneverKeyword(c,"EntersBattleField"); + AllZone.GameAction.CheckWheneverKeyword(c,"EntersBattleField",null); PlayerZone play = AllZone.getZone(Constant.Zone.Play, c.getController()); PlayerZone grave = AllZone.getZone(Constant.Zone.Graveyard, c.getController());