RMMV [Solved] Additional extremely high display values from startDamagePopup in <Custom Establish Effect> notetags

DarkMetaknight

Villager
Member
Joined
Mar 30, 2017
Messages
7
Reaction score
0
First Language
English
Primarily Uses
RMMV
Bug Description: startDamagePopup Additional Number
When using Game_Battler.startDamagePopup(), an "extra", extremely large number (the likes of 80000000000+) along with the normal damage number(s) appears. This happens with both single target and AoE reactions. Sometimes this "random" number can be 54, or some other low number too.

Despite this, the actual damage dealt is mechanically accurate, which has had me baffled for hours. Stat effect Reactions also work just fine.

I want to be clear: It's only the display that is broken.

Context: What's a Reaction?
If you've played Genshin Impact, the mechanic is fairly similar to that.
A "Reaction" checks the element(s) of a given skill, and applies States depending on the element. If another "Elemental State" is present, they'll react instead of applying their Elemental State, resetting the target to "Neutral" elemental state. Unlike Genshin, I also have reactions for Fire -> Fire, Ice -> Ice, and Thunder -> Thunder.

Plugin List & Order. (Unique ones described)
  • YEP_CoreEngine
  • YEP_BaseParamControl
  • YEP_X_ClassBaseParam
  • YEP_ExtraParamFormula
  • YEP_MessageCore
  • YEP_X_MessageBacklog
  • YEP_X_MessageSpeedOpt
  • YEP_SaveCore

  • DMK_CriticalAddState (prototypes Game_Action.prototype.itemEffectAddAttackState and .itemEffectAddNormalState)

  • DMK_ActionResultUtils
    - all-new Game_ActionResult constructors, such as setting HP damage and hpAffected = true.

    - Game_Battler.prototype.newDamagePopup that does similar to Game_Battler.prototype.startDamagePopup from Yanfly Battle Engine Core, but without setting to this._result. Was my attempt at fixing the odd damage numbers.

  • YEP_BattleEngineCore
  • YEP_X_ActSeqPack1
  • SergeofBIBEKActionSequenceLoops
    - Allows loops in action sequences. Currently unused in any skill as I've been using looping through foes with targetCore.
  • YEP_X_CounterControl
  • YEP_X_InBattleStatus
  • YEP_X_TurnOrderDisplay
  • YEP_X_VisualHpGuage
  • YEP_BattleStatusWindow
  • YEP_BuffsStatesCore
  • YEP_X_VisualHpGauge
  • YEP_X_ExtDoT
  • YEP_Z_StateProtection
  • YEP_DamageCore
  • YEP_X_CriticalControl
  • YEP_ElementCore
  • YEP_ExtraEnemyDrops
  • YEP_ForceAdvantage
  • YEP_HitAccuracy
  • YEP_LifeSteal
  • YEP_TargetCore
  • YEP_Taunt
  • YEP_VictoryAftermath
  • YEP_EquipCore
  • YEP_AutoPassiveStates
  • YEP_X_PassiveAuras
  • YEP_EnemyLevels
  • YEP_X_DifficultySlider
  • YEP_X_EnemyBaseParam
  • YEP_EnhancedTP
  • YEP_PartySystem
  • YEP_X_ActorPartySwitch
  • YEP_OptionsCore
  • DreamX_ShowParam
    - Should not be an issue. Purely display and not damage numbers.

Using this as a basis for state design:

State Notetag:
Code:
<Custom Establish Effect>
if (this.isSkill()) {
  if (target && target.result() && target.result().hpDamage > 0) {
    // Make a copy of the target's original action results
    var originalResult = JsonEx.makeDeepCopy(target._result);

    target.clearResult();

    // Loop through all the elements for this attack.
    for (var element of this.getItemElements()) {
      reactionState = 0;
      reactionMessage = undefined;
      reactionAnimation = 0;
      reactionEffect = undefined;

      // if element Fire
      if (element === 2) {
        // If fire synergy, Burn.
        if (target.isStateAffected(5)) {
          reactionState = 8;
          reactionAnimation = 67;
          reactionMessage = user.name() + ' causes Burn!';
        }
        // If Ice synergy, chain Melt.
        else if (target.isStateAffected(6)
           || target.isStateAffected(9)) {
          reactionEffect = 'melt';
        }
        // If Thunder synergy, chain Explosion
        else if (target.isStateAffected(7)) {
          reactionEffect = 'explode_thunder';
        }
        // If no synergy is present, apply own synergy!
        else {
          reactionState = 5;
        }
      }
      // if element Ice
      else if (element === 3) {
        // If ice synergy, Frostburn.
        if (target.isStateAffected(6)) {
          reactionState = 9;
          reactionAnimation = 72;
          reactionMessage = user.name() + ' causes Frostburn!';
        }
        // If Fire synergy, chain Melt.
        else if (target.isStateAffected(5)
           || target.isStateAffected(8)) {
          reactionEffect = 'melt';
        }
        // If Thunder Synergy, apply Stun.
        else if (target.isStateAffected(7)) {
          reactionState = 10;
          reactionAnimation = 64;
          reactionMessage = user.name() + ' causes Stun!';
        }
        // If no synergy is present, apply own synergy!
        else {
          reactionState = 6;
        }
      }
      // if element Thunder
      else if (element === 4) {
        // If Thunder Synergy, remove MP/TP
        if (target.isStateAffected(7)) {
          target.clearResult();
          reactionAnimation = 77;
          target.gainMp(-20);
          target.gainTp(-20);
          if (target && target.result() && target.result().hpDamage > 0) {
            target.startDamagePopup();
            // Clear the target's results
            target.clearResult();
          }
          reactionMessage = user.name() + ' causes Discharge!';
        }
        // If Ice Synergy, Stun.
        else if (target.isStateAffected(6)
           || target.isStateAffected(9)) {
          reactionState = 10;
          reactionMessage = user.name() + ' causes Stun!';
        }
        // If Fire synergy, chain Explosion
        else if (target.isStateAffected(5)
           || target.isStateAffected(8)) {
          reactionEffect = 'explode_fire';
        }
        // If no synergy is present, apply own synergy!
        else {
          reactionState = 7;
        }
      }

      // Apply Reaction State if applicable
      if (reactionState) {
        // ...then add the reactionState to the target.
        target.addState(reactionState);
      }

      // Reaction Effect?
      if (reactionEffect) {
        if (reactionEffect == 'melt') {
          target.clearResult();
          // Set the base damage
          reactionBaseDamage = 160;
          // This is the damage formula.
          reactionFinalDamage = Math.max(0, reactionBaseDamage * (user.atk / target.def));
          target.removeState(5);
          target.removeState(6);
          target.removeState(8);
          target.removeState(9);
          reactionAnimation = 81;
          target.gainHp(-reactionFinalDamage);
          if (target && target.result() && target.result().hpDamage > 0) {
            target.startDamagePopup();
            // Check if the target is dead
            if (target.isDead()) {
              // Make the target collapse
              target.performCollapse();
            }
            // Clear the target's results
            target.clearResult();
          }
        } else if (reactionEffect == 'explode_fire'
           || reactionEffect == 'explode_thunder') {
          reactionMessage = user.name() + ' causes Explosion!';
          // Set the base damage
          reactionBaseDamage = 100;

          // Grab the group of alive foes as candidates.
          if (user.isActor()) {
            for (var member of $gameTroop.aliveMembers()) {
              if ((reactionEffect == 'explode_thunder'
                   && member.isStateAffected(7))
                 || (reactionEffect == 'explode_fire'
                   && member.isStateAffected(5))) {
                member.clearResult();
                var reactionFinalDamage = Math.max(0, reactionBaseDamage * (user.atk / member.def));
                reactionAnimation = 107;
                member.removeState(5);
                member.removeState(7);
                member.removeState(8);
                member.gainHp(-reactionFinalDamage);
                if (member && member.result() && member.result().hpDamage > 0) {
                  member.startDamagePopup();
                  // Check if the member is dead
                  if (member.isDead()) {
                    // Make the member collapse
                    member.performCollapse();
                  }
                  // Clear the member's results
                  member.clearResult();
                  member.startAnimation(reactionAnimation);
                  reactionAnimation = 0;
                }
              }
            }
          } else {
            for (var member of $gameParty.aliveMembers()) {
              if ((reactionEffect == 'explode_thunder'
                   && member.isStateAffected(7))
                 || (reactionEffect == 'explode_fire'
                   && member.isStateAffected(5))) {
                member.clearResult();
                var reactionFinalDamage = Math.max(0, reactionBaseDamage * (user.atk / member.def));
                reactionAnimation = 107;
                member.removeState(5);
                member.removeState(7);
                member.removeState(8);
                member.gainHp(-reactionFinalDamage);
                if (member && member.result() && member.result().hpDamage > 0) {
                  member.startDamagePopup();
                  // Check if the member is dead
                  if (member.isDead()) {
                    // Make the member collapse
                    member.performCollapse();
                  }
                  // Clear the member's results
                  member.clearResult();
                  member.startAnimation(reactionAnimation);
                  reactionAnimation = 0;
                }
              }
            } // end enemy loop
          } // end if enemy
        } // end if fire or thunder explode
      }

      // if reactionMessage present...
      if (reactionMessage) {
        SceneManager._scene._logWindow._lines.push(reactionMessage);
        SceneManager._scene._logWindow.refresh();
        var waitframes = 45;
        BattleManager._actionList.push(['WAIT', [waitframes]]);
      }

    } // end element loop
  
    // play reaction animation
    if (reactionAnimation) {
      target.startAnimation(reactionAnimation);
    }

    // restore original results
    target._result = originalResult;
  }
}
</Custom Establish Effect>

State IDs
4 - Elemental Synergy. Passively on all battlers and the one with the Notetags above.
5 - Fire Synergy.
6 - Ice Synergy.
7 - Thunder Synergy.
8 - Burn (20% DoT, simple)
9 - Frostburn (Prevents healing HP)
10 - Stun (next action cannot move.)

It should be noted that most of my custom parameters use an exponential curve, but these numbers should not be this high.
I'm at level 5, with stats like 56 ATK. Could be messing with things though?
<Custom Class Parameters>
maxhp = 160 + (level**2 * 16);
maxmp = 20 + (level**2 * 2);
atk = 16 + (level**2 * 1.6);
def = 12 + (level**2 * 1.2);
mat = 10 + (level**2);
mdf = 10 + (level**2);
agi = 14 + (level**2 * 1.4);
luk = 10 + (level**2);
exp = (level**2 * 500);
</Custom Class Parameters>

Notes and things I checked:
  • All plugins are up to date.
  • Disabling all custom, non-yanfly plugins did not fix the problem.
  • Syntactically, there's "nothing wrong" with my notetags' JavaScript.
  • If I remove all startDamagePopups. Normal damage shows up fine. Reaction damage still occurs but with no indicator of damage amounts.
Edit: Plugin list is now an Unordered List for readability.
Edit 2: States added.
 
Last edited:

kyonides

Reforged is laughable
Veteran
Joined
Nov 17, 2019
Messages
882
Reaction score
425
First Language
English
Primarily Uses
RMXP
Just asking, did you ever run it without including the Custom State Effect?
 

ShadowDragon

Realist
Veteran
Joined
Oct 8, 2018
Messages
7,239
Reaction score
2,861
First Language
Dutch
Primarily Uses
RMMV
you list is correct, but if it is EXACTLY in your plugin list, than why
is there 2x "YEP_X_VisualHpGuage" in your list?

because below the buff and state core is the one that shouldn't be there.
also DMK targets the battler and is best to set below the battle EngineCore.
 

ATT_Turan

Forewarner of the Black Wind
Veteran
Joined
Jul 2, 2014
Messages
7,630
Reaction score
5,399
First Language
English
Primarily Uses
RMMV
I've seen stuff like this happen when gainHp receives a decimal value.

Try feeding your reactionFInalDamage through Math.round() before sending it over (and anyplace else that's similar, I didn't read the entire code).

Just for the tip, you have a lot of redundancy in checking for the target and target.result and amount of damage. You could strip most of that out and make your code a bit smaller/easier to get through.
 

DarkMetaknight

Villager
Member
Joined
Mar 30, 2017
Messages
7
Reaction score
0
First Language
English
Primarily Uses
RMMV
you list is correct, but if it is EXACTLY in your plugin list, than why
is there 2x "YEP_X_VisualHpGuage" in your list?
Ah, the second one was a mistake on my part when making this post. It's not actually in the plugin list. (I had to triple check after seeing this. lol)

also DMK targets the battler and is best to set below the battle EngineCore.
Huh, I remember I put it above for a reason...It's been so long since I've made that plugin, maybe it didn't work when below Yanfly's stuff?

I've seen stuff like this happen when gainHp receives a decimal value.

Try feeding your reactionFInalDamage through Math.round() before sending it over (and anyplace else that's similar, I didn't read the entire code).
Yo thank you! That fixed it like magic! I'm...Not sure why decimals spit out numbers like that though, but hey, it works now.

Just for the tip, you have a lot of redundancy in checking for the target and target.result and amount of damage. You could strip most of that out and make your code a bit smaller/easier to get through.
Yeah, sorry about the messy code in general, hehe. I was just trying to get it working, was saving polishing for after. (Which made troubleshooting harder...Bad choice, oops.)

Note: Below doesn't play certain animations, please use the one below this post for latest script.
Here's a new version that works! Also much, much cleaner, using functions and not checking if HP damage exists (I want support effects to do reactions too).
The check for result existing is still there...Doesn't really hurt.

Code:
<Custom Establish Effect>
if (this.isSkill()) {
 
  function dealStandardHpDamage(battler, damage, animation, ...removedStates) {
    battler.clearResult();
    if(animation) {
      battler.startAnimation(animation);
    }
    for (var state of removedStates) {
      battler.removeState(state);
    }
    reactionFinalDamage = Math.round(Math.max(0, damage * (user.atk / battler.def)));
    battler.gainHp(-reactionFinalDamage);
    battler.startDamagePopup();
    // Check if the battler is dead
    if (battler.isDead()) {
      // Make the battler collapse
      battler.performCollapse();
    }
    // Clear the battler's results
    battler.clearResult();
  };
 
  function calculateReactionExplosion(member) {
    if ((reactionEffect == 'explode_thunder'
           && member.isStateAffected(7))
         || (reactionEffect == 'explode_fire'
           && member.isStateAffected(5))) {
        dealStandardHpDamage(member, 100, 107, 5, 7, 8);
      }
  };
 
  if (target && target.result()) {
    // Make a copy of the target's original action results
    var originalResult = JsonEx.makeDeepCopy(target._result);

    target.clearResult();

    // Loop through all the elements for this attack.
    for (var element of this.getItemElements()) {
      reactionState = 0;
      reactionMessage = undefined;
      reactionEffect = undefined;

      // if element Fire
      if (element === 2) {
        // If fire synergy, Burn.
        if (target.isStateAffected(5)) {
          reactionState = 8;
          reactionAnimation = 67;
          reactionMessage = user.name() + ' causes Burn!';
        }
        // If Ice synergy, chain Melt.
        else if (target.isStateAffected(6)
           || target.isStateAffected(9)) {
          reactionEffect = 'melt';
        }
        // If Thunder synergy, chain Explosion
        else if (target.isStateAffected(7)) {
          reactionEffect = 'explode_thunder';
        }
        // If no synergy is present, apply own synergy!
        else {
          reactionState = 5;
        }
      }
      // if element Ice
      else if (element === 3) {
        // If ice synergy, Frostburn.
        if (target.isStateAffected(6)) {
          reactionState = 9;
          reactionAnimation = 72;
          reactionMessage = user.name() + ' causes Frostburn!';
        }
        // If Fire synergy, chain Melt.
        else if (target.isStateAffected(5)
           || target.isStateAffected(8)) {
          reactionEffect = 'melt';
        }
        // If Thunder Synergy, apply Stun.
        else if (target.isStateAffected(7)) {
          reactionState = 10;
          reactionAnimation = 64;
          reactionMessage = user.name() + ' causes Stun!';
        }
        // If no synergy is present, apply own synergy!
        else {
          reactionState = 6;
        }
      }
      // if element Thunder
      else if (element === 4) {
        // If Thunder Synergy, remove MP/TP
        if (target.isStateAffected(7)) {
          target.clearResult();
          reactionAnimation = 77;
          reactionBaseDamage = 40;
          reactionFinalDamage = Math.round(Math.max(20, reactionBaseDamage * (user.atk / target.def)));
          target.gainMp(-reactionFinalDamage);
          target.gainTp(-20);
          target.startDamagePopup();
          // Clear the target's results
          target.clearResult();
          reactionMessage = user.name() + ' causes Discharge!';
        }
        // If Ice Synergy, Stun.
        else if (target.isStateAffected(6)
           || target.isStateAffected(9)) {
          reactionState = 10;
          reactionAnimation = 64;
          reactionMessage = user.name() + ' causes Stun!';
        }
        // If Fire synergy, chain Explosion
        else if (target.isStateAffected(5)
           || target.isStateAffected(8)) {
          reactionEffect = 'explode_fire';
        }
        // If no synergy is present, apply own synergy!
        else {
          reactionState = 7;
        }
      }

      // Apply Reaction State if applicable
      if (reactionState) {
        // ...then add the reactionState to the target.
        target.addState(reactionState);
      }

      // Reaction Effect?
      if (reactionEffect) {
        if (reactionEffect == 'melt') {
          dealStandardHpDamage(target, 160, 81, 5, 6, 8, 9);
        } else if (reactionEffect == 'explode_fire'
           || reactionEffect == 'explode_thunder') {
          reactionMessage = user.name() + ' causes Explosion!';

          // Grab the group of alive foes as candidates.
          if (user.isActor()) {
            for (var member of $gameTroop.aliveMembers()) {
              calculateReactionExplosion(member);
            }
          } else {
            for (var member of $gameParty.aliveMembers()) {
              calculateReactionExplosion(member);
            } // end enemy loop
          } // end if enemy
        } // end if fire or thunder explode
      }

      // if reactionMessage present...
      if (reactionMessage) {
        SceneManager._scene._logWindow._lines.push(reactionMessage);
        SceneManager._scene._logWindow.refresh();
        var waitframes = 45;
        BattleManager._actionList.push(['WAIT', [waitframes]]);
      }

    } // end element loop

    // restore original results
    target._result = originalResult;
  }
}
</Custom Establish Effect>
...Also I'm pretty sure startDamagePopup() runs clearResult() anyway, so probably can optimize there. Not a big deal though. *shrug*
 
Last edited:

DarkMetaknight

Villager
Member
Joined
Mar 30, 2017
Messages
7
Reaction score
0
First Language
English
Primarily Uses
RMMV
I did some updates, earlier one failed to play certain animations due to missing reactionAnimation checks at the end. It also stacked 'WAIT' actions with AoE spells.

Figured I'd post it here for anyone who wants to do something like this. It is much cleaner than before, separating reaction apply logic functions at the top, element checks in the middle, and finally reaction execution at the end.

This should be the final script since I haven't found any other issues. :p
Code:
<Custom Establish Effect>
if (this.isSkill()) {
 
////////////////////////////////////////////////////////
////////////////////// FUNCTIONS ///////////////////////
////////////////////////////////////////////////////////
  function dealStandardHpDamage(battler, damage, animation, ...removedStates) {
    battler.clearResult();
    if(animation) {
      battler.startAnimation(animation);
    }
    if(removedStates && removedStates.length > 0) {
      for (var state of removedStates) {
        battler.removeState(state);
      }
    }
    if(damage) {
      reactionFinalDamage = Math.round(Math.max(0, damage * (user.atk / battler.def)));
      battler.gainHp(-reactionFinalDamage);
      battler.startDamagePopup();
      // Check if the battler is dead
      if (battler.isDead()) {
        // Make the battler collapse
        battler.performCollapse();
      }
      // Clear the battler's results
      battler.clearResult();
    }
  };
 
  function dealState(battler, animation, addedState, ...removedStates) {
    battler.clearResult();
    if(animation) {
      battler.startAnimation(animation);
    }
    if(removedStates && removedStates.length > 0) {
      for (var state of removedStates) {
        battler.removeState(state);
      }
    }
    if(addedState) {
      battler.addState(addedState);
    }
  };
 
  function calculateReactionExplosion(member) {
    if ((reactionEffect == 'explode_thunder'
           && member.isStateAffected(7))
         || (reactionEffect == 'explode_fire'
           && member.isStateAffected(5))) {
        dealStandardHpDamage(member, a.atk * 2.0, 107, 5, 7, 8);
      }
  };
 
//////// FUNCTIONS END, START RESULT LOGIC
  if (target && target.result()) {
    // Make a copy of the target's original action results
    var originalResult = JsonEx.makeDeepCopy(target._result);

    target.clearResult();
   
//////////////////////////////////////////////////////////
////////////////////// ELEMENT CHECKS ////////////////////
//////////////////////////////////////////////////////////
    // Loop thorugh all elements of attack.
    for (var element of this.getItemElements()) {
      reactionMessage = undefined;
      reactionEffect = undefined;
      didReactionMessage = false;

      // FIRE ELEMENT
      if (element === 2) {
        // If fire synergy, Burn.
        if (target.isStateAffected(5)) {
          reactionEffect = 'burn';
        }
        // If Ice synergy, chain Melt.
        else if (target.isStateAffected(6)
           || target.isStateAffected(9)) {
          reactionEffect = 'melt';
        }
        // If Thunder synergy, chain Explosion
        else if (target.isStateAffected(7)) {
          reactionEffect = 'explode_thunder';
        }
        // If no synergy is present, apply own synergy!
        else if(!target.isStateAffected(8)) {
          target.addState(5);
        }
      }
      // ICE ELEMENT
      else if (element === 3) {
        // If ice synergy, Frostburn.
        if (target.isStateAffected(6)) {
          reactionEffect = 'frostburn';
        }
        // If Fire synergy, chain Melt.
        else if (target.isStateAffected(5)
           || target.isStateAffected(8)) {
          reactionEffect = 'melt';
        }
        // If Thunder Synergy, apply Stun.
        else if (target.isStateAffected(7)) {
          reactionEffect = 'stun';
        }
        // If no synergy is present, apply own synergy!
        else if(!target.isStateAffected(9)) {
          target.addState(6);
        }
      }
      // THUNDER ELEMENT
      else if (element === 4) {
        // If Thunder Synergy, remove MP/TP
        if (target.isStateAffected(7)) {
          reactionEffect = 'discharge';
        }
        // If Ice Synergy, Stun.
        else if (target.isStateAffected(6)
           || target.isStateAffected(9)) {
          reactionEffect = 'stun';
        }
        // If Fire synergy, chain Explosion
        else if (target.isStateAffected(5)
           || target.isStateAffected(8)) {
          reactionEffect = 'explode_fire';
        }
        // If no synergy is present, apply own synergy!
        else {
          target.addState(7);
        }
      }

//////////////////////////////////////////////////////////////
/////////////////// REACTION EFFECTS /////////////////////////
//////////////////////////////////////////////////////////////
      if (reactionEffect) {
       if (reactionEffect == 'burn') {
         dealState(target, 67, 8, 5);
         reactionMessage = user.name() + ' causes Burn!';
       }
       else if (reactionEffect == 'melt') {
         dealStandardHpDamage(target, a.atk * 2.6, 81, 5, 6, 8, 9);
         reactionMessage = user.name() + ' causes Melt!';
       }
       else if (reactionEffect == 'stun') {
         dealState(target, 64, 10, 6, 7, 9);
         reactionMessage = user.name() + ' causes Stun!';
       }
       else if (reactionEffect == 'frostburn') {
         dealState(target, 72, 9, 6);
         reactionMessage = user.name() + ' causes Frostburn!';
       }
       else if (reactionEffect == 'discharge') {
         dealState(target, 77, 0, 0);
         target.clearResult();
         reactionFinalDamage = 20;
         target.gainMp(-reactionFinalDamage);
         target.gainTp(-20);
         target.startDamagePopup();
         // Clear the target's results
         target.clearResult();
         reactionMessage = user.name() + ' causes Discharge!';
       }
       else if (reactionEffect == 'explode_fire'
           || reactionEffect == 'explode_thunder') {
          reactionMessage = user.name() + ' causes Explosion!';

          // Grab the group of alive foes as candidates.
          if (user.isActor()) {
            for (var member of $gameTroop.aliveMembers()) {
              calculateReactionExplosion(member);
            }
          } else {
            for (var member of $gameParty.aliveMembers()) {
              calculateReactionExplosion(member);
            } // end enemy loop
          } // end if enemy
        } // end if fire or thunder explode
      }

      // if reactionMessage present...
      if (reactionMessage) {
        SceneManager._scene._logWindow._lines.push(reactionMessage);
        SceneManager._scene._logWindow.refresh();
      }

    } // end element loop

    // restore original results
    target._result = originalResult;
  }
}
</Custom Establish Effect>
<Custom Conclude Effect>
if(reactionMessage) {
  var possibleWait = BattleManager._actionList[BattleManager._actionList.length - 1];
  if (possibleWait && possibleWait[0] != 'WAIT') {
    var waitframes = 30;
    BattleManager._actionList.push(['WAIT', [waitframes]]);
  }
}
</Custom Conclude Effect>
Edit: Also multi-element attacks work with Element Core.
 

Latest Threads

Latest Profile Posts

Learn how to do custom face parts with my latest tutorial!
Generatorpartsfromscratch.png
The Legion
T7T0hR2.gif
Made a title screen, and by ''made'' I ofc mean I slapped a simple title on some cool art I bought xD This side project might be fun.

sIMPLE.png
CDF.png

Trying for a Classical RPG with Pokemon Elements. Capture monsters like Zombies and Harpys and use them on your team.
ow28O4A.png

Astarte in her usual demeanor: mocking people.

Forum statistics

Threads
129,873
Messages
1,205,850
Members
171,051
Latest member
Atakh4n
Top