mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
277 lines
9.9 KiB
Ruby
277 lines
9.9 KiB
Ruby
class BattleSpriteLoader
|
|
def initialize
|
|
@download_allowed = true
|
|
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
|
|
|
|
#random alt
|
|
def load_pif_sprite(pif_sprite)
|
|
case pif_sprite.type
|
|
when :CUSTOM, :AUTOGEN
|
|
load_fusion_sprite(pif_sprite.head_id, pif_sprite.body_id)
|
|
when :BASE
|
|
load_base_sprite(pif_sprite.head_id)
|
|
end
|
|
end
|
|
|
|
# Only preloads if the pokemon's sprite has been assigned an alt letter
|
|
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
|
|
pif_sprite = $PokemonGlobal.alt_sprite_substitutions[substitution_id] if $PokemonGlobal
|
|
if !pif_sprite
|
|
pif_sprite = get_pif_sprite_from_species(pokemon.species)
|
|
end
|
|
preload(pif_sprite)
|
|
end
|
|
|
|
#loads a sprite into cache without actually returning it
|
|
# Does not download spritesheet
|
|
def preload(pif_sprite)
|
|
echoln "preloading"
|
|
previous_download_allowed = @download_allowed
|
|
@download_allowed = false
|
|
load_pif_sprite(pif_sprite)
|
|
@download_allowed = previous_download_allowed
|
|
end
|
|
|
|
def clear_sprites_cache(type)
|
|
extractor = get_sprite_extractor_instance(type)
|
|
extractor.clear_cache
|
|
end
|
|
|
|
def load_from_dex_number(dex_number)
|
|
if dex_number > NB_POKEMON
|
|
if dex_number > ZAPMOLCUNO_NB #Triple Fusion
|
|
return load_triple_fusion_sprite(dex_number)
|
|
else
|
|
#Regular fusion
|
|
body_id = getBodyID(dex_number)
|
|
head_id = getHeadID(dex_number, body_id)
|
|
return load_fusion_sprite(head_id, body_id)
|
|
end
|
|
else
|
|
#base pokemon
|
|
return load_base_sprite(dex_number)
|
|
end
|
|
end
|
|
|
|
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)
|
|
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)
|
|
if !loaded_sprite
|
|
loaded_sprite = handle_unloaded_sprites(extractor,pif_sprite)
|
|
end
|
|
return loaded_sprite
|
|
end
|
|
|
|
def load_base_sprite(dex_number)
|
|
substitution_id = get_sprite_substitution_id_from_dex_number(dex_number)
|
|
pif_sprite = $PokemonGlobal.alt_sprite_substitutions[substitution_id] if $PokemonGlobal
|
|
if !pif_sprite
|
|
pif_sprite = select_new_pif_base_sprite(dex_number)
|
|
$PokemonGlobal.alt_sprite_substitutions[substitution_id] = pif_sprite if $PokemonGlobal
|
|
end
|
|
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)
|
|
if !loaded_sprite
|
|
loaded_sprite = handle_unloaded_sprites(extractor,pif_sprite)
|
|
end
|
|
return loaded_sprite
|
|
end
|
|
|
|
def handle_unloaded_sprites(extractor,pif_sprite)
|
|
if(extractor.is_a?(CustomSpriteExtracter)) #Custom failed to load, load an autogen (which should always be there)
|
|
new_extractor = get_sprite_extractor_instance(:AUTOGEN)
|
|
return new_extractor.load_sprite(pif_sprite)
|
|
else
|
|
$Trainer.seen_qmarks_sprite=true if $Trainer
|
|
#If autogen or base sprite aren't able to load a sprite then we have nothing else to load -> show a ? instead.
|
|
return AnimatedBitmap.new(Settings::DEFAULT_SPRITE_PATH)
|
|
end
|
|
end
|
|
|
|
|
|
#Always loaded from local individual sprites
|
|
def load_triple_fusion_sprite(dex_number)
|
|
sprite_path = getSpecialSpriteName(dex_number)
|
|
return AnimatedBitmap.new(sprite_path)
|
|
end
|
|
|
|
def get_sprite_extractor_instance(type)
|
|
case type
|
|
when :AUTOGEN
|
|
return AutogenExtracter.instance
|
|
when :CUSTOM
|
|
return CustomSpriteExtracter.instance
|
|
when :BASE
|
|
return BaseSpriteExtracter.instance
|
|
else
|
|
raise ArgumentError, "Unknown sprite type: #{type}"
|
|
end
|
|
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
|
|
sprite_path = "#{Settings::CUSTOM_BATTLERS_FOLDER_INDEXED}#{pif_sprite.head_id}/#{pif_sprite.head_id}.#{pif_sprite.body_id}#{pif_sprite.alt_letter}.png"
|
|
end
|
|
return pbResolveBitmap(sprite_path)
|
|
end
|
|
|
|
def get_pif_sprite_from_species(species)
|
|
species = GameData::Species.get(species)
|
|
head_id = species.get_head_species
|
|
body_id = species.get_body_species
|
|
|
|
substitution_id = get_sprite_substitution_id_for_fusion(head_id, body_id)
|
|
pif_sprite = $PokemonGlobal.alt_sprite_substitutions[substitution_id] if $PokemonGlobal
|
|
return pif_sprite if pif_sprite
|
|
if species.id_number <= NB_POKEMON #base pokemon
|
|
return select_new_pif_base_sprite(head_id)
|
|
else #isFusion
|
|
return select_new_pif_fusion_sprite(head_id, body_id)
|
|
end
|
|
end
|
|
|
|
#
|
|
# Flow:
|
|
# # if none found, look for custom sprite in custom spritesheet (download if can't find spritesheet or new spritepack released)
|
|
# if none found, load from autogen spritesheet
|
|
|
|
def select_new_pif_fusion_sprite(head_id, body_id)
|
|
species_symbol = "B#{body_id}H#{head_id}".to_sym
|
|
spritename = get_fusion_spritename(head_id,body_id)
|
|
customSpritesList = $game_temp.custom_sprites_list[species_symbol]
|
|
alt_letter = ""
|
|
if customSpritesList
|
|
alt_letter = get_random_alt_letter_for_custom(head_id,body_id,true)
|
|
type = :CUSTOM
|
|
type = :AUTOGEN if !alt_letter
|
|
else
|
|
type = :AUTOGEN
|
|
end
|
|
if $PokemonTemp.forced_alt_sprites && $PokemonTemp.forced_alt_sprites.include?(spritename)
|
|
alt_letter = $PokemonTemp.forced_alt_sprites[spritename]
|
|
end
|
|
return PIFSprite.new(type, head_id, body_id, alt_letter)
|
|
end
|
|
|
|
def select_new_pif_base_sprite(dex_number)
|
|
random_alt = get_random_alt_letter_for_unfused(dex_number, true) #nil if no main
|
|
random_alt = "" if !random_alt
|
|
return PIFSprite.new(:BASE, dex_number, nil, random_alt)
|
|
end
|
|
|
|
def getSpecialSpriteName(dexNum)
|
|
base_path = "Graphics/Battlers/special/"
|
|
case dexNum
|
|
when Settings::ZAPMOLCUNO_NB
|
|
return sprintf(base_path + "144.145.146")
|
|
when Settings::ZAPMOLCUNO_NB + 1
|
|
return sprintf(base_path + "144.145.146")
|
|
when Settings::ZAPMOLCUNO_NB + 2
|
|
return sprintf(base_path + "243.244.245")
|
|
when Settings::ZAPMOLCUNO_NB + 3
|
|
return sprintf(base_path +"340.341.342")
|
|
when Settings::ZAPMOLCUNO_NB + 4
|
|
return sprintf(base_path +"343.344.345")
|
|
when Settings::ZAPMOLCUNO_NB + 5
|
|
return sprintf(base_path +"349.350.351")
|
|
when Settings::ZAPMOLCUNO_NB + 6
|
|
return sprintf(base_path +"151.251.381")
|
|
when Settings::ZAPMOLCUNO_NB + 11
|
|
return sprintf(base_path +"150.348.380")
|
|
#starters
|
|
when Settings::ZAPMOLCUNO_NB + 7
|
|
return sprintf(base_path +"3.6.9")
|
|
when Settings::ZAPMOLCUNO_NB + 8
|
|
return sprintf(base_path +"154.157.160")
|
|
when Settings::ZAPMOLCUNO_NB + 9
|
|
return sprintf(base_path +"278.281.284")
|
|
when Settings::ZAPMOLCUNO_NB + 10
|
|
return sprintf(base_path +"318.321.324")
|
|
#starters prevos
|
|
when Settings::ZAPMOLCUNO_NB + 12
|
|
return sprintf(base_path +"1.4.7")
|
|
when Settings::ZAPMOLCUNO_NB + 13
|
|
return sprintf(base_path +"2.5.8")
|
|
when Settings::ZAPMOLCUNO_NB + 14
|
|
return sprintf(base_path +"152.155.158")
|
|
when Settings::ZAPMOLCUNO_NB + 15
|
|
return sprintf(base_path +"153.156.159")
|
|
when Settings::ZAPMOLCUNO_NB + 16
|
|
return sprintf(base_path +"276.279.282")
|
|
when Settings::ZAPMOLCUNO_NB + 17
|
|
return sprintf(base_path +"277.280.283")
|
|
when Settings::ZAPMOLCUNO_NB + 18
|
|
return sprintf(base_path +"316.319.322")
|
|
when Settings::ZAPMOLCUNO_NB + 19
|
|
return sprintf(base_path +"317.320.323")
|
|
when Settings::ZAPMOLCUNO_NB + 20 #birdBoss Left
|
|
return sprintf(base_path +"invisible")
|
|
when Settings::ZAPMOLCUNO_NB + 21 #birdBoss middle
|
|
return sprintf(base_path + "144.145.146")
|
|
when Settings::ZAPMOLCUNO_NB + 22 #birdBoss right
|
|
return sprintf(base_path +"invisible")
|
|
when Settings::ZAPMOLCUNO_NB + 23 #sinnohboss left
|
|
return sprintf(base_path +"invisible")
|
|
when Settings::ZAPMOLCUNO_NB + 24 #sinnohboss middle
|
|
return sprintf(base_path +"343.344.345")
|
|
when Settings::ZAPMOLCUNO_NB + 25 #sinnohboss right
|
|
return sprintf(base_path +"invisible")
|
|
when Settings::ZAPMOLCUNO_NB + 25 #cardboard
|
|
return sprintf(base_path +"invisible")
|
|
when Settings::ZAPMOLCUNO_NB + 26 #cardboard
|
|
return sprintf(base_path + "cardboard")
|
|
when Settings::ZAPMOLCUNO_NB + 27 #Triple regi
|
|
return sprintf(base_path + "447.448.449")
|
|
#Triple Kalos 1
|
|
when Settings::ZAPMOLCUNO_NB + 28
|
|
return sprintf(base_path + "479.482.485")
|
|
when Settings::ZAPMOLCUNO_NB + 29
|
|
return sprintf(base_path + "480.483.486")
|
|
when Settings::ZAPMOLCUNO_NB + 30
|
|
return sprintf(base_path + "481.484.487")
|
|
else
|
|
return sprintf(base_path + "000")
|
|
end
|
|
end
|
|
end
|