diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 2bcc258ba..89c502605 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -732,6 +732,12 @@ .elseif \type == TRAINER_BATTLE_HILL .4byte \pointer1 @ text .4byte \pointer2 @ text + .elseif \type == TRAINER_BATTLE_NO_WHITEOUT_CONTINUE_SCRIPT + .4byte \pointer1 @ text + .4byte \pointer2 @ text + .4byte \pointer3 @ event script + .elseif \type == TRAINER_BATTLE_NO_INTRO_NO_WHITEOUT + .4byte \pointer1 @ text .endif .endm @@ -776,6 +782,16 @@ trainerbattle TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT, \trainer, 0, \lose_text .endm + @ Starts a single trainer battle. Takes a trainer, intro text, loss text, and an event script which continues after the battle,regardless of the result. + @ When used with an event script, you can also pass in an optional flag to disable music + .macro trainerbattle_no_whiteout_continue_script trainer:req, intro_text:req, lose_text:req, event_script:req + trainerbattle TRAINER_BATTLE_NO_WHITEOUT_CONTINUE_SCRIPT, \trainer, 0, \intro_text, \lose_text, \event_script + .endm + + @ Starts a trainer battle, skipping intro text. Takes a trainer and loss text. Does not warp the player to last heal location if they lose. + .macro trainerbattle_no_intro_no_whiteout trainer:req, lose_text:req + trainerbattle TRAINER_BATTLE_NO_INTRO_NO_WHITEOUT, \trainer, 0, \lose_text + .endm @ Starts a trainer battle using the battle information stored in RAM (usually by the scripts in trainer_battle.inc, which @ are run by trainerbattle), and blocks script execution until the battle finishes. diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index ea7ef493c..21c5b30cc 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6,6 +6,7 @@ #include "constants/battle_arena.h" #include "constants/battle_script_commands.h" #include "constants/battle_anim.h" +#include "constants/battle_setup.h" #include "constants/battle_string_ids.h" #include "constants/abilities.h" #include "constants/hold_effects.h" @@ -6554,12 +6555,19 @@ BattleScript_LocalBattleLostEnd:: .else printstring STRINGID_PLAYERWHITEOUT waitmessage B_WAIT_TIME_LONG + jumpifhalfword CMP_EQUAL, gTrainerBattleMode, TRAINER_BATTLE_NO_WHITEOUT_CONTINUE_SCRIPT, BattleScript_LocalBattleLostPrintNoWhiteout + jumpifhalfword CMP_EQUAL, gTrainerBattleMode, TRAINER_BATTLE_NO_INTRO_NO_WHITEOUT, BattleScript_LocalBattleLostPrintNoWhiteout printstring STRINGID_PLAYERWHITEOUT2 waitmessage B_WAIT_TIME_LONG BattleScript_LocalBattleLostEnd:: end2 .endif +BattleScript_LocalBattleLostPrintNoWhiteout:: + printstring STRINGID_PLAYERWHITEOUT3 + waitmessage B_WAIT_TIME_LONG + end2 + BattleScript_CheckDomeDrew:: jumpifbyte CMP_EQUAL, gBattleOutcome, B_OUTCOME_DREW, BattleScript_LocalBattleLostEnd_ BattleScript_LocalBattleLostPrintTrainersWinText:: diff --git a/data/event_scripts.s b/data/event_scripts.s index f6d1c3616..25cac5767 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -1084,3 +1084,5 @@ Common_EventScript_LegendaryFlewAway:: .include "data/maps/GraniteCave_B3F/scripts.inc" .include "data/maps/GraniteCave_B4F/scripts.inc" + + .include "data/maps/GraniteCave_B4FNorth/scripts.inc" diff --git a/data/layouts/GraniteCave_B3F/map.bin b/data/layouts/GraniteCave_B3F/map.bin index ae5e3bdac..1b66f4d86 100644 --- a/data/layouts/GraniteCave_B3F/map.bin +++ b/data/layouts/GraniteCave_B3F/map.bin @@ -1,5 +1,5 @@ -222222222BBBBBBBBBBBB222BBBB22222BBB22BBBBB2222222'22222BBB222BBB22222222222222BBB22BBB22222!B!B!B!B!B!B!B!B!B!BBBB222BBB222222!! -BBBBBLRR222BBB22222RROBBBBB222BBB222222BBBBBBBB22B22222BB222BBB!B -222222BB2222VW2B?BBB2!B!B!B -2BB2222VW2BBBBBBB2B?BB2BB2222VW2BBBBBB2BB22222BB222222BB2222222B2222222222222222222B2222222222222222222!!!22!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B"22!!!222B>BBBBBBBBBBB22222BBBBBBBBBBBB'2222222222222222"22222222"""""""""""""222222222""""""""""""22222222"""""""""""22222222"'"""""""""""2!2!2 +RRRRRRRR?RBBBBBBBBBBBBRRRBBBB22222BBBRRBBBBB2222222'22222BBBRRRBBB22222222222222BBBRRBBB22222!B!B!B!B!B!B!B!B!B!BBBBRRRBBB222222!! +BBBBBLRRRRRBBB22222RROBBBBBRRRBBB222222BBBBBBBBRRB22222BBRRRBBB!B +222222BB2222VW2B?BBB2!B!B!B +2BB2222VW2BBBBBBB2B?BB2BB2222VW2BBBBBB2BB22222BB222222BB2222222B2222222222222222222B2222222222222222222!!!22!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B"22!!!222B>BBBBBBBBBBB22222BBBBBBBBBBBB'22222222222222"2'222222"""""""""""""222222222""""""""""""22222222"""""""""""22222222"'"""""""""""2!2!2 2222"""""""""""222222"""""""Y""!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! \ No newline at end of file diff --git a/data/layouts/GraniteCave_B4F/map.bin b/data/layouts/GraniteCave_B4F/map.bin index e60ac4276..5a3008434 100644 --- a/data/layouts/GraniteCave_B4F/map.bin +++ b/data/layouts/GraniteCave_B4F/map.bin @@ -1 +1 @@ -΄΄Š“ˆ2<2‰’“<222Š“““ˆ2P<22Š“““ˆ2<22>2Š“““ˆ<22<2<2Š“““ˆ2>22Š“““ˆ222<2Š“““ˆ22<2»BΎBΎBΎB½Bf2<ΓBΖBΖBΖBΕB<2                                        \ No newline at end of file +΄΄Š“ˆ22‰’“222Š“““ˆ2P22Š“““ˆ222>2Š“““ˆ2222Š“““ˆ2>22Š“““ˆ2222Š“““ˆ222»BΎBΎBΎB½Bf2ΓBΖBΖBΖBΕB2                                        \ No newline at end of file diff --git a/data/layouts/GraniteCave_B4FNorth/border.bin b/data/layouts/GraniteCave_B4FNorth/border.bin new file mode 100644 index 000000000..423a0732e --- /dev/null +++ b/data/layouts/GraniteCave_B4FNorth/border.bin @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/data/layouts/GraniteCave_B4FNorth/map.bin b/data/layouts/GraniteCave_B4FNorth/map.bin new file mode 100644 index 000000000..925c96f10 --- /dev/null +++ b/data/layouts/GraniteCave_B4FNorth/map.bin @@ -0,0 +1,4 @@ +2222222222222222222222222222222222 B B +2222 B +22BB2222B B +2BB2222BB2BB2222B B B BBB2222BBBBBB'2222222=222222222222222222222222222222222             2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 \ No newline at end of file diff --git a/data/layouts/layouts.json b/data/layouts/layouts.json index 0280de7be..14eeb7431 100644 --- a/data/layouts/layouts.json +++ b/data/layouts/layouts.json @@ -4530,6 +4530,16 @@ "secondary_tileset": "gTileset_Cave", "border_filepath": "data/layouts/GraniteCave_B4F/border.bin", "blockdata_filepath": "data/layouts/GraniteCave_B4F/map.bin" + }, + { + "id": "LAYOUT_GRANITE_CAVE_B4FNORTH", + "name": "GraniteCave_B4FNorth_Layout", + "width": 15, + "height": 15, + "primary_tileset": "gTileset_General", + "secondary_tileset": "gTileset_Cave", + "border_filepath": "data/layouts/GraniteCave_B4FNorth/border.bin", + "blockdata_filepath": "data/layouts/GraniteCave_B4FNorth/map.bin" } ] } diff --git a/data/maps/GraniteCave_B3F/map.json b/data/maps/GraniteCave_B3F/map.json index 2ae8d1abd..c9decc4d9 100644 --- a/data/maps/GraniteCave_B3F/map.json +++ b/data/maps/GraniteCave_B3F/map.json @@ -64,7 +64,7 @@ "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", - "flag": "0" + "flag": "FLAG_STEVENS_CAVE_AGRON" }, { "graphics_id": "OBJ_EVENT_GFX_LAIRON", @@ -77,7 +77,7 @@ "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "NULL", - "flag": "0" + "flag": "FLAG_STEVENS_CAVE_AGRON" }, { "graphics_id": "OBJ_EVENT_GFX_ARON", @@ -104,6 +104,19 @@ "trainer_sight_or_berry_tree_id": "0", "script": "EventScript_StrengthBoulder", "flag": "FLAG_TEMP_11" + }, + { + "graphics_id": "OBJ_EVENT_GFX_PUSHABLE_BOULDER", + "x": 2, + "y": 11, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_LOOK_AROUND", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "EventScript_StrengthBoulder", + "flag": "FLAG_TEMP_12" } ], "warp_events": [ @@ -134,6 +147,13 @@ "elevation": 0, "dest_map": "MAP_GRANITE_CAVE_B3F", "dest_warp_id": "0" + }, + { + "x": 5, + "y": 2, + "elevation": 0, + "dest_map": "MAP_GRANITE_CAVE_B3F", + "dest_warp_id": "0" } ], "coord_events": [ @@ -145,6 +165,33 @@ "var": "VAR_GRANITECAVE_AGGRON", "var_value": "1", "script": "GraniteCave_B3F_EventScript_Agron" + }, + { + "type": "trigger", + "x": 5, + "y": 22, + "elevation": 0, + "var": "VAR_GRANITECAVE_AGGRON", + "var_value": "0", + "script": "GraniteCave_B3F_EventScript_CheckOnSteven" + }, + { + "type": "trigger", + "x": 16, + "y": 23, + "elevation": 0, + "var": "VAR_GRANITECAVE_AGGRON", + "var_value": "0", + "script": "GraniteCave_B3F_EventScript_WhatDidHeFind" + }, + { + "type": "trigger", + "x": 15, + "y": 20, + "elevation": 0, + "var": "VAR_GRANITECAVE_AGGRON", + "var_value": "3", + "script": "GraniteCave_B3F_EventScript_CompletedScript" } ], "bg_events": [ diff --git a/data/maps/GraniteCave_B3F/scripts.inc b/data/maps/GraniteCave_B3F/scripts.inc index 17cb49d13..306a7b651 100644 --- a/data/maps/GraniteCave_B3F/scripts.inc +++ b/data/maps/GraniteCave_B3F/scripts.inc @@ -3,14 +3,47 @@ GraniteCave_B3F_MapScripts:: //map_script MAP_SCRIPT_ON_TRANSITION, GraniteCave_B3F_OnTransition .byte 0 +GraniteCave_B3F_EventScript_CheckOnSteven:: + msgbox GraniteCave_B3F_Text_CheckOnSteven, MSGBOX_NPC + applymovement OBJ_EVENT_ID_PLAYER, GraniteCave_B3F_Movement_WalkDown + end + +GraniteCave_B3F_EventScript_WhatDidHeFind:: + msgbox GraniteCave_B3F_Text_WhatDidHeFind, MSGBOX_NPC + applymovement OBJ_EVENT_ID_PLAYER, GraniteCave_B3F_Movement_WalkDown + end + +GraniteCave_B3F_Text_WhatDidHeFind: + .string "I should see what STEVEN found$" + +GraniteCave_B3F_Text_CheckOnSteven: + .string "STEVEN: Just a second, we should come up\n" + .string "with a plan.$" + +GraniteCave_B3F_Movement_WalkDown: + walk_down + step_end + + GraniteCave_B3F_Fell:: goto_if_unset FLAG_STEVENS_CAVE_DUGDEEPER, GraniteCave_B3F_EventScript_DugDeeper + goto_if_eq VAR_GRANITECAVE_AGGRON, 0, GraniteCave_B3F_EventScript_StayAndStudy + goto_if_eq VAR_GRANITECAVE_AGGRON, 9, GraniteCave_B3F_EventScript_StayAndStudy + goto_if_eq VAR_GRANITECAVE_AGGRON, 3, GraniteCave_B3F_Exit msgbox GraniteCave_B3F_Text_FindAnything, MSGBOX_NPC end +GraniteCave_B3F_Exit:: + msgbox GraniteCave_B3F_Text_ExitThatWay, MSGBOX_NPC + end + GraniteCave_B3F_Movement_LookUp: face_up step_end + +GraniteCave_B3F_Movement_LookRight: + face_right + step_end GraniteCave_B3F_Text_FindAnything: .string "I haven't found anything yet...\n" @@ -24,7 +57,9 @@ GraniteCave_B3F_Text_DugDeeper: .string "Well this is unexpected. We've seen to\n" .string "gone even deeper into this cave.\p" .string "At least there seems to be a path to\n" - .string "continue moving on.\p" + .string "continue moving forward.\p" + .string "I wonder what could have caused that\n" + .string "earthquake.\p" .string "I am going to explore this section with\n" .string "Baltoy and see if we can find any other\l" .string "path back up.\p" @@ -41,8 +76,6 @@ GraniteCave_B3F_EventScript_DugDeeper:: waitse msgbox GraniteCave_B3F_Text_DugDeeper, MSGBOX_NPC setvar VAR_GRANITECAVE_AGGRON, 1 - givemon SPECIES_MUDKIP, 25, ITEM_NONE - animateflash 1 end GraniteCave_B3F_Trigger_Agron:: @@ -99,7 +132,9 @@ GraniteCave_B3F_Movement_StevenRun: face_left delay_16 lock_facing_direction + delay_16 walk_right + unlock_facing_direction step_end GraniteCave_B3F_Movement_FaceDown: @@ -115,7 +150,7 @@ GraniteCave_B3F_Text_AggronAttack: .string "STEVEN: I'll deal with this one!$" GraniteCave_B3F_Text_LaironAttack: - .string "LARION charges$" + .string "LARION charges!$" GraniteCave_B3F_EventScript_Agron:: lock @@ -172,22 +207,119 @@ GraniteCave_B3F_EventScript_Agron:: waitmovement 0 //applymovement 4, GraniteCave_B3F_Movement_WalkRight //waitmovement 0 - msgbox GraniteCave_B3F_Text_AggronAttack, MSGBOX_NPC applymovement OBJ_EVENT_ID_PLAYER, GraniteCave_B3F_Movement_FaceDown waitmovement 0 + msgbox GraniteCave_B3F_Text_AggronAttack, MSGBOX_DEFAULT + //Start Battle - msgbox GraniteCave_B3F_Text_LaironAttack, MSGBOX_NPC + delay 32 + msgbox GraniteCave_B3F_Text_LaironAttack, MSGBOX_DEFAULT special LaironBattle waitstate - //setwildbattle SPECIES_LAIRON, 18 - //dowildbattle - //specialvar VAR_RESULT, GetBattleOutcome - //goto_if_eq VAR_RESULT, B_OUTCOME_WON, SkyPillar_Top_EventScript_DefeatedRayquaza - //goto_if_eq VAR_RESULT, B_OUTCOME_RAN, SkyPillar_Top_EventScript_RanFromRayquaza - //goto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, SkyPillar_Top_EventScript_RanFromRayquaza - release + showfollower + //remove the pokemon + removeobject 4 + removeobject 5 setvar VAR_GRANITECAVE_AGGRON, 0 + setflag FLAG_STEVENS_CAVE_AGRON + + specialvar VAR_RESULT, GetBattleOutcome + playbgm MUS_PETALBURG_WOODS, TRUE + applymovement 1, GraniteCave_B3F_Movement_LookRight + goto_if_eq VAR_RESULT, B_OUTCOME_WON, GraniteCave_B3F_EventScript_AgronDefeated + goto_if_eq VAR_RESULT, B_OUTCOME_LOST, GraniteCave_B3F_EventScript_PlayerDefeated + //goto_if_eq VAR_RESULT, B_OUTCOME_PLAYER_TELEPORTED, SkyPillar_Top_EventScript_RanFromRayquaza. + release end +GraniteCave_B3F_Text_AgronDefeated: + .string "STEVEN: That was a close one, but that\n" + .string "LARION was no match for you.\l" + .string "Here, let me heal your POKΓ©MON.$" - \ No newline at end of file +GraniteCave_B3F_EventScript_AgronDefeated:: + msgbox GraniteCave_B3F_Text_AgronDefeated, MSGBOX_NPC + goto GraniteCave_B3F_EventScript_ShinyRock + end + +GraniteCave_B3F_Text_PlayerDefeated: + .string "STEVEN: That was a close one. The LARION\n" + .string "ran off after the AGGRON did.\p" + .string "Here, let me heal your POKΓ©MON$" + +GraniteCave_B3F_EventScript_PlayerDefeated:: + msgbox GraniteCave_B3F_Text_PlayerDefeated, MSGBOX_NPC + goto GraniteCave_B3F_EventScript_ShinyRock + end + +GraniteCave_B3F_Text_MetangFlash: + .string "STEVEN: METANG, use Flash!$" + +GraniteCave_B3F_Text_ShinyRock: + .string "STEVEN: What's that over there?$" + +GraniteCave_B3F_Movement_GoToStone: + walk_left + walk_down + walk_down + walk_down + walk_down + step_end + +GraniteCave_B3F_EventScript_ShinyRock:: + lock + special HealPlayerParty + playse SE_USE_ITEM + waitse + applymovement 1, GraniteCave_B3F_Movement_FaceDown + waitmovement 0 + msgbox GraniteCave_B3F_Text_MetangFlash, MSGBOX_DEFAULT + delay 32 + animateflash 1 + delay 32 + playse SE_PIN + applymovement 1, Common_Movement_ExclamationMark + waitmovement 0 + msgbox GraniteCave_B3F_Text_ShinyRock, MSGBOX_DEFAULT + applymovement 1, GraniteCave_B3F_Movement_GoToStone + waitmovement 0 + release + releaseall + end + +GraniteCave_B3F_Text_StayAndStudy: + .string "STEVEN: Look at that brilliant shimmer.\n" + .string "I wonder if this could be...\p" + .string "Thank you for you help {PLAYER}.\n" + .string "I will stay here and investiage this\l" + .string "odd stone.\p" + .string "Oh! You had a letter for me?$" + +GraniteCave_B3F_Text_ExitThatWay: + .string "I feel a faint breeze coming from over\n" + .string "there. I think the exit is that way.$" + +GraniteCave_B3F_EventScript_StayAndStudy:: + msgbox GraniteCave_B3F_Text_StayAndStudy, MSGBOX_NPC + setvar VAR_0x8004, ITEM_LETTER + call Common_EventScript_PlayerHandedOverTheItem + setflag FLAG_DELIVERED_STEVEN_LETTER + msgbox GraniteCave_StevensRoom_Text_ThankYouTakeThis, MSGBOX_DEFAULT + giveitem ITEM_TM47 + call_if_eq VAR_RESULT, FALSE, GraniteCave_StevensRoom_EventScript_BagFull + msgbox GraniteCave_StevensRoom_Text_CouldBecomeChampionLetsRegister, MSGBOX_DEFAULT + closemessage + delay 30 + playfanfare MUS_REGISTER_MATCH_CALL + msgbox GraniteCave_StevensRoom_Text_RegisteredSteven, MSGBOX_DEFAULT + waitfanfare + closemessage + delay 30 + setflag FLAG_REGISTERED_STEVEN_POKENAV + msgbox GraniteCave_B3F_Text_ExitThatWay, MSGBOX_NPC + setvar VAR_GRANITECAVE_AGGRON, 3 + end + +GraniteCave_B3F_EventScript_CompletedScript:: + setvar VAR_GRANITECAVE_AGGRON, 9 + end \ No newline at end of file diff --git a/data/maps/GraniteCave_B4FNorth/map.json b/data/maps/GraniteCave_B4FNorth/map.json new file mode 100644 index 000000000..c4bb8893a --- /dev/null +++ b/data/maps/GraniteCave_B4FNorth/map.json @@ -0,0 +1,40 @@ +{ + "id": "MAP_GRANITE_CAVE_B4FNORTH", + "name": "GraniteCave_B4FNorth", + "layout": "LAYOUT_GRANITE_CAVE_B4FNORTH", + "music": "MUS_PETALBURG_WOODS", + "region_map_section": "MAPSEC_GRANITE_CAVE", + "requires_flash": false, + "weather": "WEATHER_NONE", + "map_type": "MAP_TYPE_UNDERGROUND", + "allow_cycling": true, + "allow_escaping": false, + "allow_running": true, + "show_map_name": false, + "battle_scene": "MAP_BATTLE_SCENE_NORMAL", + "connections": 0, + "object_events": [ + { + "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", + "x": 9, + "y": 4, + "elevation": 0, + "movement_type": "MOVEMENT_TYPE_NONE", + "movement_range_x": 0, + "movement_range_y": 0, + "trainer_type": "TRAINER_TYPE_NONE", + "trainer_sight_or_berry_tree_id": "0", + "script": "GraniteCave_B4FNorth_EventScript_ItemMasterBall", + "flag": "FLAG_ITEM_GRANITE_CAVE_4FNORTH_MASTERBALL" + } + ], + "warp_events": [ + + ], + "coord_events": [ + + ], + "bg_events": [ + + ] +} diff --git a/data/maps/GraniteCave_B4FNorth/scripts.inc b/data/maps/GraniteCave_B4FNorth/scripts.inc new file mode 100644 index 000000000..328669ca4 --- /dev/null +++ b/data/maps/GraniteCave_B4FNorth/scripts.inc @@ -0,0 +1,2 @@ +GraniteCave_B4FNorth_MapScripts:: + .byte 0 diff --git a/data/maps/GraniteCave_StevensRoom/scripts.inc b/data/maps/GraniteCave_StevensRoom/scripts.inc index 9ea7166b0..d67caf3e8 100644 --- a/data/maps/GraniteCave_StevensRoom/scripts.inc +++ b/data/maps/GraniteCave_StevensRoom/scripts.inc @@ -10,20 +10,20 @@ GraniteCave_StevensRoom_EventScript_Steven:: //setvar VAR_0x8004, ITEM_LETTER //call Common_EventScript_PlayerHandedOverTheItem //setflag FLAG_DELIVERED_STEVEN_LETTER - msgbox GraniteCave_StevensRoom_Text_ThankYouTakeThis, MSGBOX_DEFAULT - giveitem ITEM_TM47 - call_if_eq VAR_RESULT, FALSE, GraniteCave_StevensRoom_EventScript_BagFull - msgbox GraniteCave_StevensRoom_Text_CouldBecomeChampionLetsRegister, MSGBOX_DEFAULT - closemessage - delay 30 - playfanfare MUS_REGISTER_MATCH_CALL - msgbox GraniteCave_StevensRoom_Text_RegisteredSteven, MSGBOX_DEFAULT - waitfanfare - closemessage - delay 30 - setflag FLAG_REGISTERED_STEVEN_POKENAV + //msgbox GraniteCave_StevensRoom_Text_ThankYouTakeThis, MSGBOX_DEFAULT + //giveitem ITEM_TM47 + //call_if_eq VAR_RESULT, FALSE, GraniteCave_StevensRoom_EventScript_BagFull + //msgbox GraniteCave_StevensRoom_Text_CouldBecomeChampionLetsRegister, MSGBOX_DEFAULT + //closemessage + //delay 30 + //playfanfare MUS_REGISTER_MATCH_CALL + //msgbox GraniteCave_StevensRoom_Text_RegisteredSteven, MSGBOX_DEFAULT + //waitfanfare + //closemessage + //delay 30 + //setflag FLAG_REGISTERED_STEVEN_POKENAV //insert own script here - goto GraniteCave_StevensRoom_EventScript_Steven_AskForHelp + goto GraniteCave_StevensRoom_EventScript_Colapse msgbox GraniteCave_StevensRoom_Text_IveGotToHurryAlong, MSGBOX_DEFAULT closemessage call_if_eq VAR_FACING, DIR_NORTH, GraniteCave_StevensRoom_EventScript_StevenExitNorth @@ -91,7 +91,7 @@ GraniteCave_StevensRoom_Text_ImStevenLetterForMe: .string "A LETTER for me?$" GraniteCave_StevensRoom_Text_ThankYouTakeThis: - .string "STEVEN: Okay, thank you.\p" + .string "STEVEN: Thank you.\p" .string "You went through all this trouble to\n" .string "deliver that. I need to thank you.\p" .string "Let me see…\n" @@ -150,9 +150,8 @@ GraniteCave_StevensRoom_Movement_StevenLookAround: step_end GraniteCave_StevensRoom_Text_AfterFall: - .string "That was... interesting.\p" - .string "Looks like you will be helping me\n" - .string "afterall.\p" + .string "That was unexpected...\l" + .string "Looks like that letter will need to wait.\p" .string "....................$" GraniteCave_StevensRoom_Text_UseDig: @@ -191,7 +190,7 @@ GraniteCave_StevensRoom_EventScript_Colapse:: faceplayer msgbox GraniteCave_StevensRoom_Text_AfterFall, MSGBOX_NPC delay 64 - msgbox GraniteCave_StevensRoom_Text_UseDig + msgbox GraniteCave_StevensRoom_Text_UseDig, MSGBOX_NPC delay 32 fadescreen 3 //applymovement OBJ_EVENT_ID_PLAYER, GraniteCave_StevensRoom_Movement_ReleaseBaltoy @@ -206,6 +205,7 @@ GraniteCave_StevensRoom_EventScript_Colapse:: setvar VAR_0x8007, 2 @ shake delay special ShakeCamera waitstate + setvar VAR_GRANITECAVE_AGGRON, 0 releaseall warp MAP_GRANITE_CAVE_B3F, 3, 0, 0 delay 32 diff --git a/data/maps/MeteorFalls_1F_2R/map.json b/data/maps/MeteorFalls_1F_2R/map.json index ee7857c3a..d363ca6bf 100644 --- a/data/maps/MeteorFalls_1F_2R/map.json +++ b/data/maps/MeteorFalls_1F_2R/map.json @@ -12,7 +12,7 @@ "allow_running": true, "show_map_name": true, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", - "connections": null, + "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_MAN_3", @@ -84,7 +84,9 @@ "dest_warp_id": "2" } ], - "coord_events": [], + "coord_events": [ + + ], "bg_events": [ { "type": "sign", diff --git a/data/maps/MeteorFalls_B1F_2R/map.json b/data/maps/MeteorFalls_B1F_2R/map.json index 8d153c423..5b181324c 100644 --- a/data/maps/MeteorFalls_B1F_2R/map.json +++ b/data/maps/MeteorFalls_B1F_2R/map.json @@ -12,7 +12,7 @@ "allow_running": true, "show_map_name": true, "battle_scene": "MAP_BATTLE_SCENE_NORMAL", - "connections": null, + "connections": 0, "object_events": [ { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", @@ -37,6 +37,10 @@ "dest_warp_id": "3" } ], - "coord_events": [], - "bg_events": [] + "coord_events": [ + + ], + "bg_events": [ + + ] } diff --git a/data/maps/map_groups.json b/data/maps/map_groups.json index 472f92e0f..76490da81 100644 --- a/data/maps/map_groups.json +++ b/data/maps/map_groups.json @@ -441,7 +441,8 @@ "PetalburgWoodsExt", "PetalburgWoodsext2", "GraniteCave_B3F", - "GraniteCave_B4F" + "GraniteCave_B4F", + "GraniteCave_B4FNorth" ], "gMapGroup_IndoorDynamic": [ "SecretBase_RedCave1", diff --git a/data/scripts/item_ball_scripts.inc b/data/scripts/item_ball_scripts.inc index 301d7aa27..8725fc103 100644 --- a/data/scripts/item_ball_scripts.inc +++ b/data/scripts/item_ball_scripts.inc @@ -394,6 +394,10 @@ GraniteCave_B4F_EventScript_ItemRareCandy:: finditem ITEM_RARE_CANDY end +GraniteCave_B4FNorth_EventScript_ItemMasterBall:: + finditem ITEM_MASTER_BALL + end + JaggedPass_EventScript_ItemBurnHeal:: finditem ITEM_BURN_HEAL end diff --git a/include/config.h b/include/config.h index 2ad84f29c..85d046cc0 100644 --- a/include/config.h +++ b/include/config.h @@ -74,6 +74,6 @@ #define GEN_LATEST GEN_8 // General settings -#define EXPANSION_INTRO TRUE // If TRUE, a custom RHH intro will play after the vanilla copyright screen. +#define EXPANSION_INTRO FALSE // If TRUE, a custom RHH intro will play after the vanilla copyright screen. #endif // GUARD_CONFIG_H diff --git a/include/constants/battle_setup.h b/include/constants/battle_setup.h index d825c88bc..e07645ebb 100644 --- a/include/constants/battle_setup.h +++ b/include/constants/battle_setup.h @@ -14,5 +14,7 @@ #define TRAINER_BATTLE_SET_TRAINER_A 10 #define TRAINER_BATTLE_SET_TRAINER_B 11 #define TRAINER_BATTLE_HILL 12 +#define TRAINER_BATTLE_NO_WHITEOUT_CONTINUE_SCRIPT 13 +#define TRAINER_BATTLE_NO_INTRO_NO_WHITEOUT 14 #endif // GUARD_CONSTANTS_BATTLE_SETUP_H diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index b94176334..5d607427b 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -647,8 +647,10 @@ #define STRINGID_STEALTHROCKDISAPPEAREDFROMTEAM 645 #define STRINGID_COULDNTFULLYPROTECT 646 #define STRINGID_STOCKPILEDEFFECTWOREOFF 647 +#define STRINGID_PLAYERWHITEOUT3 648 + +#define BATTLESTRINGS_COUNT 649 -#define BATTLESTRINGS_COUNT 648 // This is the string id that gBattleStringsTable starts with. // String ids before this (e.g. STRINGID_INTROMSG) are not in the table, diff --git a/include/constants/flags.h b/include/constants/flags.h index b67f26a3b..7c5eff40b 100644 --- a/include/constants/flags.h +++ b/include/constants/flags.h @@ -1231,7 +1231,7 @@ #define FLAG_ITEM_GRANITE_CAVE_4F_RARECANDY 0x49D // Unused Flag #define FLAG_STEVENS_CAVE_AGRON 0x49E // Unused Flag #define FLAG_STEVENS_CAVE_DUGDEEPER 0x49F // Unused Flag -#define FLAG_UNUSED_0x4A0 0x4A0 // Unused Flag +#define FLAG_ITEM_GRANITE_CAVE_4FNORTH_MASTERBALL 0x4A0 // Unused Flag #define FLAG_UNUSED_0x4A1 0x4A1 // Unused Flag #define FLAG_UNUSED_0x4A2 0x4A2 // Unused Flag #define FLAG_UNUSED_0x4A3 0x4A3 // Unused Flag diff --git a/include/constants/layouts.h b/include/constants/layouts.h index fb70b00b0..d8e3c397a 100755 --- a/include/constants/layouts.h +++ b/include/constants/layouts.h @@ -458,5 +458,6 @@ #define LAYOUT_RUSTBORO_CITY_LEAFS_HOUSE_2F 451 #define LAYOUT_GRANITE_CAVE_B3F 452 #define LAYOUT_GRANITE_CAVE_B4F 453 +#define LAYOUT_GRANITE_CAVE_B4FNORTH 454 #endif // GUARD_CONSTANTS_LAYOUTS_H diff --git a/include/constants/map_groups.h b/include/constants/map_groups.h index 7a817282e..125a16fe6 100755 --- a/include/constants/map_groups.h +++ b/include/constants/map_groups.h @@ -412,6 +412,7 @@ #define MAP_PETALBURG_WOODSEXT2 (109 | (24 << 8)) #define MAP_GRANITE_CAVE_B3F (110 | (24 << 8)) #define MAP_GRANITE_CAVE_B4F (111 | (24 << 8)) +#define MAP_GRANITE_CAVE_B4FNORTH (112 | (24 << 8)) // gMapGroup_IndoorDynamic #define MAP_SECRET_BASE_RED_CAVE1 (0 | (25 << 8)) diff --git a/src/battle_message.c b/src/battle_message.c index 2ecfac0c7..7c69a2462 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -85,6 +85,7 @@ static const u8 sText_PlayerWhiteout2[] = _("{B_PLAYER_NAME} panicked and lost #else static const u8 sText_PlayerWhiteout2[] = _("{B_PLAYER_NAME} whited out!{PAUSE_UNTIL_PRESS}"); #endif +static const u8 sText_PlayerWhiteout3[] = _("{B_PLAYER_NAME} lost the battle!{PAUSE_UNTIL_PRESS}"); static const u8 sText_PreventsEscape[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} prevents\nescape with {B_SCR_ACTIVE_ABILITY}!\p"); static const u8 sText_CantEscape2[] = _("Can't escape!\p"); static const u8 sText_AttackerCantEscape[] = _("{B_ATK_NAME_WITH_PREFIX} can't escape!"); @@ -911,6 +912,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PLAYERGOTMONEY - BATTLESTRINGS_TABLE_START] = sText_PlayerGotMoney, [STRINGID_PLAYERWHITEOUT - BATTLESTRINGS_TABLE_START] = sText_PlayerWhiteout, [STRINGID_PLAYERWHITEOUT2 - BATTLESTRINGS_TABLE_START] = sText_PlayerWhiteout2, + [STRINGID_PLAYERWHITEOUT3 - BATTLESTRINGS_TABLE_START] = sText_PlayerWhiteout3, [STRINGID_PREVENTSESCAPE - BATTLESTRINGS_TABLE_START] = sText_PreventsEscape, [STRINGID_HITXTIMES - BATTLESTRINGS_TABLE_START] = sText_HitXTimes, [STRINGID_PKMNFELLASLEEP - BATTLESTRINGS_TABLE_START] = sText_PkmnFellAsleep, diff --git a/src/battle_setup.c b/src/battle_setup.c index 71540eecf..c3a7e39ac 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -81,6 +81,7 @@ static void TryUpdateGymLeaderRematchFromTrainer(void); static void CB2_GiveStarter(void); static void CB2_StartFirstBattle(void); static void CB2_EndFirstBattle(void); +static bool8 BattleHasNoWhiteout(void); static void CB2_EndTrainerBattle(void); static bool32 IsPlayerDefeated(u32 battleOutcome); static u16 GetRematchTrainerId(u16 trainerId); @@ -89,7 +90,7 @@ static void HandleRematchVarsOnBattleEnd(void); static const u8 *GetIntroSpeechOfApproachingTrainer(void); static const u8 *GetTrainerCantBattleSpeech(void); -EWRAM_DATA static u16 sTrainerBattleMode = 0; +EWRAM_DATA u16 gTrainerBattleMode = 0; EWRAM_DATA u16 gTrainerBattleOpponent_A = 0; EWRAM_DATA u16 gTrainerBattleOpponent_B = 0; EWRAM_DATA u16 gPartnerTrainerId = 0; @@ -158,7 +159,7 @@ static const u8 sBattleTransitionTable_BattleDome[] = static const struct TrainerBattleParameter sOrdinaryBattleParams[] = { - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, + {&gTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, @@ -171,7 +172,7 @@ static const struct TrainerBattleParameter sOrdinaryBattleParams[] = static const struct TrainerBattleParameter sContinueScriptBattleParams[] = { - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, + {&gTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, @@ -184,7 +185,7 @@ static const struct TrainerBattleParameter sContinueScriptBattleParams[] = static const struct TrainerBattleParameter sDoubleBattleParams[] = { - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, + {&gTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, @@ -197,7 +198,7 @@ static const struct TrainerBattleParameter sDoubleBattleParams[] = static const struct TrainerBattleParameter sOrdinaryNoIntroBattleParams[] = { - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, + {&gTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerAIntroSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, @@ -210,7 +211,7 @@ static const struct TrainerBattleParameter sOrdinaryNoIntroBattleParams[] = static const struct TrainerBattleParameter sContinueScriptDoubleBattleParams[] = { - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, + {&gTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, @@ -223,7 +224,7 @@ static const struct TrainerBattleParameter sContinueScriptDoubleBattleParams[] = static const struct TrainerBattleParameter sTrainerBOrdinaryBattleParams[] = { - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, + {&gTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_B, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerBIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, @@ -236,7 +237,7 @@ static const struct TrainerBattleParameter sTrainerBOrdinaryBattleParams[] = static const struct TrainerBattleParameter sTrainerBContinueScriptBattleParams[] = { - {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, + {&gTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_B, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerObjectEventLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerBIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, @@ -492,7 +493,7 @@ void StartWallyTutorialBattle(void) void LaironBattle(void){ u16 monData; - CreateMaleMon(&gEnemyParty[0], SPECIES_LAIRON, 22); + CreateMaleMon(&gEnemyParty[0], SPECIES_LAIRON, 23); monData = MOVE_METAL_CLAW; SetMonData(&gEnemyParty[0], MON_DATA_MOVE1, &monData); monData = MOVE_MUD_SLAP; @@ -503,7 +504,7 @@ void LaironBattle(void){ SetMonData(&gEnemyParty[0], MON_DATA_MOVE4, &monData); gMain.savedCallback = CB2_ReturnToFieldContinueScriptPlayMapMusic; - CreateBattleStartTask(B_TRANSITION_SLICE, 0); + CreateBattleStartTask(B_TRANSITION_SLICE, MUS_HELP); } void BattleSetup_StartScriptedWildBattle(void) @@ -1059,7 +1060,7 @@ void ResetTrainerOpponentIds(void) static void InitTrainerBattleVariables(void) { - sTrainerBattleMode = 0; + gTrainerBattleMode = 0; if (gApproachingTrainerId == 0) { sTrainerAIntroSpeech = NULL; @@ -1146,11 +1147,12 @@ const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data) { if (TrainerBattleLoadArg8(data) != TRAINER_BATTLE_SET_TRAINER_B) InitTrainerBattleVariables(); - sTrainerBattleMode = TrainerBattleLoadArg8(data); + gTrainerBattleMode = TrainerBattleLoadArg8(data); - switch (sTrainerBattleMode) + switch (gTrainerBattleMode) { case TRAINER_BATTLE_SINGLE_NO_INTRO_TEXT: + case TRAINER_BATTLE_NO_INTRO_NO_WHITEOUT: TrainerBattleLoadArgs(sOrdinaryNoIntroBattleParams, data); return EventScript_DoNoIntroTrainerBattle; case TRAINER_BATTLE_DOUBLE: @@ -1158,6 +1160,7 @@ const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data) SetMapVarsToTrainer(); return EventScript_TryDoDoubleTrainerBattle; case TRAINER_BATTLE_CONTINUE_SCRIPT: + case TRAINER_BATTLE_NO_WHITEOUT_CONTINUE_SCRIPT: if (gApproachingTrainerId == 0) { TrainerBattleLoadArgs(sContinueScriptBattleParams, data); @@ -1272,7 +1275,7 @@ void SetTrainerFacingDirection(void) u8 GetTrainerBattleMode(void) { - return sTrainerBattleMode; + return gTrainerBattleMode; } bool8 GetTrainerFlag(void) @@ -1367,6 +1370,14 @@ void BattleSetup_StartTrainerBattle(void) ScriptContext_Stop(); } +static bool8 BattleHasNoWhiteout() +{ + if (gTrainerBattleMode == TRAINER_BATTLE_NO_WHITEOUT_CONTINUE_SCRIPT || gTrainerBattleMode == TRAINER_BATTLE_NO_INTRO_NO_WHITEOUT) + return TRUE; + else + return FALSE; +} + static void CB2_EndTrainerBattle(void) { if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) @@ -1375,7 +1386,7 @@ static void CB2_EndTrainerBattle(void) } else if (IsPlayerDefeated(gBattleOutcome) == TRUE) { - if (InBattlePyramid() || InTrainerHillChallenge()) + if (InBattlePyramid() || InTrainerHillChallenge() || BattleHasNoWhiteout()) SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); else SetMainCallback2(CB2_WhiteOut); @@ -1492,8 +1503,8 @@ void PlayTrainerEncounterMusic(void) else trainerId = gTrainerBattleOpponent_B; - if (sTrainerBattleMode != TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC - && sTrainerBattleMode != TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC) + if (gTrainerBattleMode != TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC + && gTrainerBattleMode != TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC) { switch (GetTrainerEncounterMusicId(trainerId)) { diff --git a/src/data/map_group_count.h b/src/data/map_group_count.h index a05d7b015..0f8e8c4d0 100644 --- a/src/data/map_group_count.h +++ b/src/data/map_group_count.h @@ -1 +1 @@ -static const u8 MAP_GROUP_COUNT[] = {63, 5, 5, 6, 7, 8, 9, 7, 7, 14, 8, 19, 10, 23, 13, 15, 15, 2, 2, 2, 3, 1, 1, 1, 112, 61, 89, 2, 1, 13, 1, 1, 3, 1, 0}; +static const u8 MAP_GROUP_COUNT[] = {63, 5, 5, 6, 7, 8, 9, 7, 7, 14, 8, 19, 10, 23, 13, 15, 15, 2, 2, 2, 3, 1, 1, 1, 113, 61, 89, 2, 1, 13, 1, 1, 3, 1, 0}; diff --git a/src/data/wild_encounters.json b/src/data/wild_encounters.json index ebf28ab53..fd6d0410b 100755 --- a/src/data/wild_encounters.json +++ b/src/data/wild_encounters.json @@ -12160,6 +12160,75 @@ } ] } + }, + { + "map": "MAP_GRANITE_CAVE_B4FNORTH", + "base_label": "gGraniteCave_B4FNorth0", + "land_mons": { + "encounter_rate": 10, + "mons": [ + { + "min_level": 10, + "max_level": 10, + "species": "SPECIES_ZUBAT" + }, + { + "min_level": 11, + "max_level": 11, + "species": "SPECIES_ARON" + }, + { + "min_level": 10, + "max_level": 10, + "species": "SPECIES_ARON" + }, + { + "min_level": 11, + "max_level": 11, + "species": "SPECIES_ZUBAT" + }, + { + "min_level": 12, + "max_level": 12, + "species": "SPECIES_ARON" + }, + { + "min_level": 10, + "max_level": 10, + "species": "SPECIES_ABRA" + }, + { + "min_level": 10, + "max_level": 10, + "species": "SPECIES_BELDUM" + }, + { + "min_level": 11, + "max_level": 11, + "species": "SPECIES_BELDUM" + }, + { + "min_level": 12, + "max_level": 12, + "species": "SPECIES_ONIX" + }, + { + "min_level": 10, + "max_level": 10, + "species": "SPECIES_ONIX" + }, + { + "min_level": 12, + "max_level": 12, + "species": "SPECIES_SABLEYE" + }, + { + "min_level": 14, + "max_level": 16, + "species": "SPECIES_GOLBAT" + } + ] + } } ] }, diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 040224eb4..8c6492ae8 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -39,9 +39,16 @@ static EWRAM_DATA u8 sWildEncounterImmunitySteps = 0; static EWRAM_DATA u16 sPrevMetatileBehavior = 0; +static EWRAM_DATA u8 sCurrentDirection = 0; +static EWRAM_DATA u8 sPreviousDirection = 0; u8 gSelectedObjectEvent; +static void SetDirectionFromHeldKeys(u16 heldKeys); +static u8 GetDirectionFromBitfield(u8 bitfield); +static void GetPlayerPosition(struct MapPosition *); +static void GetInFrontOfPlayerPosition(struct MapPosition *); + static void GetPlayerPosition(struct MapPosition *); static void GetInFrontOfPlayerPosition(struct MapPosition *); static u16 GetPlayerCurMetatileBehavior(int); @@ -123,14 +130,16 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) input->checkStandardWildEncounter = TRUE; } - if (heldKeys & DPAD_UP) + /* if (heldKeys & DPAD_UP) input->dpadDirection = DIR_NORTH; else if (heldKeys & DPAD_DOWN) input->dpadDirection = DIR_SOUTH; else if (heldKeys & DPAD_LEFT) input->dpadDirection = DIR_WEST; else if (heldKeys & DPAD_RIGHT) - input->dpadDirection = DIR_EAST; + input->dpadDirection = DIR_EAST; */ + SetDirectionFromHeldKeys(heldKeys); + input->dpadDirection = sCurrentDirection; #if DEBUG_OVERWORLD_MENU == TRUE && DEBUG_OVERWORLD_IN_MENU == FALSE if ((heldKeys & DEBUG_OVERWORLD_HELD_KEYS) && input->DEBUG_OVERWORLD_TRIGGER_EVENT) @@ -1044,3 +1053,55 @@ int SetCableClubWarp(void) SetupWarp(&gMapHeader, GetWarpEventAtMapPosition(&gMapHeader, &position), &position); return 0; } + + +//Smooth Movment +static u8 GetDirectionFromBitfield(u8 bitfield) +{ + u8 direction = 0; + while (bitfield >>= 1) direction++; + return direction; +} + +static void SetDirectionFromHeldKeys(u16 heldKeys) +{ + u8 dpadDirections = 0; + + if (heldKeys & DPAD_UP) + dpadDirections |= (1 << DIR_NORTH); + if (heldKeys & DPAD_DOWN) + dpadDirections |= (1 << DIR_SOUTH); + if (heldKeys & DPAD_LEFT) + dpadDirections |= (1 << DIR_WEST); + if (heldKeys & DPAD_RIGHT) + dpadDirections |= (1 << DIR_EAST); + + if (dpadDirections == 0) // no dir is pushed + { + sCurrentDirection = DIR_NONE; + sPreviousDirection = DIR_NONE; + return; + } + + if ((dpadDirections & (dpadDirections - 1)) == 0) // only 1 dir is pushed + { + // simply set currDir to that dir + sCurrentDirection = GetDirectionFromBitfield(dpadDirections); + sPreviousDirection = DIR_NONE; + return; + } + + if (((dpadDirections >> sCurrentDirection) & 1) == 0) // none of the multiple dirs pushed is currDir + { + sCurrentDirection = DIR_NONE; + sPreviousDirection = DIR_NONE; + } + else if ((sPreviousDirection == DIR_NONE) || (((dpadDirections >> sPreviousDirection) & 1) == 0)) + { + // turn + sCurrentDirection = GetDirectionFromBitfield(dpadDirections & ~(1 << sCurrentDirection)); + sPreviousDirection = sCurrentDirection; + } + // else, currDir and prevDir are the dirs pushed + // do nothing (keep the same currDir and prevDir) +} \ No newline at end of file