mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
262 lines
9.5 KiB
Ruby
262 lines
9.5 KiB
Ruby
#===============================================================================
|
|
# * Egg Hatch Animation - by FL (Credits will be apreciated)
|
|
# Tweaked by Maruno
|
|
#===============================================================================
|
|
# This script is for Pokémon Essentials. It's an egg hatch animation that
|
|
# works even with special eggs like Manaphy egg.
|
|
#===============================================================================
|
|
# To this script works, put it above Main and put a picture (a 5 frames
|
|
# sprite sheet) with egg sprite height and 5 times the egg sprite width at
|
|
# Graphics/Battlers/eggCracks.
|
|
#===============================================================================
|
|
class PokemonEggHatch_Scene
|
|
def pbStartScene(pokemon)
|
|
@sprites = {}
|
|
@pokemon = pokemon
|
|
@nicknamed = false
|
|
@viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
|
|
@viewport.z = 99999
|
|
# Create background image
|
|
addBackgroundOrColoredPlane(@sprites, "background", "hatch_bg",
|
|
Color.new(248, 248, 248), @viewport)
|
|
# Create egg sprite/Pokémon sprite
|
|
@sprites["pokemon"] = PokemonSprite.new(@viewport)
|
|
@sprites["pokemon"].setOffset(PictureOrigin::BOTTOM)
|
|
@sprites["pokemon"].x = Graphics.width / 2
|
|
@sprites["pokemon"].y = 264 + 56 # 56 to offset the egg sprite
|
|
@sprites["pokemon"].setSpeciesBitmap(@pokemon.species, @pokemon.gender,
|
|
@pokemon.form, @pokemon.shiny?,
|
|
false, false, true) # Egg sprite
|
|
# Load egg cracks bitmap
|
|
crackfilename = GameData::Species.egg_cracks_sprite_filename(@pokemon.species, @pokemon.form)
|
|
@hatchSheet = AnimatedBitmap.new(crackfilename)
|
|
# Create egg cracks sprite
|
|
@sprites["hatch"] = Sprite.new(@viewport)
|
|
@sprites["hatch"].x = @sprites["pokemon"].x
|
|
@sprites["hatch"].y = @sprites["pokemon"].y
|
|
@sprites["hatch"].ox = @sprites["pokemon"].ox
|
|
@sprites["hatch"].oy = @sprites["pokemon"].oy
|
|
@sprites["hatch"].bitmap = @hatchSheet.bitmap
|
|
@sprites["hatch"].src_rect = Rect.new(0, 0, @hatchSheet.width / 5, @hatchSheet.height)
|
|
@sprites["hatch"].visible = false
|
|
# Create flash overlay
|
|
@sprites["overlay"] = BitmapSprite.new(Graphics.width, Graphics.height, @viewport)
|
|
@sprites["overlay"].z = 200
|
|
@sprites["overlay"].bitmap = Bitmap.new(Graphics.width, Graphics.height)
|
|
@sprites["overlay"].bitmap.fill_rect(0, 0, Graphics.width, Graphics.height, Color.white)
|
|
@sprites["overlay"].opacity = 0
|
|
# Start up scene
|
|
pbFadeInAndShow(@sprites)
|
|
end
|
|
|
|
def pbMain
|
|
pbBGMPlay("Evolution")
|
|
# Egg animation
|
|
updateScene(Graphics.frame_rate * 15 / 10)
|
|
pbPositionHatchMask(0)
|
|
pbSEPlay("Battle ball shake")
|
|
swingEgg(4)
|
|
updateScene(Graphics.frame_rate * 2 / 10)
|
|
pbPositionHatchMask(1)
|
|
pbSEPlay("Battle ball shake")
|
|
swingEgg(4)
|
|
updateScene(Graphics.frame_rate * 4 / 10)
|
|
pbPositionHatchMask(2)
|
|
pbSEPlay("Battle ball shake")
|
|
swingEgg(8, 2)
|
|
updateScene(Graphics.frame_rate * 4 / 10)
|
|
pbPositionHatchMask(3)
|
|
pbSEPlay("Battle ball shake")
|
|
swingEgg(16, 4)
|
|
updateScene(Graphics.frame_rate * 2 / 10)
|
|
pbPositionHatchMask(4)
|
|
pbSEPlay("Battle recall")
|
|
# Fade and change the sprite
|
|
fadeTime = Graphics.frame_rate * 4 / 10
|
|
toneDiff = (255.0 / fadeTime).ceil
|
|
(1..fadeTime).each do |i|
|
|
@sprites["pokemon"].tone = Tone.new(i * toneDiff, i * toneDiff, i * toneDiff)
|
|
@sprites["overlay"].opacity = i * toneDiff
|
|
updateScene
|
|
end
|
|
updateScene(Graphics.frame_rate * 3 / 4)
|
|
@sprites["pokemon"].setPokemonBitmap(@pokemon) # Pokémon sprite
|
|
@sprites["pokemon"].x = Graphics.width / 2
|
|
@sprites["pokemon"].y = 264
|
|
@pokemon.species_data.apply_metrics_to_sprite(@sprites["pokemon"], 1)
|
|
@sprites["hatch"].visible = false
|
|
(1..fadeTime).each do |i|
|
|
@sprites["pokemon"].tone = Tone.new(255 - (i * toneDiff), 255 - (i * toneDiff), 255 - (i * toneDiff))
|
|
@sprites["overlay"].opacity = 255 - (i * toneDiff)
|
|
updateScene
|
|
end
|
|
@sprites["pokemon"].tone = Tone.new(0, 0, 0)
|
|
@sprites["overlay"].opacity = 0
|
|
# Finish scene
|
|
frames = (GameData::Species.cry_length(@pokemon) * Graphics.frame_rate).ceil
|
|
@pokemon.play_cry
|
|
updateScene(frames + 4)
|
|
pbBGMStop
|
|
pbMEPlay("Evolution success")
|
|
@pokemon.name = nil
|
|
pbMessage(_INTL("\\se[]{1} hatched from the Egg!\\wt[80]", @pokemon.name)) { update }
|
|
# Record the Pokémon's species as owned in the Pokédex
|
|
was_owned = $player.owned?(@pokemon.species)
|
|
$player.pokedex.register(@pokemon)
|
|
$player.pokedex.set_owned(@pokemon.species)
|
|
$player.pokedex.set_seen_egg(@pokemon.species)
|
|
# Show Pokédex entry for new species if it hasn't been owned before
|
|
if Settings::SHOW_NEW_SPECIES_POKEDEX_ENTRY_MORE_OFTEN && !was_owned && $player.has_pokedex
|
|
pbMessage(_INTL("{1}'s data was added to the Pokédex.", @pokemon.name)) { update }
|
|
$player.pokedex.register_last_seen(@pokemon)
|
|
pbFadeOutIn {
|
|
scene = PokemonPokedexInfo_Scene.new
|
|
screen = PokemonPokedexInfoScreen.new(scene)
|
|
screen.pbDexEntry(@pokemon.species)
|
|
}
|
|
end
|
|
# Nickname the Pokémon
|
|
if $PokemonSystem.givenicknames == 0 &&
|
|
pbConfirmMessage(
|
|
_INTL("Would you like to nickname the newly hatched {1}?", @pokemon.name)
|
|
) { update }
|
|
nickname = pbEnterPokemonName(_INTL("{1}'s nickname?", @pokemon.name),
|
|
0, Pokemon::MAX_NAME_SIZE, "", @pokemon, true)
|
|
@pokemon.name = nickname
|
|
@nicknamed = true
|
|
end
|
|
end
|
|
|
|
def pbEndScene
|
|
pbFadeOutAndHide(@sprites) { update } if !@nicknamed
|
|
pbDisposeSpriteHash(@sprites)
|
|
@hatchSheet.dispose
|
|
@viewport.dispose
|
|
end
|
|
|
|
def pbPositionHatchMask(index)
|
|
@sprites["hatch"].src_rect.x = index * @sprites["hatch"].src_rect.width
|
|
end
|
|
|
|
def swingEgg(speed, swingTimes = 1)
|
|
@sprites["hatch"].visible = true
|
|
speed = speed.to_f * 20 / Graphics.frame_rate
|
|
amplitude = 8
|
|
targets = []
|
|
swingTimes.times do
|
|
targets.push(@sprites["pokemon"].x + amplitude)
|
|
targets.push(@sprites["pokemon"].x - amplitude)
|
|
end
|
|
targets.push(@sprites["pokemon"].x)
|
|
targets.each_with_index do |target, i|
|
|
loop do
|
|
break if i.even? && @sprites["pokemon"].x >= target
|
|
break if i.odd? && @sprites["pokemon"].x <= target
|
|
@sprites["pokemon"].x += speed
|
|
@sprites["hatch"].x = @sprites["pokemon"].x
|
|
updateScene
|
|
end
|
|
speed *= -1
|
|
end
|
|
@sprites["pokemon"].x = targets[targets.length - 1]
|
|
@sprites["hatch"].x = @sprites["pokemon"].x
|
|
end
|
|
|
|
def updateScene(frames = 1) # Can be used for "wait" effect
|
|
frames.times do
|
|
Graphics.update
|
|
Input.update
|
|
self.update
|
|
end
|
|
end
|
|
|
|
def update
|
|
pbUpdateSpriteHash(@sprites)
|
|
end
|
|
end
|
|
|
|
#===============================================================================
|
|
#
|
|
#===============================================================================
|
|
class PokemonEggHatchScreen
|
|
def initialize(scene)
|
|
@scene = scene
|
|
end
|
|
|
|
def pbStartScreen(pokemon)
|
|
@scene.pbStartScene(pokemon)
|
|
@scene.pbMain
|
|
@scene.pbEndScene
|
|
end
|
|
end
|
|
|
|
#===============================================================================
|
|
#
|
|
#===============================================================================
|
|
def pbHatchAnimation(pokemon)
|
|
pbMessage(_INTL("Huh?\1"))
|
|
pbFadeOutInWithMusic {
|
|
scene = PokemonEggHatch_Scene.new
|
|
screen = PokemonEggHatchScreen.new(scene)
|
|
screen.pbStartScreen(pokemon)
|
|
}
|
|
return true
|
|
end
|
|
|
|
def pbHatch(pokemon)
|
|
$stats.eggs_hatched += 1
|
|
speciesname = pokemon.speciesName
|
|
pokemon.name = nil
|
|
pokemon.owner = Pokemon::Owner.new_from_trainer($player)
|
|
pokemon.happiness = 120
|
|
pokemon.timeEggHatched = pbGetTimeNow
|
|
pokemon.obtain_method = 1 # hatched from egg
|
|
pokemon.hatched_map = $game_map.map_id
|
|
pokemon.record_first_moves
|
|
if !pbHatchAnimation(pokemon)
|
|
pbMessage(_INTL("Huh?\1"))
|
|
pbMessage(_INTL("...\1"))
|
|
pbMessage(_INTL("... .... .....\1"))
|
|
pbMessage(_INTL("{1} hatched from the Egg!", speciesname))
|
|
was_owned = $player.owned?(pokemon.species)
|
|
$player.pokedex.register(pokemon)
|
|
$player.pokedex.set_owned(pokemon.species)
|
|
$player.pokedex.set_seen_egg(pokemon.species)
|
|
# Show Pokédex entry for new species if it hasn't been owned before
|
|
if Settings::SHOW_NEW_SPECIES_POKEDEX_ENTRY_MORE_OFTEN && !was_owned && $player.has_pokedex
|
|
pbMessage(_INTL("{1}'s data was added to the Pokédex.", speciesname))
|
|
$player.pokedex.register_last_seen(pokemon)
|
|
pbFadeOutIn {
|
|
scene = PokemonPokedexInfo_Scene.new
|
|
screen = PokemonPokedexInfoScreen.new(scene)
|
|
screen.pbDexEntry(pokemon.species)
|
|
}
|
|
end
|
|
# Nickname the Pokémon
|
|
if $PokemonSystem.givenicknames == 0 &&
|
|
pbConfirmMessage(_INTL("Would you like to nickname the newly hatched {1}?", speciesname))
|
|
nickname = pbEnterPokemonName(_INTL("{1}'s nickname?", speciesname),
|
|
0, Pokemon::MAX_NAME_SIZE, "", pokemon)
|
|
pokemon.name = nickname
|
|
end
|
|
end
|
|
end
|
|
|
|
EventHandlers.add(:on_player_step_taken, :hatch_eggs,
|
|
proc {
|
|
$player.party.each do |egg|
|
|
next if egg.steps_to_hatch <= 0
|
|
egg.steps_to_hatch -= 1
|
|
$player.pokemon_party.each do |pkmn|
|
|
next if !pkmn.ability&.has_flag?("FasterEggHatching")
|
|
egg.steps_to_hatch -= 1
|
|
break
|
|
end
|
|
if egg.steps_to_hatch <= 0
|
|
egg.steps_to_hatch = 0
|
|
pbHatch(egg)
|
|
end
|
|
end
|
|
}
|
|
)
|