mirror of
https://github.com/notblisy/RUBYSAPPHIREDLC.git
synced 2026-07-13 07:03:14 -05:00
Finshed adding source
This commit is contained in:
parent
54e258f1b4
commit
80a61385f9
174
SOURCE/lugiaevent/00-C000.asm
Normal file
174
SOURCE/lugiaevent/00-C000.asm
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
INCLUDE "../macros.asm"
|
||||
SECTION "eonticket",ROM0[$100]
|
||||
jp Start
|
||||
db $00
|
||||
|
||||
TicketSprite: ; 104
|
||||
INCBIN "lugia.bin"
|
||||
TicketPalette: ; 1604
|
||||
INCBIN "lugiapal.bin"
|
||||
|
||||
Prologue:
|
||||
INCBIN "prologue-{REGION_NAME}.bin"
|
||||
|
||||
DataPacket: ; 164a
|
||||
INCBIN "eonticket-{REGION_NAME}.mev"
|
||||
db 0,0,0 ; padding
|
||||
|
||||
INCLUDE "../common/mem_struct.asm"
|
||||
|
||||
SpriteData:
|
||||
dw TicketSprite,TicketPalette
|
||||
db $7,$7,$01,$01,$01,$01,$01 ; width 15, height 8
|
||||
|
||||
Instructions1: ; 1921
|
||||
db "Link e-Reader to Pokémon Ruby or \n"
|
||||
db "Sapphire and select MYSTERY EVENTS\n"
|
||||
db "on the game's main menu.\n"
|
||||
db "Press the B Button to cancel.\0"
|
||||
|
||||
Instructions2: ; 199d
|
||||
db "Press the A Button on the Game Boy\n"
|
||||
db "Advance containing Pokémon Ruby or\n"
|
||||
db "Sapphire to begin sending the\n"
|
||||
db "LUGIA EVENT.\0"
|
||||
|
||||
DeliveryInProcess: ; 1a0d
|
||||
db "LUGIA EVENT delivery in Progress...\0"
|
||||
|
||||
TicketDelivered: ; 1a2f
|
||||
db "LUGIA EVENT delivered!\n"
|
||||
db "\n"
|
||||
db "Press the A Button to resend.\n"
|
||||
db "Press the B Button to cancel.\0"
|
||||
|
||||
; this function is subtly different than the one
|
||||
; on the Battle e cards, for no apparent reason
|
||||
TransferData:
|
||||
LD_IND_HL SomeVar1
|
||||
push de
|
||||
ld hl, $bbbb
|
||||
LD_IND_HL Space_1
|
||||
EX_DE_HL
|
||||
LD_IND_HL Space_2
|
||||
API_0C7 Space_1
|
||||
|
||||
wait $01
|
||||
pop hl
|
||||
inc hl
|
||||
ld b, $01
|
||||
call WordShiftRight
|
||||
|
||||
LD_IND_HL SomeVar2
|
||||
.asm_1aa1
|
||||
LD_HL_IND SomeVar2
|
||||
ld a, l
|
||||
or h
|
||||
ret z
|
||||
|
||||
ld hl, $8888
|
||||
LD_IND_HL Space_1
|
||||
ld e, $01
|
||||
|
||||
.asm_1aaf
|
||||
ld a, e
|
||||
cp $08
|
||||
jr nc, .asm_1ad9
|
||||
|
||||
push de
|
||||
LD_HL_IND SomeVar1
|
||||
ld c, [hl]
|
||||
inc hl
|
||||
ld b, [hl]
|
||||
inc hl
|
||||
LD_IND_HL SomeVar1
|
||||
ld l, e
|
||||
ld h, $00
|
||||
add hl, hl
|
||||
ld de, Space_1
|
||||
add hl, de
|
||||
ld [hl], c
|
||||
inc hl
|
||||
ld [hl], b
|
||||
pop de
|
||||
LD_HL_IND SomeVar2
|
||||
dec hl
|
||||
LD_IND_HL SomeVar2
|
||||
ld a, l
|
||||
or h
|
||||
jr z, .asm_1ad9
|
||||
|
||||
inc e
|
||||
jr .asm_1aaf
|
||||
|
||||
.asm_1ad9
|
||||
API_0C7 Space_1
|
||||
wait $01
|
||||
jr .asm_1aa1
|
||||
|
||||
Start: ; 1ae2
|
||||
API_121
|
||||
|
||||
CreateCustomSprite SpriteHandlePtr, $80, SpriteData
|
||||
SetSpritePos SpriteHandlePtr, 120, 64
|
||||
SpriteHide SpriteHandlePtr
|
||||
|
||||
CreateRegion RegionHandlePtr, 30, 6, 0, 14, 0, 4
|
||||
|
||||
ld h, a
|
||||
ld l, $00
|
||||
SetTextSize
|
||||
|
||||
API_09B RegionHandlePtr, $0102
|
||||
SetTextColor RegionHandlePtr, 2, 0
|
||||
SetRegionColor RegionHandlePtr, 0
|
||||
SetBackgroundPalette 16, $0040, TicketPalette
|
||||
|
||||
FadeIn 16
|
||||
wait 16
|
||||
|
||||
API $0C6
|
||||
|
||||
DrawText RegionHandlePtr, Instructions1, 8, 4
|
||||
API $08D
|
||||
|
||||
INCLUDE "../common/wait_for_link.asm"
|
||||
|
||||
SpriteShow SpriteHandlePtr
|
||||
|
||||
DrawText RegionHandlePtr, Instructions2, 8, 4
|
||||
API $08D
|
||||
|
||||
ld a, b
|
||||
nop
|
||||
|
||||
UNKNOWN_VALUE EQU $0078
|
||||
INCLUDE "../common/wait_for_ready.asm"
|
||||
|
||||
DrawText RegionHandlePtr, DeliveryInProcess, 8, 4
|
||||
|
||||
DATA_TRANSFER_LENGTH EQU 6144
|
||||
INCLUDE "../common/transfer_data.asm"
|
||||
ld hl, $5fff
|
||||
LD_IND_HL Space_1
|
||||
API_0C7 Space_1
|
||||
|
||||
wait $80
|
||||
|
||||
SpriteHide SpriteHandlePtr
|
||||
|
||||
DrawText RegionHandlePtr, TicketDelivered, 8, 4
|
||||
|
||||
API $08D
|
||||
ld c, a
|
||||
nop
|
||||
|
||||
INCLUDE "../common/wrap_up.asm"
|
||||
|
||||
INCLUDE "../common/word_shift_right.asm"
|
||||
|
||||
SomeVar1: ; 1CA2
|
||||
db $FF,0 ; mark EOF
|
||||
RegionHandlePtr: db 0 ; 1CA4
|
||||
SpriteHandlePtr: db 0,0 ; 1CA5
|
||||
SomeVar2: db 0,0 ; 1CA7
|
||||
BIN
SOURCE/lugiaevent/00-C000.raw
Normal file
BIN
SOURCE/lugiaevent/00-C000.raw
Normal file
Binary file not shown.
40
SOURCE/lugiaevent/Makefile
Normal file
40
SOURCE/lugiaevent/Makefile
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
all: 00-C000-EN.raw verify
|
||||
verify:
|
||||
md5sum --check eonticket.md5
|
||||
|
||||
|
||||
eonticket-%.tx: eonticket.asm
|
||||
python ../scripts/regionalize.py $< $@ $* $*
|
||||
eonticket-%.o: eonticket-%.tx
|
||||
./rgbasm -o $@ $<
|
||||
eonticket-%.gbc: eonticket-%.o
|
||||
./rgblink -o $@ $<
|
||||
eonticket-%.bin: eonticket-%.gbc
|
||||
python ../scripts/stripgbc.py $< $@
|
||||
eonticket-%.mev: eonticket-%.bin
|
||||
python ../scripts/checksum.py $< $@
|
||||
|
||||
prologue-%.tx: prologue.asm
|
||||
python ../scripts/regionalize.py $< $@ $* $*
|
||||
prologue-%.o: prologue-%.tx
|
||||
./rgbasm -o $@ $<
|
||||
prologue-%.gbc: prologue-%.o
|
||||
./rgblink -o $@ $<
|
||||
prologue-%.bin: prologue-%.gbc
|
||||
python ../scripts/stripgbc.py $< $@
|
||||
|
||||
00-C000-%.tx: 00-C000.asm eonticket-%.mev prologue-%.bin
|
||||
python ../scripts/ereadertext.py $< $@ $*
|
||||
00-C000-%.o: 00-C000-%.tx
|
||||
./rgbasm -o $@ $<
|
||||
00-C000-%.gbc: 00-C000-%.o
|
||||
./rgblink -o $@ $<
|
||||
00-C000-%.z80: 00-C000-%.gbc
|
||||
python ../scripts/stripgbc.py $< $@
|
||||
00-C000-%.vpk: 00-C000-%.z80
|
||||
./nevpk -c -i $< -o $@
|
||||
00-C000-%.raw: 00-C000-%.vpk
|
||||
./nedcmake -i $< -o $@ -type 1 -region 1
|
||||
|
||||
clean:
|
||||
rm -f *.tx *.o *.gbc *.z80 *.bin *.mev *.vpk *.raw
|
||||
196
SOURCE/lugiaevent/eonticket.asm
Normal file
196
SOURCE/lugiaevent/eonticket.asm
Normal file
|
|
@ -0,0 +1,196 @@
|
|||
INCLUDE "../macros.asm"
|
||||
INCLUDE "../constants/items.asm"
|
||||
INCLUDE "../constants/scriptcommandslugia.asm"
|
||||
|
||||
Mystery_Event
|
||||
|
||||
db CHECKSUM_CRC
|
||||
dd 0 ; checksum placeholder
|
||||
GBAPTR DataStart
|
||||
GBAPTR DataEnd
|
||||
|
||||
DataStart:
|
||||
db IN_GAME_SCRIPT
|
||||
db 24,66 ; Abandoned Ship
|
||||
db 4 ; item in bottom right room
|
||||
GBAPTR NormanScriptStart
|
||||
GBAPTR NormanScriptEnd
|
||||
|
||||
|
||||
|
||||
db MIX_RECORDS_ITEM
|
||||
db 1 ; ???
|
||||
IF REGION == REGION_DE
|
||||
db 5 ; distribution limit from German debug ROM
|
||||
ELSE
|
||||
db 30 ; distribution limit from English release
|
||||
ENDC
|
||||
dw EON_TICKET
|
||||
|
||||
|
||||
|
||||
db PRELOAD_SCRIPT
|
||||
GBAPTR PreloadScriptStart
|
||||
|
||||
db END_OF_CHUNKS
|
||||
|
||||
|
||||
GoSeeYourFather:
|
||||
Text_DE "Lauf und besuche deinen Vater in der\n"
|
||||
Text_DE "ARENA von BLÜTENBURG CITY.@"
|
||||
|
||||
Text_EN "The ABANDONED SHIP has been rumbling.\n"
|
||||
Text_EN "A powerful Pokémon has moved in.@"
|
||||
|
||||
|
||||
|
||||
NormanScriptStart:
|
||||
setvirtualaddress NormanScriptStart
|
||||
|
||||
checkitemroom TM04, 1
|
||||
|
||||
compare LASTRESULT, 0
|
||||
|
||||
virtualgotoif 1, NoRoomToGive
|
||||
|
||||
|
||||
|
||||
|
||||
setwildbattle $F9, $46, $0061
|
||||
|
||||
copyvarifnotzero $8000, TM04
|
||||
|
||||
copyvarifnotzero $8001, 1
|
||||
|
||||
checkitemtype $0004
|
||||
|
||||
callstd 1
|
||||
|
||||
closeonkeypress
|
||||
|
||||
fadeout $3
|
||||
|
||||
playmoncry $F9, $0
|
||||
|
||||
virtualmsgbox Lugia
|
||||
|
||||
waitmsg
|
||||
|
||||
waitkeypress
|
||||
|
||||
release
|
||||
|
||||
waitmoncry
|
||||
|
||||
setvar $8004, $000F
|
||||
|
||||
setvar $8005, $000F
|
||||
|
||||
setvar $8006, $0FF3
|
||||
|
||||
setvar $8007, $000F
|
||||
|
||||
special $13B
|
||||
|
||||
sound $5E
|
||||
|
||||
waitstate
|
||||
|
||||
pause $28
|
||||
|
||||
special $13B
|
||||
|
||||
|
||||
|
||||
waitstate
|
||||
|
||||
pause $28
|
||||
|
||||
special $13B
|
||||
|
||||
|
||||
|
||||
waitstate
|
||||
|
||||
pause $28
|
||||
|
||||
callasm $2028E57
|
||||
|
||||
callasm $2028E6D
|
||||
|
||||
callasm $2028E85
|
||||
|
||||
special $119
|
||||
|
||||
sound $6B
|
||||
|
||||
waitstate
|
||||
|
||||
pause $28
|
||||
|
||||
special $139
|
||||
|
||||
playsong $0166, $0
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.delete_script
|
||||
killscript
|
||||
|
||||
|
||||
|
||||
EVENTLEGAL2
|
||||
METLOCATION
|
||||
GAMEORIGIN
|
||||
|
||||
|
||||
NoRoomToGive:
|
||||
virtualmsgbox ItemsPocketIsFull
|
||||
waitmsg
|
||||
waitkeypress
|
||||
release
|
||||
end
|
||||
|
||||
|
||||
|
||||
ItemsPocketIsFull:
|
||||
Text_DE "Lauf und besuche deinen Vater in der\n"
|
||||
Text_DE "ARENA von BLÜTENBURG CITY.@"
|
||||
|
||||
Text_EN "The TMs Pocket in your Bag\n"
|
||||
Text_EN "is full.@"
|
||||
|
||||
Lugia:
|
||||
Text_DE "Lauf und besuche deinen Vater in der@"
|
||||
|
||||
Text_EN "LUGIA: Gyaaas!@"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
NormanScriptEnd:
|
||||
|
||||
|
||||
PreloadScriptStart:
|
||||
setvirtualaddress PreloadScriptStart
|
||||
|
||||
clearflag $044D
|
||||
|
||||
virtualloadpointer GoSeeYourFather
|
||||
|
||||
setbyte 2
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
DataEnd:
|
||||
EOF
|
||||
|
||||
1
SOURCE/lugiaevent/eonticket.md5
Normal file
1
SOURCE/lugiaevent/eonticket.md5
Normal file
|
|
@ -0,0 +1 @@
|
|||
901180e44767e19e5dc9d5df881fe123 00-C000-EN.z80
|
||||
BIN
SOURCE/lugiaevent/lugia.bin
Normal file
BIN
SOURCE/lugiaevent/lugia.bin
Normal file
Binary file not shown.
BIN
SOURCE/lugiaevent/lugiapal.bin
Normal file
BIN
SOURCE/lugiaevent/lugiapal.bin
Normal file
Binary file not shown.
BIN
SOURCE/lugiaevent/nedclib.dll
Normal file
BIN
SOURCE/lugiaevent/nedclib.dll
Normal file
Binary file not shown.
BIN
SOURCE/lugiaevent/nedcmake
Normal file
BIN
SOURCE/lugiaevent/nedcmake
Normal file
Binary file not shown.
BIN
SOURCE/lugiaevent/nevpk
Normal file
BIN
SOURCE/lugiaevent/nevpk
Normal file
Binary file not shown.
15
SOURCE/lugiaevent/prologue.asm
Normal file
15
SOURCE/lugiaevent/prologue.asm
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
INCLUDE "../macros.asm"
|
||||
SECTION "prologue", ROM0[$100]
|
||||
|
||||
db "GameFreak inc."
|
||||
db 0,0,0,0,0,0
|
||||
dd 0
|
||||
Text "e reader" ; no string terminator
|
||||
db 0,0,0,0,$01,$55
|
||||
db 0,0,0,0
|
||||
db REGION
|
||||
db 0
|
||||
db "GameFreak inc."
|
||||
db 0,0
|
||||
|
||||
EOF
|
||||
BIN
SOURCE/lugiaevent/rgbasm
Normal file
BIN
SOURCE/lugiaevent/rgbasm
Normal file
Binary file not shown.
BIN
SOURCE/lugiaevent/rgblink
Normal file
BIN
SOURCE/lugiaevent/rgblink
Normal file
Binary file not shown.
318
SOURCE/macros.asm
Normal file
318
SOURCE/macros.asm
Normal file
|
|
@ -0,0 +1,318 @@
|
|||
; some Z80 opcodes aren’t supported by Game Boy,
|
||||
; but are used in e-Reader programs
|
||||
|
||||
; ld [\1], hl
|
||||
LD_IND_HL: MACRO
|
||||
db $22, (\1 & $FF), (\1 >> 8)
|
||||
ENDM
|
||||
; ld [\1], a
|
||||
LD_IND_A: MACRO
|
||||
db $32, (\1 & $FF), (\1 >> 8)
|
||||
ENDM
|
||||
|
||||
; ld hl, [\1]
|
||||
LD_HL_IND: MACRO
|
||||
db $2A, (\1 & $FF), (\1 >> 8)
|
||||
ENDM
|
||||
; ld a, [\1]
|
||||
LD_A_IND: MACRO
|
||||
db $3A
|
||||
dw \1
|
||||
ENDM
|
||||
|
||||
waita: MACRO
|
||||
ld a, \1
|
||||
db $76
|
||||
ENDM
|
||||
; ld [hl], a
|
||||
LD_IND_HL_A: MACRO
|
||||
db $77
|
||||
ENDM
|
||||
|
||||
; ld a, [hl]
|
||||
LD_IND_A_HL: MACRO
|
||||
db $7E
|
||||
ENDM
|
||||
|
||||
; ld c, [hl]
|
||||
LD_IND_C_HL: MACRO
|
||||
db $4E
|
||||
ENDM
|
||||
|
||||
; ld b, [hl]
|
||||
LD_IND_B_HL: MACRO
|
||||
db $46
|
||||
ENDM
|
||||
|
||||
; ld l, [hl]
|
||||
LD_IND_L_HL: MACRO
|
||||
db $6E
|
||||
ENDM
|
||||
|
||||
; ld e, [hl]
|
||||
LD_IND_E_HL: MACRO
|
||||
db $5E
|
||||
ENDM
|
||||
|
||||
; ld d, [hl]
|
||||
LD_IND_D_HL: MACRO
|
||||
db $56
|
||||
ENDM
|
||||
|
||||
; ld [hl], c
|
||||
LD_IND_HL_C: MACRO
|
||||
db $71
|
||||
ENDM
|
||||
|
||||
; ld [hl], b
|
||||
LD_IND_HL_B: MACRO
|
||||
db $70
|
||||
ENDM
|
||||
|
||||
; ld a, [de]
|
||||
LD_IND_A_DE: MACRO
|
||||
db $1A
|
||||
ENDM
|
||||
|
||||
; add a, [hl]
|
||||
ADD_A_HL_IND: MACRO
|
||||
db $86
|
||||
ENDM
|
||||
|
||||
EX_DE_HL: MACRO
|
||||
db $EB
|
||||
ENDM
|
||||
|
||||
wait: MACRO
|
||||
db $D3, \1
|
||||
ENDM
|
||||
|
||||
API: MACRO
|
||||
db ($C7 + (\1 & $100) >> 5), (\1 & $FF) ; $C7 for API $0xx, $CF for API $1xx
|
||||
ENDM
|
||||
|
||||
|
||||
|
||||
dd: MACRO
|
||||
dw (\1) & $FFFF
|
||||
dw (\1) >> 16
|
||||
ENDM
|
||||
|
||||
RGB: MACRO
|
||||
dw (\1) | ((\2) << 5) | ((\3) << 10)
|
||||
ENDM
|
||||
|
||||
GBAPTR: MACRO
|
||||
dd $02000000 + \1 - ScriptBaseAddress
|
||||
ENDM
|
||||
|
||||
Insert_Prologue: MACRO
|
||||
db "GameFreak inc."
|
||||
db 0,0,0,0,0,0
|
||||
dd \1
|
||||
db \2
|
||||
REPT 8 - STRLEN(\2)
|
||||
db 0
|
||||
ENDR
|
||||
db 0,0,0,0,$01,$55
|
||||
db 0,0,0,0
|
||||
db \3
|
||||
db 0
|
||||
db "GameFreak inc."
|
||||
db 0,0
|
||||
ENDM
|
||||
|
||||
Mystery_Event: MACRO
|
||||
ScriptBaseAddress EQU $100
|
||||
SECTION "mysteryevent", ROM0[$100]
|
||||
db $01
|
||||
dd $02000000
|
||||
db REGION,0,REGION,0,0,0,$04,0,$80,$01,0,0
|
||||
ENDM
|
||||
|
||||
REGION_JP EQU $01
|
||||
REGION_EN EQU $02
|
||||
REGION_FR EQU $03 ; ?
|
||||
REGION_IT EQU $04 ; ?
|
||||
REGION_DE EQU $05 ; !
|
||||
REGION_ES EQU $07 ; ¿?
|
||||
|
||||
; types of card data
|
||||
END_OF_CHUNKS EQU $02
|
||||
LOADING_MESSAGE EQU $03
|
||||
SET_LOAD_STATUS EQU $04
|
||||
PRELOAD_SCRIPT EQU $05
|
||||
IN_GAME_SCRIPT EQU $06
|
||||
CUSTOM_BERRY EQU $07
|
||||
AWARD_RIBBON EQU $08
|
||||
NATIONAL_POKEDEX EQU $09
|
||||
ADD_RARE_WORD EQU $0A
|
||||
MIX_RECORDS_ITEM EQU $0B
|
||||
GIVE_POKEMON EQU $0C
|
||||
BATTLE_TRAINER EQU $0D
|
||||
CLOCK_ADJUSTMENT EQU $0E
|
||||
CHECKSUM_BYTES EQU $0F ; don’t use this
|
||||
CHECKSUM_CRC EQU $10 ; use this instead
|
||||
DOME_TRAINER EQU $11 ; Battle Dome trainer
|
||||
|
||||
; an FF byte followed by 00s will flag the end of the program so that it can
|
||||
; be extracted automatically from the Game Boy ROM that rgbds tries to build
|
||||
EOF: MACRO
|
||||
db $FF
|
||||
ENDM
|
||||
|
||||
|
||||
; names for some API functions based on Martin Korth’s GBATEK
|
||||
; http://problemkaputt.de/gbatek.htm
|
||||
FadeIn: MACRO
|
||||
ld a, \1
|
||||
API $000
|
||||
ENDM
|
||||
SetBackgroundAutoScroll: MACRO
|
||||
ld bc, \1
|
||||
ld de, \2
|
||||
xor a
|
||||
API $012
|
||||
ENDM
|
||||
SetBackgroundMode: MACRO
|
||||
ld e, \1
|
||||
push de
|
||||
xor a
|
||||
API $019
|
||||
ENDM
|
||||
API_02C: MACRO
|
||||
ld hl, $0000
|
||||
push hl
|
||||
ld bc, \1
|
||||
ld de, \2
|
||||
IF \3 == 0
|
||||
xor a ; save a byte
|
||||
ELSE
|
||||
ld a, \3
|
||||
ENDC
|
||||
API $02C
|
||||
ENDM
|
||||
LoadCustomBackground: MACRO
|
||||
ld de, \1
|
||||
IF \2 == 0
|
||||
xor a ; save a byte
|
||||
ELSE
|
||||
ld a, \2
|
||||
ENDC
|
||||
API $02D
|
||||
ENDM
|
||||
SetSpritePos: MACRO
|
||||
ld bc, \3
|
||||
ld de, \2
|
||||
LD_HL_IND \1
|
||||
API $032
|
||||
ENDM
|
||||
SpriteShow: MACRO
|
||||
LD_HL_IND \1
|
||||
API $046
|
||||
ENDM
|
||||
SpriteHide: MACRO
|
||||
LD_HL_IND \1
|
||||
API $047
|
||||
ENDM
|
||||
SpriteMirrorToggle: MACRO
|
||||
ld e, \1
|
||||
LD_HL_IND \2
|
||||
API $048
|
||||
ENDM
|
||||
CreateCustomSprite: MACRO
|
||||
ld e, \2
|
||||
ld hl, \3
|
||||
API $04D
|
||||
LD_IND_HL \1
|
||||
ENDM
|
||||
SpriteAutoScaleUntilSize: MACRO
|
||||
ld c, \2
|
||||
ld de, \3
|
||||
LD_HL_IND \1
|
||||
API $05B
|
||||
ENDM
|
||||
SetBackgroundPalette: MACRO
|
||||
ld c, \1
|
||||
ld de, \2
|
||||
ld hl, \3
|
||||
API $07E
|
||||
ENDM
|
||||
API_084: MACRO
|
||||
ld l, \4
|
||||
push hl
|
||||
ld bc, \3
|
||||
ld de, \2
|
||||
LD_HL_IND \1
|
||||
API $084
|
||||
ENDM
|
||||
CreateRegion: MACRO
|
||||
ld bc, (\2 << 8 + \3)
|
||||
ld de, (\4 << 8 + \5)
|
||||
ld hl, (\6 << 8 + \7)
|
||||
API $090
|
||||
LD_IND_A \1
|
||||
ENDM
|
||||
SetRegionColor: MACRO
|
||||
ld e, \2
|
||||
LD_A_IND \1
|
||||
API $091
|
||||
ENDM
|
||||
CLEAR_REGION: MACRO
|
||||
LD_A_IND \1
|
||||
API $092
|
||||
ENDM
|
||||
SetTextColor: MACRO
|
||||
ld de, (\2 << 8 + \3)
|
||||
LD_A_IND \1
|
||||
API $098
|
||||
ENDM
|
||||
DrawText: MACRO
|
||||
CLEAR_REGION \1
|
||||
ld bc, \2
|
||||
ld de, (\3 << 8 + \4)
|
||||
LD_A_IND \1
|
||||
API $099
|
||||
ENDM
|
||||
SetTextSize: MACRO
|
||||
API $09A
|
||||
ENDM
|
||||
API_09B: MACRO
|
||||
ld de, \2
|
||||
LD_A_IND \1
|
||||
API $09B
|
||||
ENDM
|
||||
GetTextWidth: MACRO
|
||||
ld de, \2
|
||||
LD_A_IND \1
|
||||
API $0C0
|
||||
ENDM
|
||||
API_0C7: MACRO
|
||||
ld hl, \1
|
||||
API $0C7
|
||||
ENDM
|
||||
EXIT: MACRO
|
||||
API $100
|
||||
ENDM
|
||||
API_106: MACRO
|
||||
ld de, \1
|
||||
ld hl, \2
|
||||
API $106
|
||||
ENDM
|
||||
SOUND_PAUSE: MACRO
|
||||
API $116
|
||||
ENDM
|
||||
IS_SOUND_PLAYING: MACRO
|
||||
API $08D
|
||||
ld b, $00
|
||||
ld e, $01
|
||||
ld hl, $0006
|
||||
API $119
|
||||
ld a, \1
|
||||
EXIT
|
||||
ENDM
|
||||
API_121: MACRO
|
||||
ld de, $0000
|
||||
ld hl, $0000
|
||||
API $121
|
||||
ENDM
|
||||
174
SOURCE/mewevent/00-C000.asm
Normal file
174
SOURCE/mewevent/00-C000.asm
Normal file
|
|
@ -0,0 +1,174 @@
|
|||
INCLUDE "../macros.asm"
|
||||
SECTION "eonticket",ROM0[$100]
|
||||
jp Start
|
||||
db $00
|
||||
|
||||
TicketSprite: ; 104
|
||||
INCBIN "mew.4bpp"
|
||||
TicketPalette: ; 1604
|
||||
INCBIN "mew.gbapal"
|
||||
|
||||
Prologue:
|
||||
INCBIN "prologue-{REGION_NAME}.bin"
|
||||
|
||||
DataPacket: ; 164a
|
||||
INCBIN "eonticket-{REGION_NAME}.mev"
|
||||
db 0,0,0 ; padding
|
||||
|
||||
INCLUDE "../common/mem_struct.asm"
|
||||
|
||||
SpriteData:
|
||||
dw TicketSprite,TicketPalette
|
||||
db $8,$8,$01,$01,$01,$01,$01 ; width 15, height 8
|
||||
|
||||
Instructions1: ; 1921
|
||||
db "Link e-Reader to Pokémon Ruby or \n"
|
||||
db "Sapphire and select MYSTERY EVENTS\n"
|
||||
db "on the game's main menu.\n"
|
||||
db "Press the B Button to cancel.\0"
|
||||
|
||||
Instructions2: ; 199d
|
||||
db "Press the A Button on the Game Boy\n"
|
||||
db "Advance containing Pokémon Ruby or\n"
|
||||
db "Sapphire to begin sending the\n"
|
||||
db "MEW EVENT.\0"
|
||||
|
||||
DeliveryInProcess: ; 1a0d
|
||||
db "MEW EVENT delivery in Progress...\0"
|
||||
|
||||
TicketDelivered: ; 1a2f
|
||||
db "MEW EVENT delivered!\n"
|
||||
db "\n"
|
||||
db "Press the A Button to resend.\n"
|
||||
db "Press the B Button to cancel.\0"
|
||||
|
||||
; this function is subtly different than the one
|
||||
; on the Battle e cards, for no apparent reason
|
||||
TransferData:
|
||||
LD_IND_HL SomeVar1
|
||||
push de
|
||||
ld hl, $bbbb
|
||||
LD_IND_HL Space_1
|
||||
EX_DE_HL
|
||||
LD_IND_HL Space_2
|
||||
API_0C7 Space_1
|
||||
|
||||
wait $01
|
||||
pop hl
|
||||
inc hl
|
||||
ld b, $01
|
||||
call WordShiftRight
|
||||
|
||||
LD_IND_HL SomeVar2
|
||||
.asm_1aa1
|
||||
LD_HL_IND SomeVar2
|
||||
ld a, l
|
||||
or h
|
||||
ret z
|
||||
|
||||
ld hl, $8888
|
||||
LD_IND_HL Space_1
|
||||
ld e, $01
|
||||
|
||||
.asm_1aaf
|
||||
ld a, e
|
||||
cp $08
|
||||
jr nc, .asm_1ad9
|
||||
|
||||
push de
|
||||
LD_HL_IND SomeVar1
|
||||
ld c, [hl]
|
||||
inc hl
|
||||
ld b, [hl]
|
||||
inc hl
|
||||
LD_IND_HL SomeVar1
|
||||
ld l, e
|
||||
ld h, $00
|
||||
add hl, hl
|
||||
ld de, Space_1
|
||||
add hl, de
|
||||
ld [hl], c
|
||||
inc hl
|
||||
ld [hl], b
|
||||
pop de
|
||||
LD_HL_IND SomeVar2
|
||||
dec hl
|
||||
LD_IND_HL SomeVar2
|
||||
ld a, l
|
||||
or h
|
||||
jr z, .asm_1ad9
|
||||
|
||||
inc e
|
||||
jr .asm_1aaf
|
||||
|
||||
.asm_1ad9
|
||||
API_0C7 Space_1
|
||||
wait $01
|
||||
jr .asm_1aa1
|
||||
|
||||
Start: ; 1ae2
|
||||
API_121
|
||||
|
||||
CreateCustomSprite SpriteHandlePtr, $80, SpriteData
|
||||
SetSpritePos SpriteHandlePtr, 120, 64
|
||||
SpriteHide SpriteHandlePtr
|
||||
|
||||
CreateRegion RegionHandlePtr, 30, 6, 0, 14, 0, 4
|
||||
|
||||
ld h, a
|
||||
ld l, $00
|
||||
SetTextSize
|
||||
|
||||
API_09B RegionHandlePtr, $0102
|
||||
SetTextColor RegionHandlePtr, 2, 0
|
||||
SetRegionColor RegionHandlePtr, 0
|
||||
SetBackgroundPalette 16, $0040, TicketPalette
|
||||
|
||||
FadeIn 16
|
||||
wait 16
|
||||
|
||||
API $0C6
|
||||
|
||||
DrawText RegionHandlePtr, Instructions1, 8, 4
|
||||
API $08D
|
||||
|
||||
INCLUDE "../common/wait_for_link.asm"
|
||||
|
||||
SpriteShow SpriteHandlePtr
|
||||
|
||||
DrawText RegionHandlePtr, Instructions2, 8, 4
|
||||
API $08D
|
||||
|
||||
ld a, b
|
||||
nop
|
||||
|
||||
UNKNOWN_VALUE EQU $0078
|
||||
INCLUDE "../common/wait_for_ready.asm"
|
||||
|
||||
DrawText RegionHandlePtr, DeliveryInProcess, 8, 4
|
||||
|
||||
DATA_TRANSFER_LENGTH EQU 6144
|
||||
INCLUDE "../common/transfer_data.asm"
|
||||
ld hl, $5fff
|
||||
LD_IND_HL Space_1
|
||||
API_0C7 Space_1
|
||||
|
||||
wait $80
|
||||
|
||||
SpriteHide SpriteHandlePtr
|
||||
|
||||
DrawText RegionHandlePtr, TicketDelivered, 8, 4
|
||||
|
||||
API $08D
|
||||
ld c, a
|
||||
nop
|
||||
|
||||
INCLUDE "../common/wrap_up.asm"
|
||||
|
||||
INCLUDE "../common/word_shift_right.asm"
|
||||
|
||||
SomeVar1: ; 1CA2
|
||||
db $FF,0 ; mark EOF
|
||||
RegionHandlePtr: db 0 ; 1CA4
|
||||
SpriteHandlePtr: db 0,0 ; 1CA5
|
||||
SomeVar2: db 0,0 ; 1CA7
|
||||
BIN
SOURCE/mewevent/00-C000.raw
Normal file
BIN
SOURCE/mewevent/00-C000.raw
Normal file
Binary file not shown.
40
SOURCE/mewevent/Makefile
Normal file
40
SOURCE/mewevent/Makefile
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
all: 00-C000-EN.raw verify
|
||||
verify:
|
||||
md5sum --check eonticket.md5
|
||||
|
||||
|
||||
eonticket-%.tx: eonticket.asm
|
||||
python ../scripts/regionalize.py $< $@ $* $*
|
||||
eonticket-%.o: eonticket-%.tx
|
||||
./rgbasm -o $@ $<
|
||||
eonticket-%.gbc: eonticket-%.o
|
||||
./rgblink -o $@ $<
|
||||
eonticket-%.bin: eonticket-%.gbc
|
||||
python ../scripts/stripgbc.py $< $@
|
||||
eonticket-%.mev: eonticket-%.bin
|
||||
python ../scripts/checksum.py $< $@
|
||||
|
||||
prologue-%.tx: prologue.asm
|
||||
python ../scripts/regionalize.py $< $@ $* $*
|
||||
prologue-%.o: prologue-%.tx
|
||||
./rgbasm -o $@ $<
|
||||
prologue-%.gbc: prologue-%.o
|
||||
./rgblink -o $@ $<
|
||||
prologue-%.bin: prologue-%.gbc
|
||||
python ../scripts/stripgbc.py $< $@
|
||||
|
||||
00-C000-%.tx: 00-C000.asm eonticket-%.mev prologue-%.bin
|
||||
python ../scripts/ereadertext.py $< $@ $*
|
||||
00-C000-%.o: 00-C000-%.tx
|
||||
./rgbasm -o $@ $<
|
||||
00-C000-%.gbc: 00-C000-%.o
|
||||
./rgblink -o $@ $<
|
||||
00-C000-%.z80: 00-C000-%.gbc
|
||||
python ../scripts/stripgbc.py $< $@
|
||||
00-C000-%.vpk: 00-C000-%.z80
|
||||
./nevpk -c -i $< -o $@
|
||||
00-C000-%.raw: 00-C000-%.vpk
|
||||
./nedcmake -i $< -o $@ -type 1 -region 1
|
||||
|
||||
clean:
|
||||
rm -f *.tx *.o *.gbc *.z80 *.bin *.mev *.vpk *.raw
|
||||
206
SOURCE/mewevent/eonticket.asm
Normal file
206
SOURCE/mewevent/eonticket.asm
Normal file
|
|
@ -0,0 +1,206 @@
|
|||
INCLUDE "../macros.asm"
|
||||
INCLUDE "../constants/items.asm"
|
||||
INCLUDE "../constants/scriptcommandsmew.asm"
|
||||
|
||||
Mystery_Event
|
||||
|
||||
db CHECKSUM_CRC
|
||||
dd 0 ; checksum placeholder
|
||||
GBAPTR DataStart
|
||||
GBAPTR DataEnd
|
||||
|
||||
DataStart:
|
||||
db IN_GAME_SCRIPT
|
||||
db 0,35 ; Route 119
|
||||
db 41 ; item
|
||||
GBAPTR NormanScriptStart
|
||||
GBAPTR NormanScriptEnd
|
||||
|
||||
|
||||
|
||||
db MIX_RECORDS_ITEM
|
||||
db 1 ; ???
|
||||
IF REGION == REGION_DE
|
||||
db 5 ; distribution limit from German debug ROM
|
||||
ELSE
|
||||
db 30 ; distribution limit from English release
|
||||
ENDC
|
||||
dw EON_TICKET
|
||||
|
||||
|
||||
|
||||
db PRELOAD_SCRIPT
|
||||
GBAPTR PreloadScriptStart
|
||||
|
||||
db END_OF_CHUNKS
|
||||
|
||||
|
||||
GoSeeYourFather:
|
||||
Text_DE "Lauf und besuche deinen Vater in der\n"
|
||||
Text_DE "ARENA von BLÜTENBURG CITY.@"
|
||||
|
||||
Text_EN "A mirage was spotted on route 120.\n"
|
||||
Text_EN "There are reports of an elusive Pokémon.@"
|
||||
|
||||
|
||||
|
||||
NormanScriptStart:
|
||||
setvirtualaddress NormanScriptStart
|
||||
|
||||
checkitemroom LUM_BERRY, 1
|
||||
|
||||
compare LASTRESULT, 0
|
||||
|
||||
virtualgotoif 1, NoRoomToGive
|
||||
|
||||
|
||||
|
||||
|
||||
setwildbattle $97, $1E, $00AE
|
||||
|
||||
copyvarifnotzero $8000, LUM_BERRY
|
||||
|
||||
copyvarifnotzero $8001, 1
|
||||
|
||||
checkitemtype $0005
|
||||
|
||||
callstd 1
|
||||
|
||||
closeonkeypress
|
||||
|
||||
fadeout $3
|
||||
|
||||
virtualmsgbox Mirage
|
||||
|
||||
waitmsg
|
||||
|
||||
waitkeypress
|
||||
|
||||
release
|
||||
|
||||
setvar $8004, $000F
|
||||
|
||||
setvar $8005, $000F
|
||||
|
||||
setvar $8006, $0FF3
|
||||
|
||||
setvar $8007, $000F
|
||||
|
||||
special $13D
|
||||
|
||||
sound $13
|
||||
|
||||
waitstate
|
||||
|
||||
pause $28
|
||||
|
||||
special $13D
|
||||
|
||||
sound $13
|
||||
|
||||
waitstate
|
||||
|
||||
pause $28
|
||||
|
||||
callasm $2028E5D
|
||||
|
||||
callasm $2028E75
|
||||
|
||||
callasm $2028E8D
|
||||
|
||||
callasm $2028E8D ; change to 2028EA1 for JP mew
|
||||
|
||||
virtualmsgbox Pokemon
|
||||
|
||||
waitmsg
|
||||
|
||||
waitkeypress
|
||||
|
||||
release
|
||||
|
||||
virtualmsgbox Mew
|
||||
|
||||
playmoncry $97, $0
|
||||
|
||||
waitmoncry
|
||||
|
||||
waitmsg
|
||||
|
||||
waitkeypress
|
||||
|
||||
release
|
||||
|
||||
special $138
|
||||
|
||||
playsong $0166, $0
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
.delete_script
|
||||
killscript
|
||||
|
||||
|
||||
|
||||
EVENTLEGAL2
|
||||
METLOCATION
|
||||
GAMEORIGIN
|
||||
GAMELANG
|
||||
|
||||
NoRoomToGive:
|
||||
virtualmsgbox ItemsPocketIsFull
|
||||
waitmsg
|
||||
waitkeypress
|
||||
release
|
||||
end
|
||||
|
||||
|
||||
|
||||
ItemsPocketIsFull:
|
||||
Text_DE "Lauf und besuche deinen Vater in der\n"
|
||||
Text_DE "ARENA von BLÜTENBURG CITY.@"
|
||||
|
||||
Text_EN "The Berry Pocket in your Bag\n"
|
||||
Text_EN "is full.@"
|
||||
|
||||
Mirage:
|
||||
Text_DE "Lauf und besuche deinen Vater in der@"
|
||||
|
||||
Text_EN "What’s that light? A mirage?@"
|
||||
|
||||
Pokemon:
|
||||
Text_DE "Lauf und besuche deinen Vater in der@"
|
||||
|
||||
Text_EN "No, it’s a Pokémon!@"
|
||||
|
||||
Mew:
|
||||
Text_DE "Lauf und besuche deinen Vater in der@"
|
||||
|
||||
Text_EN "Mew: Mew!@"
|
||||
|
||||
|
||||
|
||||
|
||||
NormanScriptEnd:
|
||||
|
||||
|
||||
PreloadScriptStart:
|
||||
setvirtualaddress PreloadScriptStart
|
||||
|
||||
clearflag $03DB
|
||||
|
||||
virtualloadpointer GoSeeYourFather
|
||||
|
||||
setbyte 2
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
DataEnd:
|
||||
EOF
|
||||
|
||||
BIN
SOURCE/mewevent/mew.4bpp
Normal file
BIN
SOURCE/mewevent/mew.4bpp
Normal file
Binary file not shown.
1
SOURCE/mewevent/mew.gbapal
Normal file
1
SOURCE/mewevent/mew.gbapal
Normal file
|
|
@ -0,0 +1 @@
|
|||
{o˙ZkcQIj|||||^sg>:)–Ą
|
||||
BIN
SOURCE/mewevent/nedclib.dll
Normal file
BIN
SOURCE/mewevent/nedclib.dll
Normal file
Binary file not shown.
BIN
SOURCE/mewevent/nedcmake
Normal file
BIN
SOURCE/mewevent/nedcmake
Normal file
Binary file not shown.
BIN
SOURCE/mewevent/nevpk
Normal file
BIN
SOURCE/mewevent/nevpk
Normal file
Binary file not shown.
15
SOURCE/mewevent/prologue.asm
Normal file
15
SOURCE/mewevent/prologue.asm
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
INCLUDE "../macros.asm"
|
||||
SECTION "prologue", ROM0[$100]
|
||||
|
||||
db "GameFreak inc."
|
||||
db 0,0,0,0,0,0
|
||||
dd 0
|
||||
Text "e reader" ; no string terminator
|
||||
db 0,0,0,0,$01,$55
|
||||
db 0,0,0,0
|
||||
db REGION
|
||||
db 0
|
||||
db "GameFreak inc."
|
||||
db 0,0
|
||||
|
||||
EOF
|
||||
BIN
SOURCE/mewevent/rgbasm
Normal file
BIN
SOURCE/mewevent/rgbasm
Normal file
Binary file not shown.
BIN
SOURCE/mewevent/rgblink
Normal file
BIN
SOURCE/mewevent/rgblink
Normal file
Binary file not shown.
27
SOURCE/scripts/asmquote.py
Normal file
27
SOURCE/scripts/asmquote.py
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
asmProblemBytes = ['\x00', '\x09', '\x0A', '\x22']
|
||||
def asmQuote(t):
|
||||
result = ""
|
||||
quoted = False
|
||||
if t[0] in asmProblemBytes:
|
||||
result = '{0}'.format(ord(t[0]))
|
||||
else:
|
||||
result = '"' + t[0]
|
||||
quoted = True
|
||||
t = t[1:]
|
||||
|
||||
while len(t):
|
||||
if quoted and t[0] in asmProblemBytes:
|
||||
result += '",{0}'.format(ord(t[0]))
|
||||
quoted = False
|
||||
elif quoted:
|
||||
result += t[0]
|
||||
elif t[0] in asmProblemBytes:
|
||||
result += ',{0}'.format(ord(t[0]))
|
||||
quoted = False
|
||||
else:
|
||||
result += ',"' + t[0]
|
||||
quoted = True
|
||||
t = t[1:]
|
||||
if quoted:
|
||||
result += '"'
|
||||
return result
|
||||
BIN
SOURCE/scripts/asmquote.pyc
Normal file
BIN
SOURCE/scripts/asmquote.pyc
Normal file
Binary file not shown.
89
SOURCE/scripts/checksum.py
Normal file
89
SOURCE/scripts/checksum.py
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
import struct
|
||||
import sys
|
||||
|
||||
chunk_lengths = [0,0,0,6,2,5,12,5,3,1,2,5,5,5,1,13,13]
|
||||
|
||||
bytewises = []
|
||||
bytewise_results = []
|
||||
wordwises = []
|
||||
wordwise_results = []
|
||||
crcs = []
|
||||
crc_results = []
|
||||
|
||||
data = ""
|
||||
with open(sys.argv[1], 'rb') as f:
|
||||
data = f.read()
|
||||
f.closed
|
||||
|
||||
base_address = struct.unpack('<I', data[1:5])[0]
|
||||
i = 0x11 # first chunk location
|
||||
while i < len(data):
|
||||
chunk_type = ord(data[i])
|
||||
if chunk_type == 0x02: # END_OF_CHUNKS
|
||||
break
|
||||
elif chunk_type == 0x07: # CUSTOM_BERRY
|
||||
start_address = struct.unpack('<I', data[i+1:i+5])[0] - base_address
|
||||
bytewises.append([start_address + 0x52C, start_address, start_address + 0x52C])
|
||||
elif chunk_type == 0x0D: # BATTLE_TRAINER
|
||||
start_address = struct.unpack('<I', data[i+1:i+5])[0] - base_address
|
||||
wordwises.append([start_address + 0xB8, start_address, start_address + 0xB8])
|
||||
elif chunk_type == 0x0F: # CHECKSUM_BYTES
|
||||
start_address = struct.unpack('<I', data[i+5:i+9])[0] - base_address
|
||||
end_address = struct.unpack('<I', data[i+9:i+13])[0] - base_address
|
||||
bytewise.append([i + 1, start_address, end_address])
|
||||
elif chunk_type == 0x10: # CHECKSUM_CRC
|
||||
start_address = struct.unpack('<I', data[i+5:i+9])[0] - base_address
|
||||
end_address = struct.unpack('<I', data[i+9:i+13])[0] - base_address
|
||||
crcs.append([i + 1, start_address, end_address])
|
||||
elif chunk_type < 0x02 or chunk_type > 0x10:
|
||||
print "Unknown chunk {0:X}".format(chunk_type)
|
||||
raise TypeError
|
||||
i += chunk_lengths[chunk_type]
|
||||
|
||||
|
||||
# calculate and insert all wordwise checksums
|
||||
for wordwise in wordwises:
|
||||
sum = 0
|
||||
for i in range(wordwise[1], wordwise[2], 4):
|
||||
sum = (sum + struct.unpack('<I', data[i:i+4])[0]) & 0xFFFFFFFF
|
||||
wordwise_results.append(sum)
|
||||
i = 0
|
||||
for wordwise in wordwises:
|
||||
data = data[0:wordwise[0]] + struct.pack('<I', wordwise_results[i]) + data[(wordwise[0] + 4):]
|
||||
i += 1
|
||||
|
||||
|
||||
# calculate and insert all bytewise checksums
|
||||
for bytewise in bytewises:
|
||||
sum = 0
|
||||
for i in range(bytewise[1], bytewise[2]):
|
||||
sum = (sum + ord(data[i])) & 0xFFFFFFFF
|
||||
bytewise_results.append(sum)
|
||||
i = 0
|
||||
for bytewise in bytewises:
|
||||
data = data[0:bytewise[0]] + struct.pack('<I', bytewise_results[i]) + data[(bytewise[0] + 4):]
|
||||
i += 1
|
||||
|
||||
|
||||
# calculate and insert all CRC checksums
|
||||
for crc in crcs:
|
||||
sum = 0x1121
|
||||
for i in range(crc[1], crc[2]):
|
||||
sum ^= ord(data[i])
|
||||
for j in range(8):
|
||||
if(sum & 1):
|
||||
sum = (sum >> 1) ^ 0x8408
|
||||
else:
|
||||
sum >>= 1
|
||||
sum = ~sum & 0xFFFF
|
||||
crc_results.append(sum)
|
||||
|
||||
i = 0
|
||||
for crc in crcs:
|
||||
data = data[0:crc[0]] + struct.pack('<I', crc_results[i]) + data[(crc[0] + 4):]
|
||||
i += 1
|
||||
|
||||
|
||||
# write the updated file
|
||||
out = open(sys.argv[2], 'w')
|
||||
out.write(data)
|
||||
105
SOURCE/scripts/checksum_regi.py
Normal file
105
SOURCE/scripts/checksum_regi.py
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
import struct
|
||||
import sys
|
||||
|
||||
chunk_lengths = [0,0,0,6,2,5,12,5,3,1,2,5,5,5,1,13,13,5]
|
||||
|
||||
bytewises = []
|
||||
bytewise_results = []
|
||||
wordwises = []
|
||||
wordwise_results = []
|
||||
crcs = []
|
||||
crc_results = []
|
||||
|
||||
data = ""
|
||||
with open(sys.argv[1], 'rb') as f:
|
||||
data = f.read()
|
||||
f.closed
|
||||
|
||||
base_address = struct.unpack('<I', data[1:5])[0]
|
||||
|
||||
|
||||
def find_all(a_str, sub):
|
||||
start = 0
|
||||
while True:
|
||||
start = a_str.find(sub, start)
|
||||
if start == -1: return
|
||||
yield start
|
||||
start += len(sub) # use start += 1 to find overlapping matches
|
||||
|
||||
pos=list(find_all(data,b'\x01\x00\x00\x00\x02\x02\x00\x02\x00\x00\x00\x04\x00\x80\x01\x00\x00\x10'))
|
||||
|
||||
for i in pos:
|
||||
i=i+17
|
||||
chunk_type = ord(data[i])
|
||||
if chunk_type == 0x02: # END_OF_CHUNKS
|
||||
break
|
||||
elif chunk_type == 0x07: # CUSTOM_BERRY
|
||||
start_address = struct.unpack('<I', data[i+1:i+5])[0] - base_address
|
||||
bytewises.append([start_address + 0x52C, start_address, start_address + 0x52C])
|
||||
elif chunk_type == 0x0D: # BATTLE_TRAINER
|
||||
start_address = struct.unpack('<I', data[i+1:i+5])[0] - base_address
|
||||
wordwises.append([start_address + 0x13C, start_address, start_address + 0x13C])
|
||||
elif chunk_type == 0x0F: # CHECKSUM_BYTES
|
||||
start_address = struct.unpack('<I', data[i+5:i+9])[0] - base_address
|
||||
end_address = struct.unpack('<I', data[i+9:i+13])[0] - base_address
|
||||
bytewise.append([i + 1, start_address, end_address])
|
||||
elif chunk_type == 0x10: # CHECKSUM_CRC
|
||||
start_address = struct.unpack('<I', data[i+5:i+9])[0] - base_address +i-0x11
|
||||
end_address = struct.unpack('<I', data[i+9:i+13])[0] - base_address +i-0x11
|
||||
crcs.append([i + 1, start_address, end_address])
|
||||
elif chunk_type == 0x11: # DOME_TRAINER
|
||||
start_address = struct.unpack('<I', data[i+1:i+5])[0] - base_address
|
||||
wordwises.append([start_address + 0x13C, start_address, start_address + 0x13C])
|
||||
elif chunk_type < 0x02 or chunk_type > 0x11:
|
||||
print "Unknown chunk {0:X}".format(chunk_type)
|
||||
raise TypeError
|
||||
i += chunk_lengths[chunk_type]
|
||||
|
||||
|
||||
|
||||
# calculate and insert all wordwise checksums
|
||||
for wordwise in wordwises:
|
||||
sum = 0
|
||||
for i in range(wordwise[1], wordwise[2], 4):
|
||||
sum = (sum + struct.unpack('<I', data[i:i+4])[0]) & 0xFFFFFFFF
|
||||
wordwise_results.append(sum)
|
||||
i = 0
|
||||
for wordwise in wordwises:
|
||||
data = data[0:wordwise[0]] + struct.pack('<I', wordwise_results[i]) + data[(wordwise[0] + 4):]
|
||||
i += 1
|
||||
|
||||
|
||||
# calculate and insert all bytewise checksums
|
||||
for bytewise in bytewises:
|
||||
sum = 0
|
||||
for i in range(bytewise[1], bytewise[2]):
|
||||
sum = (sum + ord(data[i])) & 0xFFFFFFFF
|
||||
bytewise_results.append(sum)
|
||||
i = 0
|
||||
for bytewise in bytewises:
|
||||
data = data[0:bytewise[0]] + struct.pack('<I', bytewise_results[i]) + data[(bytewise[0] + 4):]
|
||||
i += 1
|
||||
|
||||
|
||||
# calculate and insert all CRC checksums
|
||||
for crc in crcs:
|
||||
sum = 0x1121
|
||||
for i in range(crc[1], crc[2]):
|
||||
sum ^= ord(data[i])
|
||||
for j in range(8):
|
||||
if(sum & 1):
|
||||
sum = (sum >> 1) ^ 0x8408
|
||||
else:
|
||||
sum >>= 1
|
||||
sum = ~sum & 0xFFFF
|
||||
crc_results.append(sum)
|
||||
|
||||
i = 0
|
||||
for crc in crcs:
|
||||
data = data[0:crc[0]] + struct.pack('<I', crc_results[i]) + data[(crc[0] + 4):]
|
||||
i += 1
|
||||
|
||||
|
||||
# write the updated file
|
||||
out = open(sys.argv[2], 'w')
|
||||
out.write(data)
|
||||
26
SOURCE/scripts/ereadertext.py
Normal file
26
SOURCE/scripts/ereadertext.py
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import sys
|
||||
from asmquote import asmQuote
|
||||
|
||||
region = sys.argv[3]
|
||||
|
||||
out = open(sys.argv[2], 'w')
|
||||
|
||||
with open(sys.argv[1], 'rb') as f:
|
||||
for asm in f:
|
||||
asms = asm.split('"')
|
||||
command = asms[0].strip()
|
||||
if command == "db":
|
||||
# this is only for the American e-Reader; still need to deal with Japanese
|
||||
asms[1] = asms[1].replace('\\0', '\x00')
|
||||
asms[1] = asms[1].replace('\\n', '\n')
|
||||
asms[1] = asms[1].replace('é', '\x7F')
|
||||
|
||||
out.write("db " + asmQuote(asms[1]) + "\n")
|
||||
else:
|
||||
out.write(asm)
|
||||
if "macros.asm" in asm:
|
||||
out.write("REGION EQU REGION_{0}\n".format(region))
|
||||
out.write('REGION_NAME EQUS "{0}"\n'.format(region))
|
||||
|
||||
f.closed
|
||||
481
SOURCE/scripts/gen3text.py
Normal file
481
SOURCE/scripts/gen3text.py
Normal file
|
|
@ -0,0 +1,481 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import sys
|
||||
|
||||
chars = {
|
||||
# Japanese character table
|
||||
' ': '\x00',
|
||||
'あ': '\x01',
|
||||
'い': '\x02',
|
||||
'う': '\x03',
|
||||
'え': '\x04',
|
||||
'お': '\x05',
|
||||
'か': '\x06',
|
||||
'き': '\x07',
|
||||
'く': '\x08',
|
||||
'け': '\x09',
|
||||
'こ': '\x0A',
|
||||
'さ': '\x0B',
|
||||
'し': '\x0C',
|
||||
'す': '\x0D',
|
||||
'せ': '\x0E',
|
||||
'そ': '\x0F',
|
||||
'た': '\x10',
|
||||
'ち': '\x11',
|
||||
'つ': '\x12',
|
||||
'て': '\x13',
|
||||
'と': '\x14',
|
||||
'な': '\x15',
|
||||
'に': '\x16',
|
||||
'ぬ': '\x17',
|
||||
'ね': '\x18',
|
||||
'の': '\x19',
|
||||
'は': '\x1A',
|
||||
'ひ': '\x1B',
|
||||
'ふ': '\x1C',
|
||||
'へ': '\x1D',
|
||||
'ほ': '\x1E',
|
||||
'ま': '\x1F',
|
||||
'み': '\x20',
|
||||
'む': '\x21',
|
||||
'め': '\x22',
|
||||
'も': '\x23',
|
||||
'や': '\x24',
|
||||
'ゆ': '\x25',
|
||||
'よ': '\x26',
|
||||
'ら': '\x27',
|
||||
'り': '\x28',
|
||||
'る': '\x29',
|
||||
'れ': '\x2A',
|
||||
'ろ': '\x2B',
|
||||
'わ': '\x2C',
|
||||
'を': '\x2D',
|
||||
'ん': '\x2E',
|
||||
'ぁ': '\x2F',
|
||||
'ぃ': '\x30',
|
||||
'ぅ': '\x31',
|
||||
'ぇ': '\x32',
|
||||
'ぉ': '\x33',
|
||||
'ゃ': '\x34',
|
||||
'ゅ': '\x35',
|
||||
'ょ': '\x36',
|
||||
'が': '\x37',
|
||||
'ぎ': '\x38',
|
||||
'ぐ': '\x39',
|
||||
'げ': '\x3A',
|
||||
'ご': '\x3B',
|
||||
'ざ': '\x3C',
|
||||
'じ': '\x3D',
|
||||
'ず': '\x3E',
|
||||
'ぜ': '\x3F',
|
||||
'ぞ': '\x40',
|
||||
'だ': '\x41',
|
||||
'ぢ': '\x42',
|
||||
'づ': '\x43',
|
||||
'で': '\x44',
|
||||
'ど': '\x45',
|
||||
'ば': '\x46',
|
||||
'び': '\x47',
|
||||
'ぶ': '\x48',
|
||||
'べ': '\x49',
|
||||
'ぼ': '\x4A',
|
||||
'ぱ': '\x4B',
|
||||
'ぴ': '\x4C',
|
||||
'ぷ': '\x4D',
|
||||
'ぺ': '\x4E',
|
||||
'ぽ': '\x4F',
|
||||
'っ': '\x50',
|
||||
|
||||
'ア': '\x51',
|
||||
'イ': '\x52',
|
||||
'ウ': '\x53',
|
||||
'エ': '\x54',
|
||||
'オ': '\x55',
|
||||
'カ': '\x56',
|
||||
'キ': '\x57',
|
||||
'ク': '\x58',
|
||||
'ケ': '\x59',
|
||||
'コ': '\x5A',
|
||||
'サ': '\x5B',
|
||||
'シ': '\x5C',
|
||||
'ス': '\x5D',
|
||||
'セ': '\x5E',
|
||||
'ソ': '\x5F',
|
||||
'タ': '\x60',
|
||||
'チ': '\x61',
|
||||
'ツ': '\x62',
|
||||
'テ': '\x63',
|
||||
'ト': '\x64',
|
||||
'ナ': '\x65',
|
||||
'ニ': '\x66',
|
||||
'ヌ': '\x67',
|
||||
'ネ': '\x68',
|
||||
'ノ': '\x69',
|
||||
'ハ': '\x6A',
|
||||
'ヒ': '\x6B',
|
||||
'フ': '\x6C',
|
||||
'ヘ': '\x6D',
|
||||
'ホ': '\x6E',
|
||||
'マ': '\x6F',
|
||||
'ミ': '\x70',
|
||||
'ム': '\x71',
|
||||
'メ': '\x72',
|
||||
'モ': '\x73',
|
||||
'ヤ': '\x74',
|
||||
'ユ': '\x75',
|
||||
'ヨ': '\x76',
|
||||
'ラ': '\x77',
|
||||
'リ': '\x78',
|
||||
'ル': '\x79',
|
||||
'レ': '\x7A',
|
||||
'ロ': '\x7B',
|
||||
'ワ': '\x7C',
|
||||
'ヲ': '\x7D',
|
||||
'ン': '\x7E',
|
||||
'ァ': '\x7F',
|
||||
'ィ': '\x80',
|
||||
'ゥ': '\x81',
|
||||
'ェ': '\x82',
|
||||
'ォ': '\x83',
|
||||
'ャ': '\x84',
|
||||
'ュ': '\x85',
|
||||
'ョ': '\x86',
|
||||
'ガ': '\x87',
|
||||
'ギ': '\x88',
|
||||
'グ': '\x89',
|
||||
'ゲ': '\x8A',
|
||||
'ゴ': '\x8B',
|
||||
'ザ': '\x8C',
|
||||
'ジ': '\x8D',
|
||||
'ズ': '\x8E',
|
||||
'ゼ': '\x8F',
|
||||
'ゾ': '\x90',
|
||||
'ダ': '\x91',
|
||||
'ヂ': '\x92',
|
||||
'ヅ': '\x93',
|
||||
'デ': '\x94',
|
||||
'ド': '\x95',
|
||||
'バ': '\x96',
|
||||
'ビ': '\x97',
|
||||
'ブ': '\x98',
|
||||
'ベ': '\x99',
|
||||
'ボ': '\x9A',
|
||||
'パ': '\x9B',
|
||||
'ピ': '\x9C',
|
||||
'プ': '\x9D',
|
||||
'ペ': '\x9E',
|
||||
'ポ': '\x9F',
|
||||
'ッ': '\xA0',
|
||||
|
||||
'0': '\xA1',
|
||||
'1': '\xA2',
|
||||
'2': '\xA3',
|
||||
'3': '\xA4',
|
||||
'4': '\xA5',
|
||||
'5': '\xA6',
|
||||
'6': '\xA7',
|
||||
'7': '\xA8',
|
||||
'8': '\xA9',
|
||||
'9': '\xAA',
|
||||
'!': '\xAB',
|
||||
'?': '\xAC',
|
||||
'。': '\xAD',
|
||||
'ー': '\xAE',
|
||||
'・': '\xAF',
|
||||
'⋯': '\xB0',
|
||||
'『': '\xB1',
|
||||
'』': '\xB2',
|
||||
'「': '\xB3',
|
||||
'」': '\xB4',
|
||||
'♂': '\xB5',
|
||||
'♀': '\xB6',
|
||||
'円': '\xB7',
|
||||
'.': '\xB8',
|
||||
'×': '\xB9',
|
||||
'/': '\xBA',
|
||||
|
||||
'A': '\xBB',
|
||||
'B': '\xBC',
|
||||
'C': '\xBD',
|
||||
'D': '\xBE',
|
||||
'E': '\xBF',
|
||||
'F': '\xC0',
|
||||
'G': '\xC1',
|
||||
'H': '\xC2',
|
||||
'I': '\xC3',
|
||||
'J': '\xC4',
|
||||
'K': '\xC5',
|
||||
'L': '\xC6',
|
||||
'M': '\xC7',
|
||||
'N': '\xC8',
|
||||
'O': '\xC9',
|
||||
'P': '\xCA',
|
||||
'Q': '\xCB',
|
||||
'R': '\xCC',
|
||||
'S': '\xCD',
|
||||
'T': '\xCE',
|
||||
'U': '\xCF',
|
||||
'V': '\xD0',
|
||||
'W': '\xD1',
|
||||
'X': '\xD2',
|
||||
'Y': '\xD3',
|
||||
'Z': '\xD4',
|
||||
'a': '\xD5',
|
||||
'b': '\xD6',
|
||||
'c': '\xD7',
|
||||
'd': '\xD8',
|
||||
'e': '\xD9',
|
||||
'f': '\xDA',
|
||||
'g': '\xDB',
|
||||
'h': '\xDC',
|
||||
'i': '\xDD',
|
||||
'j': '\xDE',
|
||||
'k': '\xDF',
|
||||
'l': '\xE0',
|
||||
'm': '\xE1',
|
||||
'n': '\xE2',
|
||||
'o': '\xE3',
|
||||
'p': '\xE4',
|
||||
'q': '\xE5',
|
||||
'r': '\xE6',
|
||||
's': '\xE7',
|
||||
't': '\xE8',
|
||||
'u': '\xE9',
|
||||
'v': '\xEA',
|
||||
'w': '\xEB',
|
||||
'x': '\xEC',
|
||||
'y': '\xED',
|
||||
'z': '\xEE',
|
||||
'▶': '\xEF',
|
||||
':': '\xF0',
|
||||
'Ä': '\xF1',
|
||||
'Ö': '\xF2',
|
||||
'Ü': '\xF3',
|
||||
'ä': '\xF4',
|
||||
'ö': '\xF5',
|
||||
'ü': '\xF6',
|
||||
#'⬆': '\xF7',
|
||||
#'⬇': '\xF8',
|
||||
#'⬅': '\xF9',
|
||||
'\\l': '\xFA',
|
||||
'\\p': '\xFB',
|
||||
'\{FC}': '\xFC',
|
||||
'\\v1': '\xFD\x01',
|
||||
'\\v2': '\xFD\x02',
|
||||
'\\v3': '\xFD\x03',
|
||||
'\\n': '\xFE',
|
||||
'@': '\xFF',
|
||||
|
||||
# characters changed for Western versions
|
||||
' ': '\x00',
|
||||
'À': '\x01',
|
||||
'Á': '\x02',
|
||||
'Â': '\x03',
|
||||
'Ç': '\x04',
|
||||
'È': '\x05',
|
||||
'É': '\x06',
|
||||
'Ê': '\x07',
|
||||
'Ë': '\x08',
|
||||
'Ì': '\x09',
|
||||
'Î': '\x0B',
|
||||
'Ï': '\x0C',
|
||||
'Ò': '\x0D',
|
||||
'Ó': '\x0E',
|
||||
'Ô': '\x0F',
|
||||
'Œ': '\x10',
|
||||
'Ù': '\x11',
|
||||
'Ú': '\x12',
|
||||
'Û': '\x13',
|
||||
'Ñ': '\x14',
|
||||
'ß': '\x15',
|
||||
'à': '\x16',
|
||||
'á': '\x17',
|
||||
'ç': '\x19',
|
||||
'è': '\x1A',
|
||||
'é': '\x1B',
|
||||
'ê': '\x1C',
|
||||
'ë': '\x1D',
|
||||
'ì': '\x1E',
|
||||
'î': '\x20',
|
||||
'ï': '\x21',
|
||||
'ò': '\x22',
|
||||
'ó': '\x23',
|
||||
'ô': '\x24',
|
||||
'œ': '\x25',
|
||||
'ù': '\x26',
|
||||
'ú': '\x27',
|
||||
'û': '\x28',
|
||||
'ñ': '\x29',
|
||||
'º': '\x2A',
|
||||
'ª': '\x2B',
|
||||
'\{er}': '\x2C',
|
||||
'&': '\x2D',
|
||||
'+': '\x2E',
|
||||
'\{L.}': '\x34', # Italian
|
||||
'\{Lv}': '\x34', # English
|
||||
'\{Lv.}': '\x34', # German
|
||||
'\{N.}': '\x34', # French
|
||||
'\{Nv}': '\x34', # Spanish
|
||||
'=': '\x35',
|
||||
';': '\x36', # European
|
||||
'¿': '\x51',
|
||||
'¡': '\x52',
|
||||
'\{PKMN}': '\x53\x54',
|
||||
'\{POKé}': '\x55\x56',
|
||||
'\{POKéBLOC}': '\x55\x56\x57\x58\x59', # French
|
||||
'\{POKéBLOCK}': '\x55\x56\x57\x58\x59', # English
|
||||
'\{POKéCUBO}': '\x55\x56\x57\x58\x59', # Spanish
|
||||
'\{POKéRIEGEL}': '\x55\x56\x57\x58\x59', # German
|
||||
'Í': '\x5A',
|
||||
'%': '\x5B',
|
||||
'(': '\x5C',
|
||||
')': '\x5D',
|
||||
'\{POKéMELLA}': '\x5E\x5F\x60\x61\x62', # Italian
|
||||
'\{POKéMELLE}': '\x5E\x5F\x60\x61\x63', # Italian
|
||||
'â': '\x68',
|
||||
'í': '\x6F',
|
||||
'⬆': '\x79',
|
||||
'⬇': '\x7A',
|
||||
'⬅': '\x7B',
|
||||
'➡': '\x7C',
|
||||
'\{e}': '\x84', # European
|
||||
'‹': '\x85', # European
|
||||
'›': '\x86', # European
|
||||
'\{re}': '\xA0', # European
|
||||
'0': '\xA1',
|
||||
'1': '\xA2',
|
||||
'2': '\xA3',
|
||||
'3': '\xA4',
|
||||
'4': '\xA5',
|
||||
'5': '\xA6',
|
||||
'6': '\xA7',
|
||||
'7': '\xA8',
|
||||
'8': '\xA9',
|
||||
'9': '\xAA',
|
||||
'!': '\xAB',
|
||||
'?': '\xAC',
|
||||
'.': '\xAD',
|
||||
'-': '\xAE',
|
||||
'…': '\xB0',
|
||||
'“': '\xB1', # English, Italian, Spanish
|
||||
'«': '\xB1', # French
|
||||
'„': '\xB1', # German
|
||||
'”': '\xB2', # English, Italian, Spanish
|
||||
'»': '\xB2', # French
|
||||
#'“': '\xB2', # German — clashes with English B1
|
||||
'‘': '\xB3',
|
||||
'’': '\xB4',
|
||||
'$': '\xB7',
|
||||
',': '\xB8',
|
||||
'/': '\xBA',
|
||||
'A': '\xBB',
|
||||
'B': '\xBC',
|
||||
'C': '\xBD',
|
||||
'D': '\xBE',
|
||||
'E': '\xBF',
|
||||
'F': '\xC0',
|
||||
'G': '\xC1',
|
||||
'H': '\xC2',
|
||||
'I': '\xC3',
|
||||
'J': '\xC4',
|
||||
'K': '\xC5',
|
||||
'L': '\xC6',
|
||||
'M': '\xC7',
|
||||
'N': '\xC8',
|
||||
'O': '\xC9',
|
||||
'P': '\xCA',
|
||||
'Q': '\xCB',
|
||||
'R': '\xCC',
|
||||
'S': '\xCD',
|
||||
'T': '\xCE',
|
||||
'U': '\xCF',
|
||||
'V': '\xD0',
|
||||
'W': '\xD1',
|
||||
'X': '\xD2',
|
||||
'Y': '\xD3',
|
||||
'Z': '\xD4',
|
||||
'a': '\xD5',
|
||||
'b': '\xD6',
|
||||
'c': '\xD7',
|
||||
'd': '\xD8',
|
||||
'e': '\xD9',
|
||||
'f': '\xDA',
|
||||
'g': '\xDB',
|
||||
'h': '\xDC',
|
||||
'i': '\xDD',
|
||||
'j': '\xDE',
|
||||
'k': '\xDF',
|
||||
'l': '\xE0',
|
||||
'm': '\xE1',
|
||||
'n': '\xE2',
|
||||
'o': '\xE3',
|
||||
'p': '\xE4',
|
||||
'q': '\xE5',
|
||||
'r': '\xE6',
|
||||
's': '\xE7',
|
||||
't': '\xE8',
|
||||
'u': '\xE9',
|
||||
'v': '\xEA',
|
||||
'w': '\xEB',
|
||||
'x': '\xEC',
|
||||
'y': '\xED',
|
||||
'z': '\xEE',
|
||||
':': '\xF0',
|
||||
}
|
||||
|
||||
asmProblemBytes = ['\x00', '\x09', '\x0A', '\x22']
|
||||
|
||||
|
||||
def utf8ToRSText(t, region = ""):
|
||||
currentChars = chars
|
||||
if region == "DE":
|
||||
chars['“'] = '\xB2'
|
||||
|
||||
characters = []
|
||||
char = ""
|
||||
while len(t):
|
||||
if ord(t[0]) >= 0xF0:
|
||||
char += t[0:4]
|
||||
t = t[4:]
|
||||
elif ord(t[0]) >= 0xE0:
|
||||
char += t[0:3]
|
||||
t = t[3:]
|
||||
elif ord(t[0]) >= 0xC0:
|
||||
char += t[0:2]
|
||||
t = t[2:]
|
||||
else:
|
||||
char += t[0:1]
|
||||
t = t[1:]
|
||||
if char != "\\" and char != "\\v" and (char[0:2] != "\\{" or char[-1] == "}"):
|
||||
characters.append(char)
|
||||
char = ""
|
||||
|
||||
result = ""
|
||||
for char in characters:
|
||||
result += chars[char]
|
||||
return result
|
||||
|
||||
def asmQuote(t):
|
||||
result = ""
|
||||
quoted = False
|
||||
if t[0] in asmProblemBytes:
|
||||
result = '{0}'.format(ord(t[0]))
|
||||
else:
|
||||
result = '"' + t[0]
|
||||
quoted = True
|
||||
|
||||
while len(t):
|
||||
if quoted and t[0] in asmProblemBytes:
|
||||
result += '",{0}'.format(ord(t[0]))
|
||||
quoted = False
|
||||
elif quoted:
|
||||
result += t[0]
|
||||
elif t[0] in asmProblemBytes:
|
||||
result += ',{0}'.format(ord(t[0]))
|
||||
quoted = False
|
||||
else:
|
||||
result += ',"' + t[0]
|
||||
quoted = True
|
||||
t = t[1:]
|
||||
if quoted:
|
||||
result += '"'
|
||||
return result
|
||||
BIN
SOURCE/scripts/gen3text.pyc
Normal file
BIN
SOURCE/scripts/gen3text.pyc
Normal file
Binary file not shown.
210
SOURCE/scripts/pokemonstructure.py
Normal file
210
SOURCE/scripts/pokemonstructure.py
Normal file
|
|
@ -0,0 +1,210 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import struct
|
||||
import sys
|
||||
|
||||
data = ""
|
||||
dataout=""
|
||||
with open(sys.argv[1], 'rb') as f:
|
||||
data = f.read()
|
||||
f.closed
|
||||
|
||||
pv=struct.unpack('<I', data[36:40])[0]
|
||||
otid=struct.unpack('<I', data[40:44])[0]
|
||||
mask1=65280
|
||||
mask2=255
|
||||
mask=255
|
||||
key4 = (pv ^ otid) >> 24
|
||||
key3 = ((pv ^ otid) >> 16) & mask
|
||||
key2 = ((pv ^ otid) >> 8) & mask
|
||||
key1 = (pv ^ otid) & mask
|
||||
|
||||
substructG=[struct.unpack('<B', data[68])[0]]
|
||||
substructA=[struct.unpack('<B', data[80])[0]]
|
||||
substructE=[struct.unpack('<B', data[92])[0]]
|
||||
substructM=[struct.unpack('<B', data[104])[0]]
|
||||
for i in range(1,12):
|
||||
substructG.append(struct.unpack('<B', data[68+i])[0])
|
||||
substructA.append(struct.unpack('<B', data[80+i])[0])
|
||||
substructE.append(struct.unpack('<B', data[92+i])[0])
|
||||
substructM.append(struct.unpack('<B', data[104+i])[0])
|
||||
|
||||
|
||||
checksum=0
|
||||
i=68
|
||||
while i < 116:
|
||||
checksum=checksum+struct.unpack('<H', data[i:i+2])[0]
|
||||
i+=2
|
||||
|
||||
data = data[0:64] + struct.pack('<B', checksum & mask2) + struct.pack('<B', (checksum & mask1) >> 8) + data[66:]
|
||||
|
||||
i=0
|
||||
while i < 12:
|
||||
substructG[i] ^= key1
|
||||
substructA[i] ^= key1
|
||||
substructE[i] ^= key1
|
||||
substructM[i] ^= key1
|
||||
substructG[i+1] ^= key2
|
||||
substructA[i+1] ^= key2
|
||||
substructE[i+1] ^= key2
|
||||
substructM[i+1] ^= key2
|
||||
substructG[i+2] ^= key3
|
||||
substructA[i+2] ^= key3
|
||||
substructE[i+2] ^= key3
|
||||
substructM[i+2] ^= key3
|
||||
substructG[i+3] ^= key4
|
||||
substructA[i+3] ^= key4
|
||||
substructE[i+3] ^= key4
|
||||
substructM[i+3] ^= key4
|
||||
i+=4
|
||||
|
||||
|
||||
mod = pv % 24
|
||||
i=0
|
||||
if mod == 0:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
|
||||
elif mod == 1:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
|
||||
elif mod == 2:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
|
||||
elif mod == 3:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
|
||||
elif mod == 4:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
|
||||
elif mod == 5:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
|
||||
elif mod == 6:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
|
||||
elif mod == 7:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
|
||||
elif mod == 8:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
|
||||
elif mod == 9:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
|
||||
elif mod == 10:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
|
||||
elif mod == 11:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
|
||||
elif mod == 12:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
|
||||
elif mod == 13:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
|
||||
elif mod == 14:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
|
||||
elif mod == 15:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
|
||||
elif mod == 16:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
|
||||
elif mod == 17:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
|
||||
elif mod == 18:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
|
||||
elif mod == 19:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
|
||||
elif mod == 20:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
|
||||
elif mod == 21:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
|
||||
elif mod == 22:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
|
||||
else:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
|
||||
|
||||
|
||||
out = open(sys.argv[2], 'w')
|
||||
out.write(data)
|
||||
33
SOURCE/scripts/regionalize.py
Normal file
33
SOURCE/scripts/regionalize.py
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import sys
|
||||
from gen3text import utf8ToRSText
|
||||
from asmquote import asmQuote
|
||||
|
||||
data_region = sys.argv[3] # determines region code
|
||||
text_region = sys.argv[4] # determines string translation
|
||||
|
||||
out = open(sys.argv[2], 'w')
|
||||
|
||||
with open(sys.argv[1], 'rb') as f:
|
||||
for asm in f:
|
||||
asms = asm.split('"')
|
||||
command = asms[0].strip()
|
||||
if (command == "Text_" + text_region) or (command == "Text"):
|
||||
asms[1] = utf8ToRSText(asms[1], text_region)
|
||||
try:
|
||||
length = asms[2].split(';')[0] # strip trailing comment
|
||||
padding = int(length) - len(asms[1])
|
||||
if padding > 0:
|
||||
asms[1] += '\xFF'
|
||||
for i in range(padding - 1):
|
||||
asms[1] += "\x00"
|
||||
except ValueError:
|
||||
pass
|
||||
out.write("db " + asmQuote(asms[1]) + "\n")
|
||||
elif len(command) < 5 or command[0:5] != "Text_":
|
||||
out.write(asm)
|
||||
if "macros.asm" in asm:
|
||||
# can’t do this until after REGION_EN, etc. are loaded
|
||||
out.write("REGION EQU REGION_" + data_region + "\n")
|
||||
# else this is foreign text, delete it
|
||||
f.closed
|
||||
29
SOURCE/scripts/stripgbc.py
Normal file
29
SOURCE/scripts/stripgbc.py
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import sys
|
||||
|
||||
out = open(sys.argv[2], 'w')
|
||||
buffering = False
|
||||
buf = ""
|
||||
with open(sys.argv[1], 'rb') as f:
|
||||
f.read(256) # skip to $0100
|
||||
while True:
|
||||
byte = f.read(1)
|
||||
if not byte:
|
||||
break
|
||||
|
||||
# the program shall end with $FF followed only by $00 bytes
|
||||
# for every $FF we hit, buffer until something that isn’t $00
|
||||
if (not buffering and ord(byte) == 0xFF) or (buffering and ord(byte) == 0x00):
|
||||
buf += byte
|
||||
buffering = True
|
||||
elif buffering and ord(byte) == 0xFF:
|
||||
out.write(buf)
|
||||
buf = byte
|
||||
elif buffering:
|
||||
out.write(buf)
|
||||
out.write(byte)
|
||||
buf = ""
|
||||
buffering = False
|
||||
else:
|
||||
out.write(byte)
|
||||
f.closed
|
||||
Loading…
Reference in New Issue
Block a user