diff --git a/Data/Scripts/007_Objects and windows/006_SpriteWindow_pictures.rb b/Data/Scripts/007_Objects and windows/006_SpriteWindow_pictures.rb index 33a367d0e..f9ce0aed1 100644 --- a/Data/Scripts/007_Objects and windows/006_SpriteWindow_pictures.rb +++ b/Data/Scripts/007_Objects and windows/006_SpriteWindow_pictures.rb @@ -66,6 +66,8 @@ class PictureWindow < SpriteWindow_Base setBitmap(pathOrBitmap) end + def picture; @_iconbitmap; end + def dispose clearBitmaps() super diff --git a/Data/Scripts/007_Objects and windows/008_AnimatedBitmap.rb b/Data/Scripts/007_Objects and windows/008_AnimatedBitmap.rb index 0a395e11f..dc3239f88 100644 --- a/Data/Scripts/007_Objects and windows/008_AnimatedBitmap.rb +++ b/Data/Scripts/007_Objects and windows/008_AnimatedBitmap.rb @@ -18,6 +18,17 @@ class AnimatedBitmap end end + def pbSetColor(r = 0, g = 0, b = 0, a = 255) + for i in 0..@bitmap.bitmap.width + for j in 0..@bitmap.bitmap.height + if @bitmap.bitmap.get_pixel(i, j).alpha != 0 + color = Color.new(r, g, b, a) + @bitmap.bitmap.set_pixel(i, j, color) + end + end + end + end + def [](index) ; @bitmap[index]; end @@ -82,7 +93,6 @@ class AnimatedBitmap end end - end #=============================================================================== diff --git a/Data/Scripts/011_Battle/003_Battle/001_PokeBattle_BattleCommon.rb b/Data/Scripts/011_Battle/003_Battle/001_PokeBattle_BattleCommon.rb index 62cfb3108..bea01266e 100644 --- a/Data/Scripts/011_Battle/003_Battle/001_PokeBattle_BattleCommon.rb +++ b/Data/Scripts/011_Battle/003_Battle/001_PokeBattle_BattleCommon.rb @@ -83,7 +83,7 @@ module PokeBattle_BattleCommon if itemName.starts_with_vowel? pbDisplay(_INTL("{1} threw an {2}!",pbPlayer.name,itemName)) else - pbDisplay(_INTL("{1} threw a {2}!",pbPlayer.name,itemName)) + pbDisplay(_INTL("{1} vcthrew a {2}!",pbPlayer.name,itemName)) end pbDisplay(_INTL("But there was no target...")) return diff --git a/Data/Scripts/013_Items/001_Item_Utilities.rb b/Data/Scripts/013_Items/001_Item_Utilities.rb index be1e11ec8..c5f37825b 100644 --- a/Data/Scripts/013_Items/001_Item_Utilities.rb +++ b/Data/Scripts/013_Items/001_Item_Utilities.rb @@ -2,42 +2,44 @@ # ItemHandlers #=============================================================================== module ItemHandlers - UseText = ItemHandlerHash.new - UseFromBag = ItemHandlerHash.new - ConfirmUseInField = ItemHandlerHash.new - UseInField = ItemHandlerHash.new - UseOnPokemon = ItemHandlerHash.new - CanUseInBattle = ItemHandlerHash.new - UseInBattle = ItemHandlerHash.new + UseText = ItemHandlerHash.new + UseFromBag = ItemHandlerHash.new + ConfirmUseInField = ItemHandlerHash.new + UseInField = ItemHandlerHash.new + UseOnPokemon = ItemHandlerHash.new + CanUseInBattle = ItemHandlerHash.new + UseInBattle = ItemHandlerHash.new BattleUseOnBattler = ItemHandlerHash.new BattleUseOnPokemon = ItemHandlerHash.new def self.hasUseText(item) - return UseText[item]!=nil + return UseText[item] != nil end - def self.hasOutHandler(item) # Shows "Use" option in Bag - return UseFromBag[item]!=nil || UseInField[item]!=nil || UseOnPokemon[item]!=nil + def self.hasOutHandler(item) + # Shows "Use" option in Bag + return UseFromBag[item] != nil || UseInField[item] != nil || UseOnPokemon[item] != nil end - def self.hasUseInFieldHandler(item) # Shows "Register" option in Bag - return UseInField[item]!=nil + def self.hasUseInFieldHandler(item) + # Shows "Register" option in Bag + return UseInField[item] != nil end def self.hasUseOnPokemon(item) - return UseOnPokemon[item]!=nil + return UseOnPokemon[item] != nil end def self.hasUseInBattle(item) - return UseInBattle[item]!=nil + return UseInBattle[item] != nil end def self.hasBattleUseOnBattler(item) - return BattleUseOnBattler[item]!=nil + return BattleUseOnBattler[item] != nil end def self.hasBattleUseOnPokemon(item) - return BattleUseOnPokemon[item]!=nil + return BattleUseOnPokemon[item] != nil end # Returns text to display instead of "Use" @@ -75,35 +77,33 @@ module ItemHandlers end # Returns whether item was used - def self.triggerUseOnPokemon(item,pkmn,scene) + def self.triggerUseOnPokemon(item, pkmn, scene) return false if !UseOnPokemon[item] - return UseOnPokemon.trigger(item,pkmn,scene) + return UseOnPokemon.trigger(item, pkmn, scene) end - def self.triggerCanUseInBattle(item,pkmn,battler,move,firstAction,battle,scene,showMessages=true) - return true if !CanUseInBattle[item] # Can use the item by default - return CanUseInBattle.trigger(item,pkmn,battler,move,firstAction,battle,scene,showMessages) + def self.triggerCanUseInBattle(item, pkmn, battler, move, firstAction, battle, scene, showMessages = true) + return true if !CanUseInBattle[item] # Can use the item by default + return CanUseInBattle.trigger(item, pkmn, battler, move, firstAction, battle, scene, showMessages) end - def self.triggerUseInBattle(item,battler,battle) - UseInBattle.trigger(item,battler,battle) + def self.triggerUseInBattle(item, battler, battle) + UseInBattle.trigger(item, battler, battle) end # Returns whether item was used - def self.triggerBattleUseOnBattler(item,battler,scene) + def self.triggerBattleUseOnBattler(item, battler, scene) return false if !BattleUseOnBattler[item] - return BattleUseOnBattler.trigger(item,battler,scene) + return BattleUseOnBattler.trigger(item, battler, scene) end # Returns whether item was used - def self.triggerBattleUseOnPokemon(item,pkmn,battler,choices,scene) + def self.triggerBattleUseOnPokemon(item, pkmn, battler, choices, scene) return false if !BattleUseOnPokemon[item] - return BattleUseOnPokemon.trigger(item,pkmn,battler,choices,scene) + return BattleUseOnPokemon.trigger(item, pkmn, battler, choices, scene) end end - - def pbCanRegisterItem?(item) return ItemHandlers.hasUseInFieldHandler(item) end @@ -112,74 +112,72 @@ def pbCanUseOnPokemon?(item) return ItemHandlers.hasUseOnPokemon(item) || GameData::Item.get(item).is_machine? end - - #=============================================================================== # Change a Pokémon's level #=============================================================================== -def pbChangeLevel(pkmn,newlevel,scene) +def pbChangeLevel(pkmn, newlevel, scene) newlevel = newlevel.clamp(1, GameData::GrowthRate.max_level) - if pkmn.level==newlevel - pbMessage(_INTL("{1}'s level remained unchanged.",pkmn.name)) - elsif pkmn.level>newlevel - attackdiff = pkmn.attack + if pkmn.level == newlevel + pbMessage(_INTL("{1}'s level remained unchanged.", pkmn.name)) + elsif pkmn.level > newlevel + attackdiff = pkmn.attack defensediff = pkmn.defense - speeddiff = pkmn.speed - spatkdiff = pkmn.spatk - spdefdiff = pkmn.spdef + speeddiff = pkmn.speed + spatkdiff = pkmn.spatk + spdefdiff = pkmn.spdef totalhpdiff = pkmn.totalhp pkmn.level = newlevel pkmn.calc_stats scene.pbRefresh - pbMessage(_INTL("{1} dropped to Lv. {2}!",pkmn.name,pkmn.level)) - attackdiff = pkmn.attack-attackdiff - defensediff = pkmn.defense-defensediff - speeddiff = pkmn.speed-speeddiff - spatkdiff = pkmn.spatk-spatkdiff - spdefdiff = pkmn.spdef-spdefdiff - totalhpdiff = pkmn.totalhp-totalhpdiff + pbMessage(_INTL("{1} dropped to Lv. {2}!", pkmn.name, pkmn.level)) + attackdiff = pkmn.attack - attackdiff + defensediff = pkmn.defense - defensediff + speeddiff = pkmn.speed - speeddiff + spatkdiff = pkmn.spatk - spatkdiff + spdefdiff = pkmn.spdef - spdefdiff + totalhpdiff = pkmn.totalhp - totalhpdiff pbTopRightWindow(_INTL("Max. HP{1}\r\nAttack{2}\r\nDefense{3}\r\nSp. Atk{4}\r\nSp. Def{5}\r\nSpeed{6}", - totalhpdiff,attackdiff,defensediff,spatkdiff,spdefdiff,speeddiff)) + totalhpdiff, attackdiff, defensediff, spatkdiff, spdefdiff, speeddiff)) pbTopRightWindow(_INTL("Max. HP{1}\r\nAttack{2}\r\nDefense{3}\r\nSp. Atk{4}\r\nSp. Def{5}\r\nSpeed{6}", - pkmn.totalhp,pkmn.attack,pkmn.defense,pkmn.spatk,pkmn.spdef,pkmn.speed)) + pkmn.totalhp, pkmn.attack, pkmn.defense, pkmn.spatk, pkmn.spdef, pkmn.speed)) else - attackdiff = pkmn.attack + attackdiff = pkmn.attack defensediff = pkmn.defense - speeddiff = pkmn.speed - spatkdiff = pkmn.spatk - spdefdiff = pkmn.spdef + speeddiff = pkmn.speed + spatkdiff = pkmn.spatk + spdefdiff = pkmn.spdef totalhpdiff = pkmn.totalhp pkmn.level = newlevel pkmn.changeHappiness("vitamin") pkmn.calc_stats scene.pbRefresh if scene.is_a?(PokemonPartyScreen) - scene.pbDisplay(_INTL("{1} grew to Lv. {2}!",pkmn.name,pkmn.level)) + scene.pbDisplay(_INTL("{1} grew to Lv. {2}!", pkmn.name, pkmn.level)) else - pbMessage(_INTL("{1} grew to Lv. {2}!",pkmn.name,pkmn.level)) + pbMessage(_INTL("{1} grew to Lv. {2}!", pkmn.name, pkmn.level)) end - attackdiff = pkmn.attack-attackdiff - defensediff = pkmn.defense-defensediff - speeddiff = pkmn.speed-speeddiff - spatkdiff = pkmn.spatk-spatkdiff - spdefdiff = pkmn.spdef-spdefdiff - totalhpdiff = pkmn.totalhp-totalhpdiff + attackdiff = pkmn.attack - attackdiff + defensediff = pkmn.defense - defensediff + speeddiff = pkmn.speed - speeddiff + spatkdiff = pkmn.spatk - spatkdiff + spdefdiff = pkmn.spdef - spdefdiff + totalhpdiff = pkmn.totalhp - totalhpdiff pbTopRightWindow(_INTL("Max. HP+{1}\r\nAttack+{2}\r\nDefense+{3}\r\nSp. Atk+{4}\r\nSp. Def+{5}\r\nSpeed+{6}", - totalhpdiff,attackdiff,defensediff,spatkdiff,spdefdiff,speeddiff),scene) + totalhpdiff, attackdiff, defensediff, spatkdiff, spdefdiff, speeddiff), scene) pbTopRightWindow(_INTL("Max. HP{1}\r\nAttack{2}\r\nDefense{3}\r\nSp. Atk{4}\r\nSp. Def{5}\r\nSpeed{6}", - pkmn.totalhp,pkmn.attack,pkmn.defense,pkmn.spatk,pkmn.spdef,pkmn.speed),scene) + pkmn.totalhp, pkmn.attack, pkmn.defense, pkmn.spatk, pkmn.spdef, pkmn.speed), scene) # Learn new moves upon level up movelist = pkmn.getMoveList for i in movelist - next if i[0]!=pkmn.level - pbLearnMove(pkmn,i[1],true) { scene.pbUpdate } + next if i[0] != pkmn.level + pbLearnMove(pkmn, i[1], true) { scene.pbUpdate } end # Check for evolution newspecies = pkmn.check_evolution_on_level_up if newspecies pbFadeOutInWithMusic { evo = PokemonEvolutionScene.new - evo.pbStartScreen(pkmn,newspecies) + evo.pbStartScreen(pkmn, newspecies) evo.pbEvolution evo.pbEndScreen scene.pbRefresh if scene.is_a?(PokemonPartyScreen) @@ -191,9 +189,9 @@ end def pbTopRightWindow(text, scene = nil) window = Window_AdvancedTextPokemon.new(text) window.width = 198 - window.x = Graphics.width-window.width - window.y = 0 - window.z = 99999 + window.x = Graphics.width - window.width + window.y = 0 + window.z = 99999 pbPlayDecisionSE loop do Graphics.update @@ -208,33 +206,33 @@ end #=============================================================================== # Restore HP #=============================================================================== -def pbItemRestoreHP(pkmn,restoreHP) - newHP = pkmn.hp+restoreHP - newHP = pkmn.totalhp if newHP>pkmn.totalhp - hpGain = newHP-pkmn.hp +def pbItemRestoreHP(pkmn, restoreHP) + newHP = pkmn.hp + restoreHP + newHP = pkmn.totalhp if newHP > pkmn.totalhp + hpGain = newHP - pkmn.hp pkmn.hp = newHP return hpGain end -def pbHPItem(pkmn,restoreHP,scene) - if !pkmn.able? || pkmn.hp==pkmn.totalhp +def pbHPItem(pkmn, restoreHP, scene) + if !pkmn.able? || pkmn.hp == pkmn.totalhp scene.pbDisplay(_INTL("It won't have any effect.")) return false end - hpGain = pbItemRestoreHP(pkmn,restoreHP) + hpGain = pbItemRestoreHP(pkmn, restoreHP) scene.pbRefresh - scene.pbDisplay(_INTL("{1}'s HP was restored by {2} points.",pkmn.name,hpGain)) + scene.pbDisplay(_INTL("{1}'s HP was restored by {2} points.", pkmn.name, hpGain)) return true end -def pbBattleHPItem(pkmn,battler,restoreHP,scene) +def pbBattleHPItem(pkmn, battler, restoreHP, scene) if battler - if battler.pbRecoverHP(restoreHP)>0 - scene.pbDisplay(_INTL("{1}'s HP was restored.",battler.pbThis)) + if battler.pbRecoverHP(restoreHP) > 0 + scene.pbDisplay(_INTL("{1}'s HP was restored.", battler.pbThis)) end else - if pbItemRestoreHP(pkmn,restoreHP)>0 - scene.pbDisplay(_INTL("{1}'s HP was restored.",pkmn.name)) + if pbItemRestoreHP(pkmn, restoreHP) > 0 + scene.pbDisplay(_INTL("{1}'s HP was restored.", pkmn.name)) end end return true @@ -243,20 +241,20 @@ end #=============================================================================== # Restore PP #=============================================================================== -def pbRestorePP(pkmn,idxMove,pp) +def pbRestorePP(pkmn, idxMove, pp) return 0 if !pkmn.moves[idxMove] || !pkmn.moves[idxMove].id - return 0 if pkmn.moves[idxMove].total_pp<=0 + return 0 if pkmn.moves[idxMove].total_pp <= 0 oldpp = pkmn.moves[idxMove].pp - newpp = pkmn.moves[idxMove].pp+pp - newpp = pkmn.moves[idxMove].total_pp if newpp>pkmn.moves[idxMove].total_pp + newpp = pkmn.moves[idxMove].pp + pp + newpp = pkmn.moves[idxMove].total_pp if newpp > pkmn.moves[idxMove].total_pp pkmn.moves[idxMove].pp = newpp - return newpp-oldpp + return newpp - oldpp end def pbBattleRestorePP(pkmn, battler, idxMove, pp) - return if pbRestorePP(pkmn,idxMove,pp) == 0 + return if pbRestorePP(pkmn, idxMove, pp) == 0 if battler && !battler.effects[PBEffects::Transform] && - battler.moves[idxMove] && battler.moves[idxMove].id == pkmn.moves[idxMove].id + battler.moves[idxMove] && battler.moves[idxMove].id == pkmn.moves[idxMove].id battler.pbSetPP(battler.moves[idxMove], pkmn.moves[idxMove].pp) end end @@ -292,9 +290,9 @@ def pbRaiseEffortValues(pkmn, stat, evGain = 10, ev_limit = true) return evGain end -def pbRaiseHappinessAndLowerEV(pkmn,scene,stat,messages) - h = pkmn.happiness<255 - e = pkmn.ev[stat]>0 +def pbRaiseHappinessAndLowerEV(pkmn, scene, stat, messages) + h = pkmn.happiness < 255 + e = pkmn.ev[stat] > 0 if !h && !e scene.pbDisplay(_INTL("It won't have any effect.")) return false @@ -304,27 +302,27 @@ def pbRaiseHappinessAndLowerEV(pkmn,scene,stat,messages) end if e pkmn.ev[stat] -= 10 - pkmn.ev[stat] = 0 if pkmn.ev[stat]<0 + pkmn.ev[stat] = 0 if pkmn.ev[stat] < 0 pkmn.calc_stats end scene.pbRefresh - scene.pbDisplay(messages[2-(h ? 0 : 2)-(e ? 0 : 1)]) + scene.pbDisplay(messages[2 - (h ? 0 : 2) - (e ? 0 : 1)]) return true end #=============================================================================== # Battle items #=============================================================================== -def pbBattleItemCanCureStatus?(status,pkmn,scene,showMessages) - if !pkmn.able? || pkmn.status!=status +def pbBattleItemCanCureStatus?(status, pkmn, scene, showMessages) + if !pkmn.able? || pkmn.status != status scene.pbDisplay(_INTL("It won't have any effect.")) if showMessages return false end return true end -def pbBattleItemCanRaiseStat?(stat,battler,scene,showMessages) - if !battler || !battler.pbCanRaiseStatStage?(stat,battler) +def pbBattleItemCanRaiseStat?(stat, battler, scene, showMessages) + if !battler || !battler.pbCanRaiseStatStage?(stat, battler) scene.pbDisplay(_INTL("It won't have any effect.")) if showMessages return false end @@ -336,7 +334,7 @@ end #=============================================================================== def pbBikeCheck if $PokemonGlobal.surfing || $PokemonGlobal.diving || - (!$PokemonGlobal.bicycle && $game_player.pbTerrainTag.must_walk) + (!$PokemonGlobal.bicycle && $game_player.pbTerrainTag.must_walk) pbMessage(_INTL("Can't use that here.")) return false end @@ -368,17 +366,17 @@ def pbClosestHiddenItem playerY = $game_player.y for event in $game_map.events.values next if !event.name[/hiddenitem/i] - next if (playerX-event.x).abs>=8 - next if (playerY-event.y).abs>=6 - next if $game_self_switches[[$game_map.map_id,event.id,"A"]] + next if (playerX - event.x).abs >= 8 + next if (playerY - event.y).abs >= 6 + next if $game_self_switches[[$game_map.map_id, event.id, "A"]] result.push(event) end - return nil if result.length==0 + return nil if result.length == 0 ret = nil retmin = 0 for event in result - dist = (playerX-event.x).abs+(playerY-event.y).abs - next if ret && retmin<=dist + dist = (playerX - event.x).abs + (playerY - event.y).abs + next if ret && retmin <= dist ret = event retmin = dist end @@ -388,58 +386,104 @@ end #=============================================================================== # Teach and forget a move #=============================================================================== -def pbLearnMove(pkmn,move,ignoreifknown=false,bymachine=false,&block) +def pbLearnMove(pkmn, move, ignoreifknown = false, bymachine = false, &block) return false if !pkmn move = GameData::Move.get(move).id if pkmn.egg? && !$DEBUG - pbMessage(_INTL("Eggs can't be taught any moves."),&block) + pbMessage(_INTL("Eggs can't be taught any moves."), &block) return false end if pkmn.shadowPokemon? - pbMessage(_INTL("Shadow Pokémon can't be taught any moves."),&block) + pbMessage(_INTL("Shadow Pokémon can't be taught any moves."), &block) return false end pkmnname = pkmn.name movename = GameData::Move.get(move).name if pkmn.hasMove?(move) - pbMessage(_INTL("{1} already knows {2}.",pkmnname,movename),&block) if !ignoreifknown + pbMessage(_INTL("{1} already knows {2}.", pkmnname, movename), &block) if !ignoreifknown return false end - if pkmn.numMoves=0 + pkmnname, movename, pkmn.numMoves.to_word), &block) if !bymachine + pbMessage(_INTL("Please choose a move that will be replaced with {1}.", movename), &block) + forgetmove = pbForgetMove(pkmn, move) + if forgetmove >= 0 oldmovename = pkmn.moves[forgetmove].name - oldmovepp = pkmn.moves[forgetmove].pp - pkmn.moves[forgetmove] = Pokemon::Move.new(move) # Replaces current/total PP + oldmovepp = pkmn.moves[forgetmove].pp + pkmn.moves[forgetmove] = Pokemon::Move.new(move) # Replaces current/total PP if bymachine && Settings::TAUGHT_MACHINES_KEEP_OLD_PP - pkmn.moves[forgetmove].pp = [oldmovepp,pkmn.moves[forgetmove].total_pp].min + pkmn.moves[forgetmove].pp = [oldmovepp, pkmn.moves[forgetmove].total_pp].min end - pbMessage(_INTL("1, 2, and...\\wt[16] ...\\wt[16] ... Ta-da!\\se[Battle ball drop]\1"),&block) - pbMessage(_INTL("{1} forgot how to use {2}.\\nAnd...\1",pkmnname,oldmovename),&block) - pbMessage(_INTL("\\se[]{1} learned {2}!\\se[Pkmn move learnt]",pkmnname,movename),&block) + pbMessage(_INTL("1, 2, and...\\wt[16] ...\\wt[16] ... Ta-da!\\se[Battle ball drop]\1"), &block) + pbMessage(_INTL("{1} forgot how to use {2}.\\nAnd...\1", pkmnname, oldmovename), &block) + pbMessage(_INTL("\\se[]{1} learned {2}!\\se[Pkmn move learnt]", pkmnname, movename), &block) pkmn.changeHappiness("machine") if bymachine return true - elsif pbConfirmMessage(_INTL("Give up on learning {1}?",movename),&block) - pbMessage(_INTL("{1} did not learn {2}.",pkmnname,movename),&block) + elsif pbConfirmMessage(_INTL("Give up on learning {1}?", movename), &block) + pbMessage(_INTL("{1} did not learn {2}.", pkmnname, movename), &block) return false end end end -def pbForgetMove(pkmn,moveToLearn) +def pbLearnMove(pkmn, move, ignoreifknown = false, bymachine = false, fast = false, &block) + return false if !pkmn + move = GameData::Move.get(move).id + if pkmn.egg? && !$DEBUG + pbMessage(_INTL("Eggs can't be taught any moves."), &block) + return false + end + if pkmn.shadowPokemon? + pbMessage(_INTL("Shadow Pokémon can't be taught any moves."), &block) + return false + end + pkmnname = pkmn.name + movename = GameData::Move.get(move).name + if pkmn.hasMove?(move) + pbMessage(_INTL("{1} already knows {2}.", pkmnname, movename), &block) if !ignoreifknown + return false + end + if pkmn.numMoves < Pokemon::MAX_MOVES + pkmn.learn_move(move) + pbMessage(_INTL("\\se[]{1} learned {2}!\\se[Pkmn move learnt]", pkmnname, movename), &block) + return true + end + loop do + pbMessage(_INTL("{1} wants to learn {2}, but it already knows {3} moves.\1", + pkmnname, movename, pkmn.numMoves.to_word), &block) if !bymachine && !fast + pbMessage(_INTL("Please choose a move that will be replaced with {1}.", movename), &block) + forgetmove = pbForgetMove(pkmn, move) + if forgetmove >= 0 + oldmovename = pkmn.moves[forgetmove].name + oldmovepp = pkmn.moves[forgetmove].pp + pkmn.moves[forgetmove] = Pokemon::Move.new(move) # Replaces current/total PP + if bymachine && Settings::TAUGHT_MACHINES_KEEP_OLD_PP + pkmn.moves[forgetmove].pp = [oldmovepp, pkmn.moves[forgetmove].total_pp].min + end + pbMessage(_INTL("1, 2, and...\\wt[16] ...\\wt[16] ... Ta-da!\\se[Battle ball drop]\1"), &block) if !fast + pbMessage(_INTL("{1} forgot how to use {2}.\\nAnd...\1", pkmnname, oldmovename), &block) if !fast + pbMessage(_INTL("\\se[]{1} learned {2}!\\se[Pkmn move learnt]", pkmnname, movename), &block) + pkmn.changeHappiness("machine") if bymachine + return true + elsif pbConfirmMessage(_INTL("Give up on learning {1}?", movename), &block) + pbMessage(_INTL("{1} did not learn {2}.", pkmnname, movename), &block) + return false + end + end +end + +def pbForgetMove(pkmn, moveToLearn) ret = -1 pbFadeOutIn { scene = PokemonSummary_Scene.new screen = PokemonSummaryScreen.new(scene) - ret = screen.pbStartForgetScreen([pkmn],0,moveToLearn) + ret = screen.pbStartForgetScreen([pkmn], 0, moveToLearn) } return ret end @@ -448,10 +492,10 @@ end # Use an item from the Bag and/or on a Pokémon #=============================================================================== # @return [Integer] 0 = item wasn't used; 1 = item used; 2 = close Bag to use in field -def pbUseItem(bag,item,bagscene=nil) +def pbUseItem(bag, item, bagscene = nil) itm = GameData::Item.get(item) useType = itm.field_use - if itm.is_machine? # TM or TR or HM + if itm.is_machine? # TM or TR or HM if $Trainer.pokemon_count == 0 pbMessage(_INTL("There is no Pokémon.")) return 0 @@ -459,15 +503,15 @@ def pbUseItem(bag,item,bagscene=nil) machine = itm.move return 0 if !machine movename = GameData::Move.get(machine).name - pbMessage(_INTL("\\se[PC access]You booted up {1}.\1",itm.name)) - if !pbConfirmMessage(_INTL("Do you want to teach {1} to a Pokémon?",movename)) + pbMessage(_INTL("\\se[PC access]You booted up {1}.\1", itm.name)) + if !pbConfirmMessage(_INTL("Do you want to teach {1} to a Pokémon?", movename)) return 0 - elsif pbMoveTutorChoose(machine,nil,true,itm.is_TR?) + elsif pbMoveTutorChoose(machine, nil, true, itm.is_TR?) bag.pbDeleteItem(item) if itm.is_TR? return 1 end return 0 - elsif useType==1 || useType==5 # Item is usable on a Pokémon + elsif useType == 1 || useType == 5 # Item is usable on a Pokémon if $Trainer.pokemon_count == 0 pbMessage(_INTL("There is no Pokémon.")) return 0 @@ -483,22 +527,22 @@ def pbUseItem(bag,item,bagscene=nil) end pbFadeOutIn { scene = PokemonParty_Scene.new - screen = PokemonPartyScreen.new(scene,$Trainer.party) - screen.pbStartScene(_INTL("Use on which Pokémon?"),false,annot) + screen = PokemonPartyScreen.new(scene, $Trainer.party) + screen.pbStartScene(_INTL("Use on which Pokémon?"), false, annot) loop do scene.pbSetHelpText(_INTL("Use on which Pokémon?")) chosen = screen.pbChoosePokemon - if chosen<0 + if chosen < 0 ret = false break end pkmn = $Trainer.party[chosen] - if pbCheckUseOnPokemon(item,pkmn,screen) - ret = ItemHandlers.triggerUseOnPokemon(item,pkmn,screen) - if ret && useType==1 # Usable on Pokémon, consumed + if pbCheckUseOnPokemon(item, pkmn, screen) + ret = ItemHandlers.triggerUseOnPokemon(item, pkmn, screen) + if ret && useType == 1 # Usable on Pokémon, consumed bag.pbDeleteItem(item) if !bag.pbHasItem?(item) - pbMessage(_INTL("You used your last {1}.",itm.name)) { screen.pbUpdate } + pbMessage(_INTL("You used your last {1}.", itm.name)) { screen.pbUpdate } break end end @@ -508,16 +552,19 @@ def pbUseItem(bag,item,bagscene=nil) bagscene.pbRefresh if bagscene } return (ret) ? 1 : 0 - elsif useType==2 # Item is usable from Bag + elsif useType == 2 # Item is usable from Bag intret = ItemHandlers.triggerUseFromBag(item) case intret - when 0 then return 0 - when 1 then return 1 # Item used - when 2 then return 2 # Item used, end screen - when 3 # Item used, consume item + when 0 then + return 0 + when 1 then + return 1 # Item used + when 2 then + return 2 # Item used, end screen + when 3 # Item used, consume item bag.pbDeleteItem(item) return 1 - when 4 # Item used, end screen and consume item + when 4 # Item used, end screen and consume item bag.pbDeleteItem(item) return 2 end @@ -530,7 +577,7 @@ end # Only called when in the party screen and having chosen an item to be used on # the selected Pokémon -def pbUseItemOnPokemon(item,pkmn,scene) +def pbUseItemOnPokemon(item, pkmn, scene) itm = GameData::Item.get(item) # TM or HM if itm.is_machine? @@ -540,11 +587,11 @@ def pbUseItemOnPokemon(item,pkmn,scene) if pkmn.shadowPokemon? pbMessage(_INTL("Shadow Pokémon can't be taught any moves.")) { scene.pbUpdate } elsif !pkmn.compatible_with_move?(machine) - pbMessage(_INTL("{1} can't learn {2}.",pkmn.name,movename)) { scene.pbUpdate } + pbMessage(_INTL("{1} can't learn {2}.", pkmn.name, movename)) { scene.pbUpdate } else - pbMessage(_INTL("\\se[PC access]You booted up {1}.\1",itm.name)) { scene.pbUpdate } - if pbConfirmMessage(_INTL("Do you want to teach {1} to {2}?",movename,pkmn.name)) { scene.pbUpdate } - if pbLearnMove(pkmn,machine,false,true) { scene.pbUpdate } + pbMessage(_INTL("\\se[PC access]You booted up {1}.\1", itm.name)) { scene.pbUpdate } + if pbConfirmMessage(_INTL("Do you want to teach {1} to {2}?", movename, pkmn.name)) { scene.pbUpdate } + if pbLearnMove(pkmn, machine, false, true) { scene.pbUpdate } $PokemonBag.pbDeleteItem(item) if itm.is_TR? return true end @@ -553,14 +600,14 @@ def pbUseItemOnPokemon(item,pkmn,scene) return false end # Other item - ret = ItemHandlers.triggerUseOnPokemon(item,pkmn,scene) + ret = ItemHandlers.triggerUseOnPokemon(item, pkmn, scene) scene.pbClearAnnotations scene.pbHardRefresh useType = itm.field_use - if ret && useType==1 # Usable on Pokémon, consumed + if ret && useType == 1 # Usable on Pokémon, consumed $PokemonBag.pbDeleteItem(item) if !$PokemonBag.pbHasItem?(item) - pbMessage(_INTL("You used your last {1}.",itm.name)) { scene.pbUpdate } + pbMessage(_INTL("You used your last {1}.", itm.name)) { scene.pbUpdate } end end return ret @@ -568,47 +615,47 @@ end def pbUseKeyItemInField(item) ret = ItemHandlers.triggerUseInField(item) - if ret==-1 # Item effect not found + if ret == -1 # Item effect not found pbMessage(_INTL("Can't use that here.")) - elsif ret==3 # Item was used and consumed + elsif ret == 3 # Item was used and consumed $PokemonBag.pbDeleteItem(item) end - return ret!=-1 && ret!=0 + return ret != -1 && ret != 0 end def pbUseItemMessage(item) itemname = GameData::Item.get(item).name if itemname.starts_with_vowel? - pbMessage(_INTL("You used an {1}.",itemname)) + pbMessage(_INTL("You used an {1}.", itemname)) else - pbMessage(_INTL("You used a {1}.",itemname)) + pbMessage(_INTL("You used a {1}.", itemname)) end end -def pbCheckUseOnPokemon(_item,pkmn,_screen) +def pbCheckUseOnPokemon(_item, pkmn, _screen) return pkmn && !pkmn.egg? end #=============================================================================== # Give an item to a Pokémon to hold, and take a held item from a Pokémon #=============================================================================== -def pbGiveItemToPokemon(item,pkmn,scene,pkmnid=0) +def pbGiveItemToPokemon(item, pkmn, scene, pkmnid = 0) newitemname = GameData::Item.get(item).name if pkmn.egg? scene.pbDisplay(_INTL("Eggs can't hold items.")) return false elsif pkmn.mail - scene.pbDisplay(_INTL("{1}'s mail must be removed before giving it an item.",pkmn.name)) - return false if !pbTakeItemFromPokemon(pkmn,scene) + scene.pbDisplay(_INTL("{1}'s mail must be removed before giving it an item.", pkmn.name)) + return false if !pbTakeItemFromPokemon(pkmn, scene) end if pkmn.hasItem? olditemname = pkmn.item.name if pkmn.hasItem?(:LEFTOVERS) - scene.pbDisplay(_INTL("{1} is already holding some {2}.\1",pkmn.name,olditemname)) + scene.pbDisplay(_INTL("{1} is already holding some {2}.\1", pkmn.name, olditemname)) elsif newitemname.starts_with_vowel? - scene.pbDisplay(_INTL("{1} is already holding an {2}.\1",pkmn.name,olditemname)) + scene.pbDisplay(_INTL("{1} is already holding an {2}.\1", pkmn.name, olditemname)) else - scene.pbDisplay(_INTL("{1} is already holding a {2}.\1",pkmn.name,olditemname)) + scene.pbDisplay(_INTL("{1} is already holding a {2}.\1", pkmn.name, olditemname)) end if scene.pbConfirm(_INTL("Would you like to switch the two items?")) $PokemonBag.pbDeleteItem(item) @@ -619,9 +666,9 @@ def pbGiveItemToPokemon(item,pkmn,scene,pkmnid=0) scene.pbDisplay(_INTL("The Bag is full. The Pokémon's item could not be removed.")) else if GameData::Item.get(item).is_mail? - if pbWriteMail(item,pkmn,pkmnid,scene) + if pbWriteMail(item, pkmn, pkmnid, scene) pkmn.item = item - scene.pbDisplay(_INTL("Took the {1} from {2} and gave it the {3}.",olditemname,pkmn.name,newitemname)) + scene.pbDisplay(_INTL("Took the {1} from {2} and gave it the {3}.", olditemname, pkmn.name, newitemname)) return true else if !$PokemonBag.pbStoreItem(item) @@ -630,26 +677,26 @@ def pbGiveItemToPokemon(item,pkmn,scene,pkmnid=0) end else pkmn.item = item - scene.pbDisplay(_INTL("Took the {1} from {2} and gave it the {3}.",olditemname,pkmn.name,newitemname)) + scene.pbDisplay(_INTL("Took the {1} from {2} and gave it the {3}.", olditemname, pkmn.name, newitemname)) return true end end end else - if !GameData::Item.get(item).is_mail? || pbWriteMail(item,pkmn,pkmnid,scene) + if !GameData::Item.get(item).is_mail? || pbWriteMail(item, pkmn, pkmnid, scene) $PokemonBag.pbDeleteItem(item) pkmn.item = item - scene.pbDisplay(_INTL("{1} is now holding the {2}.",pkmn.name,newitemname)) + scene.pbDisplay(_INTL("{1} is now holding the {2}.", pkmn.name, newitemname)) return true end end return false end -def pbTakeItemFromPokemon(pkmn,scene) +def pbTakeItemFromPokemon(pkmn, scene) ret = false if !pkmn.hasItem? - scene.pbDisplay(_INTL("{1} isn't holding anything.",pkmn.name)) + scene.pbDisplay(_INTL("{1} isn't holding anything.", pkmn.name)) elsif !$PokemonBag.pbCanStore?(pkmn.item) scene.pbDisplay(_INTL("The Bag is full. The Pokémon's item could not be removed.")) elsif pkmn.mail @@ -663,14 +710,14 @@ def pbTakeItemFromPokemon(pkmn,scene) end elsif scene.pbConfirm(_INTL("If the mail is removed, its message will be lost. OK?")) $PokemonBag.pbStoreItem(pkmn.item) - scene.pbDisplay(_INTL("Received the {1} from {2}.",pkmn.item.name,pkmn.name)) + scene.pbDisplay(_INTL("Received the {1} from {2}.", pkmn.item.name, pkmn.name)) pkmn.item = nil pkmn.mail = nil ret = true end else $PokemonBag.pbStoreItem(pkmn.item) - scene.pbDisplay(_INTL("Received the {1} from {2}.",pkmn.item.name,pkmn.name)) + scene.pbDisplay(_INTL("Received the {1} from {2}.", pkmn.item.name, pkmn.name)) pkmn.item = nil ret = true end @@ -684,7 +731,7 @@ def pbChooseItem(var = 0, *args) ret = nil pbFadeOutIn { scene = PokemonBag_Scene.new - screen = PokemonBagScreen.new(scene,$PokemonBag) + screen = PokemonBagScreen.new(scene, $PokemonBag) ret = screen.pbChooseItemScreen } $game_variables[var] = ret || :NONE if var > 0 @@ -695,7 +742,7 @@ def pbChooseApricorn(var = 0) ret = nil pbFadeOutIn { scene = PokemonBag_Scene.new - screen = PokemonBagScreen.new(scene,$PokemonBag) + screen = PokemonBagScreen.new(scene, $PokemonBag) ret = screen.pbChooseItemScreen(Proc.new { |item| GameData::Item.get(item).is_apricorn? }) } $game_variables[var] = ret || :NONE if var > 0 @@ -706,7 +753,7 @@ def pbChooseFossil(var = 0) ret = nil pbFadeOutIn { scene = PokemonBag_Scene.new - screen = PokemonBagScreen.new(scene,$PokemonBag) + screen = PokemonBagScreen.new(scene, $PokemonBag) ret = screen.pbChooseItemScreen(Proc.new { |item| GameData::Item.get(item).is_fossil? }) } $game_variables[var] = ret || :NONE if var > 0 @@ -717,7 +764,7 @@ end # in the given Global Variable. Only items which the player has are listed. def pbChooseItemFromList(message, variable, *args) commands = [] - itemid = [] + itemid = [] for item in args next if !GameData::Item.exists?(item) itm = GameData::Item.get(item) @@ -732,7 +779,7 @@ def pbChooseItemFromList(message, variable, *args) commands.push(_INTL("Cancel")) itemid.push(nil) ret = pbMessage(message, commands, -1) - if ret < 0 || ret >= commands.length-1 + if ret < 0 || ret >= commands.length - 1 $game_variables[variable] = nil return nil end diff --git a/Data/Scripts/013_Items/002_Item_Effects.rb b/Data/Scripts/013_Items/002_Item_Effects.rb index 00b9ebd65..574927359 100644 --- a/Data/Scripts/013_Items/002_Item_Effects.rb +++ b/Data/Scripts/013_Items/002_Item_Effects.rb @@ -936,58 +936,6 @@ ItemHandlers::UseOnPokemon.add(:PRISONBOTTLE,proc { |item,pkmn,scene| next true }) -ItemHandlers::UseOnPokemon.add(:DNASPLICERS,proc { |item,pkmn,scene| - if !pkmn.isSpecies?(:KYUREM) - scene.pbDisplay(_INTL("It had no effect.")) - next false - end - if pkmn.fainted? - scene.pbDisplay(_INTL("This can't be used on the fainted Pokémon.")) - next false - end - # Fusing - if pkmn.fused.nil? - chosen = scene.pbChoosePokemon(_INTL("Fuse with which Pokémon?")) - next false if chosen<0 - poke2 = $Trainer.party[chosen] - if pkmn==poke2 - scene.pbDisplay(_INTL("It cannot be fused with itself.")) - next false - elsif poke2.egg? - scene.pbDisplay(_INTL("It cannot be fused with an Egg.")) - next false - elsif poke2.fainted? - scene.pbDisplay(_INTL("It cannot be fused with that fainted Pokémon.")) - next false - elsif !poke2.isSpecies?(:RESHIRAM) && - !poke2.isSpecies?(:ZEKROM) - scene.pbDisplay(_INTL("It cannot be fused with that Pokémon.")) - next false - end - newForm = 0 - newForm = 1 if poke2.isSpecies?(:RESHIRAM) - newForm = 2 if poke2.isSpecies?(:ZEKROM) - pkmn.setForm(newForm) { - pkmn.fused = poke2 - $Trainer.remove_pokemon_at_index(chosen) - scene.pbHardRefresh - scene.pbDisplay(_INTL("{1} changed Forme!",pkmn.name)) - } - next true - end - # Unfusing - if $Trainer.party_full? - scene.pbDisplay(_INTL("You have no room to separate the Pokémon.")) - next false - end - pkmn.setForm(0) { - $Trainer.party[$Trainer.party.length] = pkmn.fused - pkmn.fused = nil - scene.pbHardRefresh - scene.pbDisplay(_INTL("{1} changed Forme!",pkmn.name)) - } - next true -}) ItemHandlers::UseOnPokemon.add(:NSOLARIZER,proc { |item,pkmn,scene| if !pkmn.isSpecies?(:NECROZMA) || pkmn.form == 2 diff --git a/Data/Scripts/014_Pokemon/001_Pokemon-related/003_Pokemon_Sprites.rb b/Data/Scripts/014_Pokemon/001_Pokemon-related/003_Pokemon_Sprites.rb index e1e8af5df..0ba67ac39 100644 --- a/Data/Scripts/014_Pokemon/001_Pokemon-related/003_Pokemon_Sprites.rb +++ b/Data/Scripts/014_Pokemon/001_Pokemon-related/003_Pokemon_Sprites.rb @@ -54,6 +54,14 @@ class PokemonSprite < SpriteWrapper changeOrigin end + def setPokemonBitmapFromId(id,back=false) + @_iconbitmap.dispose if @_iconbitmap + @_iconbitmap = GameData::Species.sprite_bitmap_from_pokemon_id(id, back) + self.bitmap = (@_iconbitmap) ? @_iconbitmap.bitmap : nil + self.color = Color.new(0,0,0,0) + changeOrigin + end + def setPokemonBitmapSpecies(pokemon,species,back=false) @_iconbitmap.dispose if @_iconbitmap @_iconbitmap = (pokemon) ? GameData::Species.sprite_bitmap_from_pokemon(pokemon, back, species) : nil diff --git a/Data/Scripts/050_AddOns/FusionSprites.rb b/Data/Scripts/050_AddOns/FusionSprites.rb index 821084ca0..819daab1f 100644 --- a/Data/Scripts/050_AddOns/FusionSprites.rb +++ b/Data/Scripts/050_AddOns/FusionSprites.rb @@ -12,6 +12,15 @@ module GameData return ret end + def self.sprite_bitmap_from_pokemon_id(id, back = false) + if back + ret = self.back_sprite_bitmap(id) + else + ret = self.front_sprite_bitmap(id) + end + return ret + end + def self.front_sprite_bitmap(dex_number) filename = self.sprite_filename(dex_number) return (filename) ? AnimatedBitmap.new(filename) : nil diff --git a/Data/Scripts/050_AddOns/New Items effects.rb b/Data/Scripts/050_AddOns/New Items effects.rb new file mode 100644 index 000000000..ac63ee470 --- /dev/null +++ b/Data/Scripts/050_AddOns/New Items effects.rb @@ -0,0 +1,1648 @@ +ItemHandlers::BattleUseOnBattler.add(:POKEDEX, proc { |item, battler, scene| + #if battler.battle.battlers.length > -1 + # scene.pbDisplay(_INTL(" The length is {1}",battler.battle.battlers.length)) + # scene.pbDisplay(_INTL("The PokéDex cannot be used on multiple enemies at once!")) + # return false + #end + + doublebattle = false + #DOUBLE BATTLES A FAIRE + #variable temporaire doublebattle + if doublebattle + e = battler.pbOpposing2 + else + is_trainer = battler.battle.opponent + + e1 = battler.pbOpposing1.pokemon + enemyname = e1.name + e1type1 = e1.type1 + e1type2 = e1.type2 + end + if e1type1 == e1type2 + scene.pbDisplay(_INTL("{2} has been identified as a {1} type Pokémon.", PBTypes.getName(e1type1), enemyname)) + else + scene.pbDisplay(_INTL("{3} has been identified as a {1}/{2} type Pokémon.", PBTypes.getName(e1type1), PBTypes.getName(e1type2), enemyname)) + + if $game_switches[10] #BADGE 7 + if battler.pbCanIncreaseStatStage?(PBStats::DEFENSE, false) + battler.pbIncreaseStat(PBStats::DEFENSE, 1, true) + end + if battler.pbCanIncreaseStatStage?(PBStats::SPDEF, false) + battler.pbIncreaseStat(PBStats::SPDEF, 1, true) + end + if battler.pbCanIncreaseStatStage?(PBStats::ACCURACY, false) + battler.pbIncreaseStat(PBStats::ACCURACY, 3, true) + end + elsif $game_switches[8] #BADGE 5 + if battler.pbCanIncreaseStatStage?(PBStats::ACCURACY, false) + battler.pbIncreaseStat(PBStats::ACCURACY, 3, true) + end + elsif $game_switches[6] #BADGE 3 + if battler.pbCanIncreaseStatStage?(PBStats::ACCURACY, false) + battler.pbIncreaseStat(PBStats::ACCURACY, 2, true) + end + elsif $game_switches[8] #BADGE 1 + if battler.pbCanIncreaseStatStage?(PBStats::ACCURACY, false) + battler.pbIncreaseStat(PBStats::ACCURACY, 1, true) + end + end + + return true + end +}) + +ItemHandlers::UseInBattle.add(:POKEDOLL, proc { |item, battler, battle| + battle.decision = 3 + battle.pbDisplayPaused(_INTL("Got away safely!")) +}) + +ItemHandlers::UseFromBag.add(:LANTERN, proc { |item| + if useLantern() + next 1 + else + next 0 + end +}) + +ItemHandlers::UseInField.add(:LANTERN, proc { |item| + Kernel.pbMessage(_INTL("#{$Trainer.name} used the lantern.")) + if useLantern() + next 1 + else + next 0 + end +}) + +def useLantern() + darkness = $PokemonTemp.darknessSprite + if !darkness || darkness.disposed? || $PokemonGlobal.flashUsed + Kernel.pbMessage(_INTL("It's already illuminated...")) + return false + end + Kernel.pbMessage(_INTL("The Lantern illuminated the cave!")) + $PokemonGlobal.flashUsed = true + darkness.radius += 176 + return true +end + +ItemHandlers::UseFromBag.add(:TELEPORTER, proc { |item| + if useTeleporter() + next 1 + else + next 0 + end +}) + +ItemHandlers::UseInField.add(:TELEPORTER, proc { |item| + if useTeleporter() + next 1 + else + next 0 + end +}) + +def useTeleporter() + if HiddenMoveHandlers.triggerCanUseMove(:TELEPORT, 0) + Kernel.pbMessage(_INTL("Teleport to where?", $Trainer.name)) + scene = PokemonRegionMapScene.new(-1, false) + screen = PokemonRegionMap.new(scene) + ret = screen.pbStartFlyScreen + if ret + $PokemonTemp.flydata = ret + end + end + + if !$PokemonTemp.flydata + return false + else + Kernel.pbMessage(_INTL("{1} used the teleporter!", $Trainer.name)) + pbFadeOutIn(99999) { + Kernel.pbCancelVehicles + $game_temp.player_new_map_id = $PokemonTemp.flydata[0] + $game_temp.player_new_x = $PokemonTemp.flydata[1] + $game_temp.player_new_y = $PokemonTemp.flydata[2] + $PokemonTemp.flydata = nil + $game_temp.player_new_direction = 2 + $scene.transfer_player + $game_map.autoplay + $game_map.refresh + } + pbEraseEscapePoint + return true + end +end + +ItemHandlers::BattleUseOnBattler.add(:POKEDEX, proc { |item, battler, scene| + #if battler.battle.battlers.length > -1 + # scene.pbDisplay(_INTL(" The length is {1}",battler.battle.battlers.length)) + # scene.pbDisplay(_INTL("The PokéDex cannot be used on multiple enemies at once!")) + # return false + #end + + doublebattle = false + #DOUBLE BATTLES A FAIRE + #variable temporaire doublebattle + if doublebattle + e = battler.pbOpposing2 + else + is_trainer = battler.battle.opponent + + e1 = battler.pbOpposing1.pokemon + enemyname = e1.name + e1type1 = e1.type1 + e1type2 = e1.type2 + end + if e1type1 == e1type2 + scene.pbDisplay(_INTL("{2} has been identified as a {1} type Pokémon.", PBTypes.getName(e1type1), enemyname)) + else + scene.pbDisplay(_INTL("{3} has been identified as a {1}/{2} type Pokémon.", PBTypes.getName(e1type1), PBTypes.getName(e1type2), enemyname)) + + if $game_switches[10] #BADGE 7 + if battler.pbCanIncreaseStatStage?(PBStats::DEFENSE, false) + battler.pbIncreaseStat(PBStats::DEFENSE, 1, true) + end + if battler.pbCanIncreaseStatStage?(PBStats::SPDEF, false) + battler.pbIncreaseStat(PBStats::SPDEF, 1, true) + end + if battler.pbCanIncreaseStatStage?(PBStats::ACCURACY, false) + battler.pbIncreaseStat(PBStats::ACCURACY, 3, true) + end + elsif $game_switches[8] #BADGE 5 + if battler.pbCanIncreaseStatStage?(PBStats::ACCURACY, false) + battler.pbIncreaseStat(PBStats::ACCURACY, 3, true) + end + elsif $game_switches[6] #BADGE 3 + if battler.pbCanIncreaseStatStage?(PBStats::ACCURACY, false) + battler.pbIncreaseStat(PBStats::ACCURACY, 2, true) + end + elsif $game_switches[8] #BADGE 1 + if battler.pbCanIncreaseStatStage?(PBStats::ACCURACY, false) + battler.pbIncreaseStat(PBStats::ACCURACY, 1, true) + end + end + + return true + end +}) + +ItemHandlers::UseInBattle.add(:POKEDOLL, proc { |item, battler, battle| + battle.decision = 3 + battle.pbDisplayPaused(_INTL("Got away safely!")) +}) + +ItemHandlers::UseFromBag.add(:LANTERN, proc { |item| + darkness = $PokemonTemp.darknessSprite + if !darkness || darkness.disposed? + Kernel.pbMessage(_INTL("The cave is already illuminated.")) + return false + end + Kernel.pbMessage(_INTL("The Lantern illuminated the cave!")) + $PokemonGlobal.flashUsed = true + darkness.radius += 176 + #while darkness.radius<176 + # Graphics.update + # Input.update + # pbUpdateSceneMap + # darkness.radius+=4 + #end + return true +}) + +ItemHandlers::UseFromBag.add(:AZUREFLUTE, proc { |item| + if Kernel.pbConfirmMessage(_INTL("Play the Azure Flute?")) + Kernel.pbMessage(_INTL("You blew into the Azure Flute.")) + if $game_map.map_id == 694 + Kernel.pbMessage(_INTL("A strange sound echoed from the sky...")) + $game_switches[469] = true + next true + else + Kernel.pbMessage(_INTL("But nothing happened...")) + next false + end + #Kernel.pbMessage(_INTL("{1} was transported somewhere...",$Trainer.name)) + #Kernel.pbTransfer(376,14,51) + end + return false +}) + +ItemHandlers::UseOnPokemon.add(:TRANSGENDERSTONE, proc { |item, pokemon, scene| + if pokemon.gender == 0 + pokemon.makeFemale + scene.pbRefresh + scene.pbDisplay(_INTL("The Pokémon became female!")) + next true + elsif pokemon.gender == 1 + pokemon.makeMale + scene.pbRefresh + scene.pbDisplay(_INTL("The Pokémon became male!")) + + next true + else + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end +}) + +ItemHandlers::UseOnPokemon.add(:ABILITYCAPSULE, proc { |item, poke, scene| + abilityList = poke.getAbilityList + abil1 = 0; abil2 = 0 + for i in abilityList + abil1 = i[0] if i[1] == 0 + abil2 = i[1] if i[1] == 1 + end + if poke.abilityIndex() >= 2 || abil1 == abil2 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + if Kernel.pbConfirmMessage(_INTL("Do you want to change {1}'s ability?", + poke.name)) + + if poke.abilityIndex() == 0 + poke.setAbility(1) + else + poke.setAbility(0) + end + scene.pbDisplay(_INTL("{1}'s ability was changed!", poke.name)) + next true + end + next false + +}) + +#NOT FULLY IMPLEMENTED +ItemHandlers::UseOnPokemon.add(:SECRETCAPSULE, proc { |item, poke, scene| + abilityList = poke.getAbilityList + numAbilities = abilityList[0].length + + if numAbilities <= 2 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + elsif abilityList[0].length <= 3 + if changeHiddenAbility1(abilityList, scene, poke) + next true + end + next false + else + if changeHiddenAbility2(abilityList, scene, poke) + next true + end + next false + end +}) + +def changeHiddenAbility1(abilityList, scene, poke) + abID1 = abilityList[0][2] + msg = _INTL("Change {1}'s ability to {2}?", poke.name, PBAbilities.getName(abID1)) + if Kernel.pbConfirmMessage(_INTL(msg)) + poke.setAbility(2) + abilName1 = PBAbilities.getName(abID1) + scene.pbDisplay(_INTL("{1}'s ability was changed to {2}!", poke.name, PBAbilities.getName(abID1))) + return true + else + return false + end +end + +def changeHiddenAbility2(abilityList, scene, poke) + return false if !Kernel.pbConfirmMessage(_INTL("Change {1}'s ability?", poke.name)) + + abID1 = abilityList[0][2] + abID2 = abilityList[0][3] + + abilName2 = PBAbilities.getName(abID1) + abilName3 = PBAbilities.getName(abID2) + + if (Kernel.pbMessage("Choose an ability.", [_INTL("{1}", abilName2), _INTL("{1}", abilName3)], 2)) == 0 + poke.setAbility(2) + scene.pbDisplay(_INTL("{1}'s ability was changed to {2}!", poke.name, abilName2)) + else + return false + end + poke.setAbility(3) + scene.pbDisplay(_INTL("{1}'s ability was changed to {2}!", poke.name, abilName3)) + return true +end + +ItemHandlers::UseOnPokemon.add(:ROCKETMEAL, proc { |item, pokemon, scene| + next pbHPItem(pokemon, 100, scene) +}) + +ItemHandlers::BattleUseOnPokemon.add(:ROCKETMEAL, proc { |item, pokemon, battler, scene| + next pbBattleHPItem(pokemon, battler, 100, scene) +}) + +ItemHandlers::UseOnPokemon.add(:FANCYMEAL, proc { |item, pokemon, scene| + next pbHPItem(pokemon, 100, scene) +}) + +ItemHandlers::BattleUseOnPokemon.add(:FANCYMEAL, proc { |item, pokemon, battler, scene| + next pbBattleHPItem(pokemon, battler, 100, scene) +}) + +ItemHandlers::UseOnPokemon.add(:RAGECANDYBAR, proc { |item, pokemon, scene| + if pokemon.level <= 1 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + else + pbChangeLevel(pokemon, pokemon.level - 1, scene) + scene.pbHardRefresh + next true + end +}) + +ItemHandlers::UseOnPokemon.add(:INCUBATOR, proc { |item, pokemon, scene| + if pokemon.isEgg? + if pokemon.eggsteps <= 1 + scene.pbDisplay(_INTL("The egg is already ready to hatch!")) + next false + else + scene.pbDisplay(_INTL("Incubating...")) + scene.pbDisplay(_INTL("...")) + scene.pbDisplay(_INTL("...")) + scene.pbDisplay(_INTL("Your egg is ready to hatch!")) + pokemon.eggsteps = 1 + next true + end + else + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end +}) + +ItemHandlers::UseOnPokemon.add(:MISTSTONE, proc { |item, pokemon, scene| + if pbForceEvo(pokemon) + next true + else + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end +}) + +def pbForceEvo(pokemon) + newspecies = getEvolvedSpecies(pokemon) + return false if newspecies == -1 + if newspecies > 0 + evo = PokemonEvolutionScene.new + evo.pbStartScreen(pokemon, newspecies) + evo.pbEvolution + evo.pbEndScreen + end + return true +end + +def getEvolvedSpecies(pokemon) + return pbCheckEvolutionEx(pokemon) { |pokemon, evonib, level, poke| + next pbMiniCheckEvolution(pokemon, evonib, level, poke, true) + } +end + +#(copie de fixEvolutionOverflow dans FusionScene) +def getCorrectEvolvedSpecies(pokemon) + if pokemon.species >= NB_POKEMON + body = getBasePokemonID(pokemon.species) + head = getBasePokemonID(pokemon.species, false) + ret1 = -1; ret2 = -1 + for form in pbGetEvolvedFormData(body) + retB = yield pokemon, form[0], form[1], form[2] + break if retB > 0 + end + for form in pbGetEvolvedFormData(head) + retH = yield pokemon, form[0], form[1], form[2] + break if retH > 0 + end + return ret if ret == retB && ret == retH + return fixEvolutionOverflow(retB, retH, pokemon.species) + else + for form in pbGetEvolvedFormData(pokemon.species) + newspecies = form[2] + end + return newspecies; + end + +end + +######################### +## DNA SPLICERS ####### +######################### + +ItemHandlers::UseOnPokemon.add(:INFINITESPLICERS, proc { |item, pokemon, scene| + next true if pbDNASplicing(pokemon, scene, true, true) + next false +}) + +ItemHandlers::UseOnPokemon.add(:DNASPLICERS, proc { |item, pokemon, scene| + next true if pbDNASplicing(pokemon, scene) + next false +}) + +ItemHandlers::UseOnPokemon.add(:DNAREVERSER, proc { |item, pokemon, scene| + if pokemon.species <= CONST_NB_POKE + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + if Kernel.pbConfirmMessageSerious(_INTL("Should {1} be reversed?", pokemon.name)) + body = getBasePokemonID(pokemon.species, true) + head = getBasePokemonID(pokemon.species, false) + newspecies = (head) * CONST_NB_POKE + body + + #play animation + pbFadeOutInWithMusic(99999) { + fus = PokemonEvolutionScene.new + fus.pbStartScreen(pokemon, newspecies, true) + fus.pbEvolution(false, true) + fus.pbEndScreen + #fus.pbStartScreen(pokemon,newspecies,1) + scene.pbRefreshAnnotations(proc { |p| pbCheckEvolution(p, item) > 0 }) + scene.pbRefresh + } + next true + end + + next false +}) + +def pbDNASplicing(pokemon, scene, supersplicers = false, superSplicer = false) + if (pokemon.species <= NB_POKEMON) + if pokemon.fused != nil + if $Trainer.party.length >= 6 + scene.pbDisplay(_INTL("Your party is full! You can't unfuse {1}.", pokemon.name)) + return false + else + $Trainer.party[$Trainer.party.length] = pokemon.fused + pokemon.fused = nil + pokemon.form = 0 + scene.pbHardRefresh + scene.pbDisplay(_INTL("{1} changed Forme!", pokemon.name)) + return true + end + else + chosen = scene.pbChoosePokemon(_INTL("Fuse with which Pokémon?")) + if chosen >= 0 + poke2 = $Trainer.party[chosen] + if (poke2.species <= NB_POKEMON) && poke2 != pokemon + #check if fainted + if pokemon.hp == 0 || poke2.hp == 0 + scene.pbDisplay(_INTL("A fainted Pokémon cannot be fused!")) + return false + end + if pbFuse(pokemon, poke2, supersplicers) + pbRemovePokemonAt(chosen) + end + elsif pokemon == poke2 + scene.pbDisplay(_INTL("{1} can't be fused with itself!", pokemon.name)) + return false + else + scene.pbDisplay(_INTL("{1} can't be fused with {2}.", poke2.name, pokemon.name)) + return false + + end + + else + return false + end + end + else + return true if pbUnfuse(pokemon, scene, supersplicers) + + #unfuse + end +end + +def pbUnfuse(pokemon, scene, supersplicers, pcPosition = nil) + #pcPosition nil : unfusing from party + #pcPosition [x,x] : unfusing from pc + # + + if (pokemon.obtainMode == 2 || pokemon.ot != $Trainer.name) # && !canunfuse + scene.pbDisplay(_INTL("You can't unfuse a Pokémon obtained in a trade!")) + return false + else + if Kernel.pbConfirmMessageSerious(_INTL("Should {1} be unfused?", pokemon.name)) + if pokemon.species > (NB_POKEMON * NB_POKEMON) + NB_POKEMON #triple fusion + scene.pbDisplay(_INTL("{1} cannot be unfused.", pokemon.name)) + return false + elsif $Trainer.party.length >= 6 && !pcPosition + scene.pbDisplay(_INTL("Your party is full! You can't unfuse {1}.", pokemon.name)) + return false + else + scene.pbDisplay(_INTL("Unfusing ... ")) + scene.pbDisplay(_INTL(" ... ")) + scene.pbDisplay(_INTL(" ... ")) + + bodyPoke = getBasePokemonID(pokemon.species, true) + headPoke = getBasePokemonID(pokemon.species, false) + # pf = pokemon.species + # p1 = (pf/NB_POKEMON).round + # p2 = pf - (NB_POKEMON*p1) + + if pokemon.level > 1 + if supersplicers + lev = pokemon.level * 0.9 + else + lev = pokemon.obtainMode == 2 ? pokemon.level * 0.65 : pokemon.level * 0.75 + end + else + lev = 1 + end + poke1 = PokeBattle_Pokemon.new(bodyPoke, lev, $Trainer) + poke2 = PokeBattle_Pokemon.new(headPoke, lev, $Trainer) + + if pcPosition == nil + box = pcPosition[0] + index = pcPosition[1] + $PokemonStorage.pbStoreToBox(poke2, box, index) + else + Kernel.pbAddPokemonSilent(poke2, poke2.level) + end + #On ajoute l'autre dans le pokedex aussi + $Trainer.seen[poke1.species] = true + $Trainer.owned[poke1.species] = true + $Trainer.seen[poke2.species] = true + $Trainer.owned[poke2.species] = true + + pokemon.species = poke1.species + pokemon.level = poke1.level + pokemon.name = poke1.name + pokemon.moves = poke1.moves + pokemon.obtainMode = 0 + poke1.obtainMode = 0 + + #scene.pbDisplay(_INTL(p1.to_s + " " + p2.to_s)) + scene.pbHardRefresh + scene.pbDisplay(_INTL("Your Pokémon were successfully unfused! ")) + return true + end + end + end +end + +def pbFuse(pokemon, poke2, supersplicers = false) + newid = (pokemon.species) * NB_POKEMON + poke2.species + playingBGM = $game_system.getPlayingBGM + + pathCustom = _INTL("Graphics/CustomBattlers/{1}.{2}.png", poke2.species, pokemon.species) + #pbResolveBitmap(pathCustom) && $game_variables[196]==0 ? pathCustom : pathReg + hasCustom = false + if (pbResolveBitmap(pathCustom)) + picturePath = pathCustom + hasCustom = true + else + picturePath = _INTL("Graphics/Battlers/{1}/{1}.{2}.png", poke2.species, pokemon.species) + end + + previewwindow = PictureWindow.new(picturePath) + + if hasCustom + previewwindow.picture.pbSetColor(0, 255, 255, 200) + else + previewwindow.picture.pbSetColor(255, 255, 255, 200) + end + previewwindow.x = (Graphics.width / 2) - (previewwindow.width / 2) + previewwindow.y = ((Graphics.height - 96) / 2) - (previewwindow.height / 2) + previewwindow.z = 1000000 + + if (Kernel.pbConfirmMessage(_INTL("Fuse the two Pokémon?", newid))) + previewwindow.dispose + fus = PokemonFusionScene.new + if (fus.pbStartScreen(pokemon, poke2, newid)) + returnItemsToBag(pokemon, poke2) + fus.pbFusionScreen(false, supersplicers) + $game_variables[126] += 1 #fuse counter + fus.pbEndScreen + scene.pbHardRefresh + pbBGMPlay(playingBGM) + return true + end + else + previewwindow.dispose + return false + end + +end + +ItemHandlers::UseOnPokemon.add(:SUPERSPLICERS, proc { |item, pokemon, scene| + next true if pbDNASplicing(pokemon, scene, true, true) +}) + +def returnItemsToBag(pokemon, poke2) + + it1 = pokemon.item + it2 = poke2.item + if it1 != nil + $PokemonBag.pbStoreItem(it1, 1) + end + if it2 != nil + $PokemonBag.pbStoreItem(it2, 1) + end + pokemon.item = nil + poke2.item = nil +end + +#A AJOUTER: l'attribut dmgup ne modifie presentement pas +# le damage d'une attaque +# +ItemHandlers::UseOnPokemon.add(:DAMAGEUP, proc { |item, pokemon, scene| + move = scene.pbChooseMove(pokemon, _INTL("Boost Damage of which move?")) + if move >= 0 + #if pokemon.moves[move].damage==0 || pokemon.moves[move].accuracy<=5 || pokemon.moves[move].dmgup >=3 + # scene.pbDisplay(_INTL("It won't have any effect.")) + # next false + #else + #pokemon.moves[move].dmgup+=1 + #pokemon.moves[move].damage +=5 + #pokemon.moves[move].accuracy -=5 + + #movename=PBMoves.getName(pokemon.moves[move].id) + #scene.pbDisplay(_INTL("{1}'s damage increased.",movename)) + #next true + scene.pbDisplay(_INTL("This item has not been implemented into the game yet. It had no effect.")) + next false + #end + end +}) + +##New "stones" +ItemHandlers::UseOnPokemon.add(:UPGRADE, proc { |item, pokemon, scene| + if (pokemon.isShadow? rescue false) + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + newspecies = pbCheckEvolution(pokemon, item) + if newspecies <= 0 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + else + pbFadeOutInWithMusic(99999) { + evo = PokemonEvolutionScene.new + evo.pbStartScreen(pokemon, newspecies) + evo.pbEvolution(false) + evo.pbEndScreen + scene.pbRefreshAnnotations(proc { |p| pbCheckEvolution(p, item) > 0 }) + scene.pbRefresh + } + next true + end +}) + +ItemHandlers::UseOnPokemon.add(:DUBIOUSDISC, proc { |item, pokemon, scene| + if (pokemon.isShadow? rescue false) + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + newspecies = pbCheckEvolution(pokemon, item) + if newspecies <= 0 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + else + pbFadeOutInWithMusic(99999) { + evo = PokemonEvolutionScene.new + evo.pbStartScreen(pokemon, newspecies) + evo.pbEvolution(false) + evo.pbEndScreen + scene.pbRefreshAnnotations(proc { |p| pbCheckEvolution(p, item) > 0 }) + scene.pbRefresh + } + next true + end +}) + +ItemHandlers::UseOnPokemon.add(:ICESTONE, proc { |item, pokemon, scene| + if (pokemon.isShadow? rescue false) + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + newspecies = pbCheckEvolution(pokemon, item) + if newspecies <= 0 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + else + pbFadeOutInWithMusic(99999) { + evo = PokemonEvolutionScene.new + evo.pbStartScreen(pokemon, newspecies) + evo.pbEvolution(false) + evo.pbEndScreen + scene.pbRefreshAnnotations(proc { |p| pbCheckEvolution(p, item) > 0 }) + scene.pbRefresh + } + next true + end +}) + +ItemHandlers::UseOnPokemon.add(:MAGNETSTONE, proc { |item, pokemon, scene| + if (pokemon.isShadow? rescue false) + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + newspecies = pbCheckEvolution(pokemon, item) + if newspecies <= 0 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + else + pbFadeOutInWithMusic(99999) { + evo = PokemonEvolutionScene.new + evo.pbStartScreen(pokemon, newspecies) + evo.pbEvolution(false) + evo.pbEndScreen + scene.pbRefreshAnnotations(proc { |p| pbCheckEvolution(p, item) > 0 }) + scene.pbRefresh + } + next true + end +}) + +#easter egg for evolving shellder into slowbro's tail +ItemHandlers::UseOnPokemon.add(:SLOWPOKETAIL, proc { |item, pokemon, scene| + shellbroNum = NB_POKEMON * PBSpecies::SHELLDER + PBSpecies::SLOWBRO #SHELLBRO + newspecies = pokemon.species == PBSpecies::SHELLDER ? shellbroNum : -1 + if newspecies <= 0 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + else + pbFadeOutInWithMusic(99999) { + evo = PokemonEvolutionScene.new + evo.pbStartScreen(pokemon, newspecies) + evo.pbEvolution(false) + evo.pbEndScreen + scene.pbRefreshAnnotations(proc { |p| pbCheckEvolution(p, item) > 0 }) + scene.pbRefresh + } + next true + end +}) + +ItemHandlers::UseOnPokemon.add(:SHINYSTONE, proc { |item, pokemon, scene| + if (pokemon.isShadow? rescue false) + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + newspecies = pbCheckEvolution(pokemon, item) + if newspecies <= 0 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + else + pbFadeOutInWithMusic(99999) { + evo = PokemonEvolutionScene.new + evo.pbStartScreen(pokemon, newspecies) + evo.pbEvolution(false) + evo.pbEndScreen + scene.pbRefreshAnnotations(proc { |p| pbCheckEvolution(p, item) > 0 }) + scene.pbRefresh + } + next true + end +}) + +ItemHandlers::UseOnPokemon.add(:DAWNSTONE, proc { |item, pokemon, scene| + if (pokemon.isShadow? rescue false) + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + newspecies = pbCheckEvolution(pokemon, item) + if newspecies <= 0 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + else + pbFadeOutInWithMusic(99999) { + evo = PokemonEvolutionScene.new + evo.pbStartScreen(pokemon, newspecies) + evo.pbEvolution(false) + evo.pbEndScreen + scene.pbRefreshAnnotations(proc { |p| pbCheckEvolution(p, item) > 0 }) + scene.pbRefresh + } + next true + end +}) + +#TRACKER (for roaming legendaries) +ItemHandlers::UseInField.add(:REVEALGLASS, proc { |item| + if RoamingSpecies.length == 0 + Kernel.pbMessage(_INTL("No roaming Pokémon defined.")) + else + text = "\\l[8]" + min = $game_switches[350] ? 0 : 1 + for i in min...RoamingSpecies.length + poke = RoamingSpecies[i] + next if poke == PBSPecies::FEEBAS + if $game_switches[poke[2]] + status = $PokemonGlobal.roamPokemon[i] + if status == true + if $PokemonGlobal.roamPokemonCaught[i] + text += _INTL("{1} has been caught.", + PBSpecies.getName(getID(PBSpecies, poke[0]))) + else + text += _INTL("{1} has been defeated.", + PBSpecies.getName(getID(PBSpecies, poke[0]))) + end + else + curmap = $PokemonGlobal.roamPosition[i] + if curmap + mapinfos = $RPGVX ? load_data("Data/MapInfos.rvdata") : load_data("Data/MapInfos.rxdata") + + if curmap == $game_map.map_id + text += _INTL("Beep beep! {1} appears to be nearby!", + PBSpecies.getName(getID(PBSpecies, poke[0]))) + else + text += _INTL("{1} is roaming around {3}", + PBSpecies.getName(getID(PBSpecies, poke[0])), curmap, + mapinfos[curmap].name, (curmap == $game_map.map_id) ? _INTL("(this route!)") : "") + end + else + text += _INTL("{1} is roaming in an unknown area.", + PBSpecies.getName(getID(PBSpecies, poke[0])), poke[1]) + end + end + else + #text+=_INTL("{1} does not appear to be roaming.", + # PBSpecies.getName(getID(PBSpecies,poke[0])),poke[1],poke[2]) + end + text += "\n" if i < RoamingSpecies.length - 1 + end + Kernel.pbMessage(text) + end +}) + +####EXP. ALL +#Methodes relative a l'exp sont pas encore la et pas compatibles +# avec cette version de essentials donc +# ca fait fuck all pour l'instant. +ItemHandlers::UseFromBag.add(:EXPALL, proc { |item| + $PokemonBag.pbChangeItem(:EXPALL, :EXPALLOFF) + Kernel.pbMessage(_INTL("The Exp All was turned off.")) + $game_switches[920] = false + next 1 # Continue +}) + +ItemHandlers::UseFromBag.add(:EXPALLOFF, proc { |item| + $PokemonBag.pbChangeItem(:EXPALLOFF, :EXPALL) + Kernel.pbMessage(_INTL("The Exp All was turned on.")) + $game_switches[920] = true + next 1 # Continue +}) + +ItemHandlers::BattleUseOnPokemon.add(:BANANA, proc { |item, pokemon, battler, scene| + next pbBattleHPItem(pokemon, battler, 30, scene) +}) +ItemHandlers::UseOnPokemon.add(:BANANA, proc { |item, pokemon, scene| + next pbHPItem(pokemon, 30, scene) +}) + +ItemHandlers::BattleUseOnPokemon.add(:GOLDENBANANA, proc { |item, pokemon, battler, scene| + next pbBattleHPItem(pokemon, battler, 50, scene) +}) +ItemHandlers::UseOnPokemon.add(:GOLDENBANANA, proc { |item, pokemon, scene| + next pbHPItem(pokemon, 50, scene) +}) + +ItemHandlers::UseFromBag.add(:AZUREFLUTE, proc { |item| + if Kernel.pbConfirmMessage(_INTL("Play the Azure Flute?")) + Kernel.pbMessage(_INTL("You blew into the Azure Flute.")) + if pbGet(222) >= 30 #if very good karma + Kernel.pbMessage(_INTL("A strange sound echoed from the sky...")) + Kernel.pbMessage(_INTL("{1} was transported somewhere...", $Trainer.name)) + Kernel.pbTransfer(376, 14, 51) + next true + else + Kernel.pbMessage(_INTL("But nothing happened...")) + next false + end + + end + return false +}) + +ItemHandlers::UseOnPokemon.add(:TRANSGENDERSTONE, proc { |item, pokemon, scene| + if pokemon.gender == 0 + pokemon.makeFemale + scene.pbRefresh + scene.pbDisplay(_INTL("The Pokémon became female!")) + next true + elsif pokemon.gender == 1 + pokemon.makeMale + scene.pbRefresh + scene.pbDisplay(_INTL("The Pokémon became male!")) + + next true + else + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end +}) + +ItemHandlers::UseOnPokemon.add(:ABILITYCAPSULE, proc { |item, poke, scene| + abilityList = poke.getAbilityList + abil1 = 0; abil2 = 0 + for i in abilityList + abil1 = i[0] if i[1] == 0 + abil2 = i[1] if i[1] == 1 + end + if poke.abilityIndex() >= 2 || abil1 == abil2 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + if Kernel.pbConfirmMessage(_INTL("Do you want to change {1}'s ability?", + poke.name)) + + if poke.abilityIndex() == 0 + poke.setAbility(1) + else + poke.setAbility(0) + end + scene.pbDisplay(_INTL("{1}'s ability was changed!", poke.name)) + next true + end + next false + +}) + +#NOT FULLY IMPLEMENTED +ItemHandlers::UseOnPokemon.add(:SECRETCAPSULE, proc { |item, poke, scene| + abilityList = poke.getAbilityList + numAbilities = abilityList[0].length + + if numAbilities <= 2 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + elsif abilityList[0].length <= 3 + if changeHiddenAbility1(abilityList, scene, poke) + next true + end + next false + else + if changeHiddenAbility2(abilityList, scene, poke) + next true + end + next false + end +}) + +def changeHiddenAbility1(abilityList, scene, poke) + abID1 = abilityList[0][2] + msg = _INTL("Change {1}'s ability to {2}?", poke.name, PBAbilities.getName(abID1)) + if Kernel.pbConfirmMessage(_INTL(msg)) + poke.setAbility(2) + abilName1 = PBAbilities.getName(abID1) + scene.pbDisplay(_INTL("{1}'s ability was changed to {2}!", poke.name, PBAbilities.getName(abID1))) + return true + else + return false + end +end + +def changeHiddenAbility2(abilityList, scene, poke) + return false if !Kernel.pbConfirmMessage(_INTL("Change {1}'s ability?", poke.name)) + + abID1 = abilityList[0][2] + abID2 = abilityList[0][3] + + abilName2 = PBAbilities.getName(abID1) + abilName3 = PBAbilities.getName(abID2) + + if (Kernel.pbMessage("Choose an ability.", [_INTL("{1}", abilName2), _INTL("{1}", abilName3)], 2)) == 0 + poke.setAbility(2) + scene.pbDisplay(_INTL("{1}'s ability was changed to {2}!", poke.name, abilName2)) + else + return false + end + poke.setAbility(3) + scene.pbDisplay(_INTL("{1}'s ability was changed to {2}!", poke.name, abilName3)) + return true +end + +ItemHandlers::UseOnPokemon.add(:ROCKETMEAL, proc { |item, pokemon, scene| + next pbHPItem(pokemon, 100, scene) +}) + +ItemHandlers::BattleUseOnPokemon.add(:ROCKETMEAL, proc { |item, pokemon, battler, scene| + next pbBattleHPItem(pokemon, battler, 100, scene) +}) + +ItemHandlers::UseOnPokemon.add(:FANCYMEAL, proc { |item, pokemon, scene| + next pbHPItem(pokemon, 100, scene) +}) + +ItemHandlers::BattleUseOnPokemon.add(:FANCYMEAL, proc { |item, pokemon, battler, scene| + next pbBattleHPItem(pokemon, battler, 100, scene) +}) + +ItemHandlers::UseOnPokemon.add(:RAGECANDYBAR, proc { |item, pokemon, scene| + if pokemon.level <= 1 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + else + pbChangeLevel(pokemon, pokemon.level - 1, scene) + scene.pbHardRefresh + next true + end +}) + +ItemHandlers::UseOnPokemon.add(:INCUBATOR, proc { |item, pokemon, scene| + if pokemon.isEgg? + if pokemon.eggsteps <= 1 + scene.pbDisplay(_INTL("The egg is already ready to hatch!")) + next false + else + scene.pbDisplay(_INTL("Incubating...")) + scene.pbDisplay(_INTL("...")) + scene.pbDisplay(_INTL("...")) + scene.pbDisplay(_INTL("Your egg is ready to hatch!")) + pokemon.eggsteps = 1 + next true + end + else + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end +}) + +ItemHandlers::UseOnPokemon.add(:INCUBATOR_NORMAL, proc { |item, pokemon, scene| + if pokemon.isEgg? + steps = pokemon.eggsteps + steps -= 2000 / (pokemon.nbIncubatorsUsed + 1).ceil + if steps <= 1 + pokemon.eggsteps = 1 + else + pokemon.eggsteps = steps + end + if pokemon.eggsteps <= 1 + scene.pbDisplay(_INTL("Incubating...")) + scene.pbDisplay(_INTL("...")) + scene.pbDisplay(_INTL("...")) + scene.pbDisplay(_INTL("The egg is ready to hatch!")) + next false + else + scene.pbDisplay(_INTL("Incubating...")) + scene.pbDisplay(_INTL("...")) + scene.pbDisplay(_INTL("...")) + if pokemon.nbIncubatorsUsed >= 10 + scene.pbDisplay(_INTL("The egg is a bit closer to hatching")) + else + scene.pbDisplay(_INTL("The egg is closer to hatching")) + end + pokemon.incrIncubator() + next true + end + else + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end +}) + +ItemHandlers::UseOnPokemon.add(:MISTSTONE, proc { |item, pokemon, scene| + if pbForceEvo(pokemon) + next true + else + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end +}) + +def pbForceEvo(pokemon) + newspecies = getEvolvedSpecies(pokemon) + return false if newspecies == -1 + if newspecies > 0 + evo = PokemonEvolutionScene.new + evo.pbStartScreen(pokemon, newspecies) + evo.pbEvolution + evo.pbEndScreen + end + return true +end + +def getEvolvedSpecies(pokemon) + return pbCheckEvolutionEx(pokemon) { |pokemon, evonib, level, poke| + next pbMiniCheckEvolution(pokemon, evonib, level, poke, true) + } +end + +#(copie de fixEvolutionOverflow dans FusionScene) +def getCorrectEvolvedSpecies(pokemon) + if pokemon.species >= NB_POKEMON + body = getBasePokemonID(pokemon.species) + head = getBasePokemonID(pokemon.species, false) + ret1 = -1; ret2 = -1 + for form in pbGetEvolvedFormData(body) + retB = yield pokemon, form[0], form[1], form[2] + break if retB > 0 + end + for form in pbGetEvolvedFormData(head) + retH = yield pokemon, form[0], form[1], form[2] + break if retH > 0 + end + return ret if ret == retB && ret == retH + return fixEvolutionOverflow(retB, retH, pokemon.species) + else + for form in pbGetEvolvedFormData(pokemon.species) + newspecies = form[2] + end + return newspecies; + end + +end + +######################### +## DNA SPLICERS ####### +######################### + +ItemHandlers::UseOnPokemon.add(:INFINITESPLICERS, proc { |item, pokemon, scene| + next true if pbDNASplicing(pokemon, scene) + next false +}) + +ItemHandlers::UseOnPokemon.add(:INFINITESPLICERS2, proc { |item, pokemon, scene| + next true if pbDNASplicing(pokemon, scene, true, true) + next false +}) + +ItemHandlers::UseOnPokemon.add(:DNASPLICERS, proc { |item, pokemon, scene| + next true if pbDNASplicing(pokemon, scene) + next false +}) + +ItemHandlers::UseOnPokemon.add(:DNAREVERSER, proc { |item, pokemon, scene| + if pokemon.species <= CONST_NB_POKE + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + if Kernel.pbConfirmMessageSerious(_INTL("Should {1} be reversed?", pokemon.name)) + body = getBasePokemonID(pokemon.species, true) + head = getBasePokemonID(pokemon.species, false) + newspecies = (head) * CONST_NB_POKE + body + + #play animation + pbFadeOutInWithMusic(99999) { + fus = PokemonEvolutionScene.new + fus.pbStartScreen(pokemon, newspecies, true) + fus.pbEvolution(false, true) + fus.pbEndScreen + #fus.pbStartScreen(pokemon,newspecies,1) + scene.pbRefreshAnnotations(proc { |p| pbCheckEvolution(p, item) > 0 }) + scene.pbRefresh + } + next true + end + + next false +}) + +ItemHandlers::UseOnPokemon.add(:INFINITEREVERSERS, proc { |item, pokemon, scene| + if pokemon.species <= CONST_NB_POKE + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + if Kernel.pbConfirmMessageSerious(_INTL("Should {1} be reversed?", pokemon.name)) + body = getBasePokemonID(pokemon.species, true) + head = getBasePokemonID(pokemon.species, false) + newspecies = (head) * CONST_NB_POKE + body + + #play animation + pbFadeOutInWithMusic(99999) { + fus = PokemonEvolutionScene.new + fus.pbStartScreen(pokemon, newspecies, true) + fus.pbEvolution(false, true) + fus.pbEndScreen + scene.pbRefreshAnnotations(proc { |p| pbCheckEvolution(p, item) > 0 }) + scene.pbRefresh + } + next true + end + + next false +}) + +def pbDNASplicing(pokemon, scene, supersplicers = false, superSplicer = false) + playingBGM = $game_system.getPlayingBGM + dexNumber = pokemon.species_data.id_number + if (pokemon.species_data.id_number <= NB_POKEMON) + if pokemon.fused != nil + if $Trainer.party.length >= 6 + scene.pbDisplay(_INTL("Your party is full! You can't unfuse {1}.", pokemon.name)) + return false + else + $Trainer.party[$Trainer.party.length] = pokemon.fused + pokemon.fused = nil + pokemon.form = 0 + scene.pbHardRefresh + scene.pbDisplay(_INTL("{1} changed Forme!", pokemon.name)) + return true + end + else + chosen = scene.pbChoosePokemon(_INTL("Fuse with which Pokémon?")) + if chosen >= 0 + poke2 = $Trainer.party[chosen] + if (poke2.species_data.id_number <= NB_POKEMON) && poke2 != pokemon + #check if fainted + if pokemon.hp == 0 || poke2.hp == 0 + scene.pbDisplay(_INTL("A fainted Pokémon cannot be fused!")) + return false + end + + newid = (pokemon.species_data.id_number) * NB_POKEMON + poke2.species_data.id_number + + pathCustom = _INTL("Graphics/CustomBattlers/{1}.{2}.png", poke2.species_data.id_number, pokemon.species_data.id_number) + #pbResolveBitmap(pathCustom) && $game_variables[196]==0 ? pathCustom : pathReg + hasCustom = false + if (pbResolveBitmap(pathCustom)) + picturePath = pathCustom + hasCustom = true + else + picturePath = _INTL("Graphics/Battlers/{1}/{1}.{2}.png", poke2.species_data.id_number, pokemon.species_data.id_number) + end + + previewwindow = PictureWindow.new(picturePath) + + if hasCustom + previewwindow.picture.pbSetColor(220, 255, 220, 200) + else + previewwindow.picture.pbSetColor(255, 255, 255, 200) + end + previewwindow.x = (Graphics.width / 2) - (previewwindow.width / 2) + previewwindow.y = ((Graphics.height - 96) / 2) - (previewwindow.height / 2) + previewwindow.z = 1000000 + + if (Kernel.pbConfirmMessage(_INTL("Fuse the two Pokémon?", newid))) + previewwindow.dispose + fus = PokemonFusionScene.new + if (fus.pbStartScreen(pokemon, poke2, newid)) + returnItemsToBag(pokemon, poke2) + fus.pbFusionScreen(false, supersplicers) + $game_variables[126] += 1 #fuse counter + pbRemovePokemonAt(chosen) + fus.pbEndScreen + scene.pbHardRefresh + pbBGMPlay(playingBGM) + return true + + end + else + previewwindow.dispose + return false + end + + elsif pokemon == poke2 + scene.pbDisplay(_INTL("{1} can't be fused with itself!", pokemon.name)) + return false + else + scene.pbDisplay(_INTL("{1} can't be fused with {2}.", poke2.name, pokemon.name)) + return false + + end + else + return false + end + end + else + #UNFUSE + + bodyPoke = getBasePokemonID(pokemon.species_data.id_number, true) + headPoke = getBasePokemonID(pokemon.species_data.id_number, false) + + if (pokemon.obtainMode == 2 || pokemon.ot != $Trainer.name) # && !canunfuse + scene.pbDisplay(_INTL("You can't unfuse a Pokémon obtained in a trade!")) + return false + else + if Kernel.pbConfirmMessageSerious(_INTL("Should {1} be unfused?", pokemon.name)) + if pokemon.species_data.id_number > (NB_POKEMON * NB_POKEMON) + NB_POKEMON #triple fusion + scene.pbDisplay(_INTL("{1} cannot be unfused.", pokemon.name)) + return false + end + + keepInParty = 0 + if $Trainer.party.length >= 6 + scene.pbDisplay(_INTL("Your party is full! Keep which Pokémon in party?")) + choice = Kernel.pbMessage("Select a Pokémon to keep in your party.", [_INTL("{1}", PBSpecies.getName(bodyPoke)), _INTL("{1}", PBSpecies.getName(headPoke)), "Cancel"], 2) + if choice == 2 + return false + else + keepInParty = choice + end + end + + scene.pbDisplay(_INTL("Unfusing ... ")) + scene.pbDisplay(_INTL(" ... ")) + scene.pbDisplay(_INTL(" ... ")) + + # pf = pokemon.species + # p1 = (pf/NB_POKEMON).round + # p2 = pf - (NB_POKEMON*p1) + + if pokemon.level > 1 + if supersplicers + lev = pokemon.level * 0.9 + else + lev = pokemon.obtainMode == 2 ? pokemon.level * 0.65 : pokemon.level * 0.80 + end + else + lev = 1 + end + poke1 = PokeBattle_Pokemon.new(bodyPoke, lev, $Trainer) + poke2 = PokeBattle_Pokemon.new(headPoke, lev, $Trainer) + + if $Trainer.party.length >= 6 + if (keepInParty == 0) + $PokemonStorage.pbStoreCaught(poke2) + scene.pbDisplay(_INTL("{1} was sent to the PC.", poke2.name)) + else + poke2 = PokeBattle_Pokemon.new(bodyPoke, lev, $Trainer) + poke1 = PokeBattle_Pokemon.new(headPoke, lev, $Trainer) + + $PokemonStorage.pbStoreCaught(poke2) + scene.pbDisplay(_INTL("{1} was sent to the PC.", poke2.name)) + end + else + Kernel.pbAddPokemonSilent(poke2, poke2.level) + end + + #On ajoute l'autre dans le pokedex aussi + $Trainer.seen[poke1.species] = true + $Trainer.owned[poke1.species] = true + + pokemon.species = poke1.species + pokemon.level = poke1.level + pokemon.name = poke1.name + pokemon.moves = poke1.moves + pokemon.obtainMode = 0 + poke1.obtainMode = 0 + + #scene.pbDisplay(_INTL(p1.to_s + " " + p2.to_s)) + scene.pbHardRefresh + scene.pbDisplay(_INTL("Your Pokémon were successfully unfused! ")) + return true + end + end + end +end + +ItemHandlers::UseOnPokemon.add(:SUPERSPLICERS, proc { |item, pokemon, scene| + next true if pbDNASplicing(pokemon, scene, true, true) +}) + +def returnItemsToBag(pokemon, poke2) + + it1 = pokemon.item + it2 = poke2.item + + $PokemonBag.pbStoreItem(it1, 1) if it1 != nil + $PokemonBag.pbStoreItem(it2, 1) if it2 != nil + + pokemon.item = nil + poke2.item = nil +end + +#A AJOUTER: l'attribut dmgup ne modifie presentement pas +# le damage d'une attaque +# +ItemHandlers::UseOnPokemon.add(:DAMAGEUP, proc { |item, pokemon, scene| + move = scene.pbChooseMove(pokemon, _INTL("Boost Damage of which move?")) + if move >= 0 + #if pokemon.moves[move].damage==0 || pokemon.moves[move].accuracy<=5 || pokemon.moves[move].dmgup >=3 + # scene.pbDisplay(_INTL("It won't have any effect.")) + # next false + #else + #pokemon.moves[move].dmgup+=1 + #pokemon.moves[move].damage +=5 + #pokemon.moves[move].accuracy -=5 + + #movename=PBMoves.getName(pokemon.moves[move].id) + #scene.pbDisplay(_INTL("{1}'s damage increased.",movename)) + #next true + scene.pbDisplay(_INTL("This item has not been implemented into the game yet. It had no effect.")) + next false + #end + end +}) + +##New "stones" +ItemHandlers::UseOnPokemon.add(:UPGRADE, proc { |item, pokemon, scene| + if (pokemon.isShadow? rescue false) + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + newspecies = pbCheckEvolution(pokemon, item) + if newspecies <= 0 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + else + pbFadeOutInWithMusic(99999) { + evo = PokemonEvolutionScene.new + evo.pbStartScreen(pokemon, newspecies) + evo.pbEvolution(false) + evo.pbEndScreen + scene.pbRefreshAnnotations(proc { |p| pbCheckEvolution(p, item) > 0 }) + scene.pbRefresh + } + next true + end +}) + +ItemHandlers::UseOnPokemon.add(:DUBIOUSDISC, proc { |item, pokemon, scene| + if (pokemon.isShadow? rescue false) + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + newspecies = pbCheckEvolution(pokemon, item) + if newspecies <= 0 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + else + pbFadeOutInWithMusic(99999) { + evo = PokemonEvolutionScene.new + evo.pbStartScreen(pokemon, newspecies) + evo.pbEvolution(false) + evo.pbEndScreen + scene.pbRefreshAnnotations(proc { |p| pbCheckEvolution(p, item) > 0 }) + scene.pbRefresh + } + next true + end +}) + +ItemHandlers::UseOnPokemon.add(:ICESTONE, proc { |item, pokemon, scene| + if (pokemon.isShadow? rescue false) + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + newspecies = pbCheckEvolution(pokemon, item) + if newspecies <= 0 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + else + pbFadeOutInWithMusic(99999) { + evo = PokemonEvolutionScene.new + evo.pbStartScreen(pokemon, newspecies) + evo.pbEvolution(false) + evo.pbEndScreen + scene.pbRefreshAnnotations(proc { |p| pbCheckEvolution(p, item) > 0 }) + scene.pbRefresh + } + next true + end +}) + +ItemHandlers::UseOnPokemon.add(:MAGNETSTONE, proc { |item, pokemon, scene| + if (pokemon.isShadow? rescue false) + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + newspecies = pbCheckEvolution(pokemon, item) + if newspecies <= 0 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + else + pbFadeOutInWithMusic(99999) { + evo = PokemonEvolutionScene.new + evo.pbStartScreen(pokemon, newspecies) + evo.pbEvolution(false) + evo.pbEndScreen + scene.pbRefreshAnnotations(proc { |p| pbCheckEvolution(p, item) > 0 }) + scene.pbRefresh + } + next true + end +}) + +ItemHandlers::UseOnPokemon.add(:SHINYSTONE, proc { |item, pokemon, scene| + if (pokemon.isShadow? rescue false) + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + newspecies = pbCheckEvolution(pokemon, item) + if newspecies <= 0 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + else + pbFadeOutInWithMusic(99999) { + evo = PokemonEvolutionScene.new + evo.pbStartScreen(pokemon, newspecies) + evo.pbEvolution(false) + evo.pbEndScreen + scene.pbRefreshAnnotations(proc { |p| pbCheckEvolution(p, item) > 0 }) + scene.pbRefresh + } + next true + end +}) + +ItemHandlers::UseOnPokemon.add(:DAWNSTONE, proc { |item, pokemon, scene| + if (pokemon.isShadow? rescue false) + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + end + newspecies = pbCheckEvolution(pokemon, item) + if newspecies <= 0 + scene.pbDisplay(_INTL("It won't have any effect.")) + next false + else + pbFadeOutInWithMusic(99999) { + evo = PokemonEvolutionScene.new + evo.pbStartScreen(pokemon, newspecies) + evo.pbEvolution(false) + evo.pbEndScreen + scene.pbRefreshAnnotations(proc { |p| pbCheckEvolution(p, item) > 0 }) + scene.pbRefresh + } + next true + end +}) + +# +# ItemHandlers::UseOnPokemon.copy(:FIRESTONE, +# :THUNDERSTONE,:WATERSTONE,:LEAFSTONE,:MOONSTONE, +# :SUNSTONE,:DUSKSTONE,:DAWNSTONE,:SHINYSTONE,:OVALSTONE, +# :UPGRADE,:DUBIOUSDISC,:ICESTONE,:MAGNETSTONE) + +#Quest log + +ItemHandlers::UseFromBag.add(:DEVONSCOPE, proc { |item| + pbQuestlog() + next 1 +}) + +ItemHandlers::UseInField.add(:DEVONSCOPE, proc { |item| + pbQuestlog() +}) + +#TRACKER (for roaming legendaries) +ItemHandlers::UseInField.add(:REVEALGLASS, proc { |item| + nbRoaming = 0 + if RoamingSpecies.length == 0 + Kernel.pbMessage(_INTL("No roaming Pokémon defined.")) + else + text = "\\l[8]" + min = $game_switches[350] ? 0 : 1 + for i in min...RoamingSpecies.length + poke = RoamingSpecies[i] + next if poke[0] == :FEEBAS + if $game_switches[poke[2]] + status = $PokemonGlobal.roamPokemon[i] + if status == true + if $PokemonGlobal.roamPokemonCaught[i] + text += _INTL("{1} has been caught.", + PBSpecies.getName(getID(PBSpecies, poke[0]))) + else + text += _INTL("{1} has been defeated.", + PBSpecies.getName(getID(PBSpecies, poke[0]))) + end + else + nbRoaming += 1 + curmap = $PokemonGlobal.roamPosition[i] + if curmap + mapinfos = $RPGVX ? load_data("Data/MapInfos.rvdata") : load_data("Data/MapInfos.rxdata") + + if curmap == $game_map.map_id + text += _INTL("Beep beep! {1} appears to be nearby!", + PBSpecies.getName(getID(PBSpecies, poke[0]))) + else + text += _INTL("{1} is roaming around {3}", + PBSpecies.getName(getID(PBSpecies, poke[0])), curmap, + mapinfos[curmap].name, (curmap == $game_map.map_id) ? _INTL("(this route!)") : "") + end + else + text += _INTL("{1} is roaming in an unknown area.", + PBSpecies.getName(getID(PBSpecies, poke[0])), poke[1]) + end + end + else + #text+=_INTL("{1} does not appear to be roaming.", + # PBSpecies.getName(getID(PBSpecies,poke[0])),poke[1],poke[2]) + end + text += "\n" if i < RoamingSpecies.length - 1 + end + if nbRoaming == 0 + text = "No Pokémon appears to be roaming at this moment." + end + Kernel.pbMessage(text) + end +}) + +####EXP. ALL +#Methodes relative a l'exp sont pas encore la et pas compatibles +# avec cette version de essentials donc +# ca fait fuck all pour l'instant. +ItemHandlers::UseFromBag.add(:EXPALL, proc { |item| + $PokemonBag.pbChangeItem(:EXPALL, :EXPALLOFF) + Kernel.pbMessage(_INTL("The Exp All was turned off.")) + $game_switches[920] = false + next 1 # Continue +}) + +ItemHandlers::UseFromBag.add(:EXPALLOFF, proc { |item| + $PokemonBag.pbChangeItem(:EXPALLOFF, :EXPALL) + Kernel.pbMessage(_INTL("The Exp All was turned on.")) + $game_switches[920] = true + next 1 # Continue +}) + +ItemHandlers::BattleUseOnPokemon.add(:BANANA, proc { |item, pokemon, battler, scene| + next pbBattleHPItem(pokemon, battler, 30, scene) +}) +ItemHandlers::UseOnPokemon.add(:BANANA, proc { |item, pokemon, scene| + next pbHPItem(pokemon, 30, scene) +}) + +ItemHandlers::BattleUseOnPokemon.add(:GOLDENBANANA, proc { |item, pokemon, battler, scene| + next pbBattleHPItem(pokemon, battler, 50, scene) +}) +ItemHandlers::UseOnPokemon.add(:GOLDENBANANA, proc { |item, pokemon, scene| + next pbHPItem(pokemon, 50, scene) +}) \ No newline at end of file diff --git a/Data/Scripts/050_AddOns/PokemonFusion.rb b/Data/Scripts/050_AddOns/PokemonFusion.rb index f50197972..667ff58d1 100644 --- a/Data/Scripts/050_AddOns/PokemonFusion.rb +++ b/Data/Scripts/050_AddOns/PokemonFusion.rb @@ -1,45 +1,45 @@ class PBFusion - Unknown = 0 # Do not use - Happiness = 1 - HappinessDay = 2 + Unknown = 0 # Do not use + Happiness = 1 + HappinessDay = 2 HappinessNight = 3 - Level = 4 - Trade = 5 - TradeItem = 6 - Item = 7 - AttackGreater = 8 - AtkDefEqual = 9 + Level = 4 + Trade = 5 + TradeItem = 6 + Item = 7 + AttackGreater = 8 + AtkDefEqual = 9 DefenseGreater = 10 - Silcoon = 11 - Cascoon = 12 - Ninjask = 13 - Shedinja = 14 - Beauty = 15 - ItemMale = 16 - ItemFemale = 17 - DayHoldItem = 18 - NightHoldItem = 19 - HasMove = 20 - HasInParty = 21 - LevelMale = 22 - LevelFemale = 23 - Location = 24 - TradeSpecies = 25 - Custom1 = 26 - Custom2 = 27 - Custom3 = 28 - Custom4 = 29 - Custom5 = 30 - Custom6 = 31 - Custom7 = 32 + Silcoon = 11 + Cascoon = 12 + Ninjask = 13 + Shedinja = 14 + Beauty = 15 + ItemMale = 16 + ItemFemale = 17 + DayHoldItem = 18 + NightHoldItem = 19 + HasMove = 20 + HasInParty = 21 + LevelMale = 22 + LevelFemale = 23 + Location = 24 + TradeSpecies = 25 + Custom1 = 26 + Custom2 = 27 + Custom3 = 28 + Custom4 = 29 + Custom5 = 30 + Custom6 = 31 + Custom7 = 32 - EVONAMES=["Unknown", - "Happiness","HappinessDay","HappinessNight","Level","Trade", - "TradeItem","Item","AttackGreater","AtkDefEqual","DefenseGreater", - "Silcoon","Cascoon","Ninjask","Shedinja","Beauty", - "ItemMale","ItemFemale","DayHoldItem","NightHoldItem","HasMove", - "HasInParty","LevelMale","LevelFemale","Location","TradeSpecies", - "Custom1","Custom2","Custom3","Custom4","Custom5","Custom6","Custom7" + EVONAMES = ["Unknown", + "Happiness", "HappinessDay", "HappinessNight", "Level", "Trade", + "TradeItem", "Item", "AttackGreater", "AtkDefEqual", "DefenseGreater", + "Silcoon", "Cascoon", "Ninjask", "Shedinja", "Beauty", + "ItemMale", "ItemFemale", "DayHoldItem", "NightHoldItem", "HasMove", + "HasInParty", "LevelMale", "LevelFemale", "Location", "TradeSpecies", + "Custom1", "Custom2", "Custom3", "Custom4", "Custom5", "Custom6", "Custom7" ] # 0 = no parameter @@ -48,39 +48,37 @@ class PBFusion # 3 = Move internal name # 4 = Species internal name # 5 = Type internal name - EVOPARAM=[0, # Unknown (do not use) - 0,0,0,1,0, # Happiness, HappinessDay, HappinessNight, Level, Trade - 2,2,1,1,1, # TradeItem, Item, AttackGreater, AtkDefEqual, DefenseGreater - 1,1,1,1,1, # Silcoon, Cascoon, Ninjask, Shedinja, Beauty - 2,2,2,2,3, # ItemMale, ItemFemale, DayHoldItem, NightHoldItem, HasMove - 4,1,1,1,4, # HasInParty, LevelMale, LevelFemale, Location, TradeSpecies - 1,1,1,1,1,1,1 # Custom 1-7 + EVOPARAM = [0, # Unknown (do not use) + 0, 0, 0, 1, 0, # Happiness, HappinessDay, HappinessNight, Level, Trade + 2, 2, 1, 1, 1, # TradeItem, Item, AttackGreater, AtkDefEqual, DefenseGreater + 1, 1, 1, 1, 1, # Silcoon, Cascoon, Ninjask, Shedinja, Beauty + 2, 2, 2, 2, 3, # ItemMale, ItemFemale, DayHoldItem, NightHoldItem, HasMove + 4, 1, 1, 1, 4, # HasInParty, LevelMale, LevelFemale, Location, TradeSpecies + 1, 1, 1, 1, 1, 1, 1 # Custom 1-7 ] end - - class SpriteMetafile - VIEWPORT = 0 - TONE = 1 - SRC_RECT = 2 - VISIBLE = 3 - X = 4 - Y = 5 - Z = 6 - OX = 7 - OY = 8 - ZOOM_X = 9 - ZOOM_Y = 10 - ANGLE = 11 - MIRROR = 12 - BUSH_DEPTH = 13 - OPACITY = 14 - BLEND_TYPE = 15 - COLOR = 16 - FLASHCOLOR = 17 + VIEWPORT = 0 + TONE = 1 + SRC_RECT = 2 + VISIBLE = 3 + X = 4 + Y = 5 + Z = 6 + OX = 7 + OY = 8 + ZOOM_X = 9 + ZOOM_Y = 10 + ANGLE = 11 + MIRROR = 12 + BUSH_DEPTH = 13 + OPACITY = 14 + BLEND_TYPE = 15 + COLOR = 16 + FLASHCOLOR = 17 FLASHDURATION = 18 - BITMAP = 19 + BITMAP = 19 def length return @metafile.length @@ -90,16 +88,16 @@ class SpriteMetafile return @metafile[i] end - def initialize(viewport=nil) - @metafile=[] - @values=[ - viewport, - Tone.new(0,0,0,0),Rect.new(0,0,0,0), - true, - 0,0,0,0,0,100,100, - 0,false,0,255,0, - Color.new(0,0,0,0),Color.new(0,0,0,0), - 0 + def initialize(viewport = nil) + @metafile = [] + @values = [ + viewport, + Tone.new(0, 0, 0, 0), Rect.new(0, 0, 0, 0), + true, + 0, 0, 0, 0, 0, 100, 100, + 0, false, 0, 255, 0, + Color.new(0, 0, 0, 0), Color.new(0, 0, 0, 0), + 0 ] end @@ -110,12 +108,12 @@ class SpriteMetafile def dispose end - def flash(color,duration) - if duration>0 - @values[FLASHCOLOR]=color.clone - @values[FLASHDURATION]=duration - @metafile.push([FLASHCOLOR,color]) - @metafile.push([FLASHDURATION,duration]) + def flash(color, duration) + if duration > 0 + @values[FLASHCOLOR] = color.clone + @values[FLASHDURATION] = duration + @metafile.push([FLASHCOLOR, color]) + @metafile.push([FLASHDURATION, duration]) end end @@ -124,8 +122,8 @@ class SpriteMetafile end def x=(value) - @values[X]=value - @metafile.push([X,value]) + @values[X] = value + @metafile.push([X, value]) end def y @@ -133,8 +131,8 @@ class SpriteMetafile end def y=(value) - @values[Y]=value - @metafile.push([Y,value]) + @values[Y] = value + @metafile.push([Y, value]) end def bitmap @@ -143,8 +141,8 @@ class SpriteMetafile def bitmap=(value) if value && !value.disposed? - @values[SRC_RECT].set(0,0,value.width,value.height) - @metafile.push([SRC_RECT,@values[SRC_RECT].clone]) + @values[SRC_RECT].set(0, 0, value.width, value.height) + @metafile.push([SRC_RECT, @values[SRC_RECT].clone]) end end @@ -153,17 +151,17 @@ class SpriteMetafile end def src_rect=(value) - @values[SRC_RECT]=value - @metafile.push([SRC_RECT,value]) - end + @values[SRC_RECT] = value + @metafile.push([SRC_RECT, value]) + end def visible return @values[VISIBLE] end def visible=(value) - @values[VISIBLE]=value - @metafile.push([VISIBLE,value]) + @values[VISIBLE] = value + @metafile.push([VISIBLE, value]) end def z @@ -171,8 +169,8 @@ class SpriteMetafile end def z=(value) - @values[Z]=value - @metafile.push([Z,value]) + @values[Z] = value + @metafile.push([Z, value]) end def ox @@ -180,8 +178,8 @@ class SpriteMetafile end def ox=(value) - @values[OX]=value - @metafile.push([OX,value]) + @values[OX] = value + @metafile.push([OX, value]) end def oy @@ -189,8 +187,8 @@ class SpriteMetafile end def oy=(value) - @values[OY]=value - @metafile.push([OY,value]) + @values[OY] = value + @metafile.push([OY, value]) end def zoom_x @@ -198,8 +196,8 @@ class SpriteMetafile end def zoom_x=(value) - @values[ZOOM_X]=value - @metafile.push([ZOOM_X,value]) + @values[ZOOM_X] = value + @metafile.push([ZOOM_X, value]) end def zoom_y @@ -207,8 +205,8 @@ class SpriteMetafile end def zoom_y=(value) - @values[ZOOM_Y]=value - @metafile.push([ZOOM_Y,value]) + @values[ZOOM_Y] = value + @metafile.push([ZOOM_Y, value]) end def angle @@ -216,8 +214,8 @@ class SpriteMetafile end def angle=(value) - @values[ANGLE]=value - @metafile.push([ANGLE,value]) + @values[ANGLE] = value + @metafile.push([ANGLE, value]) end def mirror @@ -225,8 +223,8 @@ class SpriteMetafile end def mirror=(value) - @values[MIRROR]=value - @metafile.push([MIRROR,value]) + @values[MIRROR] = value + @metafile.push([MIRROR, value]) end def bush_depth @@ -234,8 +232,8 @@ class SpriteMetafile end def bush_depth=(value) - @values[BUSH_DEPTH]=value - @metafile.push([BUSH_DEPTH,value]) + @values[BUSH_DEPTH] = value + @metafile.push([BUSH_DEPTH, value]) end def opacity @@ -243,8 +241,8 @@ class SpriteMetafile end def opacity=(value) - @values[OPACITY]=value - @metafile.push([OPACITY,value]) + @values[OPACITY] = value + @metafile.push([OPACITY, value]) end def blend_type @@ -252,8 +250,8 @@ class SpriteMetafile end def blend_type=(value) - @values[BLEND_TYPE]=value - @metafile.push([BLEND_TYPE,value]) + @values[BLEND_TYPE] = value + @metafile.push([BLEND_TYPE, value]) end def color @@ -261,8 +259,8 @@ class SpriteMetafile end def color=(value) - @values[COLOR]=value.clone - @metafile.push([COLOR,@values[COLOR]]) + @values[COLOR] = value.clone + @metafile.push([COLOR, @values[COLOR]]) end def tone @@ -270,23 +268,21 @@ class SpriteMetafile end def tone=(value) - @values[TONE]=value.clone - @metafile.push([TONE,@values[TONE]]) + @values[TONE] = value.clone + @metafile.push([TONE, @values[TONE]]) end def update - @metafile.push([-1,nil]) + @metafile.push([-1, nil]) end end - - class SpriteMetafilePlayer - def initialize(metafile,sprite=nil) - @metafile=metafile - @sprites=[] - @playing=false - @index=0 + def initialize(metafile, sprite = nil) + @metafile = metafile + @sprites = [] + @playing = false + @index = 0 @sprites.push(sprite) if sprite end @@ -299,338 +295,327 @@ class SpriteMetafilePlayer end def play - @playing=true - @index=0 + @playing = true + @index = 0 end def update if @playing for j in @index...@metafile.length - @index=j+1 - break if @metafile[j][0]<0 - code=@metafile[j][0] - value=@metafile[j][1] + @index = j + 1 + break if @metafile[j][0] < 0 + code = @metafile[j][0] + value = @metafile[j][1] for sprite in @sprites case code - when SpriteMetafile::X - sprite.x=value - when SpriteMetafile::Y - sprite.y=value - when SpriteMetafile::OX - sprite.ox=value - when SpriteMetafile::OY - sprite.oy=value - when SpriteMetafile::ZOOM_X - sprite.zoom_x=value - when SpriteMetafile::ZOOM_Y - sprite.zoom_y=value - when SpriteMetafile::SRC_RECT - sprite.src_rect=value - when SpriteMetafile::VISIBLE - sprite.visible=value - when SpriteMetafile::Z - sprite.z=value + when SpriteMetafile::X + sprite.x = value + when SpriteMetafile::Y + sprite.y = value + when SpriteMetafile::OX + sprite.ox = value + when SpriteMetafile::OY + sprite.oy = value + when SpriteMetafile::ZOOM_X + sprite.zoom_x = value + when SpriteMetafile::ZOOM_Y + sprite.zoom_y = value + when SpriteMetafile::SRC_RECT + sprite.src_rect = value + when SpriteMetafile::VISIBLE + sprite.visible = value + when SpriteMetafile::Z + sprite.z = value # prevent crashes - when SpriteMetafile::ANGLE - sprite.angle=(value==180) ? 179.9 : value - when SpriteMetafile::MIRROR - sprite.mirror=value - when SpriteMetafile::BUSH_DEPTH - sprite.bush_depth=value - when SpriteMetafile::OPACITY - sprite.opacity=value - when SpriteMetafile::BLEND_TYPE - sprite.blend_type=value - when SpriteMetafile::COLOR - sprite.color=value - when SpriteMetafile::TONE - sprite.tone=value + when SpriteMetafile::ANGLE + sprite.angle = (value == 180) ? 179.9 : value + when SpriteMetafile::MIRROR + sprite.mirror = value + when SpriteMetafile::BUSH_DEPTH + sprite.bush_depth = value + when SpriteMetafile::OPACITY + sprite.opacity = value + when SpriteMetafile::BLEND_TYPE + sprite.blend_type = value + when SpriteMetafile::COLOR + sprite.color = value + when SpriteMetafile::TONE + sprite.tone = value end end end - @playing=false if @index==@metafile.length + @playing = false if @index == @metafile.length end end end - - def pbSaveSpriteState(sprite) - state=[] + state = [] return state if !sprite || sprite.disposed? - state[SpriteMetafile::BITMAP] = sprite.x - state[SpriteMetafile::X] = sprite.x - state[SpriteMetafile::Y] = sprite.y - state[SpriteMetafile::SRC_RECT] = sprite.src_rect.clone - state[SpriteMetafile::VISIBLE] = sprite.visible - state[SpriteMetafile::Z] = sprite.z - state[SpriteMetafile::OX] = sprite.ox - state[SpriteMetafile::OY] = sprite.oy - state[SpriteMetafile::ZOOM_X] = sprite.zoom_x - state[SpriteMetafile::ZOOM_Y] = sprite.zoom_y - state[SpriteMetafile::ANGLE] = sprite.angle - state[SpriteMetafile::MIRROR] = sprite.mirror + state[SpriteMetafile::BITMAP] = sprite.x + state[SpriteMetafile::X] = sprite.x + state[SpriteMetafile::Y] = sprite.y + state[SpriteMetafile::SRC_RECT] = sprite.src_rect.clone + state[SpriteMetafile::VISIBLE] = sprite.visible + state[SpriteMetafile::Z] = sprite.z + state[SpriteMetafile::OX] = sprite.ox + state[SpriteMetafile::OY] = sprite.oy + state[SpriteMetafile::ZOOM_X] = sprite.zoom_x + state[SpriteMetafile::ZOOM_Y] = sprite.zoom_y + state[SpriteMetafile::ANGLE] = sprite.angle + state[SpriteMetafile::MIRROR] = sprite.mirror state[SpriteMetafile::BUSH_DEPTH] = sprite.bush_depth - state[SpriteMetafile::OPACITY] = sprite.opacity + state[SpriteMetafile::OPACITY] = sprite.opacity state[SpriteMetafile::BLEND_TYPE] = sprite.blend_type - state[SpriteMetafile::COLOR] = sprite.color.clone - state[SpriteMetafile::TONE] = sprite.tone.clone + state[SpriteMetafile::COLOR] = sprite.color.clone + state[SpriteMetafile::TONE] = sprite.tone.clone return state end -def pbRestoreSpriteState(sprite,state) +def pbRestoreSpriteState(sprite, state) return if !state || !sprite || sprite.disposed? - sprite.x = state[SpriteMetafile::X] - sprite.y = state[SpriteMetafile::Y] - sprite.src_rect = state[SpriteMetafile::SRC_RECT] - sprite.visible = state[SpriteMetafile::VISIBLE] - sprite.z = state[SpriteMetafile::Z] - sprite.ox = state[SpriteMetafile::OX] - sprite.oy = state[SpriteMetafile::OY] - sprite.zoom_x = state[SpriteMetafile::ZOOM_X] - sprite.zoom_y = state[SpriteMetafile::ZOOM_Y] - sprite.angle = state[SpriteMetafile::ANGLE] - sprite.mirror = state[SpriteMetafile::MIRROR] + sprite.x = state[SpriteMetafile::X] + sprite.y = state[SpriteMetafile::Y] + sprite.src_rect = state[SpriteMetafile::SRC_RECT] + sprite.visible = state[SpriteMetafile::VISIBLE] + sprite.z = state[SpriteMetafile::Z] + sprite.ox = state[SpriteMetafile::OX] + sprite.oy = state[SpriteMetafile::OY] + sprite.zoom_x = state[SpriteMetafile::ZOOM_X] + sprite.zoom_y = state[SpriteMetafile::ZOOM_Y] + sprite.angle = state[SpriteMetafile::ANGLE] + sprite.mirror = state[SpriteMetafile::MIRROR] sprite.bush_depth = state[SpriteMetafile::BUSH_DEPTH] - sprite.opacity = state[SpriteMetafile::OPACITY] + sprite.opacity = state[SpriteMetafile::OPACITY] sprite.blend_type = state[SpriteMetafile::BLEND_TYPE] - sprite.color = state[SpriteMetafile::COLOR] - sprite.tone = state[SpriteMetafile::TONE] + sprite.color = state[SpriteMetafile::COLOR] + sprite.tone = state[SpriteMetafile::TONE] end def pbSaveSpriteStateAndBitmap(sprite) return [] if !sprite || sprite.disposed? - state=pbSaveSpriteState(sprite) - state[SpriteMetafile::BITMAP]=sprite.bitmap + state = pbSaveSpriteState(sprite) + state[SpriteMetafile::BITMAP] = sprite.bitmap return state end -def pbRestoreSpriteStateAndBitmap(sprite,state) +def pbRestoreSpriteStateAndBitmap(sprite, state) return if !state || !sprite || sprite.disposed? - sprite.bitmap=state[SpriteMetafile::BITMAP] - pbRestoreSpriteState(sprite,state) + sprite.bitmap = state[SpriteMetafile::BITMAP] + pbRestoreSpriteState(sprite, state) return state end - - ##################### class PokemonFusionScene private - def pbGenerateMetafiles(s1x,s1y,s2x,s2y,s3x,s3y,sxx,s3xx) - sprite=SpriteMetafile.new - sprite3=SpriteMetafile.new - sprite2=SpriteMetafile.new - - sprite.opacity=255 - sprite3.opacity=255 - sprite2.opacity=0 - - - sprite.ox=s1x - sprite.oy=s1y - sprite2.ox=s2x - sprite2.oy=s2y - sprite3.ox=s3x - sprite3.oy=s3y - - - sprite.x = sxx - sprite3.x=s3xx - - red=10 - green=5 - blue=90 - - for j in 0...26 - sprite.color.red= red - sprite.color.green=green - sprite.color.blue=blue - sprite.color.alpha=j*10 - sprite.color=sprite.color - - sprite3.color.red= red - sprite3.color.green=green - sprite3.color.blue=blue - sprite3.color.alpha=j*10 - sprite3.color=sprite3.color - - - sprite2.color=sprite.color + def pbGenerateMetafiles(s1x, s1y, s2x, s2y, s3x, s3y, sxx, s3xx) + sprite = SpriteMetafile.new + sprite3 = SpriteMetafile.new + sprite2 = SpriteMetafile.new + + sprite.opacity = 255 + sprite3.opacity = 255 + sprite2.opacity = 0 + + sprite.ox = s1x + sprite.oy = s1y + sprite2.ox = s2x + sprite2.oy = s2y + sprite3.ox = s3x + sprite3.oy = s3y + + sprite.x = sxx + sprite3.x = s3xx + + red = 10 + green = 5 + blue = 90 + + for j in 0...26 + sprite.color.red = red + sprite.color.green = green + sprite.color.blue = blue + sprite.color.alpha = j * 10 + sprite.color = sprite.color + + sprite3.color.red = red + sprite3.color.green = green + sprite3.color.blue = blue + sprite3.color.alpha = j * 10 + sprite3.color = sprite3.color + + sprite2.color = sprite.color sprite.update - sprite3.update + sprite3.update sprite2.update end - anglechange=0 - sevenseconds=Graphics.frame_rate*3 #actually 3 seconds + anglechange = 0 + sevenseconds = Graphics.frame_rate * 3 #actually 3 seconds for j in 0...sevenseconds - sprite.angle+=anglechange - sprite.angle%=360 - - sprite3.angle+=anglechange - sprite3.angle%=360 - - - anglechange+=5 if j%2==0 - if j>=sevenseconds-50 - sprite2.angle=sprite.angle - sprite2.opacity+=6 + sprite.angle += anglechange + sprite.angle %= 360 + + sprite3.angle += anglechange + sprite3.angle %= 360 + + anglechange += 5 if j % 2 == 0 + if j >= sevenseconds - 50 + sprite2.angle = sprite.angle + sprite2.opacity += 6 end - - if sprite.x < sprite3.x && j >=20 - sprite.x +=2 - sprite3.x -= 2 - else - #sprite.ox+=1 - #sprite3.ox+=1 - end - + + if sprite.x < sprite3.x && j >= 20 + sprite.x += 2 + sprite3.x -= 2 + else + #sprite.ox+=1 + #sprite3.ox+=1 + end + sprite.update - sprite3.update + sprite3.update sprite2.update end - sprite.angle=360-sprite.angle - sprite3.angle=360-sprite.angle - sprite2.angle=360-sprite2.angle + sprite.angle = 360 - sprite.angle + sprite3.angle = 360 - sprite.angle + sprite2.angle = 360 - sprite2.angle for j in 0...sevenseconds - sprite2.angle+=anglechange - sprite2.angle%=360 - anglechange-=5 if j%2==0 - if j<50 - sprite.angle=sprite2.angle - sprite.opacity-=6 - - sprite3.angle=sprite2.angle - sprite3.opacity-=6 + sprite2.angle += anglechange + sprite2.angle %= 360 + anglechange -= 5 if j % 2 == 0 + if j < 50 + sprite.angle = sprite2.angle + sprite.opacity -= 6 + + sprite3.angle = sprite2.angle + sprite3.opacity -= 6 end - - - - sprite3.update + + sprite3.update sprite.update sprite2.update - - + end for j in 0...26 - sprite2.color.red=30 - sprite2.color.green=230 - sprite2.color.blue=55 - sprite2.color.alpha=(26-j)*10 - sprite2.color=sprite2.color - sprite.color=sprite2.color + sprite2.color.red = 30 + sprite2.color.green = 230 + sprite2.color.blue = 55 + sprite2.color.alpha = (26 - j) * 10 + sprite2.color = sprite2.color + sprite.color = sprite2.color sprite.update sprite2.update end - @metafile1=sprite - @metafile2=sprite2 - @metafile3=sprite3 - + @metafile1 = sprite + @metafile2 = sprite2 + @metafile3 = sprite3 + end -# Starts the evolution screen with the given Pokemon and new Pokemon species. + # Starts the evolution screen with the given Pokemon and new Pokemon species. - def pbStartScreen(pokemon1,pokemon2,newspecies) - @sprites={} - @viewport=Viewport.new(0,0,Graphics.width,Graphics.height) - @viewport.z=99999 - @pokemon1=pokemon1 - @pokemon2=pokemon2 + def pbStartScreen(pokemon1, pokemon2, newspecies) + @sprites = {} + @viewport = Viewport.new(0, 0, Graphics.width, Graphics.height) + @viewport.z = 99999 + @pokemon1 = pokemon1 + @pokemon2 = pokemon2 - @newspecies=newspecies - addBackgroundOrColoredPlane(@sprites,"background","evolutionbg", - Color.new(248,248,248),@viewport) - + @newspecies = newspecies + addBackgroundOrColoredPlane(@sprites, "background", "evolutionbg", + Color.new(248, 248, 248), @viewport) - rsprite1=PokemonSprite.new(@viewport) - rsprite2=PokemonSprite.new(@viewport) - rsprite3 =PokemonSprite.new(@viewport) - - rsprite1.setPokemonBitmap(@pokemon1,false) - rsprite3.setPokemonBitmap(@pokemon2,false) + poke1_number = GameData::Species.get(@pokemon1.species).id_number + poke2_number = GameData::Species.get(@pokemon2.species).id_number - rsprite2.setPokemonBitmapSpecies(@pokemon1,@newspecies,false) - - rsprite1.ox=rsprite1.bitmap.width/2 - rsprite1.oy=rsprite1.bitmap.height/2 - - rsprite3.ox=rsprite3.bitmap.width/2 - rsprite3.oy=rsprite3.bitmap.height/2 - - rsprite2.ox=rsprite2.bitmap.width/2 - rsprite2.oy=rsprite2.bitmap.height/2 - - - - rsprite2.x=Graphics.width/2 - rsprite1.y=(Graphics.height-96)/2 - rsprite3.y=(Graphics.height-96)/2 + rsprite1 = PokemonSprite.new(@viewport) + rsprite2 = PokemonSprite.new(@viewport) + rsprite3 = PokemonSprite.new(@viewport) - rsprite1.x=(Graphics.width/2)-100 - rsprite3.x=(Graphics.width/2)+100 - - - rsprite2.y=(Graphics.height-96)/2 - rsprite2.opacity=0 - @sprites["rsprite1"]=rsprite1 - @sprites["rsprite2"]=rsprite2 - @sprites["rsprite3"]=rsprite3 - - pbGenerateMetafiles(rsprite1.ox,rsprite1.oy,rsprite2.ox,rsprite2.oy,rsprite3.ox,rsprite3.oy,rsprite1.x,rsprite3.x) + rsprite1.setPokemonBitmapFromId(poke1_number, false) + rsprite3.setPokemonBitmapFromId(poke2_number, false) - @sprites["msgwindow"]=Kernel.pbCreateMessageWindow(@viewport) + rsprite2.setPokemonBitmapFromId(@newspecies, false) + + rsprite1.ox = rsprite1.bitmap.width / 2 + rsprite1.oy = rsprite1.bitmap.height / 2 + + rsprite3.ox = rsprite3.bitmap.width / 2 + rsprite3.oy = rsprite3.bitmap.height / 2 + + rsprite2.ox = rsprite2.bitmap.width / 2 + rsprite2.oy = rsprite2.bitmap.height / 2 + + rsprite2.x = Graphics.width / 2 + rsprite1.y = (Graphics.height - 96) / 2 + rsprite3.y = (Graphics.height - 96) / 2 + + rsprite1.x = (Graphics.width / 2) - 100 + rsprite3.x = (Graphics.width / 2) + 100 + + rsprite2.y = (Graphics.height - 96) / 2 + rsprite2.opacity = 0 + @sprites["rsprite1"] = rsprite1 + @sprites["rsprite2"] = rsprite2 + @sprites["rsprite3"] = rsprite3 + + pbGenerateMetafiles(rsprite1.ox, rsprite1.oy, rsprite2.ox, rsprite2.oy, rsprite3.ox, rsprite3.oy, rsprite1.x, rsprite3.x) + + @sprites["msgwindow"] = Kernel.pbCreateMessageWindow(@viewport) pbFadeInAndShow(@sprites) - + ####FUSION MULTIPLIER - + #####LEVELS level1 = pokemon1.level level2 = pokemon2.level - + ####LEVEL DIFFERENCE if (level1 >= level2) then - avgLevel = (2*level1 + level2)/3 + avgLevel = (2 * level1 + level2) / 3 else - avgLevel = (2*level2 + level1)/3 + avgLevel = (2 * level2 + level1) / 3 end - + ####CAPTURE RATES ####Check success Poke 1 - # if (fusionCheckSuccess (30, leveldiff, level1,fusionmultiplier)) then - # return 1 - # else + # if (fusionCheckSuccess (30, leveldiff, level1,fusionmultiplier)) then + # return 1 + # else # return 0 #end ####Check success Poke 2 - # if (fusionCheckSuccess (30, leveldiff, level1,fusionmultiplier)) then - # return 1 - # else - # return 0 - # end - return 1 + # if (fusionCheckSuccess (30, leveldiff, level1,fusionmultiplier)) then + # return 1 + # else + # return 0 + # end + return 1 end def averageFusionIvs() - for i in 0..@pokemon1.iv.length-1 - poke1Iv = @pokemon1.iv[i] - poke2Iv = @pokemon2.iv[i] - @pokemon1.iv[i] = ((poke1Iv+poke2Iv)/2).floor - end + return + # for i in 0..@pokemon1.iv.length-1 + # poke1Iv = @pokemon1.iv[i] + # poke2Iv = @pokemon2.iv[i] + # @pokemon1.iv[i] = ((poke1Iv+poke2Iv)/2).floor + # end end - + #unused. was meant for super splicers, but too broken def setHighestFusionIvs() - for i in 0..@pokemon1.iv.length-1 + for i in 0..@pokemon1.iv.length - 1 iv1 = @pokemon1.iv[i] iv2 = @pokemon2.iv[i] @pokemon1.iv[i] = iv1 >= iv2 ? iv1 : iv2 end end - -# Closes the evolution screen. + + # Closes the evolution screen. def pbEndScreen Kernel.pbDisposeMessageWindow(@sprites["msgwindow"]) pbFadeOutAndHide(@sprites) @@ -638,143 +623,139 @@ class PokemonFusionScene @viewport.dispose end -# Opens the fusion screen - def pbFusionScreen(cancancel=false,superSplicer=false) - metaplayer1=SpriteMetafilePlayer.new(@metafile1,@sprites["rsprite1"]) - metaplayer2=SpriteMetafilePlayer.new(@metafile2,@sprites["rsprite2"]) - metaplayer3=SpriteMetafilePlayer.new(@metafile3,@sprites["rsprite3"]) - - + # Opens the fusion screen + def pbFusionScreen(cancancel = false, superSplicer = false) + metaplayer1 = SpriteMetafilePlayer.new(@metafile1, @sprites["rsprite1"]) + metaplayer2 = SpriteMetafilePlayer.new(@metafile2, @sprites["rsprite2"]) + metaplayer3 = SpriteMetafilePlayer.new(@metafile3, @sprites["rsprite3"]) + metaplayer1.play metaplayer2.play metaplayer3.play - + pbBGMStop() pbPlayCry(@pokemon) Kernel.pbMessageDisplay(@sprites["msgwindow"], - _INTL("The Pokémon are being fused!",@pokemon1.name)) + _INTL("The Pokémon are being fused!", @pokemon1.name)) - - - Kernel.pbMessageWaitForInput(@sprites["msgwindow"],100,true) + Kernel.pbMessageWaitForInput(@sprites["msgwindow"], 100, true) pbPlayDecisionSE() - oldstate=pbSaveSpriteState(@sprites["rsprite1"]) - oldstate2=pbSaveSpriteState(@sprites["rsprite2"]) - oldstate3=pbSaveSpriteState(@sprites["rsprite3"]) - + oldstate = pbSaveSpriteState(@sprites["rsprite1"]) + oldstate2 = pbSaveSpriteState(@sprites["rsprite2"]) + oldstate3 = pbSaveSpriteState(@sprites["rsprite3"]) + pbBGMPlay("fusion") - + canceled = false - noMoves=false + noMoves = false begin metaplayer1.update metaplayer2.update metaplayer3.update - + Graphics.update Input.update - if Input.trigger?(Input::B) && Input.trigger?(Input::C)# && Input.trigger?(Input::A)# && cancancel - noMoves=true + if Input.trigger?(Input::B) && Input.trigger?(Input::C) # && Input.trigger?(Input::A)# && cancancel + noMoves = true pbSEPlay("buzzer") - Graphics.update + Graphics.update end end while metaplayer1.playing? && metaplayer2.playing? if canceled pbBGMStop() pbPlayCancelSE() - # Kernel.pbMessageDisplay(@sprites["msgwindow"], - @pbEndScreen - _INTL("Huh? The fusion was cancelled!") + # Kernel.pbMessageDisplay(@sprites["msgwindow"], + @pbEndScreen + _INTL("Huh? The fusion was cancelled!") else - frames=pbCryFrameLength(@newspecies) + frames = pbCryFrameLength(@newspecies) pbBGMStop() pbPlayCry(@newspecies) frames.times do Graphics.update end pbMEPlay("Voltorb Flip Win") - newspeciesname=PBSpecies.getName(@newspecies) - oldspeciesname=PBSpecies.getName(@pokemon1.species) + newSpecies = GameData::Species.get(@newspecies) + newspeciesname = newSpecies.real_name + oldspeciesname = GameData::Species.get(@pokemon1.species).real_name + Kernel.pbMessageDisplay(@sprites["msgwindow"], - _INTL("\\se[]Congratulations! Your Pokémon were fused into {2}!\\wt[80]",@pokemon1.name,newspeciesname)) - + _INTL("\\se[]Congratulations! Your Pokémon were fused into {2}!\\wt[80]", @pokemon1.name, newspeciesname)) + averageFusionIvs() #add to pokedex - if ! $Trainer.owned[@newspecies] - $Trainer.seen[@newspecies]=true - $Trainer.owned[@newspecies]=true - pbSeenForm(@pokemon) + if !$Trainer.pokedex.owned?(newSpecies) + $Trainer.pokedex.set_seen(newSpecies) + $Trainer.pokedex.set_owned(newSpecies) Kernel.pbMessageDisplay(@sprites["msgwindow"], - _INTL("{1}'s data was added to the Pokédex",newspeciesname)) - @scene.pbShowPokedex(@newspecies) + _INTL("{1}'s data was added to the Pokédex", newspeciesname)) + #@scene.pbShowPokedex(@newspecies) end #first check if hidden ability - hiddenAbility1 = @pokemon1.ability == @pokemon1.getAbilityList[0][-1] - hiddenAbility2 = @pokemon2.ability == @pokemon2.getAbilityList[0][-1] - + hiddenAbility1 = @pokemon1.ability == @pokemon1.getAbilityList[0][-1] + hiddenAbility2 = @pokemon2.ability == @pokemon2.getAbilityList[0][-1] + #change species - @pokemon1.species=@newspecies - + @pokemon1.species = newSpecies + #Check moves for new species - movelist=@pokemon1.getMoveList + movelist = @pokemon1.getMoveList for i in movelist - if i[0]==@pokemon1.level - pbLearnMove(@pokemon1,i[1]) if !noMoves #(pokemon,move,ignoreifknown=true, byTM=false , quick =true) - end - end - #@pokemon1.ability = pbChooseAbility(@pokemon1,@pokemon2) - removeItem=false + if i[0] == @pokemon1.level + pbLearnMove(@pokemon1, i[1]) if !noMoves #(pokemon,move,ignoreifknown=true, byTM=false , quick =true) + end + end + #@pokemon1.ability = pbChooseAbility(@pokemon1,@pokemon2) + removeItem = false if @pokemon2.isShiny? || @pokemon1.isShiny? @pokemon1.makeShiny end - - #make it untraded, pour qu'on puisse le unfused après, même si un des 2 était traded - @pokemon1.obtainMode = 0 - @pokemon1.setAbility(pbChooseAbility(@pokemon1,hiddenAbility1,hiddenAbility2)) - if superSplicer - @pokemon1.setNature(pbChooseNature(@pokemon1.nature,@pokemon2.nature)) + #make it untraded, pour qu'on puisse le unfused après, même si un des 2 était traded + @pokemon1.obtain_method = 0 + + @pokemon1.ability = pbChooseAbility(@pokemon1, hiddenAbility1, hiddenAbility2) + if superSplicer + @pokemon1.nature = pbChooseNature(@pokemon1.nature, @pokemon2.nature) + end + + movelist = @pokemon2.moves + for k in movelist + if k.id != 0 + pbLearnMove(@pokemon1, k.id, true, false,true) if !noMoves #todo: learn moves faster + end end - - movelist=@pokemon2.moves - for k in movelist - if k.id != 0 - pbLearnMove(@pokemon1,k.id,true,false,true) if !noMoves - end - end - - pbSEPlay("Voltorb Flip Point") - @pokemon1.firstmoves=[] - @pokemon1.name=newspeciesname if @pokemon1.name==oldspeciesname - - @pokemon1.level = setPokemonLevel(@pokemon1.level, @pokemon2.level,superSplicer) - @pokemon1.calcStats - @pokemon1.obtainMode = 0 - + #@pokemon1.firstmoves = [] + @pokemon1.name = newspeciesname if @pokemon1.name == oldspeciesname + + @pokemon1.level = setPokemonLevel(@pokemon1.level, @pokemon2.level, superSplicer) + @pokemon1.calc_stats + @pokemon1.obtain_method = 0 + end end end -def setPokemonLevel(pokemon1,pokemon2,superSplicers) +def setPokemonLevel(pokemon1, pokemon2, superSplicers) lv1 = @pokemon1.level - lv2 = @pokemon2.level - if superSplicers - if lv1 > lv2 - return lv1 - else - return lv2 - end + lv2 = @pokemon2.level + if superSplicers + if lv1 > lv2 + return lv1 else - if (lv1 >= lv2) then - return (2*lv1 + lv2)/3 - else - return (2*lv2 + lv1)/3 - end + return lv2 end - return lv1 + else + if (lv1 >= lv2) then + return (2 * lv1 + lv2) / 3 + else + return (2 * lv2 + lv1) / 3 + end + end + return lv1 end def pbShowPokedex(species) @@ -785,51 +766,48 @@ def pbShowPokedex(species) } end +def pbChooseAbility(poke, hidden1 = false, hidden2 = false) + abilityList = poke.getAbilityList + #pas sur de l'ordre pour les hidden (3 et 4) peut-être a inverser + #Mais les fusions ont tjrs 4 hidden abilities + #2. l'autre ability du poke 1 + #3. l'autre ability du poke 2 + #4. hidden du poke 1 + #5. hidden du poke2 + + abID1 = hidden1 ? abilityList[4][0] : abilityList[0][0] + abID2 = hidden2 ? abilityList[5][0] : abilityList[1][0] + ability1_name = GameData::Ability.get(abID1).name + ability2_name = GameData::Ability.get(abID2).name -def pbChooseAbility(poke,hidden1=false,hidden2=false) - abilityList = poke.getAbilityList - #pas sur de l'ordre pour les hidden (3 et 4) peut-être a inverser - #Mais les fusions ont tjrs 4 hidden abilities - #2. l'autre ability du poke 1 - #3. l'autre ability du poke 2 - #4. hidden du poke 1 - #5. hidden du poke2 - - - abID1 = hidden1 ? abilityList[0][4] : abilityList[0][0] - abID2 = hidden2 ? abilityList[0][5] : abilityList[0][1] - - if (Kernel.pbMessage("Choose an ability.",[_INTL("{1}",PBAbilities.getName(abID1)),_INTL("{1}",PBAbilities.getName(abID2))],2))==0 - return hidden1 ? 4 : 0 - end - return hidden2 ? 5 : 1 + if (Kernel.pbMessage("Choose an ability.", [_INTL("{1}", ability1_name), _INTL("{1}", ability2_name)], 2)) == 0 + return hidden1 ? 4 : 0 + end + return hidden2 ? 5 : 1 end - #pas au point. renvoie tjrs la mm nature -def pbChooseNature(species1,species2) +def pbChooseNature(species1, species2) nature1 = PBNatures.getName(species1) nature2 = PBNatures.getName(species2) - if (Kernel.pbMessage("Choose a nature.",[_INTL("{1}",nature1),_INTL("{1}",nature2)],2))==0 - return PBNatures.getNum(nature1) - else - return PBNatures.getNum(nature2) - end -end - - - -#EDITED FOR GEN2 -def fixEvolutionOverflow(retB,retH,oldSpecies) - #raise Exception.new("retB: " + retB.to_s + " retH: " + retH.to_s) - - oldBody = getBasePokemonID(oldSpecies) - oldHead = getBasePokemonID(oldSpecies,false) - return -1 if isNegativeOrNull(retB) && isNegativeOrNull(retH) - return oldBody*NB_POKEMON+retH if isNegativeOrNull(retB) #only head evolves - return retB*NB_POKEMON + oldHead if isNegativeOrNull(retH) #only body evolves - return retB*NB_POKEMON+retH #both evolve + if (Kernel.pbMessage("Choose a nature.", [_INTL("{1}", nature1), _INTL("{1}", nature2)], 2)) == 0 + return PBNatures.getNum(nature1) + else + return PBNatures.getNum(nature2) + end +end + +#EDITED FOR GEN2 +def fixEvolutionOverflow(retB, retH, oldSpecies) + #raise Exception.new("retB: " + retB.to_s + " retH: " + retH.to_s) + + oldBody = getBasePokemonID(oldSpecies) + oldHead = getBasePokemonID(oldSpecies, false) + return -1 if isNegativeOrNull(retB) && isNegativeOrNull(retH) + return oldBody * NB_POKEMON + retH if isNegativeOrNull(retB) #only head evolves + return retB * NB_POKEMON + oldHead if isNegativeOrNull(retH) #only body evolves + return retB * NB_POKEMON + retH #both evolve end