mirror of
https://github.com/everything8215/ff6.git
synced 2024-11-26 22:20:22 +00:00
d9a71016e1
Add support for SFC version (jp) Generate debug files Add partial RAM map for menu and battle graphics Added some helper macros Fix some Windows compatibility issues
1215 lines
32 KiB
PHP
1215 lines
32 KiB
PHP
.ifndef EVENT_INC
|
|
EVENT_INC = 1
|
|
|
|
.setcpu "none"
|
|
|
|
.enum SCRIPT_MODE
|
|
EVENT
|
|
OBJ
|
|
WORLD
|
|
VEHICLE
|
|
.endenum
|
|
|
|
.define set_script_mode(mode) ::script_mode .set SCRIPT_MODE::mode
|
|
.define is_script_mode(mode) ::script_mode = SCRIPT_MODE::mode
|
|
|
|
set_script_mode EVENT
|
|
|
|
.mac _assert_script_mode mode
|
|
.assert ::script_mode = SCRIPT_MODE::mode, error, "Invalid script mode"
|
|
.endmac
|
|
|
|
; ------------------------------------------------------------------------------
|
|
|
|
.mac _cmd_impl op
|
|
.byte op
|
|
.endmac
|
|
|
|
.mac _e_cmd_impl cmd
|
|
_assert_script_mode EVENT
|
|
_cmd_impl cmd
|
|
.endmac
|
|
|
|
.mac _o_cmd_impl cmd
|
|
_assert_script_mode OBJ
|
|
_cmd_impl cmd
|
|
.endmac
|
|
|
|
.mac _w_cmd_impl cmd
|
|
_assert_script_mode WORLD
|
|
_cmd_impl cmd
|
|
.endmac
|
|
|
|
.mac _v_cmd_impl cmd
|
|
_assert_script_mode VEHICLE
|
|
_cmd_impl cmd
|
|
.endmac
|
|
|
|
.mac _cmd_byte op, b
|
|
.byte op, b
|
|
.endmac
|
|
|
|
.mac _e_cmd_byte op, b
|
|
_assert_script_mode EVENT
|
|
_cmd_byte op, b
|
|
.endmac
|
|
|
|
.mac _o_cmd_byte op, b
|
|
_assert_script_mode OBJ
|
|
_cmd_byte op, b
|
|
.endmac
|
|
|
|
.mac _w_cmd_byte op, b
|
|
_assert_script_mode WORLD
|
|
_cmd_byte op, b
|
|
.endmac
|
|
|
|
.mac _v_cmd_byte op, b
|
|
_assert_script_mode VEHICLE
|
|
_cmd_byte op, b
|
|
.endmac
|
|
|
|
.mac _cmd_2byte op, b1, b2
|
|
.byte op, b1, b2
|
|
.endmac
|
|
|
|
.mac _e_cmd_2byte op, b1, b2
|
|
_assert_script_mode EVENT
|
|
_cmd_2byte op, b1, b2
|
|
.endmac
|
|
|
|
.mac _o_cmd_2byte op, b1, b2
|
|
_assert_script_mode OBJ
|
|
_cmd_2byte op, b1, b2
|
|
.endmac
|
|
|
|
.mac _cmd_3byte op, b1, b2, b3, mode
|
|
.ifnblank mode
|
|
_assert_script_mode mode
|
|
.endif
|
|
.byte op, b1, b2, b3
|
|
.endmac
|
|
|
|
.mac _cmd_word op, w, mode
|
|
.ifnblank mode
|
|
_assert_script_mode mode
|
|
.endif
|
|
.byte op
|
|
.word w
|
|
.endmac
|
|
|
|
.define _event_addr(addr) ((addr - EventScript) & $ffffff)
|
|
|
|
.mac _cmd_addr op, addr, mode
|
|
.ifnblank mode
|
|
_assert_script_mode mode
|
|
.endif
|
|
.byte op
|
|
.faraddr _event_addr {addr}
|
|
.endmac
|
|
|
|
.mac _2_bytes b1, b2
|
|
.byte b1, b2
|
|
.endmac
|
|
|
|
; ------------------------------------------------------------------------------
|
|
|
|
.enum OBJ_SCRIPT_FLAGS
|
|
ASYNC = 0
|
|
AWAIT = $80 ; default
|
|
.endenum
|
|
|
|
::_obj_script_index .set 0
|
|
.define _ObjStart .ident(.sprintf("_ObjStart%d", ::_obj_script_index))
|
|
.define _ObjEnd .ident(.sprintf("_ObjEnd%d", ::_obj_script_index))
|
|
|
|
.mac obj_script obj, flags
|
|
::_obj_script_index .set ::_obj_script_index + 1
|
|
.ifblank flags
|
|
_e_cmd_byte EVENT_OBJ::obj, (_ObjEnd - _ObjStart) | OBJ_SCRIPT_FLAGS::AWAIT
|
|
.else
|
|
_e_cmd_byte EVENT_OBJ::obj, (_ObjEnd - _ObjStart) | OBJ_SCRIPT_FLAGS::flags
|
|
.endif
|
|
_ObjStart := *
|
|
set_script_mode OBJ
|
|
.endmac
|
|
|
|
.define wait_obj(obj) _e_cmd_byte $35, EVENT_OBJ::obj
|
|
.define pass_on(obj) _e_cmd_byte $36, EVENT_OBJ::obj
|
|
.define obj_gfx(obj, gfx) _e_cmd_2byte $37, EVENT_OBJ::obj, MAP_SPRITE_GFX::gfx
|
|
.define lock_camera _e_cmd_impl $38
|
|
.define unlock_camera _e_cmd_impl $39
|
|
.define player_ctrl_on _e_cmd_impl $3a
|
|
.define player_ctrl_off _e_cmd_impl $3b
|
|
|
|
.mac party_chars char1, char2, char3, char4
|
|
_e_cmd_impl $3c
|
|
.ifnblank char1
|
|
.byte CHAR::char1
|
|
.else
|
|
.byte $ff
|
|
.endif
|
|
.ifnblank char2
|
|
.byte CHAR::char2
|
|
.else
|
|
.byte $ff
|
|
.endif
|
|
.ifnblank char3
|
|
.byte CHAR::char3
|
|
.else
|
|
.byte $ff
|
|
.endif
|
|
.ifnblank char4
|
|
.byte CHAR::char4
|
|
.else
|
|
.byte $ff
|
|
.endif
|
|
.endmac
|
|
|
|
.define create_obj(obj) _e_cmd_byte $3d, EVENT_OBJ::obj
|
|
.define delete_obj(obj) _e_cmd_byte $3e, EVENT_OBJ::obj
|
|
.define char_party(char_id, party) _e_cmd_2byte $3f, CHAR::char_id, party
|
|
.define char_prop(char_id, prop) _e_cmd_2byte $40, CHAR::char_id, prop
|
|
.define _e_show_obj(obj) _e_cmd_byte $41, EVENT_OBJ::obj
|
|
.define _e_hide_obj(obj) _e_cmd_byte $42, EVENT_OBJ::obj
|
|
.define obj_pal(obj, pal) _e_cmd_2byte $43, EVENT_OBJ::obj, MAP_SPRITE_PAL::pal
|
|
.define sort_obj _e_cmd_impl $45
|
|
.define activate_party(party) _e_cmd_byte $46, party
|
|
.define update_party _e_cmd_impl $47
|
|
|
|
.enum DLG_FLAGS
|
|
BOTTOM = $8000
|
|
TEXT_ONLY = $4000
|
|
ASYNC = 0
|
|
AWAIT = 0
|
|
.endenum
|
|
|
|
.mac _dlg_op f1, f2, f3
|
|
.if .paramcount > 0 && .xmatch(f1, ASYNC)
|
|
_e_cmd_impl $48
|
|
.elseif .paramcount > 1 && .xmatch(f2, ASYNC)
|
|
_e_cmd_impl $48
|
|
.elseif .paramcount > 2 && .xmatch(f3, ASYNC)
|
|
_e_cmd_impl $48
|
|
.else
|
|
_e_cmd_impl $4b
|
|
.endif
|
|
.endmac
|
|
|
|
.mac dlg dlg_id, flags
|
|
.ifblank flags
|
|
_cmd_word $4b, dlg_id, EVENT
|
|
.else
|
|
_dlg_op flags
|
|
make_bitmask .word, dlg_id, DLG_FLAGS, flags
|
|
.endif
|
|
.endmac
|
|
|
|
.define wait_dlg _e_cmd_impl $49
|
|
.define wait_key _e_cmd_impl $4a
|
|
|
|
.enum BATTLE_FLAGS
|
|
NO_BLUR = $80
|
|
NO_SFX = $40
|
|
COLLISION = 0
|
|
.endenum
|
|
|
|
.define treasure_battle _e_cmd_impl $8e
|
|
.define colosseum_battle _e_cmd_impl $af
|
|
|
|
.mac _battle_op battle_id, f1, f2, f3
|
|
.if is_script_mode VEHICLE
|
|
_v_cmd_byte $cf, battle_id
|
|
.elseif .paramcount > 0 && .xmatch(f1, COLLISION)
|
|
_e_cmd_byte $4c, battle_id
|
|
.elseif .paramcount > 1 && .xmatch(f2, COLLISION)
|
|
_e_cmd_byte $4c, battle_id
|
|
.elseif .paramcount > 2 && .xmatch(f3, COLLISION)
|
|
_e_cmd_byte $4c, battle_id
|
|
.else
|
|
_e_cmd_byte $4d, battle_id
|
|
.endif
|
|
.endmac
|
|
|
|
.mac battle battle_id, bg, flags
|
|
_battle_op battle_id, flags
|
|
.ifblank flags
|
|
.byte bg & $3f
|
|
.else
|
|
make_bitmask .byte, bg & $3f, BATTLE_FLAGS, flags
|
|
.endif
|
|
.endmac
|
|
|
|
.define rand_battle _e_cmd_impl $4e
|
|
.define restore_save _e_cmd_impl $4f
|
|
|
|
; modify color palettes
|
|
|
|
.enum MOD_PAL_TYPE
|
|
RESTORE = $00 ; return to normal
|
|
INC = $20 ; increment
|
|
ADD = $40 ; add (doesn't work right)
|
|
UNINC = $60 ; un-increment
|
|
DEC = $80 ; decrement
|
|
SUB = $a0 ; subtract
|
|
UNDEC = $c0 ; un-decrement
|
|
RESTORE_ALT = $e0 ; return to normal
|
|
.endenum
|
|
|
|
.enum MOD_PAL_CLR
|
|
ALL = $1c
|
|
RED = $10
|
|
GREEN = $08
|
|
BLUE = $04
|
|
NONE = $00
|
|
.endenum
|
|
|
|
.mac _mod_pal op, type, color, intensity, clr_range
|
|
.ifblank clr_range
|
|
_e_cmd_impl op
|
|
make_bitmask .byte, MOD_PAL_TYPE::type | intensity, MOD_PAL_CLR, color
|
|
.else
|
|
_e_cmd_impl op + 1
|
|
make_bitmask .byte, MOD_PAL_TYPE::type | intensity, MOD_PAL_CLR, color
|
|
.if .tcount(clr_range) <> 1
|
|
_2_bytes clr_range
|
|
.else
|
|
; single color
|
|
.byte clr_range, clr_range
|
|
.endif
|
|
.endif
|
|
.endmac
|
|
|
|
.define mod_bg_pal _mod_pal $50,
|
|
.define mod_sprite_pal _mod_pal $52,
|
|
|
|
.define fixed_clr_off _e_cmd_impl $54
|
|
|
|
.mac flash clr
|
|
_e_cmd_impl $55
|
|
make_bitmask .byte, 0, FIXED_CLR, clr
|
|
.endmac
|
|
|
|
.mac fixed_clr clr, rate, intensity
|
|
.if intensity >= 0
|
|
; add
|
|
_e_cmd_impl $56
|
|
make_bitmask .byte, (rate << 3) | intensity, FIXED_CLR, clr
|
|
.else
|
|
; subtract
|
|
_e_cmd_impl $57
|
|
make_bitmask .byte, (rate << 3) | -intensity, FIXED_CLR, clr
|
|
.endif
|
|
.endmac
|
|
|
|
.enum SHAKE_LAYERS
|
|
BG1 = $10
|
|
BG2 = $20
|
|
BG3 = $40
|
|
SPRITES = $80
|
|
ALL = $f0
|
|
.endenum
|
|
|
|
.mac shake layers, amplitude, frequency
|
|
_e_cmd_impl $58
|
|
make_bitmask .byte, amplitude | (frequency << 2), SHAKE_LAYERS, layers
|
|
.endmac
|
|
|
|
.mac fade_in rate
|
|
.if (is_script_mode WORLD) || (is_script_mode VEHICLE)
|
|
_cmd_impl $d8
|
|
.elseif .blank(rate)
|
|
_e_cmd_impl $96
|
|
.else
|
|
_e_cmd_byte $59, rate
|
|
.endif
|
|
.endmac
|
|
|
|
.mac fade_out rate
|
|
.if (is_script_mode WORLD) || (is_script_mode VEHICLE)
|
|
_cmd_impl $d9
|
|
.elseif .blank(rate)
|
|
_e_cmd_impl $97
|
|
.else
|
|
_e_cmd_byte $5a, rate
|
|
.endif
|
|
.endmac
|
|
|
|
.define pause_fade _e_cmd_impl $5b
|
|
.define wait_fade _e_cmd_impl $5c
|
|
|
|
.enum SCROLL_LAYER
|
|
BG1 = 0
|
|
BG2 = 1
|
|
BG3 = 2
|
|
.endenum
|
|
|
|
.enum SCROLL_FLAGS
|
|
NORMAL = $70 ; default
|
|
ALT = $5d
|
|
.endenum
|
|
|
|
.mac _normal_scroll x_rate, y_rate
|
|
.assert (x_rate > -129) && (x_rate < 128), error, "Invalid scroll rate"
|
|
.assert (y_rate > -129) && (y_rate < 128), error, "Invalid scroll rate"
|
|
.byte <x_rate, <y_rate
|
|
.endmac
|
|
|
|
.mac scroll_bg layer, xy_rate, flags
|
|
.ifnblank flags
|
|
_e_cmd_impl SCROLL_FLAGS::flags + SCROLL_LAYER::layer
|
|
.else
|
|
_e_cmd_impl SCROLL_FLAGS::NORMAL + SCROLL_LAYER::layer
|
|
.endif
|
|
_normal_scroll xy_rate
|
|
.endmac
|
|
|
|
.mac load_pal vram_pal, rom_pal
|
|
_e_cmd_2byte $60, vram_pal, MAP_SPRITE_PAL::rom_pal
|
|
.endmac
|
|
|
|
.enum FILTER_PAL_COLOR
|
|
ALL = $07
|
|
RED = $01
|
|
GREEN = $02
|
|
BLUE = $04
|
|
NONE = $00
|
|
.endenum
|
|
|
|
.mac filter_pal color, clr_range
|
|
_e_cmd_impl $61
|
|
make_bitmask .byte, 0, FILTER_PAL_COLOR, color
|
|
.if .tcount(clr_range) <> 1
|
|
_2_bytes clr_range
|
|
.else
|
|
; single color
|
|
.byte clr_range, clr_range
|
|
.endif
|
|
.endmac
|
|
|
|
.define mosaic(rate) _e_cmd_byte $62, rate
|
|
.define flashlight(size) _e_cmd_byte $63, size
|
|
.define bg_anim_frame(tile, frame) _e_cmd_2byte $64, tile, frame
|
|
.define bg_anim_rate(tile, rate) _e_cmd_2byte $65, tile, rate
|
|
|
|
.enum LOAD_MAP_FLAGS_1
|
|
NONE = 0
|
|
ASYNC = 0
|
|
AWAIT = 0
|
|
SHOW_TITLE = $0800
|
|
HIDE_TITLE = 0
|
|
Z_UPPER = $0400
|
|
Z_LOWER = 0
|
|
SET_PARENT = $0200
|
|
STARTUP_EVENT = 0
|
|
NO_FADE_IN = 0
|
|
SAME_SIZE = 0
|
|
CHOCOBO = 0
|
|
AIRSHIP = 0
|
|
NO_VEHICLE = 0
|
|
.endenum
|
|
|
|
.enum LOAD_MAP_FLAGS_2
|
|
NONE = 0
|
|
ASYNC = 0
|
|
AWAIT = 0
|
|
SHOW_TITLE = 0
|
|
HIDE_TITLE = 0
|
|
Z_UPPER = 0
|
|
Z_LOWER = 0
|
|
SET_PARENT = 0
|
|
STARTUP_EVENT = $0080
|
|
NO_FADE_IN = $0040
|
|
SAME_SIZE = $0020
|
|
CHOCOBO = $0002
|
|
AIRSHIP = $0001
|
|
NO_VEHICLE = 0
|
|
.endenum
|
|
|
|
.mac _e_load_map_op f1, f2, f3, f4, f5, f6, f7, f8
|
|
.if .paramcount > 0 && .xmatch(f1, ASYNC)
|
|
_e_cmd_impl $6b
|
|
.elseif .paramcount > 1 && .xmatch(f2, ASYNC)
|
|
_e_cmd_impl $6b
|
|
.elseif .paramcount > 2 && .xmatch(f3, ASYNC)
|
|
_e_cmd_impl $6b
|
|
.elseif .paramcount > 3 && .xmatch(f4, ASYNC)
|
|
_e_cmd_impl $6b
|
|
.elseif .paramcount > 4 && .xmatch(f5, ASYNC)
|
|
_e_cmd_impl $6b
|
|
.elseif .paramcount > 5 && .xmatch(f6, ASYNC)
|
|
_e_cmd_impl $6b
|
|
.elseif .paramcount > 6 && .xmatch(f7, ASYNC)
|
|
_e_cmd_impl $6b
|
|
.elseif .paramcount > 7 && .xmatch(f8, ASYNC)
|
|
_e_cmd_impl $6b
|
|
.else
|
|
_e_cmd_impl $6a
|
|
.endif
|
|
.endmac
|
|
|
|
.mac _wv_load_map_op f1, f2, f3, f4, f5, f6, f7, f8
|
|
.if .paramcount > 0 && .xmatch(f1, ASYNC)
|
|
_cmd_impl $d3
|
|
.elseif .paramcount > 1 && .xmatch(f1, ASYNC)
|
|
_cmd_impl $d3
|
|
.elseif .paramcount > 2 && .xmatch(f1, ASYNC)
|
|
_cmd_impl $d3
|
|
.elseif .paramcount > 3 && .xmatch(f1, ASYNC)
|
|
_cmd_impl $d3
|
|
.elseif .paramcount > 4 && .xmatch(f1, ASYNC)
|
|
_cmd_impl $d3
|
|
.elseif .paramcount > 5 && .xmatch(f1, ASYNC)
|
|
_cmd_impl $d3
|
|
.elseif .paramcount > 6 && .xmatch(f1, ASYNC)
|
|
_cmd_impl $d3
|
|
.elseif .paramcount > 7 && .xmatch(f1, ASYNC)
|
|
_cmd_impl $d3
|
|
.else
|
|
_cmd_impl $d2
|
|
.endif
|
|
.endmac
|
|
|
|
.mac _load_map map, xy_pos, dd, flags, op
|
|
.ifnblank op
|
|
_cmd_impl op
|
|
.elseif is_script_mode EVENT
|
|
_e_load_map_op flags
|
|
.elseif is_script_mode WORLD || is_script_mode VEHICLE
|
|
_wv_load_map_op flags
|
|
.else
|
|
.error "Invalid script mode"
|
|
.endif
|
|
|
|
.ifblank flags
|
|
.word map | (EVENT_DIR::dd << 12)
|
|
.else
|
|
make_bitmask .word, map | (EVENT_DIR::dd << 12), LOAD_MAP_FLAGS_1, flags
|
|
.endif
|
|
_2_bytes xy_pos
|
|
.ifblank flags
|
|
.byte 0
|
|
.else
|
|
make_bitmask .byte, 0, LOAD_MAP_FLAGS_2, flags
|
|
.endif
|
|
.endmac
|
|
|
|
.mac load_map map, xy_pos, dd, flags
|
|
.ifblank flags
|
|
_load_map map, {xy_pos}, dd
|
|
.else
|
|
_load_map map, {xy_pos}, dd, {flags}
|
|
.endif
|
|
.endmac
|
|
|
|
.mac load_map_vehicle map, xy_pos, dd, flags
|
|
.if (is_script_mode WORLD) || (is_script_mode VEHICLE)
|
|
_load_map map, {xy_pos}, dd, {flags}
|
|
.else
|
|
.error("Invalid script mode")
|
|
.endif
|
|
.endmac
|
|
|
|
.mac set_parent_map map, xy_pos, dd
|
|
_cmd_word $6c, map, EVENT
|
|
_2_bytes xy_pos
|
|
.byte EVENT_DIR::dd
|
|
.endmac
|
|
|
|
.enum MOD_BG_FLAGS
|
|
AWAIT = $73 ; default
|
|
ASYNC = $74
|
|
.endenum
|
|
|
|
.enum MOD_BG_LAYER
|
|
BG1 = $00
|
|
BG2 = $40
|
|
BG3 = $80
|
|
.endenum
|
|
|
|
.mac mod_bg_tiles layer, xy_pos, wh_size, flags
|
|
.ifblank flags
|
|
_e_cmd_impl MOD_BG_FLAGS::AWAIT
|
|
.else
|
|
_e_cmd_impl MOD_BG_FLAGS::flags
|
|
.endif
|
|
_2_bytes xy_pos | MOD_BG_LAYER::layer
|
|
_2_bytes wh_size
|
|
.endmac
|
|
|
|
.define wait_bg _e_cmd_impl $75
|
|
|
|
.define norm_lvl(char_id) _e_cmd_byte $77, CHAR::char_id
|
|
.define pass_off(obj) _e_cmd_byte $78, EVENT_OBJ::obj
|
|
|
|
.mac set_party_map party, map
|
|
_e_cmd_byte $79, party
|
|
.word map
|
|
.endmac
|
|
|
|
.mac obj_event obj, addr
|
|
_e_cmd_byte $7a, EVENT_OBJ::obj
|
|
.faraddr _event_addr addr
|
|
.endmac
|
|
|
|
.mac _char_status op, prefix, char_id, status14
|
|
_e_cmd_byte op, EVENT_OBJ::char_id
|
|
make_bitmask prefix, 0, STATUS14, status14
|
|
.endmac
|
|
|
|
.enum EVENT_HP
|
|
HP_1 = 0
|
|
HP_2 = 1
|
|
HP_4 = 2
|
|
HP_8 = 3
|
|
HP_16 = 4
|
|
HP_32 = 5
|
|
HP_64 = 6
|
|
HP_128 = 7
|
|
.endenum
|
|
|
|
.enum EVENT_MP
|
|
MP_0 = 0
|
|
.endenum
|
|
|
|
.define restore_default_party _e_cmd_impl $7b
|
|
.define collision_on(obj) _e_cmd_byte $7c, EVENT_OBJ::obj
|
|
.define collision_off(obj) _e_cmd_byte $7d, EVENT_OBJ::obj
|
|
.define party_pos(xy_pos) _e_cmd_2byte $7e, xy_pos
|
|
.define char_name(char_id, name) _e_cmd_2byte $7f, CHAR::char_id, name
|
|
.define give_item(item) _e_cmd_byte $80, ITEM::item
|
|
.define take_item(item) _e_cmd_byte $81, ITEM::item
|
|
.define reset_default_party _e_cmd_impl $82
|
|
.define give_gil(gil) _cmd_word $84, gil, EVENT
|
|
.define take_gil(gil) _cmd_word $85, gil, EVENT
|
|
.define give_genju(genju) _e_cmd_byte $86, GENJU::genju
|
|
.define take_genju(genju) _e_cmd_byte $87, GENJU::genju
|
|
.define and_status _char_status $88, .word,
|
|
.define clr_status _char_status $88, .word $ffff^,
|
|
.define set_status _char_status $89, .word,
|
|
.define toggle_status _char_status $8a, .word,
|
|
.define inc_hp(char_id, hp) _e_cmd_2byte $8b, EVENT_OBJ::char_id, EVENT_HP::hp
|
|
.define dec_hp(char_id, hp) _e_cmd_2byte $8b, EVENT_OBJ::char_id, EVENT_HP::hp | $80
|
|
.define max_hp(char_id) _e_cmd_2byte $8b, EVENT_OBJ::char_id, $7f
|
|
.define inc_mp(char_id,mp) _e_cmd_2byte $8c, EVENT_OBJ::char_id, EVENT_MP::mp
|
|
.define dec_mp(char_id,mp) _e_cmd_2byte $8c, EVENT_OBJ::char_id, EVENT_MP::mp | $80
|
|
.define max_mp(char_id) _e_cmd_2byte $8c, EVENT_OBJ::char_id, $7f
|
|
.define remove_equip(char_id) _e_cmd_byte $8d, EVENT_OBJ::char_id
|
|
.define give_bushido _e_cmd_impl $8f
|
|
.define give_blitz _e_cmd_impl $90
|
|
|
|
.mac wait_15f dur
|
|
.ifblank dur
|
|
_e_cmd_impl $91
|
|
.else
|
|
_e_cmd_byte $b5, dur
|
|
.endif
|
|
.endmac
|
|
|
|
.define wait_30f _e_cmd_impl $92
|
|
.define wait_45f _e_cmd_impl $93
|
|
.define wait_60f _e_cmd_impl $94
|
|
.define wait_90f wait_15f 6
|
|
.define wait_120f _e_cmd_impl $95
|
|
|
|
.define wait_1s wait_60f
|
|
.define wait_2s wait_120f
|
|
.define wait_3s wait_15f 12
|
|
.define wait_4s wait_15f 16
|
|
.define wait_5s wait_15f 20
|
|
.define wait_6s wait_15f 24
|
|
|
|
.mac _e_wait dur
|
|
.if dur = 30
|
|
wait_30f
|
|
.elseif dur = 45
|
|
wait_45f
|
|
.elseif dur = 60
|
|
wait_60f
|
|
.elseif dur = 90
|
|
wait_90f
|
|
.elseif dur = 120
|
|
wait_120f
|
|
.else
|
|
_e_cmd_byte $b4, dur
|
|
.endif
|
|
.endmac
|
|
|
|
.define _o_wait(dur) _o_cmd_byte $e0, dur
|
|
.define _w_wait(dur) _w_cmd_byte $e0, dur
|
|
.define _v_wait(dur) _v_cmd_byte $e0, dur
|
|
|
|
.mac wait dur
|
|
.if is_script_mode EVENT
|
|
_e_wait dur
|
|
.elseif is_script_mode OBJ
|
|
_o_wait dur
|
|
.elseif is_script_mode WORLD
|
|
_w_wait dur
|
|
.elseif is_script_mode VEHICLE
|
|
_v_wait dur
|
|
.endif
|
|
.endmac
|
|
|
|
.define name_menu(char_id) _e_cmd_byte $98, CHAR::char_id
|
|
|
|
.enum PARTY_MENU_FLAGS
|
|
RESET = $80 ; default
|
|
NO_RESET = 0
|
|
.endenum
|
|
|
|
.mac party_menu num_parties, flags, forced_chars
|
|
.ifblank flags
|
|
_e_cmd_byte $99, num_parties | PARTY_MENU_FLAGS::RESET
|
|
.else
|
|
_e_cmd_byte $99, num_parties | PARTY_MENU_FLAGS::flags
|
|
.endif
|
|
.ifblank forced_chars
|
|
.word 0
|
|
.else
|
|
make_bitmask .word, 0, CHAR_FLAG, forced_chars
|
|
.endif
|
|
.endmac
|
|
|
|
.define colosseum_menu _e_cmd_impl $9a
|
|
.define shop_menu(shop_id) _e_cmd_byte $9b, shop_id
|
|
.define opt_equip(char_id) _e_cmd_byte $9c, CHAR::char_id
|
|
.define order_menu _e_cmd_impl $9d
|
|
|
|
.enum TIMER_FLAGS
|
|
FIELD_ONLY = $800000
|
|
FIELD_VISIBLE = $400000
|
|
BANQUET = $200000
|
|
MENU_BATTLE_VISIBLE = $100000
|
|
.endenum
|
|
|
|
.mac start_timer timer, dur, addr, flags
|
|
_cmd_word $a0, dur, EVENT
|
|
.ifblank flags
|
|
.faraddr (timer << 18) | (_event_addr addr)
|
|
.else
|
|
make_bitmask .faraddr, (timer << 18) | (_event_addr addr), TIMER_FLAGS, flags
|
|
.endif
|
|
.endmac
|
|
|
|
.define stop_timer(timer) _e_cmd_byte $a1, timer
|
|
.define clr_overlay _e_cmd_impl $a2
|
|
.define pyramid_off _e_cmd_impl $a6
|
|
.define pyramid_on(obj) _e_cmd_byte $a7, EVENT_OBJ::obj
|
|
|
|
.enum EVENT_CUTSCENE
|
|
FLOATING_CONT = $a8
|
|
TITLE = $a9
|
|
INTRO = $aa
|
|
RUIN = $ad
|
|
TRAIN = $ae
|
|
THE_END = $bb
|
|
FALCON = $bf
|
|
.endenum
|
|
|
|
.enum VEHICLE_CUTSCENE
|
|
FALCON_ENDING = $f2
|
|
JUDGMENT_1 = $f3
|
|
JUDGMENT_2 = $f4
|
|
JUDGMENT_3 = $f5
|
|
FALCON_EMERGE = $fa
|
|
VECTOR_APPROACH = $fe
|
|
.endenum
|
|
|
|
.mac cutscene val
|
|
.if is_script_mode EVENT
|
|
_e_cmd_impl EVENT_CUTSCENE::val
|
|
.elseif is_script_mode VEHICLE
|
|
_v_cmd_impl VEHICLE_CUTSCENE::val
|
|
.else
|
|
.error "Invalid script mode"
|
|
.endif
|
|
.endmac
|
|
|
|
.define load_menu _e_cmd_impl $ab
|
|
.define restore_game _e_cmd_impl $ac
|
|
|
|
.define loop(count) _e_cmd_byte $b0, count
|
|
.define end_loop _e_cmd_impl $b1
|
|
|
|
.mac call addr, repeat
|
|
.ifblank repeat
|
|
_cmd_addr $b2, addr, EVENT
|
|
.else
|
|
_e_cmd_byte $b3, repeat
|
|
.faraddr _event_addr addr
|
|
.endif
|
|
.endmac
|
|
|
|
.mac choice f1, f2, f3, f4, f5, f6, f7, f8
|
|
_e_cmd_impl $b6
|
|
.ifnblank f1
|
|
.faraddr _event_addr f1
|
|
.endif
|
|
.ifnblank f2
|
|
.faraddr _event_addr f2
|
|
.endif
|
|
.ifnblank f3
|
|
.faraddr _event_addr f3
|
|
.endif
|
|
.ifnblank f4
|
|
.faraddr _event_addr f4
|
|
.endif
|
|
.ifnblank f5
|
|
.faraddr _event_addr f5
|
|
.endif
|
|
.ifnblank f6
|
|
.faraddr _event_addr f6
|
|
.endif
|
|
.ifnblank f7
|
|
.faraddr _event_addr f7
|
|
.endif
|
|
.ifnblank f8
|
|
.faraddr _event_addr f8
|
|
.endif
|
|
.endmac
|
|
|
|
.mac if_b_switch battle_switch, addr
|
|
_e_cmd_byte $b7, battle_switch
|
|
.faraddr _event_addr addr
|
|
.endmac
|
|
|
|
.define set_b_switch(battle_switch) _e_cmd_byte $b8, battle_switch
|
|
.define clr_b_switch(battle_switch) _e_cmd_byte $b9, battle_switch
|
|
.define ending(scene) _e_cmd_byte $ba, scene
|
|
|
|
.define loop_until(switch_id) _cmd_word $bc, switch_id, EVENT
|
|
.define if_rand(addr) _cmd_addr $bd, addr, EVENT
|
|
|
|
_multi_case_mode .set 0
|
|
_multi_case_index .set 0
|
|
.define _CaseStart .ident(.sprintf("_CaseStart%d", ::_multi_case_index))
|
|
.define _CaseEnd .ident(.sprintf("_CaseEnd%d", ::_multi_case_index))
|
|
|
|
.mac case val, addr
|
|
.faraddr (val << 20) | (_event_addr addr)
|
|
.endmac
|
|
|
|
.mac if_case val, addr
|
|
.local n_cases
|
|
.ifnblank addr
|
|
; single case
|
|
_cmd_byte $be, 1
|
|
case val, addr
|
|
.else
|
|
; beginning of multi-case block
|
|
::_multi_case_index .set ::_multi_case_index + 1
|
|
n_cases = (_CaseEnd - _CaseStart) / 3
|
|
.assert n_cases <= 16, error, "Too many cases"
|
|
_cmd_byte $be, n_cases
|
|
_CaseStart = *
|
|
::_multi_case_mode .set 1
|
|
.endif
|
|
.endmac
|
|
|
|
.mac end_case
|
|
.assert ::_multi_case_mode = 1, error, "Invalid case block"
|
|
_CaseEnd = *
|
|
::_multi_case_mode .set 0
|
|
.endmac
|
|
|
|
.mac _make_if_switch switch_id
|
|
.if .xmatch(.right(2, {switch_id}), =0)
|
|
.word .left(.tcount({switch_id}) - 2, {switch_id})
|
|
.elseif .xmatch(.right(2, {switch_id}), =1)
|
|
.word .left(.tcount({switch_id}) - 2, {switch_id}) | $8000
|
|
.else
|
|
.error "Invalid switch"
|
|
.endif
|
|
.endmac
|
|
|
|
_multi_switch_mode .set 0
|
|
_multi_switch_index .set 0
|
|
.define _IfStart .ident(.sprintf("_IfStart%d", ::_multi_switch_index))
|
|
.define _IfEnd .ident(.sprintf("_IfEnd%d", ::_multi_switch_index))
|
|
|
|
.mac switch val
|
|
.if ::_multi_switch_mode = 1
|
|
_make_if_switch val
|
|
.else
|
|
.if .xmatch(.right(2, {val}), =0)
|
|
clr_switch .left(.tcount({val}) - 2, {val})
|
|
.elseif .xmatch(.right(2, {val}), =1)
|
|
set_switch .left(.tcount({val}) - 2, {val})
|
|
.endif
|
|
.endif
|
|
.endmac
|
|
|
|
.mac _if_multi op
|
|
.local n_switches
|
|
::_multi_switch_index .set ::_multi_switch_index + 1
|
|
n_switches = (_IfEnd - _IfStart) / 2
|
|
.assert n_switches <= 8, error, "Too many switches"
|
|
_cmd_impl op + n_switches - 1
|
|
_IfStart = *
|
|
::_multi_switch_mode .set 1
|
|
.endmac
|
|
|
|
.mac if_any
|
|
.if is_script_mode EVENT
|
|
_if_multi $c0
|
|
.elseif (is_script_mode WORLD) || (is_script_mode VEHICLE)
|
|
_if_multi $b0
|
|
.endif
|
|
.endmac
|
|
|
|
.mac if_all
|
|
.if is_script_mode EVENT
|
|
_if_multi $c8
|
|
.elseif (is_script_mode WORLD) || (is_script_mode VEHICLE)
|
|
_if_multi $b8
|
|
.endif
|
|
.endmac
|
|
|
|
.mac goto addr
|
|
.assert ::_multi_switch_mode = 1, error, "Invalid conditional block"
|
|
_IfEnd = *
|
|
.faraddr _event_addr addr
|
|
::_multi_switch_mode .set 0
|
|
.endmac
|
|
|
|
; single if switch
|
|
.mac if_switch switch_id, addr
|
|
.if is_script_mode EVENT
|
|
_cmd_impl $c0
|
|
.elseif (is_script_mode WORLD) || (is_script_mode VEHICLE)
|
|
_cmd_impl $b0
|
|
.endif
|
|
_make_if_switch switch_id
|
|
.faraddr _event_addr addr
|
|
.endmac
|
|
|
|
.mac set_switch switch_id
|
|
.assert (switch_id <= $06ff), error, "Invalid switch"
|
|
.if is_script_mode EVENT
|
|
_cmd_byte $d0 + (>switch_id) * 2, <switch_id
|
|
.elseif is_script_mode OBJ
|
|
.assert (switch_id <= $02ff), error, "Invalid switch"
|
|
_cmd_byte $e1 + (>switch_id), <switch_id
|
|
.elseif (is_script_mode WORLD) || (is_script_mode VEHICLE)
|
|
_cmd_word $c8, switch_id
|
|
.endif
|
|
.endmac
|
|
|
|
.mac clr_switch switch_id
|
|
.assert (switch_id <= $06ff), error, "Invalid switch"
|
|
.if is_script_mode EVENT
|
|
_cmd_byte $d1 + (>switch_id) * 2, <switch_id
|
|
.elseif is_script_mode OBJ
|
|
.assert (switch_id <= $02ff), error, "Invalid switch"
|
|
_cmd_byte $e4 + (>switch_id), <switch_id
|
|
.elseif (is_script_mode WORLD) || (is_script_mode VEHICLE)
|
|
_cmd_word $c9, switch_id
|
|
.endif
|
|
.endmac
|
|
|
|
.enum EVENT_CASE
|
|
PARTY_CHARS = $de
|
|
OBJ_CHARS = $df
|
|
INIT_CHARS = $e0
|
|
AVAIL_CHARS = $e1
|
|
TOP_CHAR = $e2
|
|
ALL_PARTIES = $e3
|
|
CURR_PARTY = $e4
|
|
.endenum
|
|
|
|
.define set_case(case) _e_cmd_impl EVENT_CASE::case
|
|
|
|
.define portrait(portrait_id) _e_cmd_byte $e7, CHAR::portrait_id
|
|
|
|
.mac _var_cmd op, var, val
|
|
_e_cmd_byte op, var
|
|
.word val
|
|
.endmac
|
|
|
|
.define VAR_EQUAL BIT_0
|
|
.define VAR_GREATER BIT_1
|
|
.define VAR_LESS BIT_2
|
|
|
|
.define set_var _var_cmd $e8,
|
|
.define add_var _var_cmd $e9,
|
|
.define sub_var _var_cmd $ea,
|
|
.define cmp_var _var_cmd $eb,
|
|
|
|
.enum PLAY_SONG_FLAGS
|
|
NONE = 0
|
|
PAUSE_CURRENT = $80
|
|
.endenum
|
|
|
|
.mac play_song song_id, flags
|
|
_e_cmd_impl $f0
|
|
.ifnblank flags
|
|
make_bitmask .byte, SONG::song_id, PLAY_SONG_FLAGS, flags
|
|
.else
|
|
.byte SONG::song_id
|
|
.endif
|
|
.endmac
|
|
|
|
.mac fade_in_song song_id, dur, flags
|
|
_e_cmd_impl $f1
|
|
.ifnblank flags
|
|
make_bitmask .byte, SONG::song_id, PLAY_SONG_FLAGS, flags
|
|
.else
|
|
.byte SONG::song_id
|
|
.endif
|
|
.byte dur
|
|
.endmac
|
|
|
|
.define fade_out_song(dur) _e_cmd_byte $f2, dur
|
|
.define resume_song(dur) _e_cmd_byte $f3, dur
|
|
|
|
.mac sfx sfx_id, pan, dur
|
|
.if .blank(pan) || .blank(dur)
|
|
_e_cmd_byte $f4, sfx_id
|
|
.else
|
|
_cmd_3byte $f5, sfx_id, pan, dur, EVENT
|
|
.endif
|
|
.endmac
|
|
|
|
.define spc_cmd(p1, p2, p3) _cmd_3byte $f6, p1, p2, p3, EVENT
|
|
.define continue_song _e_cmd_impl $f7
|
|
.define wait_spc _e_cmd_impl $f8
|
|
|
|
.mac wait_song song_pos
|
|
.ifblank song_pos
|
|
_e_cmd_impl $fa
|
|
.else
|
|
_e_cmd_byte $f9, song_pos
|
|
.endif
|
|
.endmac
|
|
|
|
.define wait_sfx _e_cmd_impl $fb
|
|
.define event_cmd_fd _e_cmd_impl $fd
|
|
.define return _e_cmd_impl $fe
|
|
.define _e_end return
|
|
.define no_event _e_cmd_impl $ff
|
|
|
|
.mac end
|
|
.if is_script_mode EVENT
|
|
_e_end
|
|
.elseif is_script_mode OBJ
|
|
_o_end
|
|
.elseif is_script_mode WORLD
|
|
_w_end
|
|
.elseif is_script_mode VEHICLE
|
|
_v_end
|
|
.endif
|
|
.endmac
|
|
|
|
; ------------------------------------------------------------------------------
|
|
|
|
.define ACTION_H_FLIP $40
|
|
|
|
.mac action aa
|
|
.assert (is_script_mode OBJ) || (is_script_mode WORLD), error, "Invalid script mode"
|
|
_cmd_impl aa
|
|
.endmac
|
|
|
|
.mac dir dd
|
|
.assert (is_script_mode OBJ) || (is_script_mode WORLD), error, "Invalid script mode"
|
|
_cmd_impl $cc + EVENT_DIR::dd
|
|
.endmac
|
|
|
|
.mac move dd, steps
|
|
.assert (is_script_mode OBJ) || (is_script_mode WORLD), error, "Invalid script mode"
|
|
.if (EVENT_DIR::dd <= 3)
|
|
.assert steps >= 1 && steps <= 32, error, "Steps must be [1..32]"
|
|
.if steps <= 8
|
|
_cmd_impl $80 | ((steps - 1) << 2) | EVENT_DIR::dd
|
|
.elseif steps <= 16
|
|
_cmd_impl $80 | $1c | EVENT_DIR::dd
|
|
_cmd_impl $80 | ((steps - 9) << 2) | EVENT_DIR::dd
|
|
.elseif steps <= 24
|
|
_cmd_impl $80 | $1c | EVENT_DIR::dd
|
|
_cmd_impl $80 | $1c | EVENT_DIR::dd
|
|
_cmd_impl $80 | ((steps - 17) << 2) | EVENT_DIR::dd
|
|
.else
|
|
_cmd_impl $80 | $1c | EVENT_DIR::dd
|
|
_cmd_impl $80 | $1c | EVENT_DIR::dd
|
|
_cmd_impl $80 | $1c | EVENT_DIR::dd
|
|
_cmd_impl $80 | ((steps - 25) << 2) | EVENT_DIR::dd
|
|
.endif
|
|
.else
|
|
.ifblank steps
|
|
_cmd_impl $a0 | (EVENT_DIR::dd - 4)
|
|
.else
|
|
.repeat steps
|
|
_cmd_impl $a0 | (EVENT_DIR::dd - 4)
|
|
.endrep
|
|
.endif
|
|
.endif
|
|
.endmac
|
|
|
|
.enum OBJ_SPEED
|
|
SLOWER = 0
|
|
SLOW = 1
|
|
NORMAL = 2
|
|
FAST = 3
|
|
FASTER = 4
|
|
FASTEST = 5
|
|
.endenum
|
|
|
|
.mac speed val
|
|
.ifndef OBJ_SPEED::val
|
|
.error "Speed parameter must be one of the following: SLOWER, SLOW, NORMAL, FAST, FASTER, FASTEST"
|
|
.endif
|
|
|
|
.if is_script_mode OBJ
|
|
_cmd_impl $c0 + OBJ_SPEED::val
|
|
.elseif is_script_mode WORLD
|
|
.assert OBJ_SPEED::val <> 4, error, "FASTEST speed can't be used on world map"
|
|
_cmd_impl $c0 + OBJ_SPEED::val
|
|
.else
|
|
.error "Invalid script mode"
|
|
.endif
|
|
.endmac
|
|
|
|
.enum EVENT_VEHICLE
|
|
NONE = $00
|
|
CHOCOBO = $20
|
|
MAGITEK = $40
|
|
RAFT = $60
|
|
SHOW_RIDER = $80
|
|
HIDE_RIDER = $00
|
|
.endenum
|
|
|
|
.mac vehicle p1, p2
|
|
.if is_script_mode OBJ
|
|
_o_cmd_impl $c9
|
|
make_bitmask .byte, 0, EVENT_VEHICLE, p1
|
|
.elseif is_script_mode EVENT
|
|
_e_cmd_byte $44, EVENT_OBJ::p1
|
|
make_bitmask .byte, 0, EVENT_VEHICLE, p2
|
|
.endif
|
|
.endmac
|
|
|
|
.mac hide_obj obj
|
|
.if is_script_mode EVENT
|
|
_e_hide_obj obj
|
|
.else
|
|
_cmd_impl $d1
|
|
.endif
|
|
.endmac
|
|
|
|
.mac show_obj obj
|
|
.if is_script_mode EVENT
|
|
_e_show_obj obj
|
|
.else
|
|
_cmd_impl $d0
|
|
.endif
|
|
.endmac
|
|
|
|
.define anim_on _o_cmd_impl $c6
|
|
.define anim_off _o_cmd_impl $c7
|
|
.define layer(ll) _o_cmd_byte $c8, ll
|
|
|
|
; .define _o_show_obj _o_cmd_impl $d0
|
|
; .define _o_hide_obj _o_cmd_impl $d1
|
|
|
|
.define pos(xy_pos) _o_cmd_2byte $d5, xy_pos
|
|
|
|
.define scroll_obj _o_cmd_impl $d7
|
|
|
|
.define jump_low _o_cmd_impl $dc
|
|
.define jump_high _o_cmd_impl $dd
|
|
|
|
.mac exec addr
|
|
_assert_script_mode OBJ
|
|
_cmd_addr $f9, addr
|
|
.endmac
|
|
|
|
.mac _branch op, addr
|
|
_assert_script_mode OBJ
|
|
.if .def(addr) && ((addr) - (* - 1)) <= 0
|
|
; branch backward
|
|
_cmd_byte op, (* - 1) - (addr)
|
|
.else
|
|
; branch forward
|
|
_cmd_byte op + 1, (addr) - (* - 1)
|
|
.endif
|
|
.endmac
|
|
|
|
.define branch _branch $fc,
|
|
.define branch_rand _branch $fa,
|
|
|
|
.mac branch_end addr
|
|
.ifndef _ObjStart
|
|
.error "Missing start of object script"
|
|
.endif
|
|
_branch $fc, addr
|
|
_ObjEnd := *
|
|
set_script_mode EVENT
|
|
.endmac
|
|
|
|
.mac _o_end
|
|
.ifndef _ObjStart
|
|
.error "Missing start of object script"
|
|
.endif
|
|
_o_cmd_impl $ff
|
|
_ObjEnd := *
|
|
set_script_mode EVENT
|
|
.endmac
|
|
|
|
; ------------------------------------------------------------------------------
|
|
|
|
.define ship_gfx _w_cmd_impl $fc
|
|
.define figaro_submerge _w_cmd_impl $fd
|
|
.define figaro_emerge _w_cmd_impl $fe
|
|
.define _w_end _w_cmd_impl $ff
|
|
|
|
.mac airship_pos xy_pos
|
|
.assert (is_script_mode WORLD) || (is_script_mode VEHICLE), error, "Invalid script mode"
|
|
_cmd_impl $c7
|
|
_2_bytes xy_pos
|
|
.endmac
|
|
|
|
.enum MOVE_VEHICLE_FLAGS
|
|
DOWN = BIT_6
|
|
UP = BIT_5
|
|
LEFT = BIT_4
|
|
RIGHT = BIT_3
|
|
FORWARD = BIT_2
|
|
BACKWARD = BIT_1
|
|
BACK = BIT_1
|
|
SHARP_TURNS = BIT_0
|
|
NONE = 0
|
|
.endenum
|
|
|
|
.mac move_vehicle flags, dur
|
|
_assert_script_mode VEHICLE
|
|
make_bitmask .byte, 0, MOVE_VEHICLE_FLAGS, flags
|
|
.byte dur
|
|
.endmac
|
|
|
|
.define camera_dir(dd) _cmd_word $c1, dd, VEHICLE
|
|
.define move_dir(dd) _cmd_word $c2, dd, VEHICLE
|
|
|
|
.define altitude(aa) _cmd_word $c5, aa, VEHICLE
|
|
|
|
.define show_arrows _v_cmd_impl $da
|
|
.define lock_arrows _v_cmd_impl $db
|
|
.define hide_arrows _v_cmd_impl $dc
|
|
|
|
.mac hide_minimap
|
|
.assert (is_script_mode WORLD) || (is_script_mode VEHICLE), error, "Invalid script mode"
|
|
_cmd_impl $dd
|
|
.endmac
|
|
|
|
.define set_origin(xy_pos) _cmd_2byte $de, xy_pos
|
|
|
|
.mac show_minimap
|
|
.assert (is_script_mode WORLD) || (is_script_mode VEHICLE), error, "Invalid script mode"
|
|
_cmd_impl $df
|
|
.endmac
|
|
|
|
.define _v_end _v_cmd_impl $ff
|
|
|
|
; ------------------------------------------------------------------------------
|
|
|
|
.endif
|