//#ifndef GUARD_DATA_SCRIPT_H //#define GUARD_DATA_SCRIPT_H #include "constants/bg_music.h" #include "constants/cutscenes.h" #include "constants/direction.h" #include "constants/event_flag.h" #include "constants/ground_map.h" #include "constants/item.h" #include "constants/palette_util.h" #include "constants/rescue_dungeon_id.h" #include "constants/script_dungeon_id.h" #include "constants/script_cmd.h" #include "constants/script_id.h" #include "structs/str_ground_script.h" #include "ground_place.h" #include "portrait_placement.h" #define LPARRAY(x) (ARRAY_COUNT(x)), x #define CPOS_HALFTILE 0x2 #define CPOS_CURRENT 0x4 // 01..07: complex map/dungeon selection/check commands // TODO: CMD_BYTE_01 // Seems to be a general command for setting up which dungeon to enter next. // u: Unknown. // d: enum "ScriptDungeonId". #define NEXT_DUNGEON(u, d) { CMD_BYTE_02, 0, u, d, 0, NULL } // TODO: CMD_BYTE_03 // TODO: CMD_BYTE_04 // TODO: CMD_BYTE_05 // TODO: CMD_BYTE_06 // TODO: CMD_BYTE_07 // m: enum "GroundMapID". #define SELECT_MAP(m) { CMD_BYTE_08, 0, 0, m, 0, NULL } #define SELECT_GROUND(m) { CMD_BYTE_09, 0, 0, m, 0, NULL } #define SELECT_DUNGEON(m, d, f, b) { CMD_BYTE_0A, b, f, d, m, NULL } #define SELECT_WEATHER(w) { CMD_BYTE_0B, 0, 0, w, 0, NULL } // Uses the map from SELECT_MAP. // Does GroundLives_Select(), GroundObject_Select(), GroundEffect_Select(), and GroundEvent_Select(). // g: Group. -1 will use the ScriptInfo group. // s: Sector. -1 will use the ScriptInfo sector. #define SELECT_ENTITIES(g, s) { CMD_BYTE_0C, s, g, 0, 0, NULL } #define SELECT_LIVES(g,s) { CMD_BYTE_0D, s, g, 0, 0, NULL } #define SELECT_OBJECTS(g,s) { CMD_BYTE_0E, s, g, 0, 0, NULL } #define SELECT_EFFECTS(g,s) { CMD_BYTE_0F, s, g, 0, 0, NULL } #define SELECT_EVENTS(g,s) { CMD_BYTE_10, s, g, 0, 0, NULL } #define CANCEL_ENTITIES(g,s) { CMD_BYTE_11, s, g, 0, 0, NULL } #define CANCEL_LIVES(g,s) { CMD_BYTE_12, s, g, 0, 0, NULL } #define CANCEL_OBJECTS(g,s) { CMD_BYTE_13, s, g, 0, 0, NULL } #define CANCEL_EFFECTS(g,s) { CMD_BYTE_14, s, g, 0, 0, NULL } #define CANCEL_EVENTS(g,s) { CMD_BYTE_15, s, g, 0, 0, NULL } #define CANCEL_OFFSCREEN_LIVES { CMD_BYTE_16, 0, 0, 0, 0, NULL } #define CANCEL_OFFSCREEN_OBJECTS { CMD_BYTE_17, 0, 0, 0, 0, NULL } #define CANCEL_OFFSCREEN_EFFECTS { CMD_BYTE_18, 0, 0, 0, 0, NULL } #define SPAWN_OBJECT(k,d,g,s) { CMD_BYTE_19, s, g, d, k, NULL } #define SPAWN_EFFECT(k,d,g,s) { CMD_BYTE_1A, s, g, d, k, NULL } // f: enum "ScriptID". #define EXECUTE_FUNCTION(f) { CMD_BYTE_1B, 0, f, 0, 0, NULL } // f: enum "ScriptID". #define EXECUTE_SUBROUTINE(f) { CMD_BYTE_1C, 0, f, 0, 0, NULL } #define EXECUTE_STATION(m,g,s) { CMD_BYTE_1D, s, g, m, 0, NULL } #define EXECUTE_SUBSTATION(m,g,s) { CMD_BYTE_1E, s, g, m, 0, NULL } #define RESCUE_SELECT { CMD_BYTE_1F, 0, 0, 0, 0, NULL } // TODO: CMD_BYTE_20: execute script as parented object, maybe? Unused in ROM // TODO: CMD_BYTE_21: follow object/make object follow/get parented? // TODO: CMD_BYTE_22 // TODO: CMD_BYTE_23 // TODO: CMD_BYTE_24 // TODO: CMD_BYTE_25 // TODO: CMD_BYTE_26 // a0: Some bool // kind: See enum "PaletteUtilUnk0Kind" // a2: ? // rgb: (R << 16) | (G << 8) | (B) #define FLASH_FROM(a0, kind, a2, rgb) { CMD_BYTE_27, a0, kind, a2, rgb, NULL } // a0: Some bool // kind: See enum "PaletteUtilUnk0Kind" // a2: ? // rgb: (R << 16) | (G << 8) | (B) #define FLASH_TO(a0, kind, a2, rgb) { CMD_BYTE_28, a0, kind, a2, rgb, NULL } // TODO: CMD_BYTE_29 // TODO: CMD_BYTE_2A // Waits specified number of frames, then automatically does a button press without waiting for player's input. // -1 disables it. #define TEXTBOX_AUTO_PRESS(endF, midF) { CMD_BYTE_2B, 0, 0, endF, midF, NULL } // TODO: CMD_BYTE_2C // TODO: CMD_BYTE_2D // Sets up portrait data for the specified speaker // Note for the spriteId: first 4 bits(0xF) are the actual spriteId, but sometimes a 0x40 flag is attached to it, but it has no practical use. // Could be different in Blue? #define PORTRAIT(place, id, sprite) { CMD_BYTE_2E, place, id, sprite, 0, NULL } // Same as the above, but it assumes the last used placement for the speaker. // Useful in long scripts, where you don't need to remember all the placements. #define PORTRAIT_REP(id, sprite) { CMD_BYTE_2E, PLACEMENT_COUNT, id, sprite, 0, NULL } // Sets portrait delta position, which modifies the portrait's position on the screen. #define PORTRAIT_POS(id, x, y) { CMD_BYTE_2F, 0, id, x, y, NULL } #define TEXTBOX_CLEAR { CMD_BYTE_30, 0, 0, 0, 0, NULL } // Used rarely. I don't think there's a functional difference from TEXTBOX_CLEAR. #define TEXTBOX_CLEAR2 { CMD_BYTE_31, 0, 0, 0, 0, NULL } #define MSG_INSTANT(msg) { CMD_BYTE_32, 0, -1, 0, 0, msg } // Used for messages that don't make a sound while printing characters. // The player hero, Munchlax munching, and the voice in Murky Cave use this. // id: Speaker ID. -1 for no portrait. #define MSG_QUIET(id, msg) { CMD_BYTE_33, 0, id, 0, 0, msg } // id: Speaker ID. -1 for no portrait. #define MSG_NPC(id, msg) { CMD_BYTE_34, 0, id, 0, 0, msg } #define MSG_LETTER(msg) { CMD_BYTE_35, 0, -1, 0, 0, msg } // Used for sounds or dialogue the player hears from the background such as flapping, boss cries, and NPCs conversing. #define MSG_OVERHEARD(msg) { CMD_BYTE_36, 0, -1, 0, 0, msg } // Prints raw text on bg without any windows. // Used for the intro portal messages. // To advance the text, the player needs to press a button. #define MSG_ON_BG(msg) { CMD_BYTE_37, 0, -1, 0, 0, msg } // Identical to the above, used literally once for just a newline. #define MSG_ON_BG2(msg) { CMD_BYTE_38, 0, -1, 0, 0, msg } // Similar to the above, but the message appears and fades automatically, without any player's input. // Used for narration text. // The short argument isn't really used, but needs to be greater than 0. #define MSG_ON_BG_AUTO(u, msg) { CMD_BYTE_39, 0, u, 0, 0, msg } // TODO: CMD_BYTE_3A: yes/no choice (only used for saving) // TODO: CMD_BYTE_3B: uber command (conditional jump) // k=0x30 checks if gardevoir has space to join by checking its friend area // k=0x31 names gardevoir? // k=0x32 tries to recruit Gardevoir // k: See enum "SpecialTextKind" // i: ??? // t: ??? #define SPECIAL_TEXT(k, i, t) { CMD_BYTE_3C, k, 0, i, t, NULL } #define RENAME_ALLY(id) { CMD_BYTE_3D, 0, 0, id, 0, NULL } #define RENAME_TEAM { CMD_BYTE_3E, 0, 0, 0, 0, NULL } // TODO: CMD_BYTE_3F: input box? // TODO: CMD_BYTE_40: unused? #define REMOVE_ITEMSTACK(i) { CMD_BYTE_41, 0, i, 0, 0, NULL } #define MUSIC_STOP_ALL { CMD_BYTE_42, 0, 0, 0, 0, NULL } #define MUSIC_FADEOUT_ALL(f) { CMD_BYTE_43, 0, f, 0, 0, NULL } #define BGM_SWITCH(i) { CMD_BYTE_44, 0, 0, i, 0, NULL } #define BGM_FADEIN(f,i) { CMD_BYTE_45, 0, f, i, 0, NULL } #define BGM_QUEUE(i) { CMD_BYTE_46, 0, 0, i, 0, NULL } #define BGM_STOP { CMD_BYTE_47, 0, 0, 0, 0, NULL } #define BGM_FADEOUT(f) { CMD_BYTE_48, 0, f, 0, 0, NULL } #define FANFARE_PLAY(i) { CMD_BYTE_49, 0, 0, i, 0, NULL } #define FANFARE_STOP(i) { CMD_BYTE_4A, 0, 0, i, 0, NULL } #define FANFARE_FADEOUT(f,i) { CMD_BYTE_4B, 0, f, i, 0, NULL } #define FANFARE_PLAY2(i) { CMD_BYTE_4C, 0, 0, i, 0, NULL } #define FANFARE_STOP2(i) { CMD_BYTE_4D, 0, 0, i, 0, NULL } #define FANFARE_FADEOUT2(f,i) { CMD_BYTE_4E, 0, f, i, 0, NULL } // TODO: CMD_BYTE_4F // TODO: CMD_BYTE_50 // TODO: CMD_BYTE_51 // TODO: CMD_BYTE_52 // TODO: CMD_BYTE_53 #define SELECT_ANIMATION(id) { CMD_BYTE_54, 0, id, 0, 0, NULL } // TODO: CMD_BYTE_55 // TODO: CMD_BYTE_56 // TODO: CMD_BYTE_57 // TODO: CMD_BYTE_58 // TODO: CMD_BYTE_59 // TODO: CMD_BYTE_5A // For WARP/WALK, every map has a list of predefined locations. #define WARP_WAYPOINT(u,w) { CMD_BYTE_5B, u, 0, w, 0, NULL } // TODO: CMD_BYTE_5C // TODO: CMD_BYTE_5D // TODO: CMD_BYTE_5E // TODO: CMD_BYTE_5F // TODO: CMD_BYTE_60 // TODO: CMD_BYTE_61 // TODO: CMD_BYTE_62 // TODO: CMD_BYTE_63 // TODO: CMD_BYTE_64 // TODO: CMD_BYTE_65 // TODO: CMD_BYTE_66 // TODO: CMD_BYTE_67 // TODO: CMD_BYTE_68 // TODO: CMD_BYTE_69 #define WALK_RELATIVE(spd,h,v) { CMD_BYTE_6A, 0, spd, h, v, NULL } #define WALK_GRID(spd,w) { CMD_BYTE_6B, 0, spd, w, 0, NULL } // TODO: CMD_BYTE_6C // TODO: CMD_BYTE_6D // TODO: CMD_BYTE_6E // TODO: CMD_BYTE_6F // TODO: CMD_BYTE_70 // TODO: CMD_BYTE_71 // TODO: CMD_BYTE_72 // TODO: CMD_BYTE_73 // TODO: CMD_BYTE_74 // TODO: CMD_BYTE_75 // TODO: CMD_BYTE_76 // TODO: CMD_BYTE_77 // TODO: CMD_BYTE_78 // TODO: CMD_BYTE_79 #define WALK_DIRECT(spd,w) { CMD_BYTE_7A, 0, spd, w, 0, NULL } // TODO: CMD_BYTE_7B // TODO: CMD_BYTE_7C // TODO: CMD_BYTE_7D // TODO: CMD_BYTE_7E // TODO: CMD_BYTE_7F // TODO: CMD_BYTE_80 // TODO: CMD_BYTE_81 // TODO: CMD_BYTE_82 // TODO: CMD_BYTE_83 // TODO: CMD_BYTE_84 // TODO: CMD_BYTE_85 #define CAMERA_PAN(u1,u2) { CMD_BYTE_86, 0, u1, u2, 0, NULL } // TODO: CMD_BYTE_87 // TODO: CMD_BYTE_88 // TODO: CMD_BYTE_89 #define CMD_UNK_8A(a,b,t) { CMD_BYTE_8A, a, b, t, 0, NULL } // Sets the parent object's direction then waits the specified number of frames. // d: Direction to set. Can be -1 also, which doesn't set the object's direction, but is still stored in the action script data. // f: Amount of frames to wait afterwards. #define SET_DIR_WAIT(d, f) { CMD_BYTE_8B, f, d, 0, 0, NULL } #define CMD_UNK_8C(a,t,c) { CMD_BYTE_8C, a, t, c, 0, NULL } #define CMD_UNK_8D(a,t) { CMD_BYTE_8D, a, t, 0, 0, NULL } #define CMD_UNK_8E(a,t,c) { CMD_BYTE_8E, a, t, c, 0, NULL } #define CMD_UNK_8F(a,t,c) { CMD_BYTE_8F, a, t, c, 0, NULL } #define CMD_UNK_90(a,t,c) { CMD_BYTE_90, a, t, c, 0, NULL } // o: Final orientation #define ROTATE_TO(spd,t,o) { CMD_BYTE_91, spd, t, o, 0, NULL } #define CMD_UNK_92(a,b,t) { CMD_BYTE_92, a, b, t, 0, NULL } #define CMD_UNK_93(a,t,c) { CMD_BYTE_93, a, t, c, 0, NULL } #define CMD_UNK_94(a,t,c) { CMD_BYTE_94, a, t, c, 0, NULL } #define CMD_UNK_95(a,t,c) { CMD_BYTE_95, a, t, c, 0, NULL } // TODO: CMD_BYTE_96 // TODO: CMD_BYTE_97 #define CAMERA_INIT_PAN { CMD_BYTE_98, 0, 0, 0, 0, NULL } #define CAMERA_END_PAN { CMD_BYTE_99, 0, 0, 0, 0, NULL } // TODO: CMD_BYTE_9A // TODO: CMD_BYTE_9B // TODO: CMD_BYTE_9C // TODO: CMD_BYTE_9D // TODO: CMD_BYTE_9E // TODO: CMD_BYTE_9F // TODO: CMD_BYTE_A0 // TODO: CMD_BYTE_A1 // TODO: CMD_BYTE_A2 // TODO: CMD_BYTE_A3 #define RESET_ARRAY(v) { CMD_BYTE_A4, 0, v, 0, 0, NULL } #define CLEAR_ARRAY(v) { CMD_BYTE_A5, 0, v, 0, 0, NULL } #define UPDATE_VARINT(o,v,i) { CMD_BYTE_A6, o, v, i, 0, NULL } #define UPDATE_VARVAR(o,a,b) { CMD_BYTE_A7, o, a, b, 0, NULL } #define SET_ARRAYVAL(v,i,x) { CMD_BYTE_A8, 0, v, i, x, NULL } #define SCENARIO_CALC(v,a,b) { CMD_BYTE_A9, 0, v, a, b, NULL } #define SCENARIO_ADVANCE(v,a) { CMD_BYTE_AA, 0, v, a, 0, NULL } // r is the value to put in DUNGEON_RESULT. // e is the value to put in DUNGEON_ENTER. #define SET_DUNGEON_RES(r,e) { CMD_BYTE_AB, 0, r, e, 0, NULL } #define SET_PLAYER_KIND(k) { CMD_BYTE_AC, 0, k, 0, 0, NULL } #define UNLOCK_FRIEND_AREA(a) { CMD_BYTE_AD, TRUE, a, 0, 0, NULL } #define CMD_UNK_AE(r) { CMD_BYTE_AE, TRUE, r, 0, 0, NULL } #define CMD_UNK_AF(r, b) { CMD_BYTE_AF, b, r, 0, 0, NULL } #define SET_RESCUE_CONQUERED(s) { CMD_BYTE_B0, TRUE, s, 0, 0, NULL } // TODO: CMD_BYTE_B1 // TODO: CMD_BYTE_B2 #define JUMPIF_EQUAL(v,i,l) { CMD_BYTE_B3, l, v, i, 0, NULL } #define JUMPIF(o,v,i,l) { CMD_BYTE_B4, o, l, v, i, NULL } #define JUMPIF_2(o,a,b,l) { CMD_BYTE_B5, o, l, a, b, NULL } #define JUMPIF_ARRAY(v,i,l) { CMD_BYTE_B6, 0, l, v, i, NULL } #define JUMPIF_SUM(o,v,i,l) { CMD_BYTE_B7, o, l, v, i, NULL } #define JUMPIF_SCENE_LT(v,a,b,l) { CMD_BYTE_B8, l, v, a, b, NULL } #define JUMPIF_SCENE_EQ(v,a,b,l) { CMD_BYTE_B9, l, v, a, b, NULL } #define JUMPIF_SCENE_GT(v,a,b,l) { CMD_BYTE_BA, l, v, a, b, NULL } // Jumps to a label if `CheckQuest(i)` returns TRUE. // i: The quest to check. See enum "MainQuest". // l: The label to jump to. #define JUMPIF_SCENARIOCHECK(i,l) { CMD_BYTE_BB, l, i, 0, 0, NULL } #define JUMPIF_CUTSCENE_FLAG(f,l) { CMD_BYTE_BC, l, f, 0, 0, NULL } #define JUMPIF_UNK_BD(i,l) { CMD_BYTE_BD, l, 0, i, 0, NULL } #define JUMPIF_UNK_BE(l) { CMD_BYTE_BE, l, 0, 0, 0, NULL } #define JUMPIF_HASITEM(i,l) { CMD_BYTE_BF, l, i, 0, 0, NULL } #define CJUMP_VAR(v) { CMD_BYTE_C0, 0, v, 0, 0, NULL } #define CJUMP_CALC_VI(o,v,i) { CMD_BYTE_C1, o, v, i, 0, NULL } #define CJUMP_CALC_VV(o,a,b) { CMD_BYTE_C2, o, a, b, 0, NULL } #define CJUMP_RANDOM(h) { CMD_BYTE_C3, 0, h, 0, 0, NULL } #define CJUMP_SCENARIO_0(v) { CMD_BYTE_C4, 0, v, 0, 0, NULL } #define CJUMP_SCENARIO_1(v) { CMD_BYTE_C5, 0, v, 0, 0, NULL } #define CJUMP_UNK_C6(a) { CMD_BYTE_C6, 0, 0, a, 0, NULL } #define CJUMP_DIRECTION { CMD_BYTE_C7, 0, 0, 0, 0, NULL } // C8: distance calculation with that weird 80A7AE8 #define CJUMP_UNK_C8(a) { CMD_BYTE_C8, 0, 0, a, 0, NULL } // C9: ditto, but with one hardcoded pos of four #define CJUMP_UNK_C9(a) { CMD_BYTE_C9, 0, 0, a, 0, NULL } #define CJUMP_DIR_TO_LINK(l) { CMD_BYTE_CA, 0, 0, l, 0, NULL } #define CJUMP_UNK_CB(h) { CMD_BYTE_CB, 0, h, 0, 0, NULL } #define COND_EQUAL(v,t) { CMD_BYTE_CC, 0, t, v, 0, NULL } #define COND(o,v,t) { CMD_BYTE_CD, o, t, v, 0, NULL } #define COND_VAR(o,v,t) { CMD_BYTE_CE, o, t, v, 0, NULL } #define MSG_VAR(b,v,a) { CMD_BYTE_CF, b, v, a, 0, NULL } #define VARIANT(c,s) { CMD_BYTE_D0, 0, c, 0, 0, s } #define VARIANT_DEFAULT(s) { CMD_BYTE_D1, 0, 0, 0, 0, s } #define ASK_DEBUG(b,h,a,s) { CMD_BYTE_D2, b, h, a, 0, s } #define ASK1(b,h,a,s) { CMD_BYTE_D3, b, h, a, 0, s } #define ASK2(b,h,a,s) { CMD_BYTE_D4, b, h, a, 0, s } #define ASK3(b,h,a,s) { CMD_BYTE_D5, b, h, a, 0, s } #define ASK1_VAR(b,h,a,v) { CMD_BYTE_D6, b, h, a, v, NULL } #define ASK2_VAR(b,h,a,v) { CMD_BYTE_D7, b, h, a, v, NULL } #define ASK3_VAR(b,h,a,v) { CMD_BYTE_D8, b, h, a, v, NULL } #define CHOICE(h,s) { CMD_BYTE_D9, 0, h, 0, 0, s } // TODO: CMD_BYTE_DA #define WAIT(f) { CMD_BYTE_DB, 0, f, 0, 0, NULL } #define WAIT_RANDOM(a,b) { CMD_BYTE_DC, 0, a, b, 0, NULL } #define STOP_ANIMATION_ON_CURRENT_FRAME { CMD_BYTE_DD, 0, 0, 0, 0, NULL } // TODO: CMD_BYTE_DE // TODO: CMD_BYTE_DF // TODO: CMD_BYTE_E0 #define WAIT_FANFARE1(id) { CMD_BYTE_E1, 0, id, 0, 0, NULL } #define WAIT_FANFARE2(id) { CMD_BYTE_E2, 0, id, 0, 0, NULL } #define AWAIT_CUE(id) { CMD_BYTE_E3, 0, id, 0, 0, NULL } #define ALERT_CUE(id) { CMD_BYTE_E4, 0, id, 0, 0, NULL } // a: Value to place in script's `branchDiscriminant`. // b: Value to place in `gUnlockBranchLabels[a]`. #define CMD_UNK_E5(a, b) { CMD_BYTE_E5, b, a, 0, 0, NULL } #define CALL_LABEL(x) { CMD_BYTE_E6, 0, x, 0, 0, NULL } #define JUMP_LABEL(x) { CMD_BYTE_E7, 0, x, 0, 0, NULL } #define CALL_SCRIPT(x) { CMD_BYTE_E8, 0, x, 0, 0, NULL } #define JUMP_SCRIPT(x) { CMD_BYTE_E9, 0, x, 0, 0, NULL } #define CALL_STATION(g,s) { CMD_BYTE_EA, s, g,-1, 0, NULL } #define JUMP_STATION(g,s) { CMD_BYTE_EB, s, g,-1, 0, NULL } #define EXECUTE_MAP_VAR(v) { CMD_BYTE_EC, 0, v, 0, 0, NULL } #define RESET_CALLER { CMD_BYTE_ED, 0, 0, 0, 0, NULL } #define RET_DIRECT { CMD_BYTE_EE, 0, 0, 0, 0, NULL } #define RET { CMD_BYTE_EF, 0, 0, 0, 0, NULL } #define HALT { CMD_BYTE_F0, 0, 0, 0, 0, NULL } #define END_DELETE { CMD_BYTE_F1, 0, 0, 0, 0, NULL } // Unused #define CMD_F2 { CMD_BYTE_F2, 0, 0, 0, 0, NULL } // Unused #define CMD_F3 { CMD_BYTE_F3, 0, 0, 0, 0, NULL } // Serves as an offset which the script can reference for jumps. #define LABEL(x) { CMD_BYTE_F4, 0, x, 0, 0, NULL } // Unused #define CMD_F5 { CMD_BYTE_F5, 0, 0, 0, 0, NULL } #ifdef NONMATCHING #define DEBUGINFO { CMD_BYTE_F6, 0, __LINE__, 0, 0, __FILE__ } #define DEBUGINFO_O(originalLineNum) DEBUGINFO #else #define DEBUGINFO_O(originalLineNum) { CMD_BYTE_F6, 0, originalLineNum, 0, 0, FAKE_FILENAME } #endif //#endif // GUARD_DATA_SCRIPT_H