Structure and content of the 9th QBN file section, v1.1
                               
    by Thomas Hautesserres (hautesse@cert.fr), Glen Wright
                    (glen@skatter.usask.ca)
                               

Contents
Contents
Version
Note
The structure of a Pseudo-code Record
The different types of Pseudo-code records
 Pseudo-code Type 0 (Item & Location) [3 sub-records]
 Pseudo-code Type 1 (Item & NPC) [3 sub-records]
 Pseudo-code Type 2 (Associate State with Mob) [3 sub-records]
 Pseudo-code Type 3 (PC finds Item) [2 sub-records]
 Pseudo-code Type 4 (Items) [5 sub-records]
 Pseudo-code Type 5 (unknown) [3 sub-records]
 Pseudo-code Type 6 (States) [1 sub-record]
 Pseudo-code Type 7 (States) [2 or 5 sub-records]
 Pseudo-code Type 8 (Quest) [3 sub-records]
 Pseudo-code Type 9 (Mob) [5 sub-records]
 Pseudo-code Type 0x0A / 10 (Rumors) [4 sub-records]
 Pseudo-code Type 0x0B / 11 (Rumors) [4 sub-records]
 Pseudo-code Type 0x0C / 12 (Length) [2 sub-records]
 Pseudo-code Type 0x0D / 13 (Length) [2 sub-records]
 Pseudo-code Type 0x11 / 17  (Locations) [4 sub-records]
 Pseudo-code Type 0x13 / 19  (Locations) [2 sub-records]
 Pseudo-code Type 0x15 / 21 (Mob) [2 sub-records]
 Pseudo-code Type 0x16 / 22 (Mobs & Locations) [3 sub-records]
 Pseudo-code Type 0x17 / 23 (Create Log Entry) [3 sub-records]
 Pseudo-code Type 0x18 / 24 (Unknown) [2 sub-records]
 Pseudo-code Type 0x1A / 26 (Item & NPC) [3 sub-records]
 Pseudo-code Type 0x1B / 27 (Location) [4 sub-records]
 Pseudo-code Type 0x1C / 28 (NPC) [2 sub-records]
 Pseudo-code Type 0x1D / 29 (Mobs ?) [4 sub-records]
 Pseudo-code Type 0x1E / 30 (NPC, Location) [3 sub-records]
 Pseudo-code Type 0x1F / 31 (Daily Clock) [3 sub-records]
 Pseudo-code Type 0x22 / 34 (Random State) [5 sub-records]
 Pseudo-code Type 0x23 / 35 (Random State) [5 sub-records]
 Pseudo-code Type 0x24 / 36 (Item) [2 sub-records]
 Pseudo-code Type 0x25 / 37 (Item) [4 sub-records]
 Pseudo-code Type 0x26 / 38 (Rumors) [2 sub-records]
 Pseudo-code Type 0x27 / 39 (Item/Mob) [3 sub-record]
 Pseudo-code Type 0x2B / 43 (Location) [3 sub-record]
 Pseudo-code Type 0x2C / 44 (unknown) [2 sub-record]
 Pseudo-code Type 0x2E / 46 (Remove NPC) [2 sub-records]
 Pseudo-code Type 0x30 / 48 (Unknown) [2 sub-records]
 Pseudo-code Type 0x31 / 49 (Unknown) [2 sub-records]
 Pseudo-code Type 0x32 / 50 (Unknown) [2 sub-records]
 Pseudo-code Type 0x33 / 51 (Mob killed) [1 sub-record]
 Pseudo-code Type 0x34 / 52 (AND States) [5 sub-records]
 Pseudo-code Type 0x35 / 53 (OR States) [5 sub-records]
 Pseudo-code Type 0x36 / 54 (Item) [2 sub-records]
 Pseudo-code Type 0x37 / 55 (Escort NPC) [2 sub-records]
 Pseudo-code Type 0x38 / 56 (End Escort NPC) [2 sub-records]
 Pseudo-code Type 0x39 / 57 (Use Item) [3 sub-records]
 Pseudo-code Type 0x3A / 58 (Cure Vampirism) [1 sub-record]
 Pseudo-code Type 0x3B / 59 (Cure Lycanthropy) [1 sub-record]
 Pseudo-code Type 0x3D / 61 (Reputation) [3 sub-records]
 Pseudo-code Type 0x3F / 63 (Unknown) [2 sub-records]
 Pseudo-code Type 0x40 / 64 (Unknown) [2 sub-records]
 Pseudo-code Type 0x41 / 65 (Legal Reputation) [2 sub-records]
 Pseudo-code Type 0x44 / 68 (Mob) [3 sub-records]
 Pseudo-code Type 0x45 / 69 (Mob) [3 sub-records]
 Pseudo-code Type 0x46 / 70 (Items) [5 sub-records]
 Pseudo-code Type 0x47 / 71 (Unknown) [4 sub-records]
 Pseudo-code Type 0x48 / 72 (Unknown) [2 sub-records]
 Pseudo-code Type 0x49 / 73 (Spell) [3 sub-records]
 Pseudo-code Type 0x4C / 76 (Item) [2 sub-records]
 Pseudo-code Type 0x4D / 77 (Unknown) [2 sub-records]
 Pseudo-code Type 0x4E / 78 (Unknown) [2 sub-records]
 Pseudo-code Type 0x4F / 79 (Unknown) [2 sub-records]
 Pseudo-code Type 0x51 / 81 (Locations, NPC) [3 sub-records]
 Pseudo-code Type 0x51 / 81 (Locations, NPC) [3 sub-records]
 Pseudo-code Type 0x52 / 82 (NPC) [3 sub-records]
 Pseudo-code Type 0x53 / 83 (Location) [4 sub-records]
 Pseudo-code Type 0x54 / 84 (Play Sound) [4 sub-records]
 Pseudo-code Type 0x55 / 85 (NPC) [4 sub-records]
 Pseudo-code Type 0x56 / 86 (NPC) [4 sub-records]
 Pseudo-code Type 0x57 / 87 (Mob) [5 sub-records]
     

Version
     Version 1.1,  released on 3/30/98 on the WinQEdit site :
          http://www.enst.fr/~hautesse/daggerfall
     Version 1.0 is the first version, released on 03/01/98.

Note
     This   document   is  mostly  based  on  Dave   Humphrey's
 ®  Daggerfall Quest File (QRC/QBN) Hacking Results, v0.20 ¯  ,
 on  the results published by Glen Wright in an e-mail, and  on
 my  own experiments. Much information can be obtained from the
 Elder Scroll Pages site, at http://www.m0use.net/~uesp/.
     It   is  highly  recommended  to  be  familiar  with  Dave
 Humphrey's  document's content before reading  this  one.  The
 structure on the QBN file can be easily read and changed  with
 WinQEdit 95, a graphical quest file editor that I wrote.
     Send     any     comment     to    hautesse@cert.fr     or
 glen@skatter.usask.ca .

The structure of a Pseudo-code Record
     The  pseudo-code  records section was previously  referred
 as  the  ®  Messages  Section ¯.  It  is  pointed  at  by  the
 qbn_section_offset[8].  It contains  a  kind  of  pseudo-code,
 that rules initial locations of Items and Mobs, what is to  be
 done when certain events occur, and so on.
     Each  record in this section has a length of 87 bytes.  It
 is  composed of some information about the type of the record,
 of  five  sub-records sharing the same structure, and  at  the
 end  of a Message ID field and of an unknown long integer. The
 detailed structure is :
      Bytes  [00-03], long int : Type of pseudo-code  record.
         All  records of a certain Type share the same number
         and types of sub-records.
      Bytes  [04  -  05],  short int : Number of  valid  sub-
         records.  The  record  always  contains  five   sub-
         records,  but  some  may not be valid.  The  invalid
         records  the contain the same data as the sub-record
         of  the same rank in the previous pseudo-code record
         (that  is  to say : garbage). There always at  least
         one valid sub-record, and at most five.
      Bytes  [06 - 20], sub-record : First sub-record (always
         a State).
      Bytes [21 - 35], sub-record : Second sub-record.
      Bytes [36 - 50], sub-record : Third sub-record.
      Bytes [51 - 55], sub-record : Fourth sub-record.
      Bytes [66 - 80], sub-record : Fifth sub-record.
      Bytes  [81 - 82], short int : Message ID. Can be a real
         Message ID found in the QRC file, or 0xFFFF to  mean
         no message is to be used.
      Bytes  [83  -  86], long int : Unknown, but  should  be
         garbage  because  it  is  constant  throughout   the
         entire  file. As bytes 85 and 86 seem to  be  always
         zeros,  it could be two short ints, with the  second
         one always null.
     Each  sub-record  can  refer either  to  a  section  (Item
 Section,  Mob  Section,  State Section,  etc.)  or  contain  a
 constant value.
     When  it  refer to a particular section, it can be decoded
 as :
      Byte  [00]  :  Almost always 0x00, but sometimes  0x01.
         Maybe  it is used to negate a State, for example  in
         a pseudo-code Type 52 record.
      Byte  [01 - 04] : long int : Section and record number.
         For  example 0x00000921 should be read record 21  of
         section  09  (State). If no record  number  must  be
         specified,  the  last  byte  can  be  FF,  like   in
         0x000009FF.
      Bytes  [05  -  06],  short int : Section  number,  like
         0x0009.  Always the same section as the one  in  the
         long int.
      Byte [06], char : Garbage, set to zero in the editor.
      Bytes  [07 - 10], long int : Repeats the same value  as
         Byte  [01].  If  Byte[01] is 0x05 for example,  then
         this  long int is 0x00000005. If Byte [01] is  0xFF,
         this  int is 0xFFFFFFFF, ans if it's 0xFE, then this
         int is 0xFFFFFFFE.
      Bytes  [11  - 14], long int or two short ints: Garbage,
         set to zeroes in the editor.
     When  a  sub-record can also contain a constant.  In  that
 case, it has this structure :
      Byte [00] : Always 0x00 (unconfirmed).
      Byte [01 - 05], long int : 0x12345678.
      Bytes   [05   -   06],   short  int  :  always   0x0000
         (unconfirmed)
      Bytes  [07 - 10], long int : The constant value. Can be
         a  message ID, or any number, and also 0xFFFFFFFF or
         0xFFFFFFFE, etc.
      Bytes  [11 - 14], long int : Garbage, set to zeroes  in
         the editor.

The different types of Pseudo-code records
     This  work  is based on my own guess, and a  lot  on  Glen
 Wright's  ones.  Sometimes we disagree, or  I  don't  have  an
 opinion  on  some  types, so as for now,  Glen's  guesses  are
 noted  in Italic, preceded by GW. It does not mean I think  he
 is wrong !
     The  (confirmed) tags mean I have checked the fact against
 a  complete listing of the Code section from all quest  files,
 provided  by  Michael Schneider, and then  transformed  in  an
 Excel  spreadsheet by myself. The spreadsheet is available  on
 request (filename : sect8lit.xls). A complete spreadsheet  for
 all sections can be found in a file name sectcont.xls.

Pseudo-code Type 0 (Item & Location) [3 sub-records]
   Sub-record 1 : State
       Can be 0xFF or a valid record number (confirmed).
   Sub-record 2 : Item
   Sub-record 3 : Location
   Message ID : Always 0xFFFF (confirmed)
   Role : If State TRUE, place Item in Location.

Pseudo-code Type 1 (Item & NPC) [3 sub-records]
   Sub-record 1 : State
       Never 0xFF (confirmed)
   Sub-record 2 : Item
       Never 0xFF (unconfirmed)
   Sub-record 3 : NPC
       Never 0xFF (unconfirmed)
   Message Id : 0xFFFF or a valid ID (confirmed)
   Role : Set State when Item is given to NPC.
       Then  a  Type 51 can be used to display a message  (like
     in O0B30Y14),
       or a Type 4 used to give the reward to the player.

Pseudo-code Type 2 (Associate State with Mob) [3 sub-records]
   Sub-record 1 : State
       Maybe  the  State  is set when the mob is  created,  and
     then unset when the mob is killed (see Type 51).
   Sub-record 2 : Mob
       Index of Mob creature.
   Sub-record 3 : Value (Number of mob to create?)
       Value range from  0x00000001 to 0x00000007 (confirmed)
   Message ID : 0xFFFF or a valid ID (confirmed)
       Is displayed if the mob is chosen.
   Role : Associate State with Mob if it is created. (Set at
     creation, unset when killed). GW : ® Set State when
     monster killed at location ¯.
       There  can be a certain number of Type 2 records sharing
     the  same State. Thcan be useful to display a single ® Mob
     Killed ¯ message for all possible mobs. (see R0C60YY30).

Pseudo-code Type 3 (PC finds Item) [2 sub-records]
   Sub-record 1 : State
       Never  0xFF (confirmed). Can be inverted with a 0x01  in
     byte [6].
   Sub-record 2 : Item
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : Set State when Item is found by player, and display
     a message.

Pseudo-code Type 4 (Items) [5 sub-records]
   Sub-record 1 : State
       Never 0xFF (confirmed).
   Sub-record 2 : Item
       Value is the index of an Item record. or 0xFF
   Sub-records 3 to 5: Item
       Value can also be FF is no item is available.
   Message ID : 0xFFFF (confirmed)
   Role : Give Item to player when State is Unset ? (see Type
     54)
     GW : ® if State TRUE then display inventory and Item ¯,
     or alternate ® if Falg TRUE then erase Item ¯
       Or  Create Item or reward ? Compute item value if it  is
     random ?
       In  P0B30L11,  sub-records 2 to 5 are 0xFF.  Maybe  this
     type  just  means  that the quest is completed  when  this
     State is set, and rewards can be given.

Pseudo-code Type 5 (unknown) [3 sub-records]
   Sub-record 1 : State
       Never  0xFF (confirmed). Can be inverted with a 0x01  in
     byte [6].
   Sub-record 2 : Item
       Value is the index of an Item record. (confirmed)
   Sub-records 3 to 5: Location
       Value is the index of an Location record. (confirmed)
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : GW : ® Unknown ¯

Pseudo-code Type 6 (States) [1 sub-record]
   Sub-record 1 : State
       Value is valid or 0xFF (confirmed).
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : If State TRUE then Terminate Quest.
       What  if  the  State is not specified (see  S0000106.QBN
     and S0000107.QBN) ?

Pseudo-code Type 7 (States) [2 or 5 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
       Can be inverted with a 0x01 in byte [6] (confirmed).
   Sub-record 2 : State
       Can  be  the  same as State 1, or different  but  always
     valid. (confirmed)
   Sub-record 3 to 5 : State (Not always present)
       Can  be  the  same  as State 1, or different,  or  0xFE.
     (confirmed)
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : GW : ® if State1 TRUE then clear States 2 to 5 ¯.
       What if State1 is not specified ?

Pseudo-code Type 8 (Quest) [3 sub-records]
   Sub-record 1 : State
       Value is always valid. (confirmed)
       Can be inverted with a 0x01 in byte [6] (confirmed).
   Sub-record 2 : Constant
       Number  of  main  quest to trigger  (from  0x0000000  to
     0x000003E7)
   Sub-record 3 : Constant
       Same as sub-record 2 (confirmed).
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : GW : ® is State TRUE then trigger main quest
     (S0000502 if constant is 502). ¯.

Pseudo-code Type 9 (Mob) [5 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
       Can be inverted with a 0x01 in byte [6] (confirmed).
   Sub-record 2 : Mob
       Never 0xFF (confirmed).
   Sub-record 3 : Value
       Never 0xFFFFFFFF (confirmed).
   Sub-record 4 : Value
       Never 0xFFFFFFFF (confirmed).
   Sub-record 5 : Value
       Can be a number or 0xFFFFFFFE (confirmed).
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : Maybe set Mob exact position in Location or on the
     Map, when State is Set. GW : ® if State TRUE initialize
     Mob ¯
       In  P0B30L11, the Mob is a Mage trying to  Kill  the  PC
     and its escorted NPC.

Pseudo-code Type 0x0A / 10 (Rumors) [4 sub-records]
   Sub-record 1 : State
       Never 0xFF (confirmed).
   Sub-record 2 : Location
       Can be valid 0xFF. (confirmed).
   Sub-record 3 : NPC
       Can be valid 0xFF. (confirmed).
   Sub-record 4 : Item
       Can be valid 0xFF. (confirmed).
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE talk about... ¯.
       Note  :  At  least  one of the three sub-records  has  a
     valid  value,  but never more than two at  the  same  time
     (confirmed).

Pseudo-code Type 0x0B / 11 (Rumors) [4 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
       Can be inverted with a 0x01 in byte [6] (confirmed).
   Sub-record 2 : Location
       Can be valid 0xFF. (confirmed).
   Sub-record 3 : NPC
       Can be valid 0xFF. (confirmed).
   Sub-record 4 : Item
       Can be valid 0xFF. (confirmed).
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE allow asking `where is...' ¯
       Note  :  At  least one (and up to 3) of the  three  sub-
     records has a valid value (confirmed).

Pseudo-code Type 0x0C / 12 (Start timer) [2 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
       Can be inverted with a 0x01 in byte [6] (confirmed).
   Sub-record 2 : Length/Timer
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : GW : ® if State TRUE start Timer ¯.
       For  example, compute quest length, and then  allow  the
     quest  maker  to  display  a message  announcing  it.  The
     pseudo-code section seems to always start with a  Type  12
     record (whose State is 0xFF).

Pseudo-code Type 0x0D / 13 (Stop timer) [2 sub-records]
   Sub-record 1 : State
       Value is must be valid. (confirmed).
   Sub-record 2 : Length/Timer
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE shutdown Timer ¯.

Pseudo-code Type 0x11 / 17  (Locations) [4 sub-records]
   Sub-record 1 : State
       Value is ALWAYS 0xFF. (confirmed)
   Sub-record 2 : Location
   Sub-record 3 & 4 : Value
   Message ID : 0xFFFF (confirmed)
   Role : Unknown.

Pseudo-code Type 0x13 / 19  (Add Location to Map) [2 sub-
records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : Location
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : GW : ® if State TRUE add Location to player's map. ¯

Pseudo-code Type 0x15 / 21 (Mob hurt by PC) [2 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
       Can be inverted with a 0x01 in byte [6] (confirmed).
   Sub-record 2 : Mob
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : GW : ® Set State is Mob hurt by Player ¯

Pseudo-code Type 0x16 / 22 (Place Mob at Location) [3 sub-
records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : Mob
       Never 0xFF (confirmed).
   Sub-record 3 : Location
       Never 0xFF (confirmed).
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : GW : ® if State TRUE place Monster at Location ¯

Pseudo-code Type 0x17 / 23 (Create Log Entry) [3 sub-records]
   Sub-Record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : Value
       Log entry Message ID
   Sub-record 3 : Value
       Ranging from 0x00000000 to 0x0000000A.
   Message ID : 0xFFFF (confirmed)
   Role : If State TRUE add Message referenced in sub-record 2
     as log entry, at rank referenced by sub-record 3.
       I  don't  known  how  to  remove  it,  may  be  this  is
     automatically done.

Pseudo-code Type 0x18 / 24 (Unknown) [2 sub-records]
   Sub-Record 1 : State
       Value is always valid. (confirmed)
       Can be inverted with a 0x01 in byte [6] (confirmed).
   Sub-record 2 : Value
       Can be 0x00000000 or 0x00000001.
   Message ID : 0xFFFF (confirmed)
   Role : Unknown. GW : ® probably an if State TRUE then ¯

Pseudo-code Type 0x1A / 26 (Give Item to NPC) [3 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : Item
   Sub-record 3 : NPC
       Is   always   0xFF  but  in  S0000008.QBN.  Maybe   0xFF
     represents our character?
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : GW : ® if State TRUE then give Item to NPC ¯.
       What  if NPC is 0xFF ? Give Item to player or to  nobody
     ?

Pseudo-code Type 0x1B / 27 (Location) [4 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : Location
       Always a SPECIFIC location (like Castle Daggerfall)  and
     never a random one. (unconfirmed)
   Sub-record 3 : Value
       Small number.
   Sub-record 4 : Value
       Big number.
   Message ID : 0xFFFF (confirmed)
   Role : Unknown.

Pseudo-code Type 0x1C / 28 (PC meets NPC) [2 sub-records]
   Sub-record 1 : State
       Value  can  be  valid  or 0xFF (only  in  A0C01Y13.QBN).
     (confirmed)
   Sub-record 2 : NPC
   Message ID : 0xFFFF
   Role : Set State when PC meets NPC.

Pseudo-code Type 0x1D / 29 (Yes/No Question) [4 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : State
       Never  0xFF (confirmed). State to set if player  answers
     YES.
   Sub-record 3 : State
       Never  0xFF (confirmed). State to set if player  answers
     NO.
   Sub-record 4 : Value
       Valid Message ID (confirmed).
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE, display Message (sub-record
     4), with YES/NO buttons. If player answers YES, set State
     2, else set State 3 ¯.

Pseudo-code Type 0x1E / 30 (NPC, Location) [3 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : NPC
       Value can be valid or 0xFF. (confirmed)
   Sub-record 3 : Location
       Value is always valid (confirmed)
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : GW : ® if State TRUE, then place NPC at Location ¯.
       What if NPC is unspecified ?

Pseudo-code Type 0x1F / 31 (Daily Clock) [3 sub-records]
   Sub-record 1 : State
       Value is always valid. (confirmed)
   Sub-record 2 : Value
   Sub-record 3 : Value
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® set State when daily clock is between Value2
     and Value3 ¯.

Pseudo-code Type 0x22 / 34 (Random State) [5 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 to 5 : State
       Values  can  be  valid, 0xFE, and can be  repeated.  The
     first two are always valid. (confirmed).
   Message ID : 0xFFFF (confirmed)
   Role : if State TRUE set one State at Random.

Pseudo-code Type 0x23 / 35 (Unknownx) [5 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
       Can be inverted with a 0x01 in byte [6] (confirmed).
   Sub-record 2 : State
       Always Valid (confirmed).
   Sub-record 3 to 5 : State
       Values are always 0xFE. (confirmed).
   Message ID : 0xFFFF (confirmed)
   Role : GW : Might have to do with arrays. if State TRUE...

Pseudo-code Type 0x24 / 36 (Give Item to PC) [2 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : Item
       Value is always valid. (confirmed)
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : GW : ® if State TRUE, then give Item to player. ¯
       Related to type 0x1A ?

Pseudo-code Type 0x25 / 37 (Item) [4 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : State
       Value is always valid. (confirmed)
   Sub-record 3 : NPC
       Value is always valid. (confirmed)
   Sub-record 4 : Value
       Range from 0x00000000 to 0x00000032.
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE, then set State2 if NPC
     reputation >= Value. ¯
       What  does  `NPC  reputation' mean ? Is  it  `reputation
     with NPC' ?

Pseudo-code Type 0x26 / 38 (Rumors) [2 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : Value
       Value is a message ID (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE, then add Message to rumors. ¯

Pseudo-code Type 0x27 / 39 (Item and Mob) [3 sub-record]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : Item
       Value is always valid. (confirmed)
   Sub-record 3 : Mob
       Value is always valid. (confirmed)
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : Display message when Item is given to mob ? or GW :
     ® if State TRUE then give Item to Mob ¯

Pseudo-code Type 0x2B / 43 (PC at Location) [3 sub-record]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
       Can be inverted with a 0x01 in byte [6] (confirmed).
   Sub-record 2 : State
       Value is always valid. (confirmed)
   Sub-record 3 : Location
       Value is always valid. (confirmed)
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : GW : ® if State TRUE then set State2 if at
     Location ¯

Pseudo-code Type 0x2C / 44 (unknown) [2 sub-record]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : NPC
       Value is always valid. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE then ? ¯

Pseudo-code Type 0x2E / 46 (Remove NPC) [2 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : NPC
       Value is always valid. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE then remove NPC ¯

Pseudo-code Type 0x30 / 48 (Unknown) [2 sub-records]
   Sub-record 1 : State
       Value is always valid (confirmed)
       Can be inverted with a 0x01 in byte [6] (confirmed).
   Sub-record 2 : NPC
       Value is always valid. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : Unknown.

Pseudo-code Type 0x31 / 49 (Unknown) [2 sub-records]
   Sub-record 1 : State
       Value is always valid (confirmed)
   Sub-record 2 : Value
       Value is always 0x0000000F. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : Unknown.

Pseudo-code Type 0x32 / 50 (Unknown) [2 sub-records]
   Sub-record 1 : State
       Value is always valid (confirmed)
   Sub-record 2 : Value
       Range from 0x00000003 to 0x0000000F. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : Unknown.

Pseudo-code Type 0x33 / 51 (Display Message) [1 sub-record]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Message ID : Never 0xFFFF
   Role : If State TRUE display Message.
       What if State is 0xFF ? Always display Message ? When ?

Pseudo-code Type 0x34 / 52 (AND States) [5 sub-records]
   Sub-record  1 : State
       Value is always valid. (confirmed)
       Can be inverted with a 0x01 in byte [6] (confirmed).
   Sub-record 2 : State
       Value is always valid. (confirmed)
   Sub-record 3 to 5 : State
       Value can be 0xFE or a real one. (confirmed)
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : State 1 = State 2 AND State 3 AND State 4 AND State
     5, considering those States with a 0xFE value as true. A
     first byte of a sub-record set to 0x01 means a NOT.

Pseudo-code Type 0x35 / 53 (OR States) [5 sub-records]
   Sub-record  1 : State
       Value is always valid. (confirmed)
   Sub-record 2 : State
       Value is always valid. (confirmed)
   Sub-record 3 : State
       Value is always valid. (confirmed)
   Sub-record 4 & 5 : State
       Value can be 0xFE or a real one. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : State 1 = State 2 OR State 3 OR State 4 OR State 5,
     considering those States with a 0xFE value as FALSE. A
     first byte of a sub-record set to 0x01 means a NOT.

Pseudo-code Type 0x36 / 54 (Make Item ordinary) [2 sub-records]
   Sub-record  1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : Item
       Value is always valid. (confirmed)
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : GW : ® If State TRUE then make Item ordinary (i.e.
     non-quest). ¯

Pseudo-code Type 0x37 / 55 (Escort NPC) [2 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : NPC
       Value is always valid. (confirmed)
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : Give NPC to player when State is Set (As an escort).
     GW : ® if state TRUE then add face for NPC to screen ¯

Pseudo-code Type 0x38 / 56 (End Escort NPC) [2 sub-records]
   Sub-record 1 : State
       Value is always valid. (confirmed)
   Sub-record 2 : NPC
       Value is always valid. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if state TRUE then remove face of NPC from
     screen ¯

Pseudo-code Type 0x39 / 57 (Use Item) [3 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
       Can be inverted with a 0x01 in byte [6] (confirmed).
   Sub-record 2 : State
       Value is always valid. (confirmed)
   Sub-record 3 : Item
       Value is always valid. (confirmed)
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : if State True, set State2 if Item is used by player.
       Found in P0B30L11 (Item is the quest letter).

Pseudo-code Type 0x3A / 58 (Cure Vampirism) [1 sub-record]
   Sub-record 1 : State
       Value is always valid. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if state TRUE then cure Vampirism. ¯

Pseudo-code Type 0x3B / 59 (Cure Lycanthropy) [1 sub-record]
   Sub-record 1 : State
       Value is always valid. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if state TRUE then cure Lycanthropy. ¯

Pseudo-code Type 0x3D / 61 (Reputation) [3 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
       Can be inverted with a 0x01 in byte [6] (confirmed).
   Sub-record 2 : NPC
       Value is always valid. (confirmed)
   Sub-record 3 : Value
       Reputation  change. Can be positive of negative,  so  it
     must be a relative change.
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : GW : ® if State TRUE then change Reputation with
     NPC ¯
       As  the  value  can  also  be negative,  it  must  be  a
     relative change.

Pseudo-code Type 0x3F / 63 (Unknown) [2 sub-records]
   Sub-record 1 : State
       Value is always valid. (confirmed)
   Sub-record 2 : Mob
       Value is always valid. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : Unknown

Pseudo-code Type 0x40 / 64 (Unknown) [2 sub-records]
   Sub-record 1 : State
       Value is always valid. (confirmed)
   Sub-record 2 : Mob
       Value is always valid. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : Unknown

Pseudo-code Type 0x41 / 65 (Legal Reputation) [2 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
       Can be inverted with a 0x01 in byte [6] (confirmed).
   Sub-record 2 : Value
       Reputation  change. Can be positive of negative,  so  it
     must be a relative change.
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE then change player's Legal
     Reputation. ¯
       As  the  value  can  also  be negative,  it  must  be  a
     relative change.

Pseudo-code Type 0x44 / 68 (Mob) [3 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : Mob
       Value is always valid. (confirmed)
   Sub-record 3 : State
       Value  can  be  valid  (only in P0B10L07.QBN)  or  0xFF.
     (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE, then done with Mob ¯
       Why is State3 almost always 0xFF ?

Pseudo-code Type 0x45 / 69 (Mob) [3 sub-records]
   Sub-record 1 : State
       Value is always valid. (confirmed)
   Sub-record 2 : Mob
       Value is always valid. (confirmed)
   Sub-record 3 : Value
       Power  Level,  ranging  from 0x00000006  to  0x00000040.
     (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE, set a Power level (?) for Mob
     to Constant ¯

Pseudo-code Type 0x46 / 70 (PC has Items) [5 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : State
       Value is always valid. (confirmed)
   Sub-records 3 : Item
       Value is always valid. (confirmed)
   Sub-records 4 : Item
       Value  can  be  valid  (only in L0A01L00.QBN)  or  0xFF.
     (confirmed)
    Sub-records 5 : Items
       Value is always 0xFF. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE, then set State2  if player has
     Item2 ¯
       In  L0A01L00.QBN, there are two items. Is it a AND or  a
     OR ?

Pseudo-code Type 0x47 / 71 (Unknown) [4 sub-records]
   Sub-record 1 : State
       Value is always valid. (confirmed)
   Sub-record 2 : State
       Value is always valid. (confirmed)
   Sub-record 3 : Value
       Values    are    0x00000014,   0x00000032,   0x000003E8.
     (confirmed)
   Sub-record 4 : NPC
       Value is always valid. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : Unknown

Pseudo-code Type 0x48 / 72 (Unknown) [2 sub-records]
   Sub-record 1 : State
       Value is always valid. (confirmed)
   Sub-record 2 : Value
       Values are 0x00000003 and 0x0000000F. (confirmed)
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : Unknown

Pseudo-code Type 0x49 / 73 (PC casts Spell) [3 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : State
       Value is always valid. (confirmed)
   Sub-record 3 : Value
       Values    are    0x00000012,   0x00000033,   0x00000039.
     (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE, then set State1 when player
     cast Spell #Value. ¯
       Who knows about Spell numbers ?

Pseudo-code Type 0x4C / 76 (Give Item to PC) [2 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : Item
       Value is always valid. (confirmed)
   Message ID : 0xFFFF or a valid ID (confirmed)
   Role : GW : ® if State TRUE, then give Item to Player. ¯
       A  message  is displayed when the Item is given  to  the
     player.  It  is useful for Quest starting with  a  Letter.
     (see P0B30L11).
   See Also : Types 0x1A (Item to NPC) and 0x27 (Item to Mob)

Pseudo-code Type 0x4D / 77 (Unknown) [2 sub-records]
   Sub-record 1 : State
       Value is always valid. (confirmed)
   Sub-record 2 : Value
       Values range from 0x00000003 to 0x0000000A. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : Unknown

Pseudo-code Type 0x4E / 78 (Unknown) [2 sub-records]
   Sub-record 1 : State
       Value is always valid. (confirmed)
   Sub-record 2 : Value
       Values range from 0x0000012F to 0x000001F4. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : Unknown

Pseudo-code Type 0x4F / 79 (Unknown) [2 sub-records]
   Sub-record 1 : State
       Value is always valid. (confirmed)
   Sub-record 2 : Value
       Values range from 0x0000016B to 0x000001F4. (confirmed)
   Sub-record 3 : Value
       Values  range  from  0x00000000  (often)  to  0x0000000F
     (only once). (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : Unknown

Pseudo-code Type 0x51 / 81 (Locations, NPC) [3 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : Location
       Value can be valid or 0xFF. (confirmed)
   Sub-record 3 : NPC
       Value can be valid or 0xFF. (confirmed)
   Message ID : 0xFFFF
   Role : Maybe to give some NPCs a place to live, to create
     them...
     GW : ® Unknown ¯.

Pseudo-code Type 0x52 / 82 (Stop NPC talk) [3 sub-records]
   Sub-record 1 : State
       Value is always valid. (confirmed)
       Can be inverted with a 0x01 in byte [6] (confirmed).
   Sub-record 2 : NPC
       Value is always valid. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE, stop NPC from talking in the
     conversation screen. ¯.
       What does that mean ?

Pseudo-code Type 0x53 / 83 (Location) [4 sub-records]
   Sub-record 1 : State
       Value is always valid. (confirmed)
   Sub-record 2 : Location
       Value is always valid. (confirmed)
   Sub-record 2 : Value
       Values are 0x00000010 to 0x0000001A. (confirmed)
   Sub-record 2 : Value
       Values are 0x000003E9 to 0x0000C716. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : Unknown

Pseudo-code Type 0x54 / 84 (Play Sound) [4 sub-records]
   Sub-record 1 : State
       Value is always valid. (confirmed)
   Sub-record 2 : Value
       Value is always valid. (confirmed)
   Sub-record 2 : Value
       Value is always valid. (confirmed)
   Sub-record 2 : Value
       Value is always valid. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE, then play a sound ¯

Pseudo-code Type 0x55 / 85 (Choose Questor) [4 sub-records]
   Sub-record 1 : State
       Value can be valid or 0xFF. (confirmed)
   Sub-record 2 : NPC
       Value is always valid. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE, then make NPC the `questor'
     for the current quest. ¯
       What is the `questor' exactly ?

Pseudo-code Type 0x56 / 86 (End Questor) [4 sub-records]
   Sub-record 1 : State
       Value is always valid. (confirmed)
   Sub-record 2 : NPC
       Value is always valid. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : GW : ® if State TRUE, then stop NPC from being the
     `questor' for the current quest. ¯
       What is the `questor' exactly ?

Pseudo-code Type 0x57 / 87 (Unknown) [5 sub-records]
   Sub-record 1 : State
       Value is always valid. (confirmed).
       Can be inverted with a 0x01 in byte [6] (confirmed).
   Sub-record 2 : Mob
       Value is always valid. (confirmed)
   Sub-record 3 : Value
       Value is always valid. (confirmed)
   Sub-record 4 : Value
       Value is always valid. (confirmed)
   Sub-record 5 : Value
       Value can be valid. or 0xFFFFFFFF. (confirmed)
   Message ID : 0xFFFF (confirmed)
   Role : Unknown


If you have any problems, suggestions or comments on this page or website, please feel free to use the Contact Form to send a message to the WebMaster.
This document was last modified on: Saturday, 19 February 2011, at 09:55:52 and has been accessed 2828 times ( dagger/dfcode.txt ).
/text.shtml