Advertisement
deadelf79

FPLE RU 1.5 + 0.1

Jan 6th, 2016
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 99.13 KB | None | 0 0
  1. #====================================================================
  2. # First Person Labyrinth Explorer (FPLE) Engine - VX Ace version
  3. # Исследователь лабиринтов от первого лица - Версия для VX Ace
  4. # v.1.5 + 0.1 (избавил от строгой зависимости от разрешения)
  5. # Автор : MGC
  6. # Перевод и дополнения: DeadElf79 (06.01.2016)
  7. #====================================================================
  8. # ЭТОТ СКРИПТ СОЗДАН НЕ ДЛЯ FPS, скорее для чего-то вроде FPRPG
  9. #
  10. # Этот скрипт был портирован с версии FPLE 1.5 для RPG Maker XP
  11. # и содержит незначительные изменения.
  12. #
  13. # Характеристики :
  14. # - Режим от первого лица можно включить для каждой карты отдельно.
  15. # - Помимо движения вперд и назад, есть повороты на 90° и даже стрейф (ходьба боком)
  16. # - Можно снизить качество графики, чтобы снизить количество лагов
  17. # - Допустимо использование режимов смешивания (blend type) для событий.
  18. #
  19. # Ограничения :
  20. # - На самом деле, этот скрипт не слишком подходит для событий, срабатывающих
  21. # при наступлении игрока на них (Player Touch). Используйте с умом.
  22. # - Отображение анимаций происходит в тех же масштабах,
  23. # что используются мейкером обычно. Поэтому они могут оказаться немного
  24. # (или, наоборот, намного) меньше, чем события.
  25. # - игрок не может двигаться по диагонали под любым углом и прыгать
  26. # - стены не могут быть прозрачными
  27. # - нет высот, кроме одной. весь уровень одноэтажен.
  28. #
  29. # Инструкция :
  30. # - Установите скрипт выше Main (как обычно)
  31. # - Добавьте в папку с проектом MGC_FPLE_Ace_1_1.dll. Положите его прямо рядом
  32. # с Game.exe
  33. #
  34. # Создание карты :
  35. # - карта уровня для вида от первого лица должна быть импортирована из редактора
  36. #   под название Marta
  37. # - карта уровня для RPG Maker рисуется вручную (пока Marta не умеет
  38. #   экспортировать еще и ее для облегчения работы разработчиков), чтобы можно
  39. #   было расставить события, с которыми игрок будет взаимодействовать
  40. #
  41. # - Настройки событий (ивентов)
  42. # Движок позволяет задать событиям различные настройки для отображения
  43. # для создания различных эффектов.
  44. # Каждое из перечисленных ниже свойство должно быть указано для каждой страницы
  45. # события, а также - в отдельном комментарии.
  46. # ОДНО СВОЙСТВО - ОДИН КОММЕНТАРИЙ!
  47. # КАВЫЧКИ НЕ НУЖНЫ!
  48. # "Type 0" : выглядит вроде объемно и спотыкается об игрока (по умолчанию)
  49. # "Type 1" : выглядит плоско и смотрит по горизонтали относительно окна редактора(вид сверху)
  50. # "Type 2" : выглядит плоско и смотрит по вертикали относительно окна редактора(вид сверху)
  51. # "Stretch" : изображение растягивается на всю ширину/высоту прохода
  52. # "Fit" : изображение растягивается на высоту стены, сохраняя
  53. #         при этом соотношение сторон. По умолчанию применяется для изображений,
  54. #         превышающих высоту стены (новинка пришла с переходом на VX Ace)
  55. # "Zoom X.X" : увеличивает масштаб изображения (новинка из VX Ace), например,
  56. #              "Zoom 2.0" увеличит спрайт события в два раза.
  57. #             Для персонажей, созданных в генераторе чаров VX Ace
  58. #             рекомендуется значение не меньше, чем 5.0
  59. # "V-Align 0" : изображение событие будет отображено наверу (хорошо для ламп)
  60. # "V-Align 1" : изображение событие будет отображено посередине (по умолчанию)
  61. # "V-Align 2" : изображение событие будет отображено внизу (как будто стоит на полу)
  62. # "D-Align 0" : выравнивание по глубине/влево для типов 1 и 2
  63. # "D-Align 1" : выравнивание глубины по центры для типов 1 и 2 (по умолчанию)
  64. # "D-Align 2" : выравнивание по глубине/вправо для типов 1 et 2
  65. # "1-Side" : текстура, наложенная с одной стороны, отзеркаливается на другой (?)
  66. #
  67. # - Параметры
  68. # В модуле FPLE вы можете настроить несколько вещей :
  69. #   - VIEW_DISTANCE : les "surfaces" (polygones carrés texturés de dimensions
  70. #                     fixes représentant les tiles et les évènements) ne sont
  71. #                     affichées qu'à l'intérieur d'une certaine distance autour
  72. #                     du joueur. Cette constante représente cette distance,
  73. #                     exprimée en tiles (valeur par défaut : 6). Plus cette
  74. #                     valeur est élévée, plus les risques de lag le sont aussi.
  75. #   - RESOLUTION : dessiner l'ensemble de l'écran à chaque frame demande
  76. #                  beaucoup de ressources. Pendant les déplacements, il est
  77. #                  possible d'utiliser une résolution plus petite d'écran et le
  78. #                  rendu sera alors zoomé pour s'adapter à 544px*416px.
  79. #                  -1: адаптивное разрешение (подстраивается под Graphics)
  80. #                  0 : макисмальное разрешение (544px*416px)
  81. #                  1 : хорошее качество (408px*312px)
  82. #                  2 : среднее качество (272px*208px)
  83. #                  3 : минимальное качество изображения (204px*156px)
  84. #   - ALWAYS_SAME_RES : true - качество картинки в то время,
  85. #                       когда игрок просто стоит на месте,
  86. #                       будет таким же, как в движении
  87. #                       false - качество картинки будет максимальным.
  88. #   - LIGHT_DISTANCE : чтобы избежать внезапного появления стен из пустоты,
  89. #                      эта настройка позволяет определить дистанцию, на которой
  90. #                      стены будут постепенно переходит в затемнение. Не ставьте
  91. #                      значений от 7 и выше.
  92. #                      При использовании параллаксов вы можете увидеть плавный
  93. #                      переход стен в "небеса".
  94. #                      Вы можете поставить 0, чтобы отключить эту функцию.
  95. #
  96. # - Настройки движка для использования во время игры
  97. # (через команду "Вызов скрипта" в событии):
  98. #   - $game_temp.set_view(new_view_distance)
  99. #   - $game_temp.set_light(new_light_distance)
  100. #   - $game_temp.increase_light
  101. #   - $game_temp.decrease_light
  102. #====================================================================
  103. module FPLE
  104.   #--------------------------------------------------------------------------
  105.   # * НАСТРОЙКИ
  106.   #--------------------------------------------------------------------------
  107.   VIEW_DISTANCE = 6 # в тайлах, должно быть > 0
  108.   LIGHT_DISTANCE = 5 # в тайлах, должно быть >=0, 0=выключено
  109.   RESOLUTION = -1 # качество графики. -1 - адаптивное, 0 - максимальное,
  110.                   # от 1 до 3 - постепенное снижение качества
  111.   ALWAYS_SAME_RES = false # true - качество картинки в то время,
  112.                           # когда игрок просто стоит на месте,
  113.                           # будет таким же, как в движении
  114.                           # false - качество картинки будет максимальным.
  115.   # Добавка от Эльфа:
  116.   # При управлении с клавиатуры при настройках управления по умолчанию
  117.   # вы сможете использовать стрейф, нажимая клавиши A (:X) и D (:Z)
  118.   # просто незначительное улучшение для удобства.
  119.   STRAFE_LEFT = :X
  120.   STRAFE_RIGHT = :Z
  121.  
  122. end
  123. #==============================================================================
  124. # ** Ядро FPLE
  125. # Дальше я не переводил. Но думаю, вы не потеряетесь.
  126. #                                           Эльф.
  127. #==============================================================================
  128. module FPLE
  129.   #--------------------------------------------------------------------------
  130.   # * Constantes
  131.   #--------------------------------------------------------------------------
  132.   MAP_SIDES = [4, 3, 5, 2]
  133.   MAP_SIDES_LEFT = [5, 4, 2, 3]
  134.   MAP_SIDES_RIGHT = [3, 2, 4, 5]
  135.   PLAYER_MOVE_FORWARD = [[0, 1], [-1, 0], [1, 0], [0, -1]]
  136.   PLAYER_MOVE_SPEED = [0, 1, 2, 4, 6, 8, 12]
  137.   TURN_LEFT = [6, 2, 8, 4]
  138.   COS_TABLE = [4096, 4095, 4094, 4090, 4086,
  139.   4080, 4074, 4065, 4056, 4046, 4034, 4021, 4006, 3991, 3974,
  140.   3956, 3937, 3917, 3896, 3873, 3849, 3824, 3798, 3770, 3742,
  141.   3712, 3681, 3650, 3617, 3582, 3547, 3511, 3474, 3435, 3396,
  142.   3355, 3314, 3271, 3228, 3183, 3138, 3091, 3044, 2996, 2946,
  143.   2896, 2845, 2793, 2741, 2687, 2633, 2578, 2522, 2465, 2408,
  144.   2349, 2290, 2231, 2171, 2110, 2048, 1986, 1923, 1860, 1796,
  145.   1731, 1666, 1600, 1534, 1468, 1401, 1334, 1266, 1198, 1129,
  146.   1060, 991, 921, 852, 782, 711, 641, 570, 499, 428,
  147.   357, 286, 214, 143, 71, 0]
  148.   RENDER = Win32API.new("MGC_FPLE_Ace_1_2", "RenderFPLE", "lll", "l") # [1.5]
  149.   RENDER_ROT = Win32API.new("MGC_FPLE_Ace_1_2", "RenderFPLErot", "lll", "l") # [1.5]
  150.   #--------------------------------------------------------------------------
  151.   # * Retourne l'angle d'orientation
  152.   # return Integer
  153.   #--------------------------------------------------------------------------
  154.   def self.angle
  155.     return @angle
  156.   end
  157.   #--------------------------------------------------------------------------
  158.   # * Retourne le décalage horizontal
  159.   # return Integer
  160.   #--------------------------------------------------------------------------
  161.   def self.offset_x
  162.     return @offset_x
  163.   end
  164.   #--------------------------------------------------------------------------
  165.   # * Retourne le décalage en profondeur
  166.   # return Integer
  167.   #--------------------------------------------------------------------------
  168.   def self.offset_y
  169.     return @offset_y
  170.   end
  171.   #--------------------------------------------------------------------------
  172.   # * Initialisation
  173.   # param spriteset : FPLE::Spriteset_Map
  174.   # param viewport : Viewport
  175.   #--------------------------------------------------------------------------
  176.   def self.initialize_fple(spriteset, viewport)
  177.     @spriteset = spriteset
  178.     @sprite_screen = Sprite.new(viewport)
  179.     @sprite_move = Sprite.new(viewport)
  180.     self.initialize_bitmaps
  181.     @offset_x = 0
  182.     @offset_y = 0
  183.     @sprite_move.visible = false
  184.     @lux_distance = $game_system.fple_light_distance << 5
  185.     @angle = 0
  186.     @trig = 0
  187.     self.refresh_trig
  188.     @count = 0
  189.     $game_temp.force_render = true
  190.     self.update
  191.   end
  192.   #--------------------------------------------------------------------------
  193.   # * Création des objets Bitmap devant contenir le rendu 3D
  194.   #--------------------------------------------------------------------------
  195.   def self.initialize_bitmaps
  196.     case $game_system.fple_resolution
  197.     when -1
  198.       width = Graphics.width
  199.       height = Graphics.height
  200.       coefficient_resolution = 1
  201.     when 0
  202.       width = 544
  203.       height = 416
  204.       if Graphics.width == 544
  205.         coefficient_resolution = 1
  206.       else
  207.         coefficient_resolution = 1.175
  208.       end
  209.     when 1
  210.       width = 408
  211.       height = 312
  212.       coefficient_resolution = 1.334
  213.     when 2
  214.       width = 272
  215.       height = 208
  216.       coefficient_resolution = 2
  217.     when 3
  218.       width = 204
  219.       height = 156
  220.       coefficient_resolution = 2.667
  221.     end
  222.     if $game_system.fple_always_same_res
  223.       @sprite_screen.bitmap = Bitmap.new(width, height)
  224.       @sprite_screen.zoom_x = coefficient_resolution
  225.       @sprite_screen.zoom_y = coefficient_resolution
  226.     else
  227.       @sprite_screen.bitmap = Bitmap.new(Graphics.width,Graphics.height)
  228.       #(544, 416)
  229.     end
  230.     @sprite_move.bitmap = Bitmap.new(width, height)
  231.     @sprite_move.zoom_x = coefficient_resolution
  232.     @sprite_move.zoom_y = coefficient_resolution
  233.   end
  234.   #--------------------------------------------------------------------------
  235.   # * Cherche les valeurs de sinus et cosinus en focntion de l'angle
  236.   #--------------------------------------------------------------------------
  237.   def self.refresh_trig
  238.     @cos = FPLE::COS_TABLE[@angle]
  239.     @sin = FPLE::COS_TABLE[91 - @angle]
  240.   end
  241.   #--------------------------------------------------------------------------
  242.   # * Dispose
  243.   #--------------------------------------------------------------------------
  244.   def self.dispose
  245.     @sprite_screen.dispose
  246.     @sprite_move.dispose
  247.   end
  248.   #--------------------------------------------------------------------------
  249.   # * Frame Update
  250.   #--------------------------------------------------------------------------
  251.   def self.update
  252.     if $game_temp.movement
  253.       case $game_temp.movement_dir
  254.       when 0 # fading distance + 1
  255.         self.increase_fading_distance
  256.       when 1 # fading distance - 1
  257.         self.decrease_fading_distance
  258.       when 3 # set fading distance
  259.         self.set_fading_distance
  260.       when 2 # Move backward
  261.         self.move_backward
  262.       when 4 # Strafe left
  263.         self.strafe_left
  264.       when 6 # Strafe right
  265.         self.strafe_right
  266.       when 8 # Move forward
  267.         self.move_forward
  268.       when 9 # Turn right
  269.         self.turn_right
  270.       when 10 # turn left
  271.         self.turn_left
  272.       end
  273.       if $game_temp.movement
  274.         @sprite_screen.visible = false
  275.         @sprite_move.visible = true
  276.         @sprite_move.bitmap.clear
  277.         if @angle == 0
  278.           FPLE::RENDER.call(
  279.           @sprite_move.bitmap.__id__,
  280.           $game_map.surfaces.__id__,
  281.           [@offset_y, @offset_x, @lux_distance, $game_player.direction,
  282.           $game_map.fple_map.texturesets].__id__)
  283.         else
  284.           FPLE::RENDER_ROT.call(
  285.           @sprite_move.bitmap.__id__,
  286.           $game_map.surfaces.__id__,
  287.           [@offset_y, @offset_x, @lux_distance, $game_player.direction,
  288.           @trig, @cos, @sin, $game_map.fple_map.texturesets].__id__)
  289.         end
  290.       else
  291.         @sprite_screen.visible = true
  292.         @sprite_move.visible = false
  293.         @sprite_screen.bitmap.clear
  294.         FPLE::RENDER.call(
  295.         @sprite_screen.bitmap.__id__,
  296.         $game_map.surfaces.__id__,
  297.         [@offset_y, @offset_x, @lux_distance, $game_player.direction,
  298.         $game_map.fple_map.texturesets].__id__)
  299.         if $game_temp.last_moving
  300.           $game_player.update_nonmoving($game_temp.last_moving)
  301.         end
  302.       end
  303.       $game_temp.force_render = false
  304.     elsif $game_temp.force_render
  305.       $game_map.refresh_surfaces
  306.       $game_map.refresh_character_surfaces(@spriteset.character_surfaces)
  307.       @sprite_screen.bitmap.clear
  308.       FPLE::RENDER.call(
  309.       @sprite_screen.bitmap.__id__,
  310.       $game_map.surfaces.__id__,
  311.       [@offset_y, @offset_x, @lux_distance, $game_player.direction,
  312.       $game_map.fple_map.texturesets].__id__)
  313.       $game_temp.force_render = false
  314.     end
  315.   end
  316.   #--------------------------------------------------------------------------
  317.   # * Frame Update - Augmentation de la distance d'éclairage
  318.   #--------------------------------------------------------------------------
  319.   def self.increase_fading_distance
  320.     @count += 2
  321.     @lux_distance += 2
  322.     if @count == 32
  323.       @count = 0
  324.       $game_temp.movement = false
  325.     end
  326.   end
  327.   #--------------------------------------------------------------------------
  328.   # * Frame Update - Diminution de la distance d'éclairage
  329.   #--------------------------------------------------------------------------
  330.   def self.decrease_fading_distance
  331.     if @lux_distance == 0
  332.       @count = 0
  333.       $game_temp.movement = false
  334.     else
  335.       @count += 2
  336.       @lux_distance -= 2
  337.       if @count == 32
  338.         @count = 0
  339.         $game_temp.movement = false
  340.       end
  341.     end
  342.   end
  343.   #--------------------------------------------------------------------------
  344.   # * Frame Update - Définition d'une nouvelle distance d'éclairage
  345.   #--------------------------------------------------------------------------
  346.   def self.set_fading_distance
  347.     @lux_distance = $game_system.fple_light_distance << 5
  348.     $game_temp.movement = false
  349.   end
  350.   #--------------------------------------------------------------------------
  351.   # * Frame Update - Déplacement en arrière
  352.   #--------------------------------------------------------------------------
  353.   def self.move_backward
  354.     unless $game_temp.movement_init
  355.       $game_map.refresh_surfaces
  356.       $game_map.refresh_character_surfaces(@spriteset.character_surfaces)
  357.       $game_temp.movement_init = true
  358.       @offset_y = 128
  359.     end
  360.     @offset_y -= $game_player.move_speed_fple
  361.     if @offset_y <= 0
  362.       @offset_y = 0
  363.       $game_temp.movement = false
  364.       $game_temp.last_moving = true
  365.       $game_map.refresh_surfaces
  366.       $game_map.refresh_character_surfaces(@spriteset.character_surfaces)
  367.     end
  368.   end
  369.   #--------------------------------------------------------------------------
  370.   # * Frame Update - Déplacement latéral vers la gauche
  371.   #--------------------------------------------------------------------------
  372.   def self.strafe_left
  373.     unless $game_temp.movement_init
  374.       $game_map.refresh_surfaces
  375.       $game_map.refresh_surfaces_strafe(0)
  376.       $game_map.refresh_character_surfaces(@spriteset.character_surfaces)
  377.       $game_temp.movement_init = true
  378.       @offset_x = 128
  379.     end
  380.     @offset_x -= $game_player.move_speed_fple
  381.     if @offset_x <= 0
  382.       @offset_x = 0
  383.       $game_temp.movement = false
  384.       $game_temp.last_moving = true
  385.       $game_map.refresh_surfaces
  386.       $game_map.refresh_character_surfaces(@spriteset.character_surfaces)
  387.     end
  388.   end
  389.   #--------------------------------------------------------------------------
  390.   # * Frame Update - Déplacement latéral vers la droite
  391.   #--------------------------------------------------------------------------
  392.   def self.strafe_right
  393.     unless $game_temp.movement_init
  394.       $game_map.refresh_surfaces_strafe(-1)
  395.       $game_temp.movement_init = true
  396.     end
  397.     @offset_x += $game_player.move_speed_fple
  398.     if @offset_x >= 128
  399.       @offset_x = 0
  400.       $game_temp.movement = false
  401.       $game_temp.last_moving = true
  402.       $game_map.refresh_surfaces
  403.       $game_map.refresh_character_surfaces(@spriteset.character_surfaces)
  404.     end
  405.   end
  406.   #--------------------------------------------------------------------------
  407.   # * Frame Update - Déplacement en avant
  408.   #--------------------------------------------------------------------------
  409.   def self.move_forward
  410.     @offset_y += $game_player.move_speed_fple
  411.     if @offset_y >= 128
  412.       @offset_y = 0
  413.       $game_temp.movement = false
  414.       $game_temp.last_moving = true
  415.       $game_map.refresh_surfaces
  416.       $game_map.refresh_character_surfaces(@spriteset.character_surfaces)
  417.     end
  418.   end
  419.   #--------------------------------------------------------------------------
  420.   # * Frame Update - Rotation vers la droite
  421.   #--------------------------------------------------------------------------
  422.   def self.turn_right
  423.     unless $game_temp.movement_init
  424.       $game_map.refresh_surfaces_turn_right(@spriteset.character_surfaces)
  425.       $game_temp.movement_init = true
  426.     end
  427.     @angle += 5
  428.     @trig = 1
  429.     refresh_trig
  430.     if @angle == 90
  431.       @angle = 0
  432.       $game_temp.movement = false
  433.       $game_map.refresh_surfaces
  434.       $game_map.refresh_character_surfaces(@spriteset.character_surfaces)
  435.     end
  436.   end
  437.   #--------------------------------------------------------------------------
  438.   # * Frame Update - Rotation vers la gauche
  439.   #--------------------------------------------------------------------------
  440.   def self.turn_left
  441.     unless $game_temp.movement_init
  442.       $game_map.refresh_surfaces_turn_left(@spriteset.character_surfaces)
  443.       $game_temp.movement_init = true
  444.       @angle = 90
  445.     end
  446.     @angle -= 5
  447.     @trig = 0
  448.     refresh_trig
  449.     if @angle == 0
  450.       $game_temp.movement = false
  451.       $game_map.refresh_surfaces
  452.       $game_map.refresh_character_surfaces(@spriteset.character_surfaces)
  453.     end
  454.   end
  455. end
  456.  
  457. #==============================================================================
  458. # ** DataManager
  459. #==============================================================================
  460. module DataManager
  461.   #--------------------------------------------------------------------------
  462.   # * Aliased methods (F12 compatibility)
  463.   #--------------------------------------------------------------------------
  464.   class << self
  465.     unless @already_aliased_fple
  466.       alias save_game_without_rescue_fple save_game_without_rescue
  467.       @already_aliased_fple = true
  468.     end
  469.   end
  470.   #--------------------------------------------------------------------------
  471.   # * Execute Save (No Exception Processing)
  472.   #--------------------------------------------------------------------------
  473.   def self.save_game_without_rescue(index)
  474.     if $game_map.fple_map # [1.2]
  475.       textureset = $game_map.fple_map.textureset
  476.       texturesets = $game_map.fple_map.texturesets
  477.       $game_map.fple_map.textureset = nil
  478.       $game_map.fple_map.texturesets = nil
  479.     end
  480.     rc = save_game_without_rescue_fple(index)
  481.     if $game_map.fple_map # [1.2]
  482.       $game_map.fple_map.texturesets = texturesets
  483.       $game_map.fple_map.textureset = textureset
  484.     end
  485.     return rc
  486.   end
  487. end
  488.  
  489. #============================================================================
  490. # ** Game_System
  491. #============================================================================
  492. class Game_System
  493.   #--------------------------------------------------------------------------
  494.   # * Aliased methods (F12 compatibility)
  495.   #--------------------------------------------------------------------------
  496.   unless @already_aliased_fple
  497.     alias initialize_fple initialize
  498.     @already_aliased_fple = true
  499.   end
  500.   #--------------------------------------------------------------------------
  501.   # * Public Instance Variables
  502.   #--------------------------------------------------------------------------
  503.   attr_accessor :fple # Boolean
  504.   attr_accessor :fple_view_distance # Integer (>0)
  505.   attr_accessor :fple_light_distance # Integer (>=0, 0:deactivated)
  506.   attr_accessor :fple_resolution # Integer (0:max, 1:medium, 2:low, 3:ugly)
  507.   attr_accessor :fple_always_same_res # Boolean
  508.   #--------------------------------------------------------------------------
  509.   # * Object Initialization
  510.   #--------------------------------------------------------------------------
  511.   def initialize
  512.     initialize_fple
  513.     self.fple = false
  514.     self.fple_view_distance = FPLE::VIEW_DISTANCE
  515.     self.fple_light_distance = FPLE::LIGHT_DISTANCE
  516.     self.fple_resolution = FPLE::RESOLUTION
  517.     self.fple_always_same_res = FPLE::ALWAYS_SAME_RES
  518.   end
  519. end
  520.  
  521. #==============================================================================
  522. # ** Game_Temp
  523. #==============================================================================
  524. class Game_Temp
  525.   #--------------------------------------------------------------------------
  526.   # * Aliased methods (F12 compatibility)
  527.   #--------------------------------------------------------------------------
  528.   unless @already_aliased_fple
  529.     alias initialize_fple initialize
  530.     @already_aliased_fple = true
  531.   end
  532.   #--------------------------------------------------------------------------
  533.   # * Public Instance Variables
  534.   #--------------------------------------------------------------------------
  535.   attr_accessor :movement_init # Boolean
  536.   attr_accessor :movement # Boolean
  537.   attr_accessor :movement_dir # Integer {2, 4, 6, 8}
  538.   attr_accessor :last_moving # Boolean
  539.   attr_accessor :force_render # Boolean
  540.   #--------------------------------------------------------------------------
  541.   # * Object Initialization
  542.   #--------------------------------------------------------------------------
  543.   def initialize
  544.     initialize_fple
  545.     self.movement_init = false
  546.     self.movement = false
  547.     self.movement_dir = 8
  548.     self.last_moving = false
  549.     self.force_render = false
  550.   end
  551.   #--------------------------------------------------------------------------
  552.   # * Set view distance
  553.   # param distance : Integer
  554.   #--------------------------------------------------------------------------
  555.   def set_view(distance)
  556.     if distance < 0 then distance = 0 end
  557.     $game_system.fple_view_distance = distance
  558.     self.force_render = true
  559.   end
  560.   #--------------------------------------------------------------------------
  561.   # * Set light distance
  562.   # param distance : Integer
  563.   #--------------------------------------------------------------------------
  564.   def set_light(distance)
  565.     if distance < 0 then distance = 0 end
  566.     $game_system.fple_light_distance = distance
  567.     self.movement = true
  568.     self.movement_dir = 3
  569.   end
  570.   #--------------------------------------------------------------------------
  571.   # * Increase light distance
  572.   #--------------------------------------------------------------------------
  573.   def increase_light
  574.     $game_system.fple_light_distance += 1
  575.     self.movement = true
  576.     self.movement_dir = 0
  577.   end
  578.   #--------------------------------------------------------------------------
  579.   # * Decrease light distance
  580.   #--------------------------------------------------------------------------
  581.   def decrease_light
  582.     if $game_system.fple_light_distance > 0
  583.       $game_system.fple_light_distance -= 1
  584.     end
  585.     self.movement = true
  586.     self.movement_dir = 1
  587.   end
  588. end
  589.  
  590. #============================================================================
  591. # ** Game_Map
  592. #============================================================================
  593. class Game_Map
  594.   #--------------------------------------------------------------------------
  595.   # * Aliased methods (F12 compatibility)
  596.   #--------------------------------------------------------------------------
  597.   unless @already_aliased_fple
  598.     alias initialize_fple initialize
  599.     alias setup_fple setup
  600.     alias refresh_fple refresh
  601.     @already_aliased_fple = true
  602.   end
  603.   #--------------------------------------------------------------------------
  604.   # * Public Instance Variables
  605.   #--------------------------------------------------------------------------
  606.   attr_accessor :surfaces # Array<Array<Integer>>
  607.   #--------------------------------------------------------------------------
  608.   # * Object Initialization
  609.   #--------------------------------------------------------------------------
  610.   def initialize
  611.     initialize_fple
  612.     self.surfaces = []
  613.     @x_ref = 0
  614.     @y_ref = 0
  615.   end
  616.   #--------------------------------------------------------------------------
  617.   # * Setup
  618.   # param map_id : Integer
  619.   #--------------------------------------------------------------------------
  620.   def setup(map_id)
  621.     @map_id = map_id
  622.     @map = load_data(sprintf("Data/Map%03d.rvdata2", @map_id))
  623.     if is_fple?
  624.       load_fple_map
  625.       $game_system.fple = true
  626.     elsif $game_system.fple
  627.       $game_system.fple = false
  628.     end
  629.     setup_fple(map_id)
  630.   end
  631.   #--------------------------------------------------------------------------
  632.   # * Refresh
  633.   #--------------------------------------------------------------------------
  634.   def refresh
  635.     refresh_fple
  636.     if is_fple?
  637.       unless @fple_map.textureset
  638.         load_fple_map
  639.       end
  640.     end
  641.   end
  642.   #--------------------------------------------------------------------------
  643.   # * Vérifie s'il s'agit d'une carte FPLE
  644.   # return String
  645.   #--------------------------------------------------------------------------
  646.   def is_fple?
  647.     return @map.note[/\[fple:\w+\]/]
  648.   end
  649.   #--------------------------------------------------------------------------
  650.   # * Charge la carte FPLE associée
  651.   #--------------------------------------------------------------------------
  652.   def load_fple_map
  653.     if @fple_map then @fple_map.dispose end
  654.     @map.note[/\[fple:(\w+)\]/]
  655.     File.open('Data_FPLE/' + $1 + '.fple', "rb") {|file|
  656.       map_data = Marshal.load(file)
  657.       @fple_map = FPLE::Map.new(map_data.width, map_data.height,
  658.       map_data.map_name, map_data.tileset_name, map_data.data,
  659.       map_data.subsets_mapping, map_data.textureset_data)
  660.     }
  661.   end
  662.   #--------------------------------------------------------------------------
  663.   # * Retourne la carte FPLE associée
  664.   # return FPLE::Map
  665.   #--------------------------------------------------------------------------
  666.   def fple_map
  667.     @fple_map
  668.   end
  669.   #--------------------------------------------------------------------------
  670.   # * Retourne le nom du tileset
  671.   # return String
  672.   #--------------------------------------------------------------------------
  673.   def tileset_name
  674.     if $game_system.fple
  675.       return @fple_map.tileset_name
  676.     else
  677.       return ""
  678.     end
  679.   end
  680.   #--------------------------------------------------------------------------
  681.   # * Recherche les surfaces visibles de la carte en fonction de
  682.   # l'orientation du joueur
  683.   #--------------------------------------------------------------------------
  684.   def refresh_surfaces
  685.     @current_dir = $game_player.direction
  686.     self.surfaces = []
  687.     @x_ref = $game_player.x
  688.     @y_ref = $game_player.y
  689.     case $game_player.direction
  690.     when 2
  691.       surfaces_temp = refresh_surfaces_down
  692.     when 4
  693.       surfaces_temp = refresh_surfaces_left
  694.     when 6
  695.       surfaces_temp = refresh_surfaces_right
  696.     when 8
  697.       surfaces_temp = refresh_surfaces_up
  698.     end
  699.     # set surfaces z attributes
  700.     surfaces_temp.each {|surface| set_surface_z(surface)}
  701.     surfaces.concat(surfaces_temp)
  702.     # sort found surfaces by their z attributes
  703.     surfaces.sort! {|a, b| b[5] - a[5]}
  704.   end
  705.   #--------------------------------------------------------------------------
  706.   # * Calcul de la priorité d'affichage d'une surface
  707.   # param surface : Array<Integer>
  708.   #--------------------------------------------------------------------------
  709.   def set_surface_z(surface)
  710.     if surface[3] < 5 # map surfaces
  711.       surface[5] = (surface[1].abs << 5) + surface[2].abs
  712.     else # character surfaces
  713.       surface[5] = (surface[1].abs >> 1) + (surface[2].abs >> 6) - 2
  714.     end
  715.   end
  716.   #--------------------------------------------------------------------------
  717.   # * Recherche les surfaces visibles des évènements en fonction de
  718.   # l'orientation du joueur
  719.   # param character_surfaces : Array<FPLE::Surface_Characters>
  720.   #--------------------------------------------------------------------------
  721.   def refresh_character_surfaces(character_surfaces)
  722.     # all events surfaces are reinitialized to "not displayed"
  723.     clear_character_surfaces(character_surfaces)
  724.     case $game_player.direction
  725.     when 2
  726.       surfaces_temp = add_character_surfaces_down(character_surfaces)
  727.     when 4
  728.       surfaces_temp = add_character_surfaces_left(character_surfaces)
  729.     when 6
  730.       surfaces_temp = add_character_surfaces_right(character_surfaces)
  731.     when 8
  732.       surfaces_temp = add_character_surfaces_up(character_surfaces)
  733.     end
  734.     # set surfaces z attributes
  735.     surfaces_temp.each {|surface| set_surface_z(surface)}
  736.     surfaces.concat(surfaces_temp)
  737.     surfaces.sort! {|a, b| b[5] - a[5]}
  738.   end
  739.   #--------------------------------------------------------------------------
  740.   # * Réinitialise l'indicateur d'affichage des surfaces liées aux évènements
  741.   # param character_surfaces : Array<FPLE::Surface_Characters>
  742.   #--------------------------------------------------------------------------
  743.   def clear_character_surfaces(character_surfaces)
  744.     character_surfaces.each {|surface| surface.displayed = false}
  745.   end
  746.   #--------------------------------------------------------------------------
  747.   # * Vérifie la visibilité d'une surface liée à un évènement et l'ajoute
  748.   # à la liste des surfaces à afficher le cas échéant
  749.   # param surface : FPLE::Surface_Characters
  750.   # param dy : Integer
  751.   # param dx : Integer
  752.   # param surfaces_temp : Array<Array<integer>>
  753.   # param i : Integer
  754.   # param dir : Integer
  755.   #--------------------------------------------------------------------------
  756.   def add_character_surfaces(surface, dy, dx, surfaces_temp, i, dir)
  757.     return unless surface.character && surface.character.fple_type # [1.3]
  758.     j = i << 7
  759.     if dy.between?(128, j) && dx.between?(-j, j)
  760.       # the surface is visible
  761.       surface.set_relative_attributes(dir)
  762.       # adjustements depending on the surface type
  763.       if surface.type == 1
  764.         if surface.d_align == 0
  765.           dy -= 64
  766.         elsif surface.d_align == 2
  767.           dy += 64
  768.         else
  769.         end
  770.       elsif surface.type == 2
  771.         if surface.d_align == 0
  772.           dx -= 64
  773.         elsif surface.d_align == 2
  774.           dx += 64
  775.         end
  776.       end
  777.       # add the surface to the list
  778.       surfaces_temp.push([0, dy, dx, 5, 0, 0,
  779.       surface.bitmap.__id__, surface.type,
  780.       surface.v_align, surface.character.fple_stretch,
  781.       surface.opacity, surface.blend_type,
  782.       surface.fit, surface.zoom, surface.mirror]) # [1.5]
  783.       surface.displayed = true
  784.     end
  785.   end
  786.   #--------------------------------------------------------------------------
  787.   # * Recherche les surfaces liées à un évènement visibles quand le joueur est
  788.   # orienté vers le haut
  789.   # param character_surfaces : Array<FPLE::Surface_Characters>
  790.   # return Array<Array<Integer>>
  791.   #--------------------------------------------------------------------------
  792.   def add_character_surfaces_up(character_surfaces)
  793.     surfaces_temp = []
  794.     i = $game_system.fple_view_distance
  795.     character_surfaces.each {|surface|
  796.       if surface.displayed then next end
  797.       dy = ($game_player.y << 7) - surface.dy
  798.       dx = surface.dx - ($game_player.x << 7)
  799.       add_character_surfaces(surface, dy, dx, surfaces_temp, i, 8)
  800.     }
  801.     return surfaces_temp
  802.   end
  803.   #--------------------------------------------------------------------------
  804.   # * Recherche les surfaces liées à un évènement visibles quand le joueur est
  805.   # orienté vers le bas
  806.   # param character_surfaces : Array<FPLE::Surface_Characters>
  807.   # return Array<Array<Integer>>
  808.   #--------------------------------------------------------------------------
  809.   def add_character_surfaces_down(character_surfaces)
  810.     surfaces_temp = []
  811.     i = $game_system.fple_view_distance
  812.     character_surfaces.each {|surface|
  813.       if surface.displayed then next end
  814.       dy = surface.dy - ($game_player.y << 7)
  815.       dx = ($game_player.x << 7) - surface.dx
  816.       add_character_surfaces(surface, dy, dx, surfaces_temp, i, 2)
  817.     }
  818.     return surfaces_temp
  819.   end
  820.   #--------------------------------------------------------------------------
  821.   # * Recherche les surfaces liées à un évènement visibles quand le joueur est
  822.   # orienté vers la gauche
  823.   # param character_surfaces : Array<FPLE::Surface_Characters>
  824.   # return Array<Array<Integer>>
  825.   #--------------------------------------------------------------------------
  826.   def add_character_surfaces_left(character_surfaces)
  827.     surfaces_temp = []
  828.     i = $game_system.fple_view_distance
  829.     character_surfaces.each {|surface|
  830.       if surface.displayed then next end
  831.       dy = ($game_player.x << 7) - surface.dx
  832.       dx = ($game_player.y << 7) - surface.dy
  833.       add_character_surfaces(surface, dy, dx, surfaces_temp, i, 4)
  834.     }
  835.     return surfaces_temp
  836.   end
  837.   #--------------------------------------------------------------------------
  838.   # * Recherche les surfaces liées à un évènement visibles quand le joueur est
  839.   # orienté vers la droite
  840.   # param character_surfaces : Array<FPLE::Surface_Characters>
  841.   # return Array<Array<Integer>>
  842.   #--------------------------------------------------------------------------
  843.   def add_character_surfaces_right(character_surfaces)
  844.     surfaces_temp = []
  845.     i = $game_system.fple_view_distance
  846.     character_surfaces.each {|surface|
  847.       if surface.displayed then next end
  848.       dy = surface.dx - ($game_player.x << 7)
  849.       dx = surface.dy - ($game_player.y << 7)
  850.       add_character_surfaces(surface, dy, dx, surfaces_temp, i, 6)
  851.     }
  852.     return surfaces_temp
  853.   end
  854.   #--------------------------------------------------------------------------
  855.   # * Recherche les surfaces visibles quand le joueur tourne vers la droite
  856.   # param character_surfaces : Array<FPLE::Surface_Characters>
  857.   #--------------------------------------------------------------------------
  858.   def refresh_surfaces_turn_right(character_surfaces)
  859.     @current_dir = $game_player.direction
  860.     self.surfaces = []
  861.     @x_ref = $game_player.x
  862.     @y_ref = $game_player.y
  863.     surfaces_temp = refresh_current_surface
  864.     clear_character_surfaces(character_surfaces)
  865.     case $game_player.direction
  866.     when 2
  867.       surfaces_temp1 = refresh_surfaces_down
  868.       @current_dir = 6
  869.       surfaces_temp2 = refresh_surfaces_right(false)
  870.       @current_dir = 2
  871.       surfaces_temp1 += add_character_surfaces_down(character_surfaces)
  872.       surfaces_temp2 += add_character_surfaces_right(character_surfaces)
  873.     when 4
  874.       surfaces_temp1 = refresh_surfaces_left
  875.       @current_dir = 2
  876.       surfaces_temp2 = refresh_surfaces_down(false)
  877.       @current_dir = 4
  878.       surfaces_temp1 += add_character_surfaces_left(character_surfaces)
  879.       surfaces_temp2 += add_character_surfaces_down(character_surfaces)
  880.     when 6
  881.       surfaces_temp1 = refresh_surfaces_right
  882.       @current_dir = 8
  883.       surfaces_temp2 = refresh_surfaces_up(false)
  884.       @current_dir = 6
  885.       surfaces_temp1 += add_character_surfaces_right(character_surfaces)
  886.       surfaces_temp2 += add_character_surfaces_up(character_surfaces)
  887.     when 8
  888.       surfaces_temp1 = refresh_surfaces_up
  889.       @current_dir = 4
  890.       surfaces_temp2 = refresh_surfaces_left(false)
  891.       @current_dir = 8
  892.       surfaces_temp1 += add_character_surfaces_up(character_surfaces)
  893.       surfaces_temp2 += add_character_surfaces_left(character_surfaces)
  894.     end
  895.     surfaces_temp1.each {|surface| adjust_surface_for_rotation(surface)}
  896.     # set surfaces z attributes
  897.     (surfaces_temp + surfaces_temp1 + surfaces_temp2).each {|surface|
  898.       set_surface_z(surface)
  899.     }
  900.     surfaces.concat(surfaces_temp + surfaces_temp1 + surfaces_temp2)
  901.     surfaces.sort! {|a, b| b[5] - a[5]}
  902.   end
  903.   #--------------------------------------------------------------------------
  904.   # * Recherche les surfaces visibles quand le joueur tourne vers la gauche
  905.   # param character_surfaces : Array<FPLE::Surface_Characters>
  906.   #--------------------------------------------------------------------------
  907.   def refresh_surfaces_turn_left(character_surfaces)
  908.     @current_dir = $game_player.direction
  909.     self.surfaces = []
  910.     @x_ref = $game_player.x
  911.     @y_ref = $game_player.y
  912.     surfaces_temp = refresh_current_surface
  913.     clear_character_surfaces(character_surfaces)
  914.     case $game_player.direction
  915.     when 2
  916.       @current_dir = 4
  917.       surfaces_temp1 = refresh_surfaces_left
  918.       @current_dir = 2
  919.       surfaces_temp2 = refresh_surfaces_down(false)
  920.       surfaces_temp1 += add_character_surfaces_left(character_surfaces)
  921.       surfaces_temp2 += add_character_surfaces_down(character_surfaces)
  922.     when 4
  923.       @current_dir = 8
  924.       surfaces_temp1 = refresh_surfaces_up
  925.       @current_dir = 4
  926.       surfaces_temp2 = refresh_surfaces_left(false)
  927.       surfaces_temp1 += add_character_surfaces_up(character_surfaces)
  928.       surfaces_temp2 += add_character_surfaces_left(character_surfaces)
  929.     when 6
  930.       @current_dir = 2
  931.       surfaces_temp1 = refresh_surfaces_down
  932.       @current_dir = 6
  933.       surfaces_temp2 = refresh_surfaces_right(false)
  934.       surfaces_temp1 += add_character_surfaces_down(character_surfaces)
  935.       surfaces_temp2 += add_character_surfaces_right(character_surfaces)
  936.     when 8
  937.       @current_dir = 6
  938.       surfaces_temp1 = refresh_surfaces_right
  939.       @current_dir = 8
  940.       surfaces_temp2 = refresh_surfaces_up(false)
  941.       surfaces_temp1 += add_character_surfaces_right(character_surfaces)
  942.       surfaces_temp2 += add_character_surfaces_up(character_surfaces)
  943.     end
  944.     surfaces_temp1.each {|surface| adjust_surface_for_rotation(surface)}
  945.     # set surfaces z attributes
  946.     (surfaces_temp + surfaces_temp1 + surfaces_temp2).each {|surface|
  947.       set_surface_z(surface)
  948.     }
  949.     surfaces.concat(surfaces_temp + surfaces_temp1 + surfaces_temp2)
  950.     surfaces.sort! {|a, b| b[5] - a[5]}
  951.   end
  952.   #--------------------------------------------------------------------------
  953.   # * Correction des attributs d'une surface visible pendant une rotation
  954.   # param surface : Array<Integer>
  955.   #--------------------------------------------------------------------------
  956.   def adjust_surface_for_rotation(surface)
  957.     if surface[3] < 5
  958.       dy = surface[1]
  959.       surface[1] = -surface[2]
  960.       surface[2] = dy
  961.       if surface[3] < 2
  962.         surface[3] = 1 - surface[3]
  963.       end
  964.     else
  965.       if surface[7] > 0
  966.         surface[7] = 3 - surface[7]
  967.       end    
  968.       dy = surface[1]
  969.       surface[1] = -surface[2]
  970.       surface[2] = dy
  971.     end
  972.   end
  973.   #--------------------------------------------------------------------------
  974.   # * Recherche des surfaces visibles en déplacement latéral
  975.   # param offset : Integer
  976.   #--------------------------------------------------------------------------
  977.   def refresh_surfaces_strafe(offset)
  978.     @current_dir = $game_player.direction
  979.     @x_ref = $game_player.x
  980.     @y_ref = $game_player.y
  981.     case $game_player.direction
  982.     when 2
  983.       @x_ref -= offset
  984.       surfaces_temp = refresh_surfaces_down_strafe
  985.     when 4
  986.       @y_ref -= offset
  987.       surfaces_temp = refresh_surfaces_left_strafe
  988.     when 6
  989.       @y_ref += offset
  990.       surfaces_temp = refresh_surfaces_right_strafe
  991.     when 8
  992.       @x_ref += offset
  993.       surfaces_temp = refresh_surfaces_up_strafe
  994.     end
  995.     # set surfaces z attributes
  996.     surfaces_temp.each {|surface| set_surface_z(surface)}
  997.     surfaces.concat(surfaces_temp)
  998.     surfaces.sort! {|a, b| b[5] - a[5]}
  999.   end
  1000.   #--------------------------------------------------------------------------
  1001.   # * Rafraîchit la surface à la position du joueur
  1002.   # return Array<Array<integer>>
  1003.   #--------------------------------------------------------------------------
  1004.   def refresh_current_surface
  1005.     surfaces_temp = []
  1006.     get_surface_ground(surfaces_temp, @x_ref, @y_ref, 0, 0)
  1007.     return surfaces_temp
  1008.   end
  1009.   #--------------------------------------------------------------------------
  1010.   # * Recherche les surfaces visibles de la carte quand le joueur est
  1011.   # orienté vers le haut
  1012.   # param right_ground : Boolean
  1013.   # return Array<Array<integer>>
  1014.   #--------------------------------------------------------------------------
  1015.   def refresh_surfaces_up(right_ground = true)
  1016.     surfaces_temp = []
  1017.     i = $game_system.fple_view_distance
  1018.     while i > 0
  1019.       # peripherical ground/ceiling sprites
  1020.       get_surface_ground(surfaces_temp, @x_ref - i, @y_ref - i, i << 1, -i << 1)
  1021.       if right_ground
  1022.         get_surface_ground(surfaces_temp, @x_ref + i, @y_ref - i, i << 1, i << 1)
  1023.       end
  1024.       klim = i - 1
  1025.       (-klim..klim).each {|k|
  1026.         add_surfaces(surfaces_temp, @x_ref + k, @y_ref - i, i << 1, k << 1, 0, 1)
  1027.       }
  1028.       i -= 1
  1029.     end
  1030.     return surfaces_temp
  1031.   end
  1032.   #--------------------------------------------------------------------------
  1033.   # * Recherche les surfaces visibles de la carte quand le joueur est
  1034.   # orienté vers le bas
  1035.   # param right_ground : Boolean
  1036.   # return Array<Array<integer>>
  1037.   #--------------------------------------------------------------------------
  1038.   def refresh_surfaces_down(right_ground = true)
  1039.     surfaces_temp = []
  1040.     i = $game_system.fple_view_distance
  1041.     while i > 0
  1042.       # peripherical ground sprites
  1043.       get_surface_ground(surfaces_temp, @x_ref + i, @y_ref + i, i << 1, -i << 1)
  1044.       if right_ground
  1045.         get_surface_ground(surfaces_temp, @x_ref - i, @y_ref + i, i << 1, i << 1)
  1046.       end
  1047.       klim = i - 1
  1048.       (-klim..klim).each {|k|
  1049.         add_surfaces(surfaces_temp, @x_ref - k, @y_ref + i, i << 1, k << 1, 0, -1)
  1050.       }
  1051.       i -= 1
  1052.     end
  1053.     return surfaces_temp
  1054.   end
  1055.   #--------------------------------------------------------------------------
  1056.   # * Recherche les surfaces visibles de la carte quand le joueur est
  1057.   # orienté vers la gauche
  1058.   # param right_ground : Boolean
  1059.   # return Array<Array<integer>>
  1060.   #--------------------------------------------------------------------------
  1061.   def refresh_surfaces_left(right_ground = true)
  1062.     surfaces_temp = []
  1063.     i = $game_system.fple_view_distance
  1064.     while i > 0
  1065.       # peripherical ground sprites
  1066.       get_surface_ground(surfaces_temp, @x_ref - i, @y_ref + i, i << 1, -i << 1)
  1067.       if right_ground
  1068.         get_surface_ground(surfaces_temp, @x_ref - i, @y_ref - i, i << 1, i << 1)
  1069.       end
  1070.       klim = i - 1
  1071.       (-klim..klim).each {|k|
  1072.         add_surfaces(surfaces_temp, @x_ref - i, @y_ref - k, i << 1, k << 1, 1, 0)
  1073.       }
  1074.       i -= 1
  1075.     end
  1076.     return surfaces_temp
  1077.   end
  1078.   #--------------------------------------------------------------------------
  1079.   # * Recherche les surfaces visibles de la carte quand le joueur est
  1080.   # orienté vers la droite
  1081.   # param right_ground : Boolean
  1082.   # return Array<Array<integer>>
  1083.   #--------------------------------------------------------------------------
  1084.   def refresh_surfaces_right(right_ground = true)
  1085.     surfaces_temp = []
  1086.     i = $game_system.fple_view_distance
  1087.     while i > 0
  1088.       # peripherical ground sprites
  1089.       get_surface_ground(surfaces_temp, @x_ref + i, @y_ref - i, i << 1, -i << 1)
  1090.       if right_ground
  1091.         get_surface_ground(surfaces_temp, @x_ref + i, @y_ref + i, i << 1, i << 1)
  1092.       end
  1093.       klim = i - 1
  1094.       (-klim..klim).each {|k|
  1095.         add_surfaces(surfaces_temp, @x_ref + i, @y_ref + k, i << 1, k << 1, -1, 0)
  1096.       }
  1097.       i -= 1
  1098.     end
  1099.     return surfaces_temp
  1100.   end
  1101.   #--------------------------------------------------------------------------
  1102.   # * Vérifie si un sol ou un plafond doit être affiché
  1103.   # param surfaces_temp : Array<Array<Integer>>
  1104.   # param x : Integer
  1105.   # param y : Integer
  1106.   # param dy : Integer
  1107.   # param dx : Integer
  1108.   #--------------------------------------------------------------------------
  1109.   def get_surface_ground(surfaces_temp, x, y, dy, dx)
  1110.     if @fple_map.get_data(x, y)[0] == 0 # no wall tile
  1111.       add_surface_ground(surfaces_temp, x, y, dy, dx)
  1112.     end
  1113.   end
  1114.   #--------------------------------------------------------------------------
  1115.   # * Ajoute une surface de sol ou de plafond qui doit être affichée
  1116.   # param surfaces_temp : Array<Array<Integer>>
  1117.   # param x : Integer
  1118.   # param y : Integer
  1119.   # param dy : Integer
  1120.   # param dx : Integer
  1121.   #--------------------------------------------------------------------------
  1122.   def add_surface_ground(surfaces_temp, x, y, dy, dx)
  1123.     g_texture_id = @fple_map.get_data(x, y)[1]
  1124.     c_texture_id = @fple_map.get_data(x, y)[19]
  1125.     if @fple_map.is_texture_id_valid?(g_texture_id)
  1126.       if @fple_map.is_texture_id_valid?(c_texture_id)
  1127.         surfaces_temp.push([g_texture_id, dy, dx, 4, c_texture_id, 0,
  1128.         @fple_map.get_textureset_id(g_texture_id),
  1129.         @fple_map.get_textureset_width(g_texture_id),
  1130.         @fple_map.get_textureset_id(c_texture_id),
  1131.         @fple_map.get_textureset_width(c_texture_id)])
  1132.       else
  1133.         surfaces_temp.push([g_texture_id, dy, dx, 2, 0, 0,
  1134.         @fple_map.get_textureset_id(g_texture_id),
  1135.         @fple_map.get_textureset_width(g_texture_id), 0, 8])
  1136.       end
  1137.     elsif @fple_map.is_texture_id_valid?(c_texture_id)
  1138.       surfaces_temp.push([c_texture_id, dy, dx, 3, 0, 0,
  1139.       @fple_map.get_textureset_id(c_texture_id),
  1140.       @fple_map.get_textureset_width(c_texture_id), 0, 8])
  1141.     end
  1142.   end
  1143.   #--------------------------------------------------------------------------
  1144.   # * Recherche des surfaces visibles
  1145.   # param surfaces_temp : Array<Array<Integer>>
  1146.   # param x : Integer
  1147.   # param y : Integer
  1148.   # param dy : Integer
  1149.   # param dx : Integer
  1150.   # param oy : Integer
  1151.   # param ox : Integer
  1152.   #--------------------------------------------------------------------------
  1153.   def add_surfaces(surfaces_temp, x, y, dy, dx, ox, oy)
  1154.     if @fple_map.get_data(x, y)[0] > 0 # wall tile
  1155.       if @fple_map.get_data(x + ox, y + oy)[0] == 0 # --> visible !
  1156.         texture_id = @fple_map.get_data(x, y)[
  1157.         FPLE::MAP_SIDES[@current_dir - 1 >> 1]]
  1158.         if @fple_map.is_texture_id_valid?(texture_id)
  1159.           surfaces_temp.push([texture_id, dy - 1, dx, 1, 0, 0,
  1160.           @fple_map.get_textureset_id(texture_id),
  1161.           @fple_map.get_textureset_width(texture_id), 0, 8])
  1162.         end
  1163.       end
  1164.     else
  1165.       # ground/ceiling sprite
  1166.       add_surface_ground(surfaces_temp, x, y, dy, dx)
  1167.       # side walls
  1168.       if dx <= 0 # left
  1169.         if @fple_map.get_data(x - oy, y + ox)[0] > 0 # side wall tile
  1170.           texture_id = @fple_map.get_data(x - oy, y + ox)[
  1171.           FPLE::MAP_SIDES_LEFT[@current_dir - 1 >> 1]]
  1172.           if @fple_map.is_texture_id_valid?(texture_id)
  1173.             surfaces_temp.push([texture_id, dy, dx - 1, 0, 0, 0,
  1174.             @fple_map.get_textureset_id(texture_id),
  1175.             @fple_map.get_textureset_width(texture_id), 0, 8])
  1176.           end
  1177.         end
  1178.       end
  1179.       if dx >= 0 # right
  1180.         if @fple_map.get_data(x + oy, y - ox)[0] > 0 # side wall tile
  1181.           texture_id = @fple_map.get_data(x + oy, y - ox)[
  1182.           FPLE::MAP_SIDES_RIGHT[@current_dir - 1 >> 1]]
  1183.           if @fple_map.is_texture_id_valid?(texture_id)
  1184.             surfaces_temp.push([texture_id, dy, dx + 1, 0, 0, 0,
  1185.             @fple_map.get_textureset_id(texture_id),
  1186.             @fple_map.get_textureset_width(texture_id), 0, 8])
  1187.           end
  1188.         end
  1189.       end
  1190.     end
  1191.   end
  1192.   #--------------------------------------------------------------------------
  1193.   # * Recherche des surfaces visibles en déplacement latéral quand le
  1194.   # joueur est orienté vers le haut
  1195.   # return Array<Array<Integer>>
  1196.   #--------------------------------------------------------------------------
  1197.   def refresh_surfaces_up_strafe
  1198.     surfaces_temp = []
  1199.     i = $game_system.fple_view_distance
  1200.     while i > 0
  1201.       get_surface_ground(surfaces_temp, @x_ref + i + 1, @y_ref - i, i << 1,
  1202.       i + 1 << 1)
  1203.       add_surfaces_strafe(surfaces_temp, @x_ref + i,  @y_ref - i, i << 1, 0, 1)
  1204.       # middle side wall
  1205.       if @fple_map.get_data(@x_ref + 1, @y_ref - i)[0] == 0 # no wall tile
  1206.         if @fple_map.get_data(@x_ref, @y_ref - i)[0] > 0 # side wall tile (Left)
  1207.           texture_id = @fple_map.get_data(@x_ref, @y_ref - i)[
  1208.           FPLE::MAP_SIDES_LEFT[@current_dir - 1 >> 1]]
  1209.           if @fple_map.is_texture_id_valid?(texture_id)
  1210.             surfaces_temp.push([texture_id, i << 1, 1, 0, 0, 0,
  1211.             @fple_map.get_textureset_id(texture_id),
  1212.             @fple_map.get_textureset_width(texture_id), 0, 8])
  1213.           end
  1214.         end
  1215.       end
  1216.       i -= 1
  1217.     end
  1218.     return surfaces_temp
  1219.   end
  1220.   #--------------------------------------------------------------------------
  1221.   # * Recherche des surfaces visibles en déplacement latéral quand le
  1222.   # joueur est orienté vers le bas
  1223.   # return Array<Array<Integer>>
  1224.   #--------------------------------------------------------------------------
  1225.   def refresh_surfaces_down_strafe
  1226.     surfaces_temp = []
  1227.     i = $game_system.fple_view_distance
  1228.     while i > 0
  1229.       get_surface_ground(surfaces_temp, @x_ref - i - 1, @y_ref + i, i << 1,
  1230.       i + 1 << 1)
  1231.       add_surfaces_strafe(surfaces_temp, @x_ref - i,  @y_ref + i, i << 1, 0, -1)
  1232.       # middle side wall
  1233.       if @fple_map.get_data(@x_ref - 1, @y_ref + i)[0] == 0 # no wall tile
  1234.         if @fple_map.get_data(@x_ref, @y_ref + i)[0] > 0 # side wall tile (Left)
  1235.           texture_id = @fple_map.get_data(@x_ref, @y_ref + i)[
  1236.           FPLE::MAP_SIDES_LEFT[@current_dir - 1 >> 1]]
  1237.           if @fple_map.is_texture_id_valid?(texture_id)
  1238.             surfaces_temp.push([texture_id, i << 1, 1, 0, 0, 0,
  1239.             @fple_map.get_textureset_id(texture_id),
  1240.             @fple_map.get_textureset_width(texture_id), 0, 8])
  1241.           end
  1242.         end
  1243.       end
  1244.       i -= 1
  1245.     end
  1246.     return surfaces_temp
  1247.   end
  1248.   #--------------------------------------------------------------------------
  1249.   # * Recherche des surfaces visibles en déplacement latéral quand le
  1250.   # joueur est orienté vers la gauche
  1251.   # return Array<Array<Integer>>
  1252.   #--------------------------------------------------------------------------
  1253.   def refresh_surfaces_left_strafe
  1254.     surfaces_temp = []
  1255.     i = $game_system.fple_view_distance
  1256.     while i > 0
  1257.       get_surface_ground(surfaces_temp, @x_ref - i, @y_ref - i - 1, i << 1,
  1258.       i + 1 << 1)
  1259.       add_surfaces_strafe(surfaces_temp, @x_ref - i,  @y_ref - i, i << 1, 1, 0)
  1260.       # middle side wall
  1261.       if @fple_map.get_data(@x_ref - i, @y_ref - 1)[0] == 0 # no wall tile
  1262.         if @fple_map.get_data(@x_ref - i, @y_ref)[0] > 0 # side wall tile (Left)
  1263.           texture_id = @fple_map.get_data(@x_ref - i, @y_ref)[
  1264.           FPLE::MAP_SIDES_LEFT[@current_dir - 1 >> 1]]
  1265.           if @fple_map.is_texture_id_valid?(texture_id)
  1266.             surfaces_temp.push([texture_id, i << 1, 1, 0, 0, 0,
  1267.             @fple_map.get_textureset_id(texture_id),
  1268.             @fple_map.get_textureset_width(texture_id), 0, 8])
  1269.           end
  1270.         end
  1271.       end
  1272.       i -= 1
  1273.     end
  1274.     return surfaces_temp
  1275.   end
  1276.   #--------------------------------------------------------------------------
  1277.   # * Recherche des surfaces visibles en déplacement latéral quand le
  1278.   # joueur est orienté vers la droite
  1279.   # return Array<Array<Integer>>
  1280.   #--------------------------------------------------------------------------
  1281.   def refresh_surfaces_right_strafe
  1282.     surfaces_temp = []
  1283.     i = $game_system.fple_view_distance
  1284.     while i > 0
  1285.       get_surface_ground(surfaces_temp, @x_ref + i, @y_ref + i + 1, i << 1,
  1286.       i + 1 << 1)
  1287.       add_surfaces_strafe(surfaces_temp, @x_ref + i,  @y_ref + i, i << 1, -1, 0)
  1288.       # middle side wall
  1289.       if @fple_map.get_data(@x_ref + i, @y_ref + 1)[0] == 0 # no wall tile
  1290.         if @fple_map.get_data(@x_ref + i, @y_ref)[0] > 0 # side wall tile (Left)
  1291.           texture_id = @fple_map.get_data(@x_ref + i, @y_ref)[
  1292.           FPLE::MAP_SIDES_LEFT[@current_dir - 1 >> 1]]
  1293.           if @fple_map.is_texture_id_valid?(texture_id)
  1294.             surfaces_temp.push([texture_id, i << 1, 1, 0, 0, 0,
  1295.             @fple_map.get_textureset_id(texture_id),
  1296.             @fple_map.get_textureset_width(texture_id), 0, 8])
  1297.           end
  1298.         end
  1299.       end
  1300.       i -= 1
  1301.     end
  1302.     return surfaces_temp
  1303.   end
  1304.   #--------------------------------------------------------------------------
  1305.   # * Recherche des surfaces visibles en déplacement latéral
  1306.   # param surfaces_temp : Array<Array<Integer>>
  1307.   # param x : Integer
  1308.   # param y : Integer
  1309.   # param dxy : Integer
  1310.   # param oy : Integer
  1311.   # param ox : Integer
  1312.   #--------------------------------------------------------------------------
  1313.   def add_surfaces_strafe(surfaces_temp, x, y, dxy, ox, oy)
  1314.     if @fple_map.get_data(x, y)[0] > 0 # wall tile
  1315.       if @fple_map.get_data(x + ox, y + oy)[0] == 0 # --> visible !
  1316.         texture_id = @fple_map.get_data(x, y)[
  1317.         FPLE::MAP_SIDES[@current_dir - 1 >> 1]]
  1318.         if @fple_map.is_texture_id_valid?(texture_id)
  1319.           surfaces_temp.push([texture_id, dxy - 1, dxy, 1, 0, 0,
  1320.           @fple_map.get_textureset_id(texture_id),
  1321.           @fple_map.get_textureset_width(texture_id), 0, 8])
  1322.         end
  1323.       end
  1324.     else
  1325.       # side wall (Right)
  1326.       if @fple_map.get_data(x + oy, y - ox)[0] > 0 # side wall tile
  1327.         texture_id = @fple_map.get_data(x + oy, y - ox)[
  1328.         FPLE::MAP_SIDES_RIGHT[@current_dir - 1 >> 1]]
  1329.         if @fple_map.is_texture_id_valid?(texture_id)
  1330.           surfaces_temp.push([texture_id, dxy, dxy + 1, 0, 0, 0,
  1331.           @fple_map.get_textureset_id(texture_id),
  1332.           @fple_map.get_textureset_width(texture_id), 0, 8])
  1333.         end
  1334.       end
  1335.     end
  1336.   end
  1337. end
  1338.  
  1339. #==============================================================================
  1340. # ** Game_Character
  1341. #==============================================================================
  1342. class Game_Character < Game_CharacterBase
  1343.   #--------------------------------------------------------------------------
  1344.   # * Aliased methods (F12 compatibility)
  1345.   #--------------------------------------------------------------------------
  1346.   unless @already_aliased_fple
  1347.     alias moving_fple_game_character? moving?
  1348.     @already_aliased_fple = true
  1349.   end
  1350.   #--------------------------------------------------------------------------
  1351.   # * Determine if Moving
  1352.   # return Boolean
  1353.   #--------------------------------------------------------------------------
  1354.   def moving?
  1355.     if $game_system.fple
  1356.       return $game_temp.movement || moving_fple_game_character?
  1357.     else
  1358.       return moving_fple_game_character?
  1359.     end
  1360.   end
  1361. end
  1362.  
  1363. #==============================================================================
  1364. # ** Game_Player
  1365. #==============================================================================
  1366. class Game_Player < Game_Character
  1367.   #--------------------------------------------------------------------------
  1368.   # * Aliased methods (F12 compatibility) - mod [1.1]
  1369.   #--------------------------------------------------------------------------
  1370.   unless @already_aliased_fple
  1371.     alias move_straight_fple_game_player move_straight
  1372.     alias move_diagonal_fple_game_player move_diagonal
  1373.     alias turn_right_90_fple_game_player turn_right_90
  1374.     alias turn_left_90_fple_game_player turn_left_90
  1375.     alias move_by_input_fple_game_player move_by_input
  1376.     alias update_nonmoving_fple_game_player update_nonmoving
  1377.     @already_aliased_fple = true
  1378.   end
  1379.   #--------------------------------------------------------------------------
  1380.   # * Initialize Public Member Variables
  1381.   #--------------------------------------------------------------------------
  1382.   def init_public_members
  1383.     super
  1384.     @direction = 8
  1385.   end
  1386.   #--------------------------------------------------------------------------
  1387.   # * Move Straight
  1388.   # param d : Integer
  1389.   # param turn_ok : Boolean
  1390.   #--------------------------------------------------------------------------
  1391.   def move_straight(d, turn_ok = true)
  1392.     if $game_system.fple
  1393.       case d
  1394.       when 2
  1395.         case $game_player.direction
  1396.         when 2
  1397.           go_forward
  1398.         when 4
  1399.           strafe_left
  1400.         when 6
  1401.           strafe_right
  1402.         when 8
  1403.           go_backward
  1404.         end
  1405.       when 4
  1406.         case $game_player.direction
  1407.         when 2
  1408.           strafe_right
  1409.         when 4
  1410.           go_forward
  1411.         when 6
  1412.           go_backward
  1413.         when 8
  1414.           strafe_left
  1415.         end
  1416.       when 6
  1417.         case $game_player.direction
  1418.         when 2
  1419.           strafe_left
  1420.         when 4
  1421.           go_backward
  1422.         when 6
  1423.           go_forward
  1424.         when 8
  1425.           strafe_right
  1426.         end
  1427.       when 8
  1428.         case $game_player.direction
  1429.         when 2
  1430.           go_backward
  1431.         when 4
  1432.           strafe_right
  1433.         when 6
  1434.           strafe_left
  1435.         when 8
  1436.           go_forward
  1437.         end
  1438.       end
  1439.     else
  1440.       move_straight_fple_game_player(d, turn_ok)
  1441.     end
  1442.   end
  1443.   #--------------------------------------------------------------------------
  1444.   # * Move Diagonally
  1445.   # param horz : Integer
  1446.   # param vert : Integer
  1447.   #--------------------------------------------------------------------------
  1448.   def move_diagonal(horz, vert)
  1449.     unless $game_system.fple
  1450.       move_diagonal_fple_game_player(horz, vert)
  1451.     end
  1452.   end
  1453.   #--------------------------------------------------------------------------
  1454.   # * Jump
  1455.   # param x_plus : Integer
  1456.   # param y_plus : Integer
  1457.   #--------------------------------------------------------------------------
  1458.   def jump(x_plus, y_plus)
  1459.     unless $game_system.fple
  1460.       super(x_plus, y_plus) # [1.1]
  1461.     end
  1462.   end
  1463.   #--------------------------------------------------------------------------
  1464.   # * Turn 90° Right
  1465.   #--------------------------------------------------------------------------
  1466.   def turn_right_90
  1467.     turn_right_90_fple_game_player
  1468.     if $game_system.fple && !@direction_fix
  1469.       $game_temp.movement_init = false
  1470.       $game_temp.movement = true
  1471.       $game_temp.movement_dir = 9
  1472.     end
  1473.   end
  1474.   #--------------------------------------------------------------------------
  1475.   # * Turn 90° Left
  1476.   #--------------------------------------------------------------------------
  1477.   def turn_left_90
  1478.     turn_left_90_fple_game_player
  1479.     if $game_system.fple && !@direction_fix
  1480.       $game_temp.movement_init = false
  1481.       $game_temp.movement = true
  1482.       $game_temp.movement_dir = 10
  1483.     end
  1484.   end
  1485.   #--------------------------------------------------------------------------
  1486.   # * Go Forward
  1487.   #--------------------------------------------------------------------------
  1488.   def go_forward
  1489.     mvt_data = FPLE::PLAYER_MOVE_FORWARD[(@direction >> 1) - 1]
  1490.     if passable?(@x, @y, @direction)
  1491.       @x += mvt_data[0]
  1492.       @y += mvt_data[1]
  1493.       increase_steps
  1494.       $game_temp.movement = true
  1495.       $game_temp.movement_dir = 8
  1496.     else
  1497.       check_event_trigger_touch(@x + mvt_data[0], @y + mvt_data[1])
  1498.     end
  1499.   end
  1500.   #--------------------------------------------------------------------------
  1501.   # * Go Backward
  1502.   #--------------------------------------------------------------------------
  1503.   def go_backward
  1504.     target_dir = 10 - @direction
  1505.     mvt_data = FPLE::PLAYER_MOVE_FORWARD[(target_dir >> 1) - 1]
  1506.     if passable?(@x, @y, target_dir)
  1507.       @x += mvt_data[0]
  1508.       @y += mvt_data[1]
  1509.       increase_steps
  1510.       $game_temp.movement_init = false
  1511.       $game_temp.movement = true
  1512.       $game_temp.movement_dir = 2
  1513.     else
  1514.       check_event_trigger_touch(@x + mvt_data[0], @y + mvt_data[1])
  1515.     end
  1516.   end
  1517.   #--------------------------------------------------------------------------
  1518.   # * Strafe Left
  1519.   #--------------------------------------------------------------------------
  1520.   def strafe_left
  1521.     target_dir = FPLE::TURN_LEFT[(@direction >> 1) - 1]
  1522.     mvt_data = FPLE::PLAYER_MOVE_FORWARD[(target_dir >> 1) - 1]
  1523.     if passable?(@x, @y, target_dir)
  1524.       @x += mvt_data[0]
  1525.       @y += mvt_data[1]
  1526.       increase_steps
  1527.       $game_temp.movement_init = false
  1528.       $game_temp.movement = true
  1529.       $game_temp.movement_dir = 4
  1530.     else
  1531.       check_event_trigger_touch(@x + mvt_data[0], @y + mvt_data[1])
  1532.     end
  1533.   end
  1534.   #--------------------------------------------------------------------------
  1535.   # * Strafe Right
  1536.   #--------------------------------------------------------------------------
  1537.   def strafe_right
  1538.     target_dir = 10 - FPLE::TURN_LEFT[(@direction >> 1) - 1]
  1539.     mvt_data = FPLE::PLAYER_MOVE_FORWARD[(target_dir >> 1) - 1]
  1540.     if passable?(@x, @y, target_dir)
  1541.       @x += mvt_data[0]
  1542.       @y += mvt_data[1]
  1543.       increase_steps
  1544.       $game_temp.movement_init = false
  1545.       $game_temp.movement = true
  1546.       $game_temp.movement_dir = 6
  1547.     else
  1548.       check_event_trigger_touch(@x + mvt_data[0], @y + mvt_data[1])
  1549.     end
  1550.   end
  1551.   #--------------------------------------------------------------------------
  1552.   # * Processing of Movement via input from the Directional Buttons
  1553.   #--------------------------------------------------------------------------
  1554.   def move_by_input
  1555.     if $game_system.fple
  1556.       if !movable? || $game_map.interpreter.running? then return end
  1557.       if Input.press?(:L)||Input.press?(FPLE::STRAFE_LEFT)
  1558.         strafe_left
  1559.       elsif Input.press?(:R)||Input.press?(FPLE::STRAFE_RIGHT)
  1560.         strafe_right
  1561.       else
  1562.         case Input.dir4
  1563.         when 2; go_backward
  1564.         when 4; turn_left_90
  1565.         when 6; turn_right_90
  1566.         when 8; go_forward
  1567.         end
  1568.       end
  1569.     else
  1570.       move_by_input_fple_game_player
  1571.     end
  1572.   end
  1573.   #--------------------------------------------------------------------------
  1574.   # * Processing when not moving
  1575.   # param last_moving : Boolean
  1576.   #--------------------------------------------------------------------------
  1577.   def update_nonmoving(last_moving)
  1578.     if $game_map.interpreter.running? then return end
  1579.     update_nonmoving_fple_game_player(last_moving)
  1580.     if last_moving then $game_temp.last_moving = false end
  1581.   end
  1582.   #--------------------------------------------------------------------------
  1583.   # * Move speed in FPLE mode
  1584.   # return Integer
  1585.   #--------------------------------------------------------------------------
  1586.   def move_speed_fple
  1587.     return FPLE::PLAYER_MOVE_SPEED[real_move_speed]
  1588.   end
  1589. end
  1590.  
  1591. #==============================================================================
  1592. # ** Game_Event
  1593. #==============================================================================
  1594. class Game_Event < Game_Character
  1595.   #--------------------------------------------------------------------------
  1596.   # * Aliased methods (F12 compatibility)
  1597.   #--------------------------------------------------------------------------
  1598.   unless @already_aliased_fple
  1599.     alias refresh_fple_game_character refresh
  1600.     @already_aliased_fple = true
  1601.   end
  1602.   #--------------------------------------------------------------------------
  1603.   # * Public Instance Variables
  1604.   #--------------------------------------------------------------------------
  1605.   attr_reader :fple_type # Integer 0:face the player
  1606.                          #         1:horizontal wall in the RMXP editor view
  1607.                          #         2:vertical wall in the RMXP editor view
  1608.   attr_reader :fple_v_align # Integer - Vertical align {0:up, 1:middle, 2:down}
  1609.   attr_reader :fple_d_align # Integer - Depth align {0:front/left, 1:middle, 2:back/right}
  1610.   attr_reader :fple_stretch # Integer (0/1)
  1611.   attr_reader :fple_fit # Integer (0/1)
  1612.   attr_reader :fple_zoom # Integer (1024 <=> zoom = 1.0)
  1613.   attr_reader :fple_one_side # Boolean (0/1) [1.5]
  1614.   #--------------------------------------------------------------------------
  1615.   # * Scan the event's commands list
  1616.   # param page : RPG::Event::Page
  1617.   #--------------------------------------------------------------------------
  1618.   def check_commands(page)
  1619.     @fple_type = 0
  1620.     @fple_v_align = 1
  1621.     @fple_d_align = 1
  1622.     @fple_stretch = 0
  1623.     @fple_fit = 0
  1624.     @fple_zoom = 1024
  1625.     @fple_one_side = false # [1.5]
  1626.     command_list = page.list
  1627.     (0..command_list.length - 2).each {|k|
  1628.       command = command_list[k]
  1629.       if command.code == 108
  1630.         comments = command.parameters[0]
  1631.         if comments[/Type/]
  1632.           @fple_type = comments[/\d+/].to_i
  1633.           if @fple_type < 0 || @fple_type > 2 then @fple_type = 0 end
  1634.         end
  1635.         if comments[/V-Align/]
  1636.           @fple_v_align = comments[/\d+/].to_i
  1637.           if @fple_v_align < 0 || @fple_v_align > 2 then @fple_v_align = 1 end
  1638.         end
  1639.         if comments[/D-Align/]
  1640.           @fple_d_align = comments[/\d+/].to_i
  1641.           if @fple_d_align < 0 || @fple_d_align > 2 then @fple_d_align = 1 end
  1642.         end
  1643.         if comments[/Stretch/]
  1644.           @fple_stretch = 1
  1645.         end
  1646.         if comments[/Fit/]
  1647.           @fple_fit = 1
  1648.         end
  1649.         if comments[/Zoom/]
  1650.           @fple_zoom = (comments[/\d+\.\d+/].to_f * 1024).round
  1651.         end
  1652.         if comments[/1-Side/] # [1.5]
  1653.           @fple_one_side = true
  1654.         end
  1655.       end
  1656.     }
  1657.     if @fple_type == 0 then @fple_d_align = 1 end
  1658.     if @fple_stretch == 1 then @fple_v_align = 1 end
  1659.   end
  1660.   #--------------------------------------------------------------------------
  1661.   # * Refresh
  1662.   #--------------------------------------------------------------------------
  1663.   def refresh
  1664.     refresh_fple_game_character
  1665.     if @page then check_commands(@page) end
  1666.   end
  1667. end
  1668.  
  1669. #==============================================================================
  1670. # ** FPLE::Map_Data
  1671. #==============================================================================
  1672. module FPLE
  1673.   class Map_Data
  1674.     #--------------------------------------------------------------------------
  1675.     # * Public Instance Variables
  1676.     #--------------------------------------------------------------------------
  1677.     attr_accessor :data, :tileset_name, :map_name
  1678.     attr_accessor :used_tiles_map, :textureset_data, :subsets_mapping
  1679.     attr_reader :map_id, :width, :height
  1680.   end
  1681. end
  1682.  
  1683. #==============================================================================
  1684. # ** FPLE::Map
  1685. #==============================================================================
  1686. module FPLE
  1687.   class Map
  1688.     #--------------------------------------------------------------------------
  1689.     # * Public Instance Variables
  1690.     #--------------------------------------------------------------------------
  1691.     attr_accessor :data, :tileset_name, :map_name
  1692.     attr_reader :map_id, :width, :height
  1693.     attr_accessor :textureset
  1694.     attr_accessor :texturesets
  1695.     #--------------------------------------------------------------------------
  1696.     # * Initialisation
  1697.     # param width : integer (largeur de la carte, donc égal à $game_map.width)
  1698.     # param height : integer (hauteur de la carte, donc égal à $game_map.height)
  1699.     # param name : String (nom du fichier de la carte FPLE)
  1700.     # param tileset_name : String (nom du tileset utilisé)
  1701.     # param map_data : Array[width * height]<Array<integer>>
  1702.     # param subsets_mapping : Hash<Integer,String> {texture_id=>subset_name}
  1703.     # param textureset_data : Array<Array> données de création du textureset
  1704.     #--------------------------------------------------------------------------
  1705.     def initialize(width, height, name, tileset_name, map_data = nil,
  1706.       subsets_mapping = nil, textureset_data = nil)
  1707.       @width = width
  1708.       @height = height
  1709.       self.map_name = name
  1710.       self.data = Array.new(width * height)
  1711.       data.each_index {|index| data[index] = map_data[index]}
  1712.       self.tileset_name = tileset_name
  1713.       @subsets_mapping = subsets_mapping
  1714.       create_textureset_from_data(textureset_data)
  1715.     end
  1716.     #--------------------------------------------------------------------------
  1717.     # * Retourne les données d'un tile par ses coordonées
  1718.     # param x : integer ([0, width[)
  1719.     # param y : integer ([0, height[)
  1720.     # return Array[10]<integer> (map_Data)
  1721.     #--------------------------------------------------------------------------
  1722.     def get_data(x, y)
  1723.       ret = data[get_index(x, y)]
  1724.       ret = [-1] unless ret
  1725.       return ret
  1726.     end
  1727.     #--------------------------------------------------------------------------
  1728.     # * Retourne l'index d'un tile par ses coordonées
  1729.     # param x : integer ([0, width[)
  1730.     # param y : integer ([0, height[)
  1731.     # return integer (> 0)
  1732.     #--------------------------------------------------------------------------
  1733.     def get_index(x, y)
  1734.       return x + y * width
  1735.     end
  1736.     #--------------------------------------------------------------------------
  1737.     # * Retourne l'abscisse d'un tile par son index
  1738.     # return integer ([0, width[)
  1739.     #--------------------------------------------------------------------------
  1740.     def get_x(index)
  1741.       return index - width * (index / width)
  1742.     end
  1743.     #--------------------------------------------------------------------------
  1744.     # * Retourne l'ordonnée d'un tile par son index
  1745.     # return integer ([0, height[)
  1746.     #--------------------------------------------------------------------------
  1747.     def get_y(index)
  1748.       return index / width
  1749.     end
  1750.     #--------------------------------------------------------------------------
  1751.     # * Création du textureset
  1752.     # param textureset_data : Array<Array> données de création du textureset
  1753.     #--------------------------------------------------------------------------
  1754.     def create_textureset_from_data(textureset_data)
  1755.       rect = Rect.new(0, 0, 32, 32)
  1756.       textureset_height = 1 + (textureset_data.size >> 3) << 5
  1757.       self.textureset = Bitmap.new(256, textureset_height)
  1758.       src = Cache.tileset(tileset_name)
  1759.       textureset_data.each_index {|texture_id|
  1760.         t_dat = textureset_data[texture_id]
  1761.         if t_dat
  1762.           x_trg = texture_id - (texture_id >> 3 << 3) << 5
  1763.           y_trg = texture_id >> 3 << 5
  1764.           rect.x = t_dat[0]
  1765.           rect.y = t_dat[1]
  1766.           if t_dat[0] == 0 && t_dat[1] == 0
  1767.             @texture_id_nil = texture_id
  1768.           end
  1769.           textureset.blt(x_trg, y_trg, src, rect)
  1770.         end
  1771.       }
  1772.       @texturesets = [textureset]
  1773.       @texturesets_widths = [8]
  1774.       @texturesets_mapping_ids = {}
  1775.       subsets_names_list = []
  1776.       if @subsets_mapping
  1777.         @subsets_mapping.each {|texture_id, subset_name|
  1778.           if subsets_names_list.include?(subset_name)
  1779.             @texturesets_mapping_ids[texture_id] =
  1780.             subsets_names_list.index(subset_name) + 1
  1781.           else
  1782.             subsets_names_list << subset_name
  1783.             subset = Cache.tileset(subset_name)
  1784.             texturesets << subset
  1785.             for k in 5..9
  1786.               if subset.width >> k == 1
  1787.                 @texturesets_widths << k
  1788.                 break
  1789.               end
  1790.             end
  1791.             @texturesets_mapping_ids[texture_id] = subsets_names_list.size
  1792.           end
  1793.         }
  1794.       end
  1795.     end
  1796.     #--------------------------------------------------------------------------
  1797.     # * Retourne l'index du textureset pour une texture
  1798.     # param textureset_data : Integer
  1799.     # return Integer
  1800.     #--------------------------------------------------------------------------
  1801.     def get_textureset_id(texture_id)
  1802.       if @texturesets_mapping_ids.has_key?(texture_id)
  1803.         return @texturesets_mapping_ids[texture_id]
  1804.       else
  1805.         return 0
  1806.       end
  1807.     end
  1808.     #--------------------------------------------------------------------------
  1809.     # * Retourne la largeur du textureset pour une texture
  1810.     # param textureset_data : Integer
  1811.     # return Integer
  1812.     #--------------------------------------------------------------------------
  1813.     def get_textureset_width(texture_id)
  1814.       return @texturesets_widths[get_textureset_id(texture_id)]
  1815.     end
  1816.     #--------------------------------------------------------------------------
  1817.     # * Dispose
  1818.     #--------------------------------------------------------------------------
  1819.     def dispose
  1820.       if textureset then textureset.dispose end
  1821.     end
  1822.     #--------------------------------------------------------------------------
  1823.     # * Is texture valid
  1824.     # param texture_id : Integer
  1825.     # return Boolean
  1826.     #--------------------------------------------------------------------------
  1827.     def is_texture_id_valid?(texture_id)
  1828.       return texture_id && texture_id != @texture_id_nil
  1829.     end
  1830.   end
  1831. end
  1832.  
  1833. #==============================================================================
  1834. # ** Spriteset_Weather
  1835. #==============================================================================
  1836. class Spriteset_Weather
  1837.   #--------------------------------------------------------------------------
  1838.   # * Modification of sprites coordinates when moving forward and backward
  1839.   #--------------------------------------------------------------------------
  1840.   def update_fple
  1841.     @sprites.each {|sprite|
  1842.       if $game_temp.movement_dir == 8
  1843.         sprite.x += (sprite.x + @ox - Graphics.width/2) / 8
  1844.         sprite.y += (sprite.y + @oy - Graphics.height/2) / 8
  1845.         sprite.opacity += 8
  1846.       elsif $game_temp.movement_dir == 2
  1847.         sprite.x -= (sprite.x + @ox - Graphics.width/2) / 8
  1848.         sprite.y -= (sprite.y + @oy - Graphics.height/4) / 8
  1849.         sprite.opacity -= 8
  1850.       end
  1851.     }
  1852.   end
  1853. end
  1854.  
  1855. #==============================================================================
  1856. # ** FPLE::Spriteset_Map
  1857. #==============================================================================
  1858. module FPLE
  1859.   class Spriteset_Map < ::Spriteset_Map
  1860.     #--------------------------------------------------------------------------
  1861.     # * Public Instance Variables
  1862.     #--------------------------------------------------------------------------
  1863.     attr_reader :character_surfaces # Array<FPLE::Surface_Characters>
  1864.     attr_reader :viewport1 # Viewport
  1865.     #--------------------------------------------------------------------------
  1866.     # * Create Tilemap
  1867.     #--------------------------------------------------------------------------
  1868.     def create_tilemap
  1869.       # do nothing
  1870.     end
  1871.     #--------------------------------------------------------------------------
  1872.     # * Create Character Surfaces
  1873.     #--------------------------------------------------------------------------
  1874.     def create_characters
  1875.       @character_surfaces = []
  1876.       $game_map.events.values.each {|event|
  1877.         character_surfaces << FPLE::Surface_Character.new(self, event)
  1878.       }
  1879.       @map_id = $game_map.map_id
  1880.       initialize_fple_rendering
  1881.     end
  1882.     #--------------------------------------------------------------------------
  1883.     # * Create Airship Shadow Sprite
  1884.     #--------------------------------------------------------------------------
  1885.     def create_shadow
  1886.       # do nothing
  1887.     end
  1888.     #--------------------------------------------------------------------------
  1889.     # * Initialize FPLE rendering
  1890.     #--------------------------------------------------------------------------
  1891.     def initialize_fple_rendering
  1892.       FPLE.initialize_fple(self, @viewport1)
  1893.     end
  1894.     #--------------------------------------------------------------------------
  1895.     # * Dispose
  1896.     #--------------------------------------------------------------------------
  1897.     def dispose
  1898.       dispose_fple_rendering
  1899.       super
  1900.     end
  1901.     #--------------------------------------------------------------------------
  1902.     # * Dispose of FPLE rendering
  1903.     #--------------------------------------------------------------------------
  1904.     def dispose_fple_rendering
  1905.       FPLE.dispose
  1906.     end
  1907.     #--------------------------------------------------------------------------
  1908.     # * Free Tilemap
  1909.     #--------------------------------------------------------------------------
  1910.     def dispose_tilemap
  1911.       # do nothing
  1912.     end
  1913.     #--------------------------------------------------------------------------
  1914.     # * Dispose of Character Surfaces
  1915.     #--------------------------------------------------------------------------
  1916.     def dispose_characters
  1917.       @character_surfaces.each {|surface| surface.dispose}
  1918.     end
  1919.     #--------------------------------------------------------------------------
  1920.     # * Free Airship Shadow Sprite
  1921.     #--------------------------------------------------------------------------
  1922.     def dispose_shadow
  1923.       # do nothing
  1924.     end
  1925.     #--------------------------------------------------------------------------
  1926.     # * Update Tileset
  1927.     #--------------------------------------------------------------------------
  1928.     def update_tileset
  1929.       # do nothing
  1930.     end
  1931.     #--------------------------------------------------------------------------
  1932.     # * Update Tilemap
  1933.     #--------------------------------------------------------------------------
  1934.     def update_tilemap
  1935.       # do nothing
  1936.     end
  1937.     #--------------------------------------------------------------------------
  1938.     # * Update Parallax
  1939.     #--------------------------------------------------------------------------
  1940.     def update_parallax
  1941.       super
  1942.       if @parallax.bitmap
  1943.         @parallax.ox += (@parallax.bitmap.width * FPLE.angle) / 90
  1944.       end
  1945.     end
  1946.     #--------------------------------------------------------------------------
  1947.     # * Update Character Sprite
  1948.     #--------------------------------------------------------------------------
  1949.     def update_characters
  1950.       unless @map_id == $game_map.map_id then refresh_characters end
  1951.       character_surfaces.each {|surface| surface.update}
  1952.       update_fple_rendering
  1953.     end
  1954.     #--------------------------------------------------------------------------
  1955.     # * Update FPLE Rendering
  1956.     #--------------------------------------------------------------------------
  1957.     def update_fple_rendering
  1958.       FPLE.update
  1959.     end
  1960.     #--------------------------------------------------------------------------
  1961.     # * Update Airship Shadow Sprite
  1962.     #--------------------------------------------------------------------------
  1963.     def update_shadow
  1964.       # do nothing
  1965.     end
  1966.     #--------------------------------------------------------------------------
  1967.     # * Update Weather
  1968.     #--------------------------------------------------------------------------
  1969.     def update_weather
  1970.       @weather.type = $game_map.screen.weather_type
  1971.       @weather.power = $game_map.screen.weather_power
  1972.       @weather.ox = $game_map.display_x * 32 +
  1973.       (Graphics.width * FPLE.angle) / 90 +
  1974.       (Graphics.width * FPLE.offset_x >> 5)
  1975.       @weather.oy = $game_map.display_y * 32
  1976.       @weather.update
  1977.       if FPLE.offset_y > 0 then @weather.update_fple end
  1978.     end
  1979.   end
  1980. end
  1981.  
  1982. #==============================================================================
  1983. # ** FPLE::Surface_Character
  1984. #==============================================================================
  1985. module FPLE
  1986.   class Surface_Character
  1987.     #--------------------------------------------------------------------------
  1988.     # * Public Instance Variables
  1989.     #--------------------------------------------------------------------------
  1990.     attr_accessor :character # Game_Event
  1991.     attr_accessor :bitmap_set # Bitmap
  1992.     attr_accessor :bitmap # Bitmap
  1993.     attr_accessor :visible # Boolean
  1994.     attr_accessor :opacity # Integer
  1995.     attr_accessor :blend_type # Integer
  1996.     attr_accessor :dx # Integer
  1997.     attr_accessor :dy # Integer
  1998.     attr_accessor :displayed # Boolean
  1999.     attr_reader :spriteset # FPLE::Spriteset_Map
  2000.     attr_reader :type # Integer
  2001.     attr_reader :v_align # Integer
  2002.     attr_reader :d_align # Integer
  2003.     attr_reader :fit # Integer (0/1)
  2004.     attr_reader :zoom # Integer (1024 <=> zoom = 1.0)
  2005.     attr_reader :mirror # Integer (0/1) # [1.5]
  2006.     #--------------------------------------------------------------------------
  2007.     # * Object Initialization
  2008.     # param spriteset : FPLE::Spriteset_Map
  2009.     # param character : Game_Event
  2010.     #--------------------------------------------------------------------------
  2011.     def initialize(spriteset, character = nil)
  2012.       @spriteset = spriteset
  2013.       self.character = character
  2014.       self.displayed = false
  2015.       @need_refresh = false
  2016.       @dx_old = 0
  2017.       @dy_old = 0
  2018.       @sx_old = -1
  2019.       @sy_old = -1
  2020.       @visible_old
  2021.       @opacity_old
  2022.       @blend_type_old
  2023.       @sprite_temp = nil
  2024.       @balloon_duration = 0
  2025.       if character
  2026.         @fit = character.fple_fit
  2027.         @zoom = character.fple_zoom
  2028.       else
  2029.         @fit = 0
  2030.         @zoom = 1024
  2031.       end
  2032.       @mirror = 0 # [1.5]
  2033.       update
  2034.     end
  2035.     #--------------------------------------------------------------------------
  2036.     # * Dispose
  2037.     #--------------------------------------------------------------------------
  2038.     def dispose
  2039.       if @sprite_temp
  2040.         @sprite_temp.dispose
  2041.         @sprite_temp = nil
  2042.       end
  2043.       if bitmap_set then self.bitmap_set.dispose end
  2044.       if bitmap then self.bitmap.dispose end
  2045.     end
  2046.     #--------------------------------------------------------------------------
  2047.     # * Get tile set image that includes the designated tile
  2048.     # param tile_id : Integer
  2049.     #--------------------------------------------------------------------------
  2050.     def tileset_bitmap(tile_id)
  2051.       set_number = tile_id / 256
  2052.       return Cache.system("TileB") if set_number == 0
  2053.       return Cache.system("TileC") if set_number == 1
  2054.       return Cache.system("TileD") if set_number == 2
  2055.       return Cache.system("TileE") if set_number == 3
  2056.       return nil
  2057.     end
  2058.     #--------------------------------------------------------------------------
  2059.     # * Frame Update
  2060.     #--------------------------------------------------------------------------
  2061.     def update
  2062.       update_bitmap
  2063.       update_src_rect
  2064.       update_position
  2065.       update_other
  2066.       update_balloon
  2067.       setup_new_effect
  2068.       if need_refresh? then force_render end
  2069.     end
  2070.     #--------------------------------------------------------------------------
  2071.     # * Update Transfer Origin Bitmap
  2072.     #--------------------------------------------------------------------------
  2073.     def update_bitmap
  2074.       if graphic_changed?
  2075.         @tile_id = @character.tile_id
  2076.         @character_name = @character.character_name
  2077.         @character_index = @character.character_index
  2078.         if @tile_id > 0
  2079.           set_tile_bitmap
  2080.         else
  2081.           set_character_bitmap
  2082.         end
  2083.         @need_refresh = true
  2084.       end
  2085.     end
  2086.     #--------------------------------------------------------------------------
  2087.     # * Determine if Graphic Changed
  2088.     #--------------------------------------------------------------------------
  2089.     def graphic_changed?
  2090.       @tile_id != character.tile_id ||
  2091.       @character_name != character.character_name ||
  2092.       @character_index != character.character_index
  2093.     end
  2094.     #--------------------------------------------------------------------------
  2095.     # * Set Tile Bitmap
  2096.     #--------------------------------------------------------------------------
  2097.     def set_tile_bitmap
  2098.       @sx = (@tile_id / 128 % 2 * 8 + @tile_id % 8) * 32;
  2099.       @sy = @tile_id % 256 / 8 % 16 * 32;
  2100.       self.bitmap_set = tileset_bitmap(@tile_id)
  2101.       @cw = 32
  2102.       @ch = 32
  2103.       self.bitmap = Bitmap.new(@cw, @ch)
  2104.     end
  2105.     #--------------------------------------------------------------------------
  2106.     # * Set Character Bitmap
  2107.     #--------------------------------------------------------------------------
  2108.     def set_character_bitmap
  2109.       self.bitmap_set = Cache.character(@character_name)
  2110.       sign = @character_name[/^[\!\$]./]
  2111.       if sign && sign.include?('$')
  2112.         @cw = bitmap_set.width / 3
  2113.         @ch = bitmap_set.height / 4
  2114.       else
  2115.         @cw = bitmap_set.width / 12
  2116.         @ch = bitmap_set.height / 8
  2117.       end
  2118.       self.bitmap = Bitmap.new(@cw, @ch)
  2119.     end
  2120.     #--------------------------------------------------------------------------
  2121.     # * Update Transfer Origin Rectangle
  2122.     #--------------------------------------------------------------------------
  2123.     def update_src_rect
  2124.       if @tile_id == 0
  2125.         index = character.character_index
  2126.         pattern = character.pattern < 3 ? character.pattern : 1
  2127.         @sx = (index % 4 * 3 + pattern) * @cw
  2128.         unless character.direction_fix
  2129.           case $game_player.direction
  2130.           when 2
  2131.             direction = 10 - character.direction
  2132.           when 4
  2133.             direction = 10 - FPLE::TURN_LEFT[(character.direction >> 1) - 1]
  2134.           when 6
  2135.             direction = FPLE::TURN_LEFT[(character.direction >> 1) - 1]
  2136.           when 8
  2137.             direction = character.direction
  2138.           end
  2139.         else
  2140.           direction = character.direction
  2141.         end
  2142.         @sy = ((index >> 2 << 2) + (direction - 2 >> 1)) * @ch
  2143.       end
  2144.       if @sx_old != @sx || @sy_old != @sy
  2145.         self.bitmap.clear
  2146.         self.bitmap.blt(0, 0, bitmap_set, Rect.new(@sx, @sy, @cw, @ch))
  2147.       end
  2148.     end
  2149.     #--------------------------------------------------------------------------
  2150.     # * Update Position
  2151.     #--------------------------------------------------------------------------
  2152.     def update_position
  2153.       self.dx = (128 * character.real_x).to_i
  2154.       self.dy = (128 * character.real_y).to_i
  2155.     end
  2156.     #--------------------------------------------------------------------------
  2157.     # * Update Other
  2158.     #--------------------------------------------------------------------------
  2159.     def update_other
  2160.       self.opacity = character.opacity
  2161.       self.blend_type = character.blend_type
  2162.       self.visible = !character.transparent
  2163.     end
  2164.     #--------------------------------------------------------------------------
  2165.     # * Set New Effect
  2166.     #--------------------------------------------------------------------------
  2167.     def setup_new_effect
  2168.       if character.animation_id > 0
  2169.         if displayed
  2170.           unless @sprite_temp
  2171.             # create a temporary sprite to launch animation
  2172.             @sprite_temp = Sprite_Base.new(spriteset.viewport1)
  2173.           end
  2174.           coordinates = find_coordinates
  2175.           if coordinates
  2176.             @sprite_temp.x = coordinates[0]
  2177.             @sprite_temp.y = coordinates[1]
  2178.             animation = $data_animations[character.animation_id]
  2179.             @sprite_temp.start_animation(animation)
  2180.           else
  2181.             @sprite_temp.dispose
  2182.             @sprite_temp = nil
  2183.           end
  2184.         end
  2185.         character.animation_id = 0
  2186.       end
  2187.       if @sprite_temp
  2188.         @sprite_temp.update
  2189.         unless @sprite_temp.animation?
  2190.           @sprite_temp.dispose
  2191.           @sprite_temp = nil
  2192.         end
  2193.       end
  2194.       if !@balloon_sprite && character.balloon_id != 0
  2195.         @balloon_id = character.balloon_id
  2196.         start_balloon
  2197.       end
  2198.     end
  2199.     #--------------------------------------------------------------------------
  2200.     # * Determine if Changed
  2201.     #--------------------------------------------------------------------------
  2202.     def need_refresh?
  2203.       @need_refresh || @dx_old != dx || @dy_old != dy ||
  2204.       @sx_old != @sx || @sy_old != @sy ||
  2205.       @visible_old != visible || @opacity_old != opacity ||
  2206.       @blend_type_old != blend_type
  2207.     end
  2208.     #--------------------------------------------------------------------------
  2209.     # * Force Render
  2210.     #--------------------------------------------------------------------------
  2211.     def force_render
  2212.       if displayed then $game_temp.force_render = true end
  2213.       @dx_old = dx
  2214.       @dy_old = dy
  2215.       @sx_old = @sx
  2216.       @sy_old = @sy
  2217.       @visible_old = visible
  2218.       @opacity_old = opacity
  2219.       @blend_type_old = blend_type
  2220.       @need_refresh = false
  2221.     end
  2222.     #--------------------------------------------------------------------------
  2223.     # * Refresh FPLE attributes sepending on the relative frame of reference
  2224.     # param direction : Integer
  2225.     #--------------------------------------------------------------------------
  2226.     def set_relative_attributes(direction)
  2227.       case direction
  2228.       when 2
  2229.         @type = character.fple_type
  2230.         @d_align = 2 - character.fple_d_align
  2231.         if character.fple_one_side # [1.5]
  2232.           @mirror = 1
  2233.           if type == 2 && ($game_player.x << 7) - dx <= 0
  2234.             @mirror = 0
  2235.           end
  2236.         end
  2237.       when 4
  2238.         if character.fple_type > 0
  2239.           @type = 3 - character.fple_type
  2240.         else
  2241.           @type = 0
  2242.         end
  2243.         if character.fple_type < 2
  2244.           @d_align = character.fple_d_align
  2245.         elsif character.fple_type == 2
  2246.           @d_align = 2 - character.fple_d_align
  2247.         end
  2248.         if character.fple_one_side # [1.5]
  2249.           @mirror = 1
  2250.           if type == 2 && ($game_player.y << 7) - dy > 0
  2251.             @mirror = 0
  2252.           end
  2253.         end
  2254.       when 6
  2255.         if character.fple_type > 0
  2256.           @type = 3 - character.fple_type
  2257.         else
  2258.           @type = 0
  2259.         end
  2260.         if character.fple_type < 2
  2261.           @d_align = 2 - character.fple_d_align
  2262.         elsif character.fple_type == 2
  2263.           @d_align = character.fple_d_align
  2264.         end
  2265.         if character.fple_one_side # [1.5]
  2266.           @mirror = 0
  2267.           if type == 2 && ($game_player.y << 7) - dy < 0
  2268.             @mirror = 1
  2269.           end
  2270.         end
  2271.       when 8
  2272.         @type = character.fple_type
  2273.         @d_align = character.fple_d_align
  2274.         if character.fple_one_side # [1.5]
  2275.           @mirror = 0
  2276.           if type == 2 && ($game_player.x << 7) - dx >= 0
  2277.             @mirror = 1
  2278.           end
  2279.         end
  2280.       end
  2281.       @v_align = character.fple_v_align
  2282.     end
  2283.     #--------------------------------------------------------------------------
  2284.     # * Calculate screen coordinates to display animations
  2285.     # return Array[2]<Integer>
  2286.     #--------------------------------------------------------------------------
  2287.     def find_coordinates
  2288.       direction = $game_player.direction
  2289.       case direction
  2290.       when 2
  2291.         y = dy - ($game_player.y << 7)
  2292.         x = ($game_player.x << 7) - dx
  2293.       when 4
  2294.         y = ($game_player.x << 7) - dx
  2295.         x = ($game_player.y << 7) - dy
  2296.       when 6
  2297.         y = dx - ($game_player.x << 7)
  2298.         x = dy - ($game_player.y << 7)
  2299.       when 8
  2300.         y = ($game_player.y << 7) - dy
  2301.         x = dx - ($game_player.x << 7)
  2302.       end
  2303.       if y == 0 then return nil end
  2304.       offset_x = 0
  2305.       offset_y = 0
  2306.       if character.fple_v_align != 1
  2307.         gw = Graphics.width
  2308.         x1_proj = gw/2 + (gw/2 * x - (gw/4 << 7)) / y
  2309.         x2_proj = gw/2 + (gw/2 * x + (gw/4 << 7)) / y
  2310.         offset_x = x2_proj - x1_proj >> 1
  2311.         offset_y = offset_x
  2312.         if bitmap
  2313.           offset_x -= (bitmap.width >> 1)
  2314.           offset_y -= (bitmap.height >> 1)
  2315.         end
  2316.       end
  2317.       x_proj = Graphics.width/2 + (Graphics.width/2 * x) / y
  2318.       y_proj = ((Graphics.width * y) - (Graphics.width/2 << 7)) / (y << 1)
  2319.       if character.fple_v_align == 0
  2320.         y_proj -= offset_y
  2321.       elsif character.fple_v_align == 2
  2322.         y_proj += offset_y
  2323.       end
  2324.       return [x_proj, y_proj]
  2325.     end
  2326.     #--------------------------------------------------------------------------
  2327.     # * Start Balloon Icon Display
  2328.     #--------------------------------------------------------------------------
  2329.     def start_balloon
  2330.       dispose_balloon
  2331.       @balloon_duration = 8 * balloon_speed + balloon_wait
  2332.       @balloon_sprite = ::Sprite.new(spriteset.viewport1)
  2333.       @balloon_sprite.bitmap = Cache.system("Balloon")
  2334.       @balloon_sprite.ox = 16
  2335.       @balloon_sprite.oy = 32
  2336.       update_balloon
  2337.     end
  2338.     #--------------------------------------------------------------------------
  2339.     # * Dispose of Balloon Icon
  2340.     #--------------------------------------------------------------------------
  2341.     def dispose_balloon
  2342.       if @balloon_sprite
  2343.         @balloon_sprite.dispose
  2344.         @balloon_sprite = nil
  2345.       end
  2346.     end
  2347.     #--------------------------------------------------------------------------
  2348.     # * Update Balloon Icon
  2349.     #--------------------------------------------------------------------------
  2350.     def update_balloon
  2351.       if @balloon_duration > 0
  2352.         @balloon_duration -= 1
  2353.         if @balloon_duration > 0
  2354.           coordinates = find_coordinates
  2355.           if coordinates
  2356.             @balloon_sprite.x = coordinates[0]
  2357.             @balloon_sprite.y = coordinates[1]
  2358.             @balloon_sprite.z = 9999
  2359.             sx = balloon_frame_index * 32
  2360.             sy = (@balloon_id - 1) * 32
  2361.             @balloon_sprite.src_rect.set(sx, sy, 32, 32)
  2362.           else
  2363.             end_balloon
  2364.           end
  2365.         else
  2366.           end_balloon
  2367.         end
  2368.       end
  2369.     end
  2370.     #--------------------------------------------------------------------------
  2371.     # * End Balloon Icon
  2372.     #--------------------------------------------------------------------------
  2373.     def end_balloon
  2374.       dispose_balloon
  2375.       character.balloon_id = 0
  2376.     end
  2377.     #--------------------------------------------------------------------------
  2378.     # * Balloon Icon Display Speed
  2379.     #--------------------------------------------------------------------------
  2380.     def balloon_speed
  2381.       return 8
  2382.     end
  2383.     #--------------------------------------------------------------------------
  2384.     # * Wait Time for Last Frame of Balloon
  2385.     #--------------------------------------------------------------------------
  2386.     def balloon_wait
  2387.       return 12
  2388.     end
  2389.     #--------------------------------------------------------------------------
  2390.     # * Frame Number of Balloon Icon
  2391.     #--------------------------------------------------------------------------
  2392.     def balloon_frame_index
  2393.       return 7 - [(@balloon_duration - balloon_wait) / balloon_speed, 0].max
  2394.     end
  2395.   end
  2396. end
  2397.  
  2398. #==============================================================================
  2399. # ** Scene_Map
  2400. #==============================================================================
  2401. class Scene_Map < Scene_Base
  2402.   #--------------------------------------------------------------------------
  2403.   # * Aliased methods (F12 compatibility)
  2404.   #--------------------------------------------------------------------------
  2405.   unless @already_aliased_fple
  2406.     alias create_spriteset_fple create_spriteset
  2407.     alias perform_transfer_fple perform_transfer
  2408.     alias post_transfer_fple post_transfer
  2409.     @already_aliased_fple = true
  2410.   end
  2411.   #--------------------------------------------------------------------------
  2412.   # * Create Sprite Set
  2413.   #--------------------------------------------------------------------------
  2414.   def create_spriteset
  2415.     if $game_system.fple
  2416.       @spriteset = FPLE::Spriteset_Map.new
  2417.     else
  2418.       create_spriteset_fple
  2419.     end
  2420.   end
  2421.   #--------------------------------------------------------------------------
  2422.   # * Player Transfer Processing
  2423.   #--------------------------------------------------------------------------
  2424.   def perform_transfer
  2425.     @exec_transfer = $game_player.transfer?
  2426.     @fple_old = $game_system.fple
  2427.     perform_transfer_fple
  2428.   end
  2429.   #--------------------------------------------------------------------------
  2430.   # * Post Processing for Transferring Player
  2431.   #--------------------------------------------------------------------------
  2432.   def post_transfer
  2433.     if @exec_transfer && @fple_old != $game_system.fple
  2434.       @spriteset.dispose
  2435.       create_spriteset
  2436.     end
  2437.     if $game_system.fple
  2438.       $game_temp.force_render = true
  2439.     end
  2440.     post_transfer_fple
  2441.   end
  2442. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement