mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2026-01-22 22:36:03 +00:00
Rewrote load game screen inc. supporting multiple save files, allowed \PN and \v[42] in map names and Town Map point names
This commit is contained in:
@@ -90,16 +90,7 @@ class IntroEventScene < EventScene
|
||||
|
||||
def close_title_screen(scene, *args)
|
||||
fade_out_title_screen(scene)
|
||||
sscene = PokemonLoad_Scene.new
|
||||
sscreen = PokemonLoadScreen.new(sscene)
|
||||
sscreen.pbStartLoadScreen
|
||||
end
|
||||
|
||||
def close_title_screen_delete(scene, *args)
|
||||
fade_out_title_screen(scene)
|
||||
sscene = PokemonLoad_Scene.new
|
||||
sscreen = PokemonLoadScreen.new(sscene)
|
||||
sscreen.pbStartDeleteScreen
|
||||
UI::Load.new.main
|
||||
end
|
||||
|
||||
def title_screen_update(scene, args)
|
||||
@@ -108,11 +99,6 @@ class IntroEventScene < EventScene
|
||||
@pic2.moveOpacity(TICKS_PER_ENTER_FLASH * 2 / 10, TICKS_PER_ENTER_FLASH * 4 / 10, 0)
|
||||
@pic2.moveOpacity(TICKS_PER_ENTER_FLASH * 6 / 10, TICKS_PER_ENTER_FLASH * 4 / 10, 255)
|
||||
end
|
||||
if Input.press?(Input::DOWN) &&
|
||||
Input.press?(Input::BACK) &&
|
||||
Input.press?(Input::CTRL)
|
||||
close_title_screen_delete(scene, args)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -186,6 +186,8 @@ class PokemonRegionMap_Scene
|
||||
next if point[0] != x || point[1] != y
|
||||
return "" if point[7] && (@wallmap || point[7] <= 0 || !$game_switches[point[7]])
|
||||
name = pbGetMessageFromHash(MessageTypes::REGION_LOCATION_NAMES, point[2])
|
||||
name = name.gsub(/\\PN/, $player.name)
|
||||
name = name.gsub(/\\v\[(\d+)\]/) { |num| $game_variables[$~[1].to_i].to_s }
|
||||
return (@editor) ? point[2] : name
|
||||
end
|
||||
return ""
|
||||
@@ -336,7 +338,7 @@ class PokemonRegionMapScreen
|
||||
end
|
||||
|
||||
def pbStartScreen
|
||||
@scene.pbStartScene($DEBUG)
|
||||
@scene.pbStartScene # ($DEBUG)
|
||||
ret = @scene.pbMapScene
|
||||
@scene.pbEndScene
|
||||
return ret
|
||||
|
||||
@@ -1,358 +0,0 @@
|
||||
#===============================================================================
|
||||
#
|
||||
#===============================================================================
|
||||
class PokemonLoadPanel < Sprite
|
||||
attr_reader :selected
|
||||
|
||||
TEXT_COLOR = Color.new(232, 232, 232)
|
||||
TEXT_SHADOW_COLOR = Color.new(136, 136, 136)
|
||||
MALE_TEXT_COLOR = Color.new(56, 160, 248)
|
||||
MALE_TEXT_SHADOW_COLOR = Color.new(56, 104, 168)
|
||||
FEMALE_TEXT_COLOR = Color.new(240, 72, 88)
|
||||
FEMALE_TEXT_SHADOW_COLOR = Color.new(160, 64, 64)
|
||||
|
||||
def initialize(index, title, isContinue, trainer, stats, mapid, viewport = nil)
|
||||
super(viewport)
|
||||
@index = index
|
||||
@title = title
|
||||
@isContinue = isContinue
|
||||
@trainer = trainer
|
||||
@totalsec = stats&.play_time.to_i || 0
|
||||
@mapid = mapid
|
||||
@selected = (index == 0)
|
||||
@bgbitmap = AnimatedBitmap.new("Graphics/UI/Load/panels")
|
||||
@refreshBitmap = true
|
||||
@refreshing = false
|
||||
refresh
|
||||
end
|
||||
|
||||
def dispose
|
||||
@bgbitmap.dispose
|
||||
self.bitmap.dispose
|
||||
super
|
||||
end
|
||||
|
||||
def selected=(value)
|
||||
return if @selected == value
|
||||
@selected = value
|
||||
@refreshBitmap = true
|
||||
refresh
|
||||
end
|
||||
|
||||
def pbRefresh
|
||||
@refreshBitmap = true
|
||||
refresh
|
||||
end
|
||||
|
||||
def refresh
|
||||
return if @refreshing
|
||||
return if disposed?
|
||||
@refreshing = true
|
||||
if !self.bitmap || self.bitmap.disposed?
|
||||
self.bitmap = Bitmap.new(@bgbitmap.width, 222)
|
||||
pbSetSystemFont(self.bitmap)
|
||||
end
|
||||
if @refreshBitmap
|
||||
@refreshBitmap = false
|
||||
self.bitmap&.clear
|
||||
if @isContinue
|
||||
self.bitmap.blt(0, 0, @bgbitmap.bitmap, Rect.new(0, (@selected) ? 222 : 0, @bgbitmap.width, 222))
|
||||
else
|
||||
self.bitmap.blt(0, 0, @bgbitmap.bitmap, Rect.new(0, 444 + ((@selected) ? 46 : 0), @bgbitmap.width, 46))
|
||||
end
|
||||
textpos = []
|
||||
if @isContinue
|
||||
textpos.push([@title, 32, 16, :left, TEXT_COLOR, TEXT_SHADOW_COLOR])
|
||||
textpos.push([_INTL("Badges:"), 32, 118, :left, TEXT_COLOR, TEXT_SHADOW_COLOR])
|
||||
textpos.push([@trainer.badge_count.to_s, 206, 118, :right, TEXT_COLOR, TEXT_SHADOW_COLOR])
|
||||
textpos.push([_INTL("Pokédex:"), 32, 150, :left, TEXT_COLOR, TEXT_SHADOW_COLOR])
|
||||
textpos.push([@trainer.pokedex.seen_count.to_s, 206, 150, :right, TEXT_COLOR, TEXT_SHADOW_COLOR])
|
||||
textpos.push([_INTL("Time:"), 32, 182, :left, TEXT_COLOR, TEXT_SHADOW_COLOR])
|
||||
hour = @totalsec / 60 / 60
|
||||
min = @totalsec / 60 % 60
|
||||
if hour > 0
|
||||
textpos.push([_INTL("{1}h {2}m", hour, min), 206, 182, :right, TEXT_COLOR, TEXT_SHADOW_COLOR])
|
||||
else
|
||||
textpos.push([_INTL("{1}m", min), 206, 182, :right, TEXT_COLOR, TEXT_SHADOW_COLOR])
|
||||
end
|
||||
if @trainer.male?
|
||||
textpos.push([@trainer.name, 112, 70, :left, MALE_TEXT_COLOR, MALE_TEXT_SHADOW_COLOR])
|
||||
elsif @trainer.female?
|
||||
textpos.push([@trainer.name, 112, 70, :left, FEMALE_TEXT_COLOR, FEMALE_TEXT_SHADOW_COLOR])
|
||||
else
|
||||
textpos.push([@trainer.name, 112, 70, :left, TEXT_COLOR, TEXT_SHADOW_COLOR])
|
||||
end
|
||||
mapname = pbGetMapNameFromId(@mapid)
|
||||
mapname.gsub!(/\\PN/, @trainer.name)
|
||||
textpos.push([mapname, 386, 16, :right, TEXT_COLOR, TEXT_SHADOW_COLOR])
|
||||
else
|
||||
textpos.push([@title, 32, 14, :left, TEXT_COLOR, TEXT_SHADOW_COLOR])
|
||||
end
|
||||
pbDrawTextPositions(self.bitmap, textpos)
|
||||
end
|
||||
@refreshing = false
|
||||
end
|
||||
end
|
||||
|
||||
#===============================================================================
|
||||
#
|
||||
#===============================================================================
|
||||
class PokemonLoad_Scene
|
||||
def pbStartScene(commands, show_continue, trainer, stats, map_id)
|
||||
@commands = commands
|
||||
@sprites = {}
|
||||
@viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
|
||||
@viewport.z = 99998
|
||||
addBackgroundOrColoredPlane(@sprites, "background", "Load/bg", Color.new(248, 248, 248), @viewport)
|
||||
y = 32
|
||||
commands.length.times do |i|
|
||||
@sprites["panel#{i}"] = PokemonLoadPanel.new(
|
||||
i, commands[i], (show_continue) ? (i == 0) : false, trainer, stats, map_id, @viewport
|
||||
)
|
||||
@sprites["panel#{i}"].x = 48
|
||||
@sprites["panel#{i}"].y = y
|
||||
@sprites["panel#{i}"].pbRefresh
|
||||
y += (show_continue && i == 0) ? 224 : 48
|
||||
end
|
||||
@sprites["cmdwindow"] = Window_CommandPokemon.new([])
|
||||
@sprites["cmdwindow"].viewport = @viewport
|
||||
@sprites["cmdwindow"].visible = false
|
||||
@max_party_index = 0
|
||||
end
|
||||
|
||||
def pbStartScene2
|
||||
pbFadeInAndShow(@sprites) { pbUpdate }
|
||||
end
|
||||
|
||||
def pbStartDeleteScene
|
||||
@sprites = {}
|
||||
@viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
|
||||
@viewport.z = 99998
|
||||
addBackgroundOrColoredPlane(@sprites, "background", "Load/bg", Color.new(248, 248, 248), @viewport)
|
||||
end
|
||||
|
||||
def pbUpdate
|
||||
oldi = @sprites["cmdwindow"].index rescue 0
|
||||
pbUpdateSpriteHash(@sprites)
|
||||
newi = @sprites["cmdwindow"].index rescue 0
|
||||
if oldi != newi
|
||||
@sprites["panel#{oldi}"].selected = false
|
||||
@sprites["panel#{oldi}"].pbRefresh
|
||||
@sprites["panel#{newi}"].selected = true
|
||||
@sprites["panel#{newi}"].pbRefresh
|
||||
while @sprites["panel#{newi}"].y > Graphics.height - 80
|
||||
@commands.length.times do |i|
|
||||
@sprites["panel#{i}"].y -= 48
|
||||
end
|
||||
(@max_party_index + 1).times do |i|
|
||||
break if !@sprites["party#{i}"]
|
||||
@sprites["party#{i}"].y -= 48
|
||||
end
|
||||
@sprites["player"].y -= 48 if @sprites["player"]
|
||||
end
|
||||
while @sprites["panel#{newi}"].y < 32
|
||||
@commands.length.times do |i|
|
||||
@sprites["panel#{i}"].y += 48
|
||||
end
|
||||
(@max_party_index + 1).times do |i|
|
||||
break if !@sprites["party#{i}"]
|
||||
@sprites["party#{i}"].y += 48
|
||||
end
|
||||
@sprites["player"].y += 48 if @sprites["player"]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def pbSetParty(trainer)
|
||||
return if !trainer || !trainer.party
|
||||
meta = GameData::PlayerMetadata.get(trainer.character_ID)
|
||||
if meta
|
||||
filename = pbGetPlayerCharset(meta.walk_charset, trainer, true)
|
||||
@sprites["player"] = TrainerWalkingCharSprite.new(filename, @viewport)
|
||||
if !@sprites["player"].bitmap
|
||||
raise _INTL("Player character {1}'s walking charset was not found (filename: \"{2}\").", trainer.character_ID, filename)
|
||||
end
|
||||
charwidth = @sprites["player"].bitmap.width
|
||||
charheight = @sprites["player"].bitmap.height
|
||||
@sprites["player"].x = 112 - (charwidth / 8)
|
||||
@sprites["player"].y = 112 - (charheight / 8)
|
||||
@sprites["player"].z = 99999
|
||||
end
|
||||
trainer.party.each_with_index do |pkmn, i|
|
||||
@sprites["party#{i}"] = PokemonIconSprite.new(pkmn, @viewport)
|
||||
@sprites["party#{i}"].setOffset(PictureOrigin::CENTER)
|
||||
@sprites["party#{i}"].x = 334 + (66 * (i % 2))
|
||||
@sprites["party#{i}"].y = 112 + (50 * (i / 2))
|
||||
@sprites["party#{i}"].z = 99999
|
||||
@max_party_index = i
|
||||
end
|
||||
end
|
||||
|
||||
def pbChoose(commands)
|
||||
@sprites["cmdwindow"].commands = commands
|
||||
loop do
|
||||
Graphics.update
|
||||
Input.update
|
||||
pbUpdate
|
||||
if Input.trigger?(Input::USE)
|
||||
return @sprites["cmdwindow"].index
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def pbEndScene
|
||||
pbFadeOutAndHide(@sprites) { pbUpdate }
|
||||
pbDisposeSpriteHash(@sprites)
|
||||
@viewport.dispose
|
||||
end
|
||||
|
||||
def pbCloseScene
|
||||
pbDisposeSpriteHash(@sprites)
|
||||
@viewport.dispose
|
||||
end
|
||||
end
|
||||
|
||||
#===============================================================================
|
||||
#
|
||||
#===============================================================================
|
||||
class PokemonLoadScreen
|
||||
def initialize(scene)
|
||||
@scene = scene
|
||||
if SaveData.exists?
|
||||
@save_data = load_save_file(SaveData::FILE_PATH)
|
||||
else
|
||||
@save_data = {}
|
||||
end
|
||||
end
|
||||
|
||||
# @param file_path [String] file to load save data from
|
||||
# @return [Hash] save data
|
||||
def load_save_file(file_path)
|
||||
save_data = SaveData.read_from_file(file_path)
|
||||
unless SaveData.valid?(save_data)
|
||||
if File.file?(file_path + ".bak")
|
||||
pbMessage(_INTL("The save file is corrupt. A backup will be loaded."))
|
||||
save_data = load_save_file(file_path + ".bak")
|
||||
else
|
||||
self.prompt_save_deletion
|
||||
return {}
|
||||
end
|
||||
end
|
||||
return save_data
|
||||
end
|
||||
|
||||
# Called if all save data is invalid.
|
||||
# Prompts the player to delete the save files.
|
||||
def prompt_save_deletion
|
||||
pbMessage(_INTL("The save file is corrupt, or is incompatible with this game.") + "\1")
|
||||
exit unless pbConfirmMessageSerious(
|
||||
_INTL("Do you want to delete the save file and start anew?")
|
||||
)
|
||||
self.delete_save_data
|
||||
$game_system = Game_System.new
|
||||
$PokemonSystem = PokemonSystem.new
|
||||
end
|
||||
|
||||
def pbStartDeleteScreen
|
||||
@scene.pbStartDeleteScene
|
||||
@scene.pbStartScene2
|
||||
if SaveData.exists?
|
||||
if pbConfirmMessageSerious(_INTL("Delete all saved data?"))
|
||||
pbMessage(_INTL("Once data has been deleted, there is no way to recover it.") + "\1")
|
||||
if pbConfirmMessageSerious(_INTL("Delete the saved data anyway?"))
|
||||
pbMessage(_INTL("Deleting all data. Don't turn off the power.") + "\\wtnp[0]")
|
||||
self.delete_save_data
|
||||
end
|
||||
end
|
||||
else
|
||||
pbMessage(_INTL("No save file was found."))
|
||||
end
|
||||
@scene.pbEndScene
|
||||
$scene = pbCallTitle
|
||||
end
|
||||
|
||||
def delete_save_data
|
||||
begin
|
||||
SaveData.delete_file
|
||||
pbMessage(_INTL("The saved data was deleted."))
|
||||
rescue SystemCallError
|
||||
pbMessage(_INTL("All saved data could not be deleted."))
|
||||
end
|
||||
end
|
||||
|
||||
def pbStartLoadScreen
|
||||
if $DEBUG && !FileTest.exist?("Game.rgssad") && Settings::SKIP_CONTINUE_SCREEN
|
||||
if @save_data.empty?
|
||||
Game.start_new
|
||||
else
|
||||
Game.load(@save_data)
|
||||
end
|
||||
return
|
||||
end
|
||||
commands = []
|
||||
cmd_continue = -1
|
||||
cmd_new_game = -1
|
||||
cmd_options = -1
|
||||
cmd_language = -1
|
||||
cmd_mystery_gift = -1
|
||||
cmd_debug = -1
|
||||
cmd_quit = -1
|
||||
show_continue = !@save_data.empty?
|
||||
if show_continue
|
||||
commands[cmd_continue = commands.length] = _INTL("Continue")
|
||||
if @save_data[:player].mystery_gift_unlocked
|
||||
commands[cmd_mystery_gift = commands.length] = _INTL("Mystery Gift")
|
||||
end
|
||||
end
|
||||
commands[cmd_new_game = commands.length] = _INTL("New Game")
|
||||
commands[cmd_options = commands.length] = _INTL("Options")
|
||||
commands[cmd_language = commands.length] = _INTL("Language") if Settings::LANGUAGES.length >= 2
|
||||
commands[cmd_debug = commands.length] = _INTL("Debug") if $DEBUG
|
||||
commands[cmd_quit = commands.length] = _INTL("Quit Game")
|
||||
map_id = show_continue ? @save_data[:map_factory].map.map_id : 0
|
||||
@scene.pbStartScene(commands, show_continue, @save_data[:player], @save_data[:stats], map_id)
|
||||
@scene.pbSetParty(@save_data[:player]) if show_continue
|
||||
@scene.pbStartScene2
|
||||
loop do
|
||||
command = @scene.pbChoose(commands)
|
||||
pbPlayDecisionSE if command != cmd_quit
|
||||
case command
|
||||
when cmd_continue
|
||||
@scene.pbEndScene
|
||||
Game.load(@save_data)
|
||||
return
|
||||
when cmd_new_game
|
||||
@scene.pbEndScene
|
||||
Game.start_new
|
||||
return
|
||||
when cmd_mystery_gift
|
||||
pbFadeOutIn { pbDownloadMysteryGift(@save_data[:player]) }
|
||||
when cmd_options
|
||||
pbFadeOutIn do
|
||||
scene = PokemonOption_Scene.new
|
||||
screen = PokemonOptionScreen.new(scene)
|
||||
screen.pbStartScreen(true)
|
||||
end
|
||||
when cmd_language
|
||||
@scene.pbEndScene
|
||||
$PokemonSystem.language = pbChooseLanguage
|
||||
MessageTypes.load_message_files(Settings::LANGUAGES[$PokemonSystem.language][1])
|
||||
if show_continue
|
||||
@save_data[:pokemon_system] = $PokemonSystem
|
||||
File.open(SaveData::FILE_PATH, "wb") { |file| Marshal.dump(@save_data, file) }
|
||||
end
|
||||
$scene = pbCallTitle
|
||||
return
|
||||
when cmd_debug
|
||||
pbFadeOutIn { pbDebugMenu(false) }
|
||||
when cmd_quit
|
||||
pbPlayCloseMenuSE
|
||||
@scene.pbEndScene
|
||||
$scene = nil
|
||||
return
|
||||
else
|
||||
pbPlayBuzzerSE
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -392,7 +392,7 @@ MenuHandlers.add(:options_menu, :bgm_volume, {
|
||||
"set_proc" => proc { |value, scene|
|
||||
next if $PokemonSystem.bgmvolume == value
|
||||
$PokemonSystem.bgmvolume = value
|
||||
next if scene.in_load_screen || $game_system.playing_bgm.nil?
|
||||
next if scene.in_load_screen || !$game_system || $game_system.playing_bgm.nil?
|
||||
playingBGM = $game_system.getPlayingBGM
|
||||
$game_system.bgm_pause
|
||||
$game_system.bgm_resume(playingBGM)
|
||||
@@ -409,7 +409,7 @@ MenuHandlers.add(:options_menu, :se_volume, {
|
||||
"set_proc" => proc { |value, _scene|
|
||||
next if $PokemonSystem.sevolume == value
|
||||
$PokemonSystem.sevolume = value
|
||||
if $game_system.playing_bgs
|
||||
if $game_system && $game_system.playing_bgs
|
||||
$game_system.playing_bgs.volume = value
|
||||
playingBGS = $game_system.getPlayingBGS
|
||||
$game_system.bgs_pause
|
||||
|
||||
Reference in New Issue
Block a user