add quest script compiler

This commit is contained in:
Martin Michelsen
2023-12-10 14:24:30 -08:00
parent b53bde9046
commit 16cddd28b2
10 changed files with 945 additions and 21 deletions
Binary file not shown.
+345
View File
@@ -0,0 +1,345 @@
// This file documents newserv's quest assembler syntax and format.
// The metadata directives specify the quest's name, description, and other
// information.
// The .version directive specifies which version of the game the quest is for.
// The values are DC_NTE, DC_V1_11_2000_PROTOTYPE, DC_V1, DC_V2, PC_V2, GC_NTE,
// GC_V3, GC_EP3_TRIAL_EDITION, GC_EP3, XB_V3, and BB_V4.
.version GC_V3
// The .quest_num directive specifies the internal number of the quest. This
// has no meaning for online quests, but for download quests, the game
// deduplicates quest files with the same number, so download quests should all
// have unique numbers in this field. On Episodes 1&2, this field must be in
// the range 0-255; onother versions, it can be 0-65535, but generally numbers
// less than 1000 are recommended.
.quest_num 58
// The .language field specifies the internal language of the quest. Values:
// 0 = Japanese
// 1 = English
// 2 = German
// 3 = French
// 4 = Spanish
// 5 = Chinese (simplified)
// 6 = Chinese (traditional)
// 7 = Korean
.language 1
// The .episode directive specifies the quest's episode. The server ignores this
// if a set_episode or set_episode2 opcode is present in the start function.
.episode Episode1
// These directives specify the quest's name, short description, and long
// description. Non-ASCII characters can be used here and in the script below;
// this entire file is encoded as UTF-8 and strings are transcoded to the
// encoding the client expects based on the .version directive.
.name "Lost HEAT SWORD"
.short_desc "Retrieve a\nweapon from\na Dragon!"
.long_desc "Client: Hopkins, hunter\nQuest:\n My weapon was taken\n from me when I was\n fighting a Dragon.\nReward: ??? Meseta\n\n\n"
// The quest script begins here. A quest script is a sequence of opcodes, and
// labels denoting positions within that sequence that can be jumped to or
// called like a function. All labels have names, and some have numbers. (In the
// compiled format, labels have only numbers and no names; during compilation,
// each label that doesn't have a number is assigned a number that isn't in use
// by another label.) To explicitly specify a label number (for example, if an
// object or NPC refers to a label by number), use an @ sign followed by the
// desired number. Note that numbers can be specified in decimal or hexadecimal;
// see on_talk_to_npc1 and on_talk_to_npc2 for examples.
// Every quest must have a start function; this is the main thread that starts
// when the quest begins. The start label implicitly has a number of zero.
start:
gget 0x0091, r252
set_floor_handler 0, floor_handler_pioneer_2
set_floor_handler 1, floor_handler_forest_1
set_floor_handler 2, floor_handler_forest_2
set_floor_handler 11, floor_handler_dragon
set_qt_success on_quest_success
get_difficulty_level_v2 r83
leti r60, 0 // Pioneer 2
leti r61, 0
leti r62, 0
leti r63, 0
map_designate r60-r63
leti r60, 1 // Forest 1
leti r61, 0
leti r62, 0
leti r63, 0
map_designate r60-r63
leti r60, 2 // Forest 2
leti r61, 0
leti r62, 0
leti r63, 0
map_designate r60-r63
leti r60, 11 // Dragon
leti r61, 0
leti r62, 0
leti r63, 0
map_designate r60-r63
ret
return_immediately:
ret
floor_handler_pioneer_2:
switch_jmp r0, [floor_handler_pioneer_2_first_time, floor_handler_pioneer_2_not_first_time]
floor_handler_pioneer_2_first_time:
set r50
set_mainwarp 1
leti r60, 0x000000ED
leti r61, 0x00000000
leti r62, 0x0000014D
leti r63, 0xFFFFFFF1
p_setpos 0, r60-r63
leti r60, 0x000000FF
leti r61, 0x00000000
leti r62, 0x00000152
leti r63, 0xFFFFFFD5
p_setpos 1, r60-r63
leti r60, 0x000000DE
leti r61, 0x00000000
leti r62, 0x00000142
leti r63, 0x00000019
p_setpos 2, r60-r63
leti r60, 0x000000F8
leti r61, 0x00000000
leti r62, 0x00000143
leti r63, 0xFFFFFFEC
p_setpos 3, r60-r63
call on_talk_to_hopkins
ret
floor_handler_pioneer_2_not_first_time:
set r50
thread_stg watch_for_dragon_killed_in_forest
thread_stg show_mission_complete_if_needed
ret
label00CA:
clear r50
set r51
ret
label00CB:
clear r51
set r50
ret
on_quest_success:
jmpi_eq r83, 0, on_quest_success_normal
jmpi_eq r83, 1, on_quest_success_hard
jmpi_eq r83, 2, on_quest_success_very_hard
jmpi_eq r83, 3, on_quest_success_ultimate
on_quest_success_normal:
window_msg "You\'ve been awarded\n100 Meseta."
bgm 1
winend
pl_add_meseta2 100
ret
on_quest_success_hard:
window_msg "You\'ve been awarded\n5000 Meseta."
bgm 1
winend
pl_add_meseta2 5000
ret
on_quest_success_very_hard:
window_msg "You\'ve been awarded\n10000 Meseta."
bgm 1
winend
pl_add_meseta2 10000
ret
on_quest_success_ultimate:
window_msg "You\'ve been awarded\n15000 Meseta."
bgm 1
winend
pl_add_meseta2 15000
ret
floor_handler_forest_1:
thread_stg watch_for_dragon_killed_in_forest
thread_stg show_mission_complete_if_needed
ret
floor_handler_forest_2:
thread_stg watch_for_dragon_killed_in_forest
thread_stg show_mission_complete_if_needed
ret
floor_handler_dragon:
thread_stg watch_for_dragon_zone_clear
thread_stg play_dragon_killed_cutscene_when_ready
thread_stg show_mission_complete_if_needed
ret
watch_for_dragon_zone_clear:
jmpi_eq r15, 1, return_immediately
sync
leti r240, 11
leti r241, 1
if_zone_clear r242, r240-r241
jmpi_eq r242, 0, watch_for_dragon_zone_clear
sync_register2 r15, 1
ret
watch_for_dragon_killed_in_forest:
jmpi_eq r18, 1, return_immediately
jmpi_eq r19, 1, return_immediately
watch_for_dragon_killed_in_forest_check_again:
sync
jmpi_eq r15, 0, watch_for_dragon_killed_in_forest_check_again
call wait_30_frames
p_action_disable
call on_dragon_killed
set r18
p_action_enable
ret
play_dragon_killed_cutscene_when_ready:
jmpi_eq r18, 1, return_immediately
jmpi_eq r19, 1, return_immediately
play_dragon_killed_cutscene_when_ready_check_again:
sync
jmpi_eq r15, 0, play_dragon_killed_cutscene_when_ready_check_again
call wait_30_frames
call start_cutscene
set r19
set_quest_board_handler 0, quest_board_item_handler, "HEAT SWORD"
set r74
set r254
call on_dragon_killed
call end_cutscene
ret
on_dragon_killed:
jmpi_eq r83, 3, on_dragon_killed_ultimate
window_msg "Dragon killed!"
add_msg "Hopkins\'s HEAT SWORD found\nin Dragon\'s mouth!"
se 1
winend
ret
on_dragon_killed_ultimate:
window_msg "Sil Dragon killed!"
add_msg "Hopkins\'s HEAT SWORD found\nin Sil Dragon\'s mouth!"
se 1
winend
ret
quest_board_item_handler:
disp_msg_qb "My dad gave HEAT SWORD\nto me."
close_msg_qb
ret
show_mission_complete_if_needed:
jmpi_eq r20, 1, return_immediately
show_mission_complete_if_needed_check_again:
sync
jmpi_eq r16, 0, show_mission_complete_if_needed_check_again
jmpi_eq r17, 1, return_immediately
p_action_disable
window_msg "Mission complete!"
bgm 0
add_msg "You will be taken to the lobby\nafter you receive your reward."
set r20
winend
clear_quest_board_handler 0
clear r74
p_action_enable
playbgm_epi 1
ret
on_talk_to_hopkins@310:
jmpi_eq r255, 1, on_talk_to_hopkins_complete_again
jmpi_eq r254, 1, on_talk_to_hopkins_complete
jmpi_eq r0, 1, on_talk_to_hopkins_incomplete_again
call start_cutscene
call wait_30_frames
message 100, "Ca... can you help\nme? Please?"
add_msg "I almost killed a\nDragon."
add_msg "But... but..."
add_msg "My HEAT SWORD...\nMy dad gave HEAT SWORD\nto me..."
add_msg "It\'s really important to\nme. I don\'t know how it\nwas taken from me."
add_msg "I cannot do my job\nwithout it! Please\nget it back for me."
set r0
mesend
bgm 1
call end_cutscene
ret
on_talk_to_hopkins_incomplete_again:
message 100, "Please get my\nHEAT SWORD\nback to me."
add_msg "Perhaps it\'s in the\nDragon\'s stomach!"
mesend
ret
on_talk_to_hopkins_complete:
call start_cutscene
message 100, "My item!\nThis is great! Wow!"
add_msg "Thank you very much!\nYou\'re great!"
add_msg "Please get your reward\nat the counter!"
add_msg "This is all I can do to\nshow my appreciation."
mesend
set r17
sync_register2 r16, 1
sync_register2 r255, 1
clear_quest_board_handler 0
clear r74
bgm 0
playbgm_epi 1
call end_cutscene
ret
on_talk_to_hopkins_complete_again:
message 100, "Please go get your\nreward at the counter!\nThank you!"
mesend
ret
on_talk_to_npc1@320:
jmpi_eq r254, 1, on_talk_to_npc1_complete
message 104, "Did Hopkins do it again?"
add_msg "Nothing. Forget about\nit."
mesend
ret
on_talk_to_npc1_complete:
message 104, "Well, Hopkins often\nloses his..."
mesend
ret
on_talk_to_npc2@0x14A:
jmpi_eq r254, 1, on_talk_to_npc2_complete
message 103, "It\'s kind of his\n\"talent,\" I think."
mesend
ret
on_talk_to_npc2_complete:
message 103, "Thanks for taking care\nof Hopkins."
mesend
ret
start_cutscene:
p_action_disable
disable_movement1 0
disable_movement1 1
disable_movement1 2
disable_movement1 3
hud_hide
cine_enable
cam_zmin
ret
end_cutscene:
cam_zmout
cine_disable
hud_show
enable_movement1 0
enable_movement1 1
enable_movement1 2
enable_movement1 3
p_action_enable
ret
wait_30_frames:
leti r72, 0
wait_30_frames_next_frame:
sync
addi r72, 1
jmpi_le r72, 30, wait_30_frames_next_frame
ret
-1
View File
@@ -1 +0,0 @@
q058-gc-e.bin
+1
View File
@@ -0,0 +1 @@
q058-gc-e.bin.txt