BuddySievers

FF13 Title Screen - Hammy Cursor Fix

May 9th, 2026
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 12.54 KB | None | 0 0
  1. # AUTOR: METALERO, Edited by Hammy
  2.  
  3. $NO_TITLE = $TEST
  4.  
  5. class Scene_Title < Scene_Base
  6.  
  7.   @@no_animation = false
  8.  
  9.   class << self
  10.     attr_accessor :no_animation
  11.   end
  12.  
  13.   def start
  14.     super
  15.     SceneManager.clear
  16.     Graphics.freeze
  17.    
  18.     @selectedOption = 0
  19.    
  20.     initialize_background_animation
  21.     initialize_title_text_animation
  22.     initialize_title_substring_animation
  23.     initialize_logo_animation
  24.     initialize_options
  25.     initialize_cursor
  26.    
  27.     if $NO_TITLE
  28.       on_new_game
  29.     else
  30.       play_title_music
  31.     end
  32.   end
  33.  
  34.   def transition_speed
  35.     return 20 #EDITABLE
  36.   end
  37.  
  38.   def terminate
  39.     super
  40.     SceneManager.snapshot_for_background
  41.    
  42.     @bkgSprite.dispose
  43.     @titleTextSprite.dispose
  44.     @titleSubstringSprite.dispose
  45.     @logoSprite.dispose
  46.    
  47.     for i in 0...@optionSprites.size    
  48.       @optionSprites[i].dispose
  49.     end
  50.    
  51.     @cursorSprite.dispose
  52.   end
  53.  
  54.   def update
  55.     super
  56.     if @mustAnimateBackground
  57.       animate_background
  58.     end
  59.    
  60.     if @mustAnimateTitleText
  61.       animate_title_text
  62.     end
  63.    
  64.     if @mustAnimateTitleSubstring
  65.       animate_title_substring
  66.     end
  67.    
  68.     if @mustAnimateLogo
  69.       animate_logo
  70.     end
  71.    
  72.     if @mustAnimateOptions
  73.       animate_options
  74.     end
  75.    
  76.     if @mustUpdateCursor
  77.       update_cursor
  78.     end
  79.   end
  80.  
  81.   def initialize_background_animation
  82.     @backgroundAnimationDelay = 100 #EDITABLE
  83.     @backgroundAnimationDelayCount = 0
  84.     @backgroundAnimationSpeed = 1.4 #EDITABLE
  85.     @backgroundAnimationValue = 0.0
  86.     @backgroundAnimationX = 0 #EDITABLE
  87.     @backgroundAnimationY = 0 #EDITABLE
  88.     @mustAnimateBackground = true
  89.    
  90.     @bkgSprite = Sprite.new
  91.     @bkgSprite.bitmap = Cache.title1("BackgroundEmpty")
  92.     if !Scene_Title.no_animation
  93.       @bkgSprite.opacity = 0
  94.     else
  95.       @backgroundAnimationValue = 255
  96.     end
  97.    
  98.     @bkgSprite.x = @backgroundAnimationX
  99.     @bkgSprite.y = @backgroundAnimationY
  100.     @bkgSprite.z = 0
  101.   end
  102.  
  103.   def initialize_title_text_animation
  104.     @titleTextAnimationX = 180 #EDITABLE
  105.     @titleTextAnimationY = 130 #EDITABLE
  106.     @titleTextAnimationDelay = 40 #EDITABLE
  107.     @titleTextAnimationDelayCount = 0
  108.     @titleTextAnimationOpacitySpeed = 2 #EDITABLE
  109.     @titleTextAnimationOpacityValue = 0
  110.     @mustAnimateTitleText = true
  111.    
  112.     @titleTextSprite = Sprite.new
  113.     @titleTextSprite.bitmap = Cache.title1("TitleText")
  114.     @titleTextSprite.x = @titleTextAnimationX
  115.     @titleTextSprite.y = @titleTextAnimationY
  116.     @titleTextSprite.z = 10
  117.    
  118.     @titleTextAnimationCropMax = @titleTextSprite.bitmap.width
  119.     @titleTextAnimationCropSpeed = 1.8 #EDITABLE
  120.     @titleTextAnimationCropValue = 0
  121.    
  122.     if !Scene_Title.no_animation
  123.       @titleTextSprite.opacity = 0
  124.       @titleTextSprite.src_rect.width = 0
  125.     else
  126.       @titleTextAnimationCropValue = @titleTextAnimationCropMax
  127.       @titleTextAnimationOpacityValue = 255
  128.     end
  129.   end
  130.  
  131.   def initialize_title_substring_animation
  132.     @titleSubstringAnimationX = 180 #EDITABLE
  133.     @titleSubstringAnimationY = 200 #EDITABLE
  134.     @titleSubstringAnimationDelay = 0 #EDITABLE
  135.     @titleSubstringAnimationDelayCount = 0
  136.     @titleSubstringAnimationOpacitySpeed = 2 #EDITABLE
  137.     @titleSubstringAnimationOpacityValue = 0
  138.     @mustAnimateTitleSubstring = true
  139.    
  140.     @titleSubstringSprite = Sprite.new
  141.     @titleSubstringSprite.bitmap = Cache.title1("TitleSubstring")
  142.    
  143.     @titleSubstringAnimationCropMax = @titleSubstringSprite.bitmap.width
  144.     @titleSubstringAnimationCropDelta = 2.0 #EDITABLE
  145.     @titleSubstringAnimationCropValue = 0
  146.     @titleSubstringAnimationPosValue1 = @titleSubstringAnimationCropMax / 2
  147.     @titleSubstringAnimationPosValue2 = @titleSubstringAnimationX + @titleSubstringAnimationCropMax / 2
  148.    
  149.     @titleSubstringSprite.x = @titleSubstringAnimationPosValue2
  150.     @titleSubstringSprite.y = @titleSubstringAnimationY
  151.     @titleSubstringSprite.z = 10
  152.    
  153.     if !Scene_Title.no_animation
  154.       @titleSubstringSprite.opacity = 0
  155.       @titleSubstringSprite.src_rect.width = 0
  156.       @titleSubstringSprite.src_rect.x = @titleSubstringAnimationPosValue1
  157.     else
  158.       @titleSubstringAnimationOpacityValue = 255
  159.       @titleSubstringAnimationCropValue = @titleSubstringAnimationCropMax
  160.       @titleSubstringAnimationPosValue1 = 0
  161.       @titleSubstringAnimationPosValue2 = @titleSubstringAnimationX
  162.       @titleSubstringSprite.x = @titleSubstringAnimationX
  163.     end
  164.   end
  165.  
  166.   def initialize_logo_animation
  167.     @logoAnimationX = 300 #EDITABLE
  168.     @logoAnimationY = 100 #EDITABLE
  169.     @logoAnimationDelay = 60 #EDITABLE
  170.     @logoAnimationDelayCount = 0
  171.     @logoAnimationOpacitySpeed = 0.5 #EDITABLE
  172.     @logoAnimationOpacityValue = 0
  173.    
  174.     @logoAnimationScaleSpeed = 0.004 #EDITABLE
  175.     @logoAnimationScaleValue = 1.8 #EDITABLE
  176.    
  177.     @mustAnimateLogo = true
  178.    
  179.     @logoSprite = Sprite.new
  180.     @logoSprite.bitmap = Cache.title1("BackgroundLogo")
  181.    
  182.     @logoSprite.z = 1
  183.     @logoSprite.ox = @logoSprite.bitmap.width / 2
  184.     @logoSprite.oy = @logoSprite.bitmap.height / 2
  185.     @logoSprite.x = @logoAnimationX + @logoSprite.bitmap.width / 2
  186.     @logoSprite.y = @logoAnimationY + @logoSprite.bitmap.height / 2
  187.    
  188.     if !Scene_Title.no_animation
  189.       @logoSprite.opacity = 0
  190.     else
  191.       @logoAnimationOpacityValue = 255
  192.       @logoAnimationScaleValue = 1
  193.     end
  194.    
  195.     @logoSprite.zoom_x = @logoAnimationScaleValue
  196.     @logoSprite.zoom_y = @logoAnimationScaleValue
  197.   end
  198.  
  199.   def initialize_options
  200.     optionPaths = ["LoadGameText", "NewGameText", "SettingsText"] #EDITABLE
  201.     @options = [method(:on_load_game), method(:on_new_game), method(:on_settings)] #EDITABLE
  202.    
  203.     @optionsAnimationX = 48 #EDITABLE
  204.     @optionsAnimationY = 300 #EDITABLE
  205.     @optionsAnimationDelay = 250  #EDITABLE
  206.     @optionsAnimationDelayCount = 0
  207.     @optionsAnimationOpacitySpeed = 3 #EDITABLE
  208.     @optionsAnimationOpacityValue = 0
  209.    
  210.     @optionsAnimationDisplacementMax = 50 #EDITABLE
  211.     speedBase = 1 #EDITABLE
  212.     @optionsAnimationDisplacementSpeed = []
  213.     @optionsAnimationDisplacementSpeedOffset = 10 #EDITABLE
  214.    
  215.     @optionSprites = []
  216.     @optionsAnimationDisplacementValue = []
  217.     @optionsAnimationDisplacementStep = []
  218.    
  219.     @optionsYSep = 16 #EDITABLE
  220.    
  221.     for i in 0...optionPaths.size
  222.       optionSprite = Sprite.new
  223.       optionSprite.bitmap = Cache.title1(optionPaths[i])
  224.       optionSprite.x =
  225.       optionSprite.y = @optionsAnimationY + i * @optionsYSep
  226.      
  227.       @optionSprites.push(optionSprite)
  228.      
  229.       @optionsAnimationDisplacementSpeed.push(speedBase * (@optionsAnimationDisplacementMax + i * @optionsAnimationDisplacementSpeedOffset).to_f / @optionsAnimationDisplacementMax)
  230.      
  231.       if !Scene_Title.no_animation
  232.         @optionsAnimationDisplacementValue.push(@optionsAnimationX - @optionsAnimationDisplacementMax)
  233.         optionSprite.opacity = 0
  234.       else
  235.         @optionsAnimationDisplacementValue.push(@optionsAnimationX + i * @optionsAnimationDisplacementSpeedOffset)
  236.       end
  237.      
  238.       optionSprite.x = @optionsAnimationDisplacementValue[i]
  239.     end
  240.    
  241.     if Scene_Title.no_animation
  242.       @optionsAnimationOpacityValue = 255      
  243.     end
  244.    
  245.     @mustAnimateOptions = true
  246.   end
  247.  
  248.   def initialize_cursor
  249.     @cursorSprite = Sprite.new
  250.     @cursorSprite.bitmap = Cache.title1("Cursor")
  251.    
  252.     @cursorXBase = 24 #EDITABLE
  253.    
  254.     @cursorSprite.x = @cursorXBase
  255.     @cursorSprite.y = (@optionsAnimationY) - 4
  256.    
  257.     @mustUpdateCursor = Scene_Title.no_animation
  258.     @cursorXMovement = 0 #EDITABLE
  259.     @cursorXMovementSpeed = 0.05 #EDITABLE
  260.     @cursorXMovementValue = 0
  261.    
  262.     if !Scene_Title.no_animation
  263.       @cursorSprite.visible = false
  264.     end
  265.   end
  266.  
  267.   def animate_background
  268.     if @backgroundAnimationDelayCount < @backgroundAnimationDelay
  269.       @backgroundAnimationDelayCount += 1
  270.       return
  271.     end
  272.    
  273.     @backgroundAnimationValue += @backgroundAnimationSpeed
  274.     @bkgSprite.opacity = @backgroundAnimationValue
  275.    
  276.     if @backgroundAnimationValue >= 255
  277.       @mustAnimateBackground = false
  278.     end
  279.   end
  280.  
  281.   def animate_title_text
  282.     if @titleTextAnimationDelayCount < @titleTextAnimationDelay
  283.       @titleTextAnimationDelayCount += 1
  284.       return
  285.     end
  286.    
  287.     @titleTextAnimationCropValue += @titleTextAnimationCropSpeed
  288.     @titleTextSprite.src_rect.width = @titleTextAnimationCropValue
  289.    
  290.     @titleTextAnimationOpacityValue += @titleTextAnimationOpacitySpeed
  291.     @titleTextSprite.opacity += @titleTextAnimationOpacityValue
  292.    
  293.     if @titleTextAnimationCropValue >= @titleTextAnimationCropMax and
  294.       @titleTextAnimationOpacityValue >= 255
  295.       @mustAnimateTitleText = false
  296.     end
  297.   end
  298.  
  299.   def animate_title_substring
  300.     if @titleSubstringAnimationDelayCount < @titleSubstringAnimationDelay
  301.       @titleSubstringAnimationDelayCount += 1
  302.       return
  303.     end
  304.    
  305.     if @titleSubstringAnimationPosValue2 > @titleSubstringAnimationX
  306.       @titleSubstringAnimationCropValue += @titleSubstringAnimationCropDelta
  307.       @titleSubstringAnimationPosValue1 -= @titleSubstringAnimationCropDelta / 2.0
  308.       @titleSubstringAnimationPosValue2 -= @titleSubstringAnimationCropDelta / 2.0
  309.       @titleSubstringSprite.src_rect.width = @titleSubstringAnimationCropValue
  310.       @titleSubstringSprite.src_rect.x = @titleSubstringAnimationPosValue1
  311.       @titleSubstringSprite.x = @titleSubstringAnimationPosValue2
  312.     end
  313.    
  314.     @titleSubstringAnimationOpacityValue += @titleSubstringAnimationOpacitySpeed
  315.     @titleSubstringSprite.opacity = @titleSubstringAnimationOpacityValue
  316.    
  317.     if @titleSubstringAnimationPosValue2 <= @titleSubstringAnimationX and
  318.       @titleSubstringAnimationOpacityValue >= 255
  319.       @mustAnimateTitleSubstring = false
  320.     end
  321.   end
  322.  
  323.   def animate_logo
  324.     if @logoAnimationDelayCount < @logoAnimationDelay
  325.       @logoAnimationDelayCount += 1
  326.       return
  327.     end
  328.    
  329.     if @logoAnimationScaleValue <= 1
  330.       @logoAnimationScaleValue = 1
  331.       @logoSprite.zoom_x = @logoAnimationScaleValue
  332.       @logoSprite.zoom_y = @logoAnimationScaleValue
  333.     else
  334.       @logoAnimationScaleValue -= @logoAnimationScaleSpeed
  335.       @logoSprite.zoom_x = @logoAnimationScaleValue
  336.       @logoSprite.zoom_y = @logoAnimationScaleValue
  337.     end
  338.    
  339.     @logoAnimationOpacityValue += @logoAnimationOpacitySpeed
  340.     @logoSprite.opacity = @logoAnimationOpacityValue
  341.    
  342.     if @logoAnimationOpacityValue >= 255 and @logoAnimationScaleValue <= 1
  343.       @mustAnimateLogo = false
  344.     end
  345.   end
  346.  
  347.   def animate_options
  348.     if @optionsAnimationDelayCount < @optionsAnimationDelay
  349.       @optionsAnimationDelayCount += 1
  350.       return
  351.     end
  352.    
  353.     @optionsAnimationOpacityValue += @optionsAnimationOpacitySpeed
  354.    
  355.     for i in 0...@optionSprites.size
  356.       optionSprite = @optionSprites[i]
  357.       optionSprite.opacity = @optionsAnimationOpacityValue
  358.      
  359.       if @optionsAnimationDisplacementValue[0] <= @optionsAnimationX
  360.         @optionsAnimationDisplacementValue[i] += @optionsAnimationDisplacementSpeed[i]
  361.        
  362.         optionSprite.x = @optionsAnimationDisplacementValue[i]
  363.       end
  364.     end
  365.    
  366.     if @optionsAnimationOpacityValue >= 255 && @optionsAnimationDisplacementValue[0] >= @optionsAnimationX
  367.       @mustAnimateOptions = false
  368.       @cursorSprite.visible = true
  369.       @mustUpdateCursor = true
  370.       Scene_Title.no_animation = true
  371.     end
  372.   end
  373.  
  374.   def update_cursor
  375.     case @selectedOption
  376.     when 0
  377.       @cursorSprite.x = 24 #EDITABLE
  378.     when 1
  379.       @cursorSprite.x = 32 #EDITABLE
  380.     when 2
  381.       @cursorSprite.x = 40 #EDITABLE
  382.     end
  383.    
  384.     if Input.trigger?(Input::DOWN)
  385.       @selectedOption += 1
  386.       @selectedOption %= @options.size
  387.       @cursorSprite.y = (@optionsAnimationY + @optionsYSep * @selectedOption) - 4
  388.       Sound.play_cursor
  389.     elsif Input.trigger?(Input::UP)
  390.       @selectedOption += @options.size - 1
  391.       @selectedOption %= @options.size
  392.       @cursorSprite.y = (@optionsAnimationY + @optionsYSep * @selectedOption) - 4
  393.       Sound.play_cursor
  394.     end
  395.    
  396.     if Input.trigger?(Input::C)
  397.       @options[@selectedOption].call
  398.     end
  399.   end
  400.  
  401.   def on_load_game
  402.     SceneManager.call(Scene_Load)
  403.   end
  404.  
  405.   def on_new_game
  406.     DataManager.setup_new_game
  407.     fadeout_all
  408.     $game_map.autoplay
  409.     SceneManager.goto(Scene_Map)
  410.   end
  411.  
  412.   def on_settings
  413.     SceneManager.goto(Scene_End) #EDITABLE
  414.   end
  415.  
  416.   def play_title_music
  417.     $data_system.title_bgm.play
  418.     RPG::BGS.stop
  419.     RPG::ME.stop
  420.   end
  421. end
  422.  
Advertisement
Add Comment
Please, Sign In to add comment