Official Qedit Site

Welcome to the Official Qedit Resource

*FIRST AND FOREMOST, ABSOLUTELY NO CODING EXPERIENCE IS REQUIRED TO USE THIS APPLICATION (ALTHOUGH UNDERSTANDING ASSEMBLY SCRIPTS IS A PLUS)*

The purpose of this section is to have all gathered information from different sources to better facilitate for others to start making their own quests. All information gathered here are gathered from various soruces, most notably from qedit.info. This will server as an alternative, up to date resource.

Navigate through the tabbed sections to find out more on Qedit.

Qedit is a complex and powerful quest editor for Phantasy Star Online that allows the user to make and edit custom quests. The program boasts very useful features such as a 3D view of your work and large amounts of customization options. Qedit was co-developed by Schthack, Lee and others during the height of PSOBB’s popularity.

Qedit has the ability to make the quests compatible with different platforms.

Snapshot of qedit and 3D view

qedit_2.thumb.png.5e384829337d70b22664d12f201af28c

-Register, Values and Labels-

Here is some useful information on some of the phrases we will be using.

A function (also known as a label) is a number that is assigned to operation codes (OPCodes). That number can be any number under 10000.
A register is like a container that stores values. Qedit allows 256 different registers, including 0, so 0-255 which totals 256.

Dwords can be considered hex values

e.g
200: leti r240, 00000001
ret
100: ret

200 and 100 are two different labels. Leti is an OPCode, R240 is a register.
00000001 is a dword value.

So it’s like this, register is a variable, R200 is variable 200. Simple, no?
If you want register 200 to be 1, you would do this; leti R200, 00000001

Label 0: (function 0)

This is the function that starts the quest. OP codes such as bb_map_designate, leti and set_floor_handler are found here. It’s essentially telling the client how you want the quest to start. So as you can see, label 0 is very important.

Here are some reserved registers that the quest uses:

*Register 255 is the quest success flag (if true quest cleared).
*Register 253 is the quest failure flag (if true quest failed).
*Register 0 says the quest has begun.
*Register 252 is for get_difficulty_level2
*R60-R69 used for quest items and such (not reserved, but used often by Sega)

PSOBB quests are comprised of two files, the .dat and the.bin. These two are comprise the actual file that the server reads, the .qst quest file.

The .dat is what contains the floor data (map) object (such as traps, player sets) and the event data.
The .bin contains the script. The script is what tells the client what do with NPC’s, objects. It’s essentially the “director” for the quest.

A PSOBB quest needs both of these raw files for it to function properly.

To get a little better understanding, let’s look at one of our custom quests:

qedit_2.thumb.png.5a07abf04456630cab60a05945fea6b5

 

As you can see, you have red and green arrows, red are the monsters and green are objects (doors, player sets, energy barriers, etc)
The red arrows are facing where the monster will be facing when it spawns. Monsters, as defined in Qedit, isn’t exclusively for monsters, it’s also for NPC’s so don’t be confused when you scroll down the list of monsters within the menu and see Irene!

The map event data is a bit more simpler to understand, it essentially defines what and when the mob waves will be called. Let’s look at one.

qedit_3.thumb.png.ece20e066bd10baa969e943bed0829b6

Here is a map event for Tenebrous Woods. On the left, you see the events list (total of 134) and on the right is the actual events that will take place. Let’s break it down.

##100 <—–Number of the event

Section: 2 <—— Section where the event will take place

Wave: 1 <—— The wave that will take place in the section

Delay: 1 <—— The delay at which the wave will spawn

Call 102 <—- Function that calls on the next wave after #100 is complete (when all monsters are defeated)

#102

Section: 2

Wave: 3

Delay: 1

(Process repeats)#
This process is what takes place when you add map events for monster mobs. You can only add 134 events for each area. (134 in Forest 1, 134 in Forest 2)

PSOBB Script (assembly)

As i stated above, for the quest to actually function, it will need a script. The script tells the client what map to use, how and when to run the cut scenes (if any), what the NPC’s are going to say, etc. The script essentially does it all. In this article, i will be showing you basics on the script, we will go more in depth in a future topic.

Let’s look at the script for Tenebrous Woods to give us a better idea:

qedit_4.png.c05f3b5e0edf146e76921cd11798459e

Whenever a quest starts, it will always start with function 0:, the line with the blue 0
It tells the client what episode the quest is in, what difficulty to set it at, where’s the main warp, where the players will start, etc. Let’s look closely at the script to get a better understand of it.

Any quest will run this function automatically when it loads
We are essentially telling the server to set ep1 as the area
0: set_episode 00000000

The next two commands will set the success/failure flags
In this case, we have the success and failure flags setup
set_qt_success 186
set_qt_failure 157

These next commands tell server what functions to run at what floors when players enters it so, set_floor_handler <floor> <function>

set_floor_handler 00000000. 1
set_floor_handler 00000003, 1
set_floor_handler 00000007,1

These commands sets a floor for a given map.
So it’s like BB_map_designate <floor> <map> <variant> 00

bb_map_designate 00, 0000, 00, 00
bb_map_designate 04, 0002, 00, 00
bb_map_designate 07, 0002, 00, 00
bb_map_designate 0A, 000A, 01, 00

This command will determine what floor players will spawn in.

initial_floor 00000000

This one will assign  a map to the mainwarp (the big warp behind that sliding door in Pioneer2)

set_main_warp 00000002

 

Hope this helps on getting you started! Any questions you all may have, feel free to post on forums.

-What are OPCodes?-

So, OPcodes are operation codes. They are strings of text that perform a certain function. (opcodes will be bolded)

OP codes
———————————————-
leti:
leti R5, 00000002
leti assigns a value to a dword (which is 00000002) to a register
(which is R5). This is a VERY important OP code. Be sure to learn to use it right.
————————–
sync:
sync
Pauses the current label.
30 frames = 1 second
————————–
set:
set R200
R200’s value is now true (or 00000001).
——————————
clear:
clear R200
R200’s value is now false (or 00000000).
—————————–
sync_register:
Just like leti and used the same way. Only if effects the register of
all players in the party regardless if they interact with that event.
————————
ret:
ret
Tells the label to stop pretty much. Try to end all labels with this.
If you don’t they may repeat.
————————
nop:
nop
Tells the game to do nothing.
————————-
jmp:
jmp 450
Basically jump to a label. In this case label 450.
————————
jmpi_=:
jmpi_= R20, 00000001, 2000
Jumps to a label if a condition is met. In this case,
if register 20 is equal to 00000001, go to label 2000, if not, ignore it.
———————-
switch_jmp:
switch_jmp R0, 2:50:51
The register here is like a switch. The 2 is how many
labels there can be for this (this case 2). 50 and 51 are
two different labels. Whatever R0 equals will determine where to go to.
If R0 equals 0 it will jump to label 50. If it equals 1 it will jump to
label 51.
————————
switch_call:
switch_call R0 2:50:51
The register here is like a switch. The 2 is how many
labels there can be for this (this case 2). 50 and 51 are
two different labels. Whatever R0 equals will determine where to go to.
If R0 equals 0 it will jump to label 50. If it equals 1 it will call label
51 then continue.
————————
call:
call 300
This will call label 300 (in this case). This is not jmp.
After the label called is finished, the current label will continue
unlike jmp.
—————————————
message:
message 00000001, ‘Hi?’
This tells the npc in the dword to say the message said.
So in this, npc 01 says “Hi?”. Remember, the npc id in the script
is in hex, the npc id in the monster editor is in decimal. So,
let’s say their id is 350. You would write 0000015E for the dword
(use a hex calculator if you need to). After this OP code is used,
use add_msg until you use mesend.
—————————————-
window_msg:
window_message ‘Hiya’
Will display “Hiya”.
Don’t forget to use winend to shut the window.
add_msg can be used for additional bubbles.
————————-
add_msg:
add_msg ‘Hello world’
Add’s a new message bubble to the message command.
This can be used with message and window_msg.
————————-
mesend:
mesend
Closes a message box (don’t forget to use this to end message text).
————————–
winend:
winend
Closes the window_msg box (don’t forget to use this to end window text).
———————————
p_dead_V3:
p_dead_V3 R200, R210
p_dead_V3 R200, 00000000
First value is if the player is dead. 00000000 being alive
and 00000001 being dead. The second value is the player slot
(can be register or dword).
So.., let’s say player 3 is dead. And this is passed.
p_dead_V3 R210, 00000002. Register 210 is now 00000001.
Note: Using a scapedoll doesn’t count as dying.
————————-
get_gender:
get_gender R101, R102
Gets the gender of player R101 and put’s it in
value R102. If the character is male the value will be 00000000,
if female the value will be 00000001.
Note: I don’t know male and females actual values, but those are
probably right.
————————
go_floor:
go_floor R100, R200
Character R100 will go to floor number R200.
For example. Let’s say you made R100 equal 00
and made R200 equal 01. That would send player 1
(the red player) to the forest (area 01).
———————–
set_qt_success:
set_qt_success 250
Label whatever (250) will be executed when you talk to the guild later,
if the quest is cleared. The quest is cleared if register 255
is equal to 1 (00000001).
———————-
get_slotnumber:
get_slotnumber R100
Set’s the register’s value to that of the player
in whatever label they are in.
Player1 00000000
Player2 00000001
Player3 00000002
Player4 00000003
So, in this case if player2 was encountering this,
R100 would equal 00000001.
———————–
set_floor_handler:
set_floor_handler 00000002, 250
When the player enters floor dword (00000002), the label
(250) is executed. Most cases 00000002 is forest 2.
———————
get_random:
get_random R6, R8
This will be hard to explain.
I will use a example.
leti R6, 00000000
leti R7, 00000009
get_random R6, R8
sync
switch call R8, 9:1:2:3:4:5:6:7:8:9
ret
get_random seems to use the first register number and the number after
it (6 and 7). Now get_random will generate a number of R7 vales starting with the
value of Register 6 (00000000). Then it will store that value in register 8 in this case.
Whatever 8 equals will determine which label will be jumped to.
Note: This is not a completely accurate explanation, but it should give you
an idea. I will revise this later.
(It seems leti R7 is the number of values excluding 0).
——————–
pl_add_meseta:
pl_add_meseta 00000015
When a player interacts with this, they will recieve dword amount of
meseta. Keep in mind this is in hex. So in this case the player will
recieve 21 meseta.
Note: If you give over 999999 meseta the value will equal 999999.
———————-
thread_stg:
thread_stg 400
This will make label 400 be called, but it will be a thread.
Threads are made to repeat.Use this when using something like
p_dead_V3.
Note: When you use this, make sure you jmp back to the thread label.
Also, make sure sync is used (if you don’t you’ll crash). For example…
100: thread_stg 101
ret
101: jmpi_= R150, 00000001, 500
sync
jmp 101
ret
500: ret
IMPORTANT NOTE: DO NOT use tread_stg in a thread stage! It will slow down
players, mess up the quest, and crash the users.

—————-

thread: 

Thread will allow the function to continue running while the principal script continues.
———————-
if_zone_clear:
if_zone_clear R90, R45
I will use a example to explain this.
850: jmpi_= R44, 00000001, 4000
sync
leti R45, 00000004
leti R46, 00000032
if zone_clear R90, R45
jmpi_=R90, 00000000, 850
sync_register R44, 00000001
jmp 850
ret

Registers 45 and 46 are used to determine which area is cleared.
In this case area 4 room id 50 (32 in hex). R90 is the value of cleared or not.
00000000 being not cleared, 00000001 being cleared. As you can see if R90 is
00000000 the thread repeats. If it is cleared it will sync_register 44’s value to
00000001. Which in turn will exit the thread because jmpi will go to label 4000.
Note: This is accurate regardless if you understand it or not.
——————————–
item_create2:
item_create2 R200, R212
Not really sure exactly how this works, but I will show you how to use it.
800: leti R200, 00000000
leti R201, 00000010
leti R202, 00000000
leti R203, 00000005
item_create2 R200, R204
ret
Register values 200-203 will be put into R204 and be given to the player.
This would create a OROTIAGITO with 5 grinds (if this weapon can’t be grinded
it will just be given with no grinds).
*Taken from Corey’s list:
VVVVVVGG,SS00PPPP,PPPPPPPP
V = Weapon ID in HEX
G = Grind in HEX
S = Special on Weapon
P = Percentages on Weapon in HEX
Now OROTIAGITO’s value is 001000. Now look at the leti.
R200 is 00
R201 is 10
R202 is 00
R203 is 05
(it only cares about the last 2 numbers in the leti).
So OROTIAGITO with 5 grinds.
Also, you may add more letis to make weapons with percents.
Note: All other types of items like armor use different making methods.
This can be found in bb_items.txt. Also, if the said item is not on the
allow list, then the item won’t be given and the player will be logged to
the ship administrator. Don’t use this without permission of the admin.
———————————————-
list:
list R100 ‘No Yes’
The register here will equal whatever you choose.
seperates the choices. If you say No, in this case
the register will be 00000000. If you say Yes, the register
will be 00000001.
—————————————————
get_difflvl:
get_difficultylvl r1
When this OP code is encountered, the register
will equal the difficulty level, but only up to
veryhard.
Normal=00000000
Hard=00000001
VeryHard=00000002
Ultimate=00000002
This is meant for pso version1, but can be used in BB.
Really no point in using it really. If your playing ultimate
the value will be 2. Use get
—————————————————–
get_difflvl2:
get_difflvl2 R104
When this OP code is encountered, the register
will equal the difficulty level.
Normal=00000000
Hard=00000001
VeryHard=00000002
Ultimate=00000003
So, let’s say your playing a ultimate difficulty game and this is
encountered. The register written (let’s just say it’s 104) will
be equal to 00000003.
———————————–
BB_Map_Designate:
BB_Map_Designate 00, 0000, 00, 00
First value is where you want it to be on
your area list. Next value is the map number you
want to be used. Third value is the map varient
you want it to be. Last number is unknown,
so leave it at 00.
Map numbers and variants:
Episode 1:
0x00 Pioneer 2 – no variant
0x01 Forest 1 – no varient
0x02 Forest 2 – no varient
0x03 Cave 1 – 6 varients
0x04 Cave 2 – 6 varients
0x05 Cave 3 – 6 varients
0x06 Mine 1 – 6 varients
0x07 Mine 2 – 6 varients
0x08 Ruins 1 – 5 varients
0x09 Ruins 2 – 5 varients
0x0A Ruins 3 – 5 varients
0x0B Dragon – no varient
0x0C De Rol Le – no varient
0x0D Vol Opt – no varient
0x0E Falz – no varient
0x0F Lobby – 15 varients
0x10 BATTLE spaceship – 3 varients
0x11 BATTLE temple – 3 varients
Episode 2:
0x12 Labo – no varient
0x13 Temple alpha – 3 varients
0x14 Temple beta – 3 varients
0x15 Space Ship alpha – 3 varients
0x16 Space Ship beta – 3 varients
0x17 CCA – no varient
0x18 Jungle east – no varient
0x19 Jungle north – no varient
0x1A Mountains – 3 varients
0x1B Seaside – no varient
0x1C Seabed upper – 3 varients
0x1D Seabed lower – 3 varients
0x1E Gal Gryphon – no varient
0x1F Olga Flow – no varient
0x20 Barba ray – no varient
0x21 Gol dragon – no varient
0x22 Seaside night – no varient
0x23 Tower – 5 varients
Episode 4:
0x24 Wilds route 1 – no varient
0x25 Wilds 2 – no varient
0x26 Wilds 3 – no varient
0x27 Wilds 4 – no varient
0x28 Crater – no varient
0x29 Desert 1 – 3 varients
0x2A Desert 2 – no varient
0x2B Desert 3 – 3 varients
0x2C EP4 Boss – no varient
0x2D EP4 Pioneer 2 – no varient
*Credit goes to Lee
—————————————–
set_episode:
set_episode 00000000
Tells which episode the quest will be.
Episode1:00000000
Episode2:00000001
Episode4:00000002
This is the first OP code used mostly.
——————————————-
0xF82B unlock_door2:
unlock_door2 00000000, 00000000
Unlocks a door. Dword1 is the area number.
Dword 2 is the door ID in hex. For example.
unlock_door2 00000001, 00000063
This will unlock a door with the ID of 99
in forest.
——————————————–
lock_door2:
lock_door2 00000000, 00000000
Locks a door. Dword1 is the area number.
Dword 2 is the door ID in hex. For example.
lock_door2 00000001, 00000063
This “should” lock a door with the ID of 99
in forest.
———————————————
p_disablewarp:
p_disablewarp
Can’t use telepipes or ryuker when this is
encountered. The effect will go away when you
change floors I think, or is p_enablewarp is
encountered.
———————————————
p_enablewarp:
p_enablewarp
Makes you able to use telepipes and ryuker.
———————————————
get_number_of players:
get_number_of_players R200
Get’s the number of players in the party
and makes the register given that number.
1player- 00000000
2players- 00000001
3players- 00000002
4players- 00000003
Note: I’m guessing with the values (though they are probably right).
———————————————
enable_bgmctrl:
enable_bgmctrl 00000010
Use like this
sync
create_bgmctrl
sync
enable_bgmctrl 00000000
ret
This will enable certain music tracks
to play. The dword determines what tracks.
Values:
Nothing 00000000
epi1.adx 00000001
epi2.apx 00000002
ED_Piano 00000003
matter.adx 00000004
open.adx 00000005
dreams.adx 00000006
mambo.adx 00000007
carnival.adx 00000008
hearts.adx 00000009
smiles.adx 0000000A
nomal.adx 0000000B
chu_f.adx 0000000C
Ending_loop.adx 0000000D
DreamS_Kids,adx 0000000E
Escape.adx 0000000F
live.adx 00000010
Miles.adx 00000011
——————————————-
create_bgmctrl:
create_bgmctrl
Used with enable_bgmctrl.
————————————–
BB_get_number_in_pack:
BB_get_number_in_pack R30
The user who encounter this will have the number
of items they have put into the register (in hex).
I use this to check if you have too many items to be
given. For example..
400: BB_get_number_in_pack R50
jmpi_= R50, 0000001E, 500
window_msg ‘Got item x’
winend
ret
500: window_msg ‘Error, too many items’
winend
ret
This basically says, if you have 30 items,
give a error message. If not, you get the message,
“Got item x”.
——————————————-
QEXIT:
QEXIT
Ends the quest for whoever enounter it.
(this OP code isn’t needed for ending the quest
via guild counter).
—————————————–
set_mainwarp:
set_mainwarp 00000001
Sets the ragol teleporter to allow transportation
to certain areas. 00000001 is usually forest.
——————————————
gset:
gset 0018
This OP code sets flags on a player (and are permanent).
Do NOT use this OP code without permission of the administrator.
Caves unlocked 0018
Mines unlocked 0021
Ruins unlocked 0030
Hard mode unlocked 0035
VeryHard mode unlocked 0036
Ultimate unlocked 0037
Note: There are more, but I’m too lazy to list them at the moment (and I don’t
know most of them).
———————————————–
gclear:
gclear 0018
Just like gset, but clears the value instead.
————————————————
gget:
gget 0010, R200
Like gset. But transfers the value of the player
flag to a register.
Note: This info is just a guess, but makes logical sense to me.
———————————————–
p_setpos:
leti R60, 00000000
leti R61, 00000000
leti R62, 00000000
leti R63, 00000000
p_setpos R60
Determines position.
In this case, leti R60 is pos X, leti R61 is pos Y,
leti R62 is pos Z, and leti R63 is y rotation. The hex in
p_setpos determines the player slot (in this case it’s slot 1).
The R60 tells it to use R60-R63.
—————————-
unhide_obj:
leti R60, 00000001
leti R61, 00000032
leti R62, 00000008
unhide_obj R60
First leti is the map number, Second is the map section
(hex to decimal, it’s 20), third is appear flag.
Important note: Make sure ALL clients interact with this!!!!!
Also, if a client is not on the floor when something is being
unhidden it won’t be unhidden for them.
————————————–
unhide_ene:
leti R206, 00000005
leti R207, 0000004A
leti R208, 00000001
unhide_ene R206
Map number, then map section, then wave.

Note: Make sure ALL clients interact with this!!!!!
Also, if a client is not on the floor when something is
being unhidden it won’t be unhidden for them.
—————————————-
let:
let R1, R2
Copys value of register 2 to regster 1, easy.
——————————————-
add:
add r1, r2
Adds the value of r2 to r1.
——————————————
addi:
addi r1, dword
Will add the value of the dword to r1.
——————————————-
sub:
sub r1, r2
Subtracts r2 from r1.
—————————————
subi:
sub r1,dword
Subtracts the dword from r1.
——————————————
mul:
mul r1, r2
Multiplies r2 to r1. For example. If r2 was 00000005 and
r1 was 00000002. Use this and r1 is now 0000000A.
———————————————-
muli:
muli r1, dword
Multiplies the dword to r1.
———————————————-
div:
div r1,r2
Divides r2 to r1.
——————————————-
divi:
divi r1, dword
Divides the dword to r1.
——————————————–
and:
and r1, r2
Compares r2 to r1 in binary and makes a new value for r1.
This is how it works. Let’s say r1 is 00000030 and r2
is 00000015. Now, let’s make this binary.
r1:00110000
r2:00010101
Now for every value true (1) in r1 you keep the value under it.
If its false (0) you clear the value in r2.
The new value is 00010000. Which is 00000010 in hex.
r1 is now 00000010!
———————————————
andi:
andi r1, dword
Compares the dword to r1. Just like and.
———————————————-
or:
or r1, r2
Compares r2 to r1 in binary. But is done a little differently.
This is how it works. Let’s say r1 is 00000030 and r2
is 00000015. Now, let’s make this binary.
r1:00110000
r2:00010101
Now for every value true (1) in r1 OR r2 the new value is true.
If neither are true (or both false), the value is 0.
The new value is 00110101. Which is 00000035 in hex.
r1 is now 00000035!!!
———————————————-
ori:
ori r1, dword
Same as or, just with a dword…
———————————————–
xor:
xor r1, r2
Now for every value true (1) in r1 OR r2 the new value is true.
If both are true it is cleared. If neither are true (or both false),
the value is cleared.
——————————————————-
xori:
xori r1, dword
Same as xori with a dword instead.
———————————–
get_player_hp:
206: sync
leti R120, 00000000
clear R121
clear R122
clear R123
clear R124
get_player_hp R120, R121
jmpi_=R122, 00000000, 62
jmp 206
ret
No idea how to explain. Register 120 is definitely the player
and 122 is definitly the HP. Why I have no clue.
Note: No idea here, but it works. I tried to explain, but I’m not
too sure myself and haven’t tested it. The instance shown above would work
though. As soon as player 1’s hp is 0 label 62 is jmped to.
————————————————–
restore_hp:
restore_hp R200
Restores the HP for the player that
R200 is equal to.
—————————————-
restore_tp:
restore_tp R210
Restores the TP for the player that
R210 is equal to.
——————————————-
shrink:
shrink R50
Shrinks the player that R50 is equal to.
——————————————–
unshrink:
unshrink R60
Unshrinks the player that R60 is equal to.
—————————————-
send_mail:
send_mail R60, ‘Hi’
Sends a mail to a the player that the register
is equal to has the message in it.
——————————————
read_global_flag:
read_global_flag r1, r2
Okay, r1 can either be a register or a dword. It
is a flag that’s part of your character’s save data.
r2 is the register you want it to be. For example..
read_global_flag 00000000, R100. This would make the data
in the dword’s value = R100. Oh, 00000000 is just the flag,
it’s not it’s value!

———————————————–
write_global_flag:
write_global_flag r1, r2
r1 can be either a register or dword just like read. r2
is the value to put into r1. For example…
write_global_flag 00000000, R101. This would make
dword flag 00000000, the value or R101. For lets say R101
was 00000001. The dword flag’s value is now 00000001 (it’s
still dword 00000000!!!!).
Note: Do NOT use this operation without the permission of
the admin cause it changes character data!!!!!
Another note: There’s not that many global flags.
I checked up to 00000009. Only, A,B,C,D,E, and F are possible
flags after that.
———————————————-
unequip_item_v3:
unequip_item_v3 rx, dword
The register is the player. The dword is the type of
item equiped?
00000000 being weapon?
———————————————-
BB_swap_item:
BB_swap_item dword1, dword2, dword3, dword4, dword5, dword6, label1, label2
First 3 dwords are for the item to be traded. Next 3 dwords is the item
given. Label 1 is if it was successful, label2 is if it failed.
—————————————————-
gettime:
gettime r1
Initial time. r1 is in seconds.
Use winset_time to modify the time.
——————————————————
window_time:
window_time
Shows timer.
—————————————————————-
winset_time:
winset_time r1
Updates the timer. r1 is in seconds.
——————————————————-
winend_time:
winend_time
Hides timer.
——————————————————-
chk_ene_num:
chk_ene_num r1
Checks for the enemys on the given floor I guess that are still alive.
It puts the number in the register.

These are a list of known registers for use with the quests.

 Register 0   = Says the quest has begun.
 Register 1   = Open free to use.
 Register 2   = Open free to use.
 Register 3   = Open free to use.
 Register 4   = Open free to use.
 Register 5   = Open free to use.
 Register 6   = Open free to use.
 Register 7   = Open free to use.
 Register 8   = Open free to use.
 Register 9   = Open free to use.
 Register 10  = Open free to use.
 Register 11  = Open free to use.
 Register 12  = Open free to use.
 Register 13  = Open free to use.
 Register 14  = Open free to use.
 Register 15  = Open free to use.
 Register 16  = Open free to use.
 Register 17  = Open free to use.
 Register 18  = Open free to use.
 Register 19  = Open free to use.
 Register 20  = Used in ending console (Count down time.)
 Register 21  = Used in ending console (Count down time.)
 Register 22  = Used to make sure the count down timer time limit has been reached to prevent a premature quest fail message.
 Register 23  = Stores players guild card number. get_guildcard_num
 Register 24  = Stores players gender. get_gender
 Register 25  = Determines what the quest giver will say/do.
 Register 26  = Used in ending console (Count down time.)
 Register 27  = Used in ending console (Count down time.)
 Register 28  = Stores players section id. get_Section_ID
 Register 29  = stores players class. get_chara_class
 Register 30  = Used in ending console (Count up time.)
 Register 31  = Used in ending console (Count up time.)
 Register 32  = Used to make sure the count up timer time limit has been reached to prevent a premature quest fail message.
 Register 33  = Open free to use.
 Register 34  = Open free to use.
 Register 35  = Open free to use.
 Register 36  = Used in ending console (Count up time.)
 Register 37  = Used in ending console (Count up time.)
 Register 38  = Open free to use.
 Register 39  = Used in chk_ene_num.
 Register 40  = Used in get_player_hp.
 Register 41  = Used in get_player_hp.
 Register 42  = Used in get_player_hp.
 Register 43  = Used in get_player_hp.
 Register 44  = Used to store the current maximum HP value the red gem player has.
 Register 45  = Used to store the current amount of HP the red gem player has left.
 Register 46  = Used to store the current maximum TP value the red gem player has.
 Register 47  = Used to store the current amount of TP the red gem player has left.
 Register 48  = Used to store the current maximum HP value the green gem player has.
 Register 49  = Used to store the current amount of HP the green gem player has left.
 Register 50  = Used to store the current maximum TP value the green gem player has.
 Register 51  = Used to store the current amount of TP the green gem player has left.
 Register 52  = Used to store the current maximum HP value the yellow gem player has.
 Register 53  = Used to store the current amount of HP the yellow gem player has left.
 Register 54  = Used to store the current maximum TP value the yellow gem player has.
 Register 55  = Used to store the current amount of TP the yellow gem player has left.
 Register 56  = Used to store the current maximum HP value the blue gem player has.
 Register 57  = Used to store the current amount of HP the blue gem player has left.
 Register 58  = Used to store the current maximum TP value the blue gem player has.
 Register 59  = Used to store the current amount of TP the blue gem player has left.
 Register 60  = Used to force a player set through scripting stores x position.
 Register 61  = Used to force a player set through scripting stores y position.
 Register 62  = Used to force a player set through scripting stores z position.
 Register 63  = Used to force a player set through scripting stores player slot number.
 Register 64  = Used in real time UTC clock.
 Register 65  = Used in real time UTC clock.
 Register 66  = Used in real time UTC clock.
 Register 67  = Used in real time UTC clock.
 Register 68  = Used in real time UTC clock.
 Register 69  = Used in real time UTC clock.
 Register 70  = Allow/disallow player invincibility.
 Register 71  = Second counter for player invincibility time/sync delay clock.
 Register 72  = Set with the value of time in seconds for how long the player should remain invincible/sync delay clock
 Register 73  = Used to store and clear scrolling text data. scroll_text
 Register 74  = Used to hide show quest board item 0. (Set true. Clear false.)
 Register 75  = Used to hide show quest board item 1. (Set true. Clear false.)
 Register 76  = Used to hide show quest board item 2. (Set true. Clear false.)
 Register 77  = Used to hide show quest board item 3. (Set true. Clear false.)
 Register 78  = Used to hide show quest board item 4. (Set true. Clear false.)
 Register 79  = Stores the number of items in the players inventory. BB_get_number_in_pack
 Register 80  = Reserved for item create/delete data byte 1.
 Register 81  = Reserved for item create/delete data byte 2.
 Register 82  = Reserved for item create/delete data byte 3.
 Register 83  = Reserved for item create/delete data byte 4.
 Register 84  = Reserved for item create/delete data byte 5.
 Register 85  = Reserved for item create/delete data byte 6.
 Register 86  = Reserved for item create/delete data byte 7.
 Register 87  = Reserved for item create/delete data byte 8.
 Register 88  = Reserved for item create/delete data byte 9.
 Register 89  = Reserved for item create/delete data byte 10.
 Register 90  = Reserved for item create/delete data byte 11.
 Register 91  = Reserved for item create/delete data byte 12.
 Register 92  = Reserved for item create/delete data byte 13.
 Register 93  = Reserved for item create/delete data byte 14.
 Register 94  = Reserved for item create/delete data byte 15.
 Register 95  = Reserved for item create/delete data byte 16.
 Register 96  = Reserved for item create/delete data (stores data.)
 Register 97  = Used to set the floor to go to with go_floor.
 Register 98  = Used in failing the quest so the players return directly to the quest giver.
 Register 99  = Used in opening console to lock it after use. (time count up and count down.)
 Register 100 = Used in time. (time count down.)
 Register 101 = Used in time. (time count down.)
 Register 102 = Used in time. (time count down.)
 Register 103 = Used in time. (time count down.)
 Register 104 = Used in time. (time count down.)
 Register 105 = Used in time. (time count down.)
 Register 106 = Used in time. (time count down.)
 Register 107 = Used in time. (time count down.)
 Register 108 = Used in time. (time count down.)
 Register 109 = Used in time. (time count down.)
 Register 110 = Used in time. (time count up.)
 Register 111 = Used in time. (time count up.)
 Register 112 = Used in time. (time count up.)
 Register 113 = Used in time. (time count up.)
 Register 114 = Used in time. (time count up.)
 Register 115 = Used in time. (time count up.)
 Register 116 = Used in time. (time count up.)
 Register 117 = Used in time. (time count up.)
 Register 118 = Used in time. (time count up.)
 Register 119 = Used in time. (time count up.)
 Register 120 = Used in random number generator. (Adjust to set minimum range.)
 Register 121 = Used in random number generator. (Adjust to set maximum range.)
 Register 122 = Used in random number generator. (Returned random number.)
 Register 123 = Used in random number generator. (Stores time.)
 Register 124 = Open free to use.
 Register 125 = Open free to use.
 Register 126 = Open free to use.
 Register 127 = Open free to use.
 Register 128 = Open free to use.
 Register 129 = Open free to use.
 Register 130 = Open free to use.
 Register 131 = Open free to use.
 Register 132 = Open free to use.
 Register 133 = Open free to use.
 Register 134 = Open free to use.
 Register 135 = Open free to use.
 Register 136 = Open free to use.
 Register 137 = Open free to use.
 Register 138 = Open free to use.
 Register 139 = Open free to use.
 Register 140 = Open free to use.
 Register 141 = Open free to use.
 Register 142 = Open free to use.
 Register 143 = Open free to use.
 Register 144 = Open free to use.
 Register 145 = Open free to use.
 Register 146 = Open free to use.
 Register 147 = Open free to use.
 Register 148 = Open free to use.
 Register 149 = Open free to use.
 Register 150 = Open free to use.
 Register 151 = Open free to use.
 Register 152 = Open free to use.
 Register 153 = Open free to use.
 Register 154 = Open free to use.
 Register 155 = Open free to use.
 Register 156 = Open free to use.
 Register 157 = Open free to use.
 Register 158 = Open free to use.
 Register 159 = Open free to use.
 Register 160 = Open free to use.
 Register 161 = Open free to use.
 Register 162 = Open free to use.
 Register 163 = Open free to use.
 Register 164 = Open free to use.
 Register 165 = Open free to use.
 Register 166 = Open free to use.
 Register 167 = Open free to use.
 Register 168 = Open free to use.
 Register 169 = Open free to use.
 Register 170 = Open free to use.
 Register 171 = Open free to use.
 Register 172 = Open free to use.
 Register 173 = Open free to use.
 Register 174 = Open free to use.
 Register 175 = Open free to use.
 Register 176 = Open free to use.
 Register 177 = Open free to use.
 Register 178 = Open free to use.
 Register 179 = Open free to use.
 Register 180 = Open free to use.
 Register 181 = Open free to use.
 Register 182 = Open free to use.
 Register 183 = Open free to use.
 Register 184 = Open free to use.
 Register 185 = Open free to use.
 Register 186 = Open free to use.
 Register 187 = Open free to use.
 Register 188 = Open free to use.
 Register 189 = Open free to use.
 Register 190 = Open free to use.
 Register 191 = Open free to use.
 Register 192 = Open free to use.
 Register 193 = Open free to use.
 Register 194 = Open free to use.
 Register 195 = Open free to use.
 Register 196 = Open free to use.
 Register 197 = Open free to use.
 Register 198 = Open free to use.
 Register 199 = Open free to use.
 Register 200 = Open free to use.
 Register 201 = Open free to use.
 Register 202 = Open free to use.
 Register 203 = Open free to use.
 Register 204 = Open free to use.
 Register 205 = Open free to use.
 Register 206 = Open free to use.
 Register 207 = Open free to use.
 Register 208 = Open free to use.
 Register 209 = Open free to use.
 Register 210 = Used in opening console. (time count up and count down.)
 Register 211 = Open free to use.
 Register 212 = Open free to use.
 Register 213 = Open free to use.
 Register 214 = Open free to use.
 Register 215 = Used in opening console. (time count up and count down.)
 Register 216 = Used in opening console. (time count up and count down.)
 Register 217 = Used in opening console. (time count up and count down.)
 Register 218 = Used in opening console. (time count up and count down.)
 Register 219 = Used in opening console. (time count up and count down.)
 Register 220 = Used in opening console. (time count up and count down.)
 Register 221 = Used in opening console. (time count up and count down.)
 Register 222 = Used in opening console. (time count up and count down.)
 Register 223 = Used in opening console. (time count up and count down.)
 Register 224 = Stores float camera shortcut data. Last ending psychical camera position x to be used as new starting psychical camera position x.
 Register 225 = Stores float camera shortcut data. Last ending psychical camera position y to be used as new starting psychical camera position y.
 Register 226 = Stores float camera shortcut data. Last ending psychical camera position z to be used as new starting psychical camera position z.
 Register 227 = Stores float camera shortcut data. Last ending camera look at position x to be used as new starting camera look at position x.
 Register 228 = Stores float camera shortcut data. Last ending camera look at position y to be used as new starting camera look at position y.
 Register 229 = Stores float camera shortcut data. Last ending camera look at position z to be used as new starting camera look at position z.
 Register 230 = Stores float camera data. Starting psychical camera position x.
 Register 231 = Stores float camera data. Starting psychical camera position y.
 Register 232 = Stores float camera data. Starting psychical camera position z.
 Register 233 = Stores float camera data. Starting camera look at position x.
 Register 234 = Stores float camera data. Starting camera look at position y.
 Register 235 = Stores float camera data. Starting camera look at position z.
 Register 236 = Stores float camera data. Ending psychical camera position x.
 Register 237 = Stores float camera data. Ending psychical camera position y.
 Register 238 = Stores float camera data. Ending psychical camera position z.
 Register 239 = Stores float camera data. Ending camera look at position x.
 Register 240 = Stores float camera data. Ending camera look at position y.
 Register 241 = Stores float camera data. Ending camera look at position z.
 Register 242 = Stores float camera data. Number of transition frames in integer. (Adjust to set the amount of time it will take to move the camera from starting to ending position.)
 Register 243 = Stores float camera data. Converted number of transition frames in float.
 Register 244 = Used for particle data position x.
 Register 245 = Used for particle data position y.
 Register 246 = Used for particle data position z.
 Register 247 = Used for particle data particle to use.
 Register 248 = Used for particle data time to display particle in frames.
 Register 249 = Used for particle data players slot number.
 Register 250 = Holds players slot number. get_slotnumber
 Register 251 = Holds room's difficulty level. get_difflvl2
 Register 252 = Open free to use.
 Register 253 = Is the quest failure flag. (If set quest failed.)
 Register 254 = Open free to use.
 Register 255 = Is the quest success flag. (If set quest cleared.)

There are a few ways you can test out your quest, one would be to setup a testing server for that purpose but what if you just want to get your file, upload it to a testing server and then test like that? Which one sounds less tedious?

For those wanting to test out quests for Schtserv. I have setup a testing environment where you can do just that.

Simply messasge me and i will give you credentials and the required client.

You will need a type of ftp software to be able to upload files to server. Filezilla is one that I use and it works best.