diff --git a/Data/Map040.rxdata b/Data/Map040.rxdata index 13036cf8e..5a4cb1155 100644 Binary files a/Data/Map040.rxdata and b/Data/Map040.rxdata differ diff --git a/Data/Map106.rxdata b/Data/Map106.rxdata index 554ea3972..fd811a572 100644 Binary files a/Data/Map106.rxdata and b/Data/Map106.rxdata differ diff --git a/Data/Map329.rxdata b/Data/Map329.rxdata index 97e201e3b..1aca2bdf9 100644 Binary files a/Data/Map329.rxdata and b/Data/Map329.rxdata differ diff --git a/Data/Map376.rxdata b/Data/Map376.rxdata index 56f1f9334..2a4f5b32a 100644 Binary files a/Data/Map376.rxdata and b/Data/Map376.rxdata differ diff --git a/Data/Map562.rxdata b/Data/Map562.rxdata index f55803362..c0d8182f1 100644 Binary files a/Data/Map562.rxdata and b/Data/Map562.rxdata differ diff --git a/Data/Map584.rxdata b/Data/Map584.rxdata index f70144bde..f5abdab80 100644 Binary files a/Data/Map584.rxdata and b/Data/Map584.rxdata differ diff --git a/Data/Map586.rxdata b/Data/Map586.rxdata index 23183d124..6c20da8d4 100644 Binary files a/Data/Map586.rxdata and b/Data/Map586.rxdata differ diff --git a/Data/Map638.rxdata b/Data/Map638.rxdata index b399514c8..80f37cd0e 100644 Binary files a/Data/Map638.rxdata and b/Data/Map638.rxdata differ diff --git a/Data/Map651.rxdata b/Data/Map651.rxdata index 1c96e07a8..15ab3ea19 100644 Binary files a/Data/Map651.rxdata and b/Data/Map651.rxdata differ diff --git a/Data/Map694.rxdata b/Data/Map694.rxdata index 4a2341fd4..65898924c 100644 Binary files a/Data/Map694.rxdata and b/Data/Map694.rxdata differ diff --git a/Data/Map697.rxdata b/Data/Map697.rxdata index 26141b6f6..7ed86fa18 100644 Binary files a/Data/Map697.rxdata and b/Data/Map697.rxdata differ diff --git a/Data/Map704.rxdata b/Data/Map704.rxdata index d8ca8c24c..a80a3f8f6 100644 Binary files a/Data/Map704.rxdata and b/Data/Map704.rxdata differ diff --git a/Data/Map707.rxdata b/Data/Map707.rxdata new file mode 100644 index 000000000..d90c5a72c Binary files /dev/null and b/Data/Map707.rxdata differ diff --git a/Data/Map708.rxdata b/Data/Map708.rxdata new file mode 100644 index 000000000..527589d81 Binary files /dev/null and b/Data/Map708.rxdata differ diff --git a/Data/Map723.rxdata b/Data/Map723.rxdata index e9bb5f2d4..025eecf50 100644 Binary files a/Data/Map723.rxdata and b/Data/Map723.rxdata differ diff --git a/Data/Map783.rxdata b/Data/Map783.rxdata index 90c646c03..6682cd1db 100644 Binary files a/Data/Map783.rxdata and b/Data/Map783.rxdata differ diff --git a/Data/Map797.rxdata b/Data/Map797.rxdata new file mode 100644 index 000000000..0eb6985f9 Binary files /dev/null and b/Data/Map797.rxdata differ diff --git a/Data/Map798.rxdata b/Data/Map798.rxdata new file mode 100644 index 000000000..b84356072 Binary files /dev/null and b/Data/Map798.rxdata differ diff --git a/Data/Scripts/010_Data/002_PBS data/013_Trainer.rb b/Data/Scripts/010_Data/002_PBS data/013_Trainer.rb index 95aef43f5..0a51d8edf 100644 --- a/Data/Scripts/010_Data/002_PBS data/013_Trainer.rb +++ b/Data/Scripts/010_Data/002_PBS data/013_Trainer.rb @@ -325,6 +325,14 @@ module GameData end pkmn.ability_index = pkmn_data[:ability_index] pkmn.ability = pkmn_data[:ability] + + if $game_switches[SWITCH_DOUBLE_ABILITIES] && pkmn.isFusion? + secondary_ability_index = pkmn.ability_index == 0 ? 1 : 0 + pkmn.ability2_index = secondary_ability_index + pkmn.ability2 = pkmn.getAbilityList[secondary_ability_index][0] + #print _INTL("Primary: {1}, Secondary: {2}",pkmn.ability.id, pkmn.ability2.id) + end + pkmn.gender = pkmn_data[:gender] || ((trainer.male?) ? 0 : 1) pkmn.shiny = (pkmn_data[:shininess]) ? true : false if pkmn_data[:nature] diff --git a/Data/Scripts/011_Battle/001_Battler/001_PokeBattle_Battler.rb b/Data/Scripts/011_Battle/001_Battler/001_PokeBattle_Battler.rb index c0267d2ca..076c1a91a 100644 --- a/Data/Scripts/011_Battle/001_Battler/001_PokeBattle_Battler.rb +++ b/Data/Scripts/011_Battle/001_Battler/001_PokeBattle_Battler.rb @@ -318,6 +318,10 @@ class PokeBattle_Battler return @pokemon.isFusionOf(check_species) end + def isFusion?() + return @pokemon.isFusion?() + end + # Returns the active types of this Pokémon. The array should not include the # same type more than once, and should not include any invalid type numbers # (e.g. -1). diff --git a/Data/Scripts/011_Battle/001_Battler/002_Battler_Initialize.rb b/Data/Scripts/011_Battle/001_Battler/002_Battler_Initialize.rb index f64c1962c..cd05c59e1 100644 --- a/Data/Scripts/011_Battle/001_Battler/002_Battler_Initialize.rb +++ b/Data/Scripts/011_Battle/001_Battler/002_Battler_Initialize.rb @@ -22,6 +22,7 @@ class PokeBattle_Battler @hp = @totalhp = 0 @type1 = @type2 = nil @ability_id = nil + @ability2_id = nil @item_id = nil @gender = 0 @attack = @defense = @spatk = @spdef = @speed = 0 @@ -81,6 +82,7 @@ class PokeBattle_Battler @type1 = pkmn.type1 @type2 = pkmn.type2 @ability_id = pkmn.ability_id + @ability2_id = pkmn.ability2_id @item_id = pkmn.item_id @gender = pkmn.gender @attack = pkmn.attack diff --git a/Data/Scripts/011_Battle/001_Battler/003_Battler_ChangeSelf.rb b/Data/Scripts/011_Battle/001_Battler/003_Battler_ChangeSelf.rb index dddffc247..ad2706216 100644 --- a/Data/Scripts/011_Battle/001_Battler/003_Battler_ChangeSelf.rb +++ b/Data/Scripts/011_Battle/001_Battler/003_Battler_ChangeSelf.rb @@ -283,6 +283,7 @@ class PokeBattle_Battler @effects[PBEffects::TransformSpecies] = target.species pbChangeTypes(target) self.ability = target.ability + self.ability2 = target.ability2 if target.ability2 @attack = target.attack @defense = target.defense @spatk = target.spatk diff --git a/Data/Scripts/011_Battle/001_Battler/005_Battler_StatStages.rb b/Data/Scripts/011_Battle/001_Battler/005_Battler_StatStages.rb index 17058879c..978728c5f 100644 --- a/Data/Scripts/011_Battle/001_Battler/005_Battler_StatStages.rb +++ b/Data/Scripts/011_Battle/001_Battler/005_Battler_StatStages.rb @@ -92,10 +92,10 @@ class PokeBattle_Battler return true end - def pbRaiseStatStageByAbility(stat,increment,user,splashAnim=true) + def pbRaiseStatStageByAbility(stat,increment,user,splashAnim=true, abilityName=nil) return false if fainted? ret = false - @battle.pbShowAbilitySplash(user) if splashAnim + @battle.pbShowAbilitySplash(user,false,true,abilityName) #if splashAnim if pbCanRaiseStatStage?(stat,user,nil,PokeBattle_SceneConstants::USE_ABILITY_SPLASH) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH ret = pbRaiseStatStage(stat,increment,user) @@ -224,9 +224,9 @@ class PokeBattle_Battler return true end - def pbLowerStatStageByAbility(stat,increment,user,splashAnim=true,checkContact=false) + def pbLowerStatStageByAbility(stat,increment,user,splashAnim=true,checkContact=false,ability_name=nil) ret = false - @battle.pbShowAbilitySplash(user) if splashAnim + @battle.pbShowAbilitySplash(user,false ,false ,ability_name) if splashAnim if pbCanLowerStatStage?(stat,user,nil,PokeBattle_SceneConstants::USE_ABILITY_SPLASH) && (!checkContact || affectedByContactEffect?(PokeBattle_SceneConstants::USE_ABILITY_SPLASH)) if PokeBattle_SceneConstants::USE_ABILITY_SPLASH @@ -252,7 +252,7 @@ class PokeBattle_Battler return false end if PokeBattle_SceneConstants::USE_ABILITY_SPLASH - return pbLowerStatStageByAbility(:ATTACK,1,user,false) + return pbLowerStatStageByAbility(:ATTACK,1,user,false,false ,user.abilityName) end # NOTE: These checks exist to ensure appropriate messages are shown if # Intimidate is blocked somehow (i.e. the messages should mention the diff --git a/Data/Scripts/011_Battle/001_Battler/010_Battler_UseMove_TriggerEffects.rb b/Data/Scripts/011_Battle/001_Battler/010_Battler_UseMove_TriggerEffects.rb index e6f729bc8..dcc21b57c 100644 --- a/Data/Scripts/011_Battle/001_Battler/010_Battler_UseMove_TriggerEffects.rb +++ b/Data/Scripts/011_Battle/001_Battler/010_Battler_UseMove_TriggerEffects.rb @@ -2,19 +2,25 @@ class PokeBattle_Battler #============================================================================= # Effect per hit #============================================================================= + # + + def triggerAbilityEffectsOnHit(move,user,target) + # Target's ability + if target.abilityActive?(true) + oldHP = user.hp + BattleHandlers.triggerTargetAbilityOnHit(target.ability,user,target,move,@battle) + user.pbItemHPHealCheck if user.hp0 && !target.damageState.substitute - # Target's ability - if target.abilityActive?(true) - oldHP = user.hp - BattleHandlers.triggerTargetAbilityOnHit(target.ability,user,target,move,@battle) - user.pbItemHPHealCheck if user.hp= 7) ? 2 : 1, target, false) + (Settings::MECHANICS_GENERATION >= 7) ? 2 : 1, target, false,GameData::Ability.get(ability).real_name) battle.pbHideAbilitySplash(target) } ) @@ -1639,7 +1639,7 @@ BattleHandlers::UserAbilityEndOfMove.add(:BEASTBOOST, GameData::Stat.each_main_battle do |s| next if userStats[s.id] < highestStatValue if user.pbCanRaiseStatStage?(s.id, user) - user.pbRaiseStatStageByAbility(s.id, numFainted, user) + user.pbRaiseStatStageByAbility(s.id, numFainted, user,GameData::Ability.get(ability).real_name) end break end @@ -1692,7 +1692,7 @@ BattleHandlers::UserAbilityEndOfMove.add(:MOXIE, numFainted = 0 targets.each { |b| numFainted += 1 if b.damageState.fainted } next if numFainted==0 || !user.pbCanRaiseStatStage?(:ATTACK,user) - user.pbRaiseStatStageByAbility(:ATTACK,numFainted,user) + user.pbRaiseStatStageByAbility(:ATTACK,numFainted,user,GameData::Ability.get(ability).real_name) } ) @@ -1705,7 +1705,7 @@ BattleHandlers::TargetAbilityAfterMoveUse.add(:BERSERK, next if !move.damagingMove? next if target.damageState.initialHP=target.totalhp/2 next if !target.pbCanRaiseStatStage?(:SPECIAL_ATTACK,target) - target.pbRaiseStatStageByAbility(:SPECIAL_ATTACK,1,target) + target.pbRaiseStatStageByAbility(:SPECIAL_ATTACK,1,target,GameData::Ability.get(ability).real_name) } ) @@ -1947,12 +1947,12 @@ BattleHandlers::EOREffectAbility.add(:MOODY, battle.pbShowAbilitySplash(battler) if randomUp.length>0 r = battle.pbRandom(randomUp.length) - battler.pbRaiseStatStageByAbility(randomUp[r],2,battler,false) + battler.pbRaiseStatStageByAbility(randomUp[r],2,battler,false,GameData::Ability.get(ability).real_name) randomDown.delete(randomUp[r]) end if randomDown.length>0 r = battle.pbRandom(randomDown.length) - battler.pbLowerStatStageByAbility(randomDown[r],1,battler,false) + battler.pbLowerStatStageByAbility(randomDown[r],1,battler,false,GameData::Ability.get(ability).real_name) end battle.pbHideAbilitySplash(battler) battler.pbItemStatRestoreCheck if randomDown.length>0 @@ -1964,7 +1964,8 @@ BattleHandlers::EOREffectAbility.add(:SPEEDBOOST, # A Pokémon's turnCount is 0 if it became active after the beginning of a # round if battler.turnCount>0 && battler.pbCanRaiseStatStage?(:SPEED,battler) - battler.pbRaiseStatStageByAbility(:SPEED,1,battler) + ability_name = GameData::Ability.get(ability).real_name + battler.pbRaiseStatStageByAbility(:SPEED,1,battler,true,ability_name) end } ) @@ -2141,7 +2142,7 @@ BattleHandlers::AbilityOnSwitchIn.add(:DOWNLOAD, oSpDef += b.spdef end stat = (oDef 0 ? calculated_hp : 0 @attack = stats[:ATTACK] @@ -1229,7 +1232,11 @@ class Pokemon @gender = nil @shiny = nil @ability_index = nil + @ability2_index = nil + @ability = nil + @ability2 = nil + @nature = nil @nature_for_stats = nil @item = nil diff --git a/Data/Scripts/016_UI/006_UI_Summary.rb b/Data/Scripts/016_UI/006_UI_Summary.rb index 68abd4325..9dfb2c604 100644 --- a/Data/Scripts/016_UI/006_UI_Summary.rb +++ b/Data/Scripts/016_UI/006_UI_Summary.rb @@ -674,10 +674,22 @@ class PokemonSummary_Scene ] # Draw ability name and description ability = @pokemon.ability + ability2 = @pokemon.ability2 + + # if ability + # textpos.push([ability.name, 362, 278, 0, Color.new(64, 64, 64), Color.new(176, 176, 176)]) + # drawTextEx(overlay, 224, 320, 282, 2, ability.description, Color.new(64, 64, 64), Color.new(176, 176, 176)) + # end + + #fixme temp if ability textpos.push([ability.name, 362, 278, 0, Color.new(64, 64, 64), Color.new(176, 176, 176)]) - drawTextEx(overlay, 224, 320, 282, 2, ability.description, Color.new(64, 64, 64), Color.new(176, 176, 176)) + if ability2 + drawTextEx(overlay, 224, 320, 282, 2, ability2.name, Color.new(64, 64, 64), Color.new(176, 176, 176)) + end end + + # Draw all text pbDrawTextPositions(overlay, textpos) # Draw HP bar diff --git a/Data/Scripts/018_Alternate battle modes/001_Battle Frontier/005_UI_BattleSwap.rb b/Data/Scripts/018_Alternate battle modes/001_Battle Frontier/005_UI_BattleSwap.rb index 7bc490dcb..b978f15c9 100644 --- a/Data/Scripts/018_Alternate battle modes/001_Battle Frontier/005_UI_BattleSwap.rb +++ b/Data/Scripts/018_Alternate battle modes/001_Battle Frontier/005_UI_BattleSwap.rb @@ -7,7 +7,7 @@ class BattleSwapScene @sprites = {} addBackgroundPlane(@sprites, "bg", "rentbg", @viewport) @sprites["title"] = Window_UnformattedTextPokemon.newWithSize( - _INTL("RENTAL POKéMON"), 0, 0, Graphics.width, 64, @viewport) + _INTL("RENTAL POKÉMON"), 0, 0, Graphics.width, 64, @viewport) @sprites["list"] = Window_AdvancedCommandPokemonEx.newWithSize( [], 0, 64, Graphics.width, Graphics.height - 128 , @viewport) @sprites["help"] = Window_UnformattedTextPokemon.newWithSize("", @@ -29,7 +29,7 @@ class BattleSwapScene @sprites = {} addBackgroundPlane(@sprites, "bg", "swapbg", @viewport) @sprites["title"] = Window_UnformattedTextPokemon.newWithSize( - _INTL("POKéMON SWAP"), 0, 0, Graphics.width, 64, @viewport) + _INTL("POKÉMON SWAP"), 0, 0, Graphics.width, 64, @viewport) @sprites["list"] = Window_AdvancedCommandPokemonEx.newWithSize( [], 0, 64, Graphics.width, Graphics.height - 128, @viewport) @sprites["help"] = Window_UnformattedTextPokemon.newWithSize( diff --git a/Data/Scripts/020_Debug/003_Debug menus/005_Debug_PokemonCommands.rb b/Data/Scripts/020_Debug/003_Debug menus/005_Debug_PokemonCommands.rb index 69265121a..3549b85dd 100644 --- a/Data/Scripts/020_Debug/003_Debug menus/005_Debug_PokemonCommands.rb +++ b/Data/Scripts/020_Debug/003_Debug menus/005_Debug_PokemonCommands.rb @@ -659,7 +659,7 @@ PokemonDebugMenuCommands.register("setitem", { PokemonDebugMenuCommands.register("setability", { "parent" => "main", - "name" => _INTL("Set ability"), + "name" => _INTL("Set primary ability"), "always_show" => true, "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| cmd = 0 @@ -706,6 +706,56 @@ PokemonDebugMenuCommands.register("setability", { } }) + +PokemonDebugMenuCommands.register("setability2", { + "parent" => "main", + "name" => _INTL("Set secondary ability"), + "always_show" => true, + "effect" => proc { |pkmn, pkmnid, heldpoke, settingUpBattle, screen| + cmd = 0 + commands = [ + _INTL("Set possible ability"), + _INTL("Set any ability"), + _INTL("Reset") + ] + loop do + if pkmn.ability + msg = _INTL("Ability 2 is {1} (index {2}).", pkmn.ability2.name, pkmn.ability2_index) + else + msg = _INTL("No ability (index {1}).", pkmn.ability2_index) + end + cmd = screen.pbShowCommands(msg, commands, cmd) + break if cmd < 0 + case cmd + when 0 # Set possible ability + abils = pkmn.getAbilityList + ability_commands = [] + abil_cmd = 0 + for i in abils + ability_commands.push(((i[1] < 2) ? "" : "(H) ") + GameData::Ability.get(i[0]).name) + abil_cmd = ability_commands.length - 1 if pkmn.ability2_id == i[0] + end + abil_cmd = screen.pbShowCommands(_INTL("Choose an ability."), ability_commands, abil_cmd) + next if abil_cmd < 0 + pkmn.ability2_index = abils[abil_cmd][1] + pkmn.ability2 = nil + screen.pbRefreshSingle(pkmnid) + when 1 # Set any ability + new_ability = pbChooseAbilityList(pkmn.ability2_id) + if new_ability && new_ability != pkmn.ability2_id + pkmn.ability2 = new_ability + screen.pbRefreshSingle(pkmnid) + end + when 2 # Reset + pkmn.ability2_index = nil + pkmn.ability2 = nil + screen.pbRefreshSingle(pkmnid) + end + end + next false + } +}) + PokemonDebugMenuCommands.register("setnature", { "parent" => "main", "name" => _INTL("Set nature"), diff --git a/Data/Scripts/048_Fusion/FusionMenu.rb b/Data/Scripts/048_Fusion/FusionMenu.rb index e4dff87e1..39b0307f0 100644 --- a/Data/Scripts/048_Fusion/FusionMenu.rb +++ b/Data/Scripts/048_Fusion/FusionMenu.rb @@ -103,10 +103,10 @@ class FusionSelectOptionsScene < PokemonOption_Scene @selectedNature=@natureList[value] }, [getNatureDescription(@natureList[0]), getNatureDescription(@natureList[1])] ) - return options end + def isConfirmedOnKeyPress return true end diff --git a/Data/Scripts/049_Compatibility/Constants.rb b/Data/Scripts/049_Compatibility/Constants.rb index c8de7048f..4e5aa2820 100644 --- a/Data/Scripts/049_Compatibility/Constants.rb +++ b/Data/Scripts/049_Compatibility/Constants.rb @@ -23,6 +23,7 @@ SWITCH_GAME_DIFFICULTY_HARD = 666 SWITCH_MODERN_MODE=974 SWITCH_V5_1=825 SWITCH_NO_LEVELS_MODE=774 +SWITCH_DOUBLE_ABILITIES=773 #Game progression switches SWITCH_DURING_INTRO = 917 diff --git a/Data/Scripts/050_AddOns/DoubleAbilities.rb b/Data/Scripts/050_AddOns/DoubleAbilities.rb new file mode 100644 index 000000000..92cec6dfa --- /dev/null +++ b/Data/Scripts/050_AddOns/DoubleAbilities.rb @@ -0,0 +1,255 @@ +class PokeBattle_Battler + attr_accessor :ability_id + attr_accessor :ability2_id + + #Primary ability utility methods for battlers class + def ability + return GameData::Ability.try_get(@ability_id) + end + + def ability=(value) + new_ability = GameData::Ability.try_get(value) + @ability_id = (new_ability) ? new_ability.id : nil + end + + def abilityName + abil = self.ability + return (abil) ? abil.name : "" + end + + #Secondary ability utility methods for battlers class + def ability2 + return GameData::Ability.try_get(@ability2_id) + end + + def ability2=(value) + new_ability = GameData::Ability.try_get(value) + @ability2_id = (new_ability) ? new_ability.id : nil + end + + def ability2Name + abil = self.ability2 + return (abil) ? abil.name : "" + end + + #Ability logic overrides + + def hasActiveAbility?(check_ability, ignore_fainted = false) + return hasActiveAbilityDouble?(check_ability, ignore_fainted) if $game_switches[SWITCH_DOUBLE_ABILITIES] + return false if !abilityActive?(ignore_fainted) + return check_ability.include?(@ability_id) if check_ability.is_a?(Array) + return self.ability == check_ability + end + + def hasActiveAbilityDouble?(check_ability, ignore_fainted = false) + return false if !abilityActive?(ignore_fainted) + if check_ability.is_a?(Array) + return check_ability.include?(@ability_id) || check_ability.include?(@ability2_id) + end + return self.ability == check_ability || self.ability2 == check_ability + end + + def triggerAbilityEffectsOnHit(move, user, target) + # Target's ability + if target.abilityActive?(true) + oldHP = user.hp + BattleHandlers.triggerTargetAbilityOnHit(target.ability, user, target, move, @battle) + BattleHandlers.triggerTargetAbilityOnHit(target.ability2, user, target, move, @battle) if $game_switches[SWITCH_DOUBLE_ABILITIES] && target.ability2 + user.pbItemHPHealCheck if user.hp < oldHP + end + # User's ability + if user.abilityActive?(true) + BattleHandlers.triggerUserAbilityOnHit(user.ability, user, target, move, @battle) + BattleHandlers.triggerUserAbilityOnHit(user.ability2, user, target, move, @battle) if $game_switches[SWITCH_DOUBLE_ABILITIES] && user.ability2 + user.pbItemHPHealCheck + end + end + + def pbCheckDamageAbsorption(user, target) + # Substitute will take the damage + if target.effects[PBEffects::Substitute] > 0 && !ignoresSubstitute?(user) && + (!user || user.index != target.index) + target.damageState.substitute = true + return + end + # Disguise will take the damage + if !@battle.moldBreaker && target.isFusionOf(:MIMIKYU) && + target.form == 0 && (target.ability == :DISGUISE || target.ability2 == :DISGUISE) + target.damageState.disguise = true + return + end + end + + # Called when a Pokémon (self) enters battle, at the end of each move used, + # and at the end of each round. + def pbContinualAbilityChecks(onSwitchIn = false) + # Check for end of primordial weather + @battle.pbEndPrimordialWeather + # Trace + if $game_switches[SWITCH_DOUBLE_ABILITIES] && onSwitchIn + displayOpponentDoubleAbilities() + else + if hasActiveAbility?(:TRACE) + # NOTE: In Gen 5 only, Trace only triggers upon the Trace bearer switching + # in and not at any later times, even if a traceable ability turns + # up later. Essentials ignores this, and allows Trace to trigger + # whenever it can even in the old battle mechanics. + choices = [] + @battle.eachOtherSideBattler(@index) do |b| + next if b.ungainableAbility? || + [:POWEROFALCHEMY, :RECEIVER, :TRACE].include?(b.ability_id) + choices.push(b) + end + if choices.length > 0 + choice = choices[@battle.pbRandom(choices.length)] + @battle.pbShowAbilitySplash(self) + self.ability = choice.ability + @battle.pbDisplay(_INTL("{1} traced {2}'s {3}!", pbThis, choice.pbThis(true), choice.abilityName)) + @battle.pbHideAbilitySplash(self) + if !onSwitchIn && (unstoppableAbility? || abilityActive?) + BattleHandlers.triggerAbilityOnSwitchIn(self.ability, self, @battle) + end + end + end + end + end + + def displayOpponentDoubleAbilities() + @battle.eachOtherSideBattler(@index) do |battler| + @battle.pbShowPrimaryAbilitySplash(battler,true) + @battle.pbShowSecondaryAbilitySplash(battler,true) if battler.isFusion?() + @battle.pbHideAbilitySplash(battler) + end + end + +end + + + + +class Pokemon + attr_writer :ability_index + attr_writer :ability2_index + + #Primary ability utility methods for pokemon class + def ability_index + @ability_index = (@personalID & 1) if !@ability_index + return @ability_index + end + + def ability + return GameData::Ability.try_get(ability_id()) + end + + def ability=(value) + return if value && !GameData::Ability.exists?(value) + @ability = (value) ? GameData::Ability.get(value).id : value + end + + #Secondary ability utility methods for pokemon class + def ability2_index + @ability2_index = (@personalID & 1) if !@ability2_index + return @ability2_index + end + + def ability2 + return GameData::Ability.try_get(ability2_id()) + end + + def ability2=(value) + return if value && !GameData::Ability.exists?(value) + @ability2 = (value) ? GameData::Ability.get(value).id : value + end + + + def ability_id + if !@ability + sp_data = species_data + abil_index = ability_index + if abil_index >= 2 # Hidden ability + @ability = sp_data.hidden_abilities[abil_index - 2] + abil_index = (@personalID & 1) if !@ability + end + if !@ability # Natural ability or no hidden ability defined + if $game_switches[SWITCH_NO_LEVELS_MODE] + @ability = sp_data.abilities[0] || sp_data.abilities[0] + @ability2 = sp_data.abilities[1] || sp_data.abilities[0] + else + @ability = sp_data.abilities[abil_index] || sp_data.abilities[0] + end + end + end + return @ability + end + + def ability2_id + if !@ability2 + sp_data = species_data + abil_index = ability_index + if abil_index >= 2 # Hidden ability + @ability2 = sp_data.hidden_abilities[abil_index - 2] + abil_index = (@personalID & 1) if !@ability2 + end + if !@ability2 # Natural ability or no hidden ability defined + @ability2 = sp_data.abilities[abil_index] || sp_data.abilities[0] + end + end + return @ability2 + end + + def adjustHPForWonderGuard(stats) + return self.ability == :WONDERGUARD ? 1 : stats[:HP] || ($game_switches[SWITCH_DOUBLE_ABILITIES] && self.ability2 == :WONDERGUARD) + end + +end + + + +class PokemonFusionScene + + def pbChooseAbility(poke, hidden1 = false, hidden2 = false) + abilityList = poke.getAbilityList + + if $game_switches[SWITCH_DOUBLE_ABILITIES] + abID1 = @pokemon1.ability + abID2 = @pokemon2.ability + else + abID1 = hidden1 ? abilityList[4][0] : abilityList[0][0] + abID2 = hidden2 ? abilityList[5][0] : abilityList[1][0] + end + availableNatures = [] + availableNatures << @pokemon1.nature + availableNatures << @pokemon2.nature + + setAbilityAndNatureAndNickname([GameData::Ability.get(abID1), GameData::Ability.get(abID2)], availableNatures) + end + + def setAbilityAndNatureAndNickname(abilitiesList, naturesList) + clearUIForMoves + if $game_switches[SWITCH_DOUBLE_ABILITIES] + scene = FusionSelectOptionsScene.new(nil, naturesList, @pokemon1, @pokemon2) + screen = PokemonOptionScreen.new(scene) + screen.pbStartScreen + + @pokemon1.ability = abilitiesList[0] + @pokemon1.ability2 = abilitiesList[1] + else + scene = FusionSelectOptionsScene.new(abilitiesList, naturesList, @pokemon1, @pokemon2) + screen = PokemonOptionScreen.new(scene) + screen.pbStartScreen + @pokemon1.ability = scene.selectedAbility + end + + @pokemon1.nature = scene.selectedNature + if scene.hasNickname + @pokemon1.name = scene.nickname + end + + p @pokemon1.ability.real_name + p @pokemon1.ability2.real_name + + end + +end + + diff --git a/Data/Scripts/050_AddOns/DoubleAbilitiesHandlersOverrides.rb b/Data/Scripts/050_AddOns/DoubleAbilitiesHandlersOverrides.rb new file mode 100644 index 000000000..181b70cf3 --- /dev/null +++ b/Data/Scripts/050_AddOns/DoubleAbilitiesHandlersOverrides.rb @@ -0,0 +1,389 @@ + +module BattleHandlers + # + # Speed calculation + # + + def self.triggerSpeedCalcAbility(ability, battler, mult) + ability1 = ability + ability2 = battler.ability2 + calculateAbilitySpeedMultiplier(ability1, battler, mult) + if $game_switches[SWITCH_DOUBLE_ABILITIES] + calculateAbilitySpeedMultiplier(ability2, battler, mult) + end + return mult + end + + def self.calculateAbilitySpeedMultiplier(ability, battler, mult) + ability1 = ability + ability2 = battler.ability2 + ret = SpeedCalcAbility.trigger(ability1, battler, mult) || SpeedCalcAbility.trigger(ability2, battler, mult) + return (ret != nil) ? ret : mult + end + + def self.triggerWeightCalcAbility(ability,battler,w) + ability1 = ability + ability2 = battler.ability2 + ret = WeightCalcAbility.trigger(ability1,battler,w) || WeightCalcAbility.trigger(ability2,battler,w) + return (ret!=nil) ? ret : w + end + + + + + def self.triggerEOREffectAbility(ability,battler,battle) + ability1 = ability + ability2 = battler.ability2 + + EOREffectAbility.trigger(ability1,battler,battle) + EOREffectAbility.trigger(ability2,battler,battle) + end + + def self.triggerEORGainItemAbility(ability,battler,battle) + ability1 = ability + ability2 = battler.ability2 + + EORGainItemAbility.trigger(ability1,battler,battle) + EORGainItemAbility.trigger(ability2,battler,battle) + end + + def self.triggerCertainSwitchingUserAbility(ability,switcher,battle) + ability1 = ability + ability2 = switcher.ability2 + + ret = CertainSwitchingUserAbility.trigger(ability1,switcher,battle) || CertainSwitchingUserAbility.trigger(ability2,switcher,battle) + return (ret!=nil) ? ret : false + end + + def self.triggerCertainSwitchingUserAbility(ability,switcher,battle) + ability1 = ability + ability2 = switcher.ability2 + + ret = CertainSwitchingUserAbility.trigger(ability1,switcher,battle) || CertainSwitchingUserAbility.trigger(ability2,switcher,battle) + return (ret!=nil) ? ret : false + end + + def self.triggerTrappingTargetAbility(ability,switcher,bearer,battle) + ability1 = ability + ability2 = switcher.ability2 + ret = TrappingTargetAbility.trigger(ability1,switcher,bearer,battle) || TrappingTargetAbility.trigger(ability2,switcher,bearer,battle) + return (ret!=nil) ? ret : false + end + + def self.triggerAbilityOnSwitchIn(ability,battler,battle) + ability1 = ability + ability2 = battler.ability2 + AbilityOnSwitchIn.trigger(ability1,battler,battle) + AbilityOnSwitchIn.trigger(ability2,battler,battle) + end + + def self.triggerAbilityOnSwitchOut(ability,battler,endOfBattle) + ability1 = ability + ability2 = battler.ability2 + AbilityOnSwitchOut.trigger(ability1,battler,endOfBattle) + AbilityOnSwitchOut.trigger(ability2,battler,endOfBattle) + end + + def self.triggerAbilityChangeOnBattlerFainting(ability,battler,fainted,battle) + ability1 = ability + ability2 = battler.ability2 + AbilityChangeOnBattlerFainting.trigger(ability1,battler,fainted,battle) + AbilityChangeOnBattlerFainting.trigger(ability2,battler,fainted,battle) + + end + + def self.triggerAbilityOnBattlerFainting(ability,battler,fainted,battle) + ability1 = ability + ability2 = battler.ability2 + AbilityOnBattlerFainting.trigger(ability1,battler,fainted,battle) + AbilityOnBattlerFainting.trigger(ability2,battler,fainted,battle) + end + + + def self.triggerRunFromBattleAbility(ability,battler) + ability1 = ability + ability2 = battler.ability2 + ret = RunFromBattleAbility.trigger(ability1,battler) || RunFromBattleAbility.trigger(ability2,battler) + return (ret!=nil) ? ret : false + end + ######## + # FROM HERE + # + + def self.triggerAbilityOnHPDroppedBelowHalf(ability,user,battle) + ability1 = ability + ability2 = user.ability2 + ret = AbilityOnHPDroppedBelowHalf.trigger(ability1,user,battle) || AbilityOnHPDroppedBelowHalf.trigger(ability2,user,battle) + return (ret!=nil) ? ret : false + end + + def self.triggerStatusCheckAbilityNonIgnorable(ability,battler,status) + ability1 = ability + ability2 = battler.ability2 + ret = StatusCheckAbilityNonIgnorable.trigger(ability1,battler,status) || StatusCheckAbilityNonIgnorable.trigger(ability2,battler,status) + return (ret!=nil) ? ret : false + end + + def self.triggerStatusImmunityAbility(ability,battler,status) + ability1 = ability + ability2 = battler.ability2 + ret = StatusImmunityAbility.trigger(ability1,battler,status) || StatusImmunityAbility.trigger(ability2,battler,status) + return (ret!=nil) ? ret : false + end + + def self.triggerStatusImmunityAbilityNonIgnorable(ability,battler,status) + ability1 = ability + ability2 = battler.ability2 + ret = StatusImmunityAbilityNonIgnorable.trigger(ability1,battler,status) || StatusImmunityAbilityNonIgnorable.trigger(ability2,battler,status) + return (ret!=nil) ? ret : false + end + + def self.triggerStatusImmunityAllyAbility(ability,battler,status) + ability1 = ability + ability2 = battler.ability2 + ret = StatusImmunityAllyAbility.trigger(ability1,battler,status) || StatusImmunityAllyAbility.trigger(ability2,battler,status) + return (ret!=nil) ? ret : false + end + + def self.triggerAbilityOnStatusInflicted(ability,battler,user,status) + ability1 = ability + ability2 = battler.ability2 + AbilityOnStatusInflicted.trigger(ability1,battler,user,status) + AbilityOnStatusInflicted.trigger(ability2,battler,user,status) + end + + def self.triggerStatusCureAbility(ability,battler) + ability1 = ability + ability2 = battler.ability2 + ret = StatusCureAbility.trigger(ability1,battler) || StatusCureAbility.trigger(ability2,battler) + return (ret!=nil) ? ret : false + end + + + def self.triggerStatLossImmunityAbility(ability,battler,stat,battle,showMessages) + ability1 = ability + ability2 = battler.ability2 + ret = StatLossImmunityAbility.trigger(ability1,battler,stat,battle,showMessages) || StatLossImmunityAbility.trigger(ability2,battler,stat,battle,showMessages) + return (ret!=nil) ? ret : false + end + + def self.triggerStatLossImmunityAbilityNonIgnorable(ability,battler,stat,battle,showMessages) + ability1 = ability + ability2 = battler.ability2 + ret = StatLossImmunityAbilityNonIgnorable.trigger(ability1,battler,stat,battle,showMessages) || StatLossImmunityAbilityNonIgnorable.trigger(ability2,battler,stat,battle,showMessages) + return (ret!=nil) ? ret : false + end + + def self.triggerStatLossImmunityAllyAbility(ability,bearer,battler,stat,battle,showMessages) + ability1 = ability + ability2 = battler.ability2 + ret = StatLossImmunityAllyAbility.trigger(ability1,bearer,battler,stat,battle,showMessages) || StatLossImmunityAllyAbility.trigger(ability2,bearer,battler,stat,battle,showMessages) + return (ret!=nil) ? ret : false + end + + def self.triggerAbilityOnStatGain(ability,battler,stat,user) + ability1 = ability + ability2 = battler.ability2 + AbilityOnStatGain.trigger(ability1,battler,stat,user) + AbilityOnStatGain.trigger(ability2,battler,stat,user) + end + + def self.triggerAbilityOnStatLoss(ability,battler,stat,user) + ability1 = ability + ability2 = battler.ability2 + AbilityOnStatLoss.trigger(ability1,battler,stat,user) + AbilityOnStatLoss.trigger(ability2,battler,stat,user) + end + + #============================================================================= + + + def self.triggerPriorityChangeAbility(ability,battler,move,pri) + ability1 = ability + ability2 = battler.ability2 + ret = PriorityChangeAbility.trigger(ability1,battler,move,pri) || PriorityChangeAbility.trigger(ability2,battler,move,pri) + return (ret!=nil) ? ret : pri + end + + def self.triggerPriorityBracketChangeAbility(ability,battler,subPri,battle) + ability1 = ability + ability2 = battler.ability2 + ret = PriorityBracketChangeAbility.trigger(ability1,battler,subPri,battle) || PriorityBracketChangeAbility.trigger(ability2,battler,subPri,battle) + return (ret!=nil) ? ret : subPri + end + + def self.triggerPriorityBracketUseAbility(ability,battler,battle) + ability1 = ability + ability2 = battler.ability2 + PriorityBracketUseAbility.trigger(ability1,battler,battle) + PriorityBracketUseAbility.trigger(ability2,battler,battle) + end + + #============================================================================= + + def self.triggerAbilityOnFlinch(ability,battler,battle) + ability1 = ability + ability2 = battler.ability2 + AbilityOnFlinch.trigger(ability1,battler,battle) + AbilityOnFlinch.trigger(ability2,battler,battle) + end + + def self.triggerMoveBlockingAbility(ability,bearer,user,targets,move,battle) + ability1 = ability + ability2 = bearer.ability2 + ret = MoveBlockingAbility.trigger(ability1,bearer,user,targets,move,battle) || MoveBlockingAbility.trigger(ability2,bearer,user,targets,move,battle) + return (ret!=nil) ? ret : false + end + + def self.triggerMoveImmunityTargetAbility(ability,user,target,move,type,battle) + ability1 = ability + ability2 = user.ability2 + ret = MoveImmunityTargetAbility.trigger(ability1,user,target,move,type,battle) || MoveImmunityTargetAbility.trigger(ability2,user,target,move,type,battle) + return (ret!=nil) ? ret : false + end + + #============================================================================= + + def self.triggerMoveBaseTypeModifierAbility(ability,user,move,type) + ability1 = ability + ability2 = user.ability2 + ret = MoveBaseTypeModifierAbility.trigger(ability1,user,move,type) || MoveBaseTypeModifierAbility.trigger(ability2,user,move,type) + return (ret!=nil) ? ret : type + end + + #============================================================================= + + def self.triggerAccuracyCalcUserAbility(ability,mods,user,target,move,type) + ability1 = ability + ability2 = user.ability2 + AccuracyCalcUserAbility.trigger(ability1,mods,user,target,move,type) + AccuracyCalcUserAbility.trigger(ability2,mods,user,target,move,type) + end + + def self.triggerAccuracyCalcUserAllyAbility(ability,mods,user,target,move,type) + ability1 = ability + ability2 = user.ability2 + AccuracyCalcUserAllyAbility.trigger(ability1,mods,user,target,move,type) + AccuracyCalcUserAllyAbility.trigger(ability2,mods,user,target,move,type) + end + + def self.triggerAccuracyCalcTargetAbility(ability,mods,user,target,move,type) + ability1 = ability + ability2 = user.ability2 + AccuracyCalcTargetAbility.trigger(ability1,mods,user,target,move,type) + AccuracyCalcTargetAbility.trigger(ability2,mods,user,target,move,type) + end + #============================================================================= + + def self.triggerDamageCalcUserAbility(ability,user,target,move,mults,baseDmg,type) + ability1 = ability + ability2 = user.ability2 + DamageCalcUserAbility.trigger(ability1,user,target,move,mults,baseDmg,type) + DamageCalcUserAbility.trigger(ability2,user,target,move,mults,baseDmg,type) + end + + def self.triggerDamageCalcUserAllyAbility(ability,user,target,move,mults,baseDmg,type) + ability1 = ability + ability2 = target.ability2 + DamageCalcUserAllyAbility.trigger(ability1,user,target,move,mults,baseDmg,type) + DamageCalcUserAllyAbility.trigger(ability2,user,target,move,mults,baseDmg,type) + end + + def self.triggerDamageCalcTargetAbility(ability,user,target,move,mults,baseDmg,type) + ability1 = ability + ability2 = target.ability2 + DamageCalcTargetAbility.trigger(ability1,user,target,move,mults,baseDmg,type) + DamageCalcTargetAbility.trigger(ability2,user,target,move,mults,baseDmg,type) + end + + def self.triggerDamageCalcTargetAbilityNonIgnorable(ability,user,target,move,mults,baseDmg,type) + ability1 = ability + ability2 = target.ability2 + DamageCalcTargetAbilityNonIgnorable.trigger(ability1,user,target,move,mults,baseDmg,type) + DamageCalcTargetAbilityNonIgnorable.trigger(ability2,user,target,move,mults,baseDmg,type) + end + + def self.triggerDamageCalcTargetAllyAbility(ability,user,target,move,mults,baseDmg,type) + ability1 = ability + ability2 = target.ability2 + DamageCalcTargetAllyAbility.trigger(ability1,user,target,move,mults,baseDmg,type) + DamageCalcTargetAllyAbility.trigger(ability2,user,target,move,mults,baseDmg,type) + end + + #============================================================================= + + def self.triggerCriticalCalcUserAbility(ability,user,target,c) + ability1 = ability + ability2 = user.ability2 + ret = CriticalCalcUserAbility.trigger(ability1,user,target,c) || CriticalCalcUserAbility.trigger(ability2,user,target,c) + return (ret!=nil) ? ret : c + end + + def self.triggerCriticalCalcTargetAbility(ability,user,target,c) + ability1 = ability + ability2 = target.ability2 + ret = CriticalCalcTargetAbility.trigger(ability1,user,target,c) || CriticalCalcTargetAbility.trigger(ability2,user,target,c) + return (ret!=nil) ? ret : c + end + #============================================================================= + + def self.triggerTargetAbilityOnHit(ability,user,target,move,battle) + ability1 = ability + ability2 = target.ability2 + TargetAbilityOnHit.trigger(ability1,user,target,move,battle) + TargetAbilityOnHit.trigger(ability2,user,target,move,battle) + end + + def self.triggerUserAbilityOnHit(ability,user,target,move,battle) + ability1 = ability + ability2 = user.ability2 + UserAbilityOnHit.trigger(ability1,user,target,move,battle) + UserAbilityOnHit.trigger(ability2,user,target,move,battle) + end + #============================================================================= + + def self.triggerUserAbilityEndOfMove(ability,user,targets,move,battle) + ability1 = ability + ability2 = user.ability2 + UserAbilityEndOfMove.trigger(ability1,user,targets,move,battle) + UserAbilityEndOfMove.trigger(ability2,user,targets,move,battle) + end + + def self.triggerTargetAbilityAfterMoveUse(ability,target,user,move,switched,battle) + ability1 = ability + ability2 = target.ability2 + TargetAbilityAfterMoveUse.trigger(ability1,target,user,move,switched,battle) + TargetAbilityAfterMoveUse.trigger(ability2,target,user,move,switched,battle) + end + + #============================================================================= + + def self.triggerEORWeatherAbility(ability,weather,battler,battle) + ability1 = ability + ability2 = battler.ability2 + EORWeatherAbility.trigger(ability1,weather,battler,battle) + EORWeatherAbility.trigger(ability2,weather,battler,battle) + end + + def self.triggerEORHealingAbility(ability,battler,battle) + ability1 = ability + ability2 = battler.ability2 + EORHealingAbility.trigger(ability1,battler,battle) + EORHealingAbility.trigger(ability2,battler,battle) + end + + def self.triggerEOREffectAbility(ability,battler,battle) + ability1 = ability + ability2 = battler.ability2 + EOREffectAbility.trigger(ability1,battler,battle) + EOREffectAbility.trigger(ability2,battler,battle) + end + + def self.triggerEORGainItemAbility(ability,battler,battle) + ability1 = ability + ability2 = battler.ability2 + EORGainItemAbility.trigger(ability1,battler,battle) + EORGainItemAbility.trigger(ability2,battler,battle) + end + +end \ No newline at end of file diff --git a/Data/Scripts/050_AddOns/DoubleAbilities_UI.rb b/Data/Scripts/050_AddOns/DoubleAbilities_UI.rb new file mode 100644 index 000000000..6e02ad57c --- /dev/null +++ b/Data/Scripts/050_AddOns/DoubleAbilities_UI.rb @@ -0,0 +1,130 @@ +# +# class AbilitySplashBar < SpriteWrapper +# def refresh +# self.bitmap.clear +# return if !@battler +# textPos = [] +# textX = (@side==0) ? 10 : self.bitmap.width-8 +# # Draw Pokémon's name +# textPos.push([_INTL("{1}'s",@battler.name),textX,-4,@side==1, +# TEXT_BASE_COLOR,TEXT_SHADOW_COLOR,true]) +# # Draw Pokémon's ability +# textPos.push([@battler.abilityName,textX,26,@side==1, +# TEXT_BASE_COLOR,TEXT_SHADOW_COLOR,true]) +# pbDrawTextPositions(self.bitmap,textPos) +# +# #2nd ability +# if $game_switches[SWITCH_DOUBLE_ABILITIES] +# textPos.push([@battler.ability2Name,textX,26,@side==1, +# TEXT_BASE_COLOR,TEXT_SHADOW_COLOR,true]) +# pbDrawTextPositions(self.bitmap,textPos) +# end +# end +# end + + +class AbilitySplashDisappearAnimation < PokeBattle_Animation + def initialize(sprites,viewport,side) + @side = side + super(sprites,viewport) + end + + def createProcesses + return if !@sprites["abilityBar_#{@side}"] + bar = addSprite(@sprites["abilityBar_#{@side}"]) + bar2 = addSprite(@sprites["ability2Bar_#{@side}"]) if @sprites["ability2Bar_#{@side}"] + + dir = (@side==0) ? -1 : 1 + bar.moveDelta(0,8,dir*Graphics.width/2,0) + bar2.moveDelta(0,8,dir*Graphics.width/2,0) if bar2 + + bar.setVisible(8,false) + bar2.setVisible(8,false) if bar2 + end +end + +class PokeBattle_Scene + def pbShowAbilitySplash(battler,secondAbility=false, abilityName=nil) + return if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH + side = battler.index%2 + if secondAbility + pbHideAbilitySplash(battler) if @sprites["ability2Bar_#{side}"].visible + else + pbHideAbilitySplash(battler) if @sprites["abilityBar_#{side}"].visible + end + if abilityName + @sprites["abilityBar_#{side}"].ability_name = abilityName if !secondAbility + @sprites["ability2Bar_#{side}"].ability_name = abilityName if secondAbility + end + + + @sprites["abilityBar_#{side}"].battler = battler + @sprites["ability2Bar_#{side}"].battler = battler if @sprites["ability2Bar_#{side}"] + + abilitySplashAnim = AbilitySplashAppearAnimation.new(@sprites,@viewport,side,secondAbility) + loop do + abilitySplashAnim.update + pbUpdate + break if abilitySplashAnim.animDone? + end + abilitySplashAnim.dispose + end +end + +class PokeBattle_Battle + + def pbShowSecondaryAbilitySplash(battler,delay=false,logTrigger=true) + return if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH + @scene.pbShowAbilitySplash(battler,true) + if delay + Graphics.frame_rate.times { @scene.pbUpdate } # 1 second + end + end + + def pbShowPrimaryAbilitySplash(battler,delay=false,logTrigger=true) + return if !PokeBattle_SceneConstants::USE_ABILITY_SPLASH + @scene.pbShowAbilitySplash(battler,false) + if delay + Graphics.frame_rate.times { @scene.pbUpdate } # 1 second + end + end + +end + + + +class FusionSelectOptionsScene < PokemonOption_Scene + def pbGetOptions(inloadscreen = false) + + options = [] + if shouldSelectNickname + options << EnumOption.new(_INTL("Nickname"), [_INTL(@pokemon1.name), _INTL(@pokemon2.name)], + proc { 0 }, + proc { |value| + if value ==0 + @nickname = @pokemon1.name + else + @nickname = @pokemon2.name + end + }, "Select the Pokémon's nickname") + end + + if @abilityList != nil + options << EnumOption.new(_INTL("Ability"), [_INTL(getAbilityName(@abilityList[0])), _INTL(getAbilityName(@abilityList[1]))], + proc { 0 }, + proc { |value| + @selectedAbility=@abilityList[value] + }, [getAbilityDescription(@abilityList[0]), getAbilityDescription(@abilityList[1])] + ) + end + + options << EnumOption.new(_INTL("Nature"), [_INTL(getNatureName(@natureList[0])), _INTL(getNatureName(@natureList[1]))], + proc { 0 }, + proc { |value| + @selectedNature=@natureList[value] + }, [getNatureDescription(@natureList[0]), getNatureDescription(@natureList[1])] + ) + return options + end +end + diff --git a/Data/Scripts/050_AddOns/ExperimentalOptions.rb b/Data/Scripts/050_AddOns/ExperimentalOptions.rb index a3f74f6c6..87880e3d3 100644 --- a/Data/Scripts/050_AddOns/ExperimentalOptions.rb +++ b/Data/Scripts/050_AddOns/ExperimentalOptions.rb @@ -36,7 +36,16 @@ class ExperimentalOptionsScene < PokemonOption_Scene proc { |value| $game_switches[SWITCH_NO_LEVELS_MODE] = value == 0 }, "All Pokémon use their base stats, regardless of levels." - ) + ), + EnumOption.new(_INTL("Double abilities"), [_INTL("On"), _INTL("Off")], + proc { + $game_switches[SWITCH_DOUBLE_ABILITIES] ? 0 : 1 + }, + proc { |value| + $game_switches[SWITCH_DOUBLE_ABILITIES] = value == 0 + }, "Fused Pokémon have two abilities at the same time" + ) + ] return options end diff --git a/Data/Scripts/050_AddOns/New Items effects.rb b/Data/Scripts/050_AddOns/New Items effects.rb index 763e7dc63..9babd2c87 100644 --- a/Data/Scripts/050_AddOns/New Items effects.rb +++ b/Data/Scripts/050_AddOns/New Items effects.rb @@ -1517,6 +1517,11 @@ def pbUnfuse(pokemon, scene, supersplicers, pcPosition = nil) pokemon.ability_index = pokemon.body_original_ability_index if pokemon.body_original_ability_index poke2.ability_index = pokemon.head_original_ability_index if pokemon.head_original_ability_index + pokemon.ability2_index=nil + pokemon.ability2=nil + poke2.ability2_index=nil + poke2.ability2=nil + pokemon.debug_shiny = true if pokemon.debug_shiny && pokemon.body_shiny poke2.debug_shiny = true if pokemon.debug_shiny && poke2.head_shiny diff --git a/Data/Scripts/050_AddOns/mapExporter2.rb b/Data/Scripts/050_AddOns/mapExporter2.rb index d69796277..68d96e7b1 100644 --- a/Data/Scripts/050_AddOns/mapExporter2.rb +++ b/Data/Scripts/050_AddOns/mapExporter2.rb @@ -2,7 +2,7 @@ EXPORT_EXCEPT_MAP_IDS= [768,722,723,724,720] def exportAllMaps - for id in 768..784 + for id in 1..798 begin MapExporter.export(id, [:Events]) if !EXPORT_EXCEPT_MAP_IDS.include?(id) rescue