Refactor how MindSlaver logic works so mindSlaveMaster can view their cards in addition to those of the player they've taken over

This commit is contained in:
drdev
2014-03-27 03:14:25 +00:00
parent 9304137b80
commit 49a70ccf48
4 changed files with 79 additions and 116 deletions

View File

@@ -297,9 +297,7 @@ public class Game {
public synchronized void setGameOver(GameEndReason reason) {
this.age = GameStage.GameOver;
for (Player p : allPlayers) {
if (p.isMindSlaved()) {
p.releaseControl(); // for correct totals
}
p.setMindSlaveMaster(null); // for correct totals
}
for (Player p : roIngamePlayers) {

View File

@@ -31,23 +31,21 @@ public class ControlPlayerEffect extends SpellAbilityEffect {
List<Player> tgtPlayers = getTargetPlayers(sa);
for (final Player pTarget: tgtPlayers) {
// on next untap gain control
game.getUntap().addUntil(pTarget, new GameCommand() {
@Override
public void run() {
pTarget.setControllingPlayerController(activator.getLobbyPlayer().createControllerFor(pTarget));
pTarget.setMindSlaveMaster(activator);
// on following cleanup release control
game.getEndOfTurn().addUntil(new GameCommand() {
@Override
public void run() {
pTarget.releaseControl();
pTarget.setMindSlaveMaster(null);
}
});
}
});
}
}
}

View File

@@ -8578,6 +8578,12 @@ public class Card extends GameEntity implements Comparable<Card> {
}
}
}
//if viewer is controlled by another player, also check if card can be shown to that player
if (viewer.isMindSlaved()) {
return canBeShownTo(viewer.getMindSlaveMaster());
}
return false;
}

View File

@@ -147,6 +147,8 @@ public class Player extends GameEntity implements Comparable<Player> {
protected PlayerController controller;
protected PlayerController controllerCreator = null;
private Player mindSlaveMaster = null;
private int teamNumber = -1;
private Card activeScheme = null;
@@ -205,8 +207,9 @@ public class Player extends GameEntity implements Comparable<Player> {
break;
}
}
if(!haveDuplicates)
if (!haveDuplicates) {
return nameCandidate;
}
nameCandidate = Lang.getOrdinal(i) + " " + originalName;
}
return nameCandidate;
@@ -272,9 +275,10 @@ public class Player extends GameEntity implements Comparable<Player> {
*/
public final Player getOpponent() {
for (Player p : game.getPlayers()) {
if (p.isOpponentOf(this))
if (p.isOpponentOf(this)) {
return p;
}
}
throw new IllegalStateException("No opponents left ingame for " + this);
}
@@ -287,9 +291,10 @@ public class Player extends GameEntity implements Comparable<Player> {
public final List<Player> getOpponents() {
List<Player> result = new ArrayList<Player>();
for (Player p : game.getPlayers()) {
if (p.isOpponentOf(this))
if (p.isOpponentOf(this)) {
result.add(p);
}
}
return result;
}
@@ -301,9 +306,10 @@ public class Player extends GameEntity implements Comparable<Player> {
public final List<Player> getAllies() {
List<Player> result = new ArrayList<Player>();
for (Player p : game.getPlayers()) {
if (!p.isOpponentOf(this))
if (!p.isOpponentOf(this)) {
result.add(p);
}
}
return result;
}
@@ -338,9 +344,6 @@ public class Player extends GameEntity implements Comparable<Player> {
return other != this && other != null && (other.teamNumber < 0 || other.teamNumber != this.teamNumber);
}
// ////////////////////////
//
// methods for manipulating life
@@ -418,7 +421,6 @@ public class Player extends GameEntity implements Comparable<Player> {
* @return a boolean.
*/
public final boolean gainLife(final int toGain, final Card source) {
// Run any applicable replacement effects.
final HashMap<String, Object> repParams = new HashMap<String, Object>();
repParams.put("Event", "GainLife");
@@ -615,14 +617,11 @@ public class Player extends GameEntity implements Comparable<Player> {
}
}
if(source.isCommander() && isCombat)
{
if(!commanderDamage.containsKey(source))
{
if (source.isCommander() && isCombat) {
if (!commanderDamage.containsKey(source)) {
commanderDamage.put(source, amount);
}
else
{
else {
commanderDamage.put(source,commanderDamage.get(source) + amount);
}
}
@@ -670,7 +669,6 @@ public class Player extends GameEntity implements Comparable<Player> {
*/
@Override
public final int staticDamagePrevention(final int damage, final Card source, final boolean isCombat, final boolean isTest) {
if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention)) {
return damage;
}
@@ -736,7 +734,6 @@ public class Player extends GameEntity implements Comparable<Player> {
*/
@Override
public final int staticReplaceDamage(final int damage, final Card source, final boolean isCombat) {
int restDamage = damage;
if (this.hasKeyword("Damage that would reduce your life total to less than 1 reduces it to 1 instead.")) {
@@ -823,7 +820,6 @@ public class Player extends GameEntity implements Comparable<Player> {
*/
@Override
public final int replaceDamage(final int damage, final Card source, final boolean isCombat) {
// Replacement effects
final HashMap<String, Object> repParams = new HashMap<String, Object>();
repParams.put("Event", "DamageDone");
@@ -854,7 +850,6 @@ public class Player extends GameEntity implements Comparable<Player> {
*/
@Override
public final int preventDamage(final int damage, final Card source, final boolean isCombat) {
if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noPrevention)
|| source.hasKeyword("Damage that would be dealt by CARDNAME can't be prevented.")) {
return damage;
@@ -1016,7 +1011,6 @@ public class Player extends GameEntity implements Comparable<Player> {
* a {@link forge.game.card.Card} object.
*/
public final boolean addCombatDamage(final int damage, final Card source) {
int damageToDo = damage;
damageToDo = this.replaceDamage(damageToDo, source, true);
@@ -1245,7 +1239,6 @@ public class Player extends GameEntity implements Comparable<Player> {
return this.drawCards(1);
}
public boolean canMulligan() {
return !getZone(ZoneType.Hand).isEmpty();
}
@@ -1314,8 +1307,9 @@ public class Player extends GameEntity implements Comparable<Player> {
this.setLastDrawnCard(c);
c.setDrawnThisTurn(true);
this.numDrawnThisTurn++;
if ( game.getPhaseHandler().is(PhaseType.DRAW))
if (game.getPhaseHandler().is(PhaseType.DRAW)) {
this.numDrawnThisDrawStep++;
}
// Miracle draws
if (this.numDrawnThisTurn == 1
@@ -1437,7 +1431,6 @@ public class Player extends GameEntity implements Comparable<Player> {
return CardLists.filter(this.getCardsIn(zone), CardPredicates.nameEquals(cardName));
}
public List<Card> getCardsActivableInExternalZones() {
final List<Card> cl = new ArrayList<Card>();
@@ -1488,7 +1481,7 @@ public class Player extends GameEntity implements Comparable<Player> {
}
}
return dredge;
} // hasDredge()
}
/**
* <p>
@@ -1507,7 +1500,7 @@ public class Player extends GameEntity implements Comparable<Player> {
}
return 0;
// throw new RuntimeException("Input_Draw : getDredgeNumber() card doesn't have dredge - " + c.getName());
} // getDredgeNumber()
}
/**
* <p>
@@ -1602,7 +1595,7 @@ public class Player extends GameEntity implements Comparable<Player> {
game.getTriggerHandler().runTrigger(TriggerType.Discarded, runParams, false);
return true;
} // end doDiscard
}
/**
* <p>
@@ -1771,7 +1764,6 @@ public class Player extends GameEntity implements Comparable<Player> {
* @return a boolean.
*/
public final boolean canPlayLand(Card land, final boolean ignoreZoneAndTiming) {
if (!ignoreZoneAndTiming && !this.canCastSorcery()) {
return false;
}
@@ -2094,7 +2086,6 @@ public class Player extends GameEntity implements Comparable<Player> {
* @return a boolean.
*/
public final boolean checkLoseCondition() {
// Just in case player already lost
if (this.getOutcome() != null) {
return this.getOutcome().lossState != null;
@@ -2120,12 +2111,12 @@ public class Player extends GameEntity implements Comparable<Player> {
if (game.getRules().hasAppliedVariant(GameType.Commander)) {
Map<Card,Integer> cmdDmg = getCommanderDamage();
for(Card c : cmdDmg.keySet())
{
if(cmdDmg.get(c) >= 21)
for (Card c : cmdDmg.keySet()) {
if (cmdDmg.get(c) >= 21) {
return this.loseConditionMet(GameLossReason.CommanderDamage, null);
}
}
}
return false;
}
@@ -2272,7 +2263,6 @@ public class Player extends GameEntity implements Comparable<Player> {
*/
@Override
public final boolean isValid(final String restriction, final Player sourceController, final Card source) {
final String[] incR = restriction.split("\\.");
if (incR[0].equals("Opponent")) {
@@ -2663,7 +2653,6 @@ public class Player extends GameEntity implements Comparable<Player> {
}
public static class Predicates {
public static final Predicate<Player> NOT_LOST = new Predicate<Player>() {
@Override
public boolean apply(Player p) {
@@ -2673,14 +2662,12 @@ public class Player extends GameEntity implements Comparable<Player> {
}
public static class Accessors {
public static Function<Player, String> FN_GET_NAME = new Function<Player, String>() {
@Override
public String apply(Player input) {
return input.getName();
}
};
}
/**
@@ -2696,34 +2683,37 @@ public class Player extends GameEntity implements Comparable<Player> {
}
public final boolean isMindSlaved() {
return controller.getLobbyPlayer() != controllerCreator.getLobbyPlayer();
return mindSlaveMaster != null;
}
public final void releaseControl() {
if ( controller == controllerCreator )
return;
public final Player getMindSlaveMaster() {
return mindSlaveMaster;
}
public final void setMindSlaveMaster(Player mindSlaveMaster0) {
if (mindSlaveMaster == mindSlaveMaster0) {
return;
}
mindSlaveMaster = mindSlaveMaster0;
if (mindSlaveMaster != null) {
LobbyPlayer oldLobbyPlayer = getLobbyPlayer();
controller = mindSlaveMaster.getLobbyPlayer().createControllerFor(this);
game.fireEvent(new GameEventPlayerControl(this, oldLobbyPlayer, getLobbyPlayer()));
}
else {
controller = controllerCreator;
game.fireEvent(new GameEventPlayerControl(this, getLobbyPlayer(), null));
}
public final void setControllingPlayerController(PlayerController pc) {
LobbyPlayer oldController = getLobbyPlayer();
controller = pc;
game.fireEvent(new GameEventPlayerControl(this, oldController, pc.getLobbyPlayer()));
}
private void setOutcome(PlayerOutcome outcome) {
stats.setOutcome(outcome);
}
/**
* TODO: Write javadoc for this method.
*/
public void onGameOver() {
if (null == stats.getOutcome()) {
setOutcome(PlayerOutcome.win()); // then won!
setOutcome(PlayerOutcome.win());
}
}
@@ -2789,7 +2779,6 @@ public class Player extends GameEntity implements Comparable<Player> {
return now.isPlayerTurn(this) && now.getPhase().isMain() && game.getStack().isEmpty();
}
/**
* <p>
* couldCastSorcery.
@@ -2803,7 +2792,6 @@ public class Player extends GameEntity implements Comparable<Player> {
* @return a boolean .
*/
public boolean couldCastSorcery(final SpellAbility sa) {
final Card source = sa.getRootAbility().getHostCard();
boolean onlyThis = true;
@@ -2821,10 +2809,6 @@ public class Player extends GameEntity implements Comparable<Player> {
return onlyThis && now.isPlayerTurn(this) && now.getPhase().isMain();
}
/**
* TODO: Write javadoc for this method.
* @return
*/
public final PlayerController getController() {
return controller;
}
@@ -2878,12 +2862,10 @@ public class Player extends GameEntity implements Comparable<Player> {
}
public int getStartingHandSize() {
return this.startingHandSize;
}
public void setStartingHandSize(int shs) {
this.startingHandSize = shs;
}
@@ -2892,8 +2874,7 @@ public class Player extends GameEntity implements Comparable<Player> {
* Takes the top plane of the planar deck and put it face up in the command zone.
* Then runs triggers.
*/
public void planeswalk()
{
public void planeswalk() {
planeswalkTo(Arrays.asList(getZone(ZoneType.PlanarDeck).get(0)));
}
@@ -2903,8 +2884,7 @@ public class Player extends GameEntity implements Comparable<Player> {
*
* @param destinations The planes to planeswalk to.
*/
public void planeswalkTo(final List<Card> destinations)
{
public void planeswalkTo(final List<Card> destinations) {
System.out.println(this.getName() + ": planeswalk to " + destinations.toString());
currentPlanes.addAll(destinations);
@@ -2929,10 +2909,8 @@ public class Player extends GameEntity implements Comparable<Player> {
*
* Puts my currently active planes, if any, at the bottom of my planar deck.
*/
public void leaveCurrentPlane()
{
if(!currentPlanes.isEmpty())
{
public void leaveCurrentPlane() {
if (!currentPlanes.isEmpty()) {
//Run PlaneswalkedFrom triggers here.
HashMap<String,Object> runParams = new HashMap<String,Object>();
runParams.put("Card", new ArrayList<Card>(currentPlanes));
@@ -2956,19 +2934,15 @@ public class Player extends GameEntity implements Comparable<Player> {
*
* Sets up the first plane of a round.
*/
public void initPlane()
{
public void initPlane() {
Card firstPlane = null;
while(true)
{
while (true) {
firstPlane = getZone(ZoneType.PlanarDeck).get(0);
getZone(ZoneType.PlanarDeck).remove(firstPlane);
if(firstPlane.getType().contains("Phenomenon"))
{
if (firstPlane.getType().contains("Phenomenon")) {
getZone(ZoneType.PlanarDeck).add(firstPlane);
}
else
{
else {
currentPlanes.add(firstPlane);
getZone(ZoneType.Command).add(firstPlane);
break;
@@ -3034,7 +3008,6 @@ public class Player extends GameEntity implements Comparable<Player> {
}
public boolean isSkippingDraw() {
if (hasKeyword("Skip your next draw step.")) {
removeKeyword("Skip your next draw step.");
return true;
@@ -3047,20 +3020,14 @@ public class Player extends GameEntity implements Comparable<Player> {
return false;
}
public void addInboundToken(Card c)
{
public void addInboundToken(Card c) {
inboundTokens.add(c);
}
public void removeInboundToken(Card c)
{
public void removeInboundToken(Card c) {
inboundTokens.remove(c);
}
/**
* TODO: Write javadoc for this type.
*
*/
private final class MiracleTrigger extends Ability {
private final SpellAbility miracle;
@@ -3083,9 +3050,6 @@ public class Player extends GameEntity implements Comparable<Player> {
}
}
/**
* TODO: Write javadoc for this method.
*/
public void onMulliganned() {
game.fireEvent(new GameEventMulligan(this)); // quest listener may interfere here
final int newHand = getCardsIn(ZoneType.Hand).size();
@@ -3129,7 +3093,6 @@ public class Player extends GameEntity implements Comparable<Player> {
}
public void initVariantsZones(RegisteredPlayer registeredPlayer) {
PlayerZone bf = getZone(ZoneType.Battlefield);
Iterable<? extends IPaperCard> cards = registeredPlayer.getCardsOnBattlefield();
if (cards != null) {
@@ -3141,7 +3104,6 @@ public class Player extends GameEntity implements Comparable<Player> {
}
}
PlayerZone com = getZone(ZoneType.Command);
// Mainly for avatar, but might find something else here
for (final IPaperCard cp : registeredPlayer.getCardsInCommand()) {
@@ -3150,8 +3112,9 @@ public class Player extends GameEntity implements Comparable<Player> {
// Schemes
List<Card> sd = new ArrayList<Card>();
for(IPaperCard cp : registeredPlayer.getSchemes())
for (IPaperCard cp : registeredPlayer.getSchemes()) {
sd.add(Card.fromPaperCard(cp, this));
}
if (!sd.isEmpty()) {
for (Card c : sd) {
getZone(ZoneType.SchemeDeck).add(c);
@@ -3159,11 +3122,11 @@ public class Player extends GameEntity implements Comparable<Player> {
getZone(ZoneType.SchemeDeck).shuffle();
}
// Planes
List<Card> l = new ArrayList<Card>();
for(IPaperCard cp : registeredPlayer.getPlanes())
for (IPaperCard cp : registeredPlayer.getPlanes()) {
l.add(Card.fromPaperCard(cp, this));
}
if (!l.isEmpty()) {
for (Card c : l) {
getZone(ZoneType.PlanarDeck).add(c);
@@ -3172,8 +3135,7 @@ public class Player extends GameEntity implements Comparable<Player> {
}
// Commander
if(registeredPlayer.getCommander() != null)
{
if (registeredPlayer.getCommander() != null) {
Card cmd = Card.fromPaperCard(registeredPlayer.getCommander(), this);
cmd.setCommander(true);
com.add(cmd);
@@ -3200,7 +3162,6 @@ public class Player extends GameEntity implements Comparable<Player> {
getZone(ZoneType.Command).add(eff);
}
}
public void changeOwnership(Card card) {