-
Notifications
You must be signed in to change notification settings - Fork 785
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implement Damage Batch for Permanent event #11841
Implement Damage Batch for Permanent event #11841
Conversation
I don't see any reason for that event. Why you need it? |
Re: the need for this event:
Therefore, existing Enrage ruling:
Therefore, I suggest implementing Donna Noble on this branch and test cases as follows:
Within each test case, make the simultaneous amounts unique where possible so correct results are clear. Set strict choose mode so order trigger choice catches correct behavior. |
It looks like my use of It looks like the per-player batch is able to get around this by calling Test results (play testing, working to get a proper test written):
|
I'm not sure what's going on here with extraneous damage getting included. Needs more research and/or debugging I guess. |
Here's a conundrum: I added some logging to
// per permanent
if (isPermanentDamage && event instanceof DamagedBatchForOnePermanentEvent) {
DamagedBatchForOnePermanentEvent oldPermanentBatch = (DamagedBatchForOnePermanentEvent) event;
if (oldPermanentBatch.getDamageClazz().isInstance(damagedEvent)
// && CardUtil.getEventTargets(event).toArray()[0].equals(damagedEvent.getTargetId())) {
&& CardUtil.getEventTargets(event).contains(damagedEvent.getTargetId())) {
logger.info("Added damage event targeting " + damagedEvent.getTargetId());
logger.info("To batch event targeting " + CardUtil.getEventTargets(event).toArray()[0]);
logger.info("total damage on this batch: " + oldPermanentBatch.getAmount());
oldPermanentBatch.addEvent(damagedEvent);
logger.info("Batch event is targeting " + CardUtil.getEventTargets(event).toArray()[0] + " after addEvent call");
isPermanentBatchUsed = true;
}
} ... if (!isPermanentBatchUsed && isPermanentDamage) {
DamagedBatchEvent event = new DamagedBatchForOnePermanentEvent(damagedEvent.getTargetId());
event.addEvent(damagedEvent);
addSimultaneousEvent(event, game);
logger.info("Created batch damage event targeting " + damagedEvent.getTargetId());
logger.info("total damage on this batch: " + event.getAmount());
}
@Override
public int getAmount() {
int ans = events
.stream()
.mapToInt(GameEvent::getAmount)
.sum();
logger.info("getAmount called, returning " + ans + " damage from " + events.size() + " events");
return ans;
} Now if i run my test case, where a 3/4 and a 1/4 block Donna Noble, i get this:
So it seems like the I replaced this clause with the following: Now, i get this:
So now instead of making it look like it added Is something i'm calling here subtly changing values and i don't see it? the |
Also, based on the order that these prints are made in relation to addEvent, it looks like the logger is resolving inline code after its called, not when its called. does the logger have some fort of flush function? i dont see one perusing. |
I think due to threads there may not be any guarantee on precise ordering of the logger calls. I've read through this a few times and haven't yet come up with a plausible explanation for the behavior you've observed. Quite interesting... |
Xmage uses single game thread (for real game, for unit test, etc). No parallel executions. Only AI's game simulations and some rare user commands (#11460) executed in non game thread. Don't forget to filter logs by |
You can insert |
Maybe somehow the version of the code generating the logs is different from that which is being used to actually collect the events. I'm rebuilding the client and server each run, not sure how that might happen but its sitting in the back of my head. New printouts to see if there's more than one target in the batch event being added: // per permanent
if (isPermanentDamage && event instanceof DamagedBatchForOnePermanentEvent) {
DamagedBatchForOnePermanentEvent oldPermanentBatch = (DamagedBatchForOnePermanentEvent) event;
if (oldPermanentBatch.getDamageClazz().isInstance(damagedEvent)
// && CardUtil.getEventTargets(event).size() == 1
// && CardUtil.getEventTargets(event).toArray()[0].equals(damagedEvent.getTargetId())) {
&& CardUtil.getEventTargets(event).contains(damagedEvent.getTargetId())) {
logger.info("Adding " + damagedEvent.getAmount() + " damage event targeting " + damagedEvent.getTargetId());
logger.info("To batch event targeting the following (before addEvent):");
for (UUID id : CardUtil.getEventTargets(event)) logger.info(id);
logger.info("total damage on this batch (before addEvent): " + oldPermanentBatch.getAmount());
oldPermanentBatch.addEvent(damagedEvent);
logger.info("Batch event is targeting the following (after addEvent):");
for (UUID id : CardUtil.getEventTargets(event)) logger.info(id);
logger.info("total damage on this batch (after addEvent): " + oldPermanentBatch.getAmount());
isPermanentBatchUsed = true;
}
} if (!isPermanentBatchUsed && isPermanentDamage) {
DamagedBatchEvent event = new DamagedBatchForOnePermanentEvent(damagedEvent.getTargetId());
event.addEvent(damagedEvent);
addSimultaneousEvent(event, game);
logger.info("Created batch damage event with " + damagedEvent.getAmount() + " damage, targeting " + damagedEvent.getTargetId());
logger.info("total damage on this batch: " + event.getAmount());
} And i'm trying a few combinations of the following three clauses: // && CardUtil.getEventTargets(event).size() == 1
// && CardUtil.getEventTargets(event).toArray()[0].equals(damagedEvent.getTargetId())) {
&& CardUtil.getEventTargets(event).contains(damagedEvent.getTargetId())) {
(i added java syntax highlighting to these logs cause to me it makes it easier to track whats going on) INFO 2024-03-13 23:44:20,609 Created batch damage event with 3 damage, targeting c123032c-197a-4668-89b5-b25f5e15888b =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,610 getAmount called, returning 3 damage from 1 events =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] DamagedBatchEvent.getAmount
INFO 2024-03-13 23:44:20,610 total damage on this batch: 3 =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,612 Adding 1 damage event targeting c123032c-197a-4668-89b5-b25f5e15888b =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,612 To batch event targeting the following (before addEvent): =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,613 c123032c-197a-4668-89b5-b25f5e15888b =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,613 getAmount called, returning 4 damage from 2 events =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] DamagedBatchEvent.getAmount
INFO 2024-03-13 23:44:20,613 total damage on this batch (before addEvent): 4 =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,613 Batch event is targeting the following (after addEvent): =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,613 c123032c-197a-4668-89b5-b25f5e15888b =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,613 getAmount called, returning 4 damage from 2 events =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] DamagedBatchEvent.getAmount
INFO 2024-03-13 23:44:20,613 total damage on this batch (after addEvent): 4 =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,614 Adding 2 damage event targeting 813bee4f-ad85-4d76-8d62-28667d071c0f =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,614 To batch event targeting the following (before addEvent): =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,614 c123032c-197a-4668-89b5-b25f5e15888b =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,615 813bee4f-ad85-4d76-8d62-28667d071c0f =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,615 getAmount called, returning 6 damage from 3 events =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] DamagedBatchEvent.getAmount
INFO 2024-03-13 23:44:20,615 total damage on this batch (before addEvent): 6 =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,615 Batch event is targeting the following (after addEvent): =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,615 c123032c-197a-4668-89b5-b25f5e15888b =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,615 813bee4f-ad85-4d76-8d62-28667d071c0f =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,615 getAmount called, returning 6 damage from 3 events =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] DamagedBatchEvent.getAmount
INFO 2024-03-13 23:44:20,616 total damage on this batch (after addEvent): 6 =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] GameState.addSimultaneousDamage
INFO 2024-03-13 23:44:20,617 test =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] DonnaNobleTriggeredAbility.checkTrigger
INFO 2024-03-13 23:44:20,617 getAmount called, returning 6 damage from 3 events =>[GAME 7a1a40d3-5610-48e8-a9d1-5ef8eab60b07] DamagedBatchEvent.getAmount
if (oldPermanentBatch.getDamageClazz().isInstance(damagedEvent)
// && CardUtil.getEventTargets(event).size() == 1
&& CardUtil.getEventTargets(event).toArray()[0].equals(damagedEvent.getTargetId())) {
// && CardUtil.getEventTargets(event).contains(damagedEvent.getTargetId())) { This results in the same logs: INFO 2024-03-14 00:12:08,114 Created batch damage event with 3 damage, targeting c56477b9-aecb-47f5-963e-22d63ddd80b9 =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,115 getAmount called, returning 3 damage from 1 events =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] DamagedBatchEvent.getAmount
INFO 2024-03-14 00:12:08,115 total damage on this batch: 3 =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,117 Adding 1 damage event targeting c56477b9-aecb-47f5-963e-22d63ddd80b9 =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,117 To batch event targeting the following (before addEvent): =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,117 c56477b9-aecb-47f5-963e-22d63ddd80b9 =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,118 getAmount called, returning 4 damage from 2 events =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] DamagedBatchEvent.getAmount
INFO 2024-03-14 00:12:08,118 total damage on this batch (before addEvent): 4 =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,118 Batch event is targeting the following (after addEvent): =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,118 c56477b9-aecb-47f5-963e-22d63ddd80b9 =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,118 getAmount called, returning 4 damage from 2 events =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] DamagedBatchEvent.getAmount
INFO 2024-03-14 00:12:08,118 total damage on this batch (after addEvent): 4 =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,118 Adding 2 damage event targeting bba2bc93-dc7b-4b76-9613-066f4b6112c4 =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,119 To batch event targeting the following (before addEvent): =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,119 bba2bc93-dc7b-4b76-9613-066f4b6112c4 =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,119 c56477b9-aecb-47f5-963e-22d63ddd80b9 =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,119 getAmount called, returning 6 damage from 3 events =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] DamagedBatchEvent.getAmount
INFO 2024-03-14 00:12:08,119 total damage on this batch (before addEvent): 6 =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,119 Batch event is targeting the following (after addEvent): =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,119 bba2bc93-dc7b-4b76-9613-066f4b6112c4 =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,119 c56477b9-aecb-47f5-963e-22d63ddd80b9 =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,120 getAmount called, returning 6 damage from 3 events =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] DamagedBatchEvent.getAmount
INFO 2024-03-14 00:12:08,120 total damage on this batch (after addEvent): 6 =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] GameState.addSimultaneousDamage
INFO 2024-03-14 00:12:08,121 test =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] DonnaNobleTriggeredAbility.checkTrigger
INFO 2024-03-14 00:12:08,121 getAmount called, returning 6 damage from 3 events =>[GAME f424f4b9-eab3-4670-8962-5541e5887ae9] DamagedBatchEvent.getAmount
if (oldPermanentBatch.getDamageClazz().isInstance(damagedEvent)
&& CardUtil.getEventTargets(event).size() == 1
&& CardUtil.getEventTargets(event).toArray()[0].equals(damagedEvent.getTargetId())) {
// && CardUtil.getEventTargets(event).contains(damagedEvent.getTargetId())) { This causes what looks, on paper (at least before you see the last line) to be the correct behavior! However the actual behavior is then unchanged: INFO 2024-03-14 00:05:50,520 Created batch damage event with 3 damage, targeting da83c207-fa25-4218-9f05-6700e38bd3d2 =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] GameState.addSimultaneousDamage
INFO 2024-03-14 00:05:50,521 getAmount called, returning 3 damage from 1 events =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] DamagedBatchEvent.getAmount
INFO 2024-03-14 00:05:50,521 total damage on this batch: 3 =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] GameState.addSimultaneousDamage
INFO 2024-03-14 00:05:50,524 Adding 1 damage event targeting da83c207-fa25-4218-9f05-6700e38bd3d2 =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] GameState.addSimultaneousDamage
INFO 2024-03-14 00:05:50,524 To batch event targeting the following (before addEvent): =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] GameState.addSimultaneousDamage
INFO 2024-03-14 00:05:50,524 da83c207-fa25-4218-9f05-6700e38bd3d2 =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] GameState.addSimultaneousDamage
INFO 2024-03-14 00:05:50,525 getAmount called, returning 4 damage from 2 events =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] DamagedBatchEvent.getAmount
INFO 2024-03-14 00:05:50,525 total damage on this batch (before addEvent): 4 =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] GameState.addSimultaneousDamage
INFO 2024-03-14 00:05:50,525 Batch event is targeting the following (after addEvent): =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] GameState.addSimultaneousDamage
INFO 2024-03-14 00:05:50,525 da83c207-fa25-4218-9f05-6700e38bd3d2 =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] GameState.addSimultaneousDamage
INFO 2024-03-14 00:05:50,525 getAmount called, returning 4 damage from 2 events =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] DamagedBatchEvent.getAmount
INFO 2024-03-14 00:05:50,525 total damage on this batch (after addEvent): 4 =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] GameState.addSimultaneousDamage
INFO 2024-03-14 00:05:50,526 Created batch damage event with 2 damage, targeting 67cc2850-c785-4feb-a0aa-a36aa9c82654 =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] GameState.addSimultaneousDamage
INFO 2024-03-14 00:05:50,526 getAmount called, returning 2 damage from 1 events =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] DamagedBatchEvent.getAmount
INFO 2024-03-14 00:05:50,526 total damage on this batch: 2 =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] GameState.addSimultaneousDamage
INFO 2024-03-14 00:05:50,527 test =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] DonnaNobleTriggeredAbility.checkTrigger
INFO 2024-03-14 00:05:50,528 getAmount called, returning 6 damage from 3 events =>[GAME fc30d416-9809-4753-a0a2-c7c8e5c02fc7] DamagedBatchEvent.getAmount |
Tried this, it provided what i would expect normally--the correct line number in the correct file, under a mountain of calls within XMage's call stack. |
I found the issue. This snippet adding individual damage events to existing damage batches should be happening only if that damage event hasn't already been added to the current // per damage type
if ((event instanceof DamagedBatchEvent)
&& ((DamagedBatchEvent) event).getDamageClazz().isInstance(damagedEvent)) {
((DamagedBatchEvent) event).addEvent(damagedEvent);
isDamageBatchUsed = true;
} This explains why the behavior is unchanged no matter what logic i use, and why the printouts seem to know ahead of the |
Unable to retrieve information for "DamagedBatchEvent) event).getDamageClazz().isInstance(damagedEvent" |
…amagedBatchForOnePlayerEvent instances when they shouldnt
# Conflicts: # Mage/src/main/java/mage/game/GameState.java
Should be ready to merge now. Let me know if i should move any tests to a different path |
@xenohedron @JayDi85
Took a shot at this. I don't know where/what tests to write to test this feature since it looks like
DamagedBatchForOnePlayerEvent
doesn't have other tests about it as far as i can tell. What would a test suite for this look like? Is there an example of a test checking that the right event(s) fired in the right ways i can cheat off of?Also, before that, let me know if this implementation doesn't look right.