Понадобилось сделать режим panic (drunk, confuse) героя, когда он ходит в обратную сторону, то есть, нажмешь вправо - он влево идет и так далее. Интернеты, обычно, предлагают простой способ через Common Event, например,
тут .
Проблема в том, что кроме евента отрабатывает и скрипт карты, из-за чего герой, по нажатию клавиши, вместо одной клетки ходит на две. Конечно, паники это добавляет
, но больше, все-таки, неудобств игроку.
Поэтому я написал небольшой скрипт, который делает режим паники более корректным. Вставьте его над Main, и в игре просто вызывайте, когда нужно скрипт
$game_player.set_panic_mode(1) для паники, и
$game_player.set_panic_mode(0) для обычного движения.
Демку, как обычно,
прилагаю
class Game_Character
alias panic_initialize initialize
def initialize
@panic_mode = 0
panic_initialize
end
# 1 - Panic, 0 - Normal
def set_panic_mode(mode)
@panic_mode = mode
end
end
class Game_Player
alias panic_update update
def update
last_moving = moving?
unless moving? or $game_system.map_interpreter.running? or
@move_route_forcing or $game_temp.message_window_showing
case Input.dir4
when 2
@panic_mode == 0 ? move_down : move_up
when 4
@panic_mode == 0 ? move_left : move_right
when 6
@panic_mode == 0 ? move_right : move_left
when 8
@panic_mode == 0 ? move_up : move_down
end
end
last_real_x = @real_x
last_real_y = @real_y
super
if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
$game_map.scroll_down(@real_y - last_real_y)
end
if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
$game_map.scroll_left(last_real_x - @real_x)
end
if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
$game_map.scroll_right(@real_x - last_real_x)
end
if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
$game_map.scroll_up(last_real_y - @real_y)
end
unless moving?
if last_moving
result = check_event_trigger_here([1,2])
if result == false
unless $DEBUG and Input.press?(Input::CTRL)
if @encounter_count > 0
@encounter_count -= 1
end
end
end
end
if Input.trigger?(Input::C)
check_event_trigger_here([0])
check_event_trigger_there([0,1,2])
end
end
end
end