设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 871|回复: 0
打印 上一主题 下一主题

[已经过期] 腳本衝突,求救

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2111
在线时间
950 小时
注册时间
2015-7-16
帖子
767

开拓者

跳转到指定楼层
1
发表于 2016-3-17 15:31:27 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x


theo 的反lag 搭配 mode 7 會出錯
開飛船時

反lag
RUBY 代码复制
  1. #===============================================================================
  2. # TheoAllen - Insane Anti Lag
  3. # Version : 1.1
  4. # Language : English
  5. #-------------------------------------------------------------------------------
  6. # With help from following people :
  7. # - Tsukihime
  8. # - KilloZapit
  9. # - Galv
  10. #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  11. # Contact :
  12. #-------------------------------------------------------------------------------
  13. # *> [url]http://www.rpgmakerid.com[/url]
  14. # *> [url]http://www.rpgmakervxace.net[/url]
  15. # *> [url]http://www.theolized.com[/url]
  16. #===============================================================================
  17. ($imported ||= {})[:Theo_AntiLag] = true
  18. #===============================================================================
  19. # Change Logs:
  20. # ------------------------------------------------------------------------------
  21. # 2015.02.20 - Added page check enhancer to work with parallel process
  22. # 2015.01.25 - Compatibility with Shaz's Mouse Script. def events_xy now should
  23. #              always return array,
  24. #            - Avoid error 'undefined method delete_sprite for nilClass'
  25. # 2015.01.01 - Avoid unexpected error 'undefined method spriteset for scene'
  26. # 2014.12.05 - Finished
  27. #===============================================================================
  28. =begin
  29.  
  30.   ------------------------------------------
  31.   *) Introduction :
  32.   ------------------------------------------
  33.   As most of you already know, lag is common problem in RPG Maker games. You may
  34.   started to think it was because you have many events on map. And so, to avoid
  35.   lag, you split your map into part and limiting the event as well.
  36.  
  37.   It's not entirely wrong because when you have a lot of events, program need
  38.   to checks all events. However, it wasn't done efficienly. This script
  39.   increase the efficiency on how default script works and prevent unecessary
  40.   update when it's not needed to gain speed.
  41.     
  42.   However, I can not guarantee that it will have high compatibility since I
  43.   overwrite most of stuff. I will likely to make compatibility with my own
  44.   scripts. But I'm not sure about someone's script.
  45.  
  46.   ------------------------------------------
  47.   *) How to use :
  48.   ------------------------------------------
  49.   Put this script below material but above main. And it's recommended to put
  50.   this above most of custom script.
  51.  
  52.   Set the type of optimization that you like in config
  53.   You may disable some kind of optimization if you have compatibility issues
  54.  
  55.   ------------------------------------------
  56.   *) Terms of use :
  57.   ------------------------------------------
  58.   Credit me, TheoAllen. You are free to edit this script by your own. As long
  59.   as you don't claim it's yours. For commercial purpose, don't forget to give me
  60.   a free copy of the game.
  61.  
  62.   Additional people to put in credit credit list are listed in header above.
  63.   You should give them a free copy of your game as well if it's commercial ;)
  64.  
  65. =end
  66. #==============================================================================
  67. # Configurations :
  68. #==============================================================================
  69. module Theo
  70.   module AntiLag
  71.  
  72.   #=============================================================================
  73.   # *) Normal optimization
  74.   #-----------------------------------------------------------------------------
  75.   # This kind of optimization is for normal usage. These optimization may works
  76.   # only if the total events on map is around 200 - 300.
  77.   #=============================================================================
  78.  
  79.   #-----------------------------------------------------------------------------
  80.     Optimize_XY     = true
  81.   #-----------------------------------------------------------------------------
  82.   # By default, event position checking is to check ALL the events on the map.
  83.   # If you want to check an event is in x,y position, it ask EVERY event if
  84.   # their position is match. By using this optimization, all events registered
  85.   # to the map table so that the engine won't check all events on map. Instead,
  86.   # it checks if there's event on a certain table.
  87.   #
  88.   # This kind of optimization is recommended to set it to true. However, it may
  89.   # not compatible with any pixel movement since they using box collider instead
  90.   # of using grid.
  91.   #-----------------------------------------------------------------------------
  92.  
  93.   #-----------------------------------------------------------------------------
  94.     Optimize_Event  = true
  95.   #-----------------------------------------------------------------------------
  96.   # By default, if the engine want to check if there's event starting, they
  97.   # checked ALL the events on map. They did it in every frame. If you have 200
  98.   # events in map, they checked 60 x 200 events per second.
  99.   #
  100.   # By using this optimization, if event is triggered, it will be registered
  101.   # into a record. And then engine checked if there is event on the record
  102.   #-----------------------------------------------------------------------------
  103.  
  104.   #-----------------------------------------------------------------------------
  105.     Optimize_Sprite = true
  106.   #-----------------------------------------------------------------------------
  107.   # By default, the engine still update every sprites which located off screen.
  108.   # This might waste the time since updating it is not necessary sometimes. By
  109.   # using this optimization, it ignores character sprite that already off screen
  110.   #-----------------------------------------------------------------------------
  111.  
  112.   #=============================================================================
  113.   # *) Insane optimization
  114.   #-----------------------------------------------------------------------------
  115.   # This kind of optimization is to overcome the problem of using event beyond
  116.   # 230 on the map which normal optimization is failed to do. This optimization
  117.   # uses insane algorithm like table search and dispose any unecessary sprite on
  118.   # the fly.
  119.   #=============================================================================
  120.  
  121.   #-----------------------------------------------------------------------------
  122.     Table_Limit_Search = 230
  123.   #-----------------------------------------------------------------------------
  124.   # Table search is a custom algorithm to grab events based on the map table.
  125.   # Instead of iterating all events and checked them if they're on the screen,
  126.   # it checked the visible map table instead. So, event that located far away
  127.   # from the player won't be updated. But any parallel process or autorun events
  128.   # or move route for an event will still updated.
  129.   #
  130.   # Table limit search means that if the total of events on map is above the
  131.   # limit, this script will switch event update algorithm to table search. So
  132.   # you will not worrying about having 999 or even 10.000 events on map.
  133.   #
  134.   # Table search required Optimize_XY to set to true.
  135.   #
  136.   # If you don't want to use table search algorithm, just put the parameter
  137.   # to nil.
  138.   #-----------------------------------------------------------------------------
  139.  
  140.   #-----------------------------------------------------------------------------
  141.     Table_Range_Search = 2
  142.   #-----------------------------------------------------------------------------
  143.   # This determine how far table search will perform check. Putting 3 means that
  144.   # it will update the event that located 3 tiles away from the screen.
  145.   #
  146.   # Keep in mind that the longer range search will affect the performance as
  147.   # well. It's recommended to put it between 2 - 4
  148.   #-----------------------------------------------------------------------------
  149.  
  150.   #-----------------------------------------------------------------------------
  151.     Dispose_Sprite  = true
  152.   #-----------------------------------------------------------------------------
  153.   # Sometimes, limiting the events which is being updated is not enough. Sprite
  154.   # objects is still being performace killer. Disposing sprite which is already
  155.   # off screen will greatly affect the performance. This kind of optimization
  156.   # is enabled only if the table search is used.
  157.   #
  158.   # Disposing sprite on the fly might be problematic sometimes. When something
  159.   # wrong happened, you can disable dispose sprite be setting this to false.
  160.   #-----------------------------------------------------------------------------
  161.  
  162.   #-----------------------------------------------------------------------------
  163.     PageCheck_Enchancer = true
  164.   #-----------------------------------------------------------------------------
  165.   # When a lot of events put together in one map, and each has 20 pages, and
  166.   # you have parallel process to change the variable or switches, you will see
  167.   # noticable lag.
  168.   #
  169.   # This kind of enhancer only refresh the visible events on the screen or when
  170.   # the event is on the visible range. So that it prevents to refresh all events
  171.   # This concept is a fool proof to the player since they will never know what
  172.   # is in their visible range
  173.   #
  174.   # However, this may ruin some system since this concept is still experimental.
  175.   #-----------------------------------------------------------------------------
  176.  
  177.   end
  178. end
  179.  
  180. #===============================================================================
  181. # *) Final note :
  182. #-------------------------------------------------------------------------------
  183. # After all, these are just my attempt to speed up the game. Performance are
  184. # still under influence by many factors. These include but may not limited to
  185. #
  186. # - Your CPU speed
  187. # - Your laptop / PC temperature
  188. # - How much power do you give for your CPU
  189. # - Multi tasking
  190. # - Someone's script
  191. #
  192. # I once used RM in old computer. When I switched to more advanced laptop, I
  193. # saw that 60 FPS is really smooth.
  194. #
  195. # If your CPU seems overheat, turn off your laptop / PC for a while for cooling.
  196. # My laptop was once overheat due to broken fan. When I played my own game I
  197. # got 10 FPS. I made my own antilag and no one of them worked until I realized
  198. # my laptop was overheat.
  199. #
  200. # Power saver mode in laptop may affect performance. Try to go high performance
  201. # instead and let see if the lag gone. Once my friend played my game using power
  202. # saver mode, and he got 15 FPS.
  203. #
  204. # If you have many programs running at same time, it may cause a little lag in
  205. # RPG Maker games. Something like the screen won't be updated for a while.
  206. #
  207. # Some scripts can affect performance if it's not done right. This antilag
  208. # script is tested using default script without additional scripts which
  209. # directly affect something on map.
  210. #
  211. #-------------------------------------------------------------------------------
  212. # *) Below this line is sacred place to visit. Unless you have enough skill,
  213. # do not try to enter or any risk is yours.
  214. #===============================================================================
  215.  
  216. #===============================================================================
  217. # ** MapTable
  218. #-------------------------------------------------------------------------------
  219. #  This class used to register the event into 2D table to increase performance
  220. #===============================================================================
  221.  
  222. class MapTable
  223.   #-----------------------------------------------------------------------------
  224.   # * Initialize
  225.   #-----------------------------------------------------------------------------
  226.   def initialize
  227.     @table = []
  228.     ($game_map.width + 1).times do |x|
  229.       @table[x] = []
  230.       ($game_map.height + 1).times do |y|
  231.         @table[x][y] = []
  232.       end
  233.     end
  234.   end
  235.   #-----------------------------------------------------------------------------
  236.   # * Set value
  237.   #-----------------------------------------------------------------------------
  238.   def set(x,y,val)
  239.     @table[x][y] << val
  240.   end
  241.   #-----------------------------------------------------------------------------
  242.   # * Get array
  243.   #-----------------------------------------------------------------------------
  244.   def get(x,y)
  245.     @table[x][y]
  246.   end
  247.  
  248. end
  249.  
  250. #===============================================================================
  251. # ** Array
  252. #===============================================================================
  253.  
  254. class Array
  255.  
  256.   # Just a fool proof
  257.   def values
  258.     return self
  259.   end
  260.  
  261. end
  262.  
  263. #===============================================================================
  264. # ** Game_Map
  265. #===============================================================================
  266.  
  267. class Game_Map
  268.   #-----------------------------------------------------------------------------
  269.   # * Public attributes
  270.   #-----------------------------------------------------------------------------
  271.   attr_accessor :event_redirect     # Redirect events
  272.   attr_reader :forced_update_events # To keep force move route updated
  273.   attr_reader :keep_update_events   # To keep parallel process updated
  274.   attr_reader :cached_events        # To store event that need to be updated
  275.   attr_reader :starting_events      # To store activated event
  276.   attr_reader :table                # 2D Map table
  277.   #-----------------------------------------------------------------------------
  278.   # * Constant
  279.   #-----------------------------------------------------------------------------
  280.   EVENT_LIMIT = Theo::AntiLag::Table_Limit_Search
  281.   RANGE = Theo::AntiLag::Table_Range_Search
  282.   #-----------------------------------------------------------------------------
  283.   # * Alias method : Setup Events
  284.   #-----------------------------------------------------------------------------
  285.   alias theo_antilag_setup_events setup_events
  286.   def setup_events
  287.     @table = MapTable.new
  288.     @forced_update_events = []
  289.     @keep_update_events = []
  290.     @starting_events = []
  291.     @refreshed_events = []
  292.     theo_antilag_setup_events
  293.     select_on_screen_events
  294.   end
  295.   #-----------------------------------------------------------------------------
  296.   # * Overwrite method : Events
  297.   #-----------------------------------------------------------------------------
  298.   def events
  299.     @event_redirect ? @cached_events : @events
  300.   end
  301. #///////////////////////////////////////////////////////////////////////////////
  302.   if Theo::AntiLag::Optimize_XY
  303. #///////////////////////////////////////////////////////////////////////////////
  304.   #-----------------------------------------------------------------------------
  305.   # * Overwrite method : Event XY
  306.   #-----------------------------------------------------------------------------
  307.   def events_xy(x, y)
  308.     @table.get(x,y) || []
  309.   end
  310.   #-----------------------------------------------------------------------------
  311.   # * Overwrite method : Event XY nt
  312.   #-----------------------------------------------------------------------------
  313.   def events_xy_nt(x, y)
  314.     @table.get(x,y).select do |event|
  315.       event.pos_nt?(x, y)
  316.     end
  317.   end
  318. #///////////////////////////////////////////////////////////////////////////////
  319.   end
  320. #///////////////////////////////////////////////////////////////////////////////
  321.   if Theo::AntiLag::Optimize_Event
  322. #///////////////////////////////////////////////////////////////////////////////
  323.   #-----------------------------------------------------------------------------
  324.   # * Overwrite method : Setup starting event
  325.   #-----------------------------------------------------------------------------
  326.   def setup_starting_map_event
  327.     event = @starting_events[0]
  328.     event.clear_starting_flag if event
  329.     @interpreter.setup(event.list, event.id) if event
  330.     event
  331.   end
  332.   #-----------------------------------------------------------------------------
  333.   # * Overwrite method : Any event starting?
  334.   #-----------------------------------------------------------------------------
  335.   def any_event_starting?
  336.     !@starting_events.empty?
  337.   end
  338. #///////////////////////////////////////////////////////////////////////////////
  339.   end
  340. #///////////////////////////////////////////////////////////////////////////////
  341.   #-----------------------------------------------------------------------------
  342.   # * Overwrite method : Refresh
  343.   #-----------------------------------------------------------------------------
  344.   def refresh
  345.     return table_refresh if table_update? && Theo::AntiLag::PageCheck_Enchancer
  346.     @events.each_value {|event| next if event.never_refresh; event.refresh }
  347.     @common_events.each {|event| event.refresh }
  348.     refresh_tile_events
  349.     @need_refresh = false
  350.   end
  351.   #-----------------------------------------------------------------------------
  352.   # * New method : Refresh event by table search
  353.   #-----------------------------------------------------------------------------
  354.   def table_refresh
  355.     @refreshed_events = []
  356.     @tile_events = []
  357.     @common_events.each {|event| event.refresh }
  358.     @need_refresh = false
  359.   end
  360.   #-----------------------------------------------------------------------------
  361.   # * Overwrite method : Update events
  362.   #-----------------------------------------------------------------------------
  363.   def update_events
  364.     last_events = (@cached_events.dup rescue @events.values)
  365.     select_on_screen_events
  366.     events = @cached_events | @keep_update_events | @forced_update_events
  367.     if Theo::AntiLag::Dispose_Sprite
  368.       offscreen_events = last_events - events
  369.       offscreen_events.each {|event| event.delete_sprite}
  370.     end
  371.     events.each {|event| event.update}
  372.     @common_events.each {|event| event.update}
  373.   end
  374.   #-----------------------------------------------------------------------------
  375.   # * New method : Select on screen events
  376.   #-----------------------------------------------------------------------------
  377.   def select_on_screen_events
  378.     unless table_update?
  379.       @cached_events = @events.values
  380.       return
  381.     end
  382.     #---------------------------------------------------------------------------
  383.     # * Table search algorithm
  384.     #---------------------------------------------------------------------------
  385.     new_dpx = display_x.to_i
  386.     new_dpy = display_y.to_i
  387.     dpx = loop_horizontal? ? new_dpx - RANGE : [new_dpx - RANGE, 0].max
  388.     dpy = loop_vertical? ? new_dpy - RANGE : [new_dpy - RANGE, 0].max
  389.     sw = (Graphics.width >> 5) + RANGE * 2
  390.     sh = (Graphics.height >> 5) + RANGE * 2
  391.     @cached_events = []
  392.     sw.times do |x|
  393.       sh.times do |y|
  394.         xpos = loop_horizontal? ? (x + dpx) % width : x + dpx
  395.         ypos = loop_vertical? ? (y + dpy) % height : y + dpy
  396.         next if xpos >= width || ypos >= height
  397.         ary = @table.get(xpos, ypos)
  398.         ary.each do |ev|
  399.           unless @refreshed_events.include?(ev.id)
  400.             ev.refresh
  401.             @tile_events << ev if ev.tile?
  402.             @refreshed_events << ev.id
  403.           end
  404.         end if Theo::AntiLag::PageCheck_Enchancer
  405.         @cached_events += ary
  406.       end
  407.     end
  408.     @cached_events.uniq!
  409.   end
  410.   #-----------------------------------------------------------------------------
  411.   # * Check if table search need to be performed or not
  412.   #-----------------------------------------------------------------------------
  413.   def table_update?
  414.     EVENT_LIMIT && @events.size > EVENT_LIMIT && Theo::AntiLag::Optimize_XY
  415.   end
  416.  
  417. end
  418.  
  419. #===============================================================================
  420. # ** Game_Temp
  421. #===============================================================================
  422.  
  423. class Game_Temp
  424.   attr_reader :event_sprites
  425.   #-----------------------------------------------------------------------------
  426.   # * Alias method : Initialize
  427.   #-----------------------------------------------------------------------------
  428.   alias theo_antilag_init initialize
  429.   def initialize
  430.     theo_antilag_init
  431.     @event_sprites = {}
  432.   end
  433.  
  434. end
  435.  
  436. #===============================================================================
  437. # ** Game_CharacterBase
  438. #===============================================================================
  439.  
  440. class Game_CharacterBase
  441.   #-----------------------------------------------------------------------------
  442.   # * Empty method : Sprite
  443.   #-----------------------------------------------------------------------------
  444.   def sprite
  445.     return nil
  446.   end
  447.   #-----------------------------------------------------------------------------
  448.   # * Empty method : Sprite =
  449.   #-----------------------------------------------------------------------------
  450.   def sprite=(spr)
  451.   end
  452.  
  453. end
  454.  
  455. #===============================================================================
  456. # ** Game_Event
  457. #===============================================================================
  458.  
  459. class Game_Event
  460.   #-----------------------------------------------------------------------------
  461.   # * Never refesh flag
  462.   #-----------------------------------------------------------------------------
  463.   attr_reader :never_refresh
  464.   #-----------------------------------------------------------------------------
  465.   # * Alias method : Initialize
  466.   #-----------------------------------------------------------------------------
  467.   alias theo_antilag_init initialize
  468.   def initialize(map_id, event)
  469.     theo_antilag_init(map_id, event)
  470.     $game_map.table.set(x,y,self)
  471.     @last_x = @x
  472.     @last_y = @y
  473.   end
  474.   #-----------------------------------------------------------------------------
  475.   # * Alias method : Update
  476.   #-----------------------------------------------------------------------------
  477.   alias theo_antilag_update update
  478.   def update
  479.     if (sprite && sprite.disposed?) || sprite.nil?
  480.       spriteset = SceneManager.scene.spriteset
  481.       return unless spriteset
  482.       spriteset.add_sprite(self)
  483.     end
  484.     theo_antilag_update
  485.     if Theo::AntiLag::Optimize_XY && (@last_x != @x || @last_y != @y)
  486.       $game_map.table.get(@last_x, @last_y).delete(self)
  487.       $game_map.table.set(@x,@y,self)
  488.       @last_x = @x
  489.       @last_y = @y
  490.     end
  491.   end
  492.   #-----------------------------------------------------------------------------
  493.   # * Alias method : Start
  494.   #-----------------------------------------------------------------------------
  495.   alias theo_antilag_start start
  496.   def start
  497.     theo_antilag_start
  498.     return unless Theo::AntiLag::Optimize_Event
  499.     $game_map.starting_events << self if @starting
  500.   end
  501.   #-----------------------------------------------------------------------------
  502.   # * Alias method : Clear starting flag
  503.   #-----------------------------------------------------------------------------
  504.   alias theo_antilag_clear_start clear_starting_flag
  505.   def clear_starting_flag
  506.     theo_antilag_clear_start
  507.     return unless Theo::AntiLag::Optimize_Event
  508.     $game_map.starting_events.delete(self)
  509.   end
  510.   #-----------------------------------------------------------------------------
  511.   # * Alias method : Setup page setting
  512.   #-----------------------------------------------------------------------------
  513.   alias theo_antilag_setup_page_settings setup_page_settings
  514.   def setup_page_settings
  515.     theo_antilag_setup_page_settings
  516.     if @event.pages.size == 1 && no_condition?(@event.pages[0].condition)
  517.       @never_refresh = true
  518.     end
  519.     if @trigger == 3 || @interpreter
  520.       $game_map.keep_update_events << self
  521.       $game_map.keep_update_events.uniq!
  522.     else
  523.       $game_map.keep_update_events.delete(self)
  524.     end
  525.   end
  526.   #-----------------------------------------------------------------------------
  527.   # * Check if the events has no page condition
  528.   #-----------------------------------------------------------------------------
  529.   def no_condition?(page)
  530.     !page.switch1_valid && !page.switch2_valid && !page.variable_valid &&
  531.       !page.self_switch_valid && !page.item_valid && !page.actor_valid
  532.   end
  533.   #-----------------------------------------------------------------------------
  534.   # * Delete sprite
  535.   #-----------------------------------------------------------------------------
  536.   def delete_sprite
  537.     sprset = SceneManager.scene.spriteset
  538.     return unless sprset
  539.     SceneManager.scene.spriteset.delete_sprite(sprite)
  540.   end
  541.   #-----------------------------------------------------------------------------
  542.   # * Overwrite method : Force move route
  543.   #-----------------------------------------------------------------------------
  544.   def force_move_route(move_route)
  545.     super
  546.     $game_map.forced_update_events << self
  547.     $game_map.forced_update_events.uniq!
  548.   end
  549.   #-----------------------------------------------------------------------------
  550.   # * Overwrite method : Restore move route
  551.   #-----------------------------------------------------------------------------
  552.   def restore_move_route
  553.     super
  554.     $game_map.forced_update_events.delete(self)
  555.   end
  556.   #-----------------------------------------------------------------------------
  557.   # * Overwrite method : Sprite
  558.   #-----------------------------------------------------------------------------
  559.   def sprite
  560.     $game_temp.event_sprites[@id]
  561.   end
  562.   #-----------------------------------------------------------------------------
  563.   # * Overwrite method : Sprite =
  564.   #-----------------------------------------------------------------------------
  565.   def sprite=(spr)
  566.     $game_temp.event_sprites[@id] = spr
  567.   end
  568.  
  569. end
  570.  
  571. #===============================================================================
  572. # ** Sprite Character
  573. #===============================================================================
  574.  
  575. class Sprite_Character
  576.   #-----------------------------------------------------------------------------
  577.   # * Alias method : Initialize
  578.   #-----------------------------------------------------------------------------
  579.   alias theo_antilag_init initialize
  580.   def initialize(viewport, character = nil)
  581.     character.sprite = self if character
  582.     theo_antilag_init(viewport, character)
  583.   end
  584.   #-----------------------------------------------------------------------------
  585.   # * Alias method : Update
  586.   #-----------------------------------------------------------------------------
  587.   alias theo_antilag_update update
  588.   def update
  589.     @sx = @character.screen_x
  590.     @sy = @character.screen_y
  591.     if Theo::AntiLag::Optimize_Sprite && !need_update?
  592.       self.visible = false
  593.       return
  594.     end  
  595.     theo_antilag_update
  596.   end
  597.   #-----------------------------------------------------------------------------
  598.   # * New method : Determine if on screen
  599.   #-----------------------------------------------------------------------------
  600.   def need_update?
  601.     return true if graphic_changed?
  602.     return true if @character.animation_id > 0
  603.     return true if @balloon_sprite
  604.     return true if @character.balloon_id != 0
  605.     w = Graphics.width
  606.     h = Graphics.height
  607.     cw = @cw || 32
  608.     ch = @ch || 32
  609.     @sx.between?(-cw,w+cw) && @sy.between?(0,h+ch)
  610.   end
  611.   #-----------------------------------------------------------------------------
  612.   # * Overwrite update position.
  613.   # To limit screen_x and screen_y to be called many times
  614.   #-----------------------------------------------------------------------------
  615.   def update_position
  616.     move_animation(@sx - x, @sy - y)
  617.     self.x = @sx
  618.     self.y = @sy
  619.     self.z = @character.screen_z
  620.   end
  621.   #-----------------------------------------------------------------------------
  622.   # * Overwrite animation origin
  623.   # Since X and Y axis of sprite is not updated when off screen
  624.   #-----------------------------------------------------------------------------
  625.   def set_animation_origin
  626.     if @animation.position == 3
  627.       if viewport == nil
  628.         @ani_ox = Graphics.width / 2
  629.         @ani_oy = Graphics.height / 2
  630.       else
  631.         @ani_ox = viewport.rect.width / 2
  632.         @ani_oy = viewport.rect.height / 2
  633.       end
  634.     else
  635.       @ani_ox = @sx - ox + width / 2
  636.       @ani_oy = @sy - oy + height / 2
  637.       if @animation.position == 0
  638.         @ani_oy -= height / 2
  639.       elsif @animation.position == 2
  640.         @ani_oy += height / 2
  641.       end
  642.     end
  643.   end
  644.  
  645. end
  646.  
  647. #===============================================================================
  648. # ** Spriteset_Map
  649. #===============================================================================
  650.  
  651. class Spriteset_Map
  652.   #-----------------------------------------------------------------------------
  653.   # * Alias method : create character
  654.   #-----------------------------------------------------------------------------
  655.   alias theo_antilag_create_characters create_characters
  656.   def create_characters
  657.     $game_map.event_redirect = Theo::AntiLag::Dispose_Sprite
  658.     theo_antilag_create_characters
  659.     $game_map.event_redirect = false
  660.   end
  661.   #-----------------------------------------------------------------------------
  662.   # * New method : delete sprite
  663.   #-----------------------------------------------------------------------------
  664.   def delete_sprite(spr)
  665.     return unless spr
  666.     return if spr.disposed?
  667.     @character_sprites.delete(spr)
  668.     spr.dispose
  669.   end
  670.   #-----------------------------------------------------------------------------
  671.   # * New method : add sprite
  672.   #-----------------------------------------------------------------------------
  673.   def add_sprite(char)
  674.     spr = Sprite_Character.new(@viewport1, char)
  675.     @character_sprites.push(spr)
  676.   end
  677.  
  678. end
  679.  
  680. #===============================================================================
  681. # ** Scene_Base
  682. #===============================================================================
  683.  
  684. class Scene_Base
  685.   attr_reader :spriteset
  686. end





mod7

RUBY 代码复制
  1. #====================================================================
  2. # Mode 7 Ace
  3. # v.1.9
  4. # Auteur : MGC
  5. #
  6. # Il s'agit d'un script de mode 7 basique pour RMVX Ace.
  7. #
  8. # - Permet une inclinaison de la carte de 0° à 89°
  9. # - Toute la carte est inclinée, sans relief. Seuls les évènements
  10. #   paraissent dressés verticalement.
  11. # - L'effet de colorisation à l'horizon est personnalisable.
  12. # - Les tiles animés sont supportés, ainsi que le bouclage de la carte.
  13. # - possibilité de zoomer (de 1:8 à 8:1) quand le mode 7 est activé.
  14. #
  15. # IMPORTANT : SI VOUS RENCONTREZ DU LAG, VEUILLEZ VOUS ASSURER D'AVOIR
  16. # DECOCHER "REDUCE SCREEN FLICKERING" (F1).
  17. #
  18. # Nécessite :
  19. # - le fichier MGC_Mode7_Ace_1_9.dll à la racine du projet
  20. # - les 3 fichiers graphiques suivants, déposés dans Pictures/ :
  21. #         - autotiles_data.png
  22. #         - autotiles_data_small.png
  23. #         - autotiles_data_xsmall.png
  24. #
  25. # Configuration :
  26. # - MODE7_MAPS_ID : Contient la liste des id des cartes pour lesquelles
  27. #         le mode 7 est appliqué dès l'entrée sur ces cartes
  28. # - MODE7_DEFAULT_ZOOM : valeur de zoom par défaut qui s'applique dès le
  29. #         passage en mode 7. Compris entre 0.125 et 8.0.
  30. # - MODE7_DEFAULT_ANGLE : valeur d'angle d'inclinaison par défaut qui
  31. #         s'applique dès le passage en mode 7. Compris entre 0 et 89.
  32. # - MODE7_VIEW_LIMIT : nombre de tiles supplémentaires à afficher (en plus
  33. #         des 13 pour la vue normale de la carte en 544 * 416) avant l'horizon.
  34. # - MODE7_FADING_DISTANCE : nombre de tiles avant l'horizon subissant un
  35. #         dégradé de ton et/ou d'opacité.
  36. # - MODE7_FADING_TONE : composantes de couleur R, G, B vers lesquelles tend
  37. #         le dégradé de ton à l'horizon. Chaque composantes peut varier
  38. #         entre -255 et 255.
  39. # - MODE7_FADING_OPACITY : opacité vers laquelle tend le dégradé d'opacité ton
  40. #         à l'horizon. Compris entre 255 (pas de dégradé d'opacité) et 0.
  41. # - MODE7_SCAN_STEP : méthode de rafraîchissement de l'écran :
  42. #         - 1 : l'écran est entièrement redessiné en 1 frame. Déconseillé
  43. #               car extrêmement gourmand en ressources.
  44. #         - 2 : l'écran est redessiné en 2 frames (une ligne de l'écran sur
  45. #               deux est dessinée pour chaque frame).
  46. #         - 3 : l'écran est redessiné en 3 frames (une ligne de l'écran sur
  47. #               trois est dessinée pour chaque frame). Conseillé s'il y a
  48. #               trop de lag.
  49. # - MODE7_TERRAIN_TAGS : liste de valeurs de terrain tags pour lesquelles les
  50. #         tiles doivent être dessinés verticalement en mode 7. Si le paramètre
  51. #         MODE7_VERTICAL_TILES_TYPE n'a pas sa valeur égale à 0, utiliser
  52. #         plusieurs valeurs permet de séparer des regroupements de tiles
  53. #         contigus.
  54. # - MODE7_VERTICAL_TILES_TYPE :
  55. #         - 0 : aucun regroupement des tiles verticaux même si des tiles voisins
  56. #               ont le même terrain tag. Pour un tile avec un terrain tag
  57. #               configuré pour être dessiné verticalement, un sprite de
  58. #               dimensions 32*32 est créé. A priori aucun intérêt sans la
  59. #               rotation, car aura le même effet que la valeur 2 mais avec
  60. #               plus de sprites à l'écran, donc plus de ralentissements.
  61. #         - 1 : regroupement des tiles verticaux contigus sur la même colonne
  62. #               ayant le même terrain tag. Un sprite est créé par regroupement,
  63. #               le tile le plus bas du regroupement servant de base au sprite.
  64. #               A priori aucun intérêt sans la rotation, car aura le même effet
  65. #               que la valeur 3 mais avec plus de sprites à afficher.
  66. #         - 2 : regroupement des tiles verticaux contigus sur la même ligne
  67. #               ayant le même terrain tag. Un sprite est créé par regroupement,
  68. #               l'origine horizontale étant fixée au milieu du regroupement.
  69. #         - 3 : regroupement des tiles verticaux contigus ayant le même
  70. #               terrain tag, quelle que soit la ligne ou la colonne. Un sprite
  71. #               est créé par regroupement, le tile le plus bas du regroupement
  72. #               servant de base au sprite et l'origine horizontale étant fixée
  73. #               au milieu du regroupement. Valeur par défaut.
  74. # - MODE7_ALWAYS_DRAW_TILES_ON_MAP :
  75. #         - 0 : les tiles verticaux ne sont pas dessinés couchés sur la carte.
  76. #               Valeur par défaut.
  77. #         - 1 : les tiles verticaux sont également dessinés couchés sur la carte.
  78. # - MODE7_PARALLAXED_MAPS_ID : Contient la liste des id des cartes en mode 7
  79. #         pour lesquelles le panorama est utilisé en tant que couche inférieure.
  80. #         Vous pouvez utiliser un second panorama pour le fond, il faut ajouter
  81. #         dans les notes de la carte le texte suivant : [m7a_pano:nom_du_fichier]
  82. #
  83. # Utilisation :
  84. # Commandes utilisables comme commandes d'évènement avec Script... :
  85. # - MGC.start_mode7 : lance le mode 7 pour la carte
  86. # - MGC.to_mode7_angle(nouvel angle, durée de transition)
  87. # - MGC.to_mode7_zoom(nouvelle valeur de zoom, durée de transition)
  88. # - MGC.end_mode7 : quitte le mode 7
  89. # - MGC.set_mode7_scan(nouvelle valeur) : modifie le paramètre MODE7_SCAN_STEP
  90. #
  91. # Vous pouvez ajouter des commandes dans le nom des cartes pour forcer le
  92. # paramétrage du mode 7 de la carte. Les paramètres dans le nom de la
  93. # carte sont prioritaires par rapport à ceux dans la partie CONFIGURATION
  94. # - [M7] : active le mode 7 pour la carte
  95. # - [Ax], où x est un entier entre 0 et 89 : angle de la carte
  96. # - [Zx], où x est un décimal entre 0.125 et 8.0 : zoom de la carte
  97. # - [FDx], où x est un entier positif : nombre de tiles avant l'horizon
  98. #         subissant un dégradé de ton et/ou d'opacité
  99. # - [FTx,y,z], où x, y et z sont des entiers entre -255 et 255 :
  100. #         composantes de couleur R, G, B vers lesquelles tend le dégradé
  101. #         de ton à l'horizon
  102. # - [FOx], où x est un entier entre 0 et 255 : opacité vers laquelle
  103. #         tend le dégradé d'opacité ton à l'horizon
  104. # - [P] : le panorama est utilisé en tant que couche inférieure de la carte
  105. # Exemple :
  106. # My Worldmap [M7][A55][Z0.5][FD20][FT128,64,-32][FO128]
  107. #====================================================================
  108. module MGC
  109.   #--------------------------------------------------------------------------
  110.   # * CONFIGURATION
  111.   #--------------------------------------------------------------------------
  112.   MODE7_MAPS_ID = []
  113.   MODE7_DEFAULT_ZOOM = 1.0
  114.   MODE7_DEFAULT_ANGLE = 0
  115.   MODE7_VIEW_LIMIT = 26
  116.   MODE7_FADING_DISTANCE = 13
  117.   MODE7_FADING_TONE = Tone.new(64, 64, 128)
  118.   MODE7_FADING_OPACITY = 0
  119.   MODE7_SCAN_STEP = 2
  120.   MODE7_TERRAIN_TAGS = [1, 2] # [1.7]
  121.   MODE7_VERTICAL_TILES_TYPE = 3 # [1.7]
  122.   MODE7_ALWAYS_DRAW_TILES_ON_MAP = 0 # [1.7]
  123.   MODE7_PARALLAXED_MAPS_ID = [] # [1.9]
  124.   #--------------------------------------------------------------------------
  125.   # * Initialisation
  126.   #--------------------------------------------------------------------------
  127.   @mode7_zoom = 1.0
  128.   @mode7_active = false
  129.   #--------------------------------------------------------------------------
  130.   # * Lancement du mode 7
  131.   #--------------------------------------------------------------------------
  132.   def self.start_mode7
  133.     @end_mode7 = false
  134.     @spriteset.start_mode7
  135.   end
  136.   #--------------------------------------------------------------------------
  137.   # * Fin du mode 7
  138.   #--------------------------------------------------------------------------
  139.   def self.end_mode7
  140.     @end_mode7 = true
  141.     self.to_mode7_zoom(1.0, 1)
  142.   end
  143.   #--------------------------------------------------------------------------
  144.   # * Setter pour l'attribut spriteset
  145.   #--------------------------------------------------------------------------
  146.   def self.spriteset=(spriteset)
  147.     @spriteset = spriteset
  148.   end
  149.   #--------------------------------------------------------------------------
  150.   # * Initialisation des données du mode 7
  151.   #--------------------------------------------------------------------------
  152.   def self.initialize_mode7(reset = false) # [1.9]
  153.     if reset
  154.       self.mode7_angle = $game_map.get_default_mode7_angle
  155.       @mode7_zoom = $game_map.get_default_mode7_zoom
  156.     else
  157.       self.mode7_angle = $game_system.mode7_angle ? $game_system.mode7_angle :
  158.       $game_map.get_default_mode7_angle
  159.       @mode7_zoom = $game_system.mode7_zoom ? $game_system.mode7_zoom :
  160.       $game_map.get_default_mode7_zoom
  161.     end
  162.     @mode7_angle_duration = 0
  163.     @mode7_zoom_incr = Math.log(@mode7_zoom) / Math.log(2)
  164.     @mode7_zoom_duration = 0
  165.     pivot = (Graphics.height >> 1) + 12
  166.     @mode7_data = [pivot, pivot.to_f / Graphics.height, 1.0, 1.0, 0,
  167.     Graphics.height, 0, 0, 0, 0]
  168.   end
  169.   #--------------------------------------------------------------------------
  170.   # * Change Map
  171.   #--------------------------------------------------------------------------
  172.   def self.start_change_map
  173.     self.mode7_angle = $game_map.get_default_mode7_angle
  174.     @mode7_angle_duration = 0
  175.     @mode7_zoom = $game_map.get_default_mode7_zoom
  176.     @mode7_zoom_incr = Math.log(@mode7_zoom) / Math.log(2)
  177.     @mode7_zoom_duration = 0
  178.     @change_map = true
  179.   end
  180.   #--------------------------------------------------------------------------
  181.   # * Is Changing Map ?
  182.   #--------------------------------------------------------------------------
  183.   def self.is_changing_map?
  184.     return @change_map
  185.   end
  186.   #--------------------------------------------------------------------------
  187.   # * End Change Map
  188.   #--------------------------------------------------------------------------
  189.   def self.end_change_map
  190.     @change_map = false
  191.   end
  192.   #--------------------------------------------------------------------------
  193.   # * Getter pour l'attribut mode7_data
  194.   #--------------------------------------------------------------------------
  195.   def self.mode7_data
  196.     return @mode7_data
  197.   end
  198.   #--------------------------------------------------------------------------
  199.   # * Getter pour l'attribut mode7_zoom
  200.   #--------------------------------------------------------------------------
  201.   def self.mode7_zoom
  202.     return @mode7_zoom
  203.   end
  204.   #--------------------------------------------------------------------------
  205.   # * Getter pour l'attribut mode7_angle
  206.   #--------------------------------------------------------------------------
  207.   def self.mode7_angle
  208.     return @mode7_angle
  209.   end
  210.   #--------------------------------------------------------------------------
  211.   # * Getter pour l'attribut mode7_active
  212.   #--------------------------------------------------------------------------
  213.   def self.mode7_active
  214.     return @mode7_active
  215.   end
  216.   #--------------------------------------------------------------------------
  217.   # * Setter pour l'attribut mode7_active
  218.   #--------------------------------------------------------------------------
  219.   def self.mode7_active=(flag)
  220.     $game_system.mode7_active = flag
  221.     @mode7_active = flag
  222.   end
  223.   #--------------------------------------------------------------------------
  224.   # * Setter pour l'attribut mode7_zoom
  225.   #--------------------------------------------------------------------------
  226.   def self.mode7_zoom=(zoom_value)
  227.     unless mode7_zoom == zoom_value
  228.       if zoom_value < 0.125 || zoom_value > 8.0 then return end
  229.       @mode7_zoom = zoom_value
  230.       $game_system.mode7_zoom = @mode7_zoom
  231.       $game_player.center($game_player.x, $game_player.y)
  232.     end
  233.   end
  234.   #--------------------------------------------------------------------------
  235.   # * Incrémentation de la valeur du zoom du mode 7
  236.   #--------------------------------------------------------------------------
  237.   def self.incr_mode7_zoom(val = 0.02)
  238.     @mode7_zoom_incr += val
  239.     new_zoom = 2 ** @mode7_zoom_incr
  240.     self.mode7_zoom = new_zoom
  241.   end
  242.   #--------------------------------------------------------------------------
  243.   # * Pour aller progressivement vers une nouvelle valeur de zoom du mode 7
  244.   #--------------------------------------------------------------------------
  245.   def self.to_mode7_zoom(new_zoom, duration)
  246.     unless mode7_zoom == new_zoom
  247.       if new_zoom < 0.125 || new_zoom > 8.0 then return end
  248.       @mode7_zoom_duration = duration
  249.       target_zoom_incr = Math.log(new_zoom) / Math.log(2)
  250.       @mode7_zoom_step = (target_zoom_incr - @mode7_zoom_incr) / duration
  251.       @target_mode7_zoom = new_zoom
  252.     end
  253.   end
  254.   #--------------------------------------------------------------------------
  255.   # * Setter pour l'attribut mode7_angle
  256.   #--------------------------------------------------------------------------
  257.   def self.mode7_angle=(new_angle)
  258.     unless new_angle == @mode7_angle
  259.       @mode7_angle = [[new_angle, 0].max, 89].min
  260.       @mode7_angle_real = @mode7_angle
  261.       $game_system.mode7_angle = @mode7_angle
  262.     end
  263.   end
  264.   #--------------------------------------------------------------------------
  265.   # * Autre setter pour l'attribut mode7_angle, ne réinitialisant pas @mode7_angle_real
  266.   #--------------------------------------------------------------------------
  267.   def self.set_mode7_angle(new_angle)
  268.     unless new_angle == @mode7_angle
  269.       @mode7_angle = [[new_angle, 0].max, 89].min
  270.       $game_system.mode7_angle = @mode7_angle
  271.     end
  272.   end
  273.   #--------------------------------------------------------------------------
  274.   # * Incrémentation de la valeur de l'angle du mode 7
  275.   #--------------------------------------------------------------------------
  276.   def self.incr_mode7_angle
  277.     @mode7_angle_real += @mode7_angle_step
  278.     self.set_mode7_angle(@mode7_angle_real.to_i)
  279.   end
  280.   #--------------------------------------------------------------------------
  281.   # * Pour aller progressivement vers une nouvelle valeur de l'angle du mode 7
  282.   #--------------------------------------------------------------------------
  283.   def self.to_mode7_angle(new_angle, duration)
  284.     unless @mode7_angle == new_angle
  285.       new_angle = [[new_angle, 0].max, 89].min
  286.       @mode7_angle_duration = duration
  287.       @mode7_angle_step = (new_angle - @mode7_angle).to_f / duration
  288.       @target_mode7_angle = new_angle
  289.     end
  290.   end
  291.   #--------------------------------------------------------------------------
  292.   # * Mise à jour du mode 7
  293.   #--------------------------------------------------------------------------
  294.   def self.update_mode7
  295.     if @mode7_active
  296.       if @mode7_zoom_duration > 0
  297.         @mode7_zoom_duration -= 1
  298.         if @mode7_zoom_duration == 0
  299.           self.mode7_zoom = @target_mode7_zoom
  300.         else
  301.           self.incr_mode7_zoom(@mode7_zoom_step)
  302.         end
  303.       elsif @mode7_angle_duration > 0
  304.         @mode7_angle_duration -= 1
  305.         if @mode7_angle_duration == 0
  306.           self.mode7_angle = @target_mode7_angle
  307.         else
  308.           self.incr_mode7_angle
  309.         end
  310.       elsif @end_mode7
  311.         @spriteset.end_mode7
  312.         @end_mode7 = false
  313.       end
  314.     end
  315.   end
  316.   #--------------------------------------------------------------------------
  317.   # * Vérifie si un effet est en cours
  318.   #--------------------------------------------------------------------------
  319.   def self.effect?
  320.     return @mode7_active && (@mode7_zoom_duration > 0 ||
  321.     @mode7_angle_duration > 0 || @end_mode7)
  322.   end
  323.   #--------------------------------------------------------------------------
  324.   # * Modifie la valeur de la méthode de rafraîchissement de l'écran
  325.   #--------------------------------------------------------------------------
  326.   def self.set_mode7_scan(new_value)
  327.     new_value = [[new_value, 1].max, 3].min
  328.     unless MODE7_SCAN_STEP == new_value
  329.       self.const_set(:MODE7_SCAN_STEP, new_value)
  330.     end
  331.   end
  332.   #==============================================================================
  333.   # ** MGC::Mode7_Map
  334.   #==============================================================================
  335.   class Mode7_Map
  336.     #--------------------------------------------------------------------------
  337.     # * Attributs
  338.     #--------------------------------------------------------------------------
  339.     attr_reader :viewport, :visible, :ox, :oy, :opacity, :blend_type, :color,
  340.     :tone, :wave_amp, :wave_length, :wave_speed, :wave_phase, :zoom, :map_data,
  341.     :flags
  342.     attr_accessor :bitmaps, :flash_data
  343.     attr_reader :alpha, :parameters
  344.     attr_reader :param_tiles # [1.7]
  345.     attr_reader :map_id # [1.9]
  346.     #--------------------------------------------------------------------------
  347.     # * Constantes
  348.     #--------------------------------------------------------------------------
  349.     RENDER = Win32API.new("MGC_Mode7_Ace_Rot_1_9", "renderMode7", "l", "l")
  350.     #--------------------------------------------------------------------------
  351.     # * Initialisation
  352.     #--------------------------------------------------------------------------
  353.     def initialize(viewport)
  354.       @viewport = viewport
  355.       self.bitmaps = [0, 0, 0, 0, 0, 0, 0, 0, 0]
  356.       @map_data = 0
  357.       @flags = 0
  358.       self.flash_data = nil
  359.       @cx = Graphics.width >> 1
  360.       @cy = Graphics.height >> 1
  361.       @sprite_render = Sprite.new(viewport)
  362.       @render = Bitmap.new(Graphics.width, Graphics.height)
  363.       @sprite_render.bitmap = @render
  364.       @sprite_render.x = 0
  365.       @sprite_render.y = 0
  366.       @sprite_render.z = 0
  367.       @zoom = 1.0
  368.       @view_limit = MODE7_VIEW_LIMIT << 5
  369.       m7_data = Table.new(6, Graphics.height) # [1.7]
  370.       @parameters = [@render, 0, map_data, bitmaps,
  371.       Cache.picture('autotiles_data'), Cache.picture('autotiles_data_small'),
  372.       Cache.picture('autotiles_data_xsmall'), 0, 0, 0, 0, 0, 0, 0, 4096,
  373.       100, $game_map.loop_horizontal?, $game_map.loop_vertical?, MODE7_SCAN_STEP,
  374.       0, m7_data, 2048, 0, MGC.mode7_data[5], MGC.mode7_data[0], 0, 0, 0, 0, 0,
  375.       0, 0, 0, 0, 0, 0]
  376.       @parameters << $game_map.tileset.flags # 36 [1.7]
  377.       @parameters << MGC::MODE7_ALWAYS_DRAW_TILES_ON_MAP # 37 [1.7]
  378.       @parameters << MGC::MODE7_TERRAIN_TAGS # 38 [1.7]
  379.       @parameters << 0 # 39 [1.9]
  380.       refresh_fading
  381.       MGC.mode7_data[9] = m7_data
  382.       self.alpha = 0
  383.       self.visible = true
  384.       self.zoom = 1.0
  385.       self.ox = 0
  386.       self.oy = 0
  387.       self.opacity = 255
  388.       self.blend_type = 0
  389.       self.color = Color.new
  390.       self.tone = Tone.new
  391.       self.wave_amp = 0
  392.       self.wave_length = 180
  393.       self.wave_speed = 360
  394.       self.wave_phase = 0.0
  395.       @initialization = true
  396.       @param_tiles = [Bitmap.new(32, 32), bitmaps,
  397.       Cache.picture('autotiles_data'),
  398.       Cache.picture('autotiles_data_small'),
  399.       Cache.picture('autotiles_data_xsmall'), 0, [0, 0, 0]] # [1.7]
  400.       @map_id = $game_map.map_id # [1.9]
  401.     end
  402.     #--------------------------------------------------------------------------
  403.     # * Refresh Fading
  404.     #--------------------------------------------------------------------------
  405.     def refresh_fading
  406.       fading_dist = $game_map.get_default_fading_distance << 5
  407.       fading_begin = Graphics.height + @view_limit - fading_dist
  408.       @parameters[30] = fading_begin
  409.       @parameters[31] = fading_dist
  410.       @parameters[32] = $game_map.get_default_fading_tone.red.to_i
  411.       @parameters[33] = $game_map.get_default_fading_tone.green.to_i
  412.       @parameters[34] = $game_map.get_default_fading_tone.blue.to_i
  413.       @parameters[35] = $game_map.get_default_fading_opacity
  414.     end
  415.     #--------------------------------------------------------------------------
  416.     # * Refresh all the parameters dependent on the angle of slant
  417.     #--------------------------------------------------------------------------
  418.     def refresh_alpha
  419.       # angle of slant
  420.       alpha_rad = (Math::PI * alpha) / 180
  421.       cos_alpha_real = Math.cos(alpha_rad)
  422.       sin_alpha_real = Math.sin(alpha_rad)
  423.       cos_alpha = (2048 * cos_alpha_real).to_i
  424.       sin_alpha = (2048 * sin_alpha_real).to_i
  425.       distance_h = MGC.mode7_data[5]
  426.       pivot = MGC.mode7_data[0]
  427.       # h0,  z0 : intermediate values used to calculate the slope
  428.       h0 = (-distance_h * pivot * cos_alpha) / ((distance_h << 11) +
  429.       pivot * sin_alpha) + pivot
  430.       z0 = (distance_h << 11).to_f / ((distance_h << 11) + pivot * sin_alpha)
  431.       # slope
  432.       slope_value = (1.0 - z0) / (pivot - h0)
  433.       slope_value_map = (131072 * slope_value).to_i
  434.       corrective_value = 1.0 - pivot * slope_value
  435.       corrective_value_map = (131072 * corrective_value).to_i
  436.       last_line = ((-pivot - @view_limit) * zoom).to_i
  437.       height_limit = (distance_h * last_line * cos_alpha) /
  438.       ((distance_h << 11) - last_line * sin_alpha) + pivot
  439.       height_limit = [height_limit.to_i, 0].max
  440.       parameters[21] = cos_alpha
  441.       parameters[22] = sin_alpha
  442.       parameters[25] = slope_value_map
  443.       parameters[26] = corrective_value_map
  444.       parameters[27] = height_limit
  445.       parameters[29] = MODE7_SCAN_STEP
  446.       @need_refresh = true
  447.       MGC.mode7_data[3] = cos_alpha_real
  448.       MGC.mode7_data[4] = sin_alpha_real
  449.       MGC.mode7_data[6] = slope_value
  450.       MGC.mode7_data[7] = corrective_value
  451.       MGC.mode7_data[8] = height_limit     
  452.     end
  453.     #--------------------------------------------------------------------------
  454.     # * Setter pour l'attribut map_data
  455.     #--------------------------------------------------------------------------
  456.     def map_data=(new_map_data)
  457.       @map_data = new_map_data
  458.       parameters[2] = @map_data
  459.     end
  460.     #--------------------------------------------------------------------------
  461.     # * Charge le panorama en mode 7 [1.9]
  462.     #--------------------------------------------------------------------------
  463.     def parallax=(new_parallax)
  464.       if new_parallax
  465.         parameters[39] = new_parallax
  466.       else
  467.         parameters[39] = 0
  468.       end
  469.     end
  470.     #--------------------------------------------------------------------------
  471.     # * Setter pour l'attribut flags
  472.     #--------------------------------------------------------------------------
  473.     def flags=(new_flags)
  474.       @flags = new_flags
  475.       parameters[7] = @flags
  476.     end
  477.     #--------------------------------------------------------------------------
  478.     # * Setter pour l'attribut zoom
  479.     #--------------------------------------------------------------------------
  480.     def zoom=(new_zoom)
  481.       unless zoom == new_zoom
  482.         @zoom = new_zoom
  483.         parameters[14] = (4096.0 / new_zoom).to_i
  484.         MGC.mode7_data[2] = new_zoom
  485.         vox = @ox
  486.         @ox = nil
  487.         self.ox = vox
  488.         voy = @oy
  489.         @oy = nil
  490.         self.oy = voy
  491.         @need_refresh = true
  492.         parameters[29] = MODE7_SCAN_STEP
  493.         @need_refresh = true
  494.         last_line = ((-parameters[24] - @view_limit) * zoom).to_i
  495.         height_limit = (parameters[23] * last_line * parameters[21]) /
  496.         ((parameters[23] << 11) - last_line * parameters[22]) + parameters[24]
  497.         parameters[27] = [height_limit.to_i, 0].max
  498.         MGC.mode7_data[8] = parameters[27]
  499.       end
  500.     end
  501.     #--------------------------------------------------------------------------
  502.     # * Setter pour l'attribut alpha
  503.     #--------------------------------------------------------------------------
  504.     def alpha=(new_alpha)
  505.       unless new_alpha == alpha
  506.         @alpha = new_alpha
  507.         refresh_alpha
  508.       end
  509.     end
  510.     #--------------------------------------------------------------------------
  511.     # * Setter pour l'attribut shadow_opacity
  512.     #--------------------------------------------------------------------------
  513.     def shadow_opacity=(value)
  514.       @parameters[15] = [[value, 0].max, 255].min
  515.     end
  516.     #--------------------------------------------------------------------------
  517.     # * Setter pour l'attribut visible
  518.     #--------------------------------------------------------------------------
  519.     def visible=(flag)
  520.       @visible = flag
  521.       @sprite_render.visible = flag
  522.     end
  523.     #--------------------------------------------------------------------------
  524.     # * Setter pour l'attribut ox
  525.     #--------------------------------------------------------------------------
  526.     def ox=(new_ox)
  527.       new_ox = new_ox.to_i
  528.       unless new_ox == @ox
  529.         @ox = new_ox
  530.         @need_refresh = true
  531.         parameters[8] = @ox
  532.         parameters[29] = MODE7_SCAN_STEP
  533.       end
  534.     end
  535.     #--------------------------------------------------------------------------
  536.     # * Setter pour l'attribut oy
  537.     #--------------------------------------------------------------------------
  538.     def oy=(new_oy)
  539.       new_oy = new_oy.to_i
  540.       unless new_oy == @oy
  541.         @oy = new_oy
  542.         @need_refresh = true
  543.         parameters[9] = @oy
  544.         parameters[29] = MODE7_SCAN_STEP
  545.       end
  546.     end
  547.     #--------------------------------------------------------------------------
  548.     # * Setter pour l'attribut opacity
  549.     #--------------------------------------------------------------------------
  550.     def opacity=(new_opacity)
  551.       @opacity = new_opacity
  552.       @sprite_render.opacity = new_opacity
  553.     end
  554.     #--------------------------------------------------------------------------
  555.     # * Setter pour l'attribut blend_type
  556.     #--------------------------------------------------------------------------
  557.     def blend_type=(new_blend_type)
  558.       @blend_type = new_blend_type
  559.       @sprite_render.blend_type = new_blend_type
  560.     end
  561.     #--------------------------------------------------------------------------
  562.     # * Setter pour l'attribut color
  563.     #--------------------------------------------------------------------------
  564.     def color=(new_color)
  565.       @color = new_color
  566.       @sprite_render.color = new_color
  567.     end
  568.     #--------------------------------------------------------------------------
  569.     # * Setter pour l'attribut tone
  570.     #--------------------------------------------------------------------------
  571.     def tone=(new_tone)
  572.       @tone = new_tone
  573.       @sprite_render.tone = new_tone
  574.     end
  575.     #--------------------------------------------------------------------------
  576.     # * Setter pour l'attribut wave_amp
  577.     #--------------------------------------------------------------------------
  578.     def wave_amp=(new_wave_amp)
  579.       @wave_amp = new_wave_amp
  580.       @sprite_render.wave_amp = new_wave_amp
  581.     end
  582.     #--------------------------------------------------------------------------
  583.     # * Setter pour l'attribut wave_length
  584.     #--------------------------------------------------------------------------
  585.     def wave_length=(new_wave_length)
  586.       @wave_length = new_wave_length
  587.       @sprite_render.wave_length = new_wave_length
  588.     end
  589.     #--------------------------------------------------------------------------
  590.     # * Setter pour l'attribut wave_speed
  591.     #--------------------------------------------------------------------------
  592.     def wave_speed=(new_wave_speed)
  593.       @wave_speed = new_wave_speed
  594.       @sprite_render.wave_speed = new_wave_speed
  595.     end
  596.     #--------------------------------------------------------------------------
  597.     # * Setter pour l'attribut wave_phase
  598.     #--------------------------------------------------------------------------
  599.     def wave_phase=(new_wave_phase)
  600.       @wave_phase = new_wave_phase
  601.       @sprite_render.wave_phase = new_wave_phase
  602.     end
  603.     #--------------------------------------------------------------------------
  604.     # * Libération de l'instance
  605.     #--------------------------------------------------------------------------
  606.     def dispose
  607.       @render.dispose
  608.       @sprite_render.dispose
  609.       clear_vertical_tiles # [1.7]
  610.       @param_tiles[0].dispose
  611.     end
  612.     #--------------------------------------------------------------------------
  613.     # * Suppression des tiles verticaux [1.7]
  614.     #--------------------------------------------------------------------------
  615.     def clear_vertical_tiles
  616.       if @vertical_tiles
  617.         @vertical_tiles.each {|sprite| sprite.dispose}
  618.         @vertical_tiles.clear
  619.       end
  620.     end
  621.     #--------------------------------------------------------------------------
  622.     # * Retourne true si l'instance a été libérée
  623.     #--------------------------------------------------------------------------
  624.     def disposed?
  625.       return @render.disposed?
  626.     end
  627.     #--------------------------------------------------------------------------
  628.     # * Mise à jour, appelée normalement à chaque frame
  629.     #--------------------------------------------------------------------------
  630.     def update
  631.       if @visible
  632.         if MGC.is_changing_map?
  633.           refresh_fading
  634.           MGC.end_change_map
  635.         end
  636.         if parameters[18] != MODE7_SCAN_STEP
  637.           parameters[18] = MODE7_SCAN_STEP
  638.           parameters[19] = 0
  639.           parameters[29] = 0
  640.           @need_refresh = true
  641.         end
  642.         self.alpha = MGC.mode7_angle
  643.         self.zoom = MGC.mode7_zoom
  644.         if Graphics.frame_count & 31 == 0
  645.           parameters[10] += 1
  646.           parameters[10] %= 3
  647.           parameters[29] = MODE7_SCAN_STEP
  648.           unless @need_refresh
  649.             @need_refresh_anim = true
  650.           end
  651.         end
  652.         if parameters[29] > 0 && !@need_refresh && !@need_refresh_anim
  653.           @need_refresh = true
  654.         end
  655.         begin
  656.           if @need_refresh
  657.             parameters[19] += 1
  658.             if parameters[19] == parameters[18]
  659.               parameters[19] = 0
  660.             end
  661.             parameters[11] = 0
  662.             RENDER.call(parameters.__id__)
  663.             parameters[29] -= 1
  664.             if parameters[29] == 0
  665.               @need_refresh = false
  666.             end
  667.           elsif @need_refresh_anim
  668.             parameters[19] += 1
  669.             if parameters[19] == parameters[18]
  670.               parameters[19] = 0
  671.             end
  672.             parameters[11] = 1
  673.             RENDER.call(parameters.__id__)
  674.             parameters[29] -= 1
  675.             if parameters[29] == 0
  676.               @need_refresh_anim = false
  677.             end
  678.           end
  679.           if @initialization && parameters[29] == 0
  680.             @initialization = false
  681.           end
  682.         end while @initialization
  683.         @sprite_render.update
  684.         @vertical_tiles.each {|sprite| sprite.update} # [1.7]
  685.       end
  686.     end
  687.     #--------------------------------------------------------------------------
  688.     # * Flash des couches de la tilemap
  689.     #--------------------------------------------------------------------------
  690.     def flash(color, duration)
  691.       @sprite_render.flash(color, duration)
  692.     end
  693.     #--------------------------------------------------------------------------
  694.     # * Create vertical tiles [1.7]
  695.     #--------------------------------------------------------------------------
  696.     def create_vertical_tiles
  697.       unless @vertical_tiles
  698.         @vertical_tiles = []
  699.       end
  700.       clear_vertical_tiles
  701.       @vt_checked_tiles = Table.new($game_map.width, $game_map.height,
  702.       MGC::MODE7_TERRAIN_TAGS.size)
  703.       (0...$game_map.height).each {|iy|
  704.         (0...$game_map.width).each {|ix|
  705.           (0...3).each {|il|
  706.             terrain_tag = $game_map.terrain_tag_for_layer(ix, iy, il)
  707.             if terrain_tag > 0 && MGC::MODE7_TERRAIN_TAGS.include?(terrain_tag)
  708.               tag_index = MGC::MODE7_TERRAIN_TAGS.index(terrain_tag)
  709.               unless @vt_checked_tiles[ix, iy, tag_index] == 1
  710.                 @vt_found_tiles = []
  711.                 @vt_x_min = ix
  712.                 @vt_x_max = ix
  713.                 @vt_y_min = iy
  714.                 @vt_y_max = iy
  715.                 find_linked_tiles(ix, iy, terrain_tag, tag_index)
  716.                 v_tile = MGC::Vertical_Tile.new(self, @viewport)
  717.                 v_tile.x = 1 + @vt_x_max + @vt_x_min << 5 >> 1
  718.                 v_tile.y = 1 + @vt_y_max << 5
  719.                 v_tile.refresh_tile_data(@vt_found_tiles,
  720.                 @vt_x_min, @vt_x_max, @vt_y_min, @vt_y_max)
  721.                 @vertical_tiles << v_tile
  722.                 break
  723.               end
  724.             end
  725.           }
  726.         }
  727.       }
  728.       @vt_checked_tiles = nil
  729.     end
  730.     #--------------------------------------------------------------------------
  731.     # * Find linked tiles [1.7]
  732.     # param x : Integer
  733.     # param y : Integer
  734.     # param terrain_tag : Integer
  735.     # param tag_index : Integer
  736.     #--------------------------------------------------------------------------
  737.     def find_linked_tiles(x, y, terrain_tag, tag_index)
  738.       unless @vt_checked_tiles[x, y, tag_index] == 1
  739.         @vt_checked_tiles[x, y, tag_index] = 1
  740.         found = false
  741.         (0...3).each {|il|
  742.           if $game_map.terrain_tag_for_layer(x, y, il) == terrain_tag
  743.             unless found
  744.               found_tile = [x, y, [false, false, false]]
  745.               @vt_found_tiles << found_tile
  746.               found = true
  747.             end
  748.             found_tile[2][il] = true
  749.           end
  750.         }
  751.         if found
  752.           if x > @vt_x_max
  753.             @vt_x_max = x
  754.           end
  755.           if x < @vt_x_min
  756.             @vt_x_min = x
  757.           end
  758.           if y > @vt_y_max
  759.             @vt_y_max = y
  760.           end
  761.           if y < @vt_y_min
  762.             @vt_y_min = y
  763.           end
  764.           if MGC::MODE7_VERTICAL_TILES_TYPE & 1 == 1
  765.             if y < $game_map.height - 1
  766.               find_linked_tiles(x, y + 1, terrain_tag, tag_index)
  767.             end
  768.           end
  769.           if MGC::MODE7_VERTICAL_TILES_TYPE & 2 == 2
  770.             if x < $game_map.width - 1
  771.               find_linked_tiles(x + 1, y, terrain_tag, tag_index)
  772.             end
  773.           end
  774.           if MGC::MODE7_VERTICAL_TILES_TYPE == 3
  775.             if x > 0
  776.               find_linked_tiles(x - 1, y, terrain_tag, tag_index)
  777.             end
  778.             if y > 0
  779.               find_linked_tiles(x, y - 1, terrain_tag, tag_index)
  780.             end
  781.           end
  782.         end
  783.       end
  784.     end
  785.   end
  786. end
  787.  
  788. #==============================================================================
  789. # ** Game_System
  790. #==============================================================================
  791. class Game_System
  792.   #--------------------------------------------------------------------------
  793.   # * Attributs
  794.   #--------------------------------------------------------------------------
  795.   attr_accessor :mode7_zoom, :mode7_angle, :mode7_active
  796. end
  797.  
  798. #==============================================================================
  799. # ** Game_Map
  800. #==============================================================================
  801. class Game_Map
  802.   attr_accessor :start_mode7, :end_mode7
  803.   #--------------------------------------------------------------------------
  804.   # * Aliased methods
  805.   #--------------------------------------------------------------------------
  806.   unless @already_aliased_mgc_m7a
  807.     alias setup_mgc_m7a setup
  808.     alias set_display_pos_mgc_m7a set_display_pos
  809.     alias scroll_down_mgc_m7a scroll_down
  810.     alias scroll_left_mgc_m7a scroll_left
  811.     alias scroll_right_mgc_m7a scroll_right
  812.     alias scroll_up_mgc_m7a scroll_up
  813.     @already_aliased_mgc_m7a = true
  814.   end
  815.   #--------------------------------------------------------------------------
  816.   # * Setup
  817.   #--------------------------------------------------------------------------
  818.   def setup(map_id)
  819.     setup_mgc_m7a(map_id)
  820.     @map = load_data(sprintf("Data/Map%03d.rvdata2", map_id)) # [1.9]
  821.     if is_mode7?
  822.       if MGC.mode7_active
  823.         MGC.start_change_map
  824.       end
  825.       self.start_mode7 = true
  826.     else
  827.       self.end_mode7 = true
  828.     end
  829.   end
  830.   #--------------------------------------------------------------------------
  831.   # * Check if the map is configured for mode 7
  832.   #--------------------------------------------------------------------------
  833.   def is_mode7?
  834.     return MGC::MODE7_MAPS_ID.include?(@map_id) ||
  835.     $data_mapinfos[@map_id].full_name[/\[M7\]/]
  836.   end
  837.   #--------------------------------------------------------------------------
  838.   # * Get default mode7 angle
  839.   #--------------------------------------------------------------------------
  840.   def get_default_mode7_angle
  841.     if $data_mapinfos[@map_id].full_name[/\[A(\d+)\]/]
  842.       return [[$1.to_i, 0].max, 89].min
  843.     else
  844.       return MGC::MODE7_DEFAULT_ANGLE
  845.     end
  846.   end
  847.   #--------------------------------------------------------------------------
  848.   # * Get default mode7 zoom
  849.   #--------------------------------------------------------------------------
  850.   def get_default_mode7_zoom
  851.     if $data_mapinfos[@map_id].full_name[/\[Z(\d+(?:\.\d+)*)\]/]
  852.       return [[$1.to_f, 0.125].max, 8.0].min
  853.     else
  854.       return MGC::MODE7_DEFAULT_ZOOM
  855.     end
  856.   end
  857.   #--------------------------------------------------------------------------
  858.   # * Get default fading distance
  859.   #--------------------------------------------------------------------------
  860.   def get_default_fading_distance
  861.     if $data_mapinfos[@map_id].full_name[/\[FD(\d{1,3})\]/]
  862.       return [$1.to_i, 0].max
  863.     else
  864.       return MGC::MODE7_FADING_DISTANCE
  865.     end
  866.   end
  867.   #--------------------------------------------------------------------------
  868.   # * Get default fading opacity
  869.   #--------------------------------------------------------------------------
  870.   def get_default_fading_opacity
  871.     if $data_mapinfos[@map_id].full_name[/\[FO(\d{1,3})\]/]
  872.       return [[$1.to_i, 0].max, 255].min
  873.     else
  874.       return MGC::MODE7_FADING_OPACITY
  875.     end
  876.   end
  877.   #--------------------------------------------------------------------------
  878.   # * Get default fading tone
  879.   #--------------------------------------------------------------------------
  880.   def get_default_fading_tone
  881.     if $data_mapinfos[@map_id].full_name[/\[FT(\-?\d{1,3}),(\-?\d{1,3}),(\-?\d{1,3})\]/]
  882.       red = [[$1.to_i, -255].max, 255].min
  883.       green = [[$2.to_i, -255].max, 255].min
  884.       blue = [[$3.to_i, -255].max, 255].min
  885.       return Tone.new(red, green, blue)
  886.     else
  887.       return MGC::MODE7_FADING_TONE
  888.     end
  889.   end
  890.   #--------------------------------------------------------------------------
  891.   # * Check if the map is parallaxed [1.9]
  892.   #--------------------------------------------------------------------------
  893.   def is_parallaxed?
  894.     return MGC::MODE7_PARALLAXED_MAPS_ID.include?(@map_id) ||
  895.     $data_mapinfos[@map_id].full_name[/\[P\]/]
  896.   end
  897.   #--------------------------------------------------------------------------
  898.   # * Check if the parallaxed map has a panorama in mode 7 [1.9]
  899.   #--------------------------------------------------------------------------
  900.   def has_additionnal_panorama?
  901.     return @map.note[/\[m7a_pano:\w+\]/]
  902.   end
  903.   #--------------------------------------------------------------------------
  904.   # * Return the panorama in mode 7 if the map is parallaxed [1.9]
  905.   #--------------------------------------------------------------------------
  906.   def set_additional_panorama
  907.     if @map.note[/\[m7a_pano:(\w+)\]/]
  908.       @parallax_name = $1
  909.     end
  910.   end
  911.   #--------------------------------------------------------------------------
  912.   # * Set Display Position
  913.   #--------------------------------------------------------------------------
  914.   def set_display_pos(x, y)
  915.     if MGC.mode7_active
  916.       if loop_horizontal?
  917.         @display_x = (x + width) % width
  918.       else
  919.         if MGC.mode7_zoom < 1.0 && width * MGC.mode7_zoom < screen_tile_x
  920.           @display_x = (width - screen_tile_x) / 2
  921.         else
  922.           x_min = screen_tile_x * (1.0 / MGC.mode7_zoom - 1.0) / 2
  923.           x_max = width + screen_tile_x * ((1.0 - 1.0 / MGC.mode7_zoom) / 2 - 1)
  924.           x = [x_min, [x, x_max].min].max
  925.           @display_x = x
  926.         end
  927.       end
  928.       if loop_vertical?
  929.         @display_y = (y + height) % height
  930.       else
  931.         if MGC.mode7_zoom < 1.0 && height * MGC.mode7_zoom < screen_tile_y
  932.           @display_y = (height - screen_tile_y) * MGC.mode7_data[1]
  933.         else
  934.           y_min = screen_tile_y * (1.0 / MGC.mode7_zoom - 1.0) * MGC.mode7_data[1]
  935.           y_max = height + screen_tile_y *
  936.           ((1.0 - 1.0 / MGC.mode7_zoom) * (1 - MGC.mode7_data[1]) - 1)
  937.           y = [y_min, [y, y_max].min].max
  938.           @display_y = y
  939.         end
  940.       end
  941.       @parallax_x = x
  942.       @parallax_y = y
  943.     else
  944.       set_display_pos_mgc_m7a(x, y)
  945.     end
  946.   end
  947.   #--------------------------------------------------------------------------
  948.   # * Scroll Down
  949.   #--------------------------------------------------------------------------
  950.   def scroll_down(distance)
  951.     if MGC.mode7_active
  952.       if loop_vertical?
  953.         @display_y += distance
  954.         @display_y %= @map.height
  955.         @parallax_y += distance if @parallax_loop_y
  956.       else
  957.         last_y = @display_y
  958.         if MGC.mode7_zoom < 1.0 && height * MGC.mode7_zoom < screen_tile_y
  959.           @display_y = (height - screen_tile_y) * MGC.mode7_data[1]
  960.         else
  961.           max = height + screen_tile_y *
  962.           ((1.0 - 1.0 / MGC.mode7_zoom) * (1 - MGC.mode7_data[1]) - 1)
  963.           @display_y = [@display_y + distance, max].min
  964.         end
  965.         @parallax_y += @display_y - last_y
  966.       end
  967.     else
  968.       scroll_down_mgc_m7a(distance)
  969.     end
  970.   end
  971.   #--------------------------------------------------------------------------
  972.   # * Scroll Left
  973.   #--------------------------------------------------------------------------
  974.   def scroll_left(distance)
  975.     if MGC.mode7_active
  976.       if loop_horizontal?
  977.         @display_x += @map.width - distance
  978.         @display_x %= @map.width
  979.         @parallax_x -= distance if @parallax_loop_x
  980.       else
  981.         last_x = @display_x
  982.         if MGC.mode7_zoom < 1.0 && width * MGC.mode7_zoom < screen_tile_x
  983.           @display_x = (width - screen_tile_x) / 2
  984.         else
  985.           min = screen_tile_x * (1.0 / MGC.mode7_zoom - 1.0) / 2
  986.           @display_x = [@display_x - distance, min].max
  987.         end
  988.         @parallax_x += @display_x - last_x
  989.       end
  990.     else
  991.       scroll_left_mgc_m7a(distance)
  992.     end
  993.   end
  994.   #--------------------------------------------------------------------------
  995.   # * Scroll Right
  996.   #--------------------------------------------------------------------------
  997.   def scroll_right(distance)
  998.     if MGC.mode7_active
  999.       if loop_horizontal?
  1000.         @display_x += distance
  1001.         @display_x %= @map.width
  1002.         @parallax_x += distance if @parallax_loop_x
  1003.       else
  1004.         last_x = @display_x
  1005.         if MGC.mode7_zoom < 1.0 && width * MGC.mode7_zoom < screen_tile_x
  1006.           @display_x = (width - screen_tile_x) / 2
  1007.         else
  1008.           max = width + screen_tile_x * ((1.0 - 1.0 / MGC.mode7_zoom) / 2 - 1)
  1009.           @display_x = [@display_x + distance, max].min
  1010.         end
  1011.         @parallax_x += @display_x - last_x
  1012.       end
  1013.     else
  1014.       scroll_right_mgc_m7a(distance)
  1015.     end
  1016.   end
  1017.   #--------------------------------------------------------------------------
  1018.   # * Scroll Up
  1019.   #--------------------------------------------------------------------------
  1020.   def scroll_up(distance)
  1021.     if MGC.mode7_active
  1022.       if loop_vertical?
  1023.         @display_y += @map.height - distance
  1024.         @display_y %= @map.height
  1025.         @parallax_y -= distance if @parallax_loop_y
  1026.       else
  1027.         last_y = @display_y
  1028.         if MGC.mode7_zoom < 1.0 && height * MGC.mode7_zoom < screen_tile_y
  1029.           @display_y = (height - screen_tile_y) * MGC.mode7_data[1]
  1030.         else
  1031.           min = screen_tile_y * (1.0 / MGC.mode7_zoom - 1.0) * MGC.mode7_data[1]
  1032.           @display_y = [@display_y - distance, min].max
  1033.         end
  1034.         @parallax_y += @display_y - last_y
  1035.       end
  1036.     else
  1037.       scroll_up_mgc_m7a(distance)
  1038.     end
  1039.   end
  1040.   #--------------------------------------------------------------------------
  1041.   # * Get Terrain Tag for a layer [1.7]
  1042.   #--------------------------------------------------------------------------
  1043.   def terrain_tag_for_layer(x, y, layer)
  1044.     return 0 unless valid?(x, y)
  1045.     return tileset.flags[tile_id(x, y, layer)] >> 12
  1046.   end
  1047. end
  1048.  
  1049. #==============================================================================
  1050. # ** Game_CharacterBase
  1051. #==============================================================================
  1052. class Game_CharacterBase
  1053.   #--------------------------------------------------------------------------
  1054.   # * Public Instance Variables
  1055.   #--------------------------------------------------------------------------
  1056.   attr_accessor :sprite
  1057. end
  1058.  
  1059. #==============================================================================
  1060. # ** Serialisation
  1061. #==============================================================================
  1062. [:Sprite, :Viewport, :Bitmap, :Font].each {|classname|
  1063.   eval(
  1064.   "class #{classname}
  1065.     def marshal_dump
  1066.       return []
  1067.     end
  1068.     def marshal_load(array)
  1069.     end
  1070.   end")
  1071. }
  1072.  
  1073. #==============================================================================
  1074. # ** Sprite
  1075. #==============================================================================
  1076. class Sprite
  1077.   #--------------------------------------------------------------------------
  1078.   # * Aliased methods
  1079.   #--------------------------------------------------------------------------
  1080.   unless @already_aliased_mgc_m7a
  1081.     alias initialize_mgc_m7a initialize
  1082.     alias zoom_x_mgc_m7a= zoom_x=
  1083.     alias zoom_y_mgc_m7a= zoom_y=
  1084.     alias zoom_x_mgc_m7a zoom_x
  1085.     alias zoom_y_mgc_m7a zoom_y
  1086.     @already_aliased_mgc_m7a = true
  1087.   end
  1088.   #--------------------------------------------------------------------------
  1089.   # * Initialisation
  1090.   #--------------------------------------------------------------------------
  1091.   def initialize(*args)
  1092.     initialize_mgc_m7a(*args)
  1093.     @phase_mode7 = false
  1094.     self.zoom_x = 1.0
  1095.     self.zoom_y = 1.0
  1096.   end
  1097.   #--------------------------------------------------------------------------
  1098.   # * Setter pour l'attribut zoom_x
  1099.   #--------------------------------------------------------------------------
  1100.   def zoom_x=(new_zoom_x)
  1101.     unless @phase_mode7
  1102.       @base_zoom_x = new_zoom_x
  1103.     end
  1104.     self.zoom_x_mgc_m7a = new_zoom_x
  1105.   end
  1106.   #--------------------------------------------------------------------------
  1107.   # * Setter pour l'attribut zoom_y
  1108.   #--------------------------------------------------------------------------
  1109.   def zoom_y=(new_zoom_y)
  1110.     unless @phase_mode7
  1111.       @base_zoom_y = new_zoom_y
  1112.     end
  1113.     self.zoom_y_mgc_m7a = new_zoom_y
  1114.   end
  1115.   #--------------------------------------------------------------------------
  1116.   # * Getter pour l'attribut zoom_x
  1117.   #--------------------------------------------------------------------------
  1118.   def zoom_x
  1119.     return @base_zoom_x
  1120.   end
  1121.   #--------------------------------------------------------------------------
  1122.   # * Getter pour l'attribut zoom_y
  1123.   #--------------------------------------------------------------------------
  1124.   def zoom_y
  1125.     return @base_zoom_y
  1126.   end
  1127.   #--------------------------------------------------------------------------
  1128.   # * Valeur réelle du zoom_x en prenant en compte le zoom de la carte
  1129.   #--------------------------------------------------------------------------
  1130.   def zoom_x_real
  1131.     return zoom_x_mgc_m7a
  1132.   end
  1133.   #--------------------------------------------------------------------------
  1134.   # * Valeur réelle du zoom_y en prenant en compte le zoom de la carte
  1135.   #--------------------------------------------------------------------------
  1136.   def zoom_y_real
  1137.     return zoom_y_mgc_m7a
  1138.   end
  1139. end
  1140.  
  1141. #==============================================================================
  1142. # ** Sprite_Base
  1143. #==============================================================================
  1144. class Sprite_Base
  1145.   #--------------------------------------------------------------------------
  1146.   # * Aliased methods
  1147.   #--------------------------------------------------------------------------
  1148.   unless @already_aliased_mgc_m7a
  1149.     alias animation_set_sprites_mgc_m7a_aprite_base animation_set_sprites
  1150.     @already_aliased_mgc_m7a = true
  1151.   end
  1152.   #--------------------------------------------------------------------------
  1153.   # * Set Animation Sprite
  1154.   #     frame : Frame data (RPG::Animation::Frame)
  1155.   #--------------------------------------------------------------------------
  1156.   def animation_set_sprites(frame)
  1157.     if MGC.mode7_active
  1158.       cell_data = frame.cell_data
  1159.       @ani_sprites.each_with_index do |sprite, i|
  1160.         next unless sprite
  1161.         pattern = cell_data[i, 0]
  1162.         if !pattern || pattern < 0
  1163.           sprite.visible = false
  1164.           next
  1165.         end
  1166.         sprite.bitmap = pattern < 100 ? @ani_bitmap1 : @ani_bitmap2
  1167.         sprite.visible = true
  1168.         sprite.src_rect.set(pattern % 5 * 192,
  1169.           pattern % 100 / 5 * 192, 192, 192)
  1170.         if @ani_mirror
  1171.           sprite.x = @ani_ox - cell_data[i, 1] * zoom_y_real
  1172.           sprite.y = @ani_oy + cell_data[i, 2] * zoom_y_real
  1173.           sprite.angle = (360 - cell_data[i, 4])
  1174.           sprite.mirror = (cell_data[i, 5] == 0)
  1175.         else
  1176.           sprite.x = @ani_ox + cell_data[i, 1] * zoom_y_real
  1177.           sprite.y = @ani_oy + cell_data[i, 2] * zoom_y_real
  1178.           sprite.angle = cell_data[i, 4]
  1179.           sprite.mirror = (cell_data[i, 5] == 1)
  1180.         end
  1181.         sprite.z = self.z + 300 + i
  1182.         sprite.ox = 96
  1183.         sprite.oy = 96
  1184.         sprite.zoom_x = cell_data[i, 3] * zoom_y_real / 100.0
  1185.         sprite.zoom_y = cell_data[i, 3] * zoom_y_real / 100.0
  1186.         sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
  1187.         sprite.blend_type = cell_data[i, 7]
  1188.       end
  1189.     else
  1190.       animation_set_sprites_mgc_m7a_aprite_base(frame)
  1191.     end
  1192.   end
  1193. end
  1194.  
  1195. #==============================================================================
  1196. # ** Sprite_Character
  1197. #==============================================================================
  1198. class Sprite_Character < Sprite_Base
  1199.   #--------------------------------------------------------------------------
  1200.   # * Aliased methods
  1201.   #--------------------------------------------------------------------------
  1202.   unless @already_aliased_mgc_m7a
  1203.     alias initialize_mgc_m7a_aprite_character initialize
  1204.     alias update_position_mgc_m7a_aprite_character update_position
  1205.     alias update_other_mgc_m7a_aprite_character update_other
  1206.     alias update_balloon_mgc_m7a_aprite_character update_balloon
  1207.     @already_aliased_mgc_m7a = true
  1208.   end
  1209.   #--------------------------------------------------------------------------
  1210.   # * Object Initialization
  1211.   #     character : Game_Character
  1212.   #--------------------------------------------------------------------------
  1213.   def initialize(viewport, character = nil)
  1214.     initialize_mgc_m7a_aprite_character(viewport, character)
  1215.     character.sprite = self
  1216.   end
  1217.   #--------------------------------------------------------------------------
  1218.   # * Update Position
  1219.   #--------------------------------------------------------------------------
  1220.   def update_position
  1221.     if MGC.mode7_active
  1222.       old_x = x
  1223.       old_y = y
  1224.       update_mode7
  1225.       @in_mode_7 = true # [1.5]
  1226.       move_animation(x - old_x, y - old_y)
  1227.     else
  1228.       if @in_mode_7 # [1.5]
  1229.         self.zoom_x = zoom_x
  1230.         self.zoom_y = zoom_y
  1231.         @in_mode_7 = false
  1232.       end
  1233.       update_position_mgc_m7a_aprite_character
  1234.     end
  1235.   end
  1236.   #--------------------------------------------------------------------------
  1237.   # * Update Other
  1238.   #--------------------------------------------------------------------------
  1239.   def update_other
  1240.     update_other_mgc_m7a_aprite_character
  1241.     if MGC.mode7_active && visible
  1242.       if !@force_mode7_invisible &&
  1243.         y >= MGC.mode7_data[8] &&
  1244.         (y - height * zoom_y_real) < Graphics.height
  1245.       then
  1246.         self.visible = true
  1247.         if y < Graphics.height
  1248.           dat = MGC.mode7_data[9]
  1249.           self.opacity += dat[5, y]
  1250.           self.tone.set(dat[2, y], dat[3, y], dat[4, y])
  1251.         end
  1252.       else
  1253.         self.visible = false
  1254.       end
  1255.     end
  1256.   end
  1257.   #--------------------------------------------------------------------------
  1258.   # * Update Position In Mode7
  1259.   #--------------------------------------------------------------------------
  1260.   def update_mode7
  1261.     if @character.tile_id == 0 && character.character_name == "" # [1.8]
  1262.       @force_mode7_invisible = true
  1263.       return
  1264.     end
  1265.     y_screen = character.screen_y +
  1266.     (character.is_a?(Game_Vehicle) ? character.altitude : 0)
  1267.     y_init = MGC.mode7_data[2] * (y_screen - MGC.mode7_data[0])
  1268.     if y_init < - (MGC::MODE7_VIEW_LIMIT << 5) - MGC.mode7_data[0] ||
  1269.       y_init > Graphics.height
  1270.     then
  1271.       @force_mode7_invisible = true
  1272.       return
  1273.     else
  1274.       @force_mode7_invisible = false
  1275.     end
  1276.     x_init = MGC.mode7_data[2] * (character.screen_x - (Graphics.width >> 1))
  1277.     self.y = (MGC.mode7_data[0] + (MGC.mode7_data[5] * y_init *
  1278.     MGC.mode7_data[3]) / (MGC.mode7_data[5] - y_init * MGC.mode7_data[4])).to_i
  1279.     zx = MGC.mode7_data[6] * y + MGC.mode7_data[7]
  1280.     self.x = ((Graphics.width >> 1) + zx * x_init).to_i
  1281.     @phase_mode7 = true
  1282.     self.zoom_x = MGC.mode7_data[2] * zx
  1283.     self.zoom_y = zoom_x_real
  1284.     @phase_mode7 = false
  1285.     self.z = @character.screen_z + (y << 8) # [1.7]
  1286.     if character.is_a?(Game_Vehicle)
  1287.       self.y -= character.altitude * zoom_y_real
  1288.     end
  1289.   end
  1290.   #--------------------------------------------------------------------------
  1291.   # * Update Balloon Icon
  1292.   #--------------------------------------------------------------------------
  1293.   def update_balloon
  1294.     update_balloon_mgc_m7a_aprite_character
  1295.     if MGC.mode7_active && @balloon_duration > 0
  1296.       @balloon_sprite.y = y - height * zoom_y_real
  1297.       @balloon_sprite.zoom_x = zoom_x_real
  1298.       @balloon_sprite.zoom_y = zoom_y_real
  1299.     end
  1300.   end
  1301. end
  1302.  
  1303. #==============================================================================
  1304. # ** Spriteset_Map
  1305. #==============================================================================
  1306. class Spriteset_Map
  1307.   #--------------------------------------------------------------------------
  1308.   # * Aliased methods
  1309.   #--------------------------------------------------------------------------
  1310.   unless @already_aliased_mgc_m7a
  1311.     alias initialize_mgc_m7a initialize
  1312.     alias create_tilemap_mgc_m7a create_tilemap
  1313.     alias update_mgc_m7a update
  1314.     alias update_shadow_mgc_m7a update_shadow
  1315.     alias update_parallax_mgc_m7a update_parallax
  1316.     @already_aliased_mgc_m7a = true
  1317.   end
  1318.   #--------------------------------------------------------------------------
  1319.   # * Object Initialization
  1320.   #--------------------------------------------------------------------------
  1321.   def initialize
  1322.     MGC.spriteset = self
  1323.     initialize_mgc_m7a
  1324.   end
  1325.   #--------------------------------------------------------------------------
  1326.   # * Lance le mode 7
  1327.   #--------------------------------------------------------------------------
  1328.   def start_mode7
  1329.     unless @tilemap_mode7 && @tilemap_mode7.map_id == $game_map.map_id # [1.9]
  1330.       if @tilemap_mode7
  1331.         @tilemap_mode7.dispose unless @tilemap_mode7.disposed?
  1332.         MGC.initialize_mode7(true)
  1333.       else
  1334.         MGC.initialize_mode7
  1335.         @tilemap_classic = @tilemap
  1336.       end
  1337.       @tilemap_mode7 = MGC::Mode7_Map.new(@viewport1)
  1338.       @tilemap_mode7.map_data = $game_map.data
  1339.       if $game_map.is_parallaxed? && $game_map.parallax_name &&
  1340.         $game_map.parallax_name != '' # [1.9]
  1341.       then
  1342.         @tilemap_mode7.parallax = Cache.parallax($game_map.parallax_name)
  1343.         $game_map.set_additional_panorama
  1344.       end
  1345.       @tilemap = @tilemap_mode7
  1346.       load_tileset
  1347.     end
  1348.     @tilemap_mode7.create_vertical_tiles # [1.7]
  1349.     @tilemap_mode7.visible = true
  1350.     @tilemap_classic.visible = false
  1351.     @tilemap = @tilemap_mode7
  1352.     MGC.mode7_active = true
  1353.   end
  1354.   #--------------------------------------------------------------------------
  1355.   # * Met fin au mode 7
  1356.   #--------------------------------------------------------------------------
  1357.   def end_mode7
  1358.     if @tilemap_mode7
  1359.       @tilemap_mode7.visible = false
  1360.       @tilemap_classic.visible = true
  1361.       @tilemap = @tilemap_classic
  1362.       @tilemap_mode7.clear_vertical_tiles # [1.7]
  1363.       @parallax.visible = true # [1.9]
  1364.     end
  1365.     MGC.mode7_active = false
  1366.   end
  1367.   #--------------------------------------------------------------------------
  1368.   # * Create Tilemap
  1369.   #--------------------------------------------------------------------------
  1370.   def create_tilemap
  1371.     create_tilemap_mgc_m7a
  1372.     unless $game_system.mode7_active
  1373.       MGC.mode7_active = false
  1374.     end
  1375.     if $game_map.is_mode7? || $game_system.mode7_active
  1376.       start_mode7
  1377.     end
  1378.   end
  1379.   #--------------------------------------------------------------------------
  1380.   # * Update
  1381.   #--------------------------------------------------------------------------
  1382.   def update
  1383.     MGC.update_mode7
  1384.     if $game_map.start_mode7
  1385.       start_mode7
  1386.       $game_map.start_mode7 = false
  1387.     elsif $game_map.end_mode7
  1388.       end_mode7
  1389.       $game_map.end_mode7 = false
  1390.     end
  1391.     update_mgc_m7a
  1392.   end
  1393.   #--------------------------------------------------------------------------
  1394.   # * Update Parallax [1.9]
  1395.   #--------------------------------------------------------------------------
  1396.   def update_parallax
  1397.     update_parallax_mgc_m7a
  1398.     if MGC.mode7_active && $game_map.is_parallaxed?
  1399.       if $game_map.has_additionnal_panorama?
  1400.         $game_map.set_additional_panorama
  1401.       else
  1402.         @parallax.visible = false
  1403.       end
  1404.     end
  1405.   end
  1406.   #--------------------------------------------------------------------------
  1407.   # * Update Airship Shadow Sprite
  1408.   #--------------------------------------------------------------------------
  1409.   def update_shadow
  1410.     if MGC.mode7_active
  1411.       airship_sprite = $game_map.airship.sprite
  1412.       @shadow_sprite.x = airship_sprite.x
  1413.       @shadow_sprite.y = airship_sprite.y + $game_map.airship.altitude *
  1414.       airship_sprite.zoom_y_real
  1415.       @shadow_sprite.opacity = $game_map.airship.altitude * 8 *
  1416.       airship_sprite.opacity
  1417.       @shadow_sprite.zoom_x = airship_sprite.zoom_x_real
  1418.       @shadow_sprite.zoom_y = airship_sprite.zoom_y_real
  1419.       @shadow_sprite.update
  1420.     else
  1421.       update_shadow_mgc_m7a
  1422.     end
  1423.   end
  1424. end
  1425.  
  1426. #==============================================================================
  1427. # ** Scene_Map
  1428. #==============================================================================
  1429. class Scene_Map < Scene_Base
  1430.   #--------------------------------------------------------------------------
  1431.   # * Aliased methods
  1432.   #--------------------------------------------------------------------------
  1433.   unless @already_aliased_mgc_m7a
  1434.     alias update_call_menu_mgc_m7a update_call_menu
  1435.     @already_aliased_mgc_m7a = true
  1436.   end
  1437.   #--------------------------------------------------------------------------
  1438.   # * Determine if Menu is Called due to Cancel Button
  1439.   #--------------------------------------------------------------------------
  1440.   def update_call_menu
  1441.     unless MGC.effect?
  1442.       update_call_menu_mgc_m7a
  1443.     end
  1444.   end
  1445. end
  1446.  
  1447. #============================================================================
  1448. # ** RPG::MapInfo
  1449. #============================================================================
  1450. class RPG::MapInfo
  1451.   # defines the map name as the name without anything within brackets,
  1452.   # including brackets
  1453.   def name
  1454.     return @name.gsub(/\[.*\]/) {''}
  1455.   end
  1456.   #--------------------------------------------------------------------------
  1457.   # the original name with the codes
  1458.   def full_name
  1459.     return @name
  1460.   end
  1461. end
  1462.  
  1463. module MGC
  1464.   #--------------------------------------------------------------------------
  1465.   # * Constantes [1.7]
  1466.   #--------------------------------------------------------------------------
  1467.   RENDER_TILE = Win32API.new("MGC_Mode7_Ace_1_9", "renderTile", "l", "l")
  1468.   #==============================================================================
  1469.   # ** MGC::Vertical_Tile [1.7]
  1470.   #==============================================================================
  1471.   class Vertical_Tile
  1472.     #--------------------------------------------------------------------------
  1473.     # * Attributs
  1474.     #--------------------------------------------------------------------------
  1475.     attr_accessor :x, :y, :screen_x, :screen_y, :zoom
  1476.     attr_accessor :tile_width, :tile_height, :width, :height
  1477.     #--------------------------------------------------------------------------
  1478.     # * Initialisation
  1479.     # param parent : MGC::Mode7_Map
  1480.     # param viewport : Viewport
  1481.     #--------------------------------------------------------------------------
  1482.     def initialize(parent, viewport)
  1483.       @parent = parent
  1484.       @viewport = viewport
  1485.       @visible = false
  1486.       @sprite = nil
  1487.     end
  1488.     #--------------------------------------------------------------------------
  1489.     # * Refresh tile data
  1490.     # param tiles : Array<Array[Integer, Integer, Array[3]<Boolean>]>
  1491.     # param x_min : Integer
  1492.     # param x_max : Integer
  1493.     # param y_min : Integer
  1494.     # param y_max : Integer
  1495.     #--------------------------------------------------------------------------
  1496.     def refresh_tile_data(tiles, x_min, x_max, y_min, y_max)
  1497.       self.tile_width = 1 + x_max - x_min
  1498.       self.width = tile_width << 5
  1499.       self.tile_height = 1 + y_max - y_min
  1500.       self.height = tile_height << 5
  1501.       @tiles_data = Array.new(tile_width * tile_height)
  1502.       tiles.each {|tile|
  1503.         x_tile = tile[0] - x_min
  1504.         y_tile = tile[1] - y_min
  1505.         @tiles_data[x_tile + y_tile * tile_width] = tile
  1506.       }
  1507.     end
  1508.     #--------------------------------------------------------------------------
  1509.     # * Dispose
  1510.     #--------------------------------------------------------------------------
  1511.     def dispose
  1512.       if @sprite
  1513.         @sprite.bitmap.dispose
  1514.         @sprite.dispose
  1515.         @sprite = nil
  1516.       end
  1517.     end
  1518.     #--------------------------------------------------------------------------
  1519.     # * Update
  1520.     #--------------------------------------------------------------------------
  1521.     def update
  1522.       update_mode7
  1523.       update_visibility
  1524.     end
  1525.     #--------------------------------------------------------------------------
  1526.     # * Update Position In Mode7
  1527.     #--------------------------------------------------------------------------
  1528.     def update_mode7
  1529.       x_scr = 32 * $game_map.adjust_x(x.to_f / 32)
  1530.       y_scr = 32 * $game_map.adjust_y(y.to_f / 32)
  1531.       y_init = MGC.mode7_data[2] * (y_scr - MGC.mode7_data[0])
  1532.       if y_init < - (MGC::MODE7_VIEW_LIMIT << 5) - MGC.mode7_data[0] ||
  1533.         y_init > Graphics.height
  1534.       then
  1535.         @force_invisible = true
  1536.         return
  1537.       else
  1538.         @force_invisible = false
  1539.       end
  1540.       x_init = MGC.mode7_data[2] * (x_scr - (Graphics.width >> 1))
  1541.       self.screen_y = (MGC.mode7_data[0] + (MGC.mode7_data[5] * y_init *
  1542.       MGC.mode7_data[3]) / (MGC.mode7_data[5] - y_init * MGC.mode7_data[4])).to_i
  1543.       zx = MGC.mode7_data[6] * screen_y + MGC.mode7_data[7]
  1544.       self.screen_x = ((Graphics.width >> 1) + zx * x_init).to_i
  1545.       self.zoom = MGC.mode7_data[2] * zx
  1546.     end
  1547.     #--------------------------------------------------------------------------
  1548.     # * Update Visibility
  1549.     #--------------------------------------------------------------------------
  1550.     def update_visibility
  1551.       if @visible
  1552.         if !@force_invisible &&
  1553.           screen_y >= MGC.mode7_data[8] &&
  1554.           (screen_y - height * zoom) < Graphics.height &&
  1555.           (screen_x + width * zoom / 2)  >= 0 &&
  1556.           (screen_x - width * zoom / 2) < Graphics.width
  1557.         then
  1558.           if screen_y < Graphics.height
  1559.             dat = MGC.mode7_data[9]
  1560.             @sprite.opacity = 255 + dat[5, screen_y]
  1561.             @sprite.tone.set(dat[2, screen_y], dat[3, screen_y], dat[4, screen_y])
  1562.           end
  1563.           @sprite.x = screen_x
  1564.           @sprite.y = screen_y
  1565.           @sprite.z = screen_y << 8
  1566.           @sprite.zoom_x = zoom
  1567.           @sprite.zoom_y = zoom
  1568.         else
  1569.           @visible = false
  1570.           @sprite.bitmap.dispose
  1571.           @sprite.dispose
  1572.           @sprite = nil
  1573.         end
  1574.       else
  1575.         if !@force_invisible &&
  1576.           screen_y >= MGC.mode7_data[8] &&
  1577.           (screen_y - height * zoom) < Graphics.height &&
  1578.           (screen_x + width * zoom / 2)  >= 0 &&
  1579.           (screen_x - width * zoom / 2) < Graphics.width
  1580.         then
  1581.           @visible = true
  1582.           @sprite = Sprite.new(@viewport)
  1583.           @sprite.ox = tile_width * 32 / 2
  1584.           @sprite.oy = tile_height * 32
  1585.           @sprite.x = screen_x
  1586.           @sprite.y = screen_y
  1587.           @sprite.z = screen_y << 8
  1588.           @sprite.zoom_x = zoom
  1589.           @sprite.zoom_y = zoom
  1590.           @sprite.bitmap = Bitmap.new(32 * tile_width, 32 * tile_height)
  1591.           (0...tile_height).each {|iy|
  1592.             (0...tile_width).each {|ix|
  1593.               tile_data = @tiles_data[ix + iy * tile_width]
  1594.               if tile_data
  1595.                 (0...3).each {|il|
  1596.                   if tile_data[2][il]
  1597.                     @parent.param_tiles[6][il] =
  1598.                     $game_map.tile_id(tile_data[0], tile_data[1], il)
  1599.                   else
  1600.                     @parent.param_tiles[6][il] = 0
  1601.                   end
  1602.                 }
  1603.                 @parent.param_tiles[0].clear
  1604.                 MGC::RENDER_TILE.call(@parent.param_tiles.__id__)
  1605.                 @sprite.bitmap.blt(ix << 5, iy << 5, @parent.param_tiles[0],
  1606.                 @parent.param_tiles[0].rect)
  1607.               end
  1608.             }
  1609.           }
  1610.           if screen_y < Graphics.height
  1611.             dat = MGC.mode7_data[9]
  1612.             @sprite.opacity = 255 + dat[5, screen_y]
  1613.             @sprite.tone.set(dat[2, screen_y], dat[3, screen_y], dat[4, screen_y])
  1614.           end
  1615.         end
  1616.       end
  1617.     end
  1618.   end
  1619. end
  
[神性领域扩张:扩张神性领域]
说了等于没说.
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-9 05:16

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表