mirror of
https://github.com/magefree/mage.git
synced 2025-12-24 20:41:58 -08:00
[CMR] Implemented Malcolm, Keen-Eyed Navigator
This commit is contained in:
parent
ea46afbe62
commit
8b3064fc17
10 changed files with 213 additions and 8 deletions
|
|
@ -18,9 +18,7 @@ import mage.game.combat.CombatGroup;
|
|||
import mage.game.command.Command;
|
||||
import mage.game.command.CommandObject;
|
||||
import mage.game.command.Plane;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.game.events.ZoneChangeEvent;
|
||||
import mage.game.events.ZoneChangeGroupEvent;
|
||||
import mage.game.events.*;
|
||||
import mage.game.permanent.Battlefield;
|
||||
import mage.game.permanent.Permanent;
|
||||
import mage.game.permanent.PermanentToken;
|
||||
|
|
@ -732,6 +730,21 @@ public class GameState implements Serializable, Copyable<GameState> {
|
|||
return !simultaneousEvents.isEmpty();
|
||||
}
|
||||
|
||||
public void addSimultaneousDamage(DamagedEvent damagedEvent, Game game) {
|
||||
boolean flag = false;
|
||||
for (GameEvent event : simultaneousEvents) {
|
||||
if ((event instanceof DamagedBatchEvent)
|
||||
&& ((DamagedBatchEvent) event).getDamageClazz().isInstance(damagedEvent)) {
|
||||
((DamagedBatchEvent) event).addEvent(damagedEvent);
|
||||
flag = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!flag) {
|
||||
addSimultaneousEvent(DamagedBatchEvent.makeEvent(damagedEvent), game);
|
||||
}
|
||||
}
|
||||
|
||||
public void handleEvent(GameEvent event, Game game) {
|
||||
watchers.watch(event, game);
|
||||
delayed.checkTriggers(event, game);
|
||||
|
|
|
|||
45
Mage/src/main/java/mage/game/events/DamagedBatchEvent.java
Normal file
45
Mage/src/main/java/mage/game/events/DamagedBatchEvent.java
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
package mage.game.events;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public abstract class DamagedBatchEvent extends GameEvent {
|
||||
|
||||
private final Class<? extends DamagedEvent> damageClazz;
|
||||
private final Set<DamagedEvent> events = new HashSet<>();
|
||||
|
||||
public DamagedBatchEvent(EventType type, Class<? extends DamagedEvent> damageClazz) {
|
||||
super(EventType.DAMAGED_PLAYER_BATCH, null, null, null);
|
||||
this.damageClazz = damageClazz;
|
||||
}
|
||||
|
||||
public Set<DamagedEvent> getEvents() {
|
||||
return events;
|
||||
}
|
||||
|
||||
public void addEvent(DamagedEvent event) {
|
||||
this.events.add(event);
|
||||
}
|
||||
|
||||
public Class<? extends DamagedEvent> getDamageClazz() {
|
||||
return damageClazz;
|
||||
}
|
||||
|
||||
public static DamagedBatchEvent makeEvent(DamagedEvent damagedEvent) {
|
||||
DamagedBatchEvent event = null;
|
||||
if (damagedEvent instanceof DamagedPlayerEvent) {
|
||||
event = new DamagedPlayerBatchEvent();
|
||||
event.addEvent(damagedEvent);
|
||||
} else if (damagedEvent instanceof DamagedCreatureEvent) {
|
||||
event = new DamagedCreatureBatchEvent();
|
||||
event.addEvent(damagedEvent);
|
||||
} else if (damagedEvent instanceof DamagedPlaneswalkerEvent) {
|
||||
event = new DamagedPlaneswalkerBatchEvent();
|
||||
event.addEvent(damagedEvent);
|
||||
}
|
||||
return event;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
package mage.game.events;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class DamagedCreatureBatchEvent extends DamagedBatchEvent {
|
||||
|
||||
public DamagedCreatureBatchEvent() {
|
||||
super(EventType.DAMAGED_CREATURE_BATCH, DamagedCreatureEvent.class);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
package mage.game.events;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class DamagedPlaneswalkerBatchEvent extends DamagedBatchEvent {
|
||||
|
||||
public DamagedPlaneswalkerBatchEvent() {
|
||||
super(EventType.DAMAGED_PLANESWALKER_BATCH, DamagedPlaneswalkerEvent.class);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
package mage.game.events;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public class DamagedPlayerBatchEvent extends DamagedBatchEvent {
|
||||
|
||||
public DamagedPlayerBatchEvent() {
|
||||
super(EventType.DAMAGED_PLAYER_BATCH, DamagedPlayerEvent.class);
|
||||
}
|
||||
}
|
||||
|
|
@ -100,6 +100,7 @@ public class GameEvent implements Serializable {
|
|||
flag true = comabat damage - other damage = false
|
||||
*/
|
||||
DAMAGED_PLAYER,
|
||||
DAMAGED_PLAYER_BATCH,
|
||||
DAMAGE_CAUSES_LIFE_LOSS,
|
||||
PLAYER_LIFE_CHANGE,
|
||||
GAIN_LIFE, GAINED_LIFE,
|
||||
|
|
@ -311,8 +312,8 @@ public class GameEvent implements Serializable {
|
|||
flag not used for this event
|
||||
*/
|
||||
OPTION_USED,
|
||||
DAMAGE_CREATURE, DAMAGED_CREATURE,
|
||||
DAMAGE_PLANESWALKER, DAMAGED_PLANESWALKER,
|
||||
DAMAGE_CREATURE, DAMAGED_CREATURE, DAMAGED_CREATURE_BATCH,
|
||||
DAMAGE_PLANESWALKER, DAMAGED_PLANESWALKER, DAMAGED_PLANESWALKER_BATCH,
|
||||
DESTROY_PERMANENT,
|
||||
/* DESTROY_PERMANENT_BY_LEGENDARY_RULE
|
||||
targetId id of the permanent to destroy
|
||||
|
|
|
|||
|
|
@ -980,7 +980,9 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
|
|||
countersToRemove = getCounters(game).getCount(CounterType.LOYALTY);
|
||||
}
|
||||
removeCounters(CounterType.LOYALTY.getName(), countersToRemove, game);
|
||||
game.fireEvent(new DamagedPlaneswalkerEvent(objectId, sourceId, controllerId, actualDamage, combat));
|
||||
DamagedEvent damagedEvent = new DamagedPlaneswalkerEvent(objectId, sourceId, controllerId, actualDamage, combat);
|
||||
game.fireEvent(damagedEvent);
|
||||
game.getState().addSimultaneousDamage(damagedEvent, game);
|
||||
return actualDamage;
|
||||
}
|
||||
}
|
||||
|
|
@ -1011,7 +1013,9 @@ public abstract class PermanentImpl extends CardImpl implements Permanent {
|
|||
} else {
|
||||
this.damage = CardUtil.addWithOverflowCheck(this.damage, actualDamage);
|
||||
}
|
||||
game.fireEvent(new DamagedCreatureEvent(objectId, sourceId, controllerId, actualDamage, combat));
|
||||
DamagedEvent damagedEvent = new DamagedCreatureEvent(objectId, sourceId, controllerId, actualDamage, combat);
|
||||
game.fireEvent(damagedEvent);
|
||||
game.getState().addSimultaneousDamage(damagedEvent, game);
|
||||
return actualDamage;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2157,7 +2157,9 @@ public abstract class PlayerImpl implements Player, Serializable {
|
|||
Player player = game.getPlayer(sourceControllerId);
|
||||
new SquirrelToken().putOntoBattlefield(actualDamage, game, sourceId, player.getId());
|
||||
}
|
||||
game.fireEvent(new DamagedPlayerEvent(playerId, sourceId, playerId, actualDamage, combatDamage));
|
||||
DamagedEvent damagedEvent = new DamagedPlayerEvent(playerId, sourceId, playerId, actualDamage, combatDamage);
|
||||
game.fireEvent(damagedEvent);
|
||||
game.getState().addSimultaneousDamage(damagedEvent, game);
|
||||
return actualDamage;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue