@@ -158,8 +158,6 @@ abstract contract Handler is Balances {
158158 monster = _loadExistingMonster (player, monsterIndex);
159159 }
160160
161- // Flag for combat
162- (monster, player) = _enterMutualCombatToTheDeath (monster, player);
163161 if (monster.isDead ()) {
164162 player = _exitCombat (player);
165163 player.stats.nextTargetIndex = 0 ;
@@ -168,19 +166,23 @@ abstract contract Handler is Balances {
168166 return player;
169167 }
170168
169+ // Flag for combat
170+ (monster, player) = _enterMutualCombatToTheDeath (monster, player);
171+
171172 // Create tasks
172173 bool scheduledTask = false ;
173174
174175 // Only create for monster if task doesn't already exist
175176 if (newMonster) {
176177 uint256 targetBlock = block .number + _cooldown (monster.stats) + COMBAT_COLD_START_DELAY_MONSTER;
177178 (monster, scheduledTask) = _createOrRescheduleCombatTask (monster, targetBlock);
178- if (! scheduledTask) {
179- monster.owner = _EMPTY_ADDRESS ;
179+ if (scheduledTask) {
180+ monster.owner = player.owner ;
180181 monster.tracker.updateOwner = true ;
182+ } else {
181183 emit Events.TaskNotScheduledInHandler (3 , monster.id, block .number , targetBlock);
182184 }
183- } else {
185+ } else if ( ! monster. isDead ()) {
184186 // If task is no longer active, start a new one
185187 (scheduledTask,) = _checkClearTasks (monster);
186188 if (! scheduledTask || ! _isValidAddress (monster.owner)) {
@@ -316,19 +318,17 @@ abstract contract Handler is Balances {
316318 // Create tasks
317319 // Only create for attacker and defendant if tasks don't already exist
318320 (bool scheduledTask ,) = _checkClearTasks (defender);
319- if (defender.isMonster ()) {
321+ if (defender.isMonster () && ! defender. isDead () ) {
320322 if (! scheduledTask || ! _isValidAddress (defender.owner)) {
321- if (! scheduledTask) {
322- (defender, scheduledTask) =
323- _createOrRescheduleCombatTask (defender, block .number + _cooldown (defender.stats));
324- if (scheduledTask) {
325- defender.owner = attacker.owner;
326- defender.tracker.updateOwner = true ;
327- } else {
328- emit Events.TaskNotScheduledInHandler (
329- 1 , defender.id, block .number , block .number + _cooldown (defender.stats)
330- );
331- }
323+ (defender, scheduledTask) =
324+ _createOrRescheduleCombatTask (defender, block .number + _cooldown (defender.stats));
325+ if (scheduledTask) {
326+ defender.owner = attacker.owner;
327+ defender.tracker.updateOwner = true ;
328+ } else {
329+ emit Events.TaskNotScheduledInHandler (
330+ 1 , defender.id, block .number , block .number + _cooldown (defender.stats)
331+ );
332332 }
333333 }
334334 }
@@ -533,13 +533,11 @@ abstract contract Handler is Balances {
533533 // If it's a monster, update defender's owner to n
534534 // Only do this if there was a funding issue with prev task
535535
536- if (defender.isMonster () && ! attacker.isMonster ()) {
537- if (defender.owner != attacker.owner && _isValidAddress (defender.owner)) {
538- (bool hasActiveCombatTask ,) = _checkClearTasks (defender);
539- if (! hasActiveCombatTask) {
540- defender.owner = _EMPTY_ADDRESS;
541- defender.tracker.updateOwner = true ;
542- }
536+ if (! defender.isDead () && defender.isMonster () && ! attacker.isMonster () && _isValidAddress (defender.owner)) {
537+ (bool hasActiveCombatTask ,) = _checkClearTasks (defender);
538+ if (! hasActiveCombatTask && ! defender.isDead ()) {
539+ defender.owner = _EMPTY_ADDRESS;
540+ defender.tracker.updateOwner = true ;
543541 }
544542 }
545543
@@ -554,13 +552,12 @@ abstract contract Handler is Balances {
554552 // This prevents the bug where the wrong player would be stored later
555553 if (
556554 _isValidID (newDefender.id) && newDefender.id != defender.id && newDefender.id != attacker.id
557- && ! defender .isDead ()
555+ && ! newDefender .isDead ()
558556 ) {
559- defender = newDefender;
560- } else {
561- // Set defender to empty so we don't store it again at line 526
562- defender.id = bytes32 (0 );
557+ _storeBattleNad (newDefender);
563558 }
559+ } else {
560+ _storeBattleNad (defender);
564561 }
565562
566563 // Handle health regen and storage, then return the necessary data
@@ -584,12 +581,6 @@ abstract contract Handler is Balances {
584581 // Store area
585582 _storeArea (area, attacker.stats.depth, attacker.stats.x, attacker.stats.y);
586583
587- // Store defender (if valid)
588- // Dead defenders were already stored in _processDeathDuringKillerTurn
589- if (_isValidID (defender.id)) {
590- _storeBattleNad (defender);
591- }
592-
593584 return (attacker, reschedule, nextExecutionBlock);
594585 }
595586
@@ -743,7 +734,7 @@ abstract contract Handler is Balances {
743734 if (! attackerInCombat || ! defenderInCombat) {
744735 (attacker, defender) = _enterMutualCombatToTheDeath (attacker, defender);
745736 }
746- if (defender.isMonster () && ! attacker.isMonster ()) {
737+ if (! defender. isDead () && defender.isMonster () && ! attacker.isMonster ()) {
747738 if (! _isTask ()) {
748739 (bool scheduledTask ,) = _checkClearTasks (defender);
749740 if (! scheduledTask || ! _isValidAddress (defender.owner)) {
0 commit comments