Fixes sprite importing

This commit is contained in:
infinitefusion
2025-01-02 14:09:09 -05:00
parent 804578f4e3
commit f9f6f35236
9 changed files with 146 additions and 210 deletions

View File

@@ -22,7 +22,7 @@ module Settings
#Infinite fusion settings
NB_POKEMON = 501
CUSTOM_BASE_SPRITES_FOLDER = "Graphics/CustomBattlers/local_spritesBaseSprites/"
CUSTOM_BASE_SPRITES_FOLDER = "Graphics/CustomBattlers/local_sprites/BaseSprites/"
CUSTOM_BATTLERS_FOLDER = "Graphics/CustomBattlers/"
CUSTOM_SPRITES_TO_IMPORT_FOLDER = "Graphics/CustomBattlers/Sprites to import/"
CUSTOM_BATTLERS_FOLDER_INDEXED = "Graphics/CustomBattlers/local_sprites/indexed/"

View File

@@ -111,7 +111,7 @@ class DoublePreviewScreen
spriteLoader = BattleSpriteLoader.new
bitmap = spriteLoader.load_fusion_sprite(head_pokemon,body_pokemon)
bitmap.scale_bitmap(Settings::FRONTSPRITE_SCALE)
pif_sprite = spriteLoader.obtain_fusion_pif_sprite(head_pokemon,body_pokemon)
#hasCustom = picturePath.include?("CustomBattlers")
#hasCustom = customSpriteExistsBase(body_pokemon,head_pokemon)
hasCustom = customSpriteExists(body_pokemon,head_pokemon)
@@ -123,10 +123,12 @@ class DoublePreviewScreen
drawFusionInformation(dexNumber, level, x)
if !$Trainer.seen?(dexNumber)
if hasCustom
previewwindow.picture.pbSetColor(150, 255, 150, 200)
if pif_sprite.local_path()
previewwindow.picture.pbSetColor(170, 200, 250, 200) #blue
elsif hasCustom
previewwindow.picture.pbSetColor(150, 255, 150, 200) #green
else
previewwindow.picture.pbSetColor(255, 255, 255, 200)
previewwindow.picture.pbSetColor(255, 255, 255, 200) #white
end
end
return previewwindow

View File

@@ -954,6 +954,7 @@ end
def drawSpriteCredits(pif_sprite, viewport)
overlay = BitmapSprite.new(Graphics.width, Graphics.height, @viewport).bitmap
return if pif_sprite.type == :AUTOGEN
return if pif_sprite.local_path
x = Graphics.width / 2
y = 240
spritename = pif_sprite.to_filename()

View File

@@ -96,36 +96,3 @@ class PIFSpriteExtracter
class PokemonGlobalMetadata
attr_accessor :current_spritepack_date
end
# class SpritesBitmapCache
# @@cache = {} # Cache storage for spritesheets
# @@usage_order = [] # Tracks usage order for LRU eviction
#
# def self.fetch(key)
# if @@cache.key?(key)
# # Move key to the end to mark it as recently used
# @@usage_order.delete(key)
# @@usage_order << key
# return @@cache[key]
# end
#
# # Load spritesheet via block if not found in cache
# spritesheet = yield
#
# if @@cache.size >= Settings::SPRITE_CACHE_MAX_NB
# # Evict least recently used (first in order)
# oldest_key = @@usage_order.shift
# @@cache.delete(oldest_key)
# echoln "Evicted: #{oldest_key} from spritesheet cache"
# end
#
# # Add new spritesheet to cache and track its usage
# @@cache[key] = spritesheet
# @@usage_order << key
# spritesheet
# end
# end

View File

@@ -4,6 +4,9 @@ class BattleSpriteLoader
end
def load_pif_sprite_directly(pif_sprite)
if pif_sprite.local_path && pbResolveBitmap(pif_sprite.local_path)
return AnimatedBitmap.new(pif_sprite.local_path)
end
extractor = get_sprite_extractor_instance(pif_sprite.type)
return extractor.load_sprite(pif_sprite)
end
@@ -22,8 +25,8 @@ class BattleSpriteLoader
def preload_sprite_from_pokemon(pokemon)
return if !pokemon
substitution_id = get_sprite_substitution_id_from_dex_number(pokemon.species)
echoln substitution_id
echoln $PokemonGlobal.alt_sprite_substitutions
# echoln substitution_id
# echoln $PokemonGlobal.alt_sprite_substitutions
pif_sprite = $PokemonGlobal.alt_sprite_substitutions[substitution_id] if $PokemonGlobal
if !pif_sprite
pif_sprite = get_pif_sprite_from_species(pokemon.species)
@@ -65,19 +68,25 @@ class BattleSpriteLoader
def obtain_fusion_pif_sprite(head_id,body_id)
substitution_id = get_sprite_substitution_id_for_fusion(head_id, body_id)
pif_sprite = $PokemonGlobal.alt_sprite_substitutions[substitution_id] if $PokemonGlobal
pif_sprite.dump_info if pif_sprite
if !pif_sprite
pif_sprite = select_new_pif_fusion_sprite(head_id, body_id)
local_path = check_for_local_sprite(pif_sprite)
if local_path
pif_sprite.local_path = local_path
pif_sprite.type = :CUSTOM
end
substitution_id = get_sprite_substitution_id_for_fusion(head_id, body_id)
$PokemonGlobal.alt_sprite_substitutions[substitution_id] = pif_sprite if $PokemonGlobal
end
return pif_sprite
end
def load_fusion_sprite(head_id, body_id)
pif_sprite = obtain_fusion_pif_sprite(head_id,body_id)
local_path = check_for_local_sprite(pif_sprite)
if local_path
return AnimatedBitmap.new(local_path)
if pif_sprite.local_path
return AnimatedBitmap.new(pif_sprite.local_path)
end
extractor = get_sprite_extractor_instance(pif_sprite.type)
loaded_sprite = extractor.load_sprite(pif_sprite, @download_allowed)
@@ -94,9 +103,8 @@ class BattleSpriteLoader
pif_sprite = select_new_pif_base_sprite(dex_number)
$PokemonGlobal.alt_sprite_substitutions[substitution_id] = pif_sprite if $PokemonGlobal
end
local_path = check_for_local_sprite(pif_sprite)
if local_path
return AnimatedBitmap.new(local_path)
if pif_sprite.local_path
return AnimatedBitmap.new(pif_sprite.local_path)
end
extractor = get_sprite_extractor_instance(pif_sprite.type)
loaded_sprite = extractor.load_sprite(pif_sprite)
@@ -137,6 +145,7 @@ class BattleSpriteLoader
end
def check_for_local_sprite(pif_sprite)
return pif_sprite.local_path if pif_sprite.local_path
if pif_sprite.type == :BASE
sprite_path = "#{Settings::CUSTOM_BASE_SPRITES_FOLDER}#{pif_sprite.head_id}#{pif_sprite.alt_letter}.png"
else

View File

@@ -4,6 +4,7 @@ class PIFSprite
attr_accessor :head_id
attr_accessor :body_id
attr_accessor :alt_letter
attr_accessor :local_path
#types:
# :AUTOGEN, :CUSTOM, :BASE
@@ -12,8 +13,24 @@ class PIFSprite
@head_id = head_id
@body_id = body_id
@alt_letter = alt_letter
@local_path = nil
end
def dump_info()
echoln "Type: #{@type}"
echoln "Head: #{@head_id}"
echoln "Body: #{@body_id}"
echoln "Alt letter: #{@alt_letter}"
echoln "Local path: #{@local_path}"
end
def equals(other_pif_sprite)
return @type == other_pif_sprite.type &&
@head_id == other_pif_sprite.head_id &&
@body_id == other_pif_sprite.body_id &&
@alt_letter == other_pif_sprite.alt_letter &&
@local_path == other_pif_sprite.local_path
end
#little hack for old methods that expect a filename for a sprite
def to_filename()
@@ -46,7 +63,6 @@ class PIFSprite
obj
end
end
def new_pif_sprite_from_dex_num(type, dexNum, alt_letter)
@@ -55,8 +71,6 @@ def new_pif_sprite_from_dex_num(type, dexNum,alt_letter)
return PIFSprite.new(type, head_id, body_id, alt_letter)
end
def pif_sprite_from_spritename(spritename, autogen = false)
spritename = spritename.split(".png")[0] #remove the extension
if spritename =~ /^(\d+)\.(\d+)([a-zA-Z]*)$/ # Two numbers with optional letters

View File

@@ -378,9 +378,7 @@ class PokemonLoadScreen
def check_for_spritepack_update()
$updated_spritesheets = [] if !$updated_spritesheets
echoln "wawawa"
if new_spritepack_was_released()
echoln "waaaah!"
reset_updated_spritesheets_cache()
$updated_spritesheets = []
end
@@ -443,8 +441,6 @@ class PokemonLoadScreen
handleReplaceExistingSprites()
end
if ($game_temp.nb_imported_sprites && $game_temp.nb_imported_sprites > 0)
echoln $game_temp.nb_imported_sprites
echoln $game_temp.nb_imported_sprites.to_s
pbMessage(_INTL("{1} new custom sprites were imported into the game", $game_temp.nb_imported_sprites.to_s))
end
checkEnableSpritesDownload

View File

@@ -12,16 +12,43 @@ class PokedexUtils
return $game_temp.base_sprites_list[dex_number]
end
def getLocalBaseSpriteAlts(dex_number)
local_sprite_alts = []
baseFilename = "#{dex_number}"
possible_alt_letters = getAltLettersList()
possible_alt_letters << ""
possible_alt_letters.each { |alt_letter|
spritename = "#{baseFilename}#{alt_letter}"
local_path = "#{Settings::CUSTOM_BASE_SPRITES_FOLDER}/#{spritename}.png"
if pbResolveBitmap(local_path)
local_sprite_alts << getLocalSpriteID(local_path)
end
}
return local_sprite_alts
end
def getLocalFusionSpriteAlts(head_id,body_id)
local_sprite_alts = []
baseFilename = "#{head_id}.#{body_id}"
possible_alt_letters = getAltLettersList()
possible_alt_letters << ""
possible_alt_letters.each { |alt_letter|
spritename = "#{baseFilename}#{alt_letter}"
local_path = "#{Settings::CUSTOM_BATTLERS_FOLDER_INDEXED}/#{head_id.to_s}/#{spritename}.png"
if pbResolveBitmap(local_path)
local_sprite_alts << getLocalSpriteID(local_path)
end
}
return local_sprite_alts
end
def getLocalSpriteID(sprite_path)
return "local_#{sprite_path}"
end
def getFusionSpriteAlts(head_id, body_id)
sprite_id = get_fusion_symbol(head_id,body_id)
return $game_temp.custom_sprites_list[sprite_id]
# available_alts = []
# species_id = get_fusion_id(head_id,body_id).to_s
# for pokemon_id in $game_temp.custom_sprites_list
# available_alts << pokemon_id if pokemon_id.to_s.start_with?(species_id)
# end
# echoln available_alts
# return available_alts
end
def pbGetAvailableAlts(species, includeAutogens=false)
@@ -30,49 +57,19 @@ class PokedexUtils
body_id = getBodyID(dex_number)
head_id = getHeadID(dex_number,body_id)
available_alts = getFusionSpriteAlts(head_id,body_id)
available_alts = [] if !available_alts
local_alts = getLocalFusionSpriteAlts(head_id,body_id)
else
available_alts= getBaseSpritesAlts(dex_number)
end
available_alts = [] if !available_alts
local_alts = getLocalBaseSpriteAlts(dex_number)
end
available_alts += local_alts if local_alts
available_alts << "autogen" if includeAutogens
return available_alts
# ret = []
# return ret if !species
# dexNum = getDexNumberForSpecies(species)
# isFusion = dexNum > NB_POKEMON
# if !isFusion
# altLetters = getAltLettersList()
# altLetters << ""
# altLetters.each { |alt_letter|
# altFilePath = Settings::CUSTOM_BASE_SPRITES_FOLDER + dexNum.to_s + alt_letter + ".png"
# if pbResolveBitmap(altFilePath)
# ret << altFilePath
# end
# }
# return ret
# end
# body_id = getBodyID(species)
# head_id = getHeadID(species, body_id)
#
# baseFilename = head_id.to_s + "." + body_id.to_s
# baseFilePath = Settings::CUSTOM_BATTLERS_FOLDER_INDEXED + head_id.to_s + "/" + baseFilename + ".png"
# if pbResolveBitmap(baseFilePath)
# ret << baseFilePath
# end
# getAltLettersList().each { |alt_letter|
# if alt_letter != "" #empty is included in alt letters because unfused sprites can be alts and not have a letter
# altFilePath = Settings::CUSTOM_BATTLERS_FOLDER_INDEXED + head_id.to_s + "/" + baseFilename + alt_letter + ".png"
# if pbResolveBitmap(altFilePath)
# ret << altFilePath
# end
# end
# }
# ret << Settings::BATTLERS_FOLDER + head_id.to_s + "/" + baseFilename + ".png"
# return ret
end
#todo: return array for split evolution lines that have multiple final evos
def getFinalEvolution(species)
#ex: [[B3H4,Level 32],[B2H5, Level 35]]

View File

@@ -110,13 +110,6 @@ class PokemonPokedexInfo_Scene
return nil
end
# def get_currently_selected_sprite()
# species_dex = getDexNumberForSpecies(@species).to_s
# initialize_alt_sprite_substitutions()
# substitution_id = getSpritesSubstutionFromSpecies(species_dex)
# return $PokemonGlobal.alt_sprite_substitutions[substitution_id]
# end
def get_substitution_id(dex_number)
if isFusion(dex_number)
body_id = getBodyID(dex_number)
@@ -164,6 +157,9 @@ class PokemonPokedexInfo_Scene
previous_index = @selected_index == 0 ? @available.size - 1 : @selected_index - 1
next_index = @selected_index == @available.size - 1 ? 0 : @selected_index + 1
echoln "selected sprite:"
get_pif_sprite(@available[@selected_index]).dump_info()
@sprites["bgSelected_previous"].visible = true if is_main_sprite(previous_index) && @available.size > 2
@sprites["bgSelected_center"].visible = true if is_main_sprite(@selected_index)
@sprites["bgSelected_next"].visible = true if is_main_sprite(next_index) && @available.size > 1
@@ -174,17 +170,29 @@ class PokemonPokedexInfo_Scene
if isFusion(dex_number)
body_id = getBodyID(dex_number)
head_id = getHeadID(dex_number, body_id)
#Autogen sprite
if alt_letter == "autogen"
pif_sprite = PIFSprite.new(:AUTOGEN, head_id, body_id)
#Imported custom sprite
else
#Spritesheet custom sprite
pif_sprite = PIFSprite.new(:CUSTOM, head_id, body_id, alt_letter)
end
else
pif_sprite = PIFSprite.new(:BASE, dex_number, nil, alt_letter)
end
#use local sprites instead if they exist
if alt_letter && isLocalSprite(alt_letter)
sprite_path = alt_letter.split("_", 2)[1]
pif_sprite.local_path = sprite_path
end
return pif_sprite
end
def isLocalSprite(alt_letter)
return alt_letter.start_with?("local_")
end
def isBaseSpritePath(path)
filename = File.basename(path).downcase
return filename.match?(/\A\d+\.png\Z/)
@@ -199,10 +207,9 @@ class PokemonPokedexInfo_Scene
if previousIndex < 0
previousIndex = @available.size - 1
end
# @sprites["previousSprite"].visible = @available.size > 2
# @sprites["nextSprite"].visible = @available.size > 1
@selected_pif_sprite = get_pif_sprite(@available[@selected_index])
@previous_pif_sprite = get_pif_sprite(@available[previousIndex])
@next_pif_sprite = get_pif_sprite(@available[nextIndex])
@@ -234,7 +241,7 @@ class PokemonPokedexInfo_Scene
#todo give credits to Japeal - need to differenciate unfused sprites
discord_name = "" #"Japeal\n(Generated)"
end
discord_name = "Imported sprite" if @selected_pif_sprite.local_path
author_name = File.basename(discord_name, '#*')
label_base_color = Color.new(248, 248, 248)
@@ -311,30 +318,20 @@ class PokemonPokedexInfo_Scene
@sprites["downarrow"].visible = false
end
# def is_main_sprite(index = nil)
# return false if !@available
# if index == nil
# index = @selected_index
# end
# return true if @available.size <= 1
# if @speciesData.always_use_generated
# selected_sprite = @available[index]
# return selected_sprite.start_with?(Settings::BATTLERS_FOLDER)
# end
# return index == 0
# end
def is_main_sprite(index = nil)
dex_number = getDexNumberForSpecies(@species)
if !index
index = @selected_index
end
selected_sprite = @available[index]
species_id = get_substitution_id(dex_number)
if $PokemonGlobal.alt_sprite_substitutions[species_id]
return $PokemonGlobal.alt_sprite_substitutions[species_id].alt_letter == selected_sprite
current_pif_sprite = $PokemonGlobal.alt_sprite_substitutions[species_id]
selected_pif_sprite = get_pif_sprite(@available[index])
if current_pif_sprite
return current_pif_sprite.equals(selected_pif_sprite)
end
return false
end
def sprite_is_alt(sprite_path)
@@ -344,7 +341,7 @@ class PokemonPokedexInfo_Scene
def select_sprite(brief = false)
if @available.length > 1
if is_main_sprite
if is_main_sprite()
if brief
pbMessage("This sprite will remain the displayed sprite")
return true
@@ -365,59 +362,12 @@ class PokemonPokedexInfo_Scene
end
def swap_main_sprite
old_main_sprite = @available[0]
new_alt_letter = @available[@selected_index]
species_number = dexNum(@species)
substitution_id = get_substitution_id(species_number)
$PokemonGlobal.alt_sprite_substitutions[substitution_id] = @selected_pif_sprite
end
# def swap_main_sprite
# begin
# old_main_sprite = @available[0]
# new_main_sprite = @available[@selected_index]
#
# if main_sprite_is_non_custom()
# @speciesData.set_always_use_generated_sprite(false)
# return
# # new_name_without_ext = File.basename(old_main_sprite, ".png")
# # new_name_without_letter=new_name_without_ext.chop
# # File.rename(new_main_sprite, Settings::CUSTOM_BATTLERS_FOLDER+new_name_without_letter + ".png")
# end
#
# if new_main_sprite.start_with?(Settings::BATTLERS_FOLDER)
# @speciesData.set_always_use_generated_sprite(true)
# return
# # new_name_without_ext = File.basename(old_main_sprite, ".png")
# # File.rename(old_main_sprite, Settings::CUSTOM_BATTLERS_FOLDER+new_name_without_ext+"x" + ".png")x
# # return
# end
# File.rename(new_main_sprite, new_main_sprite + "temp")
# File.rename(old_main_sprite, new_main_sprite)
# File.rename(new_main_sprite + "temp", old_main_sprite)
# rescue
# pbMessage("There was an error while swapping the sprites. Please save and restart the game as soon as possible.")
# end
# end
# def main_sprite_is_non_custom()
# speciesData = getSpecies(@species)
# return speciesData.always_use_generated || @available.size <= 1
# end
end
class PokemonGlobalMetadata
attr_accessor :alt_sprite_substitutions
end
# def set_alt_sprite_substitution(original_sprite_name, selected_alt, formIndex = 0)
# if !$PokemonGlobal.alt_sprite_substitutions
# initialize_alt_sprite_substitutions()
# end
# if formIndex
# form_suffix = formIndex != 0 ? "_" + formIndex.to_s : ""
# else
# form_suffix = ""
# end
# $PokemonGlobal.alt_sprite_substitutions[original_sprite_name.to_s + form_suffix] = selected_alt
# end