-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSpritePiece.asm
93 lines (85 loc) · 2.72 KB
/
SpritePiece.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
; macro to declare a mappings table (taken from Sonic 2 Hg disassembly)
mappingsTable macro *
\* EQU *
current_mappings_table = \*
endm
; macro to declare an entry in a mappings table (taken from Sonic 2 Hg disassembly)
mappingsTableEntry macro ptr
dc.\0 ptr-current_mappings_table
endm
spriteHeader macro *
\* EQU *
if SonicMappingsVer=1
dc.b ((\*_End-\*-1)/5)
elseif SonicMappingsVer=2
dc.w ((\*_End-\*-2)/8)
else
dc.w ((\*_End-\*-2)/6)
endif
endm
spritePiece macro xpos,ypos,width,height,tile,xflip,yflip,pal,pri
if SonicMappingsVer=1
;Left ;Top ;width ;height ;art tile index ;xflip ;yflip ;palette ;priority
;spritePiece 0, -$80, 4, 2, 0, 0, 0, 0, 1
dc.b ypos
dc.b (((width-1)&3)<<2)|((height-1)&3)
dc.b ((pri&1)<<7)|((pal&3)<<5)|((yflip&1)<<4)|((xflip&1)<<3)|((tile&$700)>>8)
dc.b tile&$FF
dc.b xpos
elseif SonicMappingsVer=2
dc.w ((ypos&$FF)<<8)|(((width-1)&3)<<2)|((height-1)&3)
dc.w ((pri&1)<<15)|((pal&3)<<13)|((yflip&1)<<12)|((xflip&1)<<11)|(tile&$7FF)
dc.w ((pri&1)<<15)|((pal&3)<<13)|((yflip&1)<<12)|((xflip&1)<<11)|((tile>>1)&$7FF)
dc.w xpos
else
dc.w ((ypos&$FF)<<8)|(((width-1)&3)<<2)|((height-1)&3)
dc.w ((pri&1)<<15)|((pal&3)<<13)|((yflip&1)<<12)|((xflip&1)<<11)|(tile&$7FF)
dc.w xpos
endif
endm
spritePiece2P macro xpos,ypos,width,height,tile,xflip,yflip,pal,pri,tile2,xflip2,yflip2,pal2,pri2
if SonicMappingsVer=1
dc.b ypos
dc.b (((width-1)&3)<<2)|((height-1)&3)
dc.b ((pri&1)<<7)|((pal&3)<<5)|((yflip&1)<<4)|((xflip&1)<<3)|((tile&$700)>>8)
dc.b tile&$FF
dc.b xpos
elseif SonicMappingsVer=2
dc.w ((ypos&$FF)<<8)|(((width-1)&3)<<2)|((height-1)&3)
dc.w ((pri&1)<<15)|((pal&3)<<13)|((yflip&1)<<12)|((xflip&1)<<11)|(tile&$7FF)
dc.w ((pri2&1)<<15)|((pal2&3)<<13)|((yflip2&1)<<12)|((xflip2&1)<<11)|(tile2&$7FF)
dc.w xpos
else
dc.w ((ypos&$FF)<<8)|(((width-1)&3)<<2)|((height-1)&3)
dc.w ((pri&1)<<15)|((pal&3)<<13)|((yflip&1)<<12)|((xflip&1)<<11)|(tile&$7FF)
dc.w xpos
endif
endm
dplcHeader macro *
\* EQU *
if SonicMappingsVer=1
;Tiles, ;Offset
;dplcEntry 6, $1AA
dc.b ((\*_End-\*-1)/2)
elseif SonicMappingsVer=2
dc.w ((\*_End-\*-2)/2)
else
dc.w ((\*_End-\*-4)/2)
endif
endm
dplcEntry macro tiles,offset
if SonicMappingsVer=3
dc.w ((offset&$FFF)<<4)|((tiles-1)&$F)
else
dc.w (((tiles-1)&$F)<<12)|(offset&$FFF)
endif
endm
; I don't know why, but S3K uses Sonic 2's DPLC format for players, and its own for everything else
; So to avoid having to set and reset SonicMappingsVer I'll just make special macros
s3kPlayerDplcHeader macro *
\* EQU *
dc.w ((\*_End-\*-2)/2)
endm
s3kPlayerDplcEntry macro tiles,offset
dc.w (((tiles-1)&$F)<<12)|(offset&$FFF)
endm