10-30-2024, 07:08 PM
Here it is... basic instructions.
I had to perform an auto-detect switch (looking for "DEFEND_DAMAGE_PERCENT" which is not part of 4.5) because the unofficial version's ballistic's enemy hit detect system adds a 4th condition.
This will eventually be placed within the Scripts Database with better written instructions... and credit to Tepe for the request.
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)
#
# 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
I had to perform an auto-detect switch (looking for "DEFEND_DAMAGE_PERCENT" which is not part of 4.5) because the unofficial version's ballistic's enemy hit detect system adds a 4th condition.
This will eventually be placed within the Scripts Database with better written instructions... and credit to Tepe for the request.