2015-11-17 20:35:51 +00:00
|
|
|
#==============================================================================
|
|
|
|
# ** Game_Character (part 2)
|
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
# This class deals with characters. It's used as a superclass for the
|
|
|
|
# Game_Player and Game_Event classes.
|
|
|
|
#==============================================================================
|
|
|
|
|
|
|
|
class Game_Character
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
# * Frame Update
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
def update
|
|
|
|
# Branch with jumping, moving, and stopping
|
|
|
|
if jumping?
|
|
|
|
update_jump
|
|
|
|
elsif moving?
|
|
|
|
update_move
|
|
|
|
else
|
|
|
|
update_stop
|
|
|
|
end
|
|
|
|
# If animation count exceeds maximum value
|
|
|
|
# * Maximum value is move speed * 1 taken from basic value 18
|
|
|
|
if @anime_count > 18 - @move_speed * 2
|
|
|
|
# If stop animation is OFF when stopping
|
|
|
|
if not @step_anime and @stop_count > 0
|
|
|
|
# Return to original pattern
|
|
|
|
@pattern = @original_pattern
|
|
|
|
# If stop animation is ON when moving
|
|
|
|
else
|
|
|
|
# Update pattern
|
|
|
|
@pattern = (@pattern + 1) % 4
|
|
|
|
end
|
|
|
|
# Clear animation count
|
|
|
|
@anime_count = 0
|
|
|
|
end
|
|
|
|
# If waiting
|
|
|
|
if @wait_count > 0
|
|
|
|
# Reduce wait count
|
|
|
|
@wait_count -= 1
|
|
|
|
return
|
|
|
|
end
|
|
|
|
# If move route is forced
|
|
|
|
if @move_route_forcing
|
|
|
|
# Custom move
|
|
|
|
move_type_custom
|
|
|
|
return
|
|
|
|
end
|
|
|
|
# When waiting for event execution or locked
|
|
|
|
if @starting or lock?
|
|
|
|
# Not moving by self
|
|
|
|
return
|
|
|
|
end
|
|
|
|
# If stop count exceeds a certain value (computed from move frequency)
|
|
|
|
if @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)
|
|
|
|
# Branch by move type
|
|
|
|
case @move_type
|
|
|
|
when 1 # Random
|
|
|
|
move_type_random
|
|
|
|
when 2 # Approach
|
|
|
|
move_type_toward_player
|
|
|
|
when 3 # Custom
|
|
|
|
move_type_custom
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
# * Frame Update (jump)
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
def update_jump
|
|
|
|
# Reduce jump count by 1
|
|
|
|
@jump_count -= 1
|
|
|
|
# Calculate new coordinates
|
|
|
|
@real_x = (@real_x * @jump_count + @x * 128) / (@jump_count + 1)
|
|
|
|
@real_y = (@real_y * @jump_count + @y * 128) / (@jump_count + 1)
|
|
|
|
end
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
# * Update frame (move)
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
def update_move
|
|
|
|
# Convert map coordinates from map move speed into move distance
|
|
|
|
distance = 2 ** @move_speed
|
|
|
|
# If logical coordinates are further down than real coordinates
|
|
|
|
if @y * 128 > @real_y
|
|
|
|
# Move down
|
|
|
|
@real_y = [@real_y + distance, @y * 128].min
|
|
|
|
end
|
|
|
|
# If logical coordinates are more to the left than real coordinates
|
|
|
|
if @x * 128 < @real_x
|
|
|
|
# Move left
|
|
|
|
@real_x = [@real_x - distance, @x * 128].max
|
|
|
|
end
|
|
|
|
# If logical coordinates are more to the right than real coordinates
|
|
|
|
if @x * 128 > @real_x
|
|
|
|
# Move right
|
|
|
|
@real_x = [@real_x + distance, @x * 128].min
|
|
|
|
end
|
|
|
|
# If logical coordinates are further up than real coordinates
|
|
|
|
if @y * 128 < @real_y
|
|
|
|
# Move up
|
|
|
|
@real_y = [@real_y - distance, @y * 128].max
|
|
|
|
end
|
|
|
|
# If move animation is ON
|
|
|
|
if @walk_anime
|
|
|
|
# Increase animation count by 1.5
|
|
|
|
@anime_count += 1.5
|
|
|
|
# If move animation is OFF, and stop animation is ON
|
|
|
|
elsif @step_anime
|
|
|
|
# Increase animation count by 1
|
|
|
|
@anime_count += 1
|
|
|
|
end
|
2015-11-21 02:08:00 +00:00
|
|
|
# Wrap position
|
|
|
|
if @x * 128 == @real_x && @y * 128 == @real_y
|
|
|
|
@x %= $game_map.width
|
|
|
|
@y %= $game_map.height
|
|
|
|
@real_x = @x * 128
|
|
|
|
@real_y = @y * 128
|
|
|
|
end
|
2015-11-17 20:35:51 +00:00
|
|
|
end
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
# * Frame Update (stop)
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
def update_stop
|
|
|
|
# If stop animation is ON
|
|
|
|
if @step_anime
|
|
|
|
# Increase animation count by 1
|
|
|
|
@anime_count += 1
|
|
|
|
# If stop animation is OFF, but current pattern is different from original
|
|
|
|
elsif @pattern != @original_pattern
|
|
|
|
# Increase animation count by 1.5
|
|
|
|
@anime_count += 1.5
|
|
|
|
end
|
|
|
|
# When waiting for event execution, or not locked
|
|
|
|
# * If lock deals with event execution coming to a halt
|
|
|
|
unless @starting or lock?
|
|
|
|
# Increase stop count by 1
|
|
|
|
@stop_count += 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
# * Move Type : Random
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
def move_type_random
|
|
|
|
# Branch by random numbers 0-5
|
|
|
|
case rand(6)
|
|
|
|
when 0..3 # Random
|
|
|
|
move_random
|
|
|
|
when 4 # 1 step forward
|
|
|
|
move_forward
|
|
|
|
when 5 # Temporary stop
|
|
|
|
@stop_count = 0
|
|
|
|
end
|
|
|
|
end
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
# * Move Type : Approach
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
def move_type_toward_player
|
|
|
|
# Get difference in player coordinates
|
|
|
|
sx = @x - $game_player.x
|
|
|
|
sy = @y - $game_player.y
|
|
|
|
# Get absolute value of difference
|
|
|
|
abs_sx = sx > 0 ? sx : -sx
|
|
|
|
abs_sy = sy > 0 ? sy : -sy
|
|
|
|
# If separated by 20 or more tiles matching up horizontally and vertically
|
|
|
|
if sx + sy >= 20
|
|
|
|
# Random
|
|
|
|
move_random
|
|
|
|
return
|
|
|
|
end
|
|
|
|
# Branch by random numbers 0-5
|
|
|
|
case rand(6)
|
|
|
|
when 0..3 # Approach player
|
|
|
|
move_toward_player
|
|
|
|
when 4 # random
|
|
|
|
move_random
|
|
|
|
when 5 # 1 step forward
|
|
|
|
move_forward
|
|
|
|
end
|
|
|
|
end
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
# * Move Type : Custom
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
def move_type_custom
|
|
|
|
# Interrupt if not stopping
|
|
|
|
if jumping? or moving?
|
|
|
|
return
|
|
|
|
end
|
|
|
|
# Loop until finally arriving at move command list
|
|
|
|
while @move_route_index < @move_route.list.size
|
|
|
|
# Acquiring move command
|
|
|
|
command = @move_route.list[@move_route_index]
|
|
|
|
# If command code is 0 (last part of list)
|
|
|
|
if command.code == 0
|
|
|
|
# If [repeat action] option is ON
|
|
|
|
if @move_route.repeat
|
|
|
|
# First return to the move route index
|
|
|
|
@move_route_index = 0
|
|
|
|
end
|
|
|
|
# If [repeat action] option is OFF
|
|
|
|
unless @move_route.repeat
|
|
|
|
# If move route is forcing
|
|
|
|
if @move_route_forcing and not @move_route.repeat
|
|
|
|
# Release forced move route
|
|
|
|
@move_route_forcing = false
|
|
|
|
# Restore original move route
|
|
|
|
@move_route = @original_move_route
|
|
|
|
@move_route_index = @original_move_route_index
|
|
|
|
@original_move_route = nil
|
|
|
|
end
|
|
|
|
# Clear stop count
|
|
|
|
@stop_count = 0
|
|
|
|
end
|
|
|
|
return
|
|
|
|
end
|
|
|
|
# During move command (from move down to jump)
|
|
|
|
if command.code <= 14
|
|
|
|
# Branch by command code
|
|
|
|
case command.code
|
|
|
|
when 1 # Move down
|
|
|
|
move_down
|
|
|
|
when 2 # Move left
|
|
|
|
move_left
|
|
|
|
when 3 # Move right
|
|
|
|
move_right
|
|
|
|
when 4 # Move up
|
|
|
|
move_up
|
|
|
|
when 5 # Move lower left
|
|
|
|
move_lower_left
|
|
|
|
when 6 # Move lower right
|
|
|
|
move_lower_right
|
|
|
|
when 7 # Move upper left
|
|
|
|
move_upper_left
|
|
|
|
when 8 # Move upper right
|
|
|
|
move_upper_right
|
|
|
|
when 9 # Move at random
|
|
|
|
move_random
|
|
|
|
when 10 # Move toward player
|
|
|
|
move_toward_player
|
|
|
|
when 11 # Move away from player
|
|
|
|
move_away_from_player
|
|
|
|
when 12 # 1 step forward
|
|
|
|
move_forward
|
|
|
|
when 13 # 1 step backward
|
|
|
|
move_backward
|
|
|
|
when 14 # Jump
|
|
|
|
jump(command.parameters[0], command.parameters[1])
|
|
|
|
end
|
|
|
|
# If movement failure occurs when [Ignore if can't move] option is OFF
|
|
|
|
if not @move_route.skippable and not moving? and not jumping?
|
|
|
|
return
|
|
|
|
end
|
|
|
|
@move_route_index += 1
|
|
|
|
return
|
|
|
|
end
|
|
|
|
# If waiting
|
|
|
|
if command.code == 15
|
|
|
|
# Set wait count
|
|
|
|
@wait_count = command.parameters[0] * 2 - 1
|
|
|
|
@move_route_index += 1
|
|
|
|
return
|
|
|
|
end
|
|
|
|
# If direction change command
|
|
|
|
if command.code >= 16 and command.code <= 26
|
|
|
|
# Branch by command code
|
|
|
|
case command.code
|
|
|
|
when 16 # Turn down
|
|
|
|
turn_down
|
|
|
|
when 17 # Turn left
|
|
|
|
turn_left
|
|
|
|
when 18 # Turn right
|
|
|
|
turn_right
|
|
|
|
when 19 # Turn up
|
|
|
|
turn_up
|
|
|
|
when 20 # Turn 90° right
|
|
|
|
turn_right_90
|
|
|
|
when 21 # Turn 90° left
|
|
|
|
turn_left_90
|
|
|
|
when 22 # Turn 180°
|
|
|
|
turn_180
|
|
|
|
when 23 # Turn 90° right or left
|
|
|
|
turn_right_or_left_90
|
|
|
|
when 24 # Turn at Random
|
|
|
|
turn_random
|
|
|
|
when 25 # Turn toward player
|
|
|
|
turn_toward_player
|
|
|
|
when 26 # Turn away from player
|
|
|
|
turn_away_from_player
|
|
|
|
end
|
|
|
|
@move_route_index += 1
|
|
|
|
return
|
|
|
|
end
|
|
|
|
# If other command
|
|
|
|
if command.code >= 27
|
|
|
|
# Branch by command code
|
|
|
|
case command.code
|
|
|
|
when 27 # Switch ON
|
|
|
|
$game_switches[command.parameters[0]] = true
|
|
|
|
$game_map.need_refresh = true
|
|
|
|
when 28 # Switch OFF
|
|
|
|
$game_switches[command.parameters[0]] = false
|
|
|
|
$game_map.need_refresh = true
|
|
|
|
when 29 # Change speed
|
|
|
|
@move_speed = command.parameters[0]
|
|
|
|
when 30 # Change freq
|
|
|
|
@move_frequency = command.parameters[0]
|
|
|
|
when 31 # Move animation ON
|
|
|
|
@walk_anime = true
|
|
|
|
when 32 # Move animation OFF
|
|
|
|
@walk_anime = false
|
|
|
|
when 33 # Stop animation ON
|
|
|
|
@step_anime = true
|
|
|
|
when 34 # Stop animation OFF
|
|
|
|
@step_anime = false
|
|
|
|
when 35 # Direction fix ON
|
|
|
|
@direction_fix = true
|
|
|
|
when 36 # Direction fix OFF
|
|
|
|
@direction_fix = false
|
|
|
|
when 37 # Through ON
|
|
|
|
@through = true
|
|
|
|
when 38 # Through OFF
|
|
|
|
@through = false
|
|
|
|
when 39 # Always on top ON
|
|
|
|
@always_on_top = true
|
|
|
|
when 40 # Always on top OFF
|
|
|
|
@always_on_top = false
|
|
|
|
when 41 # Change Graphic
|
|
|
|
@tile_id = 0
|
|
|
|
@character_name = command.parameters[0]
|
|
|
|
@character_hue = command.parameters[1]
|
|
|
|
if @original_direction != command.parameters[2]
|
|
|
|
@direction = command.parameters[2]
|
|
|
|
@original_direction = @direction
|
|
|
|
@prelock_direction = 0
|
|
|
|
end
|
|
|
|
if @original_pattern != command.parameters[3]
|
|
|
|
@pattern = command.parameters[3]
|
|
|
|
@original_pattern = @pattern
|
|
|
|
end
|
|
|
|
when 42 # Change Opacity
|
|
|
|
@opacity = command.parameters[0]
|
|
|
|
when 43 # Change Blending
|
|
|
|
@blend_type = command.parameters[0]
|
|
|
|
when 44 # Play SE
|
|
|
|
$game_system.se_play(command.parameters[0])
|
|
|
|
when 45 # Script
|
|
|
|
result = eval(command.parameters[0])
|
|
|
|
end
|
|
|
|
@move_route_index += 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
# * Increase Steps
|
|
|
|
#--------------------------------------------------------------------------
|
|
|
|
def increase_steps
|
|
|
|
# Clear stop count
|
|
|
|
@stop_count = 0
|
|
|
|
end
|
|
|
|
end
|