From ddc43b2114c871eba47da825b3686205f1a6f5c9 Mon Sep 17 00:00:00 2001 From: Mathew Velasquez Date: Thu, 25 Feb 2016 02:59:13 -0500 Subject: [PATCH] Beginnings of fast travel --- scripts/Data_FastTravel.rb | 34 +++++++++ scripts/FastTravel.rb | 142 +++++++++++++++++++++++++++++++++++++ scripts/Game_FastTravel.rb | 26 +++++++ scripts/Game_Temp.rb | 2 + scripts/SaveLoad.rb | 2 + scripts/Scene_Map.rb | 22 +++++- scripts/Script.rb | 17 +++++ scripts/Window_MainMenu.rb | 21 ++++-- scripts/_scripts.txt | 4 ++ scripts/i18n_Translator.rb | 5 +- 10 files changed, 266 insertions(+), 9 deletions(-) create mode 100644 scripts/Data_FastTravel.rb create mode 100644 scripts/FastTravel.rb create mode 100644 scripts/Game_FastTravel.rb diff --git a/scripts/Data_FastTravel.rb b/scripts/Data_FastTravel.rb new file mode 100644 index 0000000..4a8706e --- /dev/null +++ b/scripts/Data_FastTravel.rb @@ -0,0 +1,34 @@ +class FastTravel + class Zone + attr_reader :name + attr_reader :maps + def initialize(name, maps) + @name = name + @maps = maps + end + end + + ZONES = { + :red => Zone.new(tr("The Refuge"), { + :gate => tr("city gate"), + :elevator => tr("elevator deck"), + :apartments => tr("apartments"), + :cafe => tr("cafe"), + :office => tr("office"), + }), + :green => Zone.new(tr("The Glen"), { + :whatever => tr(""), + }), + :blue => Zone.new(tr("The Barrens"), { + :entrance => tr("entrance"), + :outpost => tr("outpost"), + :cliffs => tr("cliffs"), + :quarry => tr("quarry"), + :mineshaft => tr("mineshaft entrance"), + :factory => tr("old factory"), + :dorms => tr("dormitories"), + :swamp => tr("shrimp swamp"), + :docks => tr("docks"), + }), + } +end diff --git a/scripts/FastTravel.rb b/scripts/FastTravel.rb new file mode 100644 index 0000000..378f49d --- /dev/null +++ b/scripts/FastTravel.rb @@ -0,0 +1,142 @@ +class FastTravel + MARGIN = 30 + TITLE_TOP_MARGIN = 32 + TITLE_MARGIN = 100 + ITEM_SPACING = 28 + ACTIVE_MARGIN = MARGIN * 2 + 20 + + def initialize + @viewport = Viewport.new(0, 0, 640, 480) + @bg = Sprite.new(@viewport) + @bg.bitmap = Bitmap.new(640, 480) + @bg.bitmap.fill_rect(0, 0, 640, 480, Color.new(0, 0, 0, 128)) + @title = Sprite.new(@viewport) + @title.bitmap = Bitmap.new(320, TITLE_MARGIN) + @title.bitmap.font.size = 40 + @title.y = TITLE_TOP_MARGIN + @title.x = MARGIN + @data_sprites = [] + @viewport.z = 9998 + + self.visible = false + @index = 0 + @fade_in = false + @fade_out = false + end + + def dispose + @bg.dispose + @title.dispose + @data_sprites.each do |spr| + spr.dispose + end + @viewport.dispose + end + + def open + self.visible = true + self.opacity = 0 + @fade_in = true + @data = $game_fasttravel.unlocked_maps.sort + zone = ZONES[$game_fasttravel.zone] + + # Create title + @title.bitmap.clear + @title.bitmap.draw_text(0, 0, @title.bitmap.width, @title.bitmap.height, zone.name) + + # Create menu options + @data.each_with_index do |item, i| + spr = Sprite.new(@viewport) + spr.bitmap = Bitmap.new(320, ITEM_SPACING) + spr.x = MARGIN + spr.y = TITLE_MARGIN + TITLE_TOP_MARGIN + ITEM_SPACING * i + spr.opacity = 0 + spr.bitmap.draw_text(0, 0, spr.bitmap.width, spr.bitmap.height, zone.maps[item]) + @data_sprites << spr + end + end + + def update + if @fade_in + self.opacity += 20 + active_spr = nil + @data_sprites.each do |spr| + spr.opacity += 10 + spr.opacity = 128 if spr.opacity > 128 + active_spr = spr if !active_spr && spr.x < MARGIN * 2 + end + if active_spr + active_spr.x += 6 + active_spr.x = MARGIN * 2 if active_spr.x > MARGIN * 2 + elsif self.opacity == 255 + @fade_in = false + end + return + end + + if @fade_out + self.opacity -= 20 + @data_sprites.each do |spr| + spr.opacity -= 10 + end + if self.opacity == 0 + @fade_out = false + self.visible = false + @data_sprites.each do |spr| + spr.dispose + end + @data_sprites = [] + end + return + end + + return if !self.visible + + # Adjust position and visibility + @data_sprites.each_with_index do |spr, i| + if i == @index + if spr.x < ACTIVE_MARGIN + spr.x += 6 + spr.x = ACTIVE_MARGIN if spr.x > ACTIVE_MARGIN + end + spr.opacity += 10 if spr.opacity < 255 + else + if spr.x > MARGIN * 2 + spr.x -= 6 + spr.x = MARGIN * 2 if spr.x < MARGIN * 2 + end + spr.opacity -= 10 if spr.opacity > 128 + spr.opacity = 128 if spr.opacity < 128 + end + end + + if Input.trigger?(Input::UP) + @index = (@index - 1) % @data.size + $game_system.se_play($data_system.cursor_se) + end + if Input.trigger?(Input::DOWN) + @index = (@index + 1) % @data.size + $game_system.se_play($data_system.cursor_se) + end + + if Input.trigger?(Input::CANCEL) + $game_system.se_play($data_system.cancel_se) + @fade_out = true + end + end + + # Attributes + def visible + @viewport.visible + end + def visible=(val) + @viewport.visible = val + end + def opacity=(val) + @bg.opacity = val + @title.opacity = val + end + def opacity + @bg.opacity + end +end diff --git a/scripts/Game_FastTravel.rb b/scripts/Game_FastTravel.rb new file mode 100644 index 0000000..41c45d5 --- /dev/null +++ b/scripts/Game_FastTravel.rb @@ -0,0 +1,26 @@ +class Game_FastTravel + attr_reader :zone + attr_accessor :enabled + alias :enabled? :enabled + + def initialize + @unlocked = {} + @zone = nil + @enabled = false + end + + def unlock(map) + @unlocked[@zone] << map + end + + def zone=(zone) + @zone = zone + unless @unlocked.include? zone + @unlocked[zone] = [] + end + end + + def unlocked_maps + @unlocked[@zone] + end +end diff --git a/scripts/Game_Temp.rb b/scripts/Game_Temp.rb index 62cc598..967f1fa 100644 --- a/scripts/Game_Temp.rb +++ b/scripts/Game_Temp.rb @@ -38,6 +38,7 @@ class Game_Temp attr_accessor :name_calling # name input: calling flag attr_accessor :menu_calling # menu calling flag attr_accessor :item_menu_calling # item menu calling flag + attr_accessor :travel_menu_calling # fast travel menu calling flag attr_accessor :menu_beep # menu: play sound effect flag attr_accessor :save_calling # save calling flag attr_accessor :debug_calling # debug calling flag @@ -89,6 +90,7 @@ class Game_Temp @name_max_char = 0 @menu_calling = false @item_menu_calling = false + @travel_menu_calling = false @menu_beep = false @save_calling = false @debug_calling = false diff --git a/scripts/SaveLoad.rb b/scripts/SaveLoad.rb index 7135c2c..cdbbe4e 100644 --- a/scripts/SaveLoad.rb +++ b/scripts/SaveLoad.rb @@ -22,6 +22,7 @@ def save Marshal.dump($game_map, file) Marshal.dump($game_player, file) Marshal.dump($game_oneshot, file) + Marshal.dump($game_fasttravel, file) end end @@ -41,6 +42,7 @@ def load $game_map = Marshal.load(file) $game_player = Marshal.load(file) $game_oneshot = Marshal.load(file) + $game_fasttravel = Marshal.load(file) # If magic number is different from when saving # (if editing was added with editor) if $game_system.magic_number != $data_system.magic_number diff --git a/scripts/Scene_Map.rb b/scripts/Scene_Map.rb index e1d91b5..7efe8c3 100644 --- a/scripts/Scene_Map.rb +++ b/scripts/Scene_Map.rb @@ -26,6 +26,8 @@ class Scene_Map @item_icon.zoom_x = 2.0 @item_icon.zoom_y = 2.0 @item_id = 0 + # Make fast travel menu + @fast_travel = FastTravel.new # Transition run Graphics.transition # Main loop @@ -51,6 +53,7 @@ class Scene_Map # Dispose of menu @menu.dispose @item_menu.dispose + @fast_travel.dispose # Dispose of item icon @item_icon.dispose # If switching to title screen @@ -72,7 +75,7 @@ class Scene_Map # move in an instant) $game_map.update $game_system.map_interpreter.update - $game_player.update if !@menu.visible && !@item_menu.visible + $game_player.update if !@menu.visible && !@item_menu.visible && !@fast_travel.visible $game_followers.each{|f| f.update} # Update system (timer), screen $game_system.update @@ -121,6 +124,8 @@ class Scene_Map end # Hide icon when item menu is visible @item_icon.visible = !@item_menu.visible + # Update fast travel + @fast_travel.update # If game over if $game_temp.gameover # Switch to game over screen @@ -150,8 +155,9 @@ class Scene_Map return end # Process menu opening - unless $game_system.map_interpreter.running? or - $game_system.menu_disabled + unless $game_system.map_interpreter.running? || + $game_system.menu_disabled || + @fast_travel.visible if !@menu.visible && Input.trigger?(Input::MENU) $game_temp.menu_calling = true $game_temp.menu_beep = true @@ -187,6 +193,8 @@ class Scene_Map call_menu elsif $game_temp.item_menu_calling call_item_menu + elsif $game_temp.travel_menu_calling + call_travel_menu elsif $game_temp.save_calling call_save elsif $game_temp.debug_calling @@ -270,6 +278,14 @@ class Scene_Map # Open the menu @item_menu.open end + def call_travel_menu + # Clear menu call flag + $game_temp.travel_menu_calling = false + # Straighten player position + $game_player.straighten + # Open the menu + @fast_travel.open + end #-------------------------------------------------------------------------- # * Save Call #-------------------------------------------------------------------------- diff --git a/scripts/Script.rb b/scripts/Script.rb index bd20b43..ccd40b5 100644 --- a/scripts/Script.rb +++ b/scripts/Script.rb @@ -116,6 +116,23 @@ def green_ambient ambient -50, -50, -50 end +# Travel +def enable_travel + $game_fasttravel.enabled = true +end + +def disable_travel + $game_fasttravel.disabled = true +end + +def set_zone(zone) + $game_fasttravel.zone = zone +end + +def unlock_map(map) + $game_fasttravel.unlock(map) +end + # Misc def watcher_tell_time hour = Time.now.hour diff --git a/scripts/Window_MainMenu.rb b/scripts/Window_MainMenu.rb index 8583a2b..f7f0344 100644 --- a/scripts/Window_MainMenu.rb +++ b/scripts/Window_MainMenu.rb @@ -118,15 +118,26 @@ class Window_MainMenu < Window_Selectable # Select menu item if Input.trigger?(Input::ACTION) - $game_system.se_play($data_system.decision_se) self.active = false self.opacity = 127 - #case @index - #else - print "oh no you don't" + case @index + when 0 + if Input.trigger?(Input::ACTION) + if $game_fasttravel.enabled? + $game_system.se_play($data_system.decision_se) + $game_temp.travel_menu_calling = true + @fade_out = true + else + $game_system.se_play($data_system.buzzer_se) + $game_temp.message_ed_text = tr("You cannot fast travel right now.") + $game_temp.message_proc = Proc.new { self.active = true; self.opacity = 255 } + end + end + else + $game_system.se_play($data_system.buzzer_se) self.active = true self.opacity = 255 - #end + end return end diff --git a/scripts/_scripts.txt b/scripts/_scripts.txt index 81291f8..1e9a683 100644 --- a/scripts/_scripts.txt +++ b/scripts/_scripts.txt @@ -26,6 +26,7 @@ Game_Player Game_Oneshot Game_Light Game_Follower +Game_FastTravel Sprite_Character Sprite_Battler @@ -34,6 +35,8 @@ Sprite_Timer Sprite_Light Spriteset_Map +FastTravel + Window_Base Window_Selectable Window_Command @@ -101,6 +104,7 @@ i18n_Language Data_Item Data_Footsteps Data_SpecialEventData +Data_FastTravel # Script Functions Script diff --git a/scripts/i18n_Translator.rb b/scripts/i18n_Translator.rb index 616e958..348646d 100644 --- a/scripts/i18n_Translator.rb +++ b/scripts/i18n_Translator.rb @@ -72,6 +72,9 @@ class Translator end # Hacky translation helper function +# def tr(text) +# $tr.script(Kernel.caller.first.split(':', 3)[1], text) +# end def tr(text) - $tr.script(Kernel.caller.first.split(':', 3)[1], text) + text end