TheoAllen

Theo - Fog Screen v2

Aug 25th, 2013
483
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 14.87 KB | None | 0 0
  1. # =============================================================================
  2. # TheoAllen - Fog Screen
  3. # Version : 2.0
  4. # Contact : www.rpgmakerid.com (or) http://theolized.blogspot.com
  5. # (This script documentation is written in informal indonesian language)
  6. # =============================================================================
  7. ($imported ||={})[:Theo_FogScreen] = true
  8. # =============================================================================
  9. # CHANGE LOGS:
  10. # -----------------------------------------------------------------------------
  11. # 2013.08.24 - Rewrite script dengan workflow yang bueda banget (v2.0)
  12. #            - Nambahin multiple fog support
  13. #            - Support Kecepatan scroll lebih lambat (sekitar 0.1)
  14. #            - Support map croll
  15. #            - Support Battle Fog
  16. #            - Ganti notetag fog pada peta
  17. #            - Ilangin variasi opacity
  18. # 2013.06.13 - Nambahin global fog (v1.3)
  19. #            - Nambahin global disable switch
  20. #            - Nambahin specific disable switch
  21. # 2013.06.12 - Bug Fix. Saat pindah map fog ngga ilang (v1.15b)
  22. # 2013.05.15 - Nambahin blend type (v1.15)
  23. #            - Nambahin zoom
  24. #            - Nambahin variasi opacity dan kecepatannya
  25. # 2013.05.09 - Started and Finished script (v1.0)
  26. # =============================================================================
  27. =begin
  28.  
  29.   -----------------------------------------------------------------------------
  30.   Pembukaan :
  31.   Versi ini adalah versi rewrite besar-besaran dari versi 1.3. Jika kamu gunain
  32.   script gw yg versi sbelumnya, semua cara penggunaan di versi sbelumnya ngga
  33.   akan bekerja. Jadi maaf kalo u harus setting ulang dari awal
  34.  
  35.   -----------------------------------------------------------------------------
  36.   Perkenalan :
  37.   Script ini ngebikin kamu bisa nampilin fog seperti yang dimiliki RMXP.
  38.  
  39.   -----------------------------------------------------------------------------
  40.   Cara penggunaan :
  41.   Pasang dibawah material namun diatas main
  42.   Edit konfigurasi database fognya
  43.   Lalu untuk memasang fognya, kamu bisa gunakan script call kek gini
  44.  
  45.   Untuk nambah :
  46.   add_fog(key)
  47.   add_fog(key,fadein)
  48.  
  49.   Untuk ngilangin :
  50.   delete_fog(key)
  51.   delete_fog(key,fadeout)
  52.  
  53.   Note :
  54.   - key adalah kata kunci yang ada di database fognya.
  55.   - fadein/fadeout adalah kecepatan munculnya. Misalnya kamu isi 5, maka setiap
  56.     frame, opacitynya akan nambah 5 sampe bates maksimal yg udah u tentuin
  57.     di database. Kalo pengen instant munculnya, bisa diabaikan (ga diisi)
  58.   - kamu ngga bisa nambahin fog dengan kata kunci yang sama dua kali
  59.  
  60.   clear_fogs
  61.   ^
  62.   untuk ngilangin semua fog secara langsung
  63.  
  64.   -----------------------------------------------------------------------------
  65.   Notetag :
  66.   Untuk gunain notetagnya cukup simple. Kamu tinggal kasi aja notetag dalam
  67.   note map kek gini
  68.  
  69.   <add fog: key>
  70.  
  71.   -----------------------------------------------------------------------------
  72.   Terms of use :
  73.   Credit gw, TheoAllen. Kalo semisal u bisa ngedit2 script gw trus jadi lebih
  74.   keren, terserah. Ane bebasin. Asal ngga ngeklaim aja. Kalo semisal mau
  75.   dipake buat komersil, jangan lupa, gw dibagi gratisannya.
  76.  
  77. =end
  78. # =============================================================================
  79. # Konfigurasi :
  80. # =============================================================================
  81. module THEO
  82.   module Fog
  83.   # -------------------------------------------------------------------------  
  84.   # Masukin ke battle scene?
  85.   # -------------------------------------------------------------------------  
  86.     BattleFog = true  
  87.   # Set true kalo kamu pengen masukin fog jg di battle. Set false kalo ngga
  88.    
  89.   # -------------------------------------------------------------------------
  90.   # Fog Database List ~
  91.   # Level : Easy
  92.   # -------------------------------------------------------------------------  
  93.   # Paduan Konfigurasi
  94.   #
  95.   # key     => Adalah kata kunci untuk manggil fogmu (script call dan notetag)
  96.   # name    => Nama file fog yg harus ada di Graphics/Pictures
  97.   # opacity => Transparansi gambar fogmu (0 - 255)
  98.   # speed_x => kecepatan scroll horizontal
  99.   # speed_y => kecepatan scroll vertikal
  100.   # zoom_x  => skala perbesaran horizontal (1.0 sama dengan normal)
  101.   # zoom_y  => skala perbesaran vertikal (1.0 sama dengan normal)
  102.   # -------------------------------------------------------------------------  
  103.     List = {
  104.     # "key"    => ["name", opacity, speed_x, speed_y, zoom_x, zoom_y]
  105.       "kabut"  => ["fog",      128,     0.2,     0.2,    1.0,    1.0],
  106.       "awan"   => ["cloud",     90,    -0.2,    -0.2,    2.0,    2.0],
  107.       "badai"  => ["storm",     90,    -2.0,     2.0,    1.0,    1.0],
  108.       "daun"   => ["leaf",      90,       0,       0,    2.0,    2.0],
  109.     # Tambahin sendiri
  110.    
  111.     } # <-- Jangan disentuh ~ !
  112.   # -------------------------------------------------------------------------  
  113.   # Fog Extended Database List
  114.   # Level : Hard
  115.   # -------------------------------------------------------------------------
  116.   # Disamping yang udah disebutin diatas (opacity, speed_x, dst ..) sbenernya
  117.   # masih ada konfigurasi lainnya. Untuk alesan kerapian, jadi gw taruh
  118.   # disini aja konfignya.
  119.   #
  120.   # Paduan konfigurasi :
  121.   # Mulai dengan nulis kek gini
  122.   # fog = fog_data["key"]
  123.   #
  124.   # Lalu tambahin attribut yg mo diubah. Misalnya gini
  125.   # fog = fog_data["kabut"]
  126.   # fog.name = "something"
  127.   # fog.opacity = 100
  128.   #
  129.   # Berikut ini adalah list yg dapat kamu tambahin disamping yg udah wa
  130.   # sediain diatas :
  131.   #
  132.   # fog.switch      >> isinya ID switch (angka). Kalo switch hidup = invisible
  133.   # fog.blend_type  >> Tipe blending. Pilih antara 0 - 2 (default : 0)
  134.   # fog.tone        >> Isinya Tone.new(red, green, blue, gray) (kek Tint screen)
  135.   # fog.z           >> koordinat z. Makin gede, makin ada diatas. Defaultnya
  136.   #                    adalah 250 untuk setiap fog
  137.   #
  138.   # Untuk skala scroll
  139.   # fog.scroll_scale_x >> skala horizontal
  140.   # fog.scroll_scale_y >> skala vertikal
  141.   #
  142.   # Yang diatas ini buat skala scroll. Jika kamu ngisinya 0.0 maka ntar walo
  143.   # mapnya nyekroll, fognya bakal tetep berada di tempat. Nilai defaultnya
  144.   # adalah 1.0
  145.   # -------------------------------------------------------------------------
  146.     def self.custom_fogs
  147.       fog = fog_data["daun"]
  148.       fog.scroll_scale_x = 0.4
  149.       fog.scroll_scale_y = 0.4
  150.     end
  151.    
  152.   end
  153. end
  154. # =============================================================================
  155. # Akhir dari konfigurasi. Setelah line ini semua adalah barang pribadi gw :v
  156. # =============================================================================
  157. module THEO
  158.   module Fog
  159.     def self.load_fogs
  160.       List.each do |key,data|
  161.         fog = fog_data[key]
  162.         fog.name = data[0]
  163.         fog.opacity = data[1]
  164.         fog.speed_x = data[2]
  165.         fog.speed_y = data[3]
  166.         fog.zoom_x = data[4]
  167.         fog.zoom_y = data[5]
  168.       end
  169.     end
  170.    
  171.     def self.fog_data
  172.       $game_temp.fogs
  173.     end    
  174.   end
  175. end
  176.  
  177. class << DataManager
  178.  
  179.   alias theo_fog_create_obj create_game_objects
  180.   def create_game_objects
  181.     theo_fog_create_obj
  182.     THEO::Fog.load_fogs
  183.     THEO::Fog.custom_fogs
  184.   end
  185.  
  186. end
  187.  
  188. class DataFogs
  189.  
  190.   def initialize
  191.     @data = {}
  192.   end
  193.  
  194.   def [](key)
  195.     @data[key] ||= Fog.new(key)
  196.   end
  197.  
  198. end
  199.  
  200. class Fog
  201.   attr_accessor :key
  202.   attr_accessor :name
  203.   attr_accessor :opacity
  204.   attr_accessor :speed_x
  205.   attr_accessor :speed_y
  206.   attr_accessor :zoom_x
  207.   attr_accessor :zoom_y
  208.   attr_accessor :scroll_scale_x
  209.   attr_accessor :scroll_scale_y
  210.   attr_accessor :blend_type
  211.   attr_accessor :tone
  212.   attr_accessor :switch
  213.   attr_accessor :z
  214.  
  215.   def initialize(key)
  216.     @key = key
  217.     @name = ""
  218.     @opacity = 255
  219.     @speed_x = 0.0
  220.     @speed_y = 0.0
  221.     @zoom_x = 1.0
  222.     @zoom_y = 1.0
  223.     @scroll_scale_x = 1.0
  224.     @scroll_scale_y = 1.0
  225.     @blend_type = 0
  226.     @tone = Tone.new
  227.     @switch = 0
  228.     @z = 250
  229.   end
  230.  
  231.   def visible
  232.     !$game_switches[@switch]
  233.   end
  234.  
  235. end
  236.  
  237. class Game_Temp
  238.   attr_accessor :clear_fog
  239.   attr_reader :fogs
  240.  
  241.   # --------------------------------------------------------------------------
  242.   # They said that too much global variables isn't good. So, I used an
  243.   # instance variable to store my fogs database =P
  244.   # --------------------------------------------------------------------------
  245.   alias theo_fog_init initialize
  246.   def initialize
  247.     theo_fog_init
  248.     @fogs = DataFogs.new
  249.     @clear_fog = false
  250.   end
  251.  
  252. end
  253.  
  254. class Game_System
  255.   attr_reader :used_fog
  256.  
  257.   alias theo_fog_init initialize
  258.   def initialize
  259.     theo_fog_init
  260.     @used_fog = []
  261.   end
  262.  
  263. end
  264. # ----------------------------------------------------------------------------
  265. # Altered Game Interpreter. For script call
  266. # ----------------------------------------------------------------------------
  267. class Game_Interpreter
  268.  
  269.   def clear_fogs
  270.     $game_system.used_fog.clear
  271.     $game_temp.clear_fog = true
  272.     Fiber.yield
  273.   end
  274.  
  275.   def get_fog(key)
  276.     plane = planefogs
  277.     return nil unless plane
  278.     plane.get_fog(key)
  279.   end
  280.  
  281.   def planefogs
  282.     scene = SceneManager.scene
  283.     spriteset = scene.instance_variable_get("@spriteset")
  284.     return spriteset.instance_variable_get("@fogs")
  285.   end
  286.  
  287.   def delete_fog(key,speed = 255)
  288.     fog = get_fog(key)
  289.     return unless fog
  290.     $game_system.used_fog.delete(key)
  291.     fog.fadeout(speed)
  292.     fog.fade_delete = true
  293.   end
  294.  
  295.   def add_fog(key,speed = 255)
  296.     return if $game_system.used_fog.include?(key)
  297.     $game_system.used_fog.push(key)
  298.     fog = planefogs[key]
  299.     fog.fadein(speed)
  300.   end
  301.  
  302. end
  303.  
  304. class Game_Map
  305.   attr_accessor :used_fogs
  306.  
  307.   alias theo_fog_init initialize
  308.   def initialize
  309.     theo_fog_init
  310.     @used_fogs = []
  311.   end
  312.  
  313.   alias theo_fog_setup setup
  314.   def setup(map_id)
  315.     theo_fog_setup(map_id)
  316.     setup_fogs
  317.   end
  318.  
  319.   def setup_fogs
  320.     @used_fogs = []
  321.     @map.note.split(/[\r\n]+/).each do |line|
  322.       case line
  323.       when /<(?:ADD_FOG|add fog): (.*)>/i
  324.         key = $1.to_s
  325.         next if @used_fogs.include?(key)
  326.         @used_fogs.push(key)
  327.       end
  328.     end
  329.   end
  330.  
  331. end
  332.  
  333. class PlaneFog < Plane
  334.   attr_accessor :fade_delete
  335.   attr_accessor :key
  336.  
  337.   def initialize(key, viewport)
  338.     super(viewport)
  339.     @real_ox = self.ox.to_f + rand(Graphics.width)
  340.     @real_oy = self.oy.to_f + rand(Graphics.height)
  341.     load_data(key)
  342.     update_oxoy
  343.     @fade = 0
  344.     @fade_delete = false
  345.   end
  346.  
  347.   def load_data(key)
  348.     @data = THEO::Fog.fog_data[key]
  349.     self.bitmap = Cache.picture(@data.name)
  350.     @data.instance_variables.each do |varsymb|
  351.       ivar_name = varsymb.to_s.gsub(/@/){""}
  352.       eval("
  353.      if self.respond_to?(\"#{ivar_name}\")
  354.        self.#{ivar_name} = @data.#{ivar_name}
  355.      end
  356.      ")
  357.     end
  358.   end
  359.  
  360.   def fadeout(speed)
  361.     @fade = -speed
  362.   end
  363.  
  364.   def fadein(speed)
  365.     @fade = speed
  366.     self.opacity = 0
  367.   end
  368.  
  369.   def spd_x
  370.     @data.speed_x
  371.   end
  372.  
  373.   def spd_y
  374.     @data.speed_y
  375.   end
  376.  
  377.   def update
  378.     update_real_oxoy
  379.     update_oxoy
  380.     update_visible
  381.     update_fade
  382.   end
  383.  
  384.   def update_real_oxoy
  385.     @real_ox += spd_x
  386.     @real_oy += spd_y
  387.   end
  388.  
  389.   def update_oxoy
  390.     self.ox = fog_display_x + @real_ox
  391.     self.oy = fog_display_y + @real_oy
  392.   end
  393.  
  394.   def update_fade
  395.     self.opacity = [[opacity + @fade,0].max,max_opacity].min
  396.   end
  397.  
  398.   def max_opacity
  399.     @data.opacity
  400.   end
  401.  
  402.   def fog_display_x
  403.     $game_map.display_x * (32.0 * @data.scroll_scale_x)
  404.   end
  405.  
  406.   def fog_display_y
  407.     $game_map.display_y * (32.0 * @data.scroll_scale_y)
  408.   end
  409.  
  410.   def update_visible
  411.     self.visible = @data.visible
  412.   end
  413.  
  414. end
  415.  
  416. class PlaneFogs
  417.  
  418.   def initialize(viewport)
  419.     @data = {}
  420.     @viewport = viewport
  421.     init_used_fog
  422.   end
  423.  
  424.   def init_used_fog
  425.     $game_system.used_fog.each do |fogname|
  426.       self[fogname]
  427.     end
  428.   end
  429.  
  430.   def get_fog(key)
  431.     @data[key]
  432.   end
  433.  
  434.   def delete(key)
  435.     fog = @data[key]
  436.     return unless fog
  437.     fog.dispose
  438.     @data.delete(key)
  439.   end
  440.  
  441.   def [](key)
  442.     @data[key] ||= PlaneFog.new(key, @viewport)
  443.   end
  444.  
  445.   def update
  446.     update_basic
  447.     @data.values.each {|fog| fog.update unless fog.disposed?}
  448.   end
  449.  
  450.   def update_basic
  451.     update_delete
  452.     update_clear
  453.   end
  454.  
  455.   def update_delete
  456.     @data.values.each do |fog|
  457.       next unless fog.fade_delete && fog.opacity == 0
  458.       delete(fog.key)
  459.       $game_system.used_fog.delete(fog.key)
  460.     end
  461.   end
  462.  
  463.   def update_clear
  464.     if $game_temp.clear_fog
  465.       @data.keys.each do |key|
  466.         delete(key)
  467.       end
  468.       $game_temp.clear_fog = false
  469.     end
  470.   end
  471.  
  472.   def dispose
  473.     @data.values.each {|fog| fog.dispose}
  474.   end
  475.  
  476. end
  477.  
  478. class Mapfogs < PlaneFogs
  479.  
  480.   def init_used_fogs
  481.     @used_fogs = $game_map.used_fogs.dup
  482.     @used_fogs.each do |fogname|
  483.       self[fogname]
  484.     end
  485.   end
  486.  
  487.   def update_basic
  488.     update_used_fog
  489.   end
  490.  
  491.   def update_used_fog
  492.     if @used_fogs != $game_map.used_fogs
  493.       delete_all
  494.       init_used_fogs
  495.     end
  496.   end
  497.  
  498.   def delete_all
  499.     @data.values.each do |fog|
  500.       delete(fog.key)
  501.     end
  502.   end
  503.  
  504. end
  505.  
  506. class Spriteset_Map
  507.  
  508.   alias theo_fog_viewports create_viewports
  509.   def create_viewports
  510.     theo_fog_viewports
  511.     create_mapfogs
  512.     create_global_fogs
  513.   end
  514.  
  515.   def create_mapfogs
  516.     @mapfogs = Mapfogs.new(@viewport1)
  517.   end
  518.  
  519.   def create_global_fogs
  520.     @fogs = PlaneFogs.new(@viewport1)
  521.   end
  522.  
  523.   alias theo_fog_update update
  524.   def update
  525.     theo_fog_update
  526.     update_global_fogs
  527.     update_mapfogs
  528.   end
  529.  
  530.   def update_global_fogs
  531.     @fogs.update
  532.   end
  533.  
  534.   def update_mapfogs
  535.     @mapfogs.update
  536.   end
  537.  
  538.   alias theo_fog_dispose dispose
  539.   def dispose
  540.     theo_fog_dispose
  541.     dispose_global_fogs
  542.     dispose_mapfogs
  543.   end
  544.  
  545.   def dispose_global_fogs
  546.     @fogs.dispose
  547.   end
  548.  
  549.   def dispose_mapfogs
  550.     @mapfogs.dispose    
  551.   end
  552.  
  553. end
  554.  
  555. class Spriteset_Battle
  556.  
  557.   def use_fog?
  558.     THEO::Fog::BattleFog
  559.   end
  560.  
  561.   alias theo_fog_viewports create_viewports
  562.   def create_viewports
  563.     theo_fog_viewports
  564.     return unless use_fog?
  565.     create_mapfogs
  566.     create_global_fogs
  567.   end
  568.  
  569.   def create_mapfogs
  570.     @mapfogs = Mapfogs.new(@viewport1)
  571.   end
  572.  
  573.   def create_global_fogs
  574.     @fogs = PlaneFogs.new(@viewport1)
  575.   end
  576.  
  577.   alias theo_fog_update update
  578.   def update
  579.     theo_fog_update
  580.     return unless use_fog?
  581.     update_global_fogs
  582.     update_mapfogs
  583.   end
  584.  
  585.   def update_global_fogs
  586.     @fogs.update
  587.   end
  588.  
  589.   def update_mapfogs
  590.     @mapfogs.update
  591.   end
  592.  
  593.   alias theo_fog_dispose dispose
  594.   def dispose
  595.     theo_fog_dispose
  596.     return unless use_fog?
  597.     dispose_global_fogs
  598.     dispose_mapfogs
  599.   end
  600.  
  601.   def dispose_global_fogs
  602.     @fogs.dispose
  603.   end
  604.  
  605.   def dispose_mapfogs
  606.     @mapfogs.dispose    
  607.   end
  608.  
  609. end
Advertisement
Add Comment
Please, Sign In to add comment