Finshed adding source

This commit is contained in:
notblisy 2023-04-27 10:48:20 -04:00 committed by GitHub
parent 54e258f1b4
commit 80a61385f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
36 changed files with 2180 additions and 0 deletions

View 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

Binary file not shown.

View 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

View 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

View File

@ -0,0 +1 @@
901180e44767e19e5dc9d5df881fe123 00-C000-EN.z80

BIN
SOURCE/lugiaevent/lugia.bin Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
SOURCE/lugiaevent/nedcmake Normal file

Binary file not shown.

BIN
SOURCE/lugiaevent/nevpk Normal file

Binary file not shown.

View 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

Binary file not shown.

BIN
SOURCE/lugiaevent/rgblink Normal file

Binary file not shown.

318
SOURCE/macros.asm Normal file
View File

@ -0,0 +1,318 @@
; some Z80 opcodes arent 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 ; dont 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 Korths 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
View 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

Binary file not shown.

40
SOURCE/mewevent/Makefile Normal file
View 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

View 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 "Whats that light? A mirage?@"
Pokemon:
Text_DE "Lauf und besuche deinen Vater in der@"
Text_EN "No, its 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

Binary file not shown.

View File

@ -0,0 +1 @@
{o˙ZkcQIj|||||^sg>:)Ą

BIN
SOURCE/mewevent/nedclib.dll Normal file

Binary file not shown.

BIN
SOURCE/mewevent/nedcmake Normal file

Binary file not shown.

BIN
SOURCE/mewevent/nevpk Normal file

Binary file not shown.

View 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

Binary file not shown.

BIN
SOURCE/mewevent/rgblink Normal file

Binary file not shown.

View 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

Binary file not shown.

View 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)

View 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)

View 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
View 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',
'': '\xA1',
'': '\xA2',
'': '\xA3',
'': '\xA4',
'': '\xA5',
'': '\xA6',
'': '\xA7',
'': '\xA8',
'': '\xA9',
'': '\xAA',
'': '\xAB',
'': '\xAC',
'': '\xAD',
'': '\xAE',
'': '\xAF',
'': '\xB0',
'': '\xB1',
'': '\xB2',
'': '\xB3',
'': '\xB4',
'': '\xB5',
'': '\xB6',
'': '\xB7',
'': '\xB8',
'×': '\xB9',
'': '\xBA',
'': '\xBB',
'': '\xBC',
'': '\xBD',
'': '\xBE',
'': '\xBF',
'': '\xC0',
'': '\xC1',
'': '\xC2',
'': '\xC3',
'': '\xC4',
'': '\xC5',
'': '\xC6',
'': '\xC7',
'': '\xC8',
'': '\xC9',
'': '\xCA',
'': '\xCB',
'': '\xCC',
'': '\xCD',
'': '\xCE',
'': '\xCF',
'': '\xD0',
'': '\xD1',
'': '\xD2',
'': '\xD3',
'': '\xD4',
'': '\xD5',
'': '\xD6',
'': '\xD7',
'': '\xD8',
'': '\xD9',
'': '\xDA',
'': '\xDB',
'': '\xDC',
'': '\xDD',
'': '\xDE',
'': '\xDF',
'': '\xE0',
'': '\xE1',
'': '\xE2',
'': '\xE3',
'': '\xE4',
'': '\xE5',
'': '\xE6',
'': '\xE7',
'': '\xE8',
'': '\xE9',
'': '\xEA',
'': '\xEB',
'': '\xEC',
'': '\xED',
'': '\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

Binary file not shown.

View 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)

View 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:
# cant 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

View 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 isnt $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