summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--constants/event_flags.asm2
-rw-r--r--main.asm13
-rw-r--r--maps/BlackthornCity.asm341
-rw-r--r--maps/EcruteakCity.asm265
-rw-r--r--maps/LakeOfRage.asm522
-rw-r--r--maps/MahoganyTown.asm268
-rw-r--r--maps/OlivineCity.asm306
7 files changed, 1709 insertions, 8 deletions
diff --git a/constants/event_flags.asm b/constants/event_flags.asm
index 613ebfac..77f3773f 100644
--- a/constants/event_flags.asm
+++ b/constants/event_flags.asm
@@ -1672,7 +1672,7 @@
const EVENT_CHIKORITA_POKEBALL_IN_ELMS_LAB
const EVENT_VIOLET_CITY_PP_UP
const EVENT_VIOLET_CITY_RARE_CANDY
- const EVENT_LAKE_OF_RAGE_ELIXER
+ const EVENT_LAKE_OF_RAGE_MAX_ETHER
const EVENT_LAKE_OF_RAGE_TM_DETECT
const EVENT_SPROUT_TOWER1F_PARLYZ_HEAL
const EVENT_SPROUT_TOWER2F_X_ACCURACY
diff --git a/main.asm b/main.asm
index f0304205..5969b083 100644
--- a/main.asm
+++ b/main.asm
@@ -1628,13 +1628,12 @@ INCLUDE "maps/CianwoodCity.asm"
INCLUDE "maps/GoldenrodCity.asm"
SECTION "bank49", ROMX, BANK[$49]
-;INCLUDE "maps/OlivineCity.asm"
-;INCLUDE "maps/EcruteakCity.asm"
-;INCLUDE "maps/MahoganyTown.asm"
-;INCLUDE "maps/LakeOfRage.asm"
-;INCLUDE "maps/BlackthornCity.asm"
-;INCLUDE "maps/MountSilver.asm"
- dr $124000, $128000
+INCLUDE "maps/OlivineCity.asm"
+INCLUDE "maps/EcruteakCity.asm"
+INCLUDE "maps/MahoganyTown.asm"
+INCLUDE "maps/LakeOfRage.asm"
+INCLUDE "maps/BlackthornCity.asm"
+INCLUDE "maps/SilverCaveOutside.asm"
SECTION "bank4a", ROMX, BANK[$4a]
INCLUDE "maps/Route26.asm"
diff --git a/maps/BlackthornCity.asm b/maps/BlackthornCity.asm
new file mode 100644
index 00000000..a31adb4a
--- /dev/null
+++ b/maps/BlackthornCity.asm
@@ -0,0 +1,341 @@
+ const_def 2 ; object constants
+ const BLACKTHORNCITY_SUPER_NERD1
+ const BLACKTHORNCITY_SUPER_NERD2
+ const BLACKTHORNCITY_GRAMPS1
+ const BLACKTHORNCITY_GRAMPS2
+ const BLACKTHORNCITY_BLACK_BELT
+ const BLACKTHORNCITY_COOLTRAINER_F1
+ const BLACKTHORNCITY_YOUNGSTER1
+ const BLACKTHORNCITY_SANTOS
+ const BLACKTHORNCITY_COOLTRAINER_F2
+
+BlackthornCity_MapScripts:
+ db 0 ; scene scripts
+
+ db 2 ; callbacks
+ callback MAPCALLBACK_NEWMAP, .FlyPoint
+ callback MAPCALLBACK_OBJECTS, .Santos
+
+.FlyPoint:
+ setflag ENGINE_FLYPOINT_BLACKTHORN
+ return
+
+.Santos:
+ checkcode VAR_WEEKDAY
+ ifequal SATURDAY, .SantosAppears
+ disappear BLACKTHORNCITY_SANTOS
+ return
+
+.SantosAppears:
+ appear BLACKTHORNCITY_SANTOS
+ return
+
+BlackthornSuperNerdScript:
+ faceplayer
+ opentext
+ checkevent EVENT_BEAT_CLAIR
+ iftrue .BeatClair
+ checkevent EVENT_CLEARED_RADIO_TOWER
+ iftrue .ClearedRadioTower
+ writetext Text_ClairIsOut
+ waitbutton
+ closetext
+ end
+
+.ClearedRadioTower:
+ writetext Text_ClairIsIn
+ waitbutton
+ closetext
+ end
+
+.BeatClair:
+ writetext Text_ClairIsBeaten
+ waitbutton
+ closetext
+ end
+
+BlackthornGramps1Script:
+ jumptextfaceplayer BlackthornGrampsRefusesEntryText
+
+BlackthornGramps2Script:
+ jumptextfaceplayer BlackthornGrampsGrantsEntryText
+
+BlackthornBlackBeltScript:
+ faceplayer
+ opentext
+ checkevent EVENT_CLEARED_RADIO_TOWER
+ iftrue .ClearedRadioTower
+ writetext BlackBeltText_WeirdRadio
+ waitbutton
+ closetext
+ end
+
+.ClearedRadioTower:
+ writetext BlackBeltText_VoicesInMyHead
+ waitbutton
+ closetext
+ end
+
+BlackthornCooltrainerF1Script:
+ jumptextfaceplayer BlackthornCooltrainerF1Text
+
+BlackthornYoungsterScript:
+ jumptextfaceplayer BlackthornYoungsterText
+
+BlackthornCooltrainerF2Script:
+ jumptextfaceplayer BlackthornCooltrainerF2Text
+
+SantosScript:
+ faceplayer
+ opentext
+ checkevent EVENT_GOT_SPELL_TAG_FROM_SANTOS
+ iftrue .Saturday
+ checkcode VAR_WEEKDAY
+ ifnotequal SATURDAY, .NotSaturday
+ checkevent EVENT_MET_SANTOS_OF_SATURDAY
+ iftrue .MetSantos
+ writetext MeetSantosText
+ buttonsound
+ setevent EVENT_MET_SANTOS_OF_SATURDAY
+.MetSantos:
+ writetext SantosGivesGiftText
+ buttonsound
+ verbosegiveitem SPELL_TAG
+ iffalse .Done
+ setevent EVENT_GOT_SPELL_TAG_FROM_SANTOS
+ writetext SantosGaveGiftText
+ waitbutton
+ closetext
+ end
+
+.Saturday:
+ writetext SantosSaturdayText
+ waitbutton
+.Done:
+ closetext
+ end
+
+.NotSaturday:
+ writetext SantosNotSaturdayText
+ waitbutton
+ closetext
+ end
+
+BlackthornCitySign:
+ jumptext BlackthornCitySignText
+
+BlackthornGymSign:
+ jumptext BlackthornGymSignText
+
+MoveDeletersHouseSign:
+ jumptext MoveDeletersHouseSignText
+
+DragonDensSign:
+ jumptext DragonDensSignText
+
+BlackthornCityTrainerTips:
+ jumptext BlackthornCityTrainerTipsText
+
+BlackthornCityPokecenterSign:
+ jumpstd pokecentersign
+
+BlackthornCityMartSign:
+ jumpstd martsign
+
+Text_ClairIsOut:
+ text "I am sorry."
+
+ para "Our GYM LEADER is"
+ line "training in the"
+ cont "cave behind here."
+
+ para "I have no idea"
+ line "when our LEADER"
+ cont "will return."
+ done
+
+Text_ClairIsIn:
+ text "Our GYM LEADER is"
+ line "waiting for you."
+
+ para "However, it would"
+ line "be impossible for"
+
+ para "a run-of-the-mill"
+ line "trainer to win."
+ done
+
+Text_ClairIsBeaten:
+ text "You defeated our"
+ line "GYM LEADER?"
+ cont "That's amazing!"
+
+ para "With your power,"
+ line "you should succeed"
+
+ para "in the #MON"
+ line "LEAGUE."
+ done
+
+BlackthornGrampsRefusesEntryText:
+ text "Only dragon users"
+ line "are permitted to"
+
+ para "train here."
+ line "Please leave."
+ done
+
+BlackthornGrampsGrantsEntryText:
+ text "Since CLAIR, the"
+ line "dragon master, has"
+
+ para "allowed it, you"
+ line "may enter."
+ done
+
+BlackBeltText_WeirdRadio:
+ text "My radio's busted?"
+ line "Lately, I only get"
+ cont "this weird signal."
+ done
+
+BlackBeltText_VoicesInMyHead:
+ text "Arooo! Voices in"
+ line "my head!"
+
+ para "Huh? I'm listening"
+ line "to my radio!"
+ done
+
+BlackthornCooltrainerF1Text:
+ text "Are you going to"
+ line "make your #MON"
+ cont "forget some moves?"
+ done
+
+BlackthornYoungsterText:
+ text "I'm going to be a"
+ line "dragon user like"
+ cont "CLAIR."
+ done
+
+MeetSantosText:
+ text "SANTOS: …"
+
+ para "It's Saturday…"
+
+ para "I'm SANTOS of"
+ line "Saturday…"
+ done
+
+SantosGivesGiftText:
+ text "You can have this…"
+ done
+
+SantosGaveGiftText:
+ text "SANTOS: …"
+
+ para "SPELL TAG…"
+
+ para "Ghost-type moves"
+ line "get stronger…"
+
+ para "It will frighten"
+ line "you…"
+ done
+
+SantosSaturdayText:
+ text "SANTOS: …"
+
+ para "See you again on"
+ line "another Saturday…"
+
+ para "I won't have any"
+ line "more gifts…"
+ done
+
+SantosNotSaturdayText:
+ text "SANTOS: Today's"
+ line "not Saturday…"
+ done
+
+BlackthornCooltrainerF2Text:
+ text "Wow, you came"
+ line "through the ICE"
+ cont "PATH?"
+
+ para "You must be a real"
+ line "hotshot trainer!"
+ done
+
+BlackthornCitySignText:
+ text "BLACKTHORN CITY"
+
+ para "A Quiet Mountain"
+ line "Retreat"
+ done
+
+BlackthornGymSignText:
+ text "BLACKTHORN CITY"
+ line "#MON GYM"
+ cont "LEADER: CLAIR"
+
+ para "The Blessed User"
+ line "of Dragon #MON"
+ done
+
+MoveDeletersHouseSignText:
+ text "MOVE DELETER'S"
+ line "HOUSE"
+ done
+
+DragonDensSignText:
+ text "DRAGON'S DEN"
+ line "AHEAD"
+ done
+
+BlackthornCityTrainerTipsText:
+ text "TRAINER TIPS"
+
+ para "A #MON holding"
+ line "a MIRACLEBERRY"
+
+ para "will cure itself"
+ line "of any status"
+ cont "problem."
+ done
+
+BlackthornCity_MapEvents:
+ db 0, 0 ; filler
+
+ db 8 ; warp events
+ warp_event 18, 11, BLACKTHORN_GYM_1F, 1
+ warp_event 13, 21, BLACKTHORN_DRAGON_SPEECH_HOUSE, 1
+ warp_event 29, 23, BLACKTHORN_EMYS_HOUSE, 1
+ warp_event 15, 29, BLACKTHORN_MART, 2
+ warp_event 21, 29, BLACKTHORN_POKECENTER_1F, 1
+ warp_event 9, 31, MOVE_DELETERS_HOUSE, 1
+ warp_event 36, 9, ICE_PATH_1F, 2
+ warp_event 20, 1, DRAGONS_DEN_1F, 1
+
+ db 0 ; coord events
+
+ db 7 ; bg events
+ bg_event 34, 24, BGEVENT_READ, BlackthornCitySign
+ bg_event 17, 13, BGEVENT_READ, BlackthornGymSign
+ bg_event 7, 31, BGEVENT_READ, MoveDeletersHouseSign
+ bg_event 21, 3, BGEVENT_READ, DragonDensSign
+ bg_event 5, 25, BGEVENT_READ, BlackthornCityTrainerTips
+ bg_event 16, 29, BGEVENT_READ, BlackthornCityMartSign
+ bg_event 22, 29, BGEVENT_READ, BlackthornCityPokecenterSign
+
+ db 9 ; object events
+ object_event 18, 12, SPRITE_SUPER_NERD, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_RED, OBJECTTYPE_SCRIPT, 0, BlackthornSuperNerdScript, EVENT_BLACKTHORN_CITY_SUPER_NERD_BLOCKS_GYM
+ object_event 19, 12, SPRITE_SUPER_NERD, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_RED, OBJECTTYPE_SCRIPT, 0, BlackthornSuperNerdScript, EVENT_BLACKTHORN_CITY_SUPER_NERD_DOES_NOT_BLOCK_GYM
+ object_event 20, 2, SPRITE_GRAMPS, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, BlackthornGramps1Script, EVENT_BLACKTHORN_CITY_GRAMPS_BLOCKS_DRAGONS_DEN
+ object_event 21, 2, SPRITE_GRAMPS, SPRITEMOVEDATA_STANDING_LEFT, 0, 0, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, BlackthornGramps2Script, EVENT_BLACKTHORN_CITY_GRAMPS_NOT_BLOCKING_DRAGONS_DEN
+ object_event 24, 31, SPRITE_BLACK_BELT, SPRITEMOVEDATA_WALK_LEFT_RIGHT, 1, 0, -1, -1, PAL_NPC_BLUE, OBJECTTYPE_SCRIPT, 0, BlackthornBlackBeltScript, -1
+ object_event 9, 25, SPRITE_COOLTRAINER_F, SPRITEMOVEDATA_WALK_LEFT_RIGHT, 2, 0, -1, -1, PAL_NPC_RED, OBJECTTYPE_SCRIPT, 0, BlackthornCooltrainerF1Script, -1
+ object_event 13, 15, SPRITE_YOUNGSTER, SPRITEMOVEDATA_WALK_LEFT_RIGHT, 1, 0, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, BlackthornYoungsterScript, -1
+ object_event 22, 20, SPRITE_YOUNGSTER, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, SantosScript, EVENT_BLACKTHORN_CITY_SANTOS_OF_SATURDAY
+ object_event 35, 19, SPRITE_COOLTRAINER_F, SPRITEMOVEDATA_STANDING_UP, 0, 0, -1, -1, PAL_NPC_GREEN, OBJECTTYPE_SCRIPT, 0, BlackthornCooltrainerF2Script, -1
diff --git a/maps/EcruteakCity.asm b/maps/EcruteakCity.asm
new file mode 100644
index 00000000..57be1eb4
--- /dev/null
+++ b/maps/EcruteakCity.asm
@@ -0,0 +1,265 @@
+ const_def 2 ; object constants
+ const ECRUTEAKCITY_GRAMPS1
+ const ECRUTEAKCITY_GRAMPS2
+ const ECRUTEAKCITY_LASS1
+ const ECRUTEAKCITY_LASS2
+ const ECRUTEAKCITY_FISHER
+ const ECRUTEAKCITY_YOUNGSTER
+ const ECRUTEAKCITY_GRAMPS3
+
+EcruteakCity_MapScripts:
+ db 0 ; scene scripts
+
+ db 1 ; callbacks
+ callback MAPCALLBACK_NEWMAP, .FlyPoint
+
+.FlyPoint:
+ setflag ENGINE_FLYPOINT_ECRUTEAK
+ return
+
+EcruteakCityGramps1Script:
+ jumptextfaceplayer EcruteakCityGramps1Text
+
+EcruteakCityGramps2Script:
+ jumptextfaceplayer EcruteakCityGramps2Text
+
+EcruteakCityLass1Script:
+ jumptextfaceplayer EcruteakCityLass1Text
+
+EcruteakCityLass2Script:
+ faceplayer
+ opentext
+ checkevent EVENT_RELEASED_THE_BEASTS
+ iftrue .ReleasedBeasts
+ writetext EcruteakCityLass2Text
+ waitbutton
+ closetext
+ end
+
+.ReleasedBeasts:
+ writetext EcruteakCityLass2Text_ReleasedBeasts
+ waitbutton
+ closetext
+ end
+
+EcruteakCityFisherScript:
+ faceplayer
+ opentext
+ checkevent EVENT_JASMINE_RETURNED_TO_GYM
+ iftrue .JasmineReturned
+ writetext EcruteakCityFisherText
+ waitbutton
+ closetext
+ end
+
+.JasmineReturned:
+ writetext EcruteakCityFisherText_JasmineReturned
+ waitbutton
+ closetext
+ end
+
+EcruteakCityYoungsterScript:
+ jumptextfaceplayer EcruteakCityYoungsterText
+
+EcruteakCitySign:
+ jumptext EcruteakCitySignText
+
+TinTowerSign:
+ jumptext TinTowerSignText
+
+EcruteakGymSign:
+ jumptext EcruteakGymSignText
+
+EcruteakDanceTheaterSign:
+ jumptext EcruteakDanceTheaterSignText
+
+BurnedTowerSign:
+ jumptext BurnedTowerSignText
+
+EcruteakCityPokecenterSign:
+ jumpstd pokecentersign
+
+EcruteakCityMartSign:
+ jumpstd martsign
+
+EcruteakCityHiddenHyperPotion:
+ hiddenitem HYPER_POTION, EVENT_ECRUTEAK_CITY_HIDDEN_HYPER_POTION
+
+UnusedMissingDaughterText:
+; unused
+ text "Oh, no. Oh, no…"
+
+ para "My daughter is"
+ line "missing."
+
+ para "No… She couldn't"
+ line "have gone to the"
+ cont "BURNED TOWER."
+
+ para "I told her not to"
+ line "go near it…"
+
+ para "People seem to"
+ line "disappear there…"
+
+ para "Oh, what should I"
+ line "do…?"
+ done
+
+EcruteakCityGramps1Text:
+ text "ECRUTEAK used to"
+ line "have two towers:"
+
+ para "one each in the"
+ line "east and west."
+ done
+
+EcruteakCityGramps2Text:
+ text "Ah, youngster."
+ line "Have you learned"
+
+ para "to dance like the"
+ line "KIMONO GIRLS?"
+
+ para "If you go to their"
+ line "DANCE THEATER, an"
+
+ para "odd old man will"
+ line "give you something"
+ cont "nice, I hear."
+ done
+
+EcruteakCityLass1Text:
+ text "I'm going to prac-"
+ line "tice at the DANCE"
+
+ para "THEATER. Care to"
+ line "join me?"
+ done
+
+EcruteakCityLass2Text:
+ text "That used to be a"
+ line "much taller tower,"
+
+ para "but it burned down"
+ line "in a fire."
+ done
+
+EcruteakCityLass2Text_ReleasedBeasts:
+ text "Three big #MON"
+ line "ran off in differ-"
+ cont "ent directions."
+ cont "What were they?"
+ done
+
+EcruteakCityFisherText:
+ text "I heard a rumor"
+ line "about OLIVINE"
+ cont "LIGHTHOUSE."
+
+ para "The #MON that"
+ line "serves as the"
+
+ para "beacon fell ill."
+ line "Sounds like they"
+ cont "are in trouble."
+ done
+
+EcruteakCityFisherText_JasmineReturned:
+ text "The #MON at"
+ line "OLIVINE LIGHTHOUSE"
+ cont "has been cured."
+
+ para "Boats can safely"
+ line "sail out to sea at"
+ cont "night again."
+ done
+
+EcruteakCityYoungsterText:
+ text "I hear #MON are"
+ line "rampaging at the"
+
+ para "LAKE OF RAGE. I'd"
+ line "like to see that."
+ done
+
+EcruteakCitySignText:
+ text "ECRUTEAK CITY"
+ line "A Historical City"
+
+ para "Where the Past"
+ line "Meets the Present"
+ done
+
+TinTowerSignText:
+ text "TIN TOWER"
+
+ para "A legendary #-"
+ line "MON is said to"
+ cont "roost here."
+ done
+
+EcruteakGymSignText:
+ text "ECRUTEAK CITY"
+ line "#MON GYM"
+ cont "LEADER: MORTY"
+
+ para "The Mystic Seer of"
+ line "the Future"
+ done
+
+EcruteakDanceTheaterSignText:
+ text "ECRUTEAK DANCE"
+ line "THEATER"
+ done
+
+BurnedTowerSignText:
+ text "BURNED TOWER"
+
+ para "It was destroyed"
+ line "by a mysterious"
+ cont "fire."
+
+ para "Please stay away,"
+ line "as it is unsafe."
+ done
+
+EcruteakCity_MapEvents:
+ db 0, 0 ; filler
+
+ db 15 ; warp events
+ warp_event 35, 26, ROUTE_42_ECRUTEAK_GATE, 1
+ warp_event 35, 27, ROUTE_42_ECRUTEAK_GATE, 2
+ warp_event 18, 11, ECRUTEAK_TIN_TOWER_ENTRANCE, 1
+ warp_event 20, 2, WISE_TRIOS_ROOM, 1
+ warp_event 20, 3, WISE_TRIOS_ROOM, 2
+ warp_event 23, 27, ECRUTEAK_POKECENTER_1F, 1
+ warp_event 5, 21, ECRUTEAK_LUGIA_SPEECH_HOUSE, 1
+ warp_event 23, 21, DANCE_THEATRE, 1
+ warp_event 29, 21, ECRUTEAK_MART, 2
+ warp_event 6, 27, ECRUTEAK_GYM, 1
+ warp_event 13, 27, ECRUTEAK_ITEMFINDER_HOUSE, 1
+ warp_event 37, 7, TIN_TOWER_1F, 1
+ warp_event 5, 5, BURNED_TOWER_1F, 1
+ warp_event 0, 18, ROUTE_38_ECRUTEAK_GATE, 3
+ warp_event 0, 19, ROUTE_38_ECRUTEAK_GATE, 4
+
+ db 0 ; coord events
+
+ db 8 ; bg events
+ bg_event 15, 21, BGEVENT_READ, EcruteakCitySign
+ bg_event 38, 10, BGEVENT_READ, TinTowerSign
+ bg_event 8, 28, BGEVENT_READ, EcruteakGymSign
+ bg_event 21, 21, BGEVENT_READ, EcruteakDanceTheaterSign
+ bg_event 2, 10, BGEVENT_READ, BurnedTowerSign
+ bg_event 24, 27, BGEVENT_READ, EcruteakCityPokecenterSign
+ bg_event 30, 21, BGEVENT_READ, EcruteakCityMartSign
+ bg_event 23, 14, BGEVENT_ITEM, EcruteakCityHiddenHyperPotion
+
+ db 6 ; object events
+ object_event 18, 15, SPRITE_GRAMPS, SPRITEMOVEDATA_WANDER, 1, 1, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, EcruteakCityGramps1Script, -1
+ object_event 20, 21, SPRITE_GRAMPS, SPRITEMOVEDATA_SPINRANDOM_SLOW, 0, 0, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, EcruteakCityGramps2Script, -1
+ object_event 21, 29, SPRITE_LASS, SPRITEMOVEDATA_WALK_LEFT_RIGHT, 2, 0, -1, -1, PAL_NPC_BLUE, OBJECTTYPE_SCRIPT, 0, EcruteakCityLass1Script, -1
+ object_event 3, 9, SPRITE_LASS, SPRITEMOVEDATA_STANDING_UP, 0, 0, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, EcruteakCityLass2Script, -1
+ object_event 9, 22, SPRITE_FISHER, SPRITEMOVEDATA_WALK_LEFT_RIGHT, 1, 0, -1, -1, PAL_NPC_GREEN, OBJECTTYPE_SCRIPT, 0, EcruteakCityFisherScript, -1
+ object_event 10, 14, SPRITE_YOUNGSTER, SPRITEMOVEDATA_WANDER, 1, 1, -1, -1, PAL_NPC_RED, OBJECTTYPE_SCRIPT, 0, EcruteakCityYoungsterScript, -1
diff --git a/maps/LakeOfRage.asm b/maps/LakeOfRage.asm
new file mode 100644
index 00000000..892d1f0e
--- /dev/null
+++ b/maps/LakeOfRage.asm
@@ -0,0 +1,522 @@
+ const_def 2 ; object constants
+ const LAKEOFRAGE_LANCE
+ const LAKEOFRAGE_GRAMPS
+ const LAKEOFRAGE_SUPER_NERD1
+ const LAKEOFRAGE_COOLTRAINER_F1
+ const LAKEOFRAGE_FISHER1
+ const LAKEOFRAGE_FISHER2
+ const LAKEOFRAGE_COOLTRAINER_M
+ const LAKEOFRAGE_COOLTRAINER_F2
+ const LAKEOFRAGE_GYARADOS
+ const LAKEOFRAGE_WESLEY
+ const LAKEOFRAGE_POKE_BALL1
+ const LAKEOFRAGE_POKE_BALL2
+
+LakeOfRage_MapScripts:
+ db 2 ; scene scripts
+ scene_script .DummyScene0 ; unusable
+ scene_script .DummyScene1 ; unusable
+
+ db 2 ; callbacks
+ callback MAPCALLBACK_NEWMAP, .FlyPoint
+ callback MAPCALLBACK_OBJECTS, .Wesley
+
+.DummyScene0:
+ end
+
+.DummyScene1:
+ end
+
+.FlyPoint:
+ setflag ENGINE_FLYPOINT_LAKE_OF_RAGE
+ return
+
+.Wesley:
+ checkcode VAR_WEEKDAY
+ ifequal WEDNESDAY, .WesleyAppears
+ disappear LAKEOFRAGE_WESLEY
+ return
+
+.WesleyAppears:
+ appear LAKEOFRAGE_WESLEY
+ return
+
+LakeOfRageLanceScript:
+ checkevent EVENT_REFUSED_TO_HELP_LANCE_AT_LAKE_OF_RAGE
+ iftrue .AskAgainForHelp
+ opentext
+ writetext UnknownText_0x70157
+ buttonsound
+ faceplayer
+ writetext UnknownText_0x701b4
+ yesorno
+ iffalse .RefusedToHelp
+.AgreedToHelp:
+ writetext UnknownText_0x702c6
+ waitbutton
+ closetext
+ playsound SFX_WARP_TO
+ applymovement LAKEOFRAGE_LANCE, MovementData_0x70155
+ disappear LAKEOFRAGE_LANCE
+ clearevent EVENT_MAHOGANY_MART_LANCE_AND_DRAGONITE
+ setevent EVENT_DECIDED_TO_HELP_LANCE
+ setmapscene MAHOGANY_MART_1F, SCENE_MAHOGANYMART1F_LANCE_UNCOVERS_STAIRS
+ end
+
+.RefusedToHelp:
+ writetext UnknownText_0x70371
+ waitbutton
+ closetext
+ setevent EVENT_REFUSED_TO_HELP_LANCE_AT_LAKE_OF_RAGE
+ end
+
+.AskAgainForHelp:
+ faceplayer
+ opentext
+ writetext UnknownText_0x703a5
+ yesorno
+ iffalse .RefusedToHelp
+ jump .AgreedToHelp
+
+RedGyarados:
+ opentext
+ writetext UnknownText_0x703cb
+ pause 15
+ cry GYARADOS
+ closetext
+ loadwildmon GYARADOS, 30
+ writecode VAR_BATTLETYPE, BATTLETYPE_SHINY
+ startbattle
+ ifequal $1, .NotBeaten
+ disappear LAKEOFRAGE_GYARADOS
+.NotBeaten:
+ reloadmapafterbattle
+ opentext
+ giveitem RED_SCALE
+ waitsfx
+ writetext UnknownText_0x703df
+ playsound SFX_ITEM
+ waitsfx
+ itemnotify
+ closetext
+ setscene 0 ; Lake of Rage does not have a scene variable
+ appear LAKEOFRAGE_LANCE
+ end
+
+LakeOfRageGrampsScript:
+ faceplayer
+ opentext
+ checkevent EVENT_CLEARED_ROCKET_HIDEOUT
+ iftrue .ClearedRocketHideout
+ writetext LakeOfRageGrampsText
+ waitbutton
+ closetext
+ end
+
+.ClearedRocketHideout:
+ writetext LakeOfRageGrampsText_ClearedRocketHideout
+ waitbutton
+ closetext
+ end
+
+LakeOfRageSuperNerdScript:
+ jumptextfaceplayer LakeOfRageSuperNerdText
+
+LakeOfRageCooltrainerFScript:
+ jumptextfaceplayer LakeOfRageCooltrainerFText
+
+LakeOfRageSign:
+ jumptext LakeOfRageSignText
+
+MagikarpHouseSignScript:
+ opentext
+ writetext FishingGurusHouseSignText
+ checkevent EVENT_CLEARED_ROCKET_HIDEOUT
+ iftrue .MagikarpLengthRecord
+ waitbutton
+ closetext
+ end
+
+.MagikarpLengthRecord:
+ buttonsound
+ special MagikarpHouseSign
+ closetext
+ end
+
+TrainerFisherAndre:
+ trainer FISHER, ANDRE, EVENT_BEAT_FISHER_ANDRE, FisherAndreSeenText, FisherAndreBeatenText, 0, .Script
+
+.Script:
+ endifjustbattled
+ opentext
+ writetext FisherAndreAfterBattleText
+ waitbutton
+ closetext
+ end
+
+TrainerFisherRaymond:
+ trainer FISHER, RAYMOND, EVENT_BEAT_FISHER_RAYMOND, FisherRaymondSeenText, FisherRaymondBeatenText, 0, .Script
+
+.Script:
+ endifjustbattled
+ opentext
+ writetext FisherRaymondAfterBattleText
+ waitbutton
+ closetext
+ end
+
+TrainerCooltrainermAaron:
+ trainer COOLTRAINERM, AARON, EVENT_BEAT_COOLTRAINERM_AARON, CooltrainermAaronSeenText, CooltrainermAaronBeatenText, 0, .Script
+
+.Script:
+ endifjustbattled
+ opentext
+ writetext CooltrainermAaronAfterBattleText
+ waitbutton
+ closetext
+ end
+
+TrainerCooltrainerfLois:
+ trainer COOLTRAINERF, LOIS, EVENT_BEAT_COOLTRAINERF_LOIS, CooltrainerfLoisSeenText, CooltrainerfLoisBeatenText, 0, .Script
+
+.Script:
+ endifjustbattled
+ opentext
+ writetext CooltrainerfLoisAfterBattleText
+ waitbutton
+ closetext
+ end
+
+WesleyScript:
+ faceplayer
+ opentext
+ checkevent EVENT_GOT_BLACKBELT_FROM_WESLEY
+ iftrue WesleyWednesdayScript
+ checkcode VAR_WEEKDAY
+ ifnotequal WEDNESDAY, WesleyNotWednesdayScript
+ checkevent EVENT_MET_WESLEY_OF_WEDNESDAY
+ iftrue .MetWesley
+ writetext MeetWesleyText
+ buttonsound
+ setevent EVENT_MET_WESLEY_OF_WEDNESDAY
+.MetWesley:
+ writetext WesleyGivesGiftText
+ buttonsound
+ verbosegiveitem BLACKBELT
+ iffalse WesleyDoneScript
+ setevent EVENT_GOT_BLACKBELT_FROM_WESLEY
+ writetext WesleyGaveGiftText
+ waitbutton
+ closetext
+ end
+
+WesleyWednesdayScript:
+ writetext WesleyWednesdayText
+ waitbutton
+WesleyDoneScript:
+ closetext
+ end
+
+WesleyNotWednesdayScript:
+ writetext WesleyNotWednesdayText
+ waitbutton
+ closetext
+ end
+
+LakeOfRageMaxEther:
+ itemball MAX_ETHER
+
+LakeOfRageTMDetect:
+ itemball TM_DETECT
+
+LakeOfRageHiddenFullRestore:
+ hiddenitem FULL_RESTORE, EVENT_LAKE_OF_RAGE_HIDDEN_FULL_RESTORE
+
+LakeOfRageHiddenRareCandy:
+ hiddenitem RARE_CANDY, EVENT_LAKE_OF_RAGE_HIDDEN_RARE_CANDY
+
+LakeOfRageHiddenMaxPotion:
+ hiddenitem MAX_POTION, EVENT_LAKE_OF_RAGE_HIDDEN_MAX_POTION
+
+MovementData_0x70155:
+ teleport_from
+ step_end
+
+UnknownText_0x70157:
+ text "This lake is full"
+ line "of GYARADOS but"
+ cont "nothing else…"
+
+ para "So the MAGIKARP"
+ line "are being forced"
+ cont "to evolve…"
+ done
+
+UnknownText_0x701b4:
+ text "Did you come here"
+ line "because of the"
+ cont "rumors?"
+
+ para "You're <PLAYER>?"
+ line "I'm LANCE, a"
+ cont "trainer like you."
+
+ para "I heard some ru-"
+ line "mors, so I came to"
+ cont "investigate…"
+
+ para "I saw the way you"
+ line "battled earlier,"
+ cont "<PLAYER>."
+
+ para "I can tell that"
+ line "you're a trainer"
+
+ para "with considerable"
+ line "skill."
+
+ para "If you don't mind,"
+ line "could you help me"
+ cont "investigate?"
+ done
+
+UnknownText_0x702c6:
+ text "LANCE: Excellent!"
+
+ para "It seems that the"
+ line "LAKE's MAGIKARP"
+
+ para "are being forced"
+ line "to evolve."
+
+ para "A mysterious radio"
+ line "broadcast coming"
+
+ para "from MAHOGANY is"
+ line "the cause."
+
+ para "I'll be waiting"
+ line "for you, <PLAYER>."
+ done
+
+UnknownText_0x70371:
+ text "Oh… Well, if you"
+ line "change your mind,"
+ cont "please help me."
+ done
+
+UnknownText_0x703a5:
+ text "LANCE: Hm? Are you"
+ line "going to help me?"
+ done
+
+UnknownText_0x703cb:
+ text "GYARADOS: Gyashaa!"
+ done
+
+UnknownText_0x703df:
+ text "<PLAYER> obtained a"
+ line "RED SCALE."
+ done
+
+LakeOfRageGrampsText:
+ text "The GYARADOS are"
+ line "angry!"
+
+ para "It's a bad omen!"
+ done
+
+LakeOfRageGrampsText_ClearedRocketHideout:
+ text "Hahah! The MAGI-"
+ line "KARP are biting!"
+ done
+
+LakeOfRageSuperNerdText:
+ text "I heard this lake"
+ line "was made by ram-"
+ cont "paging GYARADOS."
+
+ para "I wonder if there"
+ line "is any connection"
+
+ para "to their mass out-"
+ line "break now?"
+ done
+
+LakeOfRageCooltrainerFText:
+ text "Did my eyes de-"
+ line "ceive me? I saw a"
+
+ para "red GYARADOS in"
+ line "the LAKE…"
+
+ para "But I thought"
+ line "GYARADOS were"
+ cont "usually blue?"
+ done
+
+FisherAndreSeenText:
+ text "Let me battle with"
+ line "the #MON I just"
+ cont "caught!"
+ done
+
+FisherAndreBeatenText:
+ text "I might be an ex-"
+ line "pert angler, but"
+
+ para "I stink as a #-"
+ line "MON trainer…"
+ done
+
+FisherAndreAfterBattleText:
+ text "I won't lose as an"
+ line "angler! I catch"
+ cont "#MON all day."
+ done
+
+FisherRaymondSeenText:
+ text "No matter what I"
+ line "do, all I catch"
+
+ para "are the same #-"
+ line "MON…"
+ done
+
+FisherRaymondBeatenText:
+ text "My line's all"
+ line "tangled up…"
+ done
+
+FisherRaymondAfterBattleText:
+ text "Why can't I catch"
+ line "any good #MON?"
+ done
+
+CooltrainermAaronSeenText:
+ text "If a trainer spots"
+ line "another trainer,"
+
+ para "he has to make a"
+ line "challenge."
+
+ para "That is our"
+ line "destiny."
+ done
+
+CooltrainermAaronBeatenText:
+ text "Whew…"
+ line "Good battle."
+ done
+
+CooltrainermAaronAfterBattleText:
+ text "#MON and their"
+ line "trainer become"
+
+ para "powerful through"
+ line "constant battling."
+ done
+
+CooltrainerfLoisSeenText:
+ text "What happened to"
+ line "the red GYARADOS?"
+
+ para "It's gone?"
+
+ para "Oh, darn. I came"
+ line "here for nothing?"
+
+ para "I know--let's"
+ line "battle!"
+ done
+
+CooltrainerfLoisBeatenText:
+ text "Good going!"
+ done
+
+CooltrainerfLoisAfterBattleText:
+ text "Come to think of"
+ line "it, I've seen a"
+ cont "pink BUTTERFREE."
+ done
+
+MeetWesleyText:
+ text "WESLEY: Well, how"
+ line "do you do?"
+
+ para "Seeing as how it's"
+ line "Wednesday today,"
+
+ para "I'm WESLEY of"
+ line "Wednesday."
+ done
+
+WesleyGivesGiftText:
+ text "Pleased to meet"
+ line "you. Please take a"
+ cont "souvenir."
+ done
+
+WesleyGaveGiftText:
+ text "WESLEY: BLACKBELT"
+ line "beefs up the power"
+ cont "of fighting moves."
+ done
+
+WesleyWednesdayText:
+ text "WESLEY: Since you"
+ line "found me, you must"
+
+ para "have met my broth-"
+ line "ers and sisters."
+
+ para "Or did you just"
+ line "get lucky?"
+ done
+
+WesleyNotWednesdayText:
+ text "WESLEY: Today's"
+ line "not Wednesday."
+ cont "That's too bad."
+ done
+
+LakeOfRageSignText:
+ text "LAKE OF RAGE,"
+ line "also known as"
+ cont "GYARADOS LAKE."
+ done
+
+FishingGurusHouseSignText:
+ text "FISHING GURU'S"
+ line "HOUSE"
+ done
+
+LakeOfRage_MapEvents:
+ db 0, 0 ; filler
+
+ db 2 ; warp events
+ warp_event 7, 3, LAKE_OF_RAGE_HIDDEN_POWER_HOUSE, 1
+ warp_event 27, 31, LAKE_OF_RAGE_MAGIKARP_HOUSE, 1
+
+ db 0 ; coord events
+
+ db 5 ; bg events
+ bg_event 21, 27, BGEVENT_READ, LakeOfRageSign
+ bg_event 25, 31, BGEVENT_READ, MagikarpHouseSignScript
+ bg_event 11, 28, BGEVENT_ITEM, LakeOfRageHiddenFullRestore
+ bg_event 4, 4, BGEVENT_ITEM, LakeOfRageHiddenRareCandy
+ bg_event 35, 5, BGEVENT_ITEM, LakeOfRageHiddenMaxPotion
+
+ db 12 ; object events
+ object_event 21, 28, SPRITE_LANCE, SPRITEMOVEDATA_STANDING_UP, 0, 0, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, LakeOfRageLanceScript, EVENT_LAKE_OF_RAGE_LANCE
+ object_event 20, 26, SPRITE_GRAMPS, SPRITEMOVEDATA_STANDING_UP, 0, 0, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, LakeOfRageGrampsScript, -1
+ object_event 36, 13, SPRITE_SUPER_NERD, SPRITEMOVEDATA_STANDING_LEFT, 0, 0, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, LakeOfRageSuperNerdScript, -1
+ object_event 25, 29, SPRITE_COOLTRAINER_F, SPRITEMOVEDATA_WALK_LEFT_RIGHT, 1, 0, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, LakeOfRageCooltrainerFScript, -1
+ object_event 30, 23, SPRITE_FISHER, SPRITEMOVEDATA_STANDING_LEFT, 0, 0, -1, -1, PAL_NPC_BLUE, OBJECTTYPE_TRAINER, 1, TrainerFisherAndre, EVENT_LAKE_OF_RAGE_CIVILIANS
+ object_event 24, 26, SPRITE_FISHER, SPRITEMOVEDATA_STANDING_UP, 0, 0, -1, -1, PAL_NPC_BLUE, OBJECTTYPE_TRAINER, 1, TrainerFisherRaymond, EVENT_LAKE_OF_RAGE_CIVILIANS
+ object_event 4, 15, SPRITE_COOLTRAINER_M, SPRITEMOVEDATA_STANDING_RIGHT, 0, 0, -1, -1, PAL_NPC_RED, OBJECTTYPE_TRAINER, 1, TrainerCooltrainermAaron, EVENT_LAKE_OF_RAGE_CIVILIANS
+ object_event 36, 7, SPRITE_COOLTRAINER_F, SPRITEMOVEDATA_STANDING_LEFT, 0, 0, -1, -1, PAL_NPC_RED, OBJECTTYPE_TRAINER, 0, TrainerCooltrainerfLois, EVENT_LAKE_OF_RAGE_CIVILIANS
+ object_event 18, 22, SPRITE_GYARADOS, SPRITEMOVEDATA_POKEMON, 0, 0, -1, -1, PAL_NPC_RED, OBJECTTYPE_SCRIPT, 0, RedGyarados, EVENT_LAKE_OF_RAGE_RED_GYARADOS
+ object_event 4, 4, SPRITE_SUPER_NERD, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, WesleyScript, EVENT_LAKE_OF_RAGE_WESLEY_OF_WEDNESDAY
+ object_event 7, 10, SPRITE_POKE_BALL, SPRITEMOVEDATA_STILL, 0, 0, -1, -1, 0, OBJECTTYPE_ITEMBALL, 0, LakeOfRageMaxEther, EVENT_LAKE_OF_RAGE_MAX_ETHER
+ object_event 35, 2, SPRITE_POKE_BALL, SPRITEMOVEDATA_STILL, 0, 0, -1, -1, 0, OBJECTTYPE_ITEMBALL, 0, LakeOfRageTMDetect, EVENT_LAKE_OF_RAGE_TM_DETECT
diff --git a/maps/MahoganyTown.asm b/maps/MahoganyTown.asm
new file mode 100644
index 00000000..dbd7bb9f
--- /dev/null
+++ b/maps/MahoganyTown.asm
@@ -0,0 +1,268 @@
+ const_def 2 ; object constants
+ const MAHOGANYTOWN_POKEFAN_M
+ const MAHOGANYTOWN_GRAMPS
+ const MAHOGANYTOWN_FISHER
+ const MAHOGANYTOWN_LASS
+
+MahoganyTown_MapScripts:
+ db 2 ; scene scripts
+ scene_script .DummyScene0 ; SCENE_DEFAULT
+ scene_script .DummyScene1 ; SCENE_FINISHED
+
+ db 1 ; callbacks
+ callback MAPCALLBACK_NEWMAP, .FlyPoint
+
+.DummyScene0:
+ end
+
+.DummyScene1:
+ end
+
+.FlyPoint:
+ setflag ENGINE_FLYPOINT_MAHOGANY
+ return
+
+MahoganyTownTryARageCandyBarScript:
+ showemote EMOTE_SHOCK, MAHOGANYTOWN_POKEFAN_M, 15
+ applymovement MAHOGANYTOWN_POKEFAN_M, MovementData_0x1900a9
+ follow PLAYER, MAHOGANYTOWN_POKEFAN_M
+ applymovement PLAYER, MovementData_0x1900a7
+ stopfollow
+ turnobject PLAYER, RIGHT
+ scall RageCandyBarMerchantScript
+ applymovement MAHOGANYTOWN_POKEFAN_M, MovementData_0x1900ad
+ end
+
+MahoganyTownPokefanMScript:
+ faceplayer
+RageCandyBarMerchantScript:
+ checkevent EVENT_CLEARED_ROCKET_HIDEOUT
+ iftrue .ClearedRocketHideout
+ scall .SellRageCandyBars
+ end
+
+.ClearedRocketHideout:
+ opentext
+ writetext RageCandyBarMerchantSoldOutText
+ waitbutton
+ closetext
+ end
+
+.SellRageCandyBars:
+ opentext
+ writetext RageCandyBarMerchantTryOneText
+ special PlaceMoneyTopRight
+ yesorno
+ iffalse .Refused
+ checkmoney YOUR_MONEY, 300
+ ifequal HAVE_LESS, .NotEnoughMoney
+ giveitem RAGECANDYBAR
+ iffalse .NoRoom
+ waitsfx
+ playsound SFX_TRANSACTION
+ takemoney YOUR_MONEY, 300
+ special PlaceMoneyTopRight
+ writetext RageCandyBarMerchantSavorItText
+ waitbutton
+ closetext
+ end
+
+.NotEnoughMoney:
+ writetext RageCandyBarMerchantNotEnoughMoneyText
+ waitbutton
+ closetext
+ end
+
+.Refused:
+ writetext RageCandyBarMerchantRefusedText
+ waitbutton
+ closetext
+ end
+
+.NoRoom:
+ writetext RageCandyBarMerchantNoRoomText
+ waitbutton
+ closetext
+ end
+
+MahoganyTownGrampsScript:
+ faceplayer
+ opentext
+ checkevent EVENT_CLEARED_ROCKET_HIDEOUT
+ iftrue .ClearedRocketHideout
+ writetext MahoganyTownGrampsText
+ waitbutton
+ closetext
+ end
+
+.ClearedRocketHideout:
+ writetext MahoganyTownGrampsText_ClearedRocketHideout
+ waitbutton
+ closetext
+ end
+
+MahoganyTownFisherScript:
+ jumptextfaceplayer MahoganyTownFisherText
+
+MahoganyTownLassScript:
+ jumptextfaceplayer MahoganyTownLassText
+
+MahoganyTownSign:
+ jumptext MahoganyTownSignText
+
+MahoganyTownRagecandybarSign:
+ jumptext MahoganyTownRagecandybarSignText
+
+MahoganyGymSign:
+ jumptext MahoganyGymSignText
+
+MahoganyTownPokecenterSign:
+ jumpstd pokecentersign
+
+MovementData_0x1900a4:
+ step DOWN
+ big_step UP
+ turn_head DOWN
+MovementData_0x1900a7:
+ step LEFT
+ step_end
+
+MovementData_0x1900a9:
+ step RIGHT
+ step DOWN
+ turn_head LEFT
+ step_end
+
+MovementData_0x1900ad:
+ step UP
+ turn_head DOWN
+ step_end
+
+RageCandyBarMerchantTryOneText:
+ text "Hi, sonny boy! I"
+ line "see you're new in"
+ cont "MAHOGANY TOWN."
+
+ para "Since you're new,"
+ line "you should try a"
+
+ para "yummy RAGECANDY-"
+ line "BAR!"
+
+ para "Right now, it can"
+ line "be yours for just"
+ cont "¥300! Want one?"
+ done
+
+RageCandyBarMerchantSavorItText:
+ text "Good! Savor it!"
+ done
+
+RageCandyBarMerchantNotEnoughMoneyText:
+ text "You don't have"
+ line "enough money."
+ done
+
+RageCandyBarMerchantRefusedText:
+ text "Oh, fine then…"
+ done
+
+RageCandyBarMerchantNoRoomText:
+ text "You don't have"
+ line "room for this."
+ done
+
+RageCandyBarMerchantSoldOutText:
+ text "RAGECANDYBAR's"
+ line "sold out."
+
+ para "I'm packing up."
+ line "Don't bother me,"
+ cont "sonny boy."
+ done
+
+MahoganyTownGrampsText:
+ text "Are you off to see"
+ line "the GYARADOS ram-"
+ cont "page at the LAKE?"
+ done
+
+MahoganyTownGrampsText_ClearedRocketHideout:
+ text "MAGIKARP have"
+ line "returned to LAKE"
+ cont "OF RAGE."
+
+ para "That should be"
+ line "good news for the"
+ cont "anglers there."
+ done
+
+MahoganyTownFisherText:
+ text "Since you came"
+ line "this far, take the"
+
+ para "time to do some"
+ line "sightseeing."
+
+ para "You should head"
+ line "north and check"
+
+ para "out LAKE OF RAGE"
+ line "right now."
+ done
+
+MahoganyTownLassText:
+ text "Visit Grandma's"
+ line "shop. She sells"
+
+ para "stuff that nobody"
+ line "else has."
+ done
+
+MahoganyTownSignText:
+ text "MAHOGANY TOWN"
+
+ para "Welcome to the"
+ line "Home of the Ninja"
+ done
+
+MahoganyTownRagecandybarSignText:
+ text "While Visiting"
+ line "MAHOGANY TOWN, Try"
+ cont "a RAGECANDYBAR!"
+ done
+
+MahoganyGymSignText:
+ text "MAHOGANY TOWN"
+ line "#MON GYM"
+ cont "LEADER: PRYCE"
+
+ para "The Teacher of"
+ line "Winter's Harshness"
+ done
+
+MahoganyTown_MapEvents:
+ db 0, 0 ; filler
+
+ db 5 ; warp events
+ warp_event 11, 7, MAHOGANY_MART_1F, 1
+ warp_event 17, 7, MAHOGANY_RED_GYARADOS_SPEECH_HOUSE, 1
+ warp_event 6, 13, MAHOGANY_GYM, 1
+ warp_event 15, 13, MAHOGANY_POKECENTER_1F, 1
+ warp_event 9, 1, ROUTE_43_MAHOGANY_GATE, 3
+
+ db 2 ; coord events
+ coord_event 19, 8, SCENE_DEFAULT, MahoganyTownTryARageCandyBarScript
+ coord_event 19, 9, SCENE_DEFAULT, MahoganyTownTryARageCandyBarScript
+
+ db 4 ; bg events
+ bg_event 1, 5, BGEVENT_READ, MahoganyTownSign
+ bg_event 9, 7, BGEVENT_READ, MahoganyTownRagecandybarSign
+ bg_event 3, 13, BGEVENT_READ, MahoganyGymSign
+ bg_event 16, 13, BGEVENT_READ, MahoganyTownPokecenterSign
+
+ db 4 ; object events
+ object_event 19, 8, SPRITE_POKEFAN_M, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, MahoganyTownPokefanMScript, EVENT_MAHOGANY_TOWN_POKEFAN_M_BLOCKS_EAST
+ object_event 6, 9, SPRITE_GRAMPS, SPRITEMOVEDATA_WALK_LEFT_RIGHT, 1, 0, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, MahoganyTownGrampsScript, -1
+ object_event 6, 14, SPRITE_FISHER, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, PAL_NPC_GREEN, OBJECTTYPE_SCRIPT, 0, MahoganyTownFisherScript, EVENT_MAHOGANY_TOWN_POKEFAN_M_BLOCKS_GYM
+ object_event 12, 8, SPRITE_LASS, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, MahoganyTownLassScript, EVENT_MAHOGANY_MART_OWNERS
diff --git a/maps/OlivineCity.asm b/maps/OlivineCity.asm
new file mode 100644
index 00000000..e025fcbf
--- /dev/null
+++ b/maps/OlivineCity.asm
@@ -0,0 +1,306 @@
+ const_def 2 ; object constants
+ const OLIVINECITY_SAILOR1
+ const OLIVINECITY_STANDING_YOUNGSTER
+ const OLIVINECITY_SAILOR2
+ const OLIVINECITY_OLIVINE_RIVAL
+
+OlivineCity_MapScripts:
+ db 2 ; scene scripts
+ scene_script .DummyScene0 ; SCENE_DEFAULT
+ scene_script .DummyScene1 ; SCENE_FINISHED
+
+ db 1 ; callbacks
+ callback MAPCALLBACK_NEWMAP, .FlyPoint
+
+.DummyScene0:
+ end
+
+.DummyScene1:
+ end
+
+.FlyPoint:
+ setflag ENGINE_FLYPOINT_OLIVINE
+ return
+
+OlivineCityRivalSceneTop:
+ turnobject PLAYER, LEFT
+ showemote EMOTE_SHOCK, PLAYER, 15
+ special FadeOutMusic
+ pause 15
+ playsound SFX_ENTER_DOOR
+ appear OLIVINECITY_OLIVINE_RIVAL
+ waitsfx
+ applymovement OLIVINECITY_OLIVINE_RIVAL, MovementData_0x1a88d2
+ playmusic MUSIC_RIVAL_ENCOUNTER
+ opentext
+ writetext OlivineCityRivalText
+ waitbutton
+ closetext
+ applymovement PLAYER, MovementData_0x1a88f4
+ turnobject PLAYER, RIGHT
+ applymovement OLIVINECITY_OLIVINE_RIVAL, MovementData_0x1a88db
+ setscene SCENE_FINISHED
+ disappear OLIVINECITY_OLIVINE_RIVAL
+ special RestartMapMusic
+ variablesprite SPRITE_OLIVINE_RIVAL, SPRITE_SWIMMER_GUY
+ special LoadUsedSpritesGFX
+ end
+
+OlivineCityRivalSceneBottom:
+ turnobject PLAYER, LEFT
+ showemote EMOTE_SHOCK, PLAYER, 15
+ special FadeOutMusic
+ pause 15
+ playsound SFX_ENTER_DOOR
+ appear OLIVINECITY_OLIVINE_RIVAL
+ waitsfx
+ applymovement OLIVINECITY_OLIVINE_RIVAL, MovementData_0x1a88d6
+ playmusic MUSIC_RIVAL_ENCOUNTER
+ opentext
+ writetext OlivineCityRivalText
+ waitbutton
+ closetext
+ applymovement PLAYER, MovementData_0x1a88f7
+ turnobject PLAYER, RIGHT
+ applymovement OLIVINECITY_OLIVINE_RIVAL, MovementData_0x1a88e8
+ disappear OLIVINECITY_OLIVINE_RIVAL
+ setscene SCENE_FINISHED
+ special RestartMapMusic
+ variablesprite SPRITE_OLIVINE_RIVAL, SPRITE_SWIMMER_GUY
+ special LoadUsedSpritesGFX
+ end
+
+OlivineCitySailor1Script:
+ jumptextfaceplayer OlivineCitySailor1Text
+
+OlivineCityStandingYoungsterScript:
+ faceplayer
+ opentext
+ random 2
+ ifequal 0, .FiftyFifty
+ writetext OlivineCityStandingYoungsterPokegearText
+ waitbutton
+ closetext
+ end
+
+.FiftyFifty:
+ writetext OlivineCityStandingYoungsterPokedexText
+ waitbutton
+ closetext
+ end
+
+OlivineCitySailor2Script:
+ jumptextfaceplayer OlivineCitySailor2Text
+
+OlivineCitySign:
+ jumptext OlivineCitySignText
+
+OlivineCityPortSign:
+ jumptext OlivineCityPortSignText
+
+OlivineGymSign:
+ jumptext OlivineGymSignText
+
+OlivineLighthouseSign:
+ jumptext OlivineLighthouseSignText
+
+OlivineCityPokecenterSign:
+ jumpstd pokecentersign
+
+OlivineCityMartSign:
+ jumpstd martsign
+
+MovementData_0x1a88d2:
+ step DOWN
+ step RIGHT
+ step RIGHT
+ step_end
+
+MovementData_0x1a88d6:
+ step DOWN
+ step DOWN
+ step RIGHT
+ step RIGHT
+ step_end
+
+MovementData_0x1a88db:
+ step RIGHT
+ step RIGHT
+ step RIGHT
+ step RIGHT
+ step RIGHT
+ step RIGHT
+ step UP
+ step UP
+ step UP
+ step UP
+ step UP
+ step UP
+ step_end
+
+MovementData_0x1a88e8:
+ step RIGHT
+ step RIGHT
+ step RIGHT
+ step RIGHT
+ step RIGHT
+ step RIGHT
+ step UP
+ step UP
+ step UP
+ step UP
+ step UP
+ step_end
+
+MovementData_0x1a88f4:
+ step DOWN
+ turn_head UP
+ step_end
+
+MovementData_0x1a88f7:
+ step UP
+ turn_head DOWN
+ step_end
+
+OlivineCityRivalText:
+ text "…"
+
+ para "You again?"
+
+ para "There's no need to"
+ line "panic. I don't"
+
+ para "bother with wimps"
+ line "like you."
+
+ para "Speaking of weak-"
+ line "lings, the city's"
+
+ para "GYM LEADER isn't"
+ line "here."
+
+ para "Supposedly taking"
+ line "care of a sick"
+
+ para "#MON at the"
+ line "LIGHTHOUSE."
+
+ para "Humph! Boo-hoo!"
+ line "Just let sick"
+ cont "#MON go!"
+
+ para "A #MON that"
+ line "can't battle is"
+ cont "worthless!"
+
+ para "Why don't you go"
+ line "train at the"
+ cont "LIGHTHOUSE?"
+
+ para "Who knows. It may"
+ line "make you a bit"
+ cont "less weak!"
+ done
+
+OlivineCitySailor1Text:
+ text "Dark roads are"
+ line "dangerous at"
+ cont "night."
+
+ para "But in the pitch-"
+ line "black of night,"
+
+ para "the sea is even"
+ line "more treacherous!"
+
+ para "Without the beacon"
+ line "of the LIGHTHOUSE"
+
+ para "to guide it, no"
+ line "ship can sail."
+ done
+
+OlivineCityStandingYoungsterPokegearText:
+ text "That thing you"
+ line "have--it's a #-"
+ cont "GEAR, right? Wow,"
+ cont "that's cool."
+ done
+
+OlivineCityStandingYoungsterPokedexText:
+ text "Wow, you have a"
+ line "#DEX!"
+
+ para "That is just so"
+ line "awesome."
+ done
+
+OlivineCitySailor2Text:
+ text "Hello, laddie!"
+ line "The sea is sweet!"
+
+ para "Sing with me! "
+ line "Yo-ho! Blow the"
+ cont "man down!…"
+ done
+
+OlivineCitySignText:
+ text "OLIVINE CITY"
+
+ para "The Port Closest"
+ line "to Foreign Lands"
+ done
+
+OlivineCityPortSignText:
+ text "OLIVINE PORT"
+ line "FAST SHIP PIER"
+ done
+
+OlivineGymSignText:
+ text "OLIVINE CITY"
+ line "#MON GYM"
+ cont "LEADER: JASMINE"
+
+ para "The Steel-Clad"
+ line "Defense Girl"
+ done
+
+OlivineLighthouseSignText:
+ text "OLIVINE LIGHTHOUSE"
+ line "Also Known as the"
+ cont "GLITTER LIGHTHOUSE"
+ done
+
+OlivineCity_MapEvents:
+ db 0, 0 ; filler
+
+ db 11 ; warp events
+ warp_event 13, 21, OLIVINE_POKECENTER_1F, 1
+ warp_event 10, 11, OLIVINE_GYM, 1
+ warp_event 25, 11, OLIVINE_TIMS_HOUSE, 1
+ warp_event 0, 0, OLIVINE_HOUSE_BETA, 1 ; inaccessible
+ warp_event 29, 11, OLIVINE_PUNISHMENT_SPEECH_HOUSE, 1
+ warp_event 13, 15, OLIVINE_GOOD_ROD_HOUSE, 1
+ warp_event 7, 21, OLIVINE_CAFE, 1
+ warp_event 19, 17, OLIVINE_MART, 2
+ warp_event 29, 27, OLIVINE_LIGHTHOUSE_1F, 1
+ warp_event 19, 27, OLIVINE_PORT_PASSAGE, 1
+ warp_event 20, 27, OLIVINE_PORT_PASSAGE, 2
+
+ db 2 ; coord events
+ coord_event 13, 12, SCENE_DEFAULT, OlivineCityRivalSceneTop
+ coord_event 13, 13, SCENE_DEFAULT, OlivineCityRivalSceneBottom
+
+ db 6 ; bg events
+ bg_event 17, 11, BGEVENT_READ, OlivineCitySign
+ bg_event 20, 24, BGEVENT_READ, OlivineCityPortSign
+ bg_event 7, 11, BGEVENT_READ, OlivineGymSign
+ bg_event 30, 28, BGEVENT_READ, OlivineLighthouseSign
+ bg_event 14, 21, BGEVENT_READ, OlivineCityPokecenterSign
+ bg_event 20, 17, BGEVENT_READ, OlivineCityMartSign
+
+ db 4 ; object events
+ object_event 26, 27, SPRITE_SAILOR, SPRITEMOVEDATA_WALK_UP_DOWN, 0, 1, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, OlivineCitySailor1Script, -1
+ object_event 20, 13, SPRITE_YOUNGSTER, SPRITEMOVEDATA_WALK_LEFT_RIGHT, 1, 0, -1, -1, PAL_NPC_RED, OBJECTTYPE_SCRIPT, 0, OlivineCityStandingYoungsterScript, -1
+ object_event 17, 21, SPRITE_SAILOR, SPRITEMOVEDATA_WANDER, 1, 1, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, OlivineCitySailor2Script, -1
+ object_event 10, 11, SPRITE_OLIVINE_RIVAL, SPRITEMOVEDATA_STANDING_DOWN, 0, 0, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, ObjectEvent, EVENT_RIVAL_OLIVINE_CITY