Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - Wraith89

1
RMXP Script Database / Re: [XP] Tons of Add-ons
August 02, 2022, 04:28:02 pm
Quote from: KK20 on June 30, 2022, 12:13:27 amThe targets.any? addition should only be applied to Blue Magic Skill IDs, not just any skill. You should be able to confirm this easily by putting a print statement below it
    if BLUE_MAGIC_IDS.include?(battler.current_action.skill_id) && targets.any?
      print 'blue magic used!'
      targets.each {|target| target.damage = nil}
If you ever figure out how to reproduce it (even if not consistently), you should provide your scripts file. I'm leaning towards a different script being the problem.

Actually, yeah I don't think it has anything to do with Tons so it probably doesn't belong here. I think I found the culprit. It was the 'Target Anyone' script that I put in and I made it so that the Blue Magic skill can target either ally or foe. I also made some adjustments to make it usable with Wecoc's VX Ace Target Scope. I haven't found a way to fix it but there definitely are weird things that happen sometimes with the blue magic user, and I think it happens when I am using a potion at low HP or something and it goes to the enemy. Still inconsistent with replicating the bug however but I'll probably post some other thread if I figure it out completely.

=begin
===============================================================================
Target Anyone Scope
Version 1.0

By KK20
===============================================================================
 -[ Introduction ]-
 This small script allows the player to make single target scopes reverse its
 intended target. In other words, you can now choose to Heal a monster or one
 of your allies.
 
 -[ Instructions ]-
 1.) Scroll down to the configurations and locate Constant TARGET_ANYONE_TAG.
     Change the string associated with it if you like.
 2.) Create a new element in the Database. Name this new element the same as you
     have TARGET_ANYONE_TAG assigned to.
 3.) Apply this new element to skills or items that you wish to have this
     effect.
 
     ~ NOTE: The effect will only work if you set the scope to "One Enemy"
             or "One Ally".

 -[ Compatibility ]-
 * This script was made with the default battle system in mind. Custom battle
   scripts will most likely not work with this script without edits.
 * Not tested with SDK
 * Changes made to Game_Actor, Game_Battler, and Scene_Battle
 
Heretic Additions:

 Bugfixes:  Fixed a bug that selected wrong Target Type by cancelling, then
   reselecting the same Item or Skill.
 
 
===============================================================================
Credits:
KK20 - Writing this script
Charlie Fleed - For the idea
===============================================================================
=end

#===========#
# Configure #
#===========#

# The element ID's name that allows the user to target any one battler
TARGET_ANYONE_TAG = "DoubleTarget"

#===============#
# End Configure #
#===============#

#-------------------------------------------------------------------------
# Class Game Actor
#-------------------------------------------------------------------------
class Game_Actor < Game_Battler
  attr_accessor :changed_scope
 
  alias call_init_again initialize
  def initialize(actor_id)
    @changed_scope = false
    call_init_again(actor_id)
  end
 
  def clear
    super
    @changed_scope = false
    @target_type = nil
  end 
 
end

#-------------------------------------------------------------------------
# Class Game Battler
#-------------------------------------------------------------------------
class Game_Battler
  #--------------------------------------------------------------------------
  # * Calculating Element Correction
  #     element_set : element
  #--------------------------------------------------------------------------
  def elements_correct(element_set)
    # If not an element
    if element_set == []
      # Return 100
      return 100
    end
    # Return the weakest object among the elements given
    # * "element_rate" method is defined by Game_Actor and Game_Enemy classes,
    #    which inherit from this class.
    weakest = -100
    for i in element_set
      # Skips the "Target anyone" element to avoid damage miscalculations
      next if i == $data_system.elements.index(TARGET_ANYONE_TAG)
      weakest = [weakest, self.element_rate(i)].max
    end
    return weakest
  end
end

#-------------------------------------------------------------------------
# Class Scene Battle
#-------------------------------------------------------------------------
class Scene_Battle
  #--------------------------------------------------------------------------
  # * Frame Update (actor command phase : skill selection)
  #--------------------------------------------------------------------------
  def update_phase3_skill_select
    # Make skill window visible
    @skill_window.visible = true
    # Update skill window
    @skill_window.update
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # End skill selection
      end_skill_select
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Get currently selected data on the skill window
      @skill = @skill_window.skill
      # If it can't be used
      if @skill == nil or not @active_battler.skill_can_use?(@skill.id)
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Play decision SE
      $game_system.se_play($data_system.decision_se)
      # Set action
      @active_battler.current_action.skill_id = @skill.id
      # Make skill window invisible
      @skill_window.visible = false
      # If effect scope is single enemy or single ally and can target anyone
      if @skill.element_set.include?($data_system.elements.index(TARGET_ANYONE_TAG)) and
      (@skill.scope == 1 or @skill.scope == 3)
        # Define starting position of the arrow
        @orig_scope = @skill.scope
        start_enemy_select if @skill.scope == 1
        start_actor_select if @skill.scope == 3
        @any_target = true
      elsif @skill.scope == 1 
        # Start enemy selection
        start_enemy_select
      # If effect scope is single ally
      elsif @skill.scope == 3 or @skill.scope == 5
        # Start actor selection
        start_actor_select
      # If scope is all enemies or allies
      elsif [2,4,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28].include?(@skill.scope)
        start_select_all(@skill.scope)
        @any_target = true if @skill.element_set.include?($data_system.elements.index(TARGET_ANYONE_TAG))
      # If effect scope is not single
      else
        # End skill selection
        end_skill_select
        # Go to command input for next actor
        phase3_next_actor
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (actor command phase : item selection)
  #--------------------------------------------------------------------------
  def update_phase3_item_select
    # Make item window visible
    @item_window.visible = true
    # Update item window
    @item_window.update
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # End item selection
      end_item_select
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Get currently selected data on the item window
      @item = @item_window.item
      # If it can't be used
      unless $game_party.item_can_use?(@item.id)
        # Play buzzer SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # Play decision SE
      $game_system.se_play($data_system.decision_se)
      # Set action
      @active_battler.current_action.item_id = @item.id
      # Make item window invisible
      @item_window.visible = false
      # If effect scope is single enemy or single ally and can target anyone
      if @item.element_set.include?($data_system.elements.index(TARGET_ANYONE_TAG)) and
      (@item.scope == 1 or @item.scope == 3)
        # Define starting position of the arrow
        @orig_scope = @item.scope
        start_enemy_select if @item.scope == 1
        start_actor_select if @item.scope == 3
        @any_target = true
      # If effect scope is single enemy
      elsif @item.scope == 1 
        # Start enemy selection
        start_enemy_select
      # If effect scope is single ally
      elsif @item.scope == 3 or @item.scope == 5
        # Start actor selection
        start_actor_select
      # If scope is all enemies or allies
      elsif [2,4,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28].include?(@item.scope)
        start_select_all(@item.scope)
        @any_target = true if @item.element_set.include?($data_system.elements.index(TARGET_ANYONE_TAG))
      # If effect scope is not single
      else
        # End item selection
        end_item_select
        # Go to command input for next actor
        phase3_next_actor
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (actor command phase : enemy selection)
  #--------------------------------------------------------------------------
  def update_phase3_enemy_select
    # Update enemy arrow
    @enemy_arrow.update
    # If this skill/item can target anyone
    if @any_target == true
      # If player pressed the key to change targets
      if Input.trigger?(Input::DOWN)
        # Play decision SE
        $game_system.se_play($data_system.cursor_se)
        # Initialize actor select, end enemy select
        end_enemy_select
        if [2,4].include?(@skill_window != nil ? @skill.scope : @item.scope)
          start_select_all(4)
        else
          start_actor_select
        end
        @active_battler.changed_scope = !@active_battler.changed_scope
        # Stop processing
        return
      end
    end
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # End enemy selection
      end_enemy_select
      @active_battler.changed_scope = false     
      @any_target = false
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Play decision SE
      $game_system.se_play($data_system.decision_se)
      # Set action
      @active_battler.current_action.target_index = @enemy_arrow.index
      # End enemy selection
      end_enemy_select
      # If skill window is showing
      if @skill_window != nil
        # End skill selection
        end_skill_select
      end
      # If item window is showing
      if @item_window != nil
        # End item selection
        end_item_select
      end
      @any_target = false
      # Go to command input for next actor
      phase3_next_actor
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (actor command phase : actor selection)
  #--------------------------------------------------------------------------
  def update_phase3_actor_select
    # Update actor arrow
    @actor_arrow.update
    # If this skill/item can target anyone
    if @any_target == true
      # If player pressed the key to change targets
      if Input.trigger?(Input::UP)
        # Play decision SE
        $game_system.se_play($data_system.cursor_se)
        # Initialize actor select, end enemy select
        end_actor_select
        if [2,4].include?(@skill_window != nil ? @skill.scope : @item.scope)
          start_select_all(2)
        else
          start_enemy_select
        end
        @active_battler.changed_scope = !@active_battler.changed_scope
        # Stop processing
        return
      end
    end
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # End actor selection
      end_actor_select
      @active_battler.changed_scope = false     
      @any_target = false
      return
    end
    # If C button was pressed
    if Input.trigger?(Input::C)
      # Play decision SE
      $game_system.se_play($data_system.decision_se)
      # Set action
      @active_battler.current_action.target_index = @actor_arrow.index
      # End actor selection
      end_actor_select
      # If skill window is showing
      if @skill_window != nil
        # End skill selection
        end_skill_select
      end
      # If item window is showing
      if @item_window != nil
        # End item selection
        end_item_select
      end
      @any_target = false
      # Go to command input for next actor
      phase3_next_actor
    end
  end
  #--------------------------------------------------------------------------
  # * Set Targeted Battler for Skill or Item
  #     scope : effect scope for skill or item
  #--------------------------------------------------------------------------
  alias modded_scopes_change_targets set_target_battlers
  def set_target_battlers(scope)
    # If the actor has changed the scope of the skill/item
    if @active_battler.is_a?(Game_Actor) and @active_battler.changed_scope
      # Reset the variable
      @active_battler.changed_scope = false
      # Determine targets
      case scope
      when 1 # single ally
        index = @active_battler.current_action.target_index
        @target_battlers.push($game_party.smooth_target_actor(index))
      when 2 # allies
        for actor in $game_party.actors
          if actor.exist?
            @target_battlers.push(actor)
          end
        end
      when 3 # single enemy
        index = @active_battler.current_action.target_index
        @target_battlers.push($game_troop.smooth_target_enemy(index))
      when 4 # troop
        for enemy in $game_troop.enemies
          if enemy.exist?
            @target_battlers.push(enemy)
          end
        end
      end
    else
      # Call original method
      modded_scopes_change_targets(scope)
    end
  end
  #--------------------------------------------------------------------------
  # * Battle Ends
  #     result : results (0:win 1:lose 2:escape)
  #--------------------------------------------------------------------------
  alias reset_changed_scopes battle_end
  def battle_end(result)
    # Reset all the actors' changed_scope variable
    for actor in $game_party.actors
      actor.changed_scope = false
    end
    # Call alias
    reset_changed_scopes(result)
  end
 
end

#===========================


#==============================================================================
# ** Arrow_Base
#------------------------------------------------------------------------------
#  This sprite is used as an arrow cursor for the battle screen. This class
#  is used as a superclass for the Arrow_Enemy and Arrow_Actor classes.
#==============================================================================

class Arrow_Base < Sprite
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor   :target_all                    # Cursor Targets All
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     viewport : viewport
  #--------------------------------------------------------------------------
  alias arrow_all_initialize initialize
  def initialize(viewport)
    # Call Original
    arrow_all_initialize(viewport)
    # New Variable
    @target_all = false
  end
end

#==============================================================================
# ** Scene_Battle (part 1)
#------------------------------------------------------------------------------
#  This class performs battle screen processing.
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # * Start All Selection
  #--------------------------------------------------------------------------
  def start_select_all(scope)
    # If Scope is All Enemies
    if scope == 2 or scope == 8 or scope == 9 or scope == 10 or scope == 11 or scope == 12 or scope == 13 or scope == 14
      # Make enemy arrow
      @enemy_arrow = Arrow_Enemy.new(@spriteset.viewport1)
      # Cycle Arrow over each Enemy     
      @enemy_arrow.target_all = true
      # Associate help window
      @enemy_arrow.help_window = @help_window
      # Disable actor command window
      @actor_command_window.active = false
      @actor_command_window.visible = false 
    # IF Scope is All Allies
    elsif scope == 4 or scope == 15 or scope == 16 or scope == 17 or scope == 18 or scope == 19 or scope == 20 or scope == 21
      # Make actor arrow
      @actor_arrow = Arrow_Actor.new(@spriteset.viewport2)
      # Cycle Arrow over each Enemy
      @actor_arrow.target_all = true
      # Associate help window
      @actor_arrow.help_window = @help_window
      # Disable actor command window
      @actor_command_window.active = false
      @actor_command_window.visible = false
    end
  end 
end

#==============================================================================
# ** Arrow_Actor
#------------------------------------------------------------------------------
#  This arrow cursor is used to choose an actor. This class inherits from the
#  Arrow_Base class.
#==============================================================================

class Arrow_Actor < Arrow_Base
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    # If Entire Party
    if @target_all
      self.visible = true
      @index += 1
      @index %= $game_party.actors.size
      # Set sprite coordinates
      if self.actor != nil
        self.x = self.actor.screen_x
        self.y = self.actor.screen_y
      end
      # Prevent Input
      return
    end
    # Cursor right
    if Input.repeat?(Input::RIGHT)
      $game_system.se_play($data_system.cursor_se)
      @index += 1
      @index %= $game_party.actors.size
    end
    # Cursor left
    if Input.repeat?(Input::LEFT)
      $game_system.se_play($data_system.cursor_se)
      @index += $game_party.actors.size - 1
      @index %= $game_party.actors.size
    end
    # Set sprite coordinates
    if self.actor != nil
      self.x = self.actor.screen_x
      self.y = self.actor.screen_y
    end
  end
  #--------------------------------------------------------------------------
  # * Help Text Update
  #--------------------------------------------------------------------------
  def update_help
    # If targetting All Allies
    if @target_all
      # Display Entire Party in Help Window, 1 = Center
      @help_window.set_text("All Allies", 1)
    else
      # Display actor status in help window
      @help_window.set_actor(self.actor)
    end
  end
end

#==============================================================================
# ** Arrow_Enemy
#------------------------------------------------------------------------------
#  This arrow cursor is used to choose enemies. This class inherits from the
#  Arrow_Base class.
#==============================================================================

class Arrow_Enemy < Arrow_Base
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    # If All Enemies
    if @target_all
      self.visible = true
      @index += 1
      @index %= $game_troop.enemies.size
      # Skip if indicating a nonexistant enemy
      $game_troop.enemies.size.times do
        break if self.enemy.exist?       
        @index += 1
        @index %= $game_troop.enemies.size
      end     
      # Set sprite coordinates
      if self.enemy != nil
        self.x = self.enemy.screen_x
        self.y = self.enemy.screen_y
      end
      # Prevent Input
      return
    end
   
    # Skip if indicating a nonexistant enemy
    $game_troop.enemies.size.times do
      break if self.enemy.exist?
      @index += 1
      @index %= $game_troop.enemies.size
    end
    # Cursor right
    if Input.repeat?(Input::RIGHT)
      $game_system.se_play($data_system.cursor_se)
      $game_troop.enemies.size.times do
        @index += 1
        @index %= $game_troop.enemies.size
        break if self.enemy.exist?
      end
    end
    # Cursor left
    if Input.repeat?(Input::LEFT)
      $game_system.se_play($data_system.cursor_se)
      $game_troop.enemies.size.times do
        @index += $game_troop.enemies.size - 1
        @index %= $game_troop.enemies.size
        break if self.enemy.exist?
      end
    end
    # Set sprite coordinates
    if self.enemy != nil
      self.x = self.enemy.screen_x
      self.y = self.enemy.screen_y
    end
  end
  #--------------------------------------------------------------------------
  # * Help Text Update
  #--------------------------------------------------------------------------
  def update_help
    # If targetting All Enemies
    if @target_all
      # Display Entire Party in Help Window, 1 = Center
      @help_window.set_text("All Enemies", 1)
    else   
      # Display enemy name and state in the help window
      @help_window.set_enemy(self.enemy)
    end
  end
end
2
RMXP Script Database / Re: [XP] Tons of Add-ons
June 29, 2022, 03:27:55 am
There might be a bug with this particular fix and I haven't quite pinpointed it yet but it only affects the blue magic user. At some points, using any skill may direct the wrong targets. For example, using an item gets used on the enemy (imagine my surprise using a 100% HP/MP item on a major boss!) or using an offensive skill attacks your party instead! It seems to have only happened since this fix was implemented, but I'll keep testing to see what exactly triggers this. It's not as noticeable as the 'not enough MP' bug from earlier.
3
RMXP Script Database / Re: [XP] Tons of Add-ons
June 22, 2022, 09:23:50 pm
Wow it was such a simple fix. Thank you as always!

Also I wasn't sure how to edit the Blue Magic by Status skill to have a configuration to ignore certain skills as the Blue Magic as skills one.

class Game_Battler
 
  alias skill_effect_bluestatus_later skill_effect
  def skill_effect(user, skill)
    if $game_system.BLUE_MAGIC_STATUS && self.is_a?(Game_Actor)
      @states.each {|id|
          data = BlizzCFG.blue_states(id)
          if data.size > 1 && rand(100) < data[0] &&
              data[1, data.size-1].include?(user.class)
            learn_skill(skill.id)
            break
          end}
    end
    return skill_effect_bluestatus_later(user, skill)
  end
 
end

I assume it was editable here but it didn't seem to carry over the configs from the skill version sadly so any attacks that connect gets learnt. How would I do this one?
4
RMXP Script Database / Re: [XP] Tons of Add-ons
June 22, 2022, 12:29:23 am
Going back to the particular script for Blue Magic learn skill for Tons, I noticed that I would get a NoMethodError for 'damage' if the Blue Magic User uses the skill but has no MP to cast it at that time (for example if enemy deals MP damage to the caster).

#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# Blue Magic via Skill by Blizzard
# Version: 1.5
# Type: Skill Learning Skill
# Date: 14.11.2006
# Date v1.5: 17.2.2008
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#
#   This actor will learn one of the target's skills. Making this skill target
#   all allies/enemies, ONLY ONE SKILL WILL BE LEARNED FROM A RANDOM TARGET!
#   Make the skill do no damage to the target and use the hit rate to determine
#   the success chance of the skill.
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# START Configuration
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
BLUE_MAGIC_IDS = [92] # add any Skill IDs and separate them with commas
BLUE_MAGIC_UNLEARNABLE_SKILLS = [1,2,3,4,5,6,7,8,9,10] #Unlearnable blue magic skills
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# END Configuration
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
#==============================================================================
# Scene_Battle
#==============================================================================
class Scene_Battle
 
  alias make_skill_action_result_blue_later make_skill_action_result
  def make_skill_action_result(battler = nil, plus_id = nil)
    if battler == nil
      make_skill_action_result_blue_later
      battler, targets = @active_battler, @target_battlers
    elsif plus_id == nil
      make_skill_action_result_blue_later(battler)
      targets = battler.target
    else
      make_skill_action_result_blue_later(battler, plus_id)
      targets = battler.target
    end
    if $game_system.BLUE_MAGIC_SKILL &&
        BLUE_MAGIC_IDS.include?(battler.current_action.skill_id)
      targets.each {|target| target.damage = nil}
      target = targets[rand(targets.size)]
      #if rand(100) < $data_skills[battler.current_action.skill_id].hit
        #if target.is_a?(Game_Enemy)
          #ids = []
          #target.actions.each {|act| ids.push(act.skill_id) if act.kind == 1}
        #elsif target.is_a?(Game_Actor)
          #ids = target.skills.clone
        #end
      if rand(100) < $data_skills[battler.current_action.skill_id].hit
         ids = []
         if target.is_a?(Game_Enemy)
         target.actions.each {|act| ids.push(act.skill_id) if act.kind == 1 &&!BLUE_MAGIC_UNLEARNABLE_SKILLS.include?(act.skill_id) }
       elsif target.is_a?(Game_Actor)
         target.skills.each {|skl| ids.push(skl) if !BLUE_MAGIC_UNLEARNABLE_SKILLS.include?(skl) }
        end
        if ids.size > 0
          skill = $data_skills[ids[rand(ids.size)]]
          if battler.skills.include?(skill.id)
            target.damage = "#{skill.name} known!"
          else
            battler.learn_skill(skill.id)
            target.damage = "#{skill.name} learned"
          end
        else
          target.damage = 'None available'
        end
      else
        target.damage = 'Miss'
      end
    end
  end
   
end

Here's a slightly modified version made by KK20 where one can define which skills are unlearnable by caster. The error is on 'target.damage = 'None available'' line when playtesting. This can be replicated by turning on SP damage, having caster slower than the enemy, taking SP damage, and trying to cast blue magic learn skill. Is there a way to fix this? Thank you.
5
RMXP Script Database / Re: [XP] Dynamic Gardening
October 14, 2021, 01:45:29 am
I'll post this here as a bit of an minor issue, or perhaps the coding clashes, but if you try to use LittleDrago's RPG Maker XP Internal Bug Fix for Parallel Process in the first map in this thread, "back_to_map" feature when hitting cancel doesn't work as intended and instead you're automatically engaging in the Gardening Event when it should not, as if you pushed confirm again. Replicate it by using that fix and this code together and you will see what I mean.
6
Script Requests / Re: [XP]Refreshing Battle Scene Earlier
December 22, 2020, 01:31:49 pm
What you posted definitely got me started in the right direction. The battle scenes look a bit better now but I still have some more testing to do. It's definitely a quirk in the default engine, but I feel such information would be helpful to a lot of other people who may find this feature jarring. Thank you for your help!
7
Script Requests / [XP]Refreshing Battle Scene Earlier
December 21, 2020, 03:16:45 am
A peculiar quirk (bug?) with the default battle system of RPG Maker XP is that some things seem to update after the next turn. For example, if my character is inflicted with a status that lasts for one turn like Stun, the Stun status indicator will remain for that turn, and will remain even until the next turn until I select actions. This stuff usually isn't that problematic, but it does when you have statuses or battle events that desperately needs to be resolved in that turn something has been inflicted, like magic reflect shield being put up on the first turn, and should run out at that same turn when used, but persists in display until you select your action the next turn, or if you cut your character's max HP and the HP bar overflows until you do something, or to remove a particular buff immediately when your character reaches 0 SP and not at the beginning of next turn after selecting actions, etc. Basically I'm saying the window doesn't refresh immediately when the turn ends so it can make for some awkward looking battles. Is there a way to change this? I'm looking at Scene_Battle 1 and I guess the frame update section ties with this. Thank you.
8
Using the fix from KK20's edit to Wecoc's Battle Scope, there is still a bit of weird processing when using revival skills. The animation of a skill that was last used plays before one is revived, I think particularly a "target all enemy" skill. If enemy used Fire 3 on your side, for example, and your character was KOd, and you would revive the said character, Fire 3's animation would play on your side again before your character was revived. I'm not sure if that's the only bug on that but is there any way to disable that? Thank you.
9
In the default database settings, weapon attack value can only be given to weapons for obvious reasons. In the armour tab, the option to give weapon attack value is not there and is replaced with evasion. Is there any way to script call or add this option to make shields give weapon attack value, for example? Thank you.
10
That is exactly the answer I was looking for. I'll test this out soon. I think using the "Chain Status Effect" of Blizzard's Tons of Addons Part 2, this information can help people make stacking buff skills on RMXP. Thank you very much for all your help!
11
In the default editor, there is the states editor, which allows one to create states for various purposes, including stat buffs and debuffs. However, I noticed the native editor can only allow a maximum value of 200% (for example, let's make Sharp raise actor's strength, but it cannot go over 200%, etc). Is there a way to raise this via a script? Of course, the editor would not allow it, but I was thinking more of a script call which can change the values of specific stats to override the editor's limitations. Thank you.
12
Thank you very much! That solved everything. That was actually the default setting in Tons, but I think within Tons there are still some parts that may be somewhat buggy, even within a fresh new project, and not just compatibility issues.
13
Hello. I have tried using Hima's Elemental Reflector (found here), but I found it incompatible with Blizzard's Tons of Addons' "Absorb HP/SP Skill" section. I am using one that is slightly modified thanks to KK20 for MP Shield damage calculations.

Spoiler: ShowHide
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
# Absorb HP/SP Skill by Blizzard
# Version: 2.0b
# Type: Enhanced Skill
# Date: 8.5.2006
# Date v1.7b: 14.11.2006
# Date v1.72b: 20.10.2007
# Date v1.8b: 20.3.2008
# Date v2.0b: 13.7.2008
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=
#
# new in v1.7b:
#   - overworked code, fixed bugs and glitches, added "undead SP"
#
# new in v1.72b:
#   - slightly improved code and slight system change
#
# new in v1.8b:
#   - fixed a bug with SP absorbing that would kill an enemy instead of taking
#     all remaining SP
#
# new in v2.0b:
#   - enhanced compatibility with Full Reflection System and Blizz-ABS
#
#   Just include all the skill IDs that are supposed to steal HP/SP. You can
#   also define undead enemies who will (due to common belief...) revert the HP
#   absorb effect. Also you may add any IDs of enemies who use the same undead
#   effect, but on SP. Just add the IDs into UNDEAD_SP. Note that you can make
#   enemies who only are "undead" for HP stealing, SP stealing or even both.
#
# Note:
#   If you let a skill steal both HP and SP, only HP will be stolen.
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=

#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# START Configuration
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

SKILL_IDS_HP = [24,42,116,275,293,575,613,621,622,623,629,682,734] # add any Skill IDs and separate them with commas
SKILL_IDS_SP = [63,117] # add any Skill IDs and separate them with commas
UNDEAD_IDS = [] # add IDS and separate them with commas
UNDEAD_SP = [] # add IDS and separate them with commas

#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# END Configuration
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

#==============================================================================
# Game_Battler
#==============================================================================
class Game_Battler
 
  alias skill_effect_hpsp_absorb_later skill_effect
  def skill_effect(user, skill)
    last_hp = self.hp
    last_sr = self.sr if $crls && self.is_a?(Game_Actor)
    result = skill_effect_hpsp_absorb_later(user, skill)
    if $game_system.ABSORB_HP_SP && self.damage.is_a?(Numeric)
      if SKILL_IDS_SP.include?(skill.id)
        self.sr = last_sr if $crls && self.is_a?(Game_Actor)
        if user != self
          if self.is_a?(Game_Enemy) && UNDEAD_SP.include?(self.id)
            self.damage = -self.damage
          end
          if self.sp >= self.damage
            self.sp -= self.damage
          else
            self.damage, self.sp = self.sp, 0
          end
        else
          self.damage = 0
        end
      elsif SKILL_IDS_HP.include?(skill.id)
        lost_hp = last_hp - self.hp
        self.sr = last_sr if $crls && self.is_a?(Game_Actor)
        if user != self
          if self.is_a?(Game_Enemy) && UNDEAD_IDS.include?(self.id)
            self.damage = -self.damage
          end
          self.damage = lost_hp
        else
          self.damage = 0
        end
      end
    end
    return result
  end
 
end

#==============================================================================
# Scene_Battle
#==============================================================================

class Scene_Battle

  alias update_phase4_step5_hpsp_absorb_later update_phase4_step5
  def update_phase4_step5(battler = nil)
    if $game_system.ABSORB_HP_SP
      @status_window.refresh
      @help_window.visible, damages = false, 0
      @target_battlers.each {|target|
          if target.damage != nil
            target.damage_pop = true
            damages += target.damage if target.damage.is_a?(Numeric)
          end}
      if check_absorb(@active_battler, @active_battler.current_action.skill_id,
          damages)
        @status_window.refresh
      end
      @skill, @phase4_step = nil, 6
    elsif battler == nil
      update_phase4_step5_hpsp_absorb_later
    else
      update_phase4_step5_hpsp_absorb_later(battler)
    end
  end
 
  def check_absorb(user, id, damage)
    if (SKILL_IDS_HP | SKILL_IDS_SP).include?(id)
      if SKILL_IDS_HP.include?(id)
        user.hp += damage
      elsif SKILL_IDS_SP.include?(id)
        user.sp += damage
      end
      user.damage, user.damage_pop = -damage, true
      return true
    end
    return false
  end
   
end


The issue is it reports back a "NoMethodError" for undefined method "type_of_skill" for Nil:Class (around line 148ish) within Hima's Reflector script. Moving the reflector script above Blizzard's Tons of Addons 3 makes the reflector "work" with the blocking part but not the actual damaging from reflection. After testing things on a blank project I concluded enabling the Absorb HP/SP script causes problems, even on a fresh version of Blizzard's script.

Any assistance would be greatly appreciated.

14
RMXP Script Database / Re: [XP] Tons of Add-ons
April 27, 2020, 10:10:49 pm
Thank you. It works perfectly! I'd give the level up if I could, but apparently it no longer exists.
15
RMXP Script Database / Re: [XP] Tons of Add-ons
April 27, 2020, 04:20:18 pm
Sorry. I will clarify. There are actually two Blue Magic addon in Tons: Blue Magic States and Blue Magic Skill. The one you posted is the state, and the groups that are defined are "Actors" and "Enemies". What I was asking was the following:

Suppose you use the blue magic skill (or be in a state, whichever addon is used) on an enemy that knows Fire and Heal. However, let's say in this scenario Heal cannot be copied by Blue Magic. I was asking if we can define skills that can never be copied by Blue Magic in any way, as in a list of exceptions by skill ID one can configure. Blue Magic addons currently do not have such parameters and will copy anything enemies and actors may have when targeted.
16
RMXP Script Database / Re: [XP] Tons of Add-ons
April 26, 2020, 06:08:51 pm
A little request for anyone willing to try: is there a way to configure "Blue Magic Skill" add-on to have untargetable skills? As in skills that will never be learned by a blue magic skill. Thank you in advance.
17
RMXP Script Database / Re: [XP] Passive Augments
June 18, 2019, 12:30:53 am
Sorry for the necropost on this particular thread but I had a question involving the part "Demi MP and Turbo MP". The description says:

#  DEMI_MP allows the character to cast spells for half the SP cost
#  TURBO_MP doubles the SP cost as well as the power of the skills.


And if you scroll down to this part this is where it is applied:

      if @active_battler.is_a?(Game_Actor) && @active_battler.skill_learn?(DEMI_MP_ID)
        @skill.sp_cost/=2
      end   
            if @active_battler.is_a?(Game_Actor) && @active_battler.skill_learn?(TURBO_MP_ID)
        @skill.sp_cost*=2
        end   


I remember testing this in the past but it has a major flaw in its application: the effect will never cease. For example, if your character had Turbo MP and was using a 6 MP Fire, the cost would rise to 12 MP as expected, but the next turn it will become 24, and then the turn afterwards, 48, and the MP price persists even after the battle ends, hence you have a permanently increasing MP cost. I am sure this was not the intended effect. Would there be a way to fix this so that the application only happens once? Thank you.
18
Tutorial Requests / Re: [REQUEST][XP]Soft Level Cap
December 17, 2018, 06:44:50 pm
I tested it out. It works very well thank you!
I did try the reverse by having the default cap at 30 and try to set it upwards to 50, but that didn't really work though. It only works if the cap is set lower than what the default database has, but regardless it is functioning.
19
Tutorial Requests / Re: [REQUEST][XP]Soft Level Cap
December 16, 2018, 08:48:35 pm
Once again, thank you very much. I'll test this out and see how it works. What I wanted was, um, if they're at a cap of level 10 (for example), they stop gaining EXP altogether, but changing the cap will once again allow them to gain EXP until they reach the next level cap. Does that make sense? ^^;;;
20
Tutorial Requests / Re: [REQUEST][XP]Soft Level Cap
December 16, 2018, 04:20:46 pm
Thank you for the answer ^^ Hm, that is one way to do it, but it would be more interesting without depending on a state for not gaining experience. It is functionally the same I suppose. I was really looking for a way to change the "max level" value in the middle of the game for an actor individually, if possible.