• Hi, Guest!
    Some images might be missing as we move away from using embedded images, sorry for the mess!
    From now on, you'll be required to use a third party to host images. You can learn how to add images here, and if your thread is missing images you can request them here.
    Do not use Discord to host any images you post, these links expire quickly!
Resource icon

v18 Field Effects v2

This resource pertains to version 18 of Pokémon Essentials.
Pokémon Essentials Version
v18.1 ➖
Have you ever wanted to have Field Effects in your game?
It's personaly, one of my favorite mechanics of any fangame, so I'll teach you too how to do it too.

What are Field Effects?
If you have played Gen 6 or Gen 7, then you probably know about Terrains (Electric Terrain, Psychic Terrain ...)
Field Effects, are in a way, the exact same thing, but they are present from the very start of the battle, and are map based.
Because of this, it can be used to make fights more interesting, and based on what kind of effects those fields have, they can make the game more strategic.

FOR V18.1

Download the files attached to this resource!

FIELD EFFECTS GRAPHICS




FIELD EFFECTS BATTLE



Then post both files above main, in this order:
Field_Effects_Graphics
Field_Effects_Battle
Main

FOR V17
What I will teach you will be:
How to make it be active from the get go-
How to let background change based on the field-
How to implement battle start up messages-
How to buff overall move types, specific moves, specific move kind-
and a couple other stuff...

Step 1: Implementing an automatic background changer:

This step is mostly for future use, it will not do anything on its own, but we will need it later on.
I will explain what it does when we get there.
In PokeBattle_Battle search for def pbCommonAnimation(name,attacker,opponent,hitnum=0)

It should look like this:
d2z8035.png


After the second end, we will define a new method,
let's call it pbChangeBGSprite

QcmR54D.png


Inside of it, we will create a new variable, you can call it whatever you want, but you must remember it, as it will be the thing we will use the most.
Personally, I use $fieldeffectsbg , and I will do so for this tutorial too.

2Ok55xC.png


Once this new case has been created we will add 2 new cases, one for what I will call "Interior Field", which won't have anything special on it, it will be the default battle.
And, lets make, like, a Snow Field for example.
Default Essentials already comes with Backgrounds and Battle Bases for these two, so let's use those.

So, to define the background and battlebase for these fields, we will do it like this:

Ruby:
def pbChangeBGSprite
        case $fieldeffectsbg
          when 0 # Interior Field
            @scene.sprites["battlebg"].setBitmap("Graphics/Battlebacks/battlebgIndoorA.png")
            @scene.sprites["playerbase"].setBitmap("Graphics/Battlebacks/playerbaseIndoorA.png")
            @scene.sprites["enemybase"].setBitmap("Graphics/Battlebacks/enemybaseIndoorA.png")
          when 1 # Snow Field
            @scene.sprites["battlebg"].setBitmap("Graphics/Battlebacks/battlebgSnow.png")
            @scene.sprites["playerbase"].setBitmap("Graphics/Battlebacks/playerbaseSnow.png")
            @scene.sprites["enemybase"].setBitmap("Graphics/Battlebacks/enemybaseSnow.png")
         end
  end

This way, everytime we have to change to one of these fields, the game will know what background and battle bases to load.

And thats pretty much it for how this part, if you want to add more field effects, you just have to continue adding more when x, where x is the number of the field, its very important that the field always has that number, as it will now be defined as such.

Next, we will go toPokeBattle_Scene search for def pbBackDrop
Kyb3iP7.png


Replace that entire section with:

Ruby:
def pbBackdrop
    outdoor=false
    maps=[11] # Indoor Maps
    if $game_map && pbGetMetadata($game_map.map_id,MetadataOutdoor)
      outdoor=true
    elsif maps.include?($game_map.map_id)
         outdoor=true
    end
    environ=@battle.environment
    # Choose backdrop
    # Choose backdrop
    $fieldoverride = 0
    $tempfield = 0
    $fieldcounter = 0
    $fieldcollapse = 0
    backdrop="Field"
    if environ==PBEnvironment::Cave
      backdrop="Cave"
    elsif environ==PBEnvironment::MovingWater || environ==PBEnvironment::StillWater
      backdrop="Water"
    elsif environ==PBEnvironment::Underwater
      backdrop="Underwater"
    elsif environ==PBEnvironment::Rock
      backdrop="Mountain"
    elsif !outdoor
      backdrop="IndoorA"
    end
    if $game_map
      back=pbGetMetadata($game_map.map_id,MetadataBattleBack)
      if back && back !=""
        backdrop=back
        backdrop2 = backdrop
      end
    end
    # Field Effect override from variable
    if $game_variables[29] != 0
      $fieldoverride = $game_variables[29]
    end
    # Field Effect - in battle
    if $tempfield != 0
      $fieldoverride = $tempfield
    end
    # Apply override
    # Field Background
    if $fieldoverride != 0
      if $fieldoverride == 1
        backdrop="Snow"
      #elsif $fieldoverride == 2
      #  backdrop="Forest"
      else
        $tempfield = 0
      end
    backdrop3 = backdrop
    end
    if $PokemonGlobal && $PokemonGlobal.nextBattleBack
      backdrop=$PokemonGlobal.nextBattleBack
    end
    # Choose bases
    base=""
    trialname=""
    if environ==PBEnvironment::Grass || environ==PBEnvironment::TallGrass
      trialname="Grass"
    elsif environ==PBEnvironment::Sand
      trialname="Sand"
    elsif $PokemonGlobal.surfing
      trialname="Water"
    end
    if pbResolveBitmap(sprintf("Graphics/Battlebacks/playerbase"+backdrop+trialname))
      base=trialname
    end
    # Choose time of day
    time=""
    if ENABLESHADING
      trialname=""
      timenow=pbGetTimeNow
      if PBDayNight.isNight?(timenow)
        trialname="Night"
      elsif PBDayNight.isEvening?(timenow)
        trialname="Eve"
      end
      if pbResolveBitmap(sprintf("Graphics/Battlebacks/battlebg"+backdrop+trialname))
        time=trialname
      end
    end
    # Apply graphics
    if $fieldoverride != 0
      backdrop = backdrop2
    end
    # Field Effects
    if backdrop=="Snowy"
      fieldbd = 1
    #elsif backdrop=="Forest"
    #  fieldbd = 2
    else
      fieldbd = 0
    end
    #if $PokemonGlobal.surfing
    #  fieldbd = 21
    #  backdrop = "WaterSurface"
    #end
    $fieldeffectsbg = fieldbd
    $fieldbackup = $fieldeffectsbg
    $fieldeffectsbg = $fieldoverride if $fieldoverride != 0
    backdrop = backdrop3 if backdrop3
    # Apply graphics
    battlebg="Graphics/Battlebacks/battlebg"+backdrop+time
    enemybase="Graphics/Battlebacks/enemybase"+backdrop+base+time
    playerbase="Graphics/Battlebacks/playerbase"+backdrop+base+time
    pbAddPlane("battlebg",battlebg,@viewport)
    pbAddSprite("playerbase",
       PokeBattle_SceneConstants::PLAYERBASEX,
       PokeBattle_SceneConstants::PLAYERBASEY,playerbase,@viewport)
    @sprites["playerbase"].x-=@sprites["playerbase"].bitmap.width/2 if @sprites["playerbase"].bitmap!=nil
    @sprites["playerbase"].y-=@sprites["playerbase"].bitmap.height if @sprites["playerbase"].bitmap!=nil
    pbAddSprite("enemybase",
       PokeBattle_SceneConstants::FOEBASEX,
       PokeBattle_SceneConstants::FOEBASEY,enemybase,@viewport)
    @sprites["enemybase"].x-=@sprites["enemybase"].bitmap.width/2 if @sprites["enemybase"].bitmap!=nil
    @sprites["enemybase"].y-=@sprites["enemybase"].bitmap.height/2 if @sprites["enemybase"].bitmap!=nil
    @sprites["battlebg"].z=0
    @sprites["playerbase"].z=1
    @sprites["enemybase"].z=1
  end

This piece of code does a couple different things:
  1. Decides the field effect based on the background of the battle (decided in the metadata)
  2. Makes the background load automaticaly without any problem
  3. Adds a variable which in this case is
    Ruby:
    $game_variables[29]
    which will help you override field effects in any battle, ignoring the battle background (I'll show in an example later)
  4. Adds a method for Water Field if you use one with
    Code:
    #if $PokemonGlobal.surfing
    # fieldbd = 21
    # backdrop = "WaterSurface"
    #end

    Change the 21 for whichever number the Field is, and WaterSurface for the name of your background in Graphics/Backgrounds
Now, go to
Code:
PBEffects
and search for:

Code:
# These effects apply to the battle (i.e. both sides)
add,

Code:
Terrain     =  xx
Replace xx with whatever number you have afterwards, for me it's 13:

FVKtWwQ.png


Don't forget to go to the metadata of the map and add the correct background:
s411Ws8.png

Since we are going to do a Snow Field I'm using the Snow background.


Step 2: Basic Battle Boosts

In this step I will teach you how to boost specific types of moves, specific kind of moves (physical or special) and specific moves.

Since we went with a Snow Field for our example, I will continue to use that one, though I will take some creative liberty, so I can teach you how to do all of those kinds of things.

Let's start with Type Boosts, since we are on a Snow Field, lets boost Ice Type moves.

In PokeBattle_Move search for this piece of code:
m2A7iJa.png


Directly under it, lets start our Case $fieldeffectsbg.
9UtsYnJ.png


Since Interior Field has no boosts or anything special about it, it won't appear anywhere if you're wondering.

Okay, so, once that is done, lets boost Ice type moves.

Ruby:
case $fieldeffectsbg
       when 1 # Snow Field
         if isConst?(type,PBTypes,:ICE)
              damagemult=(damagemult*1.5).round
              @battle.pbDisplay(_INTL("The cold powered up the attack!",opponent.pbThis))
         end
    end

The first line directly under when 1, checks the type of the move, in this case ICE, the line under that will multiply that moves power by x1.5, and the last line will pop up a message whenever that happens.
These messages don't really have any impact, and I guess you can delete them, but I feel like they are fairly important as it helps knowing what is being boosted or not.

Now, this code will boost any Ice Type moves, lets get a bit creative shall we?
Lets make grass moves weaker in this field, but ONLY, if the Pokémon using the Grass Type Move is grounded.

Ruby:
case $fieldeffectsbg
       when 1 # Snow Field
         if isConst?(type,PBTypes,:ICE)
              damagemult=(damagemult*1.5).round
              @battle.pbDisplay(_INTL("The cold powered up the attack!",opponent.pbThis))
         end
         if !attacker.isAirborne? && isConst?(type,PBTypes,:GRASS)
               damagemult=(damagemult*0.5).round
               @battle.pbDisplay(_INTL("The snow field made the attack weaker!",opponent.pbThis))
         end
    end

What we are doing here is basicaly checking if the used is Airborne, this mean checking if its a Flying Type, has the Levitate ability, is levitating because of moves like Magnet Rise, etc...

This way we have Ice Moves that have a 50% power boost, Grass moves on non-airborne Pokémon that have a 50% power decrease.
Now let's do Move category specific, either Physical or Special, you should be able to do it on your own now:
But here's my example, in this case Im buffing Special Water Type Moves, and decreasing physical Flying type moves.

Ruby:
         if isConst?(type,PBTypes,:FLYING) &&
             pbIsPhysical?(pbType(@type,attacker,opponent))
              damagemult=(damagemult*0.5).round
              @battle.pbDisplay(_INTL("The field weakened the attack!",opponent.pbThis))
         end
         if isConst?(type,PBTypes,:WATER) &&
             pbIsSpecial?(pbType(@type,attacker,opponent))
              damagemult=(damagemult*1.5).round
              @battle.pbDisplay(_INTL("The attack got cold!",opponent.pbThis))
         end

So that was the code for specific Move category and specific move types.
But now, lets go for specific moves.

In PokeBattle_Move search for:
PPR2Dks.png


Directly under it, start the $fieldeffectsbg case again.
For this part, lets buff all the "Wind" related moves I can think of.

svJMVm5.png


With this all Wind moves are boosted by 50%, you can use the same method to make moves weaker too.

PS: If you're using default Essentials, your game probably doesn't have Fairy Wind, so it might cause an error pop up while testing, either add the move to the moves.txt pbs file, or delete that part from my example!

That should be it for this part then!

Step 3: Starting the field ingame

None of the first two steps will do anything without this one, I guess this should've been the second step then oops.

Anyway, this step is still kinda of confusing for me, but lets do this then.

In PokeBattle_Battle search for the line # Initialize Battle.
You should have this:
KSTE3pb.png

Now, lets add the start up battle message shall we?

Directly under that
Ruby:
end
add:

Ruby:
# Field Effects BEGIN UPDATE
    $fieldstartup = 0
    case $fieldeffectsbg
      when 1 # Snowy Field
       pbDisplayPaused(_INTL("The snow shines white in the ground!"))
      #when 2 # Forest Field
      #  pbDisplayPaused(_INTL("Trees surround the area!"))
    end

You don't really need the Forest Field part, but it's there as an example of how you should add more field effects, just keep on adding when x.

If you go test it in game, it should be good to go!

EdUHl4R.png


Now all you have to do is test some moves, to see if it all works correctly.

OKpw9rJ.png


That's all I can think of doing for now, if theres other specific things that could be interesting to do Ill update this post.

Thank you!

Extra Stuff:
Abilities and moves starting up the field:


First, go in
Ruby:
PokeBattle_ActiveSideField
And search for:
7IZg6Mt.png


You might have added more things to it, but it's not a problem.
In my case, right after
Ruby:
@effects[PBEffects::WonderRoom]      = 0
I will add:
Ruby:
@effects[PBEffects::Terrain]         = 0

Next go to
Code:
PokeBattle_Battle
, and find:
XIHJgAY.png

Directly above #Uproar, add:

Ruby:
# Terrain Moves
    if @field.effects[PBEffects::Terrain]>0
      terrain=[@field.effects[PBEffects::Terrain]].max
      terrain-=1
      @field.effects[PBEffects::Terrain] = terrain
      if terrain==0
        $fieldeffectsbg = $fieldbackup
        pbDisplay(_INTL("The terrain returned to normal."))
        pbChangeBGSprite
        PBDebug.log("[End of effect] Terrain ended")
      end
    end

This gives a coutdown system to the Terrain moves and Abilities, so that it changes back after x turns.

Now let's make a new move, called Snowy Terrain!
I'm gonna use Electric Terrain as the base, do the same, its way easier that way:

In PokeBattle_MoveEffects, goooo allllll theeee wayyyy dowwwnnn, and add:


Ruby:
################################################################################
# For 5 rounds, creates the snowy terrain effect
# (Snowy Terrain)
################################################################################
class PokeBattle_Move_159 < PokeBattle_Move
  def pbEffect(attacker,opponent,hitnum=0,alltargets=nil,showanimation=true)
    if @battle.field.effects[PBEffects::Terrain]>0
      @battle.pbDisplay(_INTL("But it failed!"))
      return -1
    end
    pbShowAnimation(@id,attacker,nil,hitnum,alltargets,showanimation)
    $fieldbackup = $fieldeffectsbg
    $tempfield = 1
    $fieldeffectsbg = $tempfield
    @battle.pbChangeBGSprite
    @battle.field.effects[PBEffects::Terrain]=5
    #@battle.field.effects[PBEffects::Terrain]=8 if attacker.hasWorkingItem(:TERRAINEXTENDER)
    @battle.pbDisplay(_INTL("The terrain was filled with white snow!"))
    return 0
  end
end

In this piece of code, we have $tempfield = 1, change the 1 with whatever the number of your field is.
We also have #@battle.field.effects[PBEffects::Terrain]=8 if attacker.hasWorkingItem(:TERRAINEXTENDER)
This checks if the user is holding an item that can extend the duration of terrain moves, if you have such an item, uncomment this line.

Before we go to abilities, quick side note, if you have Electric, Misty, Psychic and Grassy Terrain moves, do the same thing to them:
nGIyjpn.png

If you don't change their code too, you will be able to put the Snowy Field + Electric Terrain combo for example, you don't want that. (Unless that is a new mechanic you want to do? Up to you)

Next, abilities!!

In
Ruby:
PokeBattle_Battler
, find
Code:
if self.hasWorkingAbility(:DELTASTREAM)
P1POkk9.png


Directly under it, add:
Ruby:
      if self.hasWorkingAbility(:SNOWYSURGE) && ($fieldeffectsbg!=1) # Snowy Field
        showAbilityMessage(self)
        $fieldbackup = $fieldeffectsbg
        $tempfield = 1
        $fieldeffectsbg = $tempfield
        @battle.pbChangeBGSprite
        @battle.field.effects[PBEffects::Terrain]=5
        #@battle.field.effects[PBEffects::Terrain]=8 if self.hasWorkingItem(:TERRAINEXTENDER)
        @battle.pbDisplay(_INTL("The terrain was filled with white snow!"))
        PBDebug.log("[#{pbThis}: Snowy Surge made Snowy Terrain]")
      end

Change $tempfield = 1 and ($fieldeffectsbg!=1) with the number of the field you want it to change to.
And that is it!
Don't forget to do one for Grassy Surge etc too if you don't have those yet.


Thank you. <o/
Credits
V.17
Amethyst
Blind Guardian
BIGFriv
Groniack

V.18
Amethyst
Blind Guardian
BIGFriv
Golisopod User
Author
BIGFriv
Downloads
1,061
Views
6,793
First release
Last update
Rating
5.00 star(s) 1 ratings

More resources from BIGFriv

Latest updates

  1. Bug Fixing

    - Fixed a bug caused by me forgetting to comment out one line. I apologise
  2. Updated to v18.1

    -> Made the script plug and play -> Added a multitude of comments to explain things -> No longer...
  3. Overhaul

    Overhauled the script a bit, so that it works better. Also added a section of how to make moves...
Back
Top