List of Changes - pbflo/Where-Love-Lies-Overhaul GitHub Wiki

Where Love Lies

Maps

Maps
  • Map001 - Ferry
    • Changed connection to "Map2" (Gearen City)
  • Map002 - Gearen City (Outside)
    • Updated to match "Map59" (East Gearen City) from Rejuvenation
    • Removed hidden NPC
    • Removed hidden shop
    • Updated events (39|86) [Arrival], (53|73) [Leaving], (47|48), (47|49), (47|50) [Meeting Jenner & Chasity], (46|31), (46|32), (46|33), (46|34), (46|35) [No Gig], (56|30), (57|30), (58|30), (59|30) [Going to Mansion], (27|39) [Thrown Out], (57|19) [Fleeing From Mansion], (23|14), (23|15), (23|16), (23|17), (23|18), (23|19) [Meeting Tesla], (39|75) [Deagan Arrives] for new positions
    • Fixed some spelling mistakes
    • Changed dialog concerning Worker ID location
    • Workers & Pokémon now disappear at night
    • Disallowed Pokémon choice cancel
    • Union ID now only found by Item Finder when it can be picked up
  • Map003 - Four Island (Departure)
    • Fixed some spelling mistakes
  • Map004 - Mysterious Mansion
    • Updated to match "Map250" (Marble Mansion) from Rejuvenation
    • Changed connections to "Map2" (Gearen City)
    • Updated event (9|29) for new position
  • Map005 - Hidden Ritual
    • Updated to match "Map262" (Hidden Ritual) from Rejuvenation
    • Removes unused touch event
    • Time Capsule can now be found with Item Finder
    • Made ritual area accessible again
  • Map006 - Gearen City (Inside)
    • Changed connections to "Map2" (Gearen City)
    • Fixed missing character nameplate
  • Map007 - Gearen Apartments
    • Changed connections to "Map2" (Gearen City)
    • Fixed some spelling mistakes
    • Fixed a way to get out of bounds
    • Moved a room to no longer be visible from another
  • Map008 - ??? (Cliffside Grave)
    • Updated to match "Map200" (Cliffside Grave) from Rejuvenation
    • Adds dialog for not going into the cave
  • Map009 - ??? (Cliffside Grave - Cutscene)
    • Updated to match "Map200" (Cliffside Grave) from Rejuvenation
    • Fixed two repeated lines that did not match their counterpart in "Map008" (???)
  • Map010 - Gearen City (Lonely Rest Center)
    • Changed connection to "Map2" (Gearen City)
  • Map012 - Uncharted Forest (Main)
    • Changed some tree colors to match the new "Map14" (Uncharted Field)
    • Fixed some spelling mistakes
  • Map013 - Uncharted Forest (Pond)
    • Changed connection to "Map31" (Sheridan Village)
  • Map014 - Uncharted Field
    • Updated to match "Map199" (Route 2) from Rejuvenation
    • Updated move routes of event (58|29) for different space (UNTESTED)
    • Adds some pink trees & grass around the big one
    • Replaced tree with younger version
    • Adds transition events (57|7) & (58|7) to "Map015" (Destroyed Village)
    • Fixed some spelling mistakes
    • Going under waterfalls supports following pokémon
    • Split event 1 & the triggers 18, 27, 5, 29, 30 because of position
  • Map015 - Destroyed Village
    • Updated to match "Map432" (River's End) from Rejuvenation
    • Updated "Transfer Player" commands
    • Fixed some spelling mistakes
    • Going under & over the rock bridge supports following pokémon
    • Updated event (41|21) for new position
  • Map016 - Uncharted Woods (Route 3 Upper)
    • Updated to match "Map067" (Route 3) from Rejuvenation
    • Edited events (45|6) & (45|7) for correct connection to the new Hidden Forest & Sheridan Village
  • Map017 - Hidden Forest
    • Updated to match "Map423 (Sheridan Village) from Rejuvenation
    • Updated move routes of events (47|38), (48|38), (49|38), (54|38), (55|38), (56|38) & (45|7) for different space
    • Updated event (9|39) for different space
    • Changed connections to "Map2" (Gearen City)
  • Map018 - Uncharted Cave (Carotos Entrance)
    • Updated to match "Map119" (Carotos Mountain) from Rejuvenation
    • Changed dialog for new spring location
  • Map019 - Uncharted Cave (Route 2)
    • Changed "Transfer Player" of event (55|10) to match the new "Map015" (Destroyed Village)
  • Map020 - Cella's House
    • Updated to match "Map425 (Sheridan Village) from Rejuvenation
    • Changed "Transfer Player" of event (7|16) & (27|16) to match the new "Map015" (Destroyed Village)
    • Updated event (7|17) for different space
  • Map021 - Uncharted Woods (Route 3 Lower)
    • Updated to match "Map071" (Route 3) from Rejuvenation
    • Edited events (9|30) & (9|31) for correct connection to the new Thief's Stronghold
    • Adds events (23|33), (24|33) & (25|33) for connection to the new Destroyed Village
    • New dialog for trying to go to Thief's Stronghold without checking on Taelia
  • Map022 - Uncharted Woods (Route 3 Middle)
    • Updated to match "Map069" (Route 3) from Rejuvenation
  • Map023 - Thief's Stronghold (Outside)
    • Updated to match "Map82" (Goldenleaf Town) from Rejuvenation
    • Stairs now support following pokémon
    • Trainers will reset after turning back time
  • Map024 - Forest Cliff (Boulder)
    • Updated to match "Map424" (Sheridan Arena) from Rejuvenation
    • Added event (21|15) for wider walkway
    • Edited event (19|15) & (20|15) move routes for wider walkway
    • Edited event (19|15), (20|15) & (21|15) so Taelia does not get stuck when seeking cover
  • Map025 - Thief's Stronghold (Inside)
    • Fixed some spelling mistakes
    • Edited event (14|39) for correct connection to the new Thief's Stronghold (Outside)
    • Edited event (33|4), (45|4) & (41|7) for correct connection to the new Forest Cliff
    • When "turning back time" player will be positioned at entered entrance
  • Map026 - Sheridan Village (Stage 1)
    • Updated to match "Map423" (Sheridan Village) from Rejuvenation
    • Changed dialog for new spring entrance
    • Updated event (48|45) & (35|33) for new positions
    • Fixed teleports in events (29|6), (30|6), (40|6) & (41|6) to lead to the forest cliff with the destroyed rock after the event
  • Map027 - Taelia's House
    • Updated to match "Map425 - Sheridan Village from Rejuvenation
    • Updated "Transfer Player" commands
  • Map028 - Forest Cliff (Hole)
    • Updated to match "Map424" (Sheridan Arena) from Rejuvenation
    • Updated a few events to work with the environment
    • Removed Capsule Key
  • Map029 - Sheridan Village (Stage 2)
    • Updated to match "Map423" (Sheridan Village) from Rejuvenation
    • Updated event (35|28) for new position
  • Map030 - Sheridan Village (Stage 3)
    • Updated to match "Map423" (Sheridan Village) from Rejuvenation
    • Updated event (17|32) for new position
  • Map031 - Sheridan Village (Stage 3 - 2)
    • Updated to match "Map423" (Sheridan Village) from Rejuvenation
    • Removed Trainer
    • Removed unused event
    • Fixed teleports in events (29|6), (30|6), (40|6) & (41|6) to lead to the forest cliff with the destroyed rock
    • Fixed a spelling mistake
  • Map032 - Spring of Purification (Before Timeskip)
    • Updated to match "Map206" (Spring of Purification) from Rejuvenation
    • Updated events (18|24), (19|24) & (20|24) for new positions
  • Map033 - Wedding Cutscene
    • Updated to match "Map424" (Sheridan Arena) from Rejuvenation
    • Updated event (19|17) to show the right positions
    • Moved event (19|15) to (21|15) to make use of the space
  • Map036 - Sensei's House (After Timeskip)
    • Updated to match "Map7" (Sensei's House) from Rejuvenation
    • Updated events (9|3), (9|12), (9|18), (3|20) & (30|3) for new positions
    • Fixed teleport in event (3|20) & (9|12)
  • Map038 - Sheridan Village (After Timeskip)
    • Updated to match "Map423" (Sheridan Village) from Rejuvenation
    • Updated events (44|18), (47|18) for new position
    • New after battle dialog for (25|36)
    • Removed Ultra Ball Item
    • Adds new dialog concerning going to Route 3 while on the way to Route 2
  • Map039 - Sheridan Arena (After Timeskip)
    • Updated to match "Map424" (Sheridan Arena) from Rejuvenation
    • Updated events (20|13), (20|34) & (27|34) for new positions
    • Fixed some spelling mistakes
  • Map040 - Sheridan Village (Inside - After Timeskip)
    • Updated to match "Map425" (Sheridan Village) from Rejuvenation
    • Updated events (8|43), (38|10) & (12|78) for new positions
    • Changed dialog for inn ownership
    • Fixed some spelling mistakes
    • Following pokemon compatible stairs
  • Map041 - Sensei's Garden
    • Updated to match "Map426" (Sensei's Garden) from Rejuvenation
  • Map042 - Amethyst Tunnels (Sheridan Entrance)
    • Updated to match "Map184" (Amethyst Cave) from Rejuvenation
  • Map043 - Amethyst Tunnels (Middle)
    • Updated to match "Map159" (Amethyst Cave) & "Map161" (Amethyst Cave) from Rejuvenation
    • Fixed a spelling mistake
  • Map044 - Amethyst Tunnels (Hole)
    • Updated to match "Map4" (Amethyst Cave) from Rejuvenation
    • Added dialog for before Kenneth goes away again for event (11|13)
    • Fixed trigger for first page of event (21|39)
  • Map046 - Amethyst Dungeon (Broken Bridge)
    • Fixes small inconsistency in event (43|27)
  • Map049 - ??? (Amethyst Grotto)
    • Updated to match "Map488" (Amethyst Grotto) from Rejuvenation
    • Updated event (23|30) for new position
    • Changed dialog for required soul count
  • Map050 - Sensei's House (Before Fire)
    • Updated to match "Map7" (Sensei's House) from Rejuvenation
    • Updated events (9|12) & (32|5) for new positions
  • Map051 - Sheridan Village (On Fire)
    • Updated to match "Map423" (Sheridan Village) from Rejuvenation
    • Updated events (40|17) & (50|35) for new positions
    • Fixed a spelling mistake
    • Fixed a line skip
  • Map052 - FIGHT AREA
    • Updated to match "Map7" (Sensei's House) from Rejuvenation
    • Updated events (5|10), (5|4), (30|8), (10|37) for new positions (UNTESTED)
  • Map053 - Sheridan Arena (On Fire)
    • Updated to match "Map424" (Sheridan Arena) from Rejuvenation
    • Updated event (17|10) for new position
  • Map054 - Sheridan Arena (Cliff)
    • Updated to match "Map424" (Sheridan Arena) from Rejuvenation
    • Updated event (19|23) for new position
  • Map055 - Gearen City (Fire)
    • Updated to match "Map59" (East Gearen City) from Rejuvenation
    • Fixed teleport in event (24|33)
    • Fixed a spelling mistake
  • Map056 - Route 2
    • Updated to match "Map199" (Route 2) from Rejuvenation
    • Updated event (79|37), (58|28) & (79|27) move routes for different space (UNTESTED)
    • Added event (56|63) & (57|62) to aknowledge the Kecleon Bazaar
    • Fixed teleport in event (58|28)
    • Going under waterfalls & jumping to the tree supports following pokémon
    • For alternate route:
      • Place non-traversable rail at (69|61)
      • Remove trees at (47|65) & (45|70)
      • Reposition event from (78|59) to (38|53)
      • In Map118 place traversable rail at (10|15)
  • Map057 - Wispy Tower
    • Updated to match "Map102" (Wispy Tower) from Rejuvenation (recolored some trees)
    • Fixed teleport in event (16|42)
  • Map060 - Icefall Cave
    • Fixed a spelling mistake
  • Map063 - Spring of Purification (Timeskip & Present)
    • Updated to match "Map206" (Spring of Purification) from Rejuvenation
    • Updated event (19|25) for new position & adds Cella crying
    • Removed a bridge to require surfing (needed on the mountain)
    • Added dialog for removed bridge
  • Map064 - Carotos Pinnacle (Apparations)
    • Fixed a spelling mistake
    • Fixed teleport in event (46|25)
    • Removed duplicate autorun events
    • Fixed move route in event (46|25)
    • Added some tiles to go behind while surfing
    • Improved returning to the mountain in event (46|39)
    • Animation for Kenneth holding Kai'ya in event (46|22)
  • Map065 - Aelita Cutscene
    • Fixed teleport in event (13|17)
  • Map66 - Wedding Cutscene (Rebuilding)
    • Updated to match "Map424" (Sheridan Arena) from Rejuvenation
    • Updated event (20|9) for new position
  • Map067 - Sheridan Arena (Present Day After Returning)
    • Updated to match "Map424" (Sheridan Arena) from Rejuvenation
    • Edited event (20|18) for new door animation
    • Fixed teleport in event (20|18)
    • Changed dialog for Eldest's location
    • Fixed a spelling mistake
  • Map068 - Sensei's House (Present - Main Room)
    • Updated to match "Map7" (Sensei's House) from Rejuvenation
    • Updated events (11|18), (11|11) for new positions
  • Map069 - Sensei's Garden
    • Updated to match "Map426" (Sensei's Garden) from Rejuvenation
    • Fixed teleport in event (13|10)
    • Fixed a spelling mistake
  • Map070 - Sheridan Arena (Present Day)
    • Updated to match "Map424" (Sheridan Arena) from Rejuvenation
    • Edited event (19|11) to make more sense with single door
  • Map071 - Sheridan Village (Present)
    • Updated to match "Map423" (Sheridan Village) from Rejuvenation
    • Updated events (34|27), (35|27), (36|27), (40|18), (56|42), (48|32), (48|31) for new positions
    • Changed dialog for opening gate
    • Changed dialog for Eldest's location
    • Changed trainer dialog for (27|17)
    • Removed Ultra Ball Item
    • Adds Rejuvenation quest completion animation to event (56|42)
  • Map072 - Sheridan Village (Inside - Present)
    • Updated to match "Map425" (Sheridan Village) from Rejuvenation
    • Updated events (12|78), (7|76), (17|73), (56|7), (17|34) for new positions
    • Fixed starting over sprite for (59|29)
    • Fixed some spelling mistakes
    • Following pokemon compatible stairs
    • Added quest icon event
    • Adds a "Nothing" option to event (17|34)
  • Map073 - Help Plaza
    • Updated to match "Map15" (Help Plaza) from Rejuvenation
    • Updated event (9|10) for new position
  • Map074 - Inner Workings (Broken Connection)
    • Fixed a spelling mistake
  • Map075 - Sensei's House (Present - Sideroom)
    • Updated to match "Map7" (Sensei's House) from Rejuvenation
  • Map076 - Pokemon Center (Four Island)
    • Fixed an invalid variable
  • Map082 - Four Island (After Deagan Fight)
    • Improved returning to the mountain transition in event (16|16)
  • Map083 - ??? (Madelis' Room)
    • Updated to match "Map34" (Xen Lounge) from Rejuvenation
    • Fixed teleport in event (12|8)
  • Map084 - Inner Workings (Fixed Connection)
    • Fixed a spelling mistake
  • Map085 - Carotos Pinnacle (Fall)
    • Fixed a spelling mistake
  • Map087 - Inner Workings (Fixed Connection)
    • Fixed a spelling mistake
  • Map088 - Carotos Pinnacle (True Ending)
    • Fixed some spelling mistakes
  • Map089 - Sheridan Village (Present - End Cutscene)
    • Updated to match "Map423" (Sheridan Village) from Rejuvenation
    • Updated event (45|32) for new position
    • Fixed a line skip
  • Map090 - Sheridan Village (Present - Current Version)
    • Copied from "Map423" (Sheridan Village) from Rejuvenation
  • Map091 - Sheridan Arena (True Ending)
    • Updated to match "Map424" (Sheridan Arena) from Rejuvenation
  • Map092 - Rose Theatre
    • Updated to match "Map315" (Rose Theatre) from Rejuvenation
    • Replaced ending images
    • Fixed teleport in event (7|7)
    • Fixed a spelling mistake
    • Changed event (7,|7) for Cella to actually cry
  • Map093 - My Memory
    • Updated to match "Map7" (Sensei's House) from Rejuvenation
    • Updated event (8|10) for new position
    • Fixed a spelling mistake
  • Map094 - Uncharted Field (Ending)
    • Updated to match "Map199" (Route 2) from Rejuvenation
  • Map113 - Uncharted Cave
    • Added based on Map133 (Gemstream Mine) to have a way to the water in the new Map014 (Uncharted Field)
    • Added music (same as Uncharted Cave)
    • Added encounters (combination of Uncharted Cave & Gemstream Mine (from Rejuvenation))
  • Map118 - Gemstream Mine
    • Added based on Map133 (Gemstream Mine) to have a way to the tree in the new Map056 (Route 2)
    • Edited event (31|37) because the exit is blocked
    • Added music (same as Uncharted Cave)

Images

Autotiles
  • "DirtDark"
    • Copy from Rejuvenation
  • "BurntGrassSheridan"
    • Edited copy of GrassSheridan to match the actual floor
Battlebacks
  • All are just copies from the corresponding ones from Rejuvenation
Characters
  • "HealBell"
    • Copy from Rejuvenation
  • "MC_Aelita1"
    • Copy of Aelita from Rejuvenation
  • "MC_Aelita2"
    • Copy of Aelita_7 from Rejuvenation
  • "MC_Anju"
    • Copy of trchar205 from Rejuvenation
  • "MC_Cella_1_Crying"
    • Edited copy of MC_Cella_1
  • "MC_Cella_2"
    • Copy of trchar069 from Rejuvenation
  • "MC_Cella3"
    • Copy of trchar069_4 from Rejuvenation
  • "MC_Cella_3_Crying"
    • Edited copy of trchar069_4 from Rejuvenation
  • "MC_Chasity2"
    • Edited copy of Venam's Mom from Rejuvenation
  • "MC_Jan"
    • Copy of trchar220 from Rejuvenation
  • "Boy_run_1", "Boy_run_2", "boy_surf_1", "boy_surf_2", "Boy_walk_1", "Boy_walk_2", "MC_Kenneth6", "MC_Kenneth7" & "trchar000_1"
    • Edited copy of Keta from Rejuvenation
  • "trback000_1", "trback002" & "trback003"
    • Edited copy of trback132 from Rejuvenation
  • "trback000"
    • Edited copy of trback000 from Where Love Lies to match the skintone of Trainer133 and eyes from trback132 from Rejuvenation
  • "MC_Jan"
    • Copy of trchar220 from Rejuvenation
  • "MC_Madelis"
    • Copy of trchar079 from Rejuvenation
  • "MC_Nymiera"
    • Copy of trchar126 from Rejuvenation
  • "MC_Taelia_6_2"
    • Sligthly edited copy of MC_Taelia_6 with another crawling pose
  • "MC_Vivian"
    • Copy of trchar268 from Rejuvenation
  • "Object TM Ball", "object_doors", "Object_Doors_2", "object_firelight", "Object_Gate_1", "QuestBubble" & "streetlights_1"
    • Copy from Rejuvenation
  • "Object_StoneWall"
    • Combination of different tiles from Sheridan_2 to create a disappearing wall
  • "trainer006"
    • Copy of trainer012 from Rejuvenation
  • "trainer007"
    • Copy of trainer013 from Rejuvenation
  • "trainer010"
    • Copy of trainer018 from Rejuvenation
  • "trainer013"
    • Copy of trainer016 from Rejuvenation
  • "trainer015"
    • Copy of trainer019 from Rejuvenation
  • "trainer018"
    • Copy of trainer021 from Rejuvenation
  • "trainer020"
    • Copy of trainer022 from Rejuvenation
  • "trainer023"
    • Copy of trainer025 from Rejuvenation
  • "trainer025"
    • Copy of trainer023 from Rejuvenation
  • "trainer028"
    • Copy of trainer036 from Rejuvenation
  • "trainer031" & "trainer064"
    • Copy of trainer027 from Rejuvenation
  • "trainer032" & "trainer065"
    • Copy of trainer040 from Rejuvenation
  • "trainer033"
    • Copy of trainer041 from Rejuvenation
  • "trainer034"
    • Copy of trainer042 from Rejuvenation
  • "trainer035" & "trainer066"
    • Copy of trainer028 from Rejuvenation
  • "trainer036" & "trainer067"
    • Copy of trainer029 from Rejuvenation
  • "trainer037"
    • Copy of trainer024 from Rejuvenation
  • "trainer038"
    • Copy of trainer037 from Rejuvenation
  • "trainer039"
    • Copy of trainer038 from Rejuvenation
  • "trainer040"
    • Copy of trainer039 from Rejuvenation
  • "Trainer061"
    • Copy of Trainer154 from Rejuvenation
  • "trainer068"
    • Copy of trainer030 from Rejuvenation
  • "trchar006"
    • Copy of trchar020 from Rejuvenation
  • "trchar007", "trchar010", "trchar015", "trchar031", "trchar033", "trchar034", "trchar035", "trchar036", "trchar037", "trchar039", "trchar040"
    • Copy from Rejuvenation
  • "trchar018" & "trchar026"
    • Copy of trchar018 from Rejuvenation
  • "trchar025_on_scaffold"
    • Copy from different parts of GearenCity Real to create disappearing workers
  • "trchar020"
    • Copy of trchar006 from Rejuvenation
  • "trchar023"
    • Copy of trchar089_2 from Rejuvenation
  • "trchar028" & "trchar029"
    • Copy of trchar235 from Rejuvenation
  • "trchar032" & "trchar065"
    • Copy of trchar032 from Rejuvenation
  • "trchar038"
    • Copy of trchar021 from Rejuvenation
  • "trchar063"
    • Copy of trchar055_2 from Rejuvenation
  • "trchar067"
    • Copy of trchar112 from Rejuvenation
Icons
  • "menuSpiceScent"
    • Edited copy of iceheal from Rejuvenation
  • All Others
    • Copied from Rejuvenation
Panoramas
  • "hiddenforestbg"
    • New images based on new Hidden Forest environment for "Cliffside Grave" backdrop
Pictures
  • Summary
    • "summary1", "summary2", "summary3", "summary4", "summary5", "summary5details", "summary5learning", "summaryEgg", "summaryShadow"
      • Copied from Rejuvenation
    • "summary4learning"
      • Copied from "summary5learning" from Rejuvenation
  • Battle
    • All
      • Copied from Rejuvenation
  • "CarvedTree"
  • "Chapter3_4" & "Chapter3_7"
    • Updated Kenneth graphic
  • "Chapter4_3" & "Chapter4_6"
    • Updated Kenneth graphic
    • Fixed Alignment
  • "Portrait", "Portrait_2", "QuestComplete_1", "QuestComplete_2", "TimeGear1", "TimeGear4"
    • Copy from Rejuvenation
  • "spicescentbg"
    • Slightly edited copy from Rejuvenation
  • "TheEnd_1_Overhaul" & "TheEnd_2_Overhaul"
    • New images based on new "Map14" (Uncharted Field) environment
  • "TheEnd_3_Overhaul"
    • New images based on new "Map14" (Uncharted Field) environment
    • Fixed alignment of text
Tilesets
  • "Amethyst Cave"
    • Copied from "Amethyst Cave" from Rejuvenation
    • Copies some tiles from the original "Amethyst Cave" for the Amethyst Dungeon
    • Adds some new rock borders
  • "Amethyst Grotto"
    • Copied from "Amethyst Grotto" from Rejuvenation
  • "Carotos Mountain"
    • Added small hole from Rejuvenation (recolored)
    • Added deep water shadow from Rejuvenation (recolored)
    • Added water tile (to prevent following Pokémon from glitching out)
    • Recolors a large rock
  • "Chrisola Hotel"
    • Copied from "Chrisola Hotel" from Rejuvenation and added the differences from WLL
    • Added cracked/broken variant for new floors
    • Added destroyed carpet
  • "CorruptedCave"
    • Added new sacrifice symbol
    • Updated pit with new border
    • Added floor border variants from Rejuvenation
  • "GearenCity Real"
    • Updated "Mysterious Mansion" facade
    • Copied some wall, roof & fence tiles from Rejuvenation
    • Copied tower and hedges from Rejuvenation
  • "Goldenleaf Forest"
    • Adds green trees
    • Adds new stairs
    • Adds rock-border with grass
    • Adds stone floor variations
    • Recolors red small tree
  • "Goldenwood Cave"
    • Adds some rocks, ladders, crystals, entrances & rails for "Gemstream Mine"
  • "RoseTheatre"
    • Copied selection from "Grand Dream City Interiors" from Rejuvenation
  • "Route 2_1"
    • Adds trees from "Route 2_new"
  • "Route 2_new"
    • Copied from "Route 2" from Rejuvenation
    • Edit foliage to be various shades of green
    • Adds back pink trees & grass for transformation
    • Created a younger tree design for "Uncharted Field"
    • Copied destroyed house & family from original "Route 2"
    • Adds another water tile
    • Updated Kenneth graphic
  • "Route 3"
    • Copied from "Route 3" from Rejuvenation
    • Added cutout version of default grass
  • "Sheridan_2"
    • Copied from "Sheridan_2" from Rejuvenation and added the differences from WLL
    • Added "DirtDark" auto-tile
    • Re-Added boulder and hole
    • Re-Added centered cherry tree
    • Re-Added barrier slopes (retextured)
    • Re-Centered Taelia and Kenneth graphics
    • Adds Cherry Blossom for Sensei's Garden
    • Adds new dark window
    • Adds new burned stone barrier
    • Updated Kenneth graphics
  • "SheridanInside"
    • Copied from different parts of "Multi-Interiors" from Rejuvenation & "GearenInteriors" from the original Where Love Lies
    • Adds more furniture
    • Custom desk and custom furniture extensions
    • Adds custom destroyed table
    • Adds custom old/destroyed flooring, walls, and carpet
    • Adds custom broken banister
Windowskins
  • All
    • Copied from Rejuvenation

Script

Bugs
  • Surfing Wall Glitch Fix

    Description:
    When exiting surfing the player goes by two tiles into this direction resulting in the player possibly being placed out of bounds or in an impassible tile or event.

    Fix:

    $lastpbEndSurfResult = false
    
    alias follower_realEndSurf follow_pbEndSurf
    def follow_pbEndSurf(xOffset,yOffset)
      return $lastpbEndSurfResult
    end
    
    alias follower_endSurf pbEndSurf
    def pbEndSurf(xOffset,yOffset)
      $lastpbEndSurfResult = follower_realEndSurf(xOffset,yOffset)
      follower_endSurf(xOffset,yOffset)
      return $lastpbEndSurfResult
    end

    Explanation of the Bug:
    The move in class Game_Player was not canceled, because the file "Follower.rb" overwrote the method pbEndSurf, but does not return any value. Therefore the player was moved one tile by dismounting (in the form of a jump) and one tile by the default move action.

  • Font Loading Fix

    Description:
    When loading up the game it might pop up a message, that not all fonts are installed, even though they are.

    Fix:

    module FontInstaller
      class <<self
        alias_method :old_install, :install
      end
    
      def self.install 
        # Check if all fonts already exist
        fontsExist=true
        dest=self.getFontFolder()
        for i in 0...Names.size
          if !Font.exist?(Names[i])
            fontsExist=false
          end
        end
        return if fontsExist
        # Else call install method
        old_install
      end
    end

    Explanation of the Bug:
    As far as I understand it was only checked if the files are in the directory and not if the font itself was installed. Seemingly the installed fonts have a different name, and therefore they are not found by this check. (Automatic Installation is still broken because writing the new file in copy_file fails)

  • Joiplay Menu Fix

    Description:
    When opening the menu in Joiplay the game would crash.

    Fix:

    module Graphics
      class <<self
        alias_method :original_snap_to_bitmap, :snap_to_bitmap if self.method_defined?(:snap_to_bitmap)
      end
    
      def self.snap_to_bitmap
        ret = new_snap_to_bitmap()
        ret = original_snap_to_bitmap() if ret == nil && defined?(:original_snap_to_bitmap)
        return ret
      end
    end

    Commenting out the following in PokemonSystem.rb

    module Graphics
      def self.snap_to_bitmap; return nil; end
    end

    And renaming def self.snap_to_bitmap to def self.new_snap_to_bitmap in SpriteResizer.rb

    Explanation of the Bug:
    The method from Sprite Resizer uses a .dll for capturing the screen, which does not seem to work in Joiplay. Joiplay itself seems to provide an own implementation of the snap_to_bitmap function. The standalone game on the other hand does not provide this method by itself. Therefore the fix tries using the SpriteResizer version first, and if that fails and a previous implementation was found uses the original implementation.

More Borders

Description:
Adding more speech and text frames from Rejuvenation v13.5.

additionalSpeechFrames = ["speech hgss 21", "speech hgss 29", "speech hgss 30", "speech hgss 31", "speech hgss 32", "speech hgss 33", "speech hgss 34", "speech hgss 35", "speech hgss 36", "speech hgss 37"]
$SpeechFrames.insert($SpeechFrames.length-1, *additionalSpeechFrames)
additionalTextFrames = ["Graphics/Windowskins/choice 29", "Graphics/Windowskins/choice 30", "Graphics/Windowskins/choice 31", "Graphics/Windowskins/choice 32", "Graphics/Windowskins/choice 33", "Graphics/Windowskins/choice 35", "Graphics/Windowskins/choice 36", "Graphics/Windowskins/choice 37"]
$TextFrames.insert($TextFrames.length, *additionalTextFrames)
Fight System Overhaul

Description:
Backporting the combat system from Rejuvenation v13.5.

  • New Constants
    module PokeBattle_SceneConstants
        # Position and width of HP/Exp bars
        HPGAUGE_X    = -2
        HPGAUGE_Y    = 50
        HPGAUGESIZE  = 204
        HPGAUGEHEIGHTS = 16
        HPGAUGEHEIGHTD = 12
        EXPGAUGE_X   = -2
        EXPGAUGE_Y   = 68
        EXPGAUGESIZE = 204
    
        # Coordinates of the top left of the player's data boxes
        PLAYERBOX_X   = Graphics.width - 244
        PLAYERBOX_Y   = Graphics.height - 208
        PLAYERBOXD1_X = PLAYERBOX_X - 16
        PLAYERBOXD1_Y = PLAYERBOX_Y - 8
        PLAYERBOXD2_X = PLAYERBOX_X - 4
        PLAYERBOXD2_Y = PLAYERBOX_Y + 48
    
        # Coordinates of the top left of the foe's data boxes
        FOEBOX_X      = -4
        FOEBOX_Y      = 20
        FOEBOXD1_X    = FOEBOX_X + 4
        FOEBOXD1_Y    = FOEBOX_Y - 20
        FOEBOXD2_X    = FOEBOX_X - 8
        FOEBOXD2_Y    = FOEBOX_Y + 36
        FOEBOXD2BOSS1_Y = FOEBOX_Y + 54
    end
  • Adding field_effects_highlights option
    class PokemonOptionScene
        def pbStartScene
            if !$PokemonSystem.volume 
                $PokemonSystem.volume = 100
            end
            @sprites={}
            @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
            @viewport.z=99999
            @sprites["title"]=Window_UnformattedTextPokemon.newWithSize(_INTL("Options"),0,0,Graphics.width,64,@viewport)
            @sprites["textbox"]=Kernel.pbCreateMessageWindow
            @sprites["textbox"].letterbyletter=false
            @sprites["textbox"].text=_INTL("Speech frame {1}.",1+$PokemonSystem.textskin)
            # These are the different options in the game.  To add an option, define a
            # setter and a getter for that option.  To delete an option, comment it out
            # or delete it.  The game's options may be placed in any order.
            @PokemonOptions=[
                EnumOption.new(_INTL("Text Speed"),[_INTL("Normal"),_INTL("Fast"),_INTL("Max")],
                    proc { $PokemonSystem.textspeed },
                    proc {|value|  
                        $PokemonSystem.textspeed=value 
                        MessageConfig.pbSetTextSpeed(pbSettingToTextSpeed(value)) 
                    }
                ),
                NumberOption.new(_INTL("Volume"),_INTL("Type %d"),0,100,
                    proc { $PokemonSystem.volume },
                    proc {|value|  $PokemonSystem.volume=value
                        if $game_map
                            $game_map.autoplay
                        end
                    }    
                ),
                EnumOption.new(_INTL("Battle Scene"),[_INTL("On"),_INTL("Off")],
                    proc { $PokemonSystem.battlescene },
                    proc {|value|  $PokemonSystem.battlescene=value }
                ),
                EnumOption.new(_INTL("Battle Style"),[_INTL("Shift"),_INTL("Set")],
                    proc { $PokemonSystem.battlestyle },
                    proc {|value|  $PokemonSystem.battlestyle=value }
                ),
                NumberOption.new(_INTL("Speech Frame"),_INTL("Type %d"),1,$SpeechFrames.length,
                    proc { $PokemonSystem.textskin },
                    proc {|value|  $PokemonSystem.textskin=value;
                        MessageConfig.pbSetSpeechFrame("Graphics/Windowskins/"+$SpeechFrames[value])
                    }
                ),
                NumberOption.new(_INTL("Menu Frame"),_INTL("Type %d"),1,$TextFrames.length,
                    proc { $PokemonSystem.frame },
                    proc {|value|  
                        $PokemonSystem.frame=value
                        MessageConfig.pbSetSystemFrame($TextFrames[value]) 
                    }
                ),
                EnumOption.new(_INTL("Field UI highlights"),[_INTL("On"),_INTL("Off")],
                    proc { $field_effects_highlights},
                    proc {|value|  $field_effects_highlights=value }
                ),
                EnumOption.new(_INTL("Font Style"),[_INTL("Em"),_INTL("R/S"),_INTL("FRLG"),_INTL("DP")],
                    proc { $PokemonSystem.font },
                    proc {|value|  
                        $PokemonSystem.font=value
                        MessageConfig.pbSetSystemFontName($VersionStyles[value])
                    }
                ),
                EnumOption.new(_INTL("Backup"),[_INTL("On"),_INTL("Off")],
                    proc { $PokemonSystem.backup },
                    proc {|value|  $PokemonSystem.backup=value }
                ),
                NumberOption.new(_INTL("Max Backup Number"),_INTL("Type %d"),1,100,
                    proc { $PokemonSystem.maxBackup },
                    proc {|value|  
                        $PokemonSystem.maxBackup=value #+1
                    }    
                ),       
                # Quote this section out if you don't want to allow players to change the screen
                # size.
                EnumOption.new(_INTL("Screen Size"),[_INTL("S"),_INTL("M"),_INTL("L"),_INTL("Full")],
                    proc { $PokemonSystem.screensize },
                    proc {|value|
                        oldvalue=$PokemonSystem.screensize
                        $PokemonSystem.screensize=value
                        if value!=oldvalue
                            pbSetResizeFactor($PokemonSystem.screensize)
                            ObjectSpace.each_object(TilemapLoader){|o| next if o.disposed?; o.updateClass }
                        end
                    }
                ),   
            # ------------------------------------------------------------------------------   
                EnumOption.new(_INTL("Screen Border"),[_INTL("Off"),_INTL("On")],
                    proc { $PokemonSystem.border },
                    proc {|value|
                        oldvalue=$PokemonSystem.border
                        $PokemonSystem.border=value
                        if value!=oldvalue
                            pbSetResizeFactor($PokemonSystem.screensize)
                            ObjectSpace.each_object(TilemapLoader){|o| next if o.disposed?; o.updateClass }
                        end
                    }
                ),
            #### SARDINES - Autosave - START
                EnumOption.new(_INTL("Autosave"),[_INTL("On"),_INTL("Off")],
                    proc { $PokemonSystem.autosave },          
                    proc {|value|  $PokemonSystem.autosave=value }
                )
            #### SARDINES - Autosave - END
            ]
            @sprites["option"]=Window_PokemonOption.new(@PokemonOptions,0,
            @sprites["title"].height,Graphics.width,Graphics.height-@sprites["title"].height-@sprites["textbox"].height)
            @sprites["option"].viewport=@viewport
            @sprites["option"].visible=true
            # Get the values of each option
            for i in 0...@PokemonOptions.length
                @sprites["option"][i]=(@PokemonOptions[i].get || 0)
            end
            pbDeactivateWindows(@sprites)
            pbFadeInAndShow(@sprites) { pbUpdate }
        end
    end
  • Good/Bad Move & Better Type Visualization
    Data
    $field_effects_highlights = 0
    
    # Status Mods per field id (based on Field_Effect_Manual)
    $fieldEffectStatusMoves = {
        1 => [PBMoves::CHARGE,PBMoves::EERIEIMPULSE,PBMoves::MAGNETRISE,], #Electric Field
        2 => [PBMoves::COIL,PBMoves::GROWTH,PBMoves::GRASSWHISTLE], #Grassy Terrain
        3 => [PBMoves::COSMICPOWER,PBMoves::AROMATICMIST,PBMoves::SWEETSCENT,PBMoves::WISH,PBMoves::AQUARING], #Misty Terrain
        4 => [PBMoves::FLASH,PBMoves::DARKVOID,PBMoves::MOONLIGHT,PBMoves::AURORAVEIL], #Dark Crystal Cavern
        5 => [PBMoves::CALMMIND,PBMoves::NASTYPLOT,PBMoves::TRICKROOM], #Chess Board
        6 => [PBMoves::ENCORE,PBMoves::DRAGONDANCE,PBMoves::QUIVERDANCE,PBMoves::SWORDSDANCE,PBMoves::FEATHERDANCE,PBMoves::SING,PBMoves::RAINDANCE,PBMoves::BELLYDRUM,PBMoves::SPOTLIGHT], #Big Top Arena
        7 => [PBMoves::WILLOWISP,PBMoves::SMOKESCREEN], #Volcanic Field
        8 => [PBMoves::SLEEPPOWDER,PBMoves::AQUARING,PBMoves::STRENGTHSAP], #Swamp Field
        9 => [PBMoves::MEDITATE,PBMoves::COSMICPOWER,PBMoves::WISH,PBMoves::AURORAVEIL], #Rainbow Field
        10 => [PBMoves::ACIDARMOR,PBMoves::SLEEPPOWDER,PBMoves::POISONPOWDER,PBMoves::STUNSPORE,PBMoves::TOXIC,PBMoves::VENOMDRENCH], #Corrosive Field
        11 => [PBMoves::ACIDARMOR,PBMoves::SMOKESCREEN,PBMoves::VENOMDRENCH,PBMoves::TOXIC], #Corrosive Mist Field
        12 => [PBMoves::SANDSTORM,PBMoves::SUNNYDAY,PBMoves::SANDATTACK,PBMoves::SHOREUP], #Desert Field
        13 => [PBMoves::HAIL,PBMoves::AURORAVEIL], #Icy Field
        14 => [PBMoves::ROCKPOLISH,PBMoves::STEALTHROCK], #Rocky Field
        15 => [PBMoves::STICKYWEB,PBMoves::GROWTH,PBMoves::DEFENDORDER,PBMoves::STRENGTHSAP,PBMoves::HEALORDER,PBMoves::NATURESMADNESS,PBMoves::FORESTSCURSE], #Forest Field
        16 => [PBMoves::TAILWIND,PBMoves::SMOKESCREEN,PBMoves::POISONGAS], #Volcanic Top Field
        17 => [PBMoves::METALSOUND,PBMoves::IRONDEFENSE,PBMoves::SHIFTGEAR,PBMoves::AUTOTOMIZE,PBMoves::MAGNETRISE,PBMoves::GEARUP], #Factory Field
        18 => [PBMoves::METALSOUND,PBMoves::FLASH,PBMoves::MAGNETRISE], #Short-circuit Field
        19 => [PBMoves::SWALLOW,PBMoves::STEALTHROCK,PBMoves::SPIKES,PBMoves::TOXICSPIKES,PBMoves::STICKYWEB], #Wasteland
        20 => [PBMoves::CALMMIND,PBMoves::SANDATTACK,PBMoves::KINESIS,PBMoves::MEDITATE,PBMoves::SANDSTORM,PBMoves::PSYCHUP,PBMoves::FOCUSENERGY,PBMoves::SHOREUP], #Ashen Beach
        21 => [PBMoves::SPLASH,PBMoves::AQUARING], #Water Surface
        22 => [PBMoves::AQUARING], #Underwater
        23 => [PBMoves::STEALTHROCK], #Cave
        24 => [PBMoves::METRONOME], #Glitch Field
        25 => [PBMoves::ROCKPOLISH,PBMoves::STEALTHROCK,PBMoves::AURORAVEIL], #Crystal Cavern
        26 => [PBMoves::ACIDARMOR,PBMoves::VENOMDRENCH], #Murkwater Surface
        27 => [PBMoves::TAILWIND,PBMoves::SUNNYDAY], #Mountain
        28 => [PBMoves::TAILWIND,PBMoves::SUNNYDAY,PBMoves::HAIL], #Snowy Mountain
        29 => [PBMoves::WISH,PBMoves::MIRACLEEYE,PBMoves::COSMICPOWER,PBMoves::NATURESMADNESS], #Holy Field
        30 => [PBMoves::FLASH,PBMoves::DOUBLETEAM,PBMoves::LIGHTSCREEN,PBMoves::AURORAVEIL,PBMoves::REFLECT,PBMoves::MIRRORMOVE,PBMoves::MIRRORCOAT], #Mirror Arena
        31 => [PBMoves::KINGSSHIELD,PBMoves::CRAFTYSHIELD,PBMoves::FLOWERSHIELD,PBMoves::ACIDARMOR,PBMoves::SWORDSDANCE,PBMoves::NOBLEROAR,PBMoves::WISH,PBMoves::HEALINGWISH,PBMoves::MIRACLEEYE,PBMoves::FORESTSCURSE,PBMoves::FLORALHEALING], #Fairy Tale Field
        32 => [PBMoves::NOBLEROAR,PBMoves::DRAGONDANCE], #Dragon's Den
        "33_0" => [PBMoves::GROWTH,PBMoves::ROTOTILLER,PBMoves::RAINDANCE,PBMoves::WATERSPORT,PBMoves::SUNNYDAY,PBMoves::FLOWERSHIELD], #Flower Garden Field (Stage 1)
        "33_1" => [PBMoves::GROWTH,PBMoves::ROTOTILLER,PBMoves::RAINDANCE,PBMoves::WATERSPORT,PBMoves::SUNNYDAY,PBMoves::FLOWERSHIELD,PBMoves::INGRAIN], #Flower Garden Field (Stage 2)
        "33_2" => [PBMoves::GROWTH,PBMoves::ROTOTILLER,PBMoves::RAINDANCE,PBMoves::WATERSPORT,PBMoves::SUNNYDAY,PBMoves::FLOWERSHIELD,PBMoves::SWEETSCENT], #Flower Garden Field (Stage 3)
        "33_3" => [PBMoves::GROWTH,PBMoves::ROTOTILLER,PBMoves::RAINDANCE,PBMoves::WATERSPORT,PBMoves::SUNNYDAY,PBMoves::FLOWERSHIELD,PBMoves::INGRAIN,PBMoves::SWEETSCENT], #Flower Garden Field (Stage 4)
        "33_4" => [PBMoves::GROWTH,PBMoves::ROTOTILLER,PBMoves::RAINDANCE,PBMoves::WATERSPORT,PBMoves::SUNNYDAY,PBMoves::FLOWERSHIELD,PBMoves::SWEETSCENT], #Flower Garden Field (Stage 5)
        34 => [PBMoves::AURORAVEIL,PBMoves::COSMICPOWER,PBMoves::FLASH,PBMoves::WISH,PBMoves::HEALINGWISH,PBMoves::LUNARDANCE,PBMoves::MOONLIGHT], #Starlight Arena
        35 => [PBMoves::DARKVOID,PBMoves::HEARTSWAP,PBMoves::TRICKROOM,PBMoves::MAGICROOM,PBMoves::WONDERROOM,PBMoves::COSMICPOWER,PBMoves::FLASH,PBMoves::MOONLIGHT,PBMoves::NATURESMADNESS], #New World
        37 => [PBMoves::NASTYPLOT,PBMoves::CALMMIND,PBMoves::COSMICPOWER,PBMoves::MEDITATE,PBMoves::KINESIS,PBMoves::PSYCHUP,PBMoves::MINDREADER,PBMoves::MIRACLEEYE,PBMoves::TELEKINESIS,PBMoves::GRAVITY,PBMoves::TRICKROOM,PBMoves::MAGICROOM,PBMoves::WONDERROOM], #Psychic Terrain
        38 => [PBMoves::QUASH,PBMoves::EMBARGO,PBMoves::HEALBLOCK,PBMoves::DARKVOID], #Dimensional Field
        39 => [PBMoves::PARTINGSHOT], #Frozen Dimensional Field
        40 => [PBMoves::NIGHTMARE,PBMoves::SPITE,PBMoves::CURSE,PBMoves::DESTINYBOND,PBMoves::SCARYFACE,PBMoves::WILLOWISP,PBMoves::HYPNOSIS], #Haunted Field
        42 => [PBMoves::STRENGTHSAP,PBMoves::FORESTSCURSE,PBMoves::POISONPOWDER,PBMoves::SLEEPPOWDER,PBMoves::GRASSWHISTLE,PBMoves::STUNSPORE], #Bewitched Woods
        43 => [PBMoves::MIRRORMOVE,PBMoves::TAILWIND] #Sky Field
    }
    
    # Type Boosts by Type (based on Field_Effect_Manual)
    $fieldTypeBoosts = {
        PBTypes::BUG => {
            15 => { #Forest Field
                :boost => 1.5,
                :condition => "self.pbIsSpecial?(type)"
            },
            "33_1" => { :boost => 1.5 }, #Flower Garden Field (Stage 2)
            "33_3" => { :boost => 2.0 } #Flower Garden Field (Stage 4)
        },
        PBTypes::DARK => {
            29 => { #Holy Field
                :boost => 0.5,
                :condition => "self.pbIsSpecial?(type)"
            },
            34 => { :boost => 1.5 }, #Starlight Arena
            35 => { :boost => 1.5 }, #New World
            38 => { :boost => 1.5 }, #Dimensional Field
            39 => { :boost => 1.2 }, #Frozen Dimensional Field
            40 => { :boost => 0.7 }, #Haunted Field
            42 => { :boost => 1.2 } #Bewitched Woods
        },
        PBTypes::DRAGON => {
            3 => { #Misty Terrain
                :boost => 0.5,
                :condition => "!opponent.isAirborne?"
            },
            25 => { :boost => 1.5 }, #Crystal Cavern
            29 => { :boost => 1.2 }, #Holy Field
            31 => { :boost => 2.0 }, #Fairy Tale Field
            32 => { :boost => 2.0 } #Dragon's Den
        },
        PBTypes::ELECTRIC => {
            1 => { #Electric Field
                :boost => 1.5,
                :condition => "!attacker.isAirborne?"
            },
            12 => { #Desert Field
                :boost => 0.5,
                :condition => "!opponent.isAirborne?"
            },
            17 => { :boost => 1.2 }, #Factory Field
            21 => { :boost => 1.5 }, #Water Surface
            22 => { :boost => 2.0 }, #Underwater
            26 => { :boost => 1.3 } #Murkwater Surface
        },
        PBTypes::FAIRY => {
            29 => { :boost => 1.5 }, #Holy Field
            31 => { :boost => 1.5 }, #Fairy Tale Field
            34 => { :boost => 1.3 }, #Starlight Arena
            38 => { :boost => 0.5 }, #Dimensional Field
            40 => { :boost => 0.7 }, #Haunted Field
            41 => { :boost => 0.5 }, #Corrupted Cave
            42 => { :boost => 1.3 } #Bewitched Woods
        },
        PBTypes::FIRE => {
            2 => { #Grassy Terrain
                :boost => 1.5,
                :condition => "!opponent.isAirborne?"
            },
            7 => { #Volcanic Field
                :boost => 1.5,
                :condition => "!attacker.isAirborne?"
            },
            11 => { :boost => 0.5 }, #Corrosive Mist Field
            13 => { :boost => 0.5 }, #Icy Field
            16 => { :boost => 1.1 }, #Volcanic Top Field
            21 => { #Water Surface
                :boost => 0.5,
                :condition => "!opponent.isAirborne?"
            },
            22 => { :boost => 0 }, #Underwater
            28 => { :boost => 0.5 }, #Snowy Mountain
            32 => { :boost => 1.5 }, #Dragon's Den
            "33_2" => { :boost => 1.5 }, #Flower Garden Field (Stage 3)
            "33_3" => { :boost => 1.5 }, #Flower Garden Field (Stage 4)
            "33_4" => { :boost => 1.5 }, #Flower Garden Field (Stage 5)
            39 => { :boost => 0.5 } #Frozen Dimensional Field
        },
        PBTypes::FLYING => {
            23 => { #Cave
                :boost => 0.5,
                :condition => "!self.contactMove?"
            },
            27 => { :boost => 1.5 }, #Mountain
            28 => { :boost => 1.5 }, #Snowy Mountain
            41 => { #Corrupted Cave
                :boost => 0.5,
                :condition => "!self.contactMove?"
            },
            43 => { :boost => 1.3 } #Sky Field
        },
        PBTypes::GHOST => {
            29 => { :boost => 0.5 }, #Holy Field
            38 => { :boost => 1.2 }, #Dimensional Field
            40 => { :boost => 1.3 } #Haunted Field
        },
        PBTypes::GRASS => {
            2 => { #Grassy Terrain
                :boost => 1.5,
                :condition => "!attacker.isAirborne?"
            },
            7 => { #Volcanic Field
                :boost => 0.5,
                :condition => "!opponent.isAirborne?"
            },
            15 => { :boost => 1.5 }, #Forest Field
            "33_1" => { :boost => 1.2 }, #Flower Garden Field (Stage 2)
            "33_2" => { :boost => 1.5 }, #Flower Garden Field (Stage 3)
            "33_3" => { :boost => 2.0 }, #Flower Garden Field (Stage 4)
            "33_4" => { :boost => 3.0 }, #Flower Garden Field (Stage 5)
            41 => { :boost => 1.2 }, #Corrupted Cave
            42 => { :boost => 1.3 } #Bewitched Woods
        },
        PBTypes::GROUND => {
            21 => { :boost => 0 }, #Water Surface
            26 => { :boost => 0 } #Murkwater Surface
        },
        PBTypes::ICE => {
            7 => { :boost => 0.5 }, #Volcanic Field
            13 => { :boost => 1.5 }, #Icy Field
            16 => { :boost => 0.5 }, #Volcanic Top Field
            28 => { :boost => 1.5 }, #Snowy Mountain
            32 => { :boost => 0.5 }, #Dragon's Den
            39 => { :boost => 1.5 } #Frozen Dimensional Field
        },
        PBTypes::NORMAL => {
            9 => { :boost => 1.5 }, #Rainbow Field
            29 => { #Holy Field
                :boost => 1.5,
                :condition => "self.pbIsSpecial?(type)"
            },
        },  
        PBTypes::POISON => {
            8 => { #Swamp Field
                :boost => 1.5,
                :condition => "!opponent.isAirborne?"
            },
            26 => { :boost => 1.5 }, #Murkwater Surface
            41 => { :boost => 1.5 } #Corrupted Cave
        },
        PBTypes::PSYCHIC => {
            24 => { :boost => 1.2 }, #Glitch Field
            29 => { :boost => 1.2 }, #Holy Field
            34 => { :boost => 1.5 }, #Starlight Arena
            37 => { #Psychic Terrain
                :boost => 1.5,
                :condition => "!attacker.isAirborne?"
            }
        },
        PBTypes::ROCK => {
            14 => { :boost => 1.5 }, #Rocky Field
            23 => { :boost => 1.5 }, #Cave
            25 => { :boost => 1.5 }, #Crystal Cavern
            27 => { :boost => 1.5 }, #Mountain
            28 => { :boost => 1.5 }, #Snowy Mountain
            41 => { :boost => 1.2 } #Corrupted Cave
        },
        PBTypes::SHADOW => {
            38 => { :boost => 1.2 } #Dimensional Field
        },   
        PBTypes::STEEL => {
            31 => { :boost => 1.5 } #Fairy Tale Field
        },   
        PBTypes::WATER => {
            12 => { #Desert Field
                :boost => 0.5,
                :condition => "!attacker.isAirborne?"
            },
            16 => { #Volcanic Top Field
                :boost => 0.9,
                :condition => "self.move!=PBMoves::SCALD && self.move!=PBMoves::STEAMERUPTION"
            },
            21 => { :boost => 1.5 }, #Water Surface
            22 => { :boost => 1.5 }, #Underwater
            26 => { :boost => 1.5 }, #Murkwater Surface
            32 => { :boost => 0.5 } #Dragon's Den
        } 
    }
    
    # Move Boosts by Field (based on Field_Effect_Manual & PokeBattle_Move.rb lines 1489-2312)
    $fieldMoveBoosts = {
        1 => { #Electric Field
            2.0 => [PBMoves::MAGNETBOMB],
            1.5 => [PBMoves::EXPLOSION, PBMoves::SELFDESTRUCT, PBMoves::HURRICANE, PBMoves::SURF, PBMoves::SMACKDOWN, PBMoves::MUDDYWATER, PBMoves::THOUSANDARROWS]       
        },
        2 => { #Grassy Terrain
            1.5 => [PBMoves::FAIRYWIND,PBMoves::SILVERWIND],
            0.5 => [PBMoves::MUDDYWATER,PBMoves::SURF,PBMoves::EARTHQUAKE,PBMoves::MAGNITUDE,PBMoves::BULLDOZE]
        },
        3 => { #Misty Terrain
            1.5 => [PBMoves::FAIRYWIND,PBMoves::MYSTICALFIRE,PBMoves::MOONBLAST,PBMoves::MAGICALLEAF,PBMoves::DOOMDUMMY,PBMoves::ICYWIND,PBMoves::AURASPHERE,PBMoves::MISTBALL,PBMoves::STEAMERUPTION,PBMoves::DAZZLINGGLEAM,PBMoves::CLEARSMOG,PBMoves::SMOG,PBMoves::SILVERWIND, PBMoves::MOONGEISTBEAM],
            0.5 => [PBMoves::DARKPULSE,PBMoves::NIGHTDAZE,PBMoves::SHADOWBALL],
            0 => [PBMoves::SELFDESTRUCT,PBMoves::EXPLOSION]
        },
        4 => { #Dark Crystal Cavern
            2.0 => [PBMoves::PRISMATICLASER],
            1.5 => [PBMoves::DARKPULSE,PBMoves::NIGHTDAZE,PBMoves::NIGHTSLASH,PBMoves::SHADOWBALL,PBMoves::SHADOWCLAW,PBMoves::SHADOWFORCE,PBMoves::SHADOWSNEAK,PBMoves::SHADOWPUNCH,PBMoves::SHADOWBONE,PBMoves::AURORABEAM,PBMoves::SIGNALBEAM,PBMoves::FLASHCANNON,PBMoves::LUSTERPURGE,PBMoves::DAZZLINGGLEAM,PBMoves::MIRRORSHOT,PBMoves::DOOMDUMMY,PBMoves::TECHNOBLAST,PBMoves::POWERGEM,PBMoves::MOONGEISTBEAM],
            1.3 => [PBMoves::STOMPINGTANTRUM] #Probably because of mistake (PokeBattle_Move.rb line 3328)
        },
        5 => { #Chess Board
            1.5 => [PBMoves::FAKEOUT,PBMoves::FEINT,PBMoves::FEINTATTACK,PBMoves::STRENGTH,PBMoves::ANCIENTPOWER,PBMoves::PSYCHIC]
        },
        6 => { #Big Top Arena
            2.0 => [PBMoves::PAYDAY],
            1.5 => [PBMoves::VINEWHIP,PBMoves::POWERWHIP,PBMoves::FIRELASH,PBMoves::FIERYDANCE,PBMoves::PETALDANCE,PBMoves::REVELATIONDANCE,PBMoves::FLY,PBMoves::ACROBATICS,PBMoves::FIRSTIMPRESSION]     
        },
        7 => { #Volcanic Field
            2.0 => [PBMoves::SMOG,PBMoves::CLEARSMOG],
            1.5 => [PBMoves::SMACKDOWN,PBMoves::THOUSANDARROWS,PBMoves::ROCKSLIDE]     
        },
        8 => { #Swamp Field
            1.5 => [PBMoves::MUDBOMB,PBMoves::MUDSHOT,PBMoves::MUDSLAP,PBMoves::MUDDYWATER,PBMoves::SURF,PBMoves::SLUDGEWAVE,PBMoves::GUNKSHOT,PBMoves::BRINE,PBMoves::SMACKDOWN,PBMoves::THOUSANDARROWS],
            0 => [PBMoves::SELFDESTRUCT,PBMoves::EXPLOSION]
        },
        9 => { #Rainbow Field
            1.5 => [PBMoves::SILVERWIND,PBMoves::MYSTICALFIRE,PBMoves::DRAGONPULSE,PBMoves::TRIATTACK,PBMoves::SACREDFIRE,PBMoves::FIREPLEDGE,PBMoves::WATERPLEDGE,PBMoves::GRASSPLEDGE,PBMoves::AURORABEAM,PBMoves::JUDGMENT,PBMoves::RELICSONG,PBMoves::HIDDENPOWER,PBMoves::SECRETPOWER,PBMoves::WEATHERBALL,PBMoves::MISTBALL,PBMoves::HEARTSTAMP,PBMoves::MOONBLAST,PBMoves::ZENHEADBUTT,PBMoves::SPARKLINGARIA,PBMoves::FLEURCANNON,PBMoves::PRISMATICLASER],
            0.5 => [PBMoves::DARKPULSE,PBMoves::NIGHTDAZE,PBMoves::SHADOWBALL],
            0 => [PBMoves::NIGHTMARE]
        },
        10 => { #Corrosive Field
            2.0 => [PBMoves::GRASSKNOT,PBMoves::ACID,PBMoves::ACIDSPRAY],
            1.5 => [PBMoves::SMACKDOWN,PBMoves::MUDSLAP,PBMoves::MUDSHOT,PBMoves::MUDDYWATER,PBMoves::MUDBOMB,PBMoves::WHIRLPOOL,PBMoves::THOUSANDARROWS]      
        },
        11 => { #Corrosive Mist Field
            1.5 => [PBMoves::SMOG,PBMoves::CLEARSMOG,PBMoves::ACIDSPRAY,PBMoves::BUBBLE,PBMoves::BUBBLEBEAM,PBMoves::SPARKLINGARIA]
        },
        12 => { #Desert Field
            1.5 => [PBMoves::HEATWAVE,PBMoves::NEEDLEARM,PBMoves::PINMISSILE,PBMoves::DIG,PBMoves::SANDTOMB,PBMoves::THOUSANDWAVES,PBMoves::BURNUP] 
        },
        13 => { #Icy Field
            0.5 => [PBMoves::SCALD,PBMoves::STEAMERUPTION]
        },
        14 => { #Rocky Field
            2.0 => [PBMoves::ROCKSMASH],
            1.5 => [PBMoves::EARTHQUAKE,PBMoves::MAGNITUDE,PBMoves::ROCKCLIMB,PBMoves::STRENGTH,PBMoves::BULLDOZE,PBMoves::ACCELEROCK]  
        },
        15 => { #Forest Field
            2.0 => [PBMoves::CUT,PBMoves::ATTACKORDER],
            1.5 => [PBMoves::SLASH,PBMoves::AIRSLASH,PBMoves::GALESTRIKE,PBMoves::FURYCUTTER,PBMoves::AIRCUTTER,PBMoves::PSYCHOCUT],
            0.5 => [PBMoves::SURF,PBMoves::MUDDYWATER]
        },
        16 => { #Volcanic Top Field
            1.667 => [PBMoves::SCALD,PBMoves::STEAMERUPTION],
            1.3 => [PBMoves::ERUPTION,PBMoves::HEATWAVE,PBMoves::MAGMASTORM,PBMoves::LAVAPLUME,PBMoves::LAVASURF],
            1.2 => [PBMoves::OMINOUSWIND,PBMoves::SILVERWIND,PBMoves::RAZORWIND,PBMoves::ICYWIND,PBMoves::GUST,PBMoves::TWISTER,PBMoves::PRECIPICEBLADES,PBMoves::SMOG,PBMoves::CLEARSMOG],
            0.555 => [PBMoves::SURF,PBMoves::MUDDYWATER,PBMoves::WATERPLEDGE,PBMoves::WATERSPOUT,PBMoves::SPARKLINGARIA],
            0 => [PBMoves::HAIL]
        },
        17 => { #Factory Field
            2.0 => [PBMoves::FLASHCANNON,PBMoves::GYROBALL,PBMoves::GEARGRIND,PBMoves::MAGNETBOMB],
            1.5 => [PBMoves::STEAMROLLER,PBMoves::TECHNOBLAST]       
        },
        18 => { #Short-circuit Field
            1.5 => [PBMoves::DAZZLINGGLEAM,PBMoves::SURF,PBMoves::MUDDYWATER,PBMoves::GYROBALL,PBMoves::MAGNETBOMB,PBMoves::FLASHCANNON,PBMoves::GEARGRIND],
            1.3 => [PBMoves::DARKPULSE,PBMoves::NIGHTDAZE,PBMoves::NIGHTSLASH,PBMoves::SHADOWBALL,PBMoves::SHADOWCLAW,PBMoves::SHADOWFORCE,PBMoves::SHADOWSNEAK,PBMoves::SHADOWPUNCH,PBMoves::SHADOWBONE]
        },
        19 => { #Wasteland
            2.0 => [PBMoves::SPITUP],
            1.5 => [PBMoves::VINEWHIP,PBMoves::POWERWHIP,PBMoves::MUDBOMB,PBMoves::MUDSLAP,PBMoves::MUDSHOT],
            1.2 => [PBMoves::OCTAZOOKA,PBMoves::GUNKSHOT,PBMoves::SLUDGE,PBMoves::SLUDGEWAVE,PBMoves::SLUDGEBOMB],
            0.25 => [PBMoves::MAGNITUDE,PBMoves::EARTHQUAKE,PBMoves::BULLDOZE]
        },
        20 => { #Ashen Beach
            2.0 => [PBMoves::MUDSLAP,PBMoves::MUDSHOT,PBMoves::MUDBOMB,PBMoves::SANDTOMB],
            1.5 => [PBMoves::STRENGTH,PBMoves::HIDDENPOWER,PBMoves::LANDSWRATH,PBMoves::THOUSANDWAVES,PBMoves::SURF,PBMoves::MUDDYWATER],
            1.3 => [PBMoves::ZENHEADBUTT,PBMoves::STOREDPOWER,PBMoves::AURASPHERE,PBMoves::FOCUSBLAST],
            1.2 => [PBMoves::PSYCHIC]
        },
        21 => { #Water Surface
            1.5 => [PBMoves::WHIRLPOOL,PBMoves::DIVE,PBMoves::SURF,PBMoves::MUDDYWATER,PBMoves::SLUDGEWAVE],
            0 => [PBMoves::SPIKES, PBMoves::TOXICSPIKES]
        },
        22 => { #Underwater
            2.0 => [PBMoves::ANCHORSHOT,PBMoves::SLUDGEWAVE],
            1.5 => [PBMoves::WATERPULSE],
            0 => [PBMoves::SUNNYDAY, PBMoves::HAIL, PBMoves::SANDSTORM, PBMoves::RAINDANCE, PBMoves::SHADOWSKY],
        },
        23 => { #Cave
            1.5 => [PBMoves::ROCKTOMB],
            0 => [PBMoves::SKYDROP]
        },
        25 => { #Crystal Cavern
            1.5 => [PBMoves::POWERGEM,PBMoves::DIAMONDSTORM,PBMoves::ANCIENTPOWER,PBMoves::ROCKTOMB,PBMoves::ROCKSMASH,PBMoves::PRISMATICLASER,PBMoves::MULTIATTACK,PBMoves::JUDGMENT,PBMoves::STRENGTH,PBMoves::ROCKCLIMB],
            1.3 => [PBMoves::AURORABEAM,PBMoves::SIGNALBEAM,PBMoves::FLASHCANNON,PBMoves::LUSTERPURGE,PBMoves::DAZZLINGGLEAM,PBMoves::MIRRORSHOT,PBMoves::DOOMDUMMY,PBMoves::TECHNOBLAST,PBMoves::MOONGEISTBEAM]
        },
        26 => { #Murkwater Surface
            1.5 => [PBMoves::MUDBOMB,PBMoves::MUDSHOT,PBMoves::MUDSLAP,PBMoves::THOUSANDWAVES,PBMoves::SMACKDOWN,PBMoves::ACID,PBMoves::ACIDSPRAY,PBMoves::BRINE],
            0 => [PBMoves::SPIKES, PBMoves::TOXICSPIKES]
        },
        27 => { #Mountain
            1.5 => [PBMoves::THUNDER,PBMoves::ERUPTION,PBMoves::AVALANCHE,PBMoves::VITALTHROW,PBMoves::STORMTHROW,PBMoves::CIRCLETHROW,PBMoves::OMINOUSWIND,PBMoves::RAZORWIND,PBMoves::ICYWIND,PBMoves::SILVERWIND,PBMoves::FAIRYWIND,PBMoves::TWISTER]
        },
        28 => { #Snowy Mountain
            2.0 => [PBMoves::ICYWIND],
            1.5 => [PBMoves::POWDERSNOW,PBMoves::AVALANCHE,PBMoves::VITALTHROW,PBMoves::STORMTHROW,PBMoves::CIRCLETHROW,PBMoves::OMINOUSWIND,PBMoves::RAZORWIND,PBMoves::SILVERWIND,PBMoves::FAIRYWIND,PBMoves::TWISTER],
            0.5 => [PBMoves::SCALD,PBMoves::STEAMERUPTION]
        },
        29 => { #Holy Field
            1.5 => [PBMoves::MYSTICALFIRE,PBMoves::MAGICALLEAF,PBMoves::JUDGMENT,PBMoves::SACREDFIRE,PBMoves::ANCIENTPOWER],
            1.3 => [PBMoves::PSYSTRIKE,PBMoves::AEROBLAST,PBMoves::ORIGINPULSE,PBMoves::PRECIPICEBLADES,PBMoves::DRAGONASCENT,PBMoves::DOOMDUMMY,PBMoves::MISTBALL,PBMoves::LUSTERPURGE,PBMoves::PSYCHOBOOST,PBMoves::SPACIALREND,PBMoves::ROAROFTIME,PBMoves::CRUSHGRIP,PBMoves::SECRETSWORD,PBMoves::RELICSONG,PBMoves::HYPERSPACEHOLE,PBMoves::LANDSWRATH,PBMoves::MOONGEISTBEAM,PBMoves::SUNSTEELSTRIKE,PBMoves::PRISMATICLASER,PBMoves::FLEURCANNON,PBMoves::MULTIPULSE]
        },
        30 => { #Mirror Arena
            2.0 => [PBMoves::MIRRORSHOT],
            1.5 => [PBMoves::AURORABEAM,PBMoves::SIGNALBEAM,PBMoves::FLASHCANNON,PBMoves::LUSTERPURGE,PBMoves::DOOMDUMMY,PBMoves::DAZZLINGGLEAM,PBMoves::TECHNOBLAST,PBMoves::PRISMATICLASER]
        },
        31 => { #Fairy Tale Field
            2.0 => [PBMoves::DRAININGKISS],
            1.5 => [PBMoves::NIGHTSLASH,PBMoves::LEAFBLADE,PBMoves::PSYCHOCUT,PBMoves::SMARTSTRIKE,PBMoves::SOLARBLADE,PBMoves::MAGICALLEAF,PBMoves::MYSTICALFIRE,PBMoves::ANCIENTPOWER,PBMoves::RELICSONG,PBMoves::SPARKLINGARIA,PBMoves::MOONGEISTBEAM,PBMoves::FLEURCANNON],
        },
        32 => { #Dragon's Den
            2.0 => [PBMoves::SMACKDOWN,PBMoves::THOUSANDARROWS,PBMoves::PAYDAY,PBMoves::DRAGONASCENT],
            1.5 => [PBMoves::LAVAPLUME,PBMoves::MAGMASTORM,PBMoves::MEGAKICK]
        },
        "33_1" => { #Flower Garden Field (Stage 2)
            1.5 => [PBMoves::CUT]
        },
        "33_2" => { #Flower Garden Field (Stage 3)
            1.5 => [PBMoves::CUT],
            1.2 => [PBMoves::PETALDANCE,PBMoves::PETALBLIZZARD,PBMoves::FLEURCANNON]
        },
        "33_3" => { #Flower Garden Field (Stage 4)
            1.5 => [PBMoves::CUT,PBMoves::FLEURCANNON,PBMoves::PETALDANCE,PBMoves::PETALBLIZZARD]
        },
        "33_4" => { #Flower Garden Field (Stage 5)
            1.5 => [PBMoves::CUT,PBMoves::FLEURCANNON,PBMoves::PETALDANCE,PBMoves::PETALBLIZZARD]
        },
        34 => { #Starlight Arena
            4.0 => [PBMoves::DOOMDUMMY],
            2.0 => [PBMoves::DRACOMETEOR,PBMoves::METEORMASH,PBMoves::COMETPUNCH,PBMoves::SPACIALREND,PBMoves::SWIFT,PBMoves::HYPERSPACEHOLE,PBMoves::HYPERSPACEFURY,PBMoves::MOONGEISTBEAM,PBMoves::SUNSTEELSTRIKE],
            1.5 => [PBMoves::AURORABEAM,PBMoves::SIGNALBEAM,PBMoves::FLASHCANNON,PBMoves::LUSTERPURGE,PBMoves::DAZZLINGGLEAM,PBMoves::MIRRORSHOT,PBMoves::MOONBLAST,PBMoves::TECHNOBLAST,PBMoves::SOLARBEAM],
        },
        35 => { #New World
            4.0 => [PBMoves::DOOMDUMMY],
            2.0 => [PBMoves::VACUUMWAVE,PBMoves::DRACOMETEOR,PBMoves::METEORMASH,PBMoves::MOONBLAST,PBMoves::COMETPUNCH,PBMoves::SPACIALREND,PBMoves::SWIFT,PBMoves::FUTUREDUMMY,PBMoves::ANCIENTPOWER,PBMoves::HYPERSPACEHOLE,PBMoves::HYPERSPACEFURY],
            1.5 => [PBMoves::AURORABEAM,PBMoves::SIGNALBEAM,PBMoves::FLASHCANNON,PBMoves::DAZZLINGGLEAM,PBMoves::MIRRORSHOT,PBMoves::EARTHPOWER,PBMoves::POWERGEM,PBMoves::ERUPTION,PBMoves::PSYSTRIKE,PBMoves::AEROBLAST,PBMoves::SACREDFIRE,PBMoves::MISTBALL,PBMoves::LUSTERPURGE,PBMoves::ORIGINPULSE,PBMoves::PRECIPICEBLADES,PBMoves::DRAGONASCENT,PBMoves::PSYCHOBOOST,PBMoves::ROAROFTIME,PBMoves::MAGMASTORM,PBMoves::CRUSHGRIP,PBMoves::JUDGMENT,PBMoves::SEEDFLARE,PBMoves::SHADOWFORCE,PBMoves::SEARINGSHOT,PBMoves::VCREATE,PBMoves::SECRETSWORD,PBMoves::SACREDSWORD,PBMoves::RELICSONG,PBMoves::FUSIONBOLT,PBMoves::FUSIONFLARE,PBMoves::ICEBURN,PBMoves::FREEZESHOCK,PBMoves::BOLTSTRIKE,PBMoves::BLUEFLARE,PBMoves::TECHNOBLAST,PBMoves::OBLIVIONWING,PBMoves::LANDSWRATH,PBMoves::THOUSANDARROWS,PBMoves::THOUSANDWAVES,PBMoves::DIAMONDSTORM,PBMoves::STEAMERUPTION,PBMoves::COREENFORCER,PBMoves::FLEURCANNON,PBMoves::PRISMATICLASER,PBMoves::SUNSTEELSTRIKE,PBMoves::SPECTRALTHIEF,PBMoves::MOONGEISTBEAM,PBMoves::MULTIATTACK]
        },
        37 => { #Psychic Terrain
            1.5 => [PBMoves::HEX,PBMoves::MAGICALLEAF,PBMoves::MYSTICALFIRE,PBMoves::MOONBLAST,PBMoves::AURASPHERE]
        },
        38 => { #Dimensional Field
            1.5 => [PBMoves::DIMTHRASH,PBMoves::DIMPULSE,PBMoves::DIMFLARE,PBMoves::DIMSNARE],
            1.2 => [PBMoves::DARKPULSE,PBMoves::MOONBLAST],
            0 => [PBMoves::LUCKYCHANT]
        },
        39 => { #Frozen Dimensional Field
            1.2 => [PBMoves::SURF,PBMoves::MUDDYWATER,PBMoves::WATERPULSE,PBMoves::HYDROPUMP,PBMoves::NIGHTSLASH,PBMoves::DARKPULSE]
        },
        40 => { #Haunted Field
            1.3 => [PBMoves::FLAMEBURST,PBMoves::INFERNO,PBMoves::FIRESPIN] # Probably missing ,PBMoves::FLAMECHARGE (because FlameBurst is duplicate)
        },
        41 => { #Corrupted Cave
            1.2 => [PBMoves::SEEDFLARE]
        },
        42 => { #Bewitched Woods
            1.4 => [PBMoves::ICEBEAM,PBMoves::HYPERBEAM,PBMoves::SIGNALBEAM,PBMoves::AURORABEAM,PBMoves::BUBBLEBEAM,PBMoves::CHARGEBEAM,PBMoves::PSYBEAM,PBMoves::FLASHCANNON,PBMoves::MAGICALLEAF],
            1.2 => [PBMoves::DARKPULSE,PBMoves::NIGHTDAZE,PBMoves::MOONBLAST]
        },
        43 => { #Sky Field
            1.5 => [PBMoves::ICYWIND,PBMoves::OMINOUSWIND,PBMoves::SILVERWIND,PBMoves::RAZORWIND,PBMoves::FAIRYWIND,PBMoves::AEROBLAST,PBMoves::SKYUPPERCUT,PBMoves::FLYINGPRESS,PBMoves::THUNDERSHOCK,PBMoves::THUNDERBOLT,PBMoves::THUNDER,PBMoves::STEELWING,PBMoves::TWISTER],
            0 => [PBMoves::EARTHQUAKE,PBMoves::MAGNITUDE,PBMoves::BULLDOZE,PBMoves::ROTOTILLER,PBMoves::DIG,PBMoves::SPIKES,PBMoves::TOXICSPIKES,PBMoves::STICKYWEB]
        }
    }
    
    # Overlay Type Mods by Field (based on Field_Effect_Manual & fieldtxt.rb from V13.5)
    $fieldOverlayTypeMods = {
        1 => { PBTypes::ELECTRIC => [PBMoves::EXPLOSION, PBMoves::SELFDESTRUCT, PBMoves::SMACKDOWN, PBMoves::SURF, PBMoves::MUDDYWATER, PBMoves::HURRICANE, PBMoves::THOUSANDARROWS] }  #Electric Field
    }
    def getFieldEffectPos
        fieldeffectpos = $fefieldeffect
        if fieldeffectpos == 33
            fieldeffectpos = fieldeffectpos.to_s + "_" + $fecounter.to_s
        end
    
        return fieldeffectpos
    end
    
    class FightMenuButtons
        def initialize(index=0,moves=nil,viewport=nil)
            super(Graphics.width,96+UPPERGAP,viewport)
            self.x=0
            self.y=Graphics.height-96-UPPERGAP
            pbSetNarrowFont(self.bitmap)
            @buttonbitmap=AnimatedBitmap.new("Graphics/Pictures/Battle/battleFightButtons")
            @megaevobitmap=AnimatedBitmap.new("Graphics/Pictures/Battle/battleMegaEvo")
            @zmovebitmap=AnimatedBitmap.new("Graphics/Pictures/Battle/battleZMove")
            @zmovebitmap=AnimatedBitmap.new("Graphics/Pictures/Battle/battleZMove")
            @goodmovebitmap=AnimatedBitmap.new("Graphics/Pictures/Battle/fieldUp")
            @badmovebitmap=AnimatedBitmap.new("Graphics/Pictures/Battle/fieldDown")   
            refresh(index,moves,0,0)
        end
    
        def dispose
            @buttonbitmap.dispose
            @megaevobitmap.dispose
            @goodmovebitmap.dispose
            @badmovebitmap.dispose
            super
        end
    
        def refresh(index,moves,megaButton,zButton)
            return if !moves || !moves[0]
            battler = moves[0].battle.battlers.find { |attacker| attacker.moves.include?(moves[0]) }
            return if !battler
            self.bitmap.clear
            textpos=[]
            for i in 0...4
                next if i==index
                next if moves[i].id==0
                x=((i%2)==0) ? 5 : 194
                y=((i/2)==0) ? 6 : 48
                y+=UPPERGAP
                self.bitmap.blt(x,y,@buttonbitmap.bitmap,Rect.new(0,moves[i].type*46,190,46))
                textpos.push([_INTL("{1}",moves[i].name),x+96,y+8,2,PokeBattle_SceneConstants::MENUBASECOLOR,PokeBattle_SceneConstants::MENUSHADOWCOLOR])
            end
            ppcolors=[
                PokeBattle_SceneConstants::PPTEXTBASECOLOR,PokeBattle_SceneConstants::PPTEXTSHADOWCOLOR,
                PokeBattle_SceneConstants::PPTEXTBASECOLOR,PokeBattle_SceneConstants::PPTEXTSHADOWCOLOR,
                PokeBattle_SceneConstants::PPTEXTBASECOLORYELLOW,PokeBattle_SceneConstants::PPTEXTSHADOWCOLORYELLOW,
                PokeBattle_SceneConstants::PPTEXTBASECOLORORANGE,PokeBattle_SceneConstants::PPTEXTSHADOWCOLORORANGE,
                PokeBattle_SceneConstants::PPTEXTBASECOLORRED,PokeBattle_SceneConstants::PPTEXTSHADOWCOLORRED
            ]
            for i in 0...4
                next if i!=index
                next if moves[i].id==0
                x=((i%2)==0) ? 5 : 194
                y=((i/2)==0) ? 6 : 48
                y+=UPPERGAP
                imagepos=[]
                movetype = PBTypes.getName(moves[i].pbType(moves[i].type,battler,battler.pbOppositeOpposing))
                secondtype = moves[i].getSecondaryType(battler)
                if secondtype.nil?
                    imagepos.push([sprintf("Graphics/Icons/type%s",movetype),416,20+UPPERGAP,0,0,64,28])
                elsif secondtype.length == 1
                    imagepos.push([sprintf("Graphics/Icons/type%s",movetype),402,20+UPPERGAP,0,0,64,28])
                    imagepos.push([sprintf("Graphics/Icons/minitype%s",PBTypes.getName(secondtype[0])),466,20+UPPERGAP,0,0,28,28])
                else
                    imagepos.push([sprintf("Graphics/Icons/minitype%s",movetype),404,20+UPPERGAP,0,0,64,28])
                    imagepos.push([sprintf("Graphics/Icons/minitype%s",PBTypes.getName(secondtype[0])),432,20+UPPERGAP,0,0,28,28])
                    imagepos.push([sprintf("Graphics/Icons/minitype%s",PBTypes.getName(secondtype[1])),460,20+UPPERGAP,0,0,28,28])
                end
                self.bitmap.blt(x,y,@buttonbitmap.bitmap,Rect.new(190,moves[i].type*46,190,46))
                textpos.push([_INTL("{1}",moves[i].name),x+96,y+8,2,PokeBattle_SceneConstants::MENUBASECOLOR,PokeBattle_SceneConstants::MENUSHADOWCOLOR])
                if moves[i].totalpp>0
                    ppfraction=(4.0*moves[i].pp/moves[i].totalpp).ceil
                    textpos.push([_INTL("PP: {1}/{2}",moves[i].pp,moves[i].totalpp),448,50+UPPERGAP,2,ppcolors[(4-ppfraction)*2],ppcolors[(4-ppfraction)*2+1]])
                end
            end
            pbDrawImagePositions(self.bitmap,imagepos)
            for i in 0...4
                next if !moves[i]
                x=((i%2)==0) ? 4 : 192
                y=((i/2)==0) ? 6 : 48
                y+=UPPERGAP
                y-=2
                case pbFieldNotesBattle(moves[i])
                    when 1 then self.bitmap.blt(x+2,y+2,@goodmovebitmap.bitmap, Rect.new(0,0,@goodmovebitmap.bitmap.width,@goodmovebitmap.bitmap.height))
                    when 2 then self.bitmap.blt(x+2,y+2,@badmovebitmap.bitmap, Rect.new(0,0,@badmovebitmap.bitmap.width,@badmovebitmap.bitmap.height))
                end
            end
            pbDrawTextPositions(self.bitmap,textpos)
            if megaButton>0
                self.bitmap.blt(146,0,@megaevobitmap.bitmap,Rect.new(0,(megaButton-1)*46,96,46))
            end
            if zButton>0
                self.bitmap.blt(146,0,@zmovebitmap.bitmap,Rect.new(0,(zButton-1)*46,96,46))
            end    
        end
    
        def pbFieldNotesBattle(move)
            return 0 if $field_effects_highlights==1
            return 0 if !isFieldEffect? 
            return 1 if $fieldEffectStatusMoves[getFieldEffectPos()] && $fieldEffectStatusMoves[getFieldEffectPos()].include?(move.id)
            battle = move.battle
            typeBoost = 1; moveBoost=1
            attacker = battle.battlers.find { |battler| battler.moves.include?(move) }
            opponent = attacker.pbOppositeOpposing
            movetype = move.pbType(move.type,attacker,opponent)
            if move.basedamage > 0 && !((0x6A..0x73).include?(move.function) || [0xD4,0xE1].include?(move.function))
                typeBoost = move.typeFieldBoost(movetype,attacker,opponent)
                moveBoost = move.moveFieldBoost
                moveBoost = 1.5 if move.isSoundBased? && move.basedamage > 0 && [23,6].include?($fefieldeffect) # Cave Field, Big Top Arena
            end
            moveBoost = 1.5 if move.id == PBMoves::SONICBOOM && $fefieldeffect == 9 # Rainbow Field
            
            # Failing moves
            case $fefieldeffect
                when 22, 35 # Underwater, New World
                    moveBoost = 0 if [PBMoves::ELECTRICTERRAIN,PBMoves::GRASSYTERRAIN,PBMoves::MISTYTERRAIN,PBMoves::PSYCHICTERRAIN,PBMoves::MIST].include?(move.id) # Might not be entirely accurate
                    moveBoost = 0 if [PBMoves::RAINDANCE,PBMoves::SUNNYDAY,PBMoves::HAIL,PBMoves::SANDSTORM].include?(move.id) # Might not be entirely accurate
                when 1 # Electric Terrain
                    moveBoost = 0 if [PBMoves:FOCUSPUNCH].include?(move.id)
                when 23 # Cave
                    moveBoost = 0 if [PBMoves:SKYDROP].include?(move.id)
            end
            totalboost = typeBoost*moveBoost
            if totalboost > 1
                return 1
            elsif totalboost < 1
                return 2
            end
    
            return 0
        end
    
        def isFieldEffect?
            return false if $fefieldeffect == 0 || $fefieldeffect == 38 || $fefieldeffect == 39
            return true
        end
    end
    
    class PokeBattle_Move
        def typeFieldBoost(type,attacker=nil,opponent=nil) #Returns Multiplier Value of Field Boost
            typeboosts = $fieldTypeBoosts[type]
            return 1 if !typeboosts
            fieldtype = typeboosts[getFieldEffectPos()]
            return 1 if !fieldtype || !fieldtype[:boost]
            return 1 if fieldtype[:boost] && $fefieldeffect == 34 && !(@battle.pbWeather == 0 || @battle.pbWeather == PBWeather::STRONGWINDS) #Starlight Arena
            
            if fieldtype[:condition] && attacker && opponent
                return 1 if !eval(fieldtype[:condition])
            end
    
            return fieldtype[:boost]
        end
    
        def moveFieldBoost
            fieldmove = $fieldMoveBoosts[getFieldEffectPos()]
            return 1 if !fieldmove
            mult = -1
            fieldmove.each do |boost, moves|
                if moves.include?(@id)
                    mult = boost
                    break
                end
            end
            return 1 if mult == -1
            return 1 if mult > -1 && $fefieldeffect == 34 && !(@battle.pbWeather == 0 || @battle.pbWeather == PBWeather::STRONGWINDS) #Starlight Arena
    
            return mult
        end
    
        # Ovelay field effects do not seem to be a concept in this version?
        def overlayTypeChange(attacker,opponent,typemod,return_type=false)
            return nil
    
            for field in $fieldOverlayTypeMods
                next if !field.is_a?(Integer)
                next if $fieldOverlayTypeMods.empty?
                #next if @battle.state.effects[field] == 0
    
                foundtype = nil
                $fieldOverlayTypeMods[field].each do |type, moves|
                    if moves.include?(@id)
                        foundtype = type
                        break
                    end
                end
                moddedtype = foundtype if foundtype
            end
    
            if return_type
                return moddedtype ? moddedtype : nil
            else
                return typemod if !moddedtype
                newtypemod = pbTypeModifier(moddedtype,attacker,opponent)
                typemod = ((typemod*newtypemod) * 0.25).ceil
                return typemod
            end
        end
    
        def getSecondaryType(attacker)
            secondtype = []
            secondtype.push(PBTypes::FLYING) if [PBMoves::FLYINGPRESS].include?(@id)
            fieldtype = FieldTypeChange(attacker,attacker.pbOppositeOpposing,1,true)
            secondtype.push(fieldtype) if fieldtype
            overlaytype = overlayTypeChange(attacker,nil,1,true)
            secondtype.push(overlaytype) if overlaytype
            secondtype = [secondtype[0],secondtype[1]] if secondtype.length>2
            return secondtype.empty? ? nil : secondtype
        end
    end
    Scrapped (mostly) Converted fieldTypeChange Function
    Data
    # Type Mods per field id per type (based on Field_Effect_Manual)
    # ToDo: Fill
    $fieldTypeMods = {
        1 => {PBTypes::ELECTRIC => [PBMoves::EXPLOSION]}
    }
    
    # Type Mods per field id per type (based on Field_Effect_Manual)
    # ToDo: Fill
    $fieldTypeAddOns = {
          10 => {PBTypes::ELECTRIC => [PBTypes::GRASS]}
    }
    class PBTypes
        def PBTypes.oneTypeEff(attackType,opponentType)
            return 2 if opponentType.nil?
            return 4 if PBTypes.isSuperEffective?(attackType,opponentType)
            return 1 if PBTypes.isNotVeryEffective?(attackType,opponentType)
            return 0 if PBTypes.isIneffective?(attackType,opponentType)
            return 2
        end
    end
    
    class PokeBattle_Move
        def pbTypeShort(attacker)
            pbType(@type,attacker,attacker.pbOppositeOpposing)
        end
    
        def getRandomType(except=[])
            except = [except] if except && !except.is_a?(Array)
            types=[]
            for j in 0...PBTypes.getCount
              types.push(j) if j!= PBTypes::QMARKS && j!= PBTypes::SHADOW && !except.include?(j)
            end
            rnd=@battle.pbRandom(types.length)
            type = types[rnd]
            return type
        end
    
        def getRoll(update_roll: true, maximize_roll: false)
            case $fefieldeffect
                when 25 then choices = [PBTypes::FIRE, PBTypes::WATER, PBTypes::GRASS, PBTypes::PSYCHIC] #Crystal Cavern
                when 18 then choices = [0.8, 1.5, 0.5, 1.2, 2.0] #Short-circuit
            end
            result=choices[@roll] # ToDo: Find a solution for @roll
            @roll = (@roll + 1) % choices.length if update_roll
            result=choices.max if $fefieldeffect == 18 && maximize_roll #Short-circuit
            return result
        end
    
        def fieldTypeChange(attacker,opponent,typemod,return_type=false)
            case $fefieldeffect
                when 9 # Rainbow Field
                    if (pbTypeShort(attacker) == PBTypes::NORMAL) && pbIsSpecial?(pbTypeShort(attacker)) 
                        moddedtype = @battle.getRandomType(PBTypes::NORMAL)
                    end
                when 11 # Corrosive Mist Field
                    if (pbTypeShort(attacker) == PBTypes::FLYING) && !pbIsPhysical?(pbTypeShort(attacker))
                        moddedtype = PBTypes::POISON
                    end
                when 18 # Shortcircuit Field
                    if (pbTypeShort(attacker) == PBTypes::STEEL) && attacker.ability == PBAbilities::STEELWORKER
                        moddedtype = PBTypes::ELECTRIC
                    end
                when 25 # Crystal Cavern
                    if (pbTypeShort(attacker) == PBTypes::ROCK) || (@id == PBMoves::JUDGMENT || @id == PBMoves::ROCKCLIMB || 
                        @id == PBMoves::STRENGTH || @id == PBMoves::MULTIATTACK || @id == PBMoves::PRISMATICLASER)
                #moddedtype = getRoll(update_roll: caller_locations.any? {|string| string.to_s.include?("pbCalcDamage")} && !return_type) # ToDo
                    end
                when 36 # Inverse Field
                    if !return_type
                        if typemod == 0
                            typevar1 = PBTypes.oneTypeEff(@type,opponent.type1)
                            typevar2 = PBTypes.oneTypeEff(@type,opponent.type2)
                            typevar1 = 1 if typevar1==0
                            typevar2 = 1 if typevar2==0
                            typemod = typevar1 * typevar2
                        end
                        typemod = 16 / typemod
                        #inverse field can (and should) just skip the rest
                        return typemod if !return_type
                    end
            end
    
            if !moddedtype
                typefieldmoves = $fieldTypeMods[$fefieldeffect]
                if typefieldmoves
                    typefieldmoves.each do |key, value|
                        if (value.include?(@id)) && !moddedtype
                            moddedtype = key
                        end
                    end
                end
            end
            if !moddedtype #if moddedtype is STILL nil
                currenttype = pbTypeShort(attacker)
                typefieldtype = $fieldTypeAddOns[$fefieldeffect]
                if typefieldtype
                    typefieldtype.each do |key, value|
                        if (value.include?(currenttype)) && !moddedtype
                            moddedtype = key
                        end
                    end
                end
            end
            if return_type
                return moddedtype ? moddedtype : nil
            else
                return typemod if !moddedtype
                newtypemod = pbTypeModifier(moddedtype,attacker,opponent)
                typemod = ((typemod*newtypemod) * 0.25).ceil
                return typemod
            end
        end
    end
  • Realignment
    class PokemonDataBox
        alias orig_PokemonDataBox_initialize initialize
    
        def initialize(battler,doublebattle,viewport=nil)
            orig_PokemonDataBox_initialize(battler,doublebattle,viewport)
            @spritebaseY=0
        end
    
        def refresh
            self.bitmap.clear
            return if !@battler.pokemon
            bIsFoe = ((@battler.index == 1) || (@battler.index == 3))
            filename = "Graphics/Pictures/Battle/battle" 
            if @doublebattle  
                case @battler.index % 2 
                    when 0  
                        filename += "PlayerBoxD"  
                    when 1  
                        filename += "FoeBoxD"  
                end       
            else  
                case @battler.index 
                    when 0  
                        filename += "PlayerBoxS"  
                    when 1  
                        filename += "FoeBoxS" 
                end 
            end
            filename += battlerStatus(@battler)
            @databox=AnimatedBitmap.new(filename)
            self.bitmap.blt(0,0,@databox.bitmap,Rect.new(0,0,@databox.width,@databox.height))
    
            if @doublebattle  
                @hpbar = AnimatedBitmap.new("Graphics/Pictures/Battle/hpbardoubles")
                hpbarconstant=PokeBattle_SceneConstants::HPGAUGEHEIGHTD
            else
                @hpbar = AnimatedBitmap.new("Graphics/Pictures/Battle/hpbar")
                hpbarconstant=PokeBattle_SceneConstants::HPGAUGEHEIGHTS
            end
            base=PokeBattle_SceneConstants::BOXTEXTBASECOLOR
            shadow=PokeBattle_SceneConstants::BOXTEXTSHADOWCOLOR
            headerY = @spritebaseY+18
            sbX = @spritebaseX 
            if bIsFoe
                headerY += 4
                sbX -= 12
            end
            if @doublebattle
                headerY -= 12
                sbX += 6
    
                if bIsFoe
                    headerY -= 4
                    sbX += 2
                end
            end
    
            # Pokemon Name
            pokename=@battler.name
            pbSetSystemFont(self.bitmap)
            textpos=[
                [pokename,sbX+8,headerY,false,base,shadow]
            ]
            genderX=self.bitmap.text_size(pokename).width
            genderX+=sbX+14
            if genderX > 165 && !@doublebattle && (@battler.index&1)==1 #opposing pokemon
                genderX = 224
            end
            gendertarget = @battler.effects[PBEffects::Illusion] ? @battler.effects[PBEffects::Illusion] : @battler
            if gendertarget.gender==0 # Male
                textpos.push([_INTL("♂"),genderX,headerY,false,Color.new(48,96,216),shadow])
            elsif gendertarget.gender==1 # Female
                textpos.push([_INTL("♀"),genderX,headerY,false,Color.new(248,88,40),shadow])
            end
            pbDrawTextPositions(self.bitmap,textpos)
            pbSetSmallFont(self.bitmap)
            
            # Level
            hpShiftX = 202
            if bIsFoe
                hpShiftX -= 4
            end
            textpos=[[_INTL("Lv{1}",@battler.level),sbX+hpShiftX,headerY,true,base,shadow]]
    
            # HP Numbers
            if @showhp
                hpstring=_ISPRINTF("{1: 2d}/{2: 2d}",self.hp,@battler.totalhp)
                textpos.push([hpstring,sbX+202,@spritebaseY+78,true,base,shadow])
            end
            pbDrawTextPositions(self.bitmap,textpos)
    
            # Shiny
            imagepos=[]
            if (@battler.pokemon.isShiny? && @battler.effects[PBEffects::Illusion].nil?) || (!@battler.effects[PBEffects::Illusion].nil? && @battler.effects[PBEffects::Illusion].isShiny?)
                shinyX=202
                shinyX=-16 if (@battler.index&1)==0 # If player's Pokémon
                shinyY=24
                shinyY=12 if @doublebattle
                imagepos.push(["Graphics/Pictures/shiny.png",sbX+shinyX,@spritebaseY+shinyY,0,0,-1,-1])
            end
    
            # Mega
            megaY=52
            megaY-=4 if (@battler.index&1)==0 # If player's Pokémon
            megaY=32 if @doublebattle
            megaX=215
            megaX=-27 if (@battler.index&1)==0 # If player's Pokémon
            if @battler.isMega?
                imagepos.push(["Graphics/Pictures/Battle/battleMegaEvoBox.png",sbX+megaX,@spritebaseY+megaY,0,0,-1,-1])
            end
    
            # Owned
            if @battler.owned && (@battler.index&1)==1
                if @doublebattle  
                    imagepos.push(["Graphics/Pictures/Battle/battleBoxOwned.png",sbX-12,4,0,0,-1,-1]) if (@battler.index)==3
                    imagepos.push(["Graphics/Pictures/Battle/battleBoxOwned.png",sbX-18,4,0,0,-1,-1]) if (@battler.index)==1
                else  
                    imagepos.push(["Graphics/Pictures/Battle/battleBoxOwned.png",sbX-12,20,0,0,-1,-1])  
                end 
            end
            pbDrawImagePositions(self.bitmap,imagepos)
    
            # HP Gauge
            hpGaugeSize=PokeBattle_SceneConstants::HPGAUGESIZE
            hpgauge=@battler.totalhp==0 ? 0 : (self.hp*hpGaugeSize/@battler.totalhp)
            hpgauge=2 if hpgauge==0 && self.hp>0
            hpzone=0
            hpzone=1 if self.hp<=(@battler.totalhp/2.0).floor
            hpzone=2 if self.hp<=(@battler.totalhp/4.0).floor
            hpcolors=[
                PokeBattle_SceneConstants::HPCOLORGREENDARK,
                PokeBattle_SceneConstants::HPCOLORGREEN,
                PokeBattle_SceneConstants::HPCOLORYELLOWDARK,
                PokeBattle_SceneConstants::HPCOLORYELLOW,
                PokeBattle_SceneConstants::HPCOLORREDDARK,
                PokeBattle_SceneConstants::HPCOLORRED
            ]
            # fill with black (shows what the HP used to be)
            hpGaugeX=PokeBattle_SceneConstants::HPGAUGE_X
            hpGaugeY=PokeBattle_SceneConstants::HPGAUGE_Y
            if @animatingHP && self.hp>0
                self.bitmap.fill_rect(@spritebaseX+hpGaugeX,hpGaugeY,@starthp*hpGaugeSize/@battler.totalhp,6,Color.new(0,0,0))
            end
            hpGaugeLowerY = 14
            hpThiccness = 16
            if bIsFoe
                hpGaugeX += 8
                hpGaugeY += 4
            end
            if @doublebattle
                hpGaugeY -= 12
                hpGaugeLowerY = 10
                hpThiccness = 12
    
                if bIsFoe
                    hpGaugeY -= 4
                end
            end
            self.bitmap.blt(sbX+hpGaugeX,@spritebaseY+hpGaugeY,@hpbar.bitmap,Rect.new(0,(hpzone)*hpbarconstant,hpgauge,hpbarconstant))
    
            # Status
            if !@battler.status.nil?
                imagepos=[]
                doubles = "D"
                if @doublebattle
                    if bIsFoe
                        if @battler.issossmon && !(@battler.index == 2)
                            imagepos.push([sprintf("Graphics/Pictures/Battle/battleStatuses"+ doubles + "%s",@battler.status),@spritebaseX-6,@spritebaseY+26,0,0,64,28])
                        else
                            imagepos.push([sprintf("Graphics/Pictures/Battle/battleStatuses"+ doubles + "%s",@battler.status),@spritebaseX+8,@spritebaseY+36,0,0,64,28])
                        end
                    else
                        imagepos.push([sprintf("Graphics/Pictures/Battle/battleStatuses"+ doubles + "%s",@battler.status),@spritebaseX+10,@spritebaseY+36,0,0,64,28])
                    end
                elsif bIsFoe
                    imagepos.push([sprintf("Graphics/Pictures/Battle/battleStatuses%s",@battler.status),@spritebaseX,@spritebaseY+54,0,0,64,28])
                else
                    imagepos.push([sprintf("Graphics/Pictures/Battle/battleStatuses%s",@battler.status),@spritebaseX+4,@spritebaseY+50,0,0,64,28])
                end
                pbDrawImagePositions(self.bitmap,imagepos)
            end
    
            # EXP
            if @showexp
                # fill with EXP color
                expGaugeX=PokeBattle_SceneConstants::EXPGAUGE_X
                expGaugeY=PokeBattle_SceneConstants::EXPGAUGE_Y
                self.bitmap.fill_rect(@spritebaseX+expGaugeX,expGaugeY,self.exp,2,PokeBattle_SceneConstants::EXPCOLORSHADOW)
                self.bitmap.fill_rect(@spritebaseX+expGaugeX,expGaugeY+2,self.exp,2,PokeBattle_SceneConstants::EXPCOLORBASE)
            end
        end
    
        def battlerStatus(battler)
            case battler.status
                when PBStatuses::SLEEP  
                    return "SLP"  
                when PBStatuses::FROZEN
                    return "FRZ"  
                when PBStatuses::BURN 
                    return "BRN"  
                when PBStatuses::POISON 
                    return "PSN"  
                when PBStatuses::PARALYSIS  
                    return "PAR" 
            end 
            return ""
        end
    end
  • Inspect (Port of Feature from Rejuv v13 by DemICE)
    Displaying
    class PokeBattle_Scene
      def pbCommandMenuEx(index,texts,mode=0)      # Mode: 0 - regular battle
        pbShowWindow(COMMANDBOX)                   #       1 - Shadow Pokémon battle
        cw=@sprites["commandwindow"]               #       2 - Safari Zone
        cw.setTexts(texts)                         #       3 - Bug Catching Contest
        cw.index=@lastcmd[index]
        cw.mode=mode
        pbSelectBattler(index)
        pbRefresh
        loop do
          pbGraphicsUpdate
          pbInputUpdate
          pbFrameUpdate(cw)
          # Update selected command
          if Input.trigger?(Input::LEFT) && (cw.index&1)==1
            pbPlayCursorSE()
            cw.index-=1
          elsif Input.trigger?(Input::RIGHT) &&  (cw.index&1)==0
            pbPlayCursorSE()
            cw.index+=1
          elsif Input.trigger?(Input::UP) &&  (cw.index&2)==2
            pbPlayCursorSE()
            cw.index-=2
          elsif Input.trigger?(Input::DOWN) &&  (cw.index&2)==0
            pbPlayCursorSE()
            cw.index+=2
          elsif Input.trigger?(Input::Y) #Inspect: Calling the system
            statstarget=pbStatInfo(index)
            return -1 if statstarget==-1      
            if !pbInSafari?
              pbShowBattleStats(statstarget)
            end
          end
          if Input.trigger?(Input::C)   # Confirm choice
            pbPlayDecisionSE()
            ret=cw.index
            @lastcmd[index]=ret
            return ret
          elsif Input.trigger?(Input::B) && index==2 #&& @lastcmd[0]!=2 # Cancel #Commented out for cancelling switches in doubles
            pbPlayDecisionSE()
            return -1
          end
        end 
      end
    
      def pbFightMenu(index)
        pbShowWindow(FIGHTBOX)
        cw = @sprites["fightwindow"]
        battler=@battle.battlers[index]
        cw.battler=battler
        lastIndex=@lastmove[index]
        if battler.moves[lastIndex].id!=0
          cw.setIndex(lastIndex)
        else
          cw.setIndex(0)
        end
        cw.megaButton=0
        cw.megaButton=1 if (@battle.pbCanMegaEvolve?(index) && !@battle.pbCanZMove?(index))
        cw.zButton=0
        cw.zButton=1 if @battle.pbCanZMove?(index)
        pbSelectBattler(index)
        pbRefresh
        loop do
          pbGraphicsUpdate
          pbInputUpdate
          pbFrameUpdate(cw)
          # Update selected command
          if Input.trigger?(Input::LEFT) && (cw.index&1)==1
            pbPlayCursorSE() if cw.setIndex(cw.index-1)
          elsif Input.trigger?(Input::RIGHT) &&  (cw.index&1)==0
            pbPlayCursorSE() if cw.setIndex(cw.index+1)
          elsif Input.trigger?(Input::UP) &&  (cw.index&2)==2
            pbPlayCursorSE() if cw.setIndex(cw.index-2)
          elsif Input.trigger?(Input::DOWN) &&  (cw.index&2)==0
            pbPlayCursorSE() if cw.setIndex(cw.index+2)
          elsif Input.trigger?(Input::Y) #Inspect: Calling the system
            statstarget=pbStatInfoF(index)
            return -1 if statstarget==-1          
            pbShowBattleStats(statstarget)
          end
          if Input.trigger?(Input::C)   # Confirm choice
            ret=cw.index
            if cw.zButton==2
              if battler.pbCompatibleZMoveFromIndex?(ret)
                pbPlayDecisionSE() 
                @lastmove[index]=ret
                return ret
              else
                @battle.pbDisplay(_INTL("{1} is not compatible with {2}!",PBMoves.getName(battler.moves[ret]),PBItems.getName(battler.item)))   
                @lastmove[index]=cw.index        
                return -1
              end
            else
              pbPlayDecisionSE() 
              @lastmove[index]=ret
              return ret
            end          
          elsif Input.trigger?(Input::X)   # Use Mega Evolution 
            if @battle.pbCanMegaEvolve?(index) && !pbIsZCrystal?(battler.item)
              @battle.pbRegisterMegaEvolution(index)
              cw.megaButton=2
              pbPlayDecisionSE()
            end
            if @battle.pbCanZMove?(index)  # Use Z Move
              @battle.pbRegisterZMove(index)
              cw.zButton=2
              pbPlayDecisionSE()
            end        
          elsif Input.trigger?(Input::B)   # Cancel fight menu
            @lastmove[index]=cw.index
            pbPlayCancelSE()
            return -1
          end
        end
      end
    
      #>>>>DemICE entered the chat    
      def StatInfoTarget(index)
        for i in 0...4
          if (index&1)==(i&1) && !@battle.battlers[i].isFainted? 
            return i
          end  
        end
        return -1
      end 
          
      def pbStatInfo(index)
        pbShowWindow(COMMANDBOX)
        curwindow=StatInfoTarget(index)
        if curwindow==-1
          raise RuntimeError.new(_INTL("No targets somehow..."))
        end
        loop do
          pbGraphicsUpdate
          pbInputUpdate
          pbUpdateSelected(curwindow)
          if Input.trigger?(Input::C)
            pbUpdateSelected(-1)
            statstarget=@battle.battlers[curwindow]
            return statstarget
          end
          if Input.trigger?(Input::B)
            pbUpdateSelected(-1)
            return -1
          end
          if curwindow>=0
            if Input.trigger?(Input::RIGHT)
              loop do
                newcurwindow=2 if curwindow==0
                newcurwindow=0 if curwindow==3
                newcurwindow=3 if curwindow==1
                newcurwindow=1 if curwindow==2
                curwindow=newcurwindow
                break if !@battle.battlers[curwindow].isFainted?
              end
            elsif Input.trigger?(Input::DOWN)
              loop do 
                newcurwindow=2 if curwindow==0
                newcurwindow=0 if curwindow==2
                newcurwindow=2 if curwindow==1
                newcurwindow=0 if curwindow==3
                curwindow=newcurwindow
                break if !@battle.battlers[curwindow].isFainted?
              end  
            elsif Input.trigger?(Input::LEFT)
              loop do 
                newcurwindow=3 if curwindow==0
                newcurwindow=0 if curwindow==2
                newcurwindow=2 if curwindow==1
                newcurwindow=1 if curwindow==3
                curwindow=newcurwindow
                break if !@battle.battlers[curwindow].isFainted?
              end  
            elsif Input.trigger?(Input::UP)
              loop do 
                newcurwindow=3 if curwindow==0
                newcurwindow=1 if curwindow==2
                newcurwindow=3 if curwindow==1
                newcurwindow=1 if curwindow==3
                curwindow=newcurwindow
                break if !@battle.battlers[curwindow].isFainted?                          
              end
            end
          end
        end
      end     
      
      def pbStatInfoF(index)
        pbShowWindow(FIGHTBOX)
        curwindow=StatInfoTarget(index)
        if curwindow==-1
          raise RuntimeError.new(_INTL("No targets somehow..."))
        end
        loop do
          pbGraphicsUpdate
          pbInputUpdate
          pbUpdateSelected(curwindow)
          if Input.trigger?(Input::C)
            pbUpdateSelected(-1)
            statstarget=@battle.battlers[curwindow]
            return statstarget
          end
          if Input.trigger?(Input::B)
            pbUpdateSelected(-1)
            return -1
          end
          if curwindow>=0
            if Input.trigger?(Input::RIGHT)
              loop do
                newcurwindow=2 if curwindow==0
                newcurwindow=0 if curwindow==3
                newcurwindow=3 if curwindow==1
                newcurwindow=1 if curwindow==2
                curwindow=newcurwindow
                break if !@battle.battlers[curwindow].isFainted?
              end
            elsif Input.trigger?(Input::DOWN)
              loop do 
                newcurwindow=2 if curwindow==0
                newcurwindow=0 if curwindow==2
                newcurwindow=2 if curwindow==1
                newcurwindow=0 if curwindow==3
                curwindow=newcurwindow
                break if !@battle.battlers[curwindow].isFainted?
              end  
            elsif Input.trigger?(Input::LEFT)
              loop do 
                newcurwindow=3 if curwindow==0
                newcurwindow=0 if curwindow==2
                newcurwindow=2 if curwindow==1
                newcurwindow=1 if curwindow==3
                curwindow=newcurwindow
                break if !@battle.battlers[curwindow].isFainted?
              end  
            elsif Input.trigger?(Input::UP)
              loop do 
                newcurwindow=3 if curwindow==0
                newcurwindow=1 if curwindow==2
                newcurwindow=3 if curwindow==1
                newcurwindow=1 if curwindow==3
                curwindow=newcurwindow
                break if !@battle.battlers[curwindow].isFainted?                          
              end
            end
          end
        end
      end   
    
      def pbShowBattleStats(pkmn)
        friend=@battle.battlers[0]
        atksbl="+"  
        atksbl=" " if pkmn.stages[PBStats::ATTACK]<0
        defsbl="+"  
        defsbl=" " if pkmn.stages[PBStats::DEFENSE]<0
        spasbl="+"
        spasbl=" " if pkmn.stages[PBStats::SPATK]<0
        spdsbl="+"
        spdsbl=" " if pkmn.stages[PBStats::SPDEF]<0
        spesbl="+"
        spesbl=" " if pkmn.stages[PBStats::SPEED]<0
        accsbl="+"
        accsbl=" " if pkmn.stages[PBStats::ACCURACY]<0
        evasbl="+"
        evasbl=" " if pkmn.stages[PBStats::EVASION]<0
        c=pkmn.pbCalcCrit()
        if c==0
          crit=4
        elsif c==1
          crit=25
        elsif c==2
          crit=50
        else 
          crit=100
        end  
        if (pkmn.type1 != pkmn.type2)  
          report = [_INTL("Type: {1}/{2}",PBTypes.getName(pkmn.type1),PBTypes.getName(pkmn.type2))]  
        else  
          report = [_INTL("Type: {1}",PBTypes.getName(pkmn.type1))]  
        end
        report.push(_INTL("Level: {1}",pkmn.level))
       # {1} {2} {3} {4}",pkmn.moves[0],pkmn.moves[1],pkmn.moves[2],pkmn.moves[3])"
       #if @battle.revealedMoves[0][pkmn.pokemonIndex].include?(pkmn.moves[0])
        report.push(_INTL("Attack:        {1}   {2}{3}",pkmn.pbCalcAttack(),atksbl,pkmn.stages[PBStats::ATTACK]),
                    _INTL("Defense:      {1}   {2}{3}",pkmn.pbCalcDefense(),defsbl,pkmn.stages[PBStats::DEFENSE]),
                    _INTL("Sp.Attack:   {1}   {2}{3}",pkmn.pbCalcSpAtk(),spasbl,pkmn.stages[PBStats::SPATK]),
                    _INTL("Sp.Defense: {1}   {2}{3}",pkmn.pbCalcSpDef(),spdsbl,pkmn.stages[PBStats::SPDEF]),
                    _INTL("Speed:         {1}   {2}{3}",pkmn.pbSpeed(),spesbl,pkmn.stages[PBStats::SPEED]),
                    _INTL("Accuracy:   {1}% {2}{3}",pkmn.pbCalcAcc(),accsbl,pkmn.stages[PBStats::ACCURACY]),
                    _INTL("Evasion:       {1}% {2}{3}",pkmn.pbCalcEva(),evasbl,pkmn.stages[PBStats::EVASION]),
                    _INTL("Crit. Rate:    {1}%    +{2}/3",crit,c))
        if (pkmn == @battle.battlers[1] || pkmn == @battle.battlers[3])
          if @battle.revealedMoves[0][pkmn.pokemonIndex].length!=0
          report.push(_INTL("Revealed Moves:"))
            for i in @battle.revealedMoves[0][pkmn.pokemonIndex]
              if i.id==pkmn.moves[0].id
                report.push(_INTL("{1}:  {2} PP left",pkmn.moves[0].name,pkmn.moves[0].pp))
              end
              if i.id==pkmn.moves[1].id
                report.push(_INTL("{1}:  {2} PP left",pkmn.moves[1].name,pkmn.moves[1].pp))
              end
              if i.id==pkmn.moves[2].id
                report.push(_INTL("{1}:  {2} PP left",pkmn.moves[2].name,pkmn.moves[2].pp))
              end
              if i.id==pkmn.moves[3].id
                report.push(_INTL("{1}:  {2} PP left",pkmn.moves[3].name,pkmn.moves[3].pp))
              end
            end
          end
        end
        dur=@battle.weatherduration
        dur="Permanent" if @battle.weatherduration<0
        turns="turns"
        turns="" if @battle.weatherduration<0
        if @battle.weather==PBWeather::RAINDANCE
          weatherreport=_INTL("Weather: Rain, {1} {2}",dur,turns)
          weatherreport=_INTL("Weather: Torrential Rain, {1} {2}",dur,turns) if @battle.field.effects[PBEffects::HeavyRain]
        elsif @battle.weather==PBWeather::SUNNYDAY
          weatherreport=_INTL("Weather: Sun, {1} {2}",dur,turns)
          weatherreport=_INTL("Weather: Scorching Sun, {1} {2}",dur,turns) if @battle.field.effects[PBEffects::HarshSunlight]
        elsif @battle.weather==PBWeather::SANDSTORM
          weatherreport=_INTL("Weather: Sandstorm, {1} {2}",dur,turns)
        elsif @battle.weather==PBWeather::HAIL
          weatherreport=_INTL("Weather: Hail, {1} {2}",dur,turns)
        elsif @battle.weather==PBWeather::STRONGWINDS
          weatherreport=_INTL("Weather: Strong Winds, {1} {2}",dur,turns)
        elsif @battle.weather==PBWeather::SHADOWSKY
          weatherreport=_INTL("Weather: Shadow Sky, {1} {2}",dur,turns)
        end
        report.push(weatherreport) if @battle.weather!=0
        report.push(_INTL("Slow Start: {1} turns",(5-pkmn.turncount))) if pkmn.hasWorkingAbility(:SLOWSTART) && pkmn.turncount<=5 && (pkmn == @battle.battlers[0] || pkmn == @battle.battlers[2])
        report.push(_INTL("Throat Chop: {1} turns",pkmn.effects[PBEffects::ThroatChop])) if pkmn.effects[PBEffects::ThroatChop]!=0
        report.push(_INTL("Unburdened")) if pkmn.unburdened && (pkmn == @battle.battlers[0] || pkmn == @battle.battlers[2]) && pkmn.hasWorkingAbility(:UNBURDEN)
        report.push(_INTL("Speed Swap")) if pkmn.effects[PBEffects::SpeedSwap]!=0
        report.push(_INTL("Burn Up")) if pkmn.effects[PBEffects::BurnUp]
        report.push(_INTL("Uproar: {1} turns",pkmn.effects[PBEffects::Uproar])) if pkmn.effects[PBEffects::Uproar]!=0
        report.push(_INTL("Truant")) if pkmn.effects[PBEffects::Truant] && (pkmn == @battle.battlers[0] || pkmn == @battle.battlers[2]) && pkmn.hasWorkingAbility(:TRUANT)
        report.push(_INTL("Toxic: {1} turns",pkmn.effects[PBEffects::Toxic])) if pkmn.effects[PBEffects::Toxic]!=0
        report.push(_INTL("Torment")) if pkmn.effects[PBEffects::Torment]
        report.push(_INTL("Miracle Eye")) if pkmn.effects[PBEffects::MiracleEye]
        report.push(_INTL("Minimized")) if pkmn.effects[PBEffects::Minimize]
        report.push(_INTL("Recharging")) if pkmn.effects[PBEffects::HyperBeam]!=0
        report.push(_INTL("Fury Cutter: +{1}",pkmn.effects[PBEffects::FuryCutter])) if pkmn.effects[PBEffects::FuryCutter]!=0
        report.push(_INTL("Echoed Voice: +{1}",pkmn.effects[PBEffects::EchoedVoice])) if pkmn.effects[PBEffects::EchoedVoice]!=0
        report.push(_INTL("Mean Look")) if pkmn.effects[PBEffects::MeanLook]>-1
        report.push(_INTL("Foresight")) if pkmn.effects[PBEffects::Foresight]
        report.push(_INTL("Follow Me")) if pkmn.effects[PBEffects::FollowMe]
        report.push(_INTL("Rage Powder")) if pkmn.effects[PBEffects::RagePowder]
        report.push(_INTL("Flash Fire")) if pkmn.effects[PBEffects::FlashFire]
        report.push(_INTL("Substitute")) if pkmn.effects[PBEffects::Substitute]!=0
        report.push(_INTL("Perish Song: {1} turns",pkmn.effects[PBEffects::PerishSong])) if pkmn.effects[PBEffects::PerishSong]>0
        report.push(_INTL("Leech Seed")) if pkmn.effects[PBEffects::LeechSeed]>-1
        report.push(_INTL("Gastro Acid")) if pkmn.effects[PBEffects::GastroAcid]
        report.push(_INTL("Curse")) if pkmn.effects[PBEffects::Curse]
        report.push(_INTL("Nightmare")) if pkmn.effects[PBEffects::Nightmare]
        report.push(_INTL("Confused")) if pkmn.effects[PBEffects::Confusion]!=0
        report.push(_INTL("Aqua Ring")) if pkmn.effects[PBEffects::AquaRing]
        report.push(_INTL("Ingrain")) if pkmn.effects[PBEffects::Ingrain]
        report.push(_INTL("Power Trick")) if pkmn.effects[PBEffects::PowerTrick]
        report.push(_INTL("Smacked Down")) if pkmn.effects[PBEffects::SmackDown]
        report.push(_INTL("Air Balloon")) if pkmn.hasWorkingItem(:AIRBALLOON)
        report.push(_INTL("Magnet Rise: {1} turns",pkmn.effects[PBEffects::MagnetRise])) if pkmn.effects[PBEffects::MagnetRise]!=0
        report.push(_INTL("Telekinesis: {1} turns",pkmn.effects[PBEffects::Telekinesis])) if pkmn.effects[PBEffects::Telekinesis]!=0
        report.push(_INTL("Heal Block: {1} turns",pkmn.effects[PBEffects::HealBlock])) if pkmn.effects[PBEffects::HealBlock]!=0
        report.push(_INTL("Embargo: {1} turns",pkmn.effects[PBEffects::Embargo])) if pkmn.effects[PBEffects::Embargo]!=0
        report.push(_INTL("Disable: {1} turns",pkmn.effects[PBEffects::Disable])) if pkmn.effects[PBEffects::Disable]!=0
        report.push(_INTL("Encore: {1} turns",pkmn.effects[PBEffects::Encore])) if pkmn.effects[PBEffects::Encore]!=0
        report.push(_INTL("Taunt: {1} turns",pkmn.effects[PBEffects::Taunt])) if pkmn.effects[PBEffects::Taunt]!=0
        report.push(_INTL("Infatuated with {1}",@battle.battlers[pkmn.effects[PBEffects::Attract]].name)) if pkmn.effects[PBEffects::Attract]>=0
        report.push(_INTL("Trick Room: {1} turns",@battle.trickroom)) if @battle.trickroom!=0
        report.push(_INTL("Gravity: {1} turns",@battle.field.effects[PBEffects::Gravity])) if @battle.field.effects[PBEffects::Gravity]>0  
        report.push(_INTL("Tailwind: {1} turns",pkmn.pbOwnSide.effects[PBEffects::Tailwind])) if pkmn.pbOwnSide.effects[PBEffects::Tailwind]>0   
        report.push(_INTL("Reflect: {1} turns",pkmn.pbOwnSide.effects[PBEffects::Reflect])) if pkmn.pbOwnSide.effects[PBEffects::Reflect]>0
        report.push(_INTL("Light Screen: {1} turns",pkmn.pbOwnSide.effects[PBEffects::LightScreen])) if pkmn.pbOwnSide.effects[PBEffects::LightScreen]>0
        report.push(_INTL("Aurora Veil: {1} turns",pkmn.pbOwnSide.effects[PBEffects::AuroraVeil])) if pkmn.pbOwnSide.effects[PBEffects::AuroraVeil]>0
        report.push(_INTL("Safeguard: {1} turns",pkmn.pbOwnSide.effects[PBEffects::Safeguard])) if pkmn.pbOwnSide.effects[PBEffects::Safeguard]>0
        report.push(_INTL("Lucky Chant: {1} turns",pkmn.pbOwnSide.effects[PBEffects::LuckyChant])) if pkmn.pbOwnSide.effects[PBEffects::LuckyChant]>0
        report.push(_INTL("Mist: {1} turns",pkmn.pbOwnSide.effects[PBEffects::Mist])) if pkmn.pbOwnSide.effects[PBEffects::Mist]>0 
        report.push(_INTL("Altered Field: {1} turns",@battle.field.effects[PBEffects::Terrain])) if @battle.field.effects[PBEffects::Terrain]>0
        #report.push(_INTL("Messed up Field: {1} turns",@battle.field.effects[PBEffects::Splintered])) if @battle.field.effects[PBEffects::Splintered]>0  
        #report.push(_INTL("Electric Terrain: {1} turns",@battle.field.effects[PBEffects::ElectricTerrain])) if @battle.field.effects[PBEffects::ElectricTerrain]>0  
        #report.push(_INTL("Grassy Terrain: {1} turns",@battle.field.effects[PBEffects::GrassyTerrain])) if @battle.field.effects[PBEffects::GrassyTerrain]>0
        #report.push(_INTL("Misty Terrain: {1} turns",@battle.field.effects[PBEffects::MistyTerrain])) if @battle.field.effects[PBEffects::MistyTerrain]>0
        #report.push(_INTL("Psychic Terrain: {1} turns",@battle.field.effects[PBEffects::PsychicTerrain])) if @battle.field.effects[PBEffects::PsychicTerrain]>0
        #report.push(_INTL("Rainbow: {1} turns",@battle.field.effects[PBEffects::Rainbow])) if @battle.field.effects[PBEffects::Rainbow]>0
        report.push(_INTL("Magic Room: {1} turns",@battle.field.effects[PBEffects::MagicRoom])) if @battle.field.effects[PBEffects::MagicRoom]>0
        report.push(_INTL("Wonder Room: {1} turns",@battle.field.effects[PBEffects::WonderRoom])) if @battle.field.effects[PBEffects::WonderRoom]>0
        report.push(_INTL("Water Sport: {1} turns",@battle.field.effects[PBEffects::WaterSport])) if @battle.field.effects[PBEffects::WaterSport]>0
        report.push(_INTL("Mud Sport: {1} turns",@battle.field.effects[PBEffects::MudSport])) if @battle.field.effects[PBEffects::MudSport]>0
        report.push(_INTL("Spikes: {1} layers",pkmn.pbOwnSide.effects[PBEffects::Spikes])) if pkmn.pbOwnSide.effects[PBEffects::Spikes]>0
        report.push(_INTL("Toxic Spikes: {1} layers",pkmn.pbOwnSide.effects[PBEffects::ToxicSpikes])) if pkmn.pbOwnSide.effects[PBEffects::ToxicSpikes]>0
        report.push(_INTL("Stealth Rock active")) if pkmn.pbOwnSide.effects[PBEffects::StealthRock]
        report.push(_INTL("Sticky Web active")) if pkmn.pbOwnSide.effects[PBEffects::StickyWeb]
        report.push()
        report.push(_INTL("Wonder Room Stat Swap active")) if pkmn.wonderroom==true
        fieldnames = ["No Field", "Electric Terrain", "Grassy Terrain", "Misty Terrain", "Dark Crystal Cavern",
                      "Chess Board", "Big Top Arena", "Volcanic Field", "Swamp Field", "Rainbow Field",
                      "Corrosive Field", "Corrosive Mist Field", "Desert Field", "Icy Field", "Rocky Field",
                      "Forest Field", "Volcanic Top Field", "Factory Field", "Short-circuit Field", "Wasteland",
                      "Ashen Beach", "Water Surface", "Underwater", "Cave", "Glitch Field",
                      "Crystal Cavern", "Murkwater Surface", "Mountain", "Snowy Mountain", "Holy Field",
                      "Mirror Arena", "Fairy Tale Field", "Dragon's Den", "Flower Garden Field", "Starlight Arena",
                      "New World", "Inverse Field", "Psychic Terrain", "Dimensional Field", "Frozen Dimensional Field",
                      "Haunted Field", "Corrupted Cave", "Bewitched Woods", "Sky Field"]
        report.push(_INTL("Field effect: {1}", fieldnames[$fefieldeffect]))
        party=@battle.pbParty(pkmn.index)
        participants=0
        for i in 0...party.length
          participants+=1 if party[i] && !party[i].isEgg? &&
          party[i].hp>0 && party[i].status==0 && !party[i].nil?
        end
        report.push(_INTL("Remaining Pokemon: {1} ",(participants)))
        Kernel.pbMessage((_INTL"Inspecting {1}:",pkmn.name),report, report.length)
      end
      #DemICE left the chat>>>>    
    end
    Get Data
    class PokeBattle_Battler
      #>>>>DemICE entered the chat
      def pbCalcCrit()  
        #### KUROTSUNE - 029 - END      
        $buffs = 0
        if $fefieldeffect == 30 # Mirror Arena
          $buffs = self.stages[PBStats::EVASION] if self.stages[PBStats::EVASION] > 0
          $buffs = $buffs.to_i + self.stages[PBStats::ACCURACY] if self.stages[PBStats::ACCURACY] > 0
        end   
        c=0
        c+=self.effects[PBEffects::FocusEnergy]
        c+=1 if self.hasWorkingAbility(:SUPERLUCK) || self.hasWorkingAbility(:LONGREACH)
        if self.hasWorkingItem(:STICK) && isConst?(self.species,PBSpecies,:FARFETCHD)
          c+=2
        end
        if self.hasWorkingItem(:LUCKYPUNCH) && isConst?(self.species,PBSpecies,:CHANSEY)
          c+=2
        end
        c+=1 if self.hasWorkingItem(:RAZORCLAW)
        c+=1 if self.hasWorkingItem(:SCOPELENS)
        if $fefieldeffect == 30 # Mirror Arena
          c += $buffs
        end
        c=3 if c>3
        return c
      end
    
      def pbCalcAttack()
        stagemul=[2,2,2,2,2,2,2,3,4,5,6,7,8]
        stagediv=[8,7,6,5,4,3,2,2,2,2,2,2,2]    
        atk=@attack
        atkstage=@stages[PBStats::ATTACK]+6
        if @effects[PBEffects::PowerTrick]
          atk=@defense
          atkstage=@stages[PBStats::DEFENSE]+6
        end    
        if @stages[PBStats::ATTACK] >= 0
          stagemulp=1+0.5*@stages[PBStats::ATTACK]
          atk=(atk*1.0*stagemulp).floor  
        else        
          atk=(atk*1.0*stagemul[atkstage]/stagediv[atkstage]).floor
        end  
        if self.hasWorkingAbility(:HUSTLE)
          atk=(atk*1.5).round
        end
        if self.hasWorkingItem(:LIGHTBALL) && isConst?(self.species,PBSpecies,:PIKACHU)
          atk=self.pbSpeed
        end
        atkmult=0x1000           
        if self.hasWorkingAbility(:GUTS) &&
          self.status!=0 
          atkmult=(atkmult*1.5).round
        end   
        if self.hasWorkingAbility(:DEFEATIST) &&
          self.hp<=(self.totalhp/2).floor
          atkmult=(atkmult*0.5).round
        end
        if ((self.hasWorkingAbility(:PUREPOWER) && $fefieldeffect!=37) || #Psychic Terrain
            self.hasWorkingAbility(:HUGEPOWER))
          atkmult=(atkmult*2.0).round
        end  
        if self.hasWorkingAbility(:SLOWSTART) &&
          self.turncount<5 
          atkmult=(atkmult*0.5).round
        end
        if (@battle.pbWeather==PBWeather::SUNNYDAY || $fefieldeffect == 33 || $fefieldeffect == 42) # Flower Garden Field || Bewitched Woods
          if self.hasWorkingAbility(:FLOWERGIFT) && isConst?(self.species,PBSpecies,:CHERRIM)
            atkmult=(atkmult*1.5).round
          end
          if self.pbPartner.hasWorkingAbility(:FLOWERGIFT) && isConst?(self.pbPartner.species,PBSpecies,:CHERRIM)
            atkmult=(atkmult*1.5).round
          end
        end
        if self.hasWorkingItem(:THICKCLUB) &&
          (isConst?(self.species,PBSpecies,:CUBONE) || isConst?(self.species,PBSpecies,:MAROWAK))
          atkmult=(atkmult*2.0).round
        end
        if self.hasWorkingItem(:LIGHTBALL) && isConst?(self.species,PBSpecies,:PIKACHU)
          atkmult=(atkmult*2.0).round
        end
        if self.hasWorkingItem(:CHOICEBAND)
          atkmult=(atkmult*1.5).round
        end 
        if self.hasWorkingAbility(:QUEENLYMAJESTY) && ($fefieldeffect==31) # Chess Board (REMOVED) || Fairy Tale Field
          atkmult=(atkmult*1.5).round
        end 
        if self.hasWorkingAbility(:LONGREACH) &&
          ($fefieldeffect==27 || $fefieldeffect==28) # Mountain || Snowy Mountain
          atkmult=(atkmult*1.5).round
        end     
        if self.hasWorkingAbility(:CORROSION) &&
          ($fefieldeffect==10 || $fefieldeffect==11 ||  $fefieldeffect==41) # Corrosive Field || Corrosive Mist Field || Corrupted Cave
          atkmult=(atkmult*1.5).round
        end     
        atk=(atk*atkmult*1.0/0x1000).round
        return atk
      end
      
      def pbCalcDefense()
        stagemul=[2,2,2,2,2,2,2,3,4,5,6,7,8]
        stagediv=[8,7,6,5,4,3,2,2,2,2,2,2,2]      
        defense=@defense
        defstage=@stages[PBStats::DEFENSE]+6
        if @effects[PBEffects::PowerTrick]
          defense=@attack
          defstage=@stages[PBStats::DEFENSE]+6
        end       
        # TODO: Wonder Room should apply around here
        if @stages[PBStats::DEFENSE] >= 0
          stagemulp=1+0.5*@stages[PBStats::DEFENSE]
          defense=(defense*1.0*stagemulp).floor
        else        
          defense=(defense*1.0*stagemul[defstage]/stagediv[defstage]).floor
        end  
        defmult=0x1000  
        if $fefieldeffect == 24 && @function==0xE0 # Glitch Field
          defmult=(defmult*0.5).round
        end      
        if self.hasWorkingAbility(:MARVELSCALE) && 
          (self.status>0 || $fefieldeffect == 3 || $fefieldeffect == 9 || # Misty Terrain || Rainbow Field
            $fefieldeffect == 31 || $fefieldeffect == 32 || $fefieldeffect == 34) # Fairy Tale Field || Dragon's Den || Starlight Arena
          defmult=(defmult*1.5).round
        end
        if isConst?(self.ability,PBAbilities,:GRASSPELT) && 
          ($fefieldeffect == 2 || $fefieldeffect == 15) # Grassy Field || Forest Field
          defmult=(defmult*1.5).round
        end
        #### AME - 005 - START
        if self.hasWorkingAbility(:FURCOAT)
          defmult=(defmult*1.5).round
        end
        if self.hasWorkingItem(:EVIOLITE)
          evos=pbGetEvolvedFormData(self.species)
          if evos && evos.length>0
            defmult=(defmult*1.5).round
          end
        end
        if self.hasWorkingItem(:METALPOWDER) &&
          isConst?(self.species,PBSpecies,:DITTO) &&
          !self.effects[PBEffects::Transform]
          defmult=(defmult*2.0).round
        end
        if (self.hasWorkingAbility(:PRISMARMOR) || 
            self.hasWorkingAbility(:SHADOWSHIELD)) && $fefieldeffect==4 # Dark Crystal Cavern
          defmult=(defmult*2.0).round
        end    
        if self.hasWorkingAbility(:PRISMARMOR) && ($fefieldeffect==9 || $fefieldeffect==25) # Rainbow Field || Crystal Cavern
          defmult=(defmult*2.0).round
        end   
        if self.hasWorkingAbility(:SHADOWSHIELD) && ($fefieldeffect==34 || $fefieldeffect==35) # Starlight Arena || New World
          defmult=(defmult*2.0).round
        end        
        defense=(defense*defmult*1.0/0x1000).round    
        return defense
      end 
      
      def pbCalcSpAtk()
        stagemul=[2,2,2,2,2,2,2,3,4,5,6,7,8]
        stagediv=[8,7,6,5,4,3,2,2,2,2,2,2,2]    
        atk=@spatk
        atkstage=@stages[PBStats::SPATK]+6
        if @stages[PBStats::SPATK] >= 0
          stagemulp=1+0.5*@stages[PBStats::SPATK]
          atk=(atk*1.0*stagemulp).floor  
        else        
          atk=(atk*1.0*stagemul[atkstage]/stagediv[atkstage]).floor
        end  
        atkmult=0x1000
        if (self.hasWorkingAbility(:PLUS) || self.hasWorkingAbility(:MINUS))
          partner=self.pbPartner
          if partner.hasWorkingAbility(:PLUS) || partner.hasWorkingAbility(:MINUS) 
            atkmult=(atkmult*1.5).round
          elsif $fefieldeffect == 18 # Short-circuit Field
            atkmult=(atkmult*1.5).round
          end
        end
        if (self.pbPartner).hasWorkingAbility(:BATTERY)
          atkmult=(atkmult*1.3).round
        end    
        if self.hasWorkingAbility(:DEFEATIST) &&
          self.hp<=(self.totalhp/2).floor
          atkmult=(atkmult*0.5).round
        end
        if self.hasWorkingAbility(:PUREPOWER) && $fefieldeffect==37 # Psychic Terrain
          atkmult=(atkmult*2.0).round
        end    
        if self.hasWorkingAbility(:SOLARPOWER) &&
          @battle.pbWeather==PBWeather::SUNNYDAY
          atkmult=(atkmult*1.5).round
        end
        if self.hasWorkingItem(:DEEPSEATOOTH) &&
          isConst?(self.species,PBSpecies,:CLAMPERL)
          atkmult=(atkmult*2.0).round
        end
        if self.hasWorkingItem(:LIGHTBALL) &&
          isConst?(self.species,PBSpecies,:PIKACHU)
          atkmult=(atkmult*2.0).round
        end
        if self.hasWorkingItem(:CHOICESPECS)
          atkmult=(atkmult*1.5).round
        end
        if $fefieldeffect == 34 || $fefieldeffect == 35 # Starlight Arena || New World
          if self.hasWorkingAbility(:VICTORYSTAR)
            atkmult=(atkmult*1.5).round
          end
          partner=self.pbPartner
          if partner && partner.hasWorkingAbility(:VICTORYSTAR)
            atkmult=(atkmult*1.5).round
          end
        end
        if self.hasWorkingAbility(:QUEENLYMAJESTY) &&
          ($fefieldeffect==5 || $fefieldeffect==31) # Chess Board || Fairy Tale Field
          atkmult=(atkmult*1.5).round
        end 
        if self.hasWorkingAbility(:LONGREACH) &&
          ($fefieldeffect==27 || $fefieldeffect==28) # Mountain || Snowy Mountain
          atkmult=(atkmult*1.5).round
        end     
        if self.hasWorkingAbility(:CORROSION) &&
          ($fefieldeffect==10 || $fefieldeffect==11) # Corrosive Field || Corrosive Mist Field
          atkmult=(atkmult*1.5).round
        end  
        atk=(atk*atkmult*1.0/0x1000).round
        return atk
      end  
      
      def pbCalcSpDef()
        stagemul=[2,2,2,2,2,2,2,3,4,5,6,7,8]
        stagediv=[8,7,6,5,4,3,2,2,2,2,2,2,2]    
        applysandstorm=false
        defense=@spdef
        defstage=@stages[PBStats::SPDEF]+6
        applysandstorm=true
        if !self.hasWorkingAbility(:UNAWARE)
          if @stages[PBStats::SPDEF] >= 0
            stagemulp=1+0.5*@stages[PBStats::SPDEF]
            defense=(defense*1.0*stagemulp).floor
          else        
            defense=(defense*1.0*stagemul[defstage]/stagediv[defstage]).floor
          end  
        end    
        if @battle.pbWeather==PBWeather::SANDSTORM &&
          self.pbHasType?(:ROCK) && applysandstorm
          defense=(defense*1.5).round
        end
        defmult=0x1000
        if $fefieldeffect == 24 && @function==0xE0 # Glitch Field
          defmult=(defmult*0.5).round
        end
        if $fefieldeffect == 3 && self.pbHasType?(:FAIRY) # Misty Terrain    
          defmult=(defmult*1.5).round
        end
        if $fefieldeffect == 12 && self.pbHasType?(:GROUND) # Desert Field    
          defmult=(defmult*1.5).round
        end
        #if $fefieldeffect == 32 && self.pbHasType?(:DRAGON) # Snowy Mountain 
        #  defmult=(defmult*1.5).round
        #end
        if $fefieldeffect == 22 && !isConst?(type,PBTypes,:WATER) # Underwater
          defmult=(defmult*0.5).round
        end
        #### AME - 005 - END
        if (@battle.pbWeather==PBWeather::SUNNYDAY || $fefieldeffect == 33 || $fefieldeffect == 42) # Flower Garden Field || Bewitched Woods
          if self.hasWorkingAbility(:FLOWERGIFT) &&
            isConst?(self.species,PBSpecies,:CHERRIM)
            defmult=(defmult*1.5).round
          end
          if self.pbPartner.hasWorkingAbility(:FLOWERGIFT)  &&
            isConst?(self.pbPartner.species,PBSpecies,:CHERRIM)
            defmult=(defmult*1.5).round
          end
        end
        if self.hasWorkingItem(:EVIOLITE)
          evos=pbGetEvolvedFormData(self.species)
          if evos && evos.length>0
            defmult=(defmult*1.5).round
          end
        end
        if self.hasWorkingItem(:ASSAULTVEST)
          defmult=(defmult*1.5).round
        end
        if self.hasWorkingItem(:DEEPSEASCALE) && isConst?(self.species,PBSpecies,:CLAMPERL)
          defmult=(defmult*2.0).round
        end  
        if self.hasWorkingItem(:METALPOWDER) &&
          isConst?(self.species,PBSpecies,:DITTO) &&
          !self.effects[PBEffects::Transform]
          defmult=(defmult*2.0).round
        end
        if (self.hasWorkingAbility(:PRISMARMOR) || 
            self.hasWorkingAbility(:SHADOWSHIELD)) && $fefieldeffect==4 # Dark Crystal Cavern
          defmult=(defmult*2.0).round
        end    
        if self.hasWorkingAbility(:PRISMARMOR) && ($fefieldeffect==9 || $fefieldeffect==25) # Chess Board || Crystal Cavern
          defmult=(defmult*2.0).round
        end   
        if self.hasWorkingAbility(:SHADOWSHIELD) && ($fefieldeffect==34 || $fefieldeffect==35) # Starlight Arena || New World
          defmult=(defmult*2.0).round
        end        
        defense=(defense*defmult*1.0/0x1000).round
        return defense
      end  
       
      def pbCalcAcc()
        accstage=self.stages[PBStats::ACCURACY]
        accuracy=(accstage>=0) ? (accstage+3)*100/3 : 300/(3-accstage)
        if self.hasWorkingAbility(:COMPOUNDEYES)
          accuracy*=1.3
        end
        if self.hasWorkingAbility(:VICTORYSTAR)
          accuracy*=1.1
        end
        partner=self.pbPartner
        if partner && partner.hasWorkingAbility(:VICTORYSTAR)
          accuracy*=1.1
        end
        if self.hasWorkingItem(:WIDELENS)
          accuracy*=1.1
        end
        if self.hasWorkingAbility(:LONGREACH) && $fefieldeffect==15 # Forest Field
          accuracy*=0.9
        end 
        return accuracy
      end  
      
      def pbCalcEva()
        evastage=self.stages[PBStats::EVASION] 
        evastage-=2 if @battle.field.effects[PBEffects::Gravity]>0
        evastage=-6 if evastage<-6
        evastage=6 if evastage>6  #>>DemICE
        evastage=0 if self.effects[PBEffects::Foresight] ||
        self.effects[PBEffects::MiracleEye]
        evasion=(evastage>=0) ? (evastage+3)*100/3 : 300/(3-evastage)
        if self.hasWorkingAbility(:TANGLEDFEET) &&
          self.effects[PBEffects::Confusion]>0
          evasion*=1.2
        end
        if self.hasWorkingAbility(:SANDVEIL) &&
          (@battle.pbWeather==PBWeather::SANDSTORM ||
            $fefieldeffect == 12 || $fefieldeffect == 20) # Desert Field || Ashen Beach
          evasion*=1.2
        end
        if self.hasWorkingAbility(:SNOWCLOAK) &&
          (@battle.pbWeather==PBWeather::HAIL || $fefieldeffect == 13 || # Icy Field
            $fefieldeffect == 28) # Snowy Mountain
          evasion*=1.2
        end
        if self.hasWorkingItem(:BRIGHTPOWDER)
          evasion*=1.1
        end
        if self.hasWorkingItem(:LAXINCENSE)
          evasion*=1.1
        end    
        return evasion
      end  
      #DemICE left the chat>>>>
    
      # For registering revealed moves
      def pbProcessTurn(choice)
        # Can't use a move if fainted
        return if self.isFainted?
        # Wild roaming Pokémon always flee if possible
        if !@battle.opponent && @battle.pbIsOpposing?(self.index) &&
           @battle.rules["alwaysflee"] && @battle.pbCanRun?(self.index)
          pbBeginTurn(choice)
          @battle.pbDisplay(_INTL("{1} fled!",self.pbThis))
          @battle.decision=3
          pbEndTurn(choice)
          return
        end
        # If this battler's action for this round wasn't "use a move"
        if choice[0]!=1
          # Clean up effects that end at battler's turn
          pbBeginTurn(choice)
          pbEndTurn(choice)
          return
        end
        # Turn is skipped if Pursuit was used during switch
        if @effects[PBEffects::Pursuit]
          @effects[PBEffects::Pursuit]=false
          pbCancelMoves
          pbEndTurn(choice)
          @battle.pbJudgeSwitch
          return
        end
        # Use the move
        if choice[2].zmove && !@effects[PBEffects::Flinch] && @status!=PBStatuses::SLEEP && @status!=PBStatuses::FROZEN
          choice[2].zmove=false
          @battle.pbUseZMove(self.index,choice[2],self.item)
        else
          choice[2].zmove=false if choice[2].zmove # For flinches
    #    @battle.pbDisplayPaused("Before: [#{@lastMoveUsedSketch},#{@lastMoveUsed}]")
          @battle.previousMove = @battle.lastMoveUsed
          @previousMove = @lastMoveUsed
          PBDebug.logonerr{
             pbUseMove(choice,choice[2]==@battle.struggle)
          }
    
          # Saving Revealed Moves
          if !(@battle.pbOwnedByPlayer?(self.index))
            if @battle.revealedMoves[0][self.pokemonIndex].length==0 
              @battle.revealedMoves[0][self.pokemonIndex].push(choice[2])       
            else
              dupecheck=0
              for i in @battle.revealedMoves[0][self.pokemonIndex]
                dupecheck+=1 if i.id == choice[2].id
              end
              @battle.revealedMoves[0][self.pokemonIndex].push(choice[2]) if dupecheck==0
            end    
          end
        end    
    #   @battle.pbDisplayPaused("After: [#{@lastMoveUsedSketch},#{@lastMoveUsed}]")
      end
    end
    Preparing Revealed Moves
    class PokeBattle_Battle
      attr_accessor(:revealedMoves) # moves revealed by enemy pokemon
      
      alias_method :battleInitalizeOld, :initialize
      def initialize(scene,p1,p2,player,opponent)
        @revealedMoves   = [[[],[],[],[],[],[],[],[],[],[],[],[]]]
        battleInitalizeOld(scene,p1,p2,player,opponent)
      end
    end
Spice Scent Port

Description:
Backporting the spice scent system from Rejuvenation v13.5.

  • Constants
    Switches = {
        :FirstUse => 129
    }
    
    Variables = {
        :EncounterRateModifier => 51
    }
  • Menu Option
    MenuHandlers.insertEntry(:SPICESCENT,:QUIT,_INTL("Spice Scent"),"menuSpiceScent",proc{|menu|
      pbFadeOutIn(99999) { 
        pbLoadRpgxpScene(Scene_EncounterRate.new)
      }   
    },proc{ return true })
  • Scene
    class Scene_EncounterRate
        def initialize(menu_index = 0)
            @menu_index = menu_index
        end
        
        def main
            if !defined?($game_variables[:EncounterRateModifier]) || $game_switches[:FirstUse]!=true
                $game_variables[:EncounterRateModifier]=1
            end
            fadein = true
            @sprites={}
            @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
            @viewport.z=99999
            @sprites["background"] = IconSprite.new(0,0)
            @sprites["background"].setBitmap("Graphics/Pictures/SpiceScentBg")
            @sprites["background"].z=255
            Graphics.transition
          
            params=ChooseNumberParams.new
            params.setRange(0,9999)
            params.setInitialValue($game_variables[:EncounterRateModifier].to_f*100)
            params.setCancelValue($game_variables[:EncounterRateModifier].to_f*100)       
            $game_variables[:EncounterRateModifier]=Kernel.pbMessageChooseNumberCentered(params).to_f/100
            $game_switches[:FirstUse]=true
            if defined?($game_map.map_id)
                $PokemonEncounters.setup($game_map.map_id)
            end
            $scene = Scene_Map.new
            Graphics.freeze
            pbDisposeSpriteHash(@sprites)
            @viewport.dispose
        end
    end
    
    def Kernel.pbMessageChooseNumberCentered(params,&block)
        return Kernel.pbChooseNumberCentered(params,&block)
    end
    
    def pbChooseNumberCentered(params)
        return 0 if !params
        ret=0
        maximum=params.maxNumber
        minimum=params.minNumber
        defaultNumber=params.initialNumber
        cancelNumber=params.cancelNumber
        cmdwindow=Window_InputNumberPokemon.new(params.maxDigits)
        cmdwindow.x=Graphics.width/2-68
        cmdwindow.y =Graphics.height/2-36
        cmdwindow.z=99999
        cmdwindow.visible=true
        cmdwindow.sign=params.negativesAllowed # must be set before number
        cmdwindow.number=defaultNumber
        curnumber=defaultNumber
        command=0
        loop do
          Graphics.update
          Input.update
          pbUpdateSceneMap
          cmdwindow.update
          yield if block_given?
          if Input.trigger?(Input::C)
            ret=cmdwindow.number
            if ret>maximum
              pbPlayBuzzerSE()
            elsif ret<minimum
              pbPlayBuzzerSE()
            else
              pbPlayDecisionSE()
              break
            end
          elsif Input.trigger?(Input::B)
            pbPlayCancelSE()
            ret=cancelNumber
            pbWait(2)
            break
          end
        end
        cmdwindow.dispose
        Input.update
        return ret 
    end
  • Applying the Value
    class PokemonEncounters
        def setup(mapID)
            encounterMultiplier = ($game_switches[:FirstUse]) ? $game_variables[:EncounterRateModifier] : 1
            @density=nil
            @stepcount=0
            @enctypes=[]
            begin
              data=load_data("Data/encounters.dat")
              if data.is_a?(Hash) && data[mapID]
                landrate=data[mapID][0][0]*encounterMultiplier
                waterrate=data[mapID][0][1]*encounterMultiplier
                caverate=data[mapID][0][2]*encounterMultiplier
                @density=[landrate,caverate,waterrate,caverate,waterrate,waterrate,landrate,landrate,landrate,landrate,landrate,landrate,landrate]
                @enctypes=data[mapID][1]
              else
                @density=nil
                @enctypes=[]
              end
              rescue
              @density=nil
              @enctypes=[]
            end
        end
    
        alias_method :old_pbGenerateEncounter, :pbGenerateEncounter
        def pbGenerateEncounter(enctype)
            if enctype<0 || enctype>EncounterTypes::EnctypeChances.length
              raise ArgumentError.new(_INTL("Encounter type out of range"))
            end
            return nil if @density==nil
            return nil if @density[enctype]==0 || !@density[enctype]
            return nil if @enctypes[enctype]==nil
            return nil if @stepcount + 1 <= 10 && $game_variables[:EncounterRateModifier]<=1
            return old_pbGenerateEncounter(enctype)
        end
    end
  • Utils
    module MenuHandlers
        def self.insertEntry(ref,positionKey,name,icon,proc,conditional,proximity=:after)
            @@menuEntry[ref] = [name,icon,proc]
            @@available[ref] = conditional
    
            position = @@indexes[positionKey]
            pos = nil
            pos = position if position.is_a?(Integer)
            pos = position.to_i() if position.respond_to?("to_i")
            pos += (proximity == :before ? 0 : 1)
            if pos != nil
                @@indexes.each do |key, value|
                    val = nil
                    val = value if value.is_a?(Integer)
                    val = value.to_i() if value.respond_to?("to_i")
                    if val != nil && val >= pos
                        @@indexes[key] = val + 1
                    end
                end
    		    @@indexes[ref] = pos
            end
    		
            @@index += 1
        end
    end
    
    class Game_Switches
        alias_method :old_get, :[]
        def [](switch_id)
          switch_id = Switches[switch_id] if switch_id.is_a?(Symbol)
          old_get(switch_id)
        end
    
        alias_method :old_set, :[]=
        def []=(switch_id, value)
          switch_id = Switches[switch_id] if switch_id.is_a?(Symbol)
          old_set(switch_id, value)
        end
    end
    
    class Game_Variables
        alias_method :old_get, :[]
        def [](variable_id)
          variable_id = Variables[variable_id] if variable_id.is_a?(Symbol)
          old_get(variable_id)
        end
    
        alias_method :old_set, :[]=
        def []=(variable_id, value)
          variable_id = Variables[variable_id] if variable_id.is_a?(Symbol)
          old_set(variable_id, value)
        end
    end
Simple Mod Support

Description:
Loading script files from Data/Mods

Dir["./Data/Mods/*.rb"].each {|file| load File.expand_path(file) }

Other

Audio/SE
  • All
    • Copy from Rejuvenation
Data
  • CommonEvents.rxdata
    • Fixed a spelling mistake
    • Copied common event "QuestComplete! (True)" from Rejuvenation
    • Copied common event "QuestCompleteRem" from Rejuvenation
  • "connections.dat"
    • Removed connection between "Map14" (Uncharted Field)""Map15" (Destroyed Village)"
    • Removed connection between "Map15" (Destroyed Village)""Map21" (Uncharted Woods)"
  • "MapInfos.rxdata"
    • Added name & parent map for "Map113" (Uncharted Cave)"
    • Added name & parent map for "Map118" (Gemstream Mine)"
  • "metadata.dat"
    • Added metadata for "Map113" (Uncharted Cave)"
    • Added metadata for "Map118" (Gemstream Mine)"
  • "Scripts.rxdata"
    • Contains the script for loading the external scripts (script by KK20)
  • "System.rxdata"
    • Added renamed/new variables/switches
  • "Tilesets.rxdata"
    • Contains all meta information concerning the tilemaps
Scripts
  • Overhaul_Fixes
    • Contains fixes for some common bugs
  • Overhaul_BattleSystem
    • Contains the overrides for the new backported battle system
  • All Others
    • Simply exported from Where Love Lies

Rejuvenation Integration

Maps

Maps
  • Map294 - Central Building
    • Edited event (10|8) for the reward check (password or auto)
  • Map475 - Rift Isolated Dream
    • Updated to match "Map7" (Sensei's House) & "Map424" (Sheridan Arena)
    • Updated events (20|20), (21|20) & (18|54) for different space

Images

Pictures
  • "AelitaMemory1"
    • Updated to match "Map14" (Uncharted Field) from Where Love Lies
  • "flashback_WWL1"
    • Updated to match "Map2" (Gearen City) from Where Love Lies
  • "flashback_WLL4"
    • Updated to match "Map54" (Sheridan Arena) from Where Love Lies
Tilesets
  • "Aelita_rift_2"
    • Copied from "Aelita_rift" from Rejuvenation
    • Replaced tiles of house and rooms

Other

Data
  • "Tilesets.rxdata"
    • Contains all meta information concerning the tilemaps
⚠️ **GitHub.com Fallback** ⚠️