From 59fea87b0d67b2bda62fd3a1db631797391ec4b8 Mon Sep 17 00:00:00 2001 From: infinitefusion Date: Sat, 27 May 2023 14:15:19 -0400 Subject: [PATCH] Dboule abilities stuff --- Data/Map329.rxdata | Bin 34046 -> 34872 bytes .../001_Battler/005_Battler_StatStages.rb | 2 +- Data/Scripts/050_AddOns/DoubleAbilities.rb | 249 ++++++++++++++++++ Data/Scripts/050_AddOns/DoubleAbilities_UI.rb | 124 +++++++++ Data/System.rxdata | Bin 28034 -> 28034 bytes 5 files changed, 374 insertions(+), 1 deletion(-) create mode 100644 Data/Scripts/050_AddOns/DoubleAbilities.rb create mode 100644 Data/Scripts/050_AddOns/DoubleAbilities_UI.rb diff --git a/Data/Map329.rxdata b/Data/Map329.rxdata index 97e201e3b528f9e89e7ec4d3e277ce5dbc959499..1aca2bdf9fae666790f5fb049521401d326ad952 100644 GIT binary patch literal 34872 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 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 ability2_id + if !@ability2 + sp_data = species_data + abil_index = ability2_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 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/DoubleAbilities_UI.rb b/Data/Scripts/050_AddOns/DoubleAbilities_UI.rb new file mode 100644 index 000000000..095acf425 --- /dev/null +++ b/Data/Scripts/050_AddOns/DoubleAbilities_UI.rb @@ -0,0 +1,124 @@ +# +# 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) + 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 + @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/System.rxdata b/Data/System.rxdata index efa83d99e2d217a6152000831ef226a82663896b..35b4c0783098817ebec0d26fc55a0fa398d54265 100644 GIT binary patch delta 18 ZcmZp=&DeCCaf78K^E4Ns%{G#5Apk?r22cP1 delta 18 ZcmZp=&DeCCaf78K^P6|-n{6cBLI6vo2W0>N