List of Changes - pbflo/Where-Love-Lies-Overhaul GitHub Wiki
Maps
-
Map001 - Ferry
- Changed connection to
"Map2" (Gearen City)
- Changed connection to
-
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
- Updated to match
-
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
- Updated to match
-
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
- Updated to match
-
Map006 - Gearen City (Inside)
- Changed connections to
"Map2" (Gearen City)
- Fixed missing character nameplate
- Changed connections to
-
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
- Changed connections to
-
Map008 - ??? (Cliffside Grave)
- Updated to match
"Map200" (Cliffside Grave)
from Rejuvenation - Adds dialog for not going into the cave
- Updated to match
-
Map009 - ??? (Cliffside Grave - Cutscene)
- Updated to match
"Map200" (Cliffside Grave)
from Rejuvenation - Fixed two repeated lines that did not match their counterpart in
"Map008" (???)
- Updated to match
-
Map010 - Gearen City (Lonely Rest Center)
- Changed connection to
"Map2" (Gearen City)
- Changed connection to
-
Map012 - Uncharted Forest (Main)
- Changed some tree colors to match the new
"Map14" (Uncharted Field)
- Fixed some spelling mistakes
- Changed some tree colors to match the new
-
Map013 - Uncharted Forest (Pond)
- Changed connection to
"Map31" (Sheridan Village)
- Changed connection to
-
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 triggers18, 27, 5, 29, 30
because of position
- Updated to match
-
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
- Updated to match
-
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 newHidden Forest
&Sheridan Village
- Updated to match
-
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)
- Updated to match
-
Map018 - Uncharted Cave (Carotos Entrance)
- Updated to match
"Map119" (Carotos Mountain)
from Rejuvenation - Changed dialog for new spring location
- Updated to match
-
Map019 - Uncharted Cave (Route 2)
- Changed "Transfer Player" of event
(55|10)
to match the new"Map015" (Destroyed Village)
- Changed "Transfer Player" of event
-
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
- Updated to match
-
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 newThief's Stronghold
- Adds events
(23|33)
,(24|33)
&(25|33)
for connection to the newDestroyed Village
- New dialog for trying to go to
Thief's Stronghold
without checking on Taelia
- Updated to match
-
Map022 - Uncharted Woods (Route 3 Middle)
- Updated to match
"Map069" (Route 3)
from Rejuvenation
- Updated to match
-
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
- Updated to match
-
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
- Updated to match
-
Map025 - Thief's Stronghold (Inside)
- Fixed some spelling mistakes
- Edited event
(14|39)
for correct connection to the newThief's Stronghold
(Outside) - Edited event
(33|4), (45|4) & (41|7)
for correct connection to the newForest 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
- Updated to match
-
Map027 - Taelia's House
- Updated to match
"Map425 - Sheridan Village
from Rejuvenation - Updated "Transfer Player" commands
- Updated to match
-
Map028 - Forest Cliff (Hole)
- Updated to match
"Map424" (Sheridan Arena)
from Rejuvenation - Updated a few events to work with the environment
- Removed Capsule Key
- Updated to match
-
Map029 - Sheridan Village (Stage 2)
- Updated to match
"Map423" (Sheridan Village)
from Rejuvenation - Updated event
(35|28)
for new position
- Updated to match
-
Map030 - Sheridan Village (Stage 3)
- Updated to match
"Map423" (Sheridan Village)
from Rejuvenation - Updated event
(17|32)
for new position
- Updated to match
-
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
- Updated to match
-
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
- Updated to match
-
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
- Updated to match
-
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)
- Updated to match
-
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
- Updated to match
-
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
- Updated to match
-
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
- Updated to match
-
Map041 - Sensei's Garden
- Updated to match
"Map426" (Sensei's Garden)
from Rejuvenation
- Updated to match
-
Map042 - Amethyst Tunnels (Sheridan Entrance)
- Updated to match
"Map184" (Amethyst Cave)
from Rejuvenation
- Updated to match
-
Map043 - Amethyst Tunnels (Middle)
- Updated to match
"Map159" (Amethyst Cave)
&"Map161" (Amethyst Cave)
from Rejuvenation - Fixed a spelling mistake
- Updated to match
-
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)
- Updated to match
-
Map046 - Amethyst Dungeon (Broken Bridge)
- Fixes small inconsistency in event
(43|27)
- Fixes small inconsistency in event
-
Map049 - ??? (Amethyst Grotto)
- Updated to match
"Map488" (Amethyst Grotto)
from Rejuvenation - Updated event
(23|30)
for new position - Changed dialog for required soul count
- Updated to match
-
Map050 - Sensei's House (Before Fire)
- Updated to match
"Map7" (Sensei's House)
from Rejuvenation - Updated events
(9|12)
&(32|5)
for new positions
- Updated to match
-
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
- Updated to match
-
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)
- Updated to match
-
Map053 - Sheridan Arena (On Fire)
- Updated to match
"Map424" (Sheridan Arena)
from Rejuvenation - Updated event
(17|10)
for new position
- Updated to match
-
Map054 - Sheridan Arena (Cliff)
- Updated to match
"Map424" (Sheridan Arena)
from Rejuvenation - Updated event
(19|23)
for new position
- Updated to match
-
Map055 - Gearen City (Fire)
- Updated to match
"Map59" (East Gearen City)
from Rejuvenation - Fixed teleport in event
(24|33)
- Fixed a spelling mistake
- Updated to match
-
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)
- Place non-traversable rail at
- Updated to match
-
Map057 - Wispy Tower
- Updated to match
"Map102" (Wispy Tower)
from Rejuvenation (recolored some trees) - Fixed teleport in event
(16|42)
- Updated to match
-
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
- Updated to match
-
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)
- Fixed teleport in event
-
Map66 - Wedding Cutscene (Rebuilding)
- Updated to match
"Map424" (Sheridan Arena)
from Rejuvenation - Updated event
(20|9)
for new position
- Updated to match
-
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
- Updated to match
-
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
- Updated to match
-
Map069 - Sensei's Garden
- Updated to match
"Map426" (Sensei's Garden)
from Rejuvenation - Fixed teleport in event
(13|10)
- Fixed a spelling mistake
- Updated to match
-
Map070 - Sheridan Arena (Present Day)
- Updated to match
"Map424" (Sheridan Arena)
from Rejuvenation - Edited event
(19|11)
to make more sense with single door
- Updated to match
-
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)
- Updated to match
-
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)
- Updated to match
-
Map073 - Help Plaza
- Updated to match
"Map15" (Help Plaza)
from Rejuvenation - Updated event
(9|10)
for new position
- Updated to match
-
Map074 - Inner Workings (Broken Connection)
- Fixed a spelling mistake
-
Map075 - Sensei's House (Present - Sideroom)
- Updated to match
"Map7" (Sensei's House)
from Rejuvenation
- Updated to match
-
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)
- Improved returning to the mountain transition in event
-
Map083 - ??? (Madelis' Room)
- Updated to match
"Map34" (Xen Lounge)
from Rejuvenation - Fixed teleport in event
(12|8)
- Updated to match
-
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
- Updated to match
-
Map090 - Sheridan Village (Present - Current Version)
- Copied from
"Map423" (Sheridan Village)
from Rejuvenation
- Copied from
-
Map091 - Sheridan Arena (True Ending)
- Updated to match
"Map424" (Sheridan Arena)
from Rejuvenation
- Updated to match
-
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
- Updated to match
-
Map093 - My Memory
- Updated to match
"Map7" (Sensei's House)
from Rejuvenation - Updated event
(8|10)
for new position - Fixed a spelling mistake
- Updated to match
-
Map094 - Uncharted Field (Ending)
- Updated to match
"Map199" (Route 2)
from Rejuvenation
- Updated to match
-
Map113 - Uncharted Cave
- Added based on
Map133 (Gemstream Mine)
to have a way to the water in the newMap014 (Uncharted Field)
- Added music (same as
Uncharted Cave
) - Added encounters (combination of
Uncharted Cave
&Gemstream Mine (from Rejuvenation)
)
- Added based on
-
Map118 - Gemstream Mine
- Added based on
Map133 (Gemstream Mine)
to have a way to the tree in the newMap056 (Route 2)
- Edited event
(31|37)
because the exit is blocked - Added music (same as
Uncharted Cave
)
- Added based on
Autotiles
-
"DirtDark"
- Copy from Rejuvenation
-
"BurntGrassSheridan"
- Edited copy of
GrassSheridan
to match the actual floor
- Edited copy of
Battlebacks
- All are just copies from the corresponding ones from Rejuvenation
Characters
-
"HealBell"
- Copy from Rejuvenation
-
"MC_Aelita1"
- Copy of
Aelita
from Rejuvenation
- Copy of
-
"MC_Aelita2"
- Copy of
Aelita_7
from Rejuvenation
- Copy of
-
"MC_Anju"
- Copy of
trchar205
from Rejuvenation
- Copy of
-
"MC_Cella_1_Crying"
- Edited copy of
MC_Cella_1
- Edited copy of
-
"MC_Cella_2"
- Copy of
trchar069
from Rejuvenation
- Copy of
-
"MC_Cella3"
- Copy of
trchar069_4
from Rejuvenation
- Copy of
-
"MC_Cella_3_Crying"
- Edited copy of
trchar069_4
from Rejuvenation
- Edited copy of
-
"MC_Chasity2"
- Edited copy of
Venam's Mom
from Rejuvenation
- Edited copy of
-
"MC_Jan"
- Copy of
trchar220
from Rejuvenation
- Copy of
-
"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
- Edited copy of
-
"trback000_1", "trback002" & "trback003"
- Edited copy of
trback132
from Rejuvenation
- Edited copy of
-
"trback000"
- Edited copy of
trback000
from Where Love Lies to match the skintone ofTrainer133
and eyes fromtrback132
from Rejuvenation
- Edited copy of
-
"MC_Jan"
- Copy of
trchar220
from Rejuvenation
- Copy of
-
"MC_Madelis"
- Copy of
trchar079
from Rejuvenation
- Copy of
-
"MC_Nymiera"
- Copy of
trchar126
from Rejuvenation
- Copy of
-
"MC_Taelia_6_2"
- Sligthly edited copy of
MC_Taelia_6
with another crawling pose
- Sligthly edited copy of
-
"MC_Vivian"
- Copy of
trchar268
from Rejuvenation
- Copy of
-
"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
- Combination of different tiles from
-
"trainer006"
- Copy of
trainer012
from Rejuvenation
- Copy of
-
"trainer007"
- Copy of
trainer013
from Rejuvenation
- Copy of
-
"trainer010"
- Copy of
trainer018
from Rejuvenation
- Copy of
-
"trainer013"
- Copy of
trainer016
from Rejuvenation
- Copy of
-
"trainer015"
- Copy of
trainer019
from Rejuvenation
- Copy of
-
"trainer018"
- Copy of
trainer021
from Rejuvenation
- Copy of
-
"trainer020"
- Copy of
trainer022
from Rejuvenation
- Copy of
-
"trainer023"
- Copy of
trainer025
from Rejuvenation
- Copy of
-
"trainer025"
- Copy of
trainer023
from Rejuvenation
- Copy of
-
"trainer028"
- Copy of
trainer036
from Rejuvenation
- Copy of
-
"trainer031" & "trainer064"
- Copy of
trainer027
from Rejuvenation
- Copy of
-
"trainer032" & "trainer065"
- Copy of
trainer040
from Rejuvenation
- Copy of
-
"trainer033"
- Copy of
trainer041
from Rejuvenation
- Copy of
-
"trainer034"
- Copy of
trainer042
from Rejuvenation
- Copy of
-
"trainer035" & "trainer066"
- Copy of
trainer028
from Rejuvenation
- Copy of
-
"trainer036" & "trainer067"
- Copy of
trainer029
from Rejuvenation
- Copy of
-
"trainer037"
- Copy of
trainer024
from Rejuvenation
- Copy of
-
"trainer038"
- Copy of
trainer037
from Rejuvenation
- Copy of
-
"trainer039"
- Copy of
trainer038
from Rejuvenation
- Copy of
-
"trainer040"
- Copy of
trainer039
from Rejuvenation
- Copy of
-
"Trainer061"
- Copy of
Trainer154
from Rejuvenation
- Copy of
-
"trainer068"
- Copy of
trainer030
from Rejuvenation
- Copy of
-
"trchar006"
- Copy of
trchar020
from Rejuvenation
- Copy of
-
"trchar007", "trchar010", "trchar015", "trchar031", "trchar033", "trchar034", "trchar035", "trchar036", "trchar037", "trchar039", "trchar040"
- Copy from Rejuvenation
-
"trchar018" & "trchar026"
- Copy of
trchar018
from Rejuvenation
- Copy of
-
"trchar025_on_scaffold"
- Copy from different parts of
GearenCity Real
to create disappearing workers
- Copy from different parts of
-
"trchar020"
- Copy of
trchar006
from Rejuvenation
- Copy of
-
"trchar023"
- Copy of
trchar089_2
from Rejuvenation
- Copy of
-
"trchar028" & "trchar029"
- Copy of
trchar235
from Rejuvenation
- Copy of
-
"trchar032" & "trchar065"
- Copy of
trchar032
from Rejuvenation
- Copy of
-
"trchar038"
- Copy of
trchar021
from Rejuvenation
- Copy of
-
"trchar063"
- Copy of
trchar055_2
from Rejuvenation
- Copy of
-
"trchar067"
- Copy of
trchar112
from Rejuvenation
- Copy of
Icons
-
"menuSpiceScent"
- Edited copy of
iceheal
from Rejuvenation
- Edited copy of
-
All Others
- Copied from Rejuvenation
Panoramas
-
"hiddenforestbg"
- New images based on new
Hidden Forest
environment for"Cliffside Grave"
backdrop
- New images based on new
Pictures
Summary
-
"summary1", "summary2", "summary3", "summary4", "summary5", "summary5details", "summary5learning", "summaryEgg", "summaryShadow"
- Copied from Rejuvenation
-
"summary4learning"
- Copied from
"summary5learning"
from Rejuvenation
- Copied from
-
"summary1", "summary2", "summary3", "summary4", "summary5", "summary5details", "summary5learning", "summaryEgg", "summaryShadow"
Battle
-
All
- Copied from Rejuvenation
-
All
-
"CarvedTree"
- Slighly edited zoomed in copy of the chapter 2 intro image by Zumi
-
"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
- New images based on new
-
"TheEnd_3_Overhaul"
- New images based on new
"Map14" (Uncharted Field)
environment - Fixed alignment of text
- New images based on new
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
- Copied from
-
"Amethyst Grotto"
- Copied from
"Amethyst Grotto"
from Rejuvenation
- Copied from
-
"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
- Copied from
-
"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
- Updated
-
"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"
- Adds some rocks, ladders, crystals, entrances & rails for
-
"RoseTheatre"
- Copied selection from
"Grand Dream City Interiors"
from Rejuvenation
- Copied selection from
-
"Route 2_1"
- Adds trees from
"Route 2_new"
- Adds trees from
-
"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
- Copied from
-
"Route 3"
- Copied from
"Route 3"
from Rejuvenation - Added cutout version of default grass
- Copied from
-
"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
- Copied from
-
"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
- Copied from different parts of
Windowskins
-
All
- Copied from Rejuvenation
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 classGame_Player
was not canceled, because the file"Follower.rb"
overwrote the methodpbEndSurf
, 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
todef self.new_snap_to_bitmap
inSpriteResizer.rb
Explanation of the Bug:
The method fromSprite 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 thesnap_to_bitmap
function. The standalone game on the other hand does not provide this method by itself. Therefore the fix tries using theSpriteResizer
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) }
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)"
- Removed connection between
-
"MapInfos.rxdata"
- Added name & parent map for
"Map113" (Uncharted Cave)"
- Added name & parent map for
"Map118" (Gemstream Mine)"
- Added name & parent map for
-
"metadata.dat"
- Added metadata for
"Map113" (Uncharted Cave)"
- Added metadata for
"Map118" (Gemstream Mine)"
- Added metadata for
-
"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
Maps
-
Map294 - Central Building
- Edited event
(10|8)
for the reward check (password or auto)
- Edited event
-
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
- Updated to match
Pictures
-
"AelitaMemory1"
- Updated to match
"Map14" (Uncharted Field)
from Where Love Lies
- Updated to match
-
"flashback_WWL1"
- Updated to match
"Map2" (Gearen City)
from Where Love Lies
- Updated to match
-
"flashback_WLL4"
- Updated to match
"Map54" (Sheridan Arena)
from Where Love Lies
- Updated to match
Tilesets
-
"Aelita_rift_2"
- Copied from
"Aelita_rift"
from Rejuvenation - Replaced tiles of house and rooms
- Copied from
Data
-
"Tilesets.rxdata"
- Contains all meta information concerning the tilemaps