Event trong game này gồm 2 phần, map event và event chính.
Mỗi chương đều có cấu thành từ 2 khối event này.
Map event là một khối script chứa các event diễn ra trên map, chẳng hạn như nhân vật A nói chuyện với nhân vật B, hay A đánh B, hay khi chiếm thành, nhân vật nào đó tử trận,.... Map event chỉ được kích hoạt mỗi khi có hoạt động xảy ra trên map. Chẳng hạn như khi có nhân vật bất kỳ di chuyển/hành động.
Map event được kích hoạt qua routine
C6/839B: 8B PHB
C6/839C: 08 PHP
C6/839D: 4B PHK
C6/839E: AB PLB
C6/839F: DA PHX
C6/83A0: 5A PHY
C6/83A1: 22348386 JSR $868334
C6/83A5: AEAB0E LDX $0EAB
C6/83A8: E220 SEP #$20
C6/83AA: ADAD0E LDA $0EAD
C6/83AD: 48 PHA
C6/83AE: C220 REP #$20
C6/83B0: AB PLB
C6/83B1: BD0500 LDA $0005,X
C6/83B4: A8 TAY
C6/83B5: E220 SEP #$20
C6/83B7: BD0700 LDA $0007,X
C6/83BA: 48 PHA
C6/83BB: C220 REP #$20
C6/83BD: AB PLB
C6/83BE: 22D88386 JSR $8683D8
C6/83C2: 7A PLY
C6/83C3: FA PLX
C6/83C4: 28 PLP
C6/83C5: AB PLB
C6/83C6: 6B RTL
$0EAB ~ $0EAD là pointer dẫn tới khối map event. Khối script này được xử lý ở $8683D8. Chuỗi script này kết thúc bằng 0xFFFF.
C6/83D8: B90000 LDA $0000,Y
C6/83DB: C9FFFF CMP #$FFFF
C6/83DE: F005 BEQ $83E5
C6/83E0: 20E683 JSR $83E6
C6/83E3: 80F3 BRA $83D8
C6/83E5: 6B RTL
Khi lần đầu tiên CPU đọc từng event thì carry được clear, trong quá trình so sánh thì tùy tình huống mà carry được clear hay set. Trường hợp carry set thì bỏ qua event đó để đọc event tiếp theo.
C6/83E6: C8 INY
C6/83E7: 29FF00 AND #$00FF
C6/83EA: 0A ASL A
C6/83EB: AA TAX
C6/83EC: 18 CLC
C6/83ED: 7CFA83 JMP ($83FA,X)
C6/83F0: C8 INY
C6/83F1: 29FF00 AND #$00FF
C6/83F4: 0A ASL A
C6/83F5: AA TAX
C6/83F6: 38 SEC
C6/83F7: 7CFA83 JMP ($83FA,X)
83FA:
dw $84EC
dw $897C
dw $8983
dw $898A
dw $8991
$8683FA là table chứa các pointer dẫn tới các event. Tại đây, từng event được cấp cho một giá trị, sau đó giá trị này được so sánh với giá trị ở $0EBC, nếu bằng nhau thì map event mới xảy ra.
Chẳng hạn event kích hoạt hội thoại nhân vật A nói chuyện với nhân vật B có ID là 0x04, bắt đầu ở địa chỉ $868991.
Ví dụ: đoạn hội thoại khi Cuan (ID 06) bắt chuyện với Sigurd (ID 01) có cú pháp:
04 FF 06 00 01 00 FF FF
30 FF A7 01
Trong đó:
- Byte 1: 04 là ID kích hoạt map event hội thoại
- Byte 2: FF là mã số flag. FF là bỏ qua flag. Nếu là giá trị khác thì sẽ ảnh hưởng tới việc set/reset flag đó, và sẽ ảnh hưởng tới những event sau này. Với giá trị FF thì event hội thoại này không ảnh hưởng gì tới các event sau.
- Byte 3-4: 0006 là ID của Cuan. Nếu ID này là FFFF thì bất kỳ nhân vật nào bắt chuyện với nhân vật phía sau đều kích hoạt thoại.
- Byte 5-6: 0001 là ID của Sigurd. Nếu ID này là FFFF thì nhân vật phía trước bắt chuyện với bất kỳ nhân vật nào cũng đều kích hoạt thoại.
- Byte 7-8 báo kết thúc chuỗi event định nghĩa hội thoại, bắt đầu thực hiện event
- Byte 9: 30 là ID kích hoạt event chính
- Byte 10: là ID của flag, FF bỏ qua flag
- Byte 11-12: ID của event chính
* Nếu ID của 2 nhân vật đều là FFFF thì mọi nhân vật đều nói chuyện được với nhau, không phân biệt địch ta.
Đoạn trên có ý nghĩa: khi nhân vật Cuan (0006) bắt chuyện với Sigurd (0001) thì sẽ thi hành event chính có ID là 01A7.
Tại event chính này, CPU sẽ mở ra hộp thoại, thay đổi nhạc nền, hiển thị avatar nhân vật, text...
Đầu tiên, ID 04 kích hoạt thoại được $868991, rồi event này được cấp cho ID 000A.
C6/8991: A90A00 LDA #$000A
C6/8994: 5CA78686 JMP $8686A7
C6/86A7: 08 PHP
C6/86A8: A20700 LDX #$0007
C6/86AB: 8EB60E STX $0EB6
C6/86AE: A2B986 LDX #$86B9
C6/86B1: 8EAB0E STX $0EAB
C6/86B4: 28 PLP
C6/86B5: 5CED8486 JMP $8684ED
ID 000A của event hội thoại được so sánh với $0EBC.
Giá trị 0007 được ghi vào $0EB6 biểu thị độ dài của chuỗi trong cú pháp của ID hội thoại 04. Để sang event tiếp theo thì vị trí event hiện tại
được cộng với giá trị ở $0EB6. Tức, với trường hợp của mã hội thoại 04 thì vị trí hiện tại được cộng thêm 7 byte để CPU đọc sang event tiếp sau đó.
Trường hợp ID 000A của event hội thoại không bằng với giá trị của $0EBC thì CPU bỏ qua event này để đọc event tiếp sau.
Trường hợp giá trị ở $0EBC bằng 000A thì CPU sẽ đọc byte tiếp theo của chuỗi, tức đọc byte biểu thị cho flag.
Nếu byte này khác FF thì CPU sẽ xử lý flag ở $869A50.
Nếu byte này là FF thì CPU bỏ qua việc xử lý flag, nhảy tới địa chỉ ở $0EAB.
C6/84ED: B064 BCS $8553
C6/84EF: E220 SEP #$20
C6/84F1: CDBC0E CMP $0EBC
C6/84F4: C220 REP #$20
C6/84F6: D050 BNE $8548
C6/84F8: B90000 LDA $0000,Y
C6/84FB: 29FF00 AND #$00FF
C6/84FE: C9FF00 CMP #$00FF
C6/8501: F016 BEQ $8519
C6/8503: 898000 BIT #$0080
C6/8506: D008 BNE $8510
C6/8508: 22509A86 JSR $869A50
C6/850C: B03A BCS $8548
C6/850E: 8009 BRA $8519
C6/8510: 297F00 AND #$007F
C6/8513: 22509A86 JSR $869A50
C6/8517: 902F BCC $8548
C6/8519: 205A85 JSR $855A
C6/851C: 902A BCC $8548
C6/851E: B90000 LDA $0000,Y
C6/8521: 29FF00 AND #$00FF
C6/8524: C9FF00 CMP #$00FF
C6/8527: F012 BEQ $853B
C6/8529: 898000 BIT #$0080
C6/852C: D006 BNE $8534
C6/852E: 22D69986 JSR $8699D6
C6/8532: 8007 BRA $853B
C6/8534: 297F00 AND #$007F
C6/8537: 22139A86 JSR $869A13
C6/853B: 205385 JSR $8553
C6/853E: B90000 LDA $0000,Y
C6/8541: 20E683 JSR $83E6
C6/8544: 5C378C86 JMP $868C37
C6/8548: 205385 JSR $8553
C6/854B: B90000 LDA $0000,Y
C6/854E: 20F083 JSR $83F0
C6/8551: 8006 BRA $8559
C6/8553: 98 TYA
C6/8554: 18 CLC
C6/8555: 6DB60E ADC $0EB6
C6/8558: A8 TAY
C6/8559: 60 RTS
Đối với event hội thoại, địa chỉ ở $0EAB là $85B6B9, được ghi ở đoạn bên trên.
C6/86AE: A2B986 LDX #$86B9
C6/86B1: 8EAB0E STX $0EAB
C6/855A: 6CAB0E JMP ($0EAB)
Tại $86B6B9, CPU đọc 2 byte tiếp theo của chuỗi, biểu thị cho ID của nhân vật được bắt chuyện rồi ghi vào $0EAE.
Sau đó, CPU tiếp tục đọc 2 byte tiếp biểu thị cho ID của nhân vật được bắt chuyện, rồi ghi vào $0EB0.
Tiếp đến, CPU đọc 2 byte cuối cùng trong chuỗi là FFFF rồi ghi vào
$0EB2 trước khi nhảy đến routine $869BF2 để check xem các ID nhân vật vừa rồi có đúng là ID cần kích hoạt thoại ở tình huống hiện tại hay không.
C6/86B9: B90100 LDA $0001,Y
C6/86BC: 8DAE0E STA $0EAE
C6/86BF: B90300 LDA $0003,Y
C6/86C2: 8DB00E STA $0EB0
C6/86C5: B90500 LDA $0005,Y
C6/86C8: 8DB20E STA $0EB2
C6/86CB: 20F29B JSR $9BF2
C6/86CE: 9021 BCC $86F1
C6/86D0: AE6F05 LDX $056F
C6/86D3: ADBD0E LDA $0EBD
C6/86D6: 22B48484 JSR $8484B4
C6/86DA: AD6F05 LDA $056F
C6/86DD: 8DA70E STA $0EA7
C6/86E0: ADBF0E LDA $0EBF
C6/86E3: 22B48484 JSR $8484B4
C6/86E7: AD6F05 LDA $056F
C6/86EA: 8DA90E STA $0EA9
C6/86ED: 8E6F05 STX $056F
C6/86F0: 38 SEC
C6/86F1: 60 RTS
Tại routine $869BF2, CPU check ID của nhân vật bắt chuyện được ở ghi ở $0EAE. Nếu ID này là FFFF thì bỏ qua bước check xem có đúng là ID cần thiết ở tình huống hiện tại hay không, rồi check ID của nhân vật được bắt chuyện. Nếu ID này không phải FFFF thì so sánh với ID ở $0EBD (chứa ID đúng của nhân vật bắt chuyện ở tình huống hiện tại). Nếu 2 ID này không khớp nhau thì thoát khỏi routine với carry clear. Nếu 2 ID này khớp nhau thì tiếp tục check ID của nhân vật được bắt chuyện.
Nếu ID của nhân vật được bắt chuyện là FFFF thì thoát khỏi routine với carry set. Nếu ID này không phải FFFF thì tiếp tục so sánh với ID đúng của nhân vật được bắt chuyện được chứa ở $0EBF. Tại đây, nếu 2 ID này không khớp nhau thì thoát khỏi routine với carry clear.
Nếu 2 ID này khớp nhau thì CPU tiếp tục check giá trị chứa ở $0EB2. Tại $0EB2 là 2 byte cuối cùng của chuỗi event hội thoại. Giá trị này được so sánh với $0EC1. Nếu bằng nhau, hoặc khi chuỗi kết thúc bằng FFFF thì sẽ thoát routine với carry set.
C6/9BF2: ADAE0E LDA $0EAE
C6/9BF5: 3008 BMI $9BFF
C6/9BF7: ADBD0E LDA $0EBD
C6/9BFA: CDAE0E CMP $0EAE
C6/9BFD: D01C BNE $9C1B
C6/9BFF: ADB00E LDA $0EB0
C6/9C02: 3008 BMI $9C0C
C6/9C04: ADBF0E LDA $0EBF
C6/9C07: CDB00E CMP $0EB0
C6/9C0A: D00F BNE $9C1B
C6/9C0C: ADB20E LDA $0EB2
C6/9C0F: 3008 BMI $9C19
C6/9C11: ADC10E LDA $0EC1
C6/9C14: CDB20E CMP $0EB2
C6/9C17: D002 BNE $9C1B
C6/9C19: 38 SEC
C6/9C1A: 60 RTS
C6/9C1B: 18 CLC
C6/9C1C: 60 RTS
Sau khi thoát khỏi routine $869BF2 thì CPU trở vì $8686CE. Trường hợp carry set thì CPU sẽ thi hành mệnh lệnh tiếp theo để gọi event chính.