Mr. Mo v 5.5 + Immense Events
#10
I chose to attack two birds with one stone.

Code:
#==============================================================================
# ** MrMo's Immense Events Patch
#------------------------------------------------------------------------------
#    by DerVVulfman
#    version 1.0
#    10-30-2024
#    RGSS / RPGMaker XP
#
#==============================================================================
#
#  INSTALLATION:
#
#  The Immense Events script must be below MrMo's ABS.
#  This patch goes below both.
#  Par-tay!
#
#------------------------------------------------------------------------------
#
#  USAGE:
#
#  Apply the 'size' command used by Immense Events to the 'first page' in any
#  enemy event.  The size is only defined once for any event and won't reset.
#  Using the 'size' command multiple times for an event changing its graphics
#  will not function.
#
#------------------------------------------------------------------------------


#==============================================================================
# ** MrMo_ABS
#------------------------------------------------------------------------------
#  This class deals with the Action Battle System and controls all Player,
#  Enemy and Companion Actions on the map.
#==============================================================================

class MrMo_ABS
  #--------------------------------------------------------------------------
  # * In Direction?(source, target) - Near Fantastica
  #     source : source of search (object performing test)
  #     target : target of search (object being searched)
  #--------------------------------------------------------------------------
  def in_direction?(source, target)
    #
    # Obtain size differences
    change          = get_size(target)
    o_ch_x, o_ch_y  = change[0], change[1]
    #
    # Get facing direction of seearch source
    dir = source.direction
    #
    # Cycle through object/target x coordinates
    for x in (target.x - o_ch_x)..(target.x + o_ch_x)
      # Return with success based on diretion and coordinates
      return true if dir == 2 and source.y <= target.y and source.x == x
      return true if dir == 8 and source.y >= target.y and source.x == x
    end
    #
    # Cycle through object/target y coordinates
    for y in (target.y - o_ch_y)..(target.y)
      # Return with success based on diretion and coordinates
      return true if dir == 4 and source.x >= target.x and source.y == y
      return true if dir == 6 and source.x <= target.x and source.y == y
    end
    #
    # Return failed
    return false
    #
  end
  #--------------------------------------------------------------------------
  # * In Range?(Element, Object, Range) - Near Fantastica
  #     source : source of search (object performing test)
  #     target : target of search (object being searched)
  #     range  : range distance in tiles
  #--------------------------------------------------------------------------
  def in_range?(source, target, range)
    #
    # Get differences
    change          = get_size(source)
    s_ch_x, s_ch_y  = change[0], change[1]
    change          = get_size(target)
    t_ch_x, t_ch_y  = change[0], change[1]
    #
    # Loop through source and target coordinates with tile extensions
    for xs in (source.x - s_ch_x)..(source.x + s_ch_x)
      for xt in (target.x - t_ch_x)..(target.x + t_ch_x)
        for ys in (source.y - s_ch_y)..(source.y)
          for yt in (target.y - t_ch_y)..(target.y)
            #
            # Confirm if updated coordinate are within the range test
            return true if in_range_numeric?(xs, ys, xt, yt, range)
            #
          end
        end
      end
    end
    #
    # Exit method with no confirmation
    return false
    #
  end
  #--------------------------------------------------------------------------
  # * In Range based on given values (variant of Near Fantastica's)
  #     s_x   : source object's x-coordinates
  #     s_y   : source object's y-coordinates
  #     t_x   : target object's x-coordinates
  #     t_y   : target object's y-coordinates
  #     range : range distance in tiles
  #--------------------------------------------------------------------------
  def in_range_numeric?(s_x, s_y, t_x, t_y, range)
    #
    x = (s_x - t_x) * (s_x - t_x)
    y = (s_y - t_y) * (s_y - t_y)
    r = x + y
    return true if r <= (range * range)
    return false
    #
  end 
  #--------------------------------------------------------------------------
  # * Obtain extending tile quantity (size) based on facing direction
  #     t : target object character
  #--------------------------------------------------------------------------
  def get_size(t)
    #
    # Get facing direction of target
    d = t.direction
    #   
    # Set the size variables depending on the direction
    t_x = ((d == 2 or d == 8) ? t.vertical_size_x : t.horizontal_size_x).to_i
    t_y = ((d == 2 or d == 8) ? t.vertical_size_y : t.horizontal_size_y).to_i
    #   
    # Work out the number of tiles either side of the event
    t_x /= 2
    t_y -= 1
    #
    # Return array with horizontal and vertical tile extensions
    return [t_x, t_y]
    #
  end
end



#==============================================================================
# ** Game_Ranged_Weapon
#------------------------------------------------------------------------------
#  This class handles ranged missiles that deliver damage based on the weapon
#  currently equipped.
#==============================================================================

class Game_Ranged_Weapon < Range_Base
  #--------------------------------------------------------------------------
  # * Check Event Trigger Touch(x,y)
  #--------------------------------------------------------------------------
  def check_event_trigger_touch(x, y)
    #
    # If using non-official update to 4.5
    faux = (Object.const_defined?(:DEFEND_DAMAGE_PERCENT))
    #
    # Exit if the stop flag is set
    return if @stop
    #
    if faux
      # Exit and set stop flag if neither an enemy nor player
      if $ABS.enemies[@parent.id].nil? and !@parent.is_a?(Game_Player)
        return @stop = true
      end
    end
    #
    # Hit the player if missile in range of the player
    hit_player if in_range_ballistic?(x, y, $game_player, 1)
    #
    # Cycle through all map events
    for event in $game_map.events.values
      #
      # Skip if not an enemy, or missile not in range to strike
      next if $ABS.enemies[event.id].nil?     
      next unless in_range_ballistic?(x, y, event, 1)     
      #
      # Acquire hit condition tests
      if faux
        # Adding unofficial friendly-fire option
        hate    = true
        unless $ABS.enemies[@parent.id].nil?
          e_id  = $ABS.enemies[event.id].enemy_id
          hate  = $ABS.enemies[@parent.id].hate_group.include?(e_id)
        end
      end
      c1      = event.character_name == ""
      c2      = ($ABS.enemies[event.id] != nil and $ABS.enemies[event.id].dead?)
      c3      = event.erased
      c4      = @parent.is_a?(Game_Event) and !hate     
      #
      # Move if hit condition not met, or perform hit
      if (c1 or c2 or c3) && !faux
        force_movement
      elsif (c1 or c2 or c3 or c4) && faux
        force_movement
      else
        hit_event(event.id)
      end
      #
    end
  end
  #--------------------------------------------------------------------------
  # * In Range?(Element, Object, Range) - Near Fantastica
  #     source : source of search (object performing test)
  #     target : target of search (object being searched)
  #     range  : range distance in tiles
  #--------------------------------------------------------------------------
  def in_range_ballistic?(x, y, target, range)
    #
    # Exit false if ballistic strikes parent/attacker
    return false if @parent == target
    #
    # Get differences
    change          = $ABS.get_size(target)
    t_ch_x, t_ch_y  = change[0], change[1]
    #
    # Loop through source and target coordinates with tile extensions
    for xt in (target.x - t_ch_x)..(target.x + t_ch_x)
      for yt in (target.y - t_ch_y)..(target.y)
        #
        # Confirm if updated coordinate are within the range test
        return true if $ABS.in_range_numeric?(x, y, xt, yt, range)
        #
      end
    end
    #
    # Exit method with no confirmation
    return false
    #
  end
end

The magic is instead moved into the in_range_ballistic? method.

  #    range  : range distance in tiles
  #--------------------------------------------------------------------------
  def in_range_ballistic?(x, y, target, range)
    #
    # Exit false if ballistic strikes parent/attacker
    return false if @parent == target
    #
    # Get differences
    change          = $ABS.get_size(target)
Similar to yours, it is more broad and decides to check if the parent is the target being passed into the method. If the target happens to be the parent, it will return 'false' indicating that the check is a failure. Thus, it will prevent the player from hitting itself, or prevent enemies from hitting themselves.

It is rather odd that the patch did not require this addition to the in_range_ballistic? method for the official v4.5 from 2006 and this edition you're using somehow does... something I clearly would not have expected.

VIDEO EDIT:


.mp4   2024-10-30 20-58-19_x264_Segment_0_x264_Segment_0_x264.mp4 (Size: 842.87 KB / Downloads: 2) <-- Yep, I shot em.

FURTHER EDIT: I'd set the troll guy to a size of 3,3,2,2...  to allow for the player to miss if shooting horizontally and behind it... just the bottom two tiles for the whole 60 degree perspective thingamabob. Winking  But that's me.
Up is down, left is right and sideways is straight ahead. - Cord "Circle of Iron", 1978 (written by Bruce Lee and James Coburn... really...)

[Image: QrnbKlx.jpg]
[Image: sGz1ErF.png]    [Image: liM4ikn.png]    [Image: fdzKgZA.png]    [Image: sj0H81z.png]
[Image: QL7oRau.png]    [Image: uSqjY09.png]    [Image: GAA3qE9.png]    [Image: 2Hmnx1G.png]    [Image: BwtNdKw.png%5B]
  Above are clickable links
Reply }


Messages In This Thread
Mr. Mo v 5.5 + Immense Events - by Tepe - 10-28-2024, 10:29 AM
RE: Mr. Mo v 5.5 + Immense Events - by Tepe - 10-28-2024, 09:12 PM
RE: Mr. Mo v 5.5 + Immense Events - by Tepe - 10-30-2024, 08:36 PM
RE: Mr. Mo v 5.5 + Immense Events - by kyonides - 10-30-2024, 09:28 PM
RE: Mr. Mo v 5.5 + Immense Events - by Tepe - 10-30-2024, 10:03 PM
RE: Mr. Mo v 5.5 + Immense Events - by DerVVulfman - 10-31-2024, 01:45 AM
RE: Mr. Mo v 5.5 + Immense Events - by Tepe - 10-31-2024, 02:13 AM
RE: Mr. Mo v 5.5 + Immense Events - by Tepe - 10-31-2024, 02:36 AM
RE: Mr. Mo v 5.5 + Immense Events - by Tepe - 10-31-2024, 03:10 AM
RE: Mr. Mo v 5.5 + Immense Events - by Tepe - 10-31-2024, 10:51 AM
RE: Mr. Mo v 5.5 + Immense Events - by Tepe - 10-31-2024, 03:37 PM
RE: Mr. Mo v 5.5 + Immense Events - by Tepe - 11-03-2024, 01:00 AM
RE: Mr. Mo v 5.5 + Immense Events - by Tepe - 11-03-2024, 05:57 PM

Possibly Related Threads…
Thread Author Replies Views Last Post
  Icon Display 1.0 scripts makes events impossible to go to events, which are passable Djigit 0 3,890 01-03-2015, 09:11 PM
Last Post: Djigit
   in FPLE touching events after battle causes rpg maker to crash ThePrinceofMars 1 5,501 11-27-2014, 09:11 PM
Last Post: MechanicalPen



Users browsing this thread: 7 Guest(s)