From 9c3ff863e8dbefaff641fd90c1b47dd978660eb5 Mon Sep 17 00:00:00 2001 From: BetaSteward Date: Sun, 28 Nov 2010 04:31:48 +0000 Subject: [PATCH] fix for issue 22 + fix for planeswalker damage redirection --- .../src/mage/view/CombatGroupView.java | 6 +- .../src/mage/player/ai/ComputerPlayer.java | 2 +- .../src/mage/player/human/HumanPlayer.java | 2 +- Mage.Server/plugins/mage-deck-constructed.jar | Bin 3189 -> 3190 bytes Mage.Server/plugins/mage-game-freeforall.jar | Bin 4392 -> 4392 bytes .../plugins/mage-game-twoplayerduel.jar | Bin 3957 -> 3957 bytes Mage.Server/plugins/mage-player-ai.jar | Bin 28582 -> 28577 bytes Mage.Server/plugins/mage-player-aiminimax.jar | Bin 36470 -> 36470 bytes Mage.Server/plugins/mage-player-human.jar | Bin 10999 -> 10990 bytes .../sets/alarareborn/VengefulRebirth.java | 2 +- .../src/mage/sets/magic2010/Earthquake.java | 2 +- .../src/mage/sets/magic2010/Fireball.java | 2 +- .../sets/magic2010/MasterOfTheWildHunt.java | 2 +- .../mage/sets/magic2010/MerfolkSovereign.java | 2 - .../mage/sets/magic2011/ChandrasOutrage.java | 2 +- .../mage/sets/magic2011/ChandrasSpitfire.java | 10 +- .../src/mage/sets/magic2011/Corrupt.java | 2 +- .../mage/sets/magic2011/CyclopsGladiator.java | 4 +- Mage.Sets/src/mage/sets/magic2011/Fling.java | 2 +- .../mage/sets/magic2011/VengefulArchon.java | 1 + .../src/mage/sets/worldwake/SearingBlaze.java | 4 +- .../effects/ContinuousEffectImpl.java | 28 ++- .../PlaneswalkerRedirectionEffect.java | 4 +- .../abilities/effects/RedirectionEffect.java | 8 +- .../effects/common/BoostControlledEffect.java | 20 +- .../DamageAllControlledTargetEffect.java | 2 +- .../effects/common/DamageAllEffect.java | 2 +- .../common/DamageEverythingEffect.java | 2 +- .../effects/common/DamageMultiEffect.java | 2 +- .../effects/common/DamageTargetEffect.java | 2 +- .../effects/common/DamageXTargetEffect.java | 2 +- .../common/GainAbilityAttachedEffect.java | 3 +- .../common/GainAbilityControlledEffect.java | 213 ++++++++++-------- .../common/GainAbilitySourceEffect.java | 3 +- .../common/GainAbilityTargetEffect.java | 3 +- Mage/src/mage/game/combat/Combat.java | 42 +++- Mage/src/mage/game/combat/CombatGroup.java | 16 +- .../mage/game/events/DamageCreatureEvent.java | 43 ++++ Mage/src/mage/game/events/DamageEvent.java | 54 +++++ .../game/events/DamagePlaneswalkerEvent.java | 43 ++++ .../mage/game/events/DamagePlayerEvent.java | 43 ++++ .../game/events/DamagedCreatureEvent.java | 43 ++++ Mage/src/mage/game/events/DamagedEvent.java | 54 +++++ .../game/events/DamagedPlaneswalkerEvent.java | 43 ++++ .../mage/game/events/DamagedPlayerEvent.java | 43 ++++ Mage/src/mage/game/events/GameEvent.java | 16 +- Mage/src/mage/game/permanent/Permanent.java | 2 +- .../mage/game/permanent/PermanentImpl.java | 22 +- Mage/src/mage/players/PlayerImpl.java | 15 +- 49 files changed, 636 insertions(+), 182 deletions(-) create mode 100644 Mage/src/mage/game/events/DamageCreatureEvent.java create mode 100644 Mage/src/mage/game/events/DamageEvent.java create mode 100644 Mage/src/mage/game/events/DamagePlaneswalkerEvent.java create mode 100644 Mage/src/mage/game/events/DamagePlayerEvent.java create mode 100644 Mage/src/mage/game/events/DamagedCreatureEvent.java create mode 100644 Mage/src/mage/game/events/DamagedEvent.java create mode 100644 Mage/src/mage/game/events/DamagedPlaneswalkerEvent.java create mode 100644 Mage/src/mage/game/events/DamagedPlayerEvent.java diff --git a/Mage.Common/src/mage/view/CombatGroupView.java b/Mage.Common/src/mage/view/CombatGroupView.java index 6f3f929f9fb..2a4c1b698fd 100644 --- a/Mage.Common/src/mage/view/CombatGroupView.java +++ b/Mage.Common/src/mage/view/CombatGroupView.java @@ -31,7 +31,6 @@ package mage.view; import java.io.Serializable; import java.util.UUID; import mage.game.Game; -import mage.game.GameState; import mage.game.combat.CombatGroup; import mage.game.permanent.Permanent; import mage.players.Player; @@ -44,7 +43,7 @@ public class CombatGroupView implements Serializable { private CardsView attackers = new CardsView(); private CardsView blockers = new CardsView(); - private String defenderName; + private String defenderName = ""; public CombatGroupView(CombatGroup combatGroup, Game game) { Player player = game.getPlayer(combatGroup.getDefenderId()); @@ -53,7 +52,8 @@ public class CombatGroupView implements Serializable { } else { Permanent perm = game.getPermanent(combatGroup.getDefenderId()); - this.defenderName = perm.getName(); + if (perm != null) + this.defenderName = perm.getName(); } for (UUID id: combatGroup.getAttackers()) { Permanent attacker = game.getPermanent(id); diff --git a/Mage.Player.AI/src/mage/player/ai/ComputerPlayer.java b/Mage.Player.AI/src/mage/player/ai/ComputerPlayer.java index 8bb239904ef..d96e56fe441 100644 --- a/Mage.Player.AI/src/mage/player/ai/ComputerPlayer.java +++ b/Mage.Player.AI/src/mage/player/ai/ComputerPlayer.java @@ -720,7 +720,7 @@ public class ComputerPlayer> extends PlayerImpl i public void assignDamage(int damage, List targets, UUID sourceId, Game game) { logger.fine("assignDamage"); //TODO: improve this - game.getPermanent(targets.get(0)).damage(damage, sourceId, game, true); + game.getPermanent(targets.get(0)).damage(damage, sourceId, game, true, false); } @Override diff --git a/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Player.Human/src/mage/player/human/HumanPlayer.java index c3a0ad9d447..c51679eaed7 100644 --- a/Mage.Player.Human/src/mage/player/human/HumanPlayer.java +++ b/Mage.Player.Human/src/mage/player/human/HumanPlayer.java @@ -440,7 +440,7 @@ public class HumanPlayer extends PlayerImpl { int damageAmount = getAmount(0, remainingDamage, "Select amount", game); Permanent permanent = game.getPermanent(target.getFirstTarget()); if (permanent != null) { - permanent.damage(damageAmount, sourceId, game, true); + permanent.damage(damageAmount, sourceId, game, true, false); remainingDamage -= damageAmount; } else { diff --git a/Mage.Server/plugins/mage-deck-constructed.jar b/Mage.Server/plugins/mage-deck-constructed.jar index 8a11731b1e0fb81c132b1ac80e244cc5e288d8b2..f41775255bd4b228257dcfe0ee913e0492c15d18 100644 GIT binary patch delta 299 zcmew=@lAp^z?+$civa}Ow^dK%Rbh4mQYKTFLA=unVCtPJh}ta1IFALyn7o};3rs&@ zH3myav8`g_1WMQz%v;b_Jozk#cYU*g0KEnfk*{o{eL?Sag{793 z$qVZ5ugR~xdSc>KA^jh}9=gn2+?chjh5zJ>b1!1*H`U&Lm|M4K^IFphk>5ifCConO z5Ma6Ow^2viGw(*;3Cq6v+KJBLx)T0v{x79M|EeECl0TROycwB9nBm^Aoji@x803-3 vXE^P_PUYh=0Mm|KreL~~%MDB);<5tM|GAvOv@7=>B%g5cq_VYhg2Dy>j+=Ny delta 298 zcmew+@l}F1z?+$civa|F?yC)8WKxFfW_BjCl7Agd#;^$N?i=`6HD>Md_ek-*uxFps8PVF-Z%!ZY&THMirh3gp)A|5!MkWzvxG!uOCePqB0(oTe vSx$SfQ~9|Jz_b&WDVVO}as$(cxvW6+ByMLg*NuA*l1I3CQrX%#K|uom%PoOW diff --git a/Mage.Server/plugins/mage-game-freeforall.jar b/Mage.Server/plugins/mage-game-freeforall.jar index 24f9d2e89f40b314ff9631b2e85936a72fac1ec1..59b39d070874911a7be476a6970043a5b2d6f2dc 100644 GIT binary patch delta 306 zcmZ3Xv_gqDz?+$civa{YwpCB$Rbh4qQYKTFLA=unVCtPJh}ta17{?A~lyfX*1TiMd za%q8SFD_%SL<83bCJvy4ZIgfT*~u2Xp7jU0nj8ceF8n_5=Ws)M>fJ7f4-XWVHpjkU zUp7a~u{`OP*stF;$HRGqj#`}b>6h=FqpBn#tiCH#tzPZ@?8(`$lw+4!SB6`+=zNPb z*|yF~f#vf1-&WhR7T&VpV2X~4`{PsHS3QL}Kj@p~XHGHOE`U#&anAYL<1k)A#R$zK7zcZNr&A$ubpS=Rv0Kj2(=Kufz delta 306 zcmZ3Xv_gqDz?+$civa|F?cL5yY4* z%cTXTy||3Q5)E7%m^gqEwyTtR`X*cOde(2`YBmsHxL{lGzu>`|C7eqYEJ^|jJ*IzS zU-wmtxhH{bhd;=_)rCB3g5XR=>>y{qXbbAUG^lL#~1Ka==O yK>nF*&SwvHXeFNkm|nwY3Z|d%xq@jOeoru6!EXhoxAHrK>EHaj5dPUKkPQGqa)t^3 diff --git a/Mage.Server/plugins/mage-game-twoplayerduel.jar b/Mage.Server/plugins/mage-game-twoplayerduel.jar index cf7a4305be1a9bbac53fd04db57a59bb43036f4a..3cddc1d3e33a12bcf1b55660e998934e3e15ab2e 100644 GIT binary patch delta 307 zcmew=_f?KJz?+$civa{YwpCB$Rbh4qQYKTFLA=unVCtPJh}ta1*vATHEN5H72x3h3 zuu9IU-6#3WZRYmq1XA70&YKIIktMu z{jxQ#wHqg-8!RdOb-`NhrtC!XEd_QtpXOwy?_F!t{F6Drn~_O`8SWEXu$Lyg@aTa& wG`W<=9_-TXJO*I;6^|*HR^s&l)49ApV0sU)6`20X>kOvt`3@jF#Lk}w02t(Y+5i9m delta 307 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 delta 14835 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 Fe*xPGPMH7z diff --git a/Mage.Server/plugins/mage-player-aiminimax.jar b/Mage.Server/plugins/mage-player-aiminimax.jar index 8f800429c12cea0498ca2bcd3d1bfcfd48c78be1..6ec2d2a440a02ef92f5f29c9548cef44a13646d9 100644 GIT binary patch delta 548 zcmex1hw0lKCf)#VW)?065b)SmJ&{+1*&RrkOkoD`PAh<^cj_Q&vIL_Rh~DhV_=pM2 z&|*2t#0wO$wf_|*%fQUQ&_DUDk;-NTc420)ycyRj4KU-ektRfh-^^DQED|4V$O>jm zj$r2oGv+2oKurCSx{HYqWU6Rh(o`W~28LGc$&Os2lldFjH{Z$75(ca0ta;1=X1s5h z4c0cfw;AlZ$-A13!4e;uw=r>mj7fEWa&Gdvwut)GJc%2c*(b_s9s1MwB1to6?UATE z_ji}qTy}4 zD+o-hb_av$>TZbqStu>v;|CTm=m`MRaUGJA@AN2w*pqsl!9s4mdk|s9)t3VRcWT?S delta 548 zcmex1hw0lKCf)#VW)?065cs>JY$C4;^B*8(G6hVXRsd7))Iro_2}Ugtz1fxV5fhl9 z#d4I17bs$D|0_zCfti7!fAU)+mCXw5!pvZKGpwQ@hG)_gTRjqll!^34oOjn6#>l)SDWzTNBR->Ei4%w@uJ~x2|8m=k_4#qGuP?uF;xYa&@Grodkx7IZ9-Ow|aD@_+TiYSw zxW3&Ue-@dJw&^aOxIDy~Cv@|_+<5PMRuGg!#2cMl@WxcYJcU1s?r diff --git a/Mage.Server/plugins/mage-player-human.jar b/Mage.Server/plugins/mage-player-human.jar index 8c98d5ef01ed01428039b358e0850662f40f8642..09b3ca52c528ee21eaf65be47193ab1d072d7912 100644 GIT binary patch delta 7943 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 Stp64G;WM067*uS3cmFR~3pug? delta 8010 zcmZ9Rbx_?sm&b9ZxVE@o94-zQEAHOnUR;Vx`9ZN3cXzqP-6`(wQrsPi7KiQg?Cd+c zn>ooha!%$X|0FY?Gp$=KOjQMV1T>g`3R0VUEG8{H;$HzLz&|&+$Bt0`D`yPZ>_7C%SJL$CoM$hX9B0*HGms!-U>r zcN0>cz`}>U8G?ZyQcOwpZwl8fFMmY(CSj0PqKQaHTwSjfuGO-vt7m)rrFulCw0_a| z)n%Q_2lqt9>vy})gvjm5{tCC(b_cs}>NjW+`~88O16R{8nK1bKx@_Kml9(q6v98|i3P;B^+;?4$wKnrCjf*N?DmQqqmX2fP&P;~s#Wg2hx9d*GJ1T|KbisoUmDBH zE8F)ZIeKDf+vNVI2KlYeJ&wt~+P$aZ;{8uyL4*q;-zR=is#2BVeOPut4U!cX{p0Eo zMpUB{`98)Ma=g8NSLN%zXXaYqpS{lp>n9G09^USQd%<0&b}{;MsZevs3_xB$Mvmtr zh^{ykms8s9JtLL)=cP|PA0hNrm0tJ95WmdznAB~qhmegIXwj7(b#qK|2dnLRZ0hgf z10RTAdo_!kh3U5}qxPZ(c@6?txPN=zGhF&DY-B%JAtV2M;`Ul+iWlX( zBZ9P$n)VK`OPzGYZTqnT3{OyhV5B2{>Nolw){_j$v)snZ$#%!N&*i-i#cSm2**0+g z`d#>yX|#hK{WWe1`SNaZ0~mouquq&Ck+y`Z+})WGBTB!rZa8p8JG76fBA{zx;AzQA z3tXNL(k!TYb>?7rd15C1&X?ggX3UNz*Fd}<)_ms3M{6q)Ra5{lIcCKq2{>`$KN6uK zQrEM-Sb?!EE~Vk78k`tOjY(UJ<~lf4SLe6ZalUCf+Bn{XmLwlV@A8gn|NGY@4BXpIdal5;LMI`*_1(e*NLEVY zp4}q0RoI*Z8ZwYBCQ%(+BnL>BmRp~2n7s`4i;Z?~WPMT++%K;aJGn|iqRyc}Huf-7 z;=qqk;+r*w!j3%WMh4KmJ(75!%xhn9|&oF54@>E=R%q)` z8i9AW2Z~I4%_K2RNKLo12;MXzJmucu1fB$kgtYv+_+{!dkE`IjCQgHIhe4~Viz10G z1AlYM%GwqAf_=VJ<``5|y1&V3PkpjdtES*5c0{Vt9-Kpk)*Z@4qOfFECEb~2lm)W# zvDW3)Q-DmP2&IHrNFwCSi-C`b>eC3xlDIh|fm+rU5kk9SL;Q&T>4~C1Gf5haPApe`0v+a%52 z`9WP^@LBU=N(!m+!%F*wegfl4YWe0L?DxJGL*EvcT-8IpSrOdEhF<8Vu*(P^c=`zf z2va`8aP-t>qv_kn8uNdR=aLphxP(2O0{rjx6+^*t_7{>k&2)Vs3y$;E<~hN6=n#=K4r@*TY&;xW>E^)6Ev1kcermyGPrs!UkJR~*X7d%qH}_u4q(olJqC_qu@LWJhzlCPSu!Stq%9=%=^vV%6 z;Xy&~RPQ&2q!O=Iz2H~@-|nm$RM0?)^N_=h^aw*Evv{0q_E(7DfaZS5mD3p4oMu_6 z_0Oo{pOrcwjk%&LC4k3ZjAIVb23l-ctgA7$C#W%o^Lf9->zqnsjL2V*2XS*j6W!b* zSJ%A6yPi1RD=#7`#im%-vS_!aLBdkIJ3_t9RokZuv3Nxl6RKON-IMU8Q2UP6ZKg|8 z!+^1_Og$2+n-3~@o9kj*tR;~y9BI2#R}XEGo&8)bJYTGU0k{|1b{eLdJQm9+#;Ra%T?Vomr${sX}4!Bp)H1;M{}6a7PT+Ks(h(OmTpNy z`OWwjoC0U5M>9u+LE(lY9L`@SQjTh`UE(1*SUB+~E~nFUHlGDlPKFkyONds`HLQr( zC+`&9N@IAcbp{M@t5?@&R7eS3$X1;5pbEDM^t&&CKdIjrY2nj$sIV2O{{KZNjS&;;qVcPwu z@e|3mJD0zcCi6pqA;%W3dPc%t<`LorzL++F){YphyFfvP`<+4s{z^sDyY0&)-w2J7 z#aqW?dCe4kysZt)E?Hws*YLiv413-7?U_nl66W_VZGFQa(GyvZKIhc830>!`66MwU z!0))G`m?O(IQqD}(iPcGsY#wvD!E6zmfC)Lz}0!9Cgmw1$B23}(OWZd9^MJG8}W7Q zf{*Vv z-JUL~ocDje!p?vgqzidOQpZo>e;DqMOg80b!N$L5bv8%Fedc`4v=+|K4OZC=3+qc!8Vex9y_AaI&NT)?L z1j~WdP$gMGiyB=*6%*TTs=IJqbe-{fy>VRLGVAD@w3yQvbMQ>Yd2-k)icDG{l_+il z({Okryb6=b@g#kNvdGmZwyaZkAYuB=+a!DDhCzX$n}jS;k#grs=Ns8R${`JF*2@{6 zS5&t0?}i+l*>Y`q zQ^Tp&bsM7HkA*^IhNXUE%02eEwi8&~>iEYV++H0)vi6;t&KKuuK)7ZZKq0b>U1h-N zMFm1QsE3l%ukGBPD&N(xeAI>r<<70Vv$DC!pR96ZQ2cZqyR);%-OxDR^hQ+~y>1dR zcgAc6r#XfxoyW;A;hEl@OH6Gwo5!EqD=d=Ub32(wmOU#oHrPwbMEt%};k1Kwko3c} zw^SgPqJrS>XT>i?4ZU8UD}lsm5UEP(A>F9<2jWBKYb|OK?^MGs zFD~!Ib|efgLFr1hDCq7nFRNaa$~?WMCOMUnyF4g6|7(vX5FDa7DXebYA)LnxO9zUs_d6y*E4z+9Mmwnmq+#@(rM>9EDWS< zi3zhN&I$&@eZqN(ocjGvY0PQ3=L+}Rp1N2WvK?NcDtBbQzk(X-+Io(o&C;;lQhVX8 zcT0dS$+dkT&@O2=>0#X90V8ziD>Ray`qLN+L{k!AVo z(2d`O;pEzz6z#`51wQ&k>r~qx7S}WnoXU?$Yhz}dzM+0L6aYN5*LXlFZo5=@?^>_O zA0qjDSbNt_;O?XMbtK9~g+fL&KigIyBHyUfE0G*kO5lx@S=E!m13{7)j!`g^`0ExG z=rC^+*qWzF0kt0BL;K=etY~K(()_y^`>FDOc)x4H#qv-qhI=BGDivy352GPQXJ1um z7C>fcnAbtA_4dlJT;R+wTkYs9d!CZA2>T3;?w#6BC5L|Z?kUc(Feg${{oLec%#ipS zx)O`*Ft{0Y#wXN5F`IX3rKS|>|LqLw=ZcjG%(Q{y&qC!+^Ae3sSxX58xni7!!|5sXKA^)6Lsj3@%t?e?G zSYIghZf|*UzePoVJ(To86vgmRZ6)pVMb^no@9PZxi;ugZP2D%6O>CpCpihM*Sxb|3Y%>eH^w_3Me9`W9{nM8_m7A%-#W@_?^>&RXM_TG*+l8G z*h>ER_vyq#m9JJ(hOAKS`}E`UIr|0F>~;WS!)*!tcq*nl`DJA#s`d}EK0y8N?~dU)2NHI{twm0%AqLte z=rr^IkgW{BWCrwQ5+>{D>XR3`sAgxPdruq}6idyVcQygg`0?Kbhs0yDjT={SDQ(6c zx8jdJHV(luyhLLO!5=^EYbEXw?pqh>vc{44v^Xl_4&fun!090o3&FEw!e@>mgpP>c z=xW!cx)f!K)MZ{B*vzUe)To48Lfp%wwAEQqZMkpYM=4zU8fFLdbR-(qF^iy1uU54|_vxp=7XO1h!9>bp z*a6iN^^98nnsvuOR?tRxuW``4Uhv+cE16OTTwO?}RLI)-~Tdkl|6Czf1O(VAm zNMAUX+84U+UQ<*q1zJ3|%qN7Dj|v5;g!F}CA^_&=o)(M~$+mR$&v0!1VdB$^tq-A(Q&CdC*^WPnjqOv z(GBUAyUA%VM*LM;+x!fRw`}mdf{bKd7c!F*o}AY&A9Tnw#F_iJk3FQ@C=2okD+q^r z(-s+xnoGJ*x2z`UY4on*x@t zOHD5kn=p(`T-d+f2s95Nz{w4N5*Xrj&~i`8^k&}JITmq#C8xs)-OoeG2tBfg0Ga)6 z93hCt)>KbF4Qn-Q$d2O-M^maWm$!MjT$6Igr_Pgaa*<*f7oM z5NMtHC=fh-?-jfg+aXaMs8nvS3y{gWU$d~W-2f{?o8FA}-+Ac;@1+Oq?UU`R^cw;R z=^lJRn)UE*Hl`@D!SXHuS>HV_$Xpb>j9_LTQjKIKf^7ZP5o+s+zB+2MG-7{E>{!Uq zEJEc);ne5W>AoQ0J?Oqy=o)*v5rwYD9feL5vyU*>`DGw_U^Pre08YvPFh_jK*=-v0 z^b)exAVPEwomBqW9Nti{7_y&pJT_nv*!hbaBTCQRLsSR$lNG@y6afM;hG6GSFG|0+ zbJkfNossN6#C;LJZYDZyms;T(VQx2vjPKf7qZ-Mi^Iwb;yB123|qaI z`6APEvxX*z4$5rRl9M9n2kcF01$XSEya+Dd@yk#350}v3rymvbzdvotGx1w?SoD@4 zL23$m8&446Ku-aX7C8irt%q@4^9n{g%5=8|?p>`qAe6jMeTHn+7dZteJi(EVY}Z+{ zZE!VIETEq}F#8eV7G3a$JDp6U&d-Ia1ixWu67>Bwze$($W})EN33z0fG0}HRc5@X? zDrq*DTyd~+zyjaGfE$U@e6Z7eP|}u>$4-B^Jz0I-V{=aJpw)7jo75Ljsk;|2Uk|Z- zS4j3vE1A8aW{5zwCy_}@8I zRzj_A)mlh>^|^UemUXgby%s7erghv=s!C`p(eDYhn>99lG^CWBD>O(*>Bv29yrneS z=+?}@dA)jeIlAv#eo`fC6YUee9s9JOrzi*0j?;NhcmHjh4!9@fN1n_c4wv+B3>zr? z2!=5iRS>|C+~}$DS2o|Lape__W(iyhG0H)|XSClS+Jvy@wmhM&4jL8u+*x@0M^mA- zL3bNr?To_t9|d(JdFvNlNK2I9gCBe$nLot5;c;SjCFlqaAUflZswGe2BVH8Q-@AEynWvGk`!*dgS;8-$pm>4l2A?&2SYoVGZjp(X0RZp2v zd$Z-!1CHsEGloe1!f=P_#Njb_oF%zz!cd)yaS{rdofjm63qHIGG8zLm>AdTzCgPzP zPIYgs2RQ+6bLY+2j>o$1cTt(C3zRIY)Loa{5(*4ofQI&I_W?ZtX>Zy}N}blV>FNSG~oj->aUSVdD}30(uG#mCVg;jLcW{ ztS3sgPD4xYgdVyolqV$u_x;}Y16En~C0E8JSAZILK}YFN7vnXgq&MQs;gT z{2dY$J4Nc4H!U3;`dApIoB2D+hB4RSQ-;sBYF~DlwbBGNUUlE6^_wuwrY4j=#1^Aj z#~i89%=rfyQA*Q2!Ktx;>7Lol73?t204zfBPcexpSJBfi{b4lM&7W32WHO-JIKiFy zqTl+biaEtb<}AI8(Gr<#Zzha^8BAOpy7$6glgExBo0bJT3i?tkGd7fIo(bgQN*4#U z2_6aLw%6}+CqxzKLK%N!ySYviy-|~!+BUcjdJ+cl<=nATqsQhGiFYedUKBRri=s;~ zAL)nbegC;IqaoO^yOmWv0ub{!V~L*1kRGeX6I2q3Y%9|DabC zn7??nwx2Qy?jODyZ$tz7S0iY+|K+XSG?{Rye?3G-YYR%8;;rZ<0S$MRF$Gq67C9v~ z*%HljB^HIT?OpXhV-p(ZBkUR+T*?EzczP z-mX0RFgxqHV)Yoi{KANmqRQ^BJPT+@Q9+Rn7VQBJ(G~tPF0)3stBAY{UVtS$jH&`G z96tPiFmXH+1Na|K9B<4Z`Y#&JW8nB#=NS0@RV+r4e~+NTsQUj%aT()#ihs_6k%Y*j z1qTB&i3kHj|1W<2@1`K2D;|r9NBLc^hIxI}rGbG_lF}4sl~a~xw>NRO zaA5y`DgK{e;{OvI8lS_&@Nas`b bmH$6Gz`zs)7|{Q96pUX4VI$En{Il|3@<<<+ diff --git a/Mage.Sets/src/mage/sets/alarareborn/VengefulRebirth.java b/Mage.Sets/src/mage/sets/alarareborn/VengefulRebirth.java index 17676d23c5b..3a588d01367 100644 --- a/Mage.Sets/src/mage/sets/alarareborn/VengefulRebirth.java +++ b/Mage.Sets/src/mage/sets/alarareborn/VengefulRebirth.java @@ -103,7 +103,7 @@ class VengefulRebirthEffect extends OneShotEffect { if (!card.getCardType().contains(CardType.LAND)) { Permanent permanent = game.getPermanent(source.getTargets().get(1).getTargets().get(0)); if (permanent != null) { - permanent.damage(damage, source.getSourceId(), game, true); + permanent.damage(damage, source.getSourceId(), game, true, false); return true; } Player targetPlayer = game.getPlayer(source.getTargets().get(1).getTargets().get(0)); diff --git a/Mage.Sets/src/mage/sets/magic2010/Earthquake.java b/Mage.Sets/src/mage/sets/magic2010/Earthquake.java index 4a98ddc3a2c..81423c5d424 100644 --- a/Mage.Sets/src/mage/sets/magic2010/Earthquake.java +++ b/Mage.Sets/src/mage/sets/magic2010/Earthquake.java @@ -96,7 +96,7 @@ class EarthquakeEffect extends OneShotEffect { int amount = source.getManaCosts().getVariableCosts().get(0).getAmount(); for (Permanent permanent: game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) { - permanent.damage(amount, source.getId(), game, true); + permanent.damage(amount, source.getId(), game, true, false); } for (UUID playerId: game.getPlayer(source.getControllerId()).getInRange()) { Player player = game.getPlayer(playerId); diff --git a/Mage.Sets/src/mage/sets/magic2010/Fireball.java b/Mage.Sets/src/mage/sets/magic2010/Fireball.java index 0d4fb9d3d98..202699ad8fe 100644 --- a/Mage.Sets/src/mage/sets/magic2010/Fireball.java +++ b/Mage.Sets/src/mage/sets/magic2010/Fireball.java @@ -98,7 +98,7 @@ class FireballEffect extends OneShotEffect { for (UUID targetId: source.getTargets().get(0).getTargets()) { Permanent permanent = game.getPermanent(targetId); if (permanent != null) { - permanent.damage(damagePer, source.getSourceId(), game, true); + permanent.damage(damagePer, source.getSourceId(), game, true, false); } else { Player player = game.getPlayer(targetId); diff --git a/Mage.Sets/src/mage/sets/magic2010/MasterOfTheWildHunt.java b/Mage.Sets/src/mage/sets/magic2010/MasterOfTheWildHunt.java index 2ed7826de80..52feb09a9fe 100644 --- a/Mage.Sets/src/mage/sets/magic2010/MasterOfTheWildHunt.java +++ b/Mage.Sets/src/mage/sets/magic2010/MasterOfTheWildHunt.java @@ -119,7 +119,7 @@ class MasterOfTheWildHuntEffect extends OneShotEffect if (target != null && game.getBattlefield().countAll(filter, source.getControllerId()) > 0) { for (Permanent permanent: game.getBattlefield().getAllActivePermanents(filter, source.getControllerId())) { permanent.tap(game); - target.damage(permanent.getToughness().getValue(), permanent.getId(), game, true); + target.damage(permanent.getToughness().getValue(), permanent.getId(), game, true, false); wolves.add(permanent.getId()); } Player player = game.getPlayer(target.getControllerId()); diff --git a/Mage.Sets/src/mage/sets/magic2010/MerfolkSovereign.java b/Mage.Sets/src/mage/sets/magic2010/MerfolkSovereign.java index 0c5d968a5f7..dd7f6ff4982 100644 --- a/Mage.Sets/src/mage/sets/magic2010/MerfolkSovereign.java +++ b/Mage.Sets/src/mage/sets/magic2010/MerfolkSovereign.java @@ -39,9 +39,7 @@ import mage.abilities.common.SimpleActivatedAbility; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.costs.common.TapSourceCost; import mage.abilities.effects.common.BoostControlledEffect; -import mage.abilities.effects.common.GainAbilityControlledEffect; import mage.abilities.effects.common.GainAbilityTargetEffect; -import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.UnblockableAbility; import mage.cards.CardImpl; import mage.filter.common.FilterCreaturePermanent; diff --git a/Mage.Sets/src/mage/sets/magic2011/ChandrasOutrage.java b/Mage.Sets/src/mage/sets/magic2011/ChandrasOutrage.java index 69ed657fb34..481cbe5b657 100644 --- a/Mage.Sets/src/mage/sets/magic2011/ChandrasOutrage.java +++ b/Mage.Sets/src/mage/sets/magic2011/ChandrasOutrage.java @@ -86,7 +86,7 @@ class ChandrasOutrageEffect extends OneShotEffect { if (permanent != null) { Player player = game.getPlayer(permanent.getControllerId()); if (player != null) { - permanent.damage(4, source.getSourceId(), game, true); + permanent.damage(4, source.getSourceId(), game, true, false); player.damage(2, source.getSourceId(), game, false, true); return true; } diff --git a/Mage.Sets/src/mage/sets/magic2011/ChandrasSpitfire.java b/Mage.Sets/src/mage/sets/magic2011/ChandrasSpitfire.java index f6e095a6d3e..8014e6b9122 100644 --- a/Mage.Sets/src/mage/sets/magic2011/ChandrasSpitfire.java +++ b/Mage.Sets/src/mage/sets/magic2011/ChandrasSpitfire.java @@ -41,6 +41,7 @@ import mage.abilities.effects.common.BoostSourceEffect; import mage.abilities.keyword.FlyingAbility; import mage.cards.CardImpl; import mage.game.Game; +import mage.game.events.DamagedPlayerEvent; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; @@ -90,9 +91,12 @@ class ChandrasSpitfireAbility extends TriggeredAbilityImpl { int damageDealt = amount; Permanent permanent = game.getPermanent(source.getFirstTarget()); if (permanent != null) { - damageDealt = permanent.damage(amount, source.getSourceId(), game, true); + damageDealt = permanent.damage(amount, source.getSourceId(), game, true, false); } else { Player player = game.getPlayer(source.getFirstTarget()); diff --git a/Mage.Sets/src/mage/sets/magic2011/CyclopsGladiator.java b/Mage.Sets/src/mage/sets/magic2011/CyclopsGladiator.java index 5ccb698b88d..6cdf2eb217e 100644 --- a/Mage.Sets/src/mage/sets/magic2011/CyclopsGladiator.java +++ b/Mage.Sets/src/mage/sets/magic2011/CyclopsGladiator.java @@ -107,8 +107,8 @@ class CyclopsGladiatorEffect extends OneShotEffect { Permanent permanent = game.getPermanent(target.getFirstTarget()); Permanent cyclops = game.getPermanent(source.getSourceId()); if (permanent != null && cyclops != null) { - permanent.damage(cyclops.getPower().getValue(), cyclops.getId(), game, true); - cyclops.damage(permanent.getPower().getValue(), permanent.getId(), game, true); + permanent.damage(cyclops.getPower().getValue(), cyclops.getId(), game, true, false); + cyclops.damage(permanent.getPower().getValue(), permanent.getId(), game, true, false); return true; } } diff --git a/Mage.Sets/src/mage/sets/magic2011/Fling.java b/Mage.Sets/src/mage/sets/magic2011/Fling.java index 76c2b94cb0b..76ba7a74ae1 100644 --- a/Mage.Sets/src/mage/sets/magic2011/Fling.java +++ b/Mage.Sets/src/mage/sets/magic2011/Fling.java @@ -95,7 +95,7 @@ class FlingEffect extends OneShotEffect { if (amount > 0) { Permanent permanent = game.getPermanent(source.getFirstTarget()); if (permanent != null) { - permanent.damage(amount, source.getSourceId(), game, true); + permanent.damage(amount, source.getSourceId(), game, true, false); return true; } Player player = game.getPlayer(source.getFirstTarget()); diff --git a/Mage.Sets/src/mage/sets/magic2011/VengefulArchon.java b/Mage.Sets/src/mage/sets/magic2011/VengefulArchon.java index f4a3b15d9ef..c2474954af4 100644 --- a/Mage.Sets/src/mage/sets/magic2011/VengefulArchon.java +++ b/Mage.Sets/src/mage/sets/magic2011/VengefulArchon.java @@ -101,6 +101,7 @@ class VengefulArchonEffect extends PreventionEffectImpl { @Override public void init(Ability source, Game game) { + super.init(source, game); if (source.getManaCosts().getVariableCosts().size() > 0) amount = source.getManaCosts().getVariableCosts().get(0).getAmount(); } diff --git a/Mage.Sets/src/mage/sets/worldwake/SearingBlaze.java b/Mage.Sets/src/mage/sets/worldwake/SearingBlaze.java index c67881e64f0..c53b2a9145d 100644 --- a/Mage.Sets/src/mage/sets/worldwake/SearingBlaze.java +++ b/Mage.Sets/src/mage/sets/worldwake/SearingBlaze.java @@ -132,7 +132,7 @@ class SearingBlazeEffect extends OneShotEffect { player.damage(3, source.getId(), game, false, true); } if (creature != null) { - creature.damage(3, source.getId(), game, true); + creature.damage(3, source.getId(), game, true, false); } } else { @@ -140,7 +140,7 @@ class SearingBlazeEffect extends OneShotEffect { player.damage(1, source.getId(), game, false, true); } if (creature != null) { - creature.damage(1, source.getId(), game, true); + creature.damage(1, source.getId(), game, true, false); } } return true; diff --git a/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java b/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java index 9ed1ee404a4..0f1f956b242 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java @@ -28,13 +28,17 @@ package mage.abilities.effects; +import java.util.ArrayList; import java.util.Date; +import java.util.List; +import java.util.UUID; import mage.Constants.Duration; import mage.Constants.EffectType; import mage.Constants.Layer; import mage.Constants.Outcome; import mage.Constants.SubLayer; import mage.abilities.Ability; +import mage.abilities.ActivatedAbility; import mage.game.Game; /** @@ -48,6 +52,8 @@ public abstract class ContinuousEffectImpl> ex protected SubLayer sublayer; protected Date timestamp; protected boolean used = false; + protected boolean affectedObjectsSet = false; + protected List objects = new ArrayList(); public ContinuousEffectImpl(Duration duration, Outcome outcome) { super(outcome); @@ -62,13 +68,17 @@ public abstract class ContinuousEffectImpl> ex this.sublayer = sublayer; } - public ContinuousEffectImpl(final ContinuousEffectImpl effect) { + public ContinuousEffectImpl(final ContinuousEffectImpl effect) { super(effect); this.duration = effect.duration; this.layer = effect.layer; this.sublayer = effect.sublayer; this.timestamp = new Date(effect.timestamp.getTime()); this.used = effect.used; + this.affectedObjectsSet = effect.affectedObjectsSet; + for (UUID objectId: effect.objects) { + this.objects.add(objectId); + } } @Override @@ -105,6 +115,20 @@ public abstract class ContinuousEffectImpl> ex } @Override - public void init(Ability source, Game game) {} + public void init(Ability source, Game game) { + //20100716 - 611.2c + if (source instanceof ActivatedAbility) { + switch (layer) { + case CopyEffects_1: + case ControlChangingEffects_2: + case TextChangingEffects_3: + case TypeChangingEffects_4: + case ColorChangingEffects_5: + case AbilityAddingRemovingEffects_6: + case PTChangingEffects_7: + this.affectedObjectsSet = true; + } + } + } } diff --git a/Mage/src/mage/abilities/effects/PlaneswalkerRedirectionEffect.java b/Mage/src/mage/abilities/effects/PlaneswalkerRedirectionEffect.java index ca7e2ab30df..2906b732301 100644 --- a/Mage/src/mage/abilities/effects/PlaneswalkerRedirectionEffect.java +++ b/Mage/src/mage/abilities/effects/PlaneswalkerRedirectionEffect.java @@ -34,6 +34,7 @@ import mage.Constants.Outcome; import mage.abilities.Ability; import mage.filter.common.FilterPlaneswalkerPermanent; import mage.game.Game; +import mage.game.events.DamageEvent; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.game.permanent.Permanent; @@ -65,8 +66,9 @@ public class PlaneswalkerRedirectionEffect extends RedirectionEffect> extends @Override public boolean replaceEvent(GameEvent event, Ability source, Game game) { + DamageEvent damageEvent = (DamageEvent)event; Permanent permanent = game.getPermanent(redirectTarget.getFirstTarget()); - Ability damageSource = getSource(event.getSourceId(), game); + Ability damageSource = getSource(damageEvent.getSourceId(), game); if (permanent != null) { - permanent.damage(event.getAmount(), damageSource.getId(), game, event.getFlag()); + permanent.damage(damageEvent.getAmount(), damageSource.getId(), game, damageEvent.isPreventable(), damageEvent.isCombatDamage()); return true; } Player player = game.getPlayer(redirectTarget.getFirstTarget()); if (player != null) { - player.damage(event.getAmount(), damageSource.getId(), game, false, event.getFlag()); + player.damage(damageEvent.getAmount(), damageSource.getId(), game, damageEvent.isCombatDamage(), damageEvent.isPreventable()); return true; } return false; diff --git a/Mage/src/mage/abilities/effects/common/BoostControlledEffect.java b/Mage/src/mage/abilities/effects/common/BoostControlledEffect.java index cdd49eaeda4..113694875af 100644 --- a/Mage/src/mage/abilities/effects/common/BoostControlledEffect.java +++ b/Mage/src/mage/abilities/effects/common/BoostControlledEffect.java @@ -78,12 +78,26 @@ public class BoostControlledEffect extends ContinuousEffectImpl { @Override public boolean apply(Game game, Ability source) { for (Permanent permanent: game.getBattlefield().getActivePermanents(filter, source.getControllerId(), game)) { - permanent.damage(amount, source.getId(), game, true); + permanent.damage(amount, source.getId(), game, true, false); } return true; } diff --git a/Mage/src/mage/abilities/effects/common/DamageEverythingEffect.java b/Mage/src/mage/abilities/effects/common/DamageEverythingEffect.java index 971505bbcd0..6b819d39f5f 100644 --- a/Mage/src/mage/abilities/effects/common/DamageEverythingEffect.java +++ b/Mage/src/mage/abilities/effects/common/DamageEverythingEffect.java @@ -63,7 +63,7 @@ public class DamageEverythingEffect extends OneShotEffect { for (UUID target: multiTarget.getTargets()) { Permanent permanent = game.getPermanent(target); if (permanent != null) { - permanent.damage(multiTarget.getTargetAmount(target), source.getId(), game, true); + permanent.damage(multiTarget.getTargetAmount(target), source.getId(), game, true, false); } else { Player player = game.getPlayer(target); diff --git a/Mage/src/mage/abilities/effects/common/DamageTargetEffect.java b/Mage/src/mage/abilities/effects/common/DamageTargetEffect.java index 872df05f36c..3de36a38652 100644 --- a/Mage/src/mage/abilities/effects/common/DamageTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/DamageTargetEffect.java @@ -73,7 +73,7 @@ public class DamageTargetEffect extends OneShotEffect { public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getFirstTarget()); if (permanent != null) { - permanent.damage(amount, source.getId(), game, preventable); + permanent.damage(amount, source.getId(), game, preventable, false); return true; } Player player = game.getPlayer(source.getFirstTarget()); diff --git a/Mage/src/mage/abilities/effects/common/DamageXTargetEffect.java b/Mage/src/mage/abilities/effects/common/DamageXTargetEffect.java index 2f08285e395..d3e0e016ba2 100644 --- a/Mage/src/mage/abilities/effects/common/DamageXTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/DamageXTargetEffect.java @@ -59,7 +59,7 @@ public class DamageXTargetEffect extends OneShotEffect { int amount = source.getManaCosts().getVariableCosts().get(0).getAmount(); Permanent permanent = game.getPermanent(source.getFirstTarget()); if (permanent != null) { - permanent.damage(amount, source.getId(), game, true); + permanent.damage(amount, source.getId(), game, true, false); return true; } Player player = game.getPlayer(source.getFirstTarget()); diff --git a/Mage/src/mage/abilities/effects/common/GainAbilityAttachedEffect.java b/Mage/src/mage/abilities/effects/common/GainAbilityAttachedEffect.java index 2b3bdd467dd..262c328ba79 100644 --- a/Mage/src/mage/abilities/effects/common/GainAbilityAttachedEffect.java +++ b/Mage/src/mage/abilities/effects/common/GainAbilityAttachedEffect.java @@ -66,8 +66,7 @@ public class GainAbilityAttachedEffect extends ContinuousEffectImpl { - - protected Ability ability; - protected boolean excludeSource; - protected FilterPermanent permanentFilter; - - public GainAbilityControlledEffect(Ability ability, Duration duration) { - this(ability, duration, new FilterPermanent()); - } - - public GainAbilityControlledEffect(Ability ability, Duration duration, FilterPermanent filter) { - this(ability, duration, filter, false); - } - - public GainAbilityControlledEffect(Ability ability, Duration duration, FilterPermanent filter, boolean excludeSource) { - super(duration, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); - this.ability = ability; - this.permanentFilter = filter; - this.excludeSource = excludeSource; - } - - public GainAbilityControlledEffect(final GainAbilityControlledEffect effect) { - super(effect); - this.ability = effect.ability.copy(); - this.permanentFilter = effect.permanentFilter.copy(); - this.excludeSource = effect.excludeSource; - } - - @Override - public GainAbilityControlledEffect copy() { - return new GainAbilityControlledEffect(this); - } - - @Override - public boolean apply(Game game, Ability source) { - for (Permanent perm: game.getBattlefield().getAllActivePermanents(permanentFilter, source.getControllerId())) { - if (!(excludeSource && perm.getId().equals(source.getSourceId()))) { - perm.addAbility(ability.copy()); - } - } - return true; - } - - @Override - public String getText(Ability source) { - StringBuilder sb = new StringBuilder(); - if (excludeSource) - sb.append("Other "); - sb.append(permanentFilter.getMessage()).append(" you control gain ").append(ability.getRule()); - sb.append(" ").append(duration.toString()); - return sb.toString(); - } - -} +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.abilities.effects.common; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import mage.Constants.Duration; +import mage.Constants.Layer; +import mage.Constants.Outcome; +import mage.Constants.SubLayer; +import mage.abilities.Ability; +import mage.abilities.effects.ContinuousEffectImpl; +import mage.filter.FilterPermanent; +import mage.game.Game; +import mage.game.permanent.Permanent; + +/** + * + * @author BetaSteward_at_googlemail.com + */ +public class GainAbilityControlledEffect extends ContinuousEffectImpl { + + protected Ability ability; + protected boolean excludeSource; + protected FilterPermanent filter; + + public GainAbilityControlledEffect(Ability ability, Duration duration) { + this(ability, duration, new FilterPermanent()); + } + + public GainAbilityControlledEffect(Ability ability, Duration duration, FilterPermanent filter) { + this(ability, duration, filter, false); + } + + public GainAbilityControlledEffect(Ability ability, Duration duration, FilterPermanent filter, boolean excludeSource) { + super(duration, Layer.AbilityAddingRemovingEffects_6, SubLayer.NA, Outcome.AddAbility); + this.ability = ability; + this.filter = filter; + this.excludeSource = excludeSource; + } + + public GainAbilityControlledEffect(final GainAbilityControlledEffect effect) { + super(effect); + this.ability = effect.ability.copy(); + this.filter = effect.filter.copy(); + this.excludeSource = effect.excludeSource; + } + + @Override + public void init(Ability source, Game game) { + super.init(source, game); + if (this.affectedObjectsSet) { + for (Permanent perm: game.getBattlefield().getAllActivePermanents(filter, source.getControllerId())) { + if (!(excludeSource && perm.getId().equals(source.getSourceId()))) { + objects.add(perm.getId()); + } + } + } + } + + @Override + public GainAbilityControlledEffect copy() { + return new GainAbilityControlledEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + for (Permanent perm: game.getBattlefield().getAllActivePermanents(filter, source.getControllerId())) { + if (!this.affectedObjectsSet || objects.contains(perm.getId())) { + if (!(excludeSource && perm.getId().equals(source.getSourceId()))) { + perm.addAbility(ability.copy()); + } + } + } + return true; + } + + @Override + public String getText(Ability source) { + StringBuilder sb = new StringBuilder(); + if (excludeSource) + sb.append("Other "); + sb.append(filter.getMessage()).append(" you control gain ").append(ability.getRule()); + sb.append(" ").append(duration.toString()); + return sb.toString(); + } + +} diff --git a/Mage/src/mage/abilities/effects/common/GainAbilitySourceEffect.java b/Mage/src/mage/abilities/effects/common/GainAbilitySourceEffect.java index 8bed43abcda..78a29109088 100644 --- a/Mage/src/mage/abilities/effects/common/GainAbilitySourceEffect.java +++ b/Mage/src/mage/abilities/effects/common/GainAbilitySourceEffect.java @@ -64,8 +64,7 @@ public class GainAbilitySourceEffect extends ContinuousEffectImpl { + private static FilterPlaneswalkerPermanent filterPlaneswalker = new FilterPlaneswalkerPermanent(); + protected List groups = new ArrayList(); protected Set defenders = new HashSet(); protected UUID attackerId; @@ -118,12 +121,9 @@ public class Combat implements Serializable, Copyable { public void selectBlockers(Game game) { if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.DECLARING_BLOCKERS, attackerId, attackerId))) { - for (UUID defenderId: defenders) { - //check if defender is being attacked - if (isAttacked(defenderId, game)) { - game.getPlayer(defenderId).selectBlockers(game); - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.DECLARED_BLOCKERS, defenderId, defenderId)); - } + for (UUID defenderId: getPlayerDefenders(game)) { + game.getPlayer(defenderId).selectBlockers(game); + game.fireEvent(GameEvent.getEvent(GameEvent.EventType.DECLARED_BLOCKERS, defenderId, defenderId)); } } } @@ -137,7 +137,7 @@ public class Combat implements Serializable, Copyable { while (true) { Player opponent = players.getNext(game); if (opponents.contains(opponent.getId())) { - defenders.add(opponent.getId()); + addDefender(opponent.getId(), game); break; } } @@ -147,17 +147,26 @@ public class Combat implements Serializable, Copyable { while (true) { Player opponent = players.getPrevious(game); if (opponents.contains(opponent.getId())) { - defenders.add(opponent.getId()); + addDefender(opponent.getId(), game); break; } } break; case MULITPLE: - defenders.addAll(game.getOpponents(attackerId)); + for (UUID opponentId: game.getOpponents(attackerId)) { + addDefender(opponentId, game); + } break; } } + private void addDefender(UUID defenderId, Game game) { + defenders.add(defenderId); + for (Permanent permanent: game.getBattlefield().getAllActivePermanents(filterPlaneswalker, defenderId)) { + defenders.add(permanent.getId()); + } + } + public void declareAttacker(UUID attackerId, UUID defenderId, Game game) { if (!defenders.contains(defenderId)) return; @@ -252,6 +261,21 @@ public class Combat implements Serializable, Copyable { return false; } + private Set getPlayerDefenders(Game game) { + Set playerDefenders = new HashSet(); + for (CombatGroup group: groups) { + if (group.defenderIsPlaneswalker) { + Permanent permanent = game.getPermanent(group.getDefenderId()); + if (permanent != null) + playerDefenders.add(permanent.getControllerId()); + } + else { + playerDefenders.add(group.getDefenderId()); + } + } + return playerDefenders; + } + public void damageAssignmentOrder(Game game) { //TODO: set damage assignment order } diff --git a/Mage/src/mage/game/combat/CombatGroup.java b/Mage/src/mage/game/combat/CombatGroup.java index 43dafe1b0ca..de1028618e7 100644 --- a/Mage/src/mage/game/combat/CombatGroup.java +++ b/Mage/src/mage/game/combat/CombatGroup.java @@ -171,23 +171,23 @@ public class CombatGroup implements Serializable, Copyable { if (hasTrample(attacker)) { int lethalDamage = blocker.getToughness().getValue() - blocker.getDamage(); if (lethalDamage >= damage) { - blocker.damage(damage, attacker.getId(), game, true); + blocker.damage(damage, attacker.getId(), game, true, true); } else { Player player = game.getPlayer(attacker.getControllerId()); int damageAssigned = player.getAmount(lethalDamage, damage, "Assign damage to " + blocker.getName(), game); - blocker.damage(damageAssigned, attacker.getId(), game, true); + blocker.damage(damageAssigned, attacker.getId(), game, true, true); damage -= damageAssigned; if (damage > 0) defenderDamage(attacker, damage, game); } } else { - blocker.damage(damage, attacker.getId(), game, true); + blocker.damage(damage, attacker.getId(), game, true, true); } } if (canDamage(blocker, first)) { - attacker.damage(blocker.getPower().getValue(), blocker.getId(), game, true); + attacker.damage(blocker.getPower().getValue(), blocker.getId(), game, true, true); } } } @@ -202,12 +202,12 @@ public class CombatGroup implements Serializable, Copyable { Permanent blocker = game.getPermanent(blockerId); int lethalDamage = blocker.getToughness().getValue() - blocker.getDamage(); if (lethalDamage >= damage) { - blocker.damage(damage, attacker.getId(), game, true); + blocker.damage(damage, attacker.getId(), game, true, true); damage = 0; break; } int damageAssigned = player.getAmount(lethalDamage, damage, "Assign damage to " + blocker.getName(), game); - blocker.damage(damageAssigned, attacker.getId(), game, true); + blocker.damage(damageAssigned, attacker.getId(), game, true, true); damage -= damageAssigned; } if (damage > 0 && hasTrample(attacker)) { @@ -216,7 +216,7 @@ public class CombatGroup implements Serializable, Copyable { for (UUID blockerId: blockerOrder) { Permanent blocker = game.getPermanent(blockerId); if (canDamage(blocker, first)) { - attacker.damage(blocker.getPower().getValue(), blocker.getId(), game, true); + attacker.damage(blocker.getPower().getValue(), blocker.getId(), game, true, true); } } } @@ -226,7 +226,7 @@ public class CombatGroup implements Serializable, Copyable { if (this.defenderIsPlaneswalker) { Permanent defender = game.getPermanent(defenderId); if (defender != null) { - defender.damage(amount, attacker.getId(), game, true); + defender.damage(amount, attacker.getId(), game, true, true); } } else { diff --git a/Mage/src/mage/game/events/DamageCreatureEvent.java b/Mage/src/mage/game/events/DamageCreatureEvent.java new file mode 100644 index 00000000000..7110ad3d233 --- /dev/null +++ b/Mage/src/mage/game/events/DamageCreatureEvent.java @@ -0,0 +1,43 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.game.events; + +import java.util.UUID; + +/** + * + * @author BetaSteward_at_googlemail.com + */ +public class DamageCreatureEvent extends DamageEvent { + + public DamageCreatureEvent(UUID targetId, UUID sourceId, UUID playerId, int amount, boolean preventable, boolean combat) { + super(EventType.DAMAGE_CREATURE, targetId, sourceId, playerId, amount, preventable, combat); + } + +} diff --git a/Mage/src/mage/game/events/DamageEvent.java b/Mage/src/mage/game/events/DamageEvent.java new file mode 100644 index 00000000000..47e8b5fd821 --- /dev/null +++ b/Mage/src/mage/game/events/DamageEvent.java @@ -0,0 +1,54 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.game.events; + +import java.util.UUID; + +/** + * + * @author BetaSteward_at_googlemail.com + */ +public abstract class DamageEvent extends GameEvent { + + protected boolean combat; + + public DamageEvent(EventType type, UUID targetId, UUID sourceId, UUID playerId, int amount, boolean preventable, boolean combat) { + super(type, targetId, sourceId, playerId, amount, preventable); + this.combat = combat; + } + + public boolean isCombatDamage() { + return combat; + } + + public boolean isPreventable() { + return flag; + } + +} diff --git a/Mage/src/mage/game/events/DamagePlaneswalkerEvent.java b/Mage/src/mage/game/events/DamagePlaneswalkerEvent.java new file mode 100644 index 00000000000..cf3414bba70 --- /dev/null +++ b/Mage/src/mage/game/events/DamagePlaneswalkerEvent.java @@ -0,0 +1,43 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.game.events; + +import java.util.UUID; + +/** + * + * @author BetaSteward_at_googlemail.com + */ +public class DamagePlaneswalkerEvent extends DamageEvent { + + public DamagePlaneswalkerEvent(UUID targetId, UUID sourceId, UUID playerId, int amount, boolean preventable, boolean combat) { + super(EventType.DAMAGE_PLANESWALKER, targetId, sourceId, playerId, amount, preventable, combat); + } + +} diff --git a/Mage/src/mage/game/events/DamagePlayerEvent.java b/Mage/src/mage/game/events/DamagePlayerEvent.java new file mode 100644 index 00000000000..c25f60c8e97 --- /dev/null +++ b/Mage/src/mage/game/events/DamagePlayerEvent.java @@ -0,0 +1,43 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.game.events; + +import java.util.UUID; + +/** + * + * @author BetaSteward_at_googlemail.com + */ +public class DamagePlayerEvent extends DamageEvent { + + public DamagePlayerEvent(UUID targetId, UUID sourceId, UUID playerId, int amount, boolean preventable, boolean combat) { + super(EventType.DAMAGE_PLAYER, targetId, sourceId, playerId, amount, preventable, combat); + } + +} diff --git a/Mage/src/mage/game/events/DamagedCreatureEvent.java b/Mage/src/mage/game/events/DamagedCreatureEvent.java new file mode 100644 index 00000000000..11075283e37 --- /dev/null +++ b/Mage/src/mage/game/events/DamagedCreatureEvent.java @@ -0,0 +1,43 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.game.events; + +import java.util.UUID; + +/** + * + * @author BetaSteward_at_googlemail.com + */ +public class DamagedCreatureEvent extends DamagedEvent { + + public DamagedCreatureEvent(UUID targetId, UUID sourceId, UUID playerId, int amount, boolean combat) { + super(EventType.DAMAGED_CREATURE, targetId, sourceId, playerId, amount, combat); + } + +} diff --git a/Mage/src/mage/game/events/DamagedEvent.java b/Mage/src/mage/game/events/DamagedEvent.java new file mode 100644 index 00000000000..03f31209be6 --- /dev/null +++ b/Mage/src/mage/game/events/DamagedEvent.java @@ -0,0 +1,54 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.game.events; + +import java.util.UUID; + +/** + * + * @author BetaSteward_at_googlemail.com + */ +public abstract class DamagedEvent extends GameEvent { + + protected boolean combat; + + public DamagedEvent(EventType type, UUID targetId, UUID sourceId, UUID playerId, int amount, boolean combat) { + super(type, targetId, sourceId, playerId, amount, false); + this.combat = combat; + } + + public boolean isCombatDamage() { + return combat; + } + + public boolean isPreventable() { + return flag; + } + +} diff --git a/Mage/src/mage/game/events/DamagedPlaneswalkerEvent.java b/Mage/src/mage/game/events/DamagedPlaneswalkerEvent.java new file mode 100644 index 00000000000..f15e237aff4 --- /dev/null +++ b/Mage/src/mage/game/events/DamagedPlaneswalkerEvent.java @@ -0,0 +1,43 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.game.events; + +import java.util.UUID; + +/** + * + * @author BetaSteward_at_googlemail.com + */ +public class DamagedPlaneswalkerEvent extends DamagedEvent { + + public DamagedPlaneswalkerEvent(UUID targetId, UUID sourceId, UUID playerId, int amount, boolean combat) { + super(EventType.DAMAGED_PLANESWALKER, targetId, sourceId, playerId, amount, combat); + } + +} diff --git a/Mage/src/mage/game/events/DamagedPlayerEvent.java b/Mage/src/mage/game/events/DamagedPlayerEvent.java new file mode 100644 index 00000000000..172f8edaaea --- /dev/null +++ b/Mage/src/mage/game/events/DamagedPlayerEvent.java @@ -0,0 +1,43 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ + +package mage.game.events; + +import java.util.UUID; + +/** + * + * @author BetaSteward_at_googlemail.com + */ +public class DamagedPlayerEvent extends DamagedEvent { + + public DamagedPlayerEvent(UUID targetId, UUID sourceId, UUID playerId, int amount, boolean combat) { + super(EventType.DAMAGED_PLAYER, targetId, sourceId, playerId, amount, combat); + } + +} diff --git a/Mage/src/mage/game/events/GameEvent.java b/Mage/src/mage/game/events/GameEvent.java index 8d480c3be32..1379509af83 100644 --- a/Mage/src/mage/game/events/GameEvent.java +++ b/Mage/src/mage/game/events/GameEvent.java @@ -36,13 +36,13 @@ import java.util.UUID; */ public class GameEvent { - private EventType type; - private UUID targetId; - private UUID sourceId; - private UUID playerId; - private int amount; - private boolean flag; - private String data; + protected EventType type; + protected UUID targetId; + protected UUID sourceId; + protected UUID playerId; + protected int amount; + protected boolean flag; + protected String data; public enum EventType { @@ -79,8 +79,6 @@ public class GameEvent { DISCARDED_CARD, CYCLE_CARD, CYCLED_CARD, DAMAGE_PLAYER, DAMAGED_PLAYER, - COMBAT_DAMAGE_PLAYER, COMBAT_DAMAGED_PLAYER, - NONCOMBAT_DAMAGE_PLAYER, NONCOMBAT_DAMAGED_PLAYER, PLAYER_LIFE_CHANGE, GAIN_LIFE, GAINED_LIFE, LOSE_LIFE, LOST_LIFE, diff --git a/Mage/src/mage/game/permanent/Permanent.java b/Mage/src/mage/game/permanent/Permanent.java index 51a8d1b36ed..c34de155501 100644 --- a/Mage/src/mage/game/permanent/Permanent.java +++ b/Mage/src/mage/game/permanent/Permanent.java @@ -70,7 +70,7 @@ public interface Permanent extends Card { public boolean hasProtectionFrom(MageObject source); public boolean hasSummoningSickness(); public int getDamage(); - public int damage(int damage, UUID sourceId, Game game, boolean preventable); + public int damage(int damage, UUID sourceId, Game game, boolean preventable, boolean combat); public void removeAllDamage(Game game); public Counters getCounters(); public void addCounters(String name, int amount); diff --git a/Mage/src/mage/game/permanent/PermanentImpl.java b/Mage/src/mage/game/permanent/PermanentImpl.java index 9f24584760a..ddeaf18d7fb 100644 --- a/Mage/src/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/mage/game/permanent/PermanentImpl.java @@ -48,6 +48,10 @@ import mage.cards.CardImpl; import mage.counters.Counter; import mage.counters.Counters; import mage.game.Game; +import mage.game.events.DamageCreatureEvent; +import mage.game.events.DamagePlaneswalkerEvent; +import mage.game.events.DamagedCreatureEvent; +import mage.game.events.DamagedPlaneswalkerEvent; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; import mage.players.Player; @@ -408,14 +412,14 @@ public abstract class PermanentImpl> extends CardImpl } @Override - public int damage(int damageAmount, UUID sourceId, Game game, boolean preventable) { + public int damage(int damageAmount, UUID sourceId, Game game, boolean preventable, boolean combat) { int damageDone = 0; if (damageAmount > 0 && canDamage(game.getObject(sourceId))) { if (cardType.contains(CardType.PLANESWALKER)) { - damageDone = damagePlaneswalker(damageAmount, sourceId, game, preventable); + damageDone = damagePlaneswalker(damageAmount, sourceId, game, preventable, combat); } else { - damageDone = damageCreature(damageAmount, sourceId, game, preventable); + damageDone = damageCreature(damageAmount, sourceId, game, preventable, combat); } if (damageDone > 0) { Permanent source = game.getPermanent(sourceId); @@ -436,8 +440,8 @@ public abstract class PermanentImpl> extends CardImpl damage = 0; } - protected int damagePlaneswalker(int damage, UUID sourceId, Game game, boolean preventable) { - GameEvent event = new GameEvent(GameEvent.EventType.DAMAGE_PLANESWALKER, objectId, sourceId, controllerId, damage, preventable); + protected int damagePlaneswalker(int damage, UUID sourceId, Game game, boolean preventable, boolean combat) { + GameEvent event = new DamagePlaneswalkerEvent(objectId, sourceId, controllerId, damage, preventable, combat); if (!game.replaceEvent(event)) { int actualDamage = event.getAmount(); if (actualDamage > 0) { @@ -445,15 +449,15 @@ public abstract class PermanentImpl> extends CardImpl actualDamage = this.loyalty.getValue(); } this.loyalty.boostValue(-actualDamage); - game.fireEvent(GameEvent.getEvent(EventType.DAMAGED_PLANESWALKER, objectId, sourceId, controllerId, actualDamage)); + game.fireEvent(new DamagedPlaneswalkerEvent(objectId, sourceId, controllerId, actualDamage, combat)); return actualDamage; } } return 0; } - protected int damageCreature(int damage, UUID sourceId, Game game, boolean preventable) { - GameEvent event = new GameEvent(GameEvent.EventType.DAMAGE_CREATURE, objectId, sourceId, controllerId, damage, preventable); + protected int damageCreature(int damage, UUID sourceId, Game game, boolean preventable, boolean combat) { + GameEvent event = new DamageCreatureEvent(objectId, sourceId, controllerId, damage, preventable, combat); if (!game.replaceEvent(event)) { int actualDamage = event.getAmount(); if (actualDamage > 0) { @@ -461,7 +465,7 @@ public abstract class PermanentImpl> extends CardImpl actualDamage = this.toughness.getValue() - this.damage; } this.damage += actualDamage; - game.fireEvent(GameEvent.getEvent(EventType.DAMAGED_CREATURE, objectId, sourceId, controllerId, actualDamage)); + game.fireEvent(new DamagedCreatureEvent(objectId, sourceId, controllerId, actualDamage, combat)); return actualDamage; } } diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 00168710bf8..128e1f328f1 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -68,6 +68,8 @@ import mage.filter.common.FilterCreatureForAttack; import mage.filter.common.FilterCreatureForCombat; import mage.game.Game; import mage.game.combat.CombatGroup; +import mage.game.events.DamagePlayerEvent; +import mage.game.events.DamagedPlayerEvent; import mage.game.permanent.Permanent; import mage.game.events.GameEvent; import mage.game.stack.StackAbility; @@ -616,7 +618,7 @@ public abstract class PlayerImpl> implements Player, Ser @Override public int damage(int damage, UUID sourceId, Game game, boolean combatDamage, boolean preventable) { if (damage > 0 && canDamage(game.getObject(sourceId))) { - GameEvent event = new GameEvent(GameEvent.EventType.DAMAGE_PLAYER, playerId, sourceId, playerId, damage, preventable); + GameEvent event = new DamagePlayerEvent(playerId, sourceId, playerId, damage, preventable, combatDamage); if (!game.replaceEvent(event)) { int actualDamage = event.getAmount(); if (actualDamage > 0) { @@ -626,11 +628,12 @@ public abstract class PlayerImpl> implements Player, Ser Player player = game.getPlayer(source.getControllerId()); player.gainLife(actualDamage, game); } - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.DAMAGED_PLAYER, playerId, sourceId, playerId, actualDamage)); - if (combatDamage) - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COMBAT_DAMAGED_PLAYER, playerId, sourceId, playerId, actualDamage)); - else - game.fireEvent(GameEvent.getEvent(GameEvent.EventType.NONCOMBAT_DAMAGED_PLAYER, playerId, sourceId, playerId, actualDamage)); + game.fireEvent(new DamagedPlayerEvent(playerId, sourceId, playerId, actualDamage, combatDamage)); +// game.fireEvent(GameEvent.getEvent(GameEvent.EventType.DAMAGED_PLAYER, playerId, sourceId, playerId, actualDamage)); +// if (combatDamage) +// game.fireEvent(GameEvent.getEvent(GameEvent.EventType.COMBAT_DAMAGED_PLAYER, playerId, sourceId, playerId, actualDamage)); +// else +// game.fireEvent(GameEvent.getEvent(GameEvent.EventType.NONCOMBAT_DAMAGED_PLAYER, playerId, sourceId, playerId, actualDamage)); return actualDamage; } }