Repository navigation
Expand file tree
/
Copy pathsprite_runtime.lua
More file actions
230 lines (230 loc) · 4.52 KB
/
Copy pathsprite_runtime.lua
File metadata and controls
230 lines (230 loc) · 4.52 KB
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
-- A sprite variant never changes entity type, damage, velocity or target.
-- Restore native GM IDs while simulation runs; apply the variant for rendering.
local M = {}
M.one = [[
spriteOne:
; eax=entity id, edx=0 restore native / 1 apply custom
pushad
mov ebx, eax
mov edi, [ENTITYVARIANT+ebx*4]
test edi, edi
jz so_done
cmp edi, 33
ja so_drop
imul esi, ebx, 232
add esi, ENTITYARRAY
mov ecx, [ENTITYUID+ebx*4]
cmp [esi+0x30], ecx
jne so_clear
cmp word [esi+0x28], 1
jl so_clear
cmp word [esi+0x28], 2
ja so_clear
movzx ecx, word [esi+0x2A]
cmp ecx, [ENTITYTYPE+ebx*4]
jne so_clear
mov ecx, [VARIANTGM+edi*4]
test ecx, ecx
jz so_done
movzx eax, word [esi+0x06]
cmp eax, ecx
je so_owned
cmp eax, [VARIANTBASEGM+edi*4]
jne so_clear
so_owned:
test edx, edx
jz so_restore
movzx eax, word [esi+0x04]
test eax, eax
jz so_clear
cmp eax, [VARIANTCOUNT+edi*4]
ja so_clear
mov [esi+0x06], cx
jmp so_done
so_restore:
mov ecx, [VARIANTBASEGM+edi*4]
mov [esi+0x06], cx
jmp so_done
so_clear:
mov ecx, [ENTITYUID+ebx*4]
cmp [esi+0x30], ecx
jne so_drop
mov ecx, [VARIANTGM+edi*4]
cmp word [esi+0x06], cx
jne so_drop
mov ecx, [VARIANTBASEGM+edi*4]
mov word [esi+0x06], cx
so_drop:
mov dword [ENTITYVARIANT+ebx*4], 0
so_done:
popad
ret
]]
M.all = [[
spriteAll:
; edx=mode; visit only custom entities admitted by spriteSpawn/rebuild.
pushad
xor edi, edi
sa_loop:
cmp edi, [ACTIVECOUNT]
jae sa_done
mov ebx, [ACTIVEIDS+edi*4]
cmp ebx, 1
jl sa_drop
cmp ebx, 3000
jae sa_drop
mov eax, ebx
call SPRITEONE
cmp dword [ENTITYVARIANT+ebx*4], 0
jne sa_next
mov dword [ACTIVEINDEX+ebx*4], 0
sa_drop:
mov ecx, [ACTIVECOUNT]
dec ecx
mov [ACTIVECOUNT], ecx
cmp edi, ecx
jae sa_loop
mov eax, [ACTIVEIDS+ecx*4]
mov [ACTIVEIDS+edi*4], eax
lea esi, [edi+1]
mov [ACTIVEINDEX+eax*4], esi
jmp sa_loop
sa_next:
inc edi
jmp sa_loop
sa_done:
popad
ret
]]
M.rebuild = [[
spriteRebuild:
; Map Extensions calls this once on new world/load, not each frame.
pushfd
pushad
cld
mov edi, ACTIVEINDEX
xor eax, eax
mov ecx, 3000
rep stosd
mov dword [ACTIVECOUNT], 0
mov ebx, 1
sr_loop:
mov eax, [ENTITYVARIANT+ebx*4]
test eax, eax
jz sr_next
cmp eax, 1
jl sr_invalid
cmp eax, 33
ja sr_invalid
mov ecx, [ACTIVECOUNT]
mov [ACTIVEIDS+ecx*4], ebx
lea eax, [ecx+1]
mov [ACTIVEINDEX+ebx*4], eax
mov [ACTIVECOUNT], eax
jmp sr_next
sr_invalid:
mov dword [ENTITYVARIANT+ebx*4], 0
sr_next:
inc ebx
cmp ebx, 3000
jl sr_loop
popad
popfd
ret
]]
M.spawn_original = [[
spriteSpawnOriginal:
sub esp, 8
push ebx
mov ebx, [esp+0x34]
jmp SPAWNRESUME
]]
M.spawn = [[
spriteSpawn:
push ebp
mov ebp, esp
push ebx
push esi
push edi
push dword [ebp+48]
push dword [ebp+44]
push dword [ebp+40]
push dword [ebp+36]
push dword [ebp+32]
push dword [ebp+28]
push dword [ebp+24]
push dword [ebp+20]
push dword [ebp+16]
push dword [ebp+12]
push dword [ebp+8]
call SPAWNORIGINAL
cmp eax, 1
jl ss_done
cmp eax, 3000
jae ss_done
; Clear a recycled slot even when the new entity is not a custom shot.
mov dword [ENTITYVARIANT+eax*4], 0
cmp dword [REENTRY], 0
je ss_done
mov ebx, [CURRENTVARIANT]
test ebx, ebx
jz ss_done
cmp ebx, 33
ja ss_done
imul esi, eax, 232
add esi, ENTITYARRAY
mov [ENTITYVARIANT+eax*4], ebx
mov edx, [esi+0x30]
mov [ENTITYUID+eax*4], edx
movzx edx, word [esi+0x2A]
mov [ENTITYTYPE+eax*4], edx
mov edx, 1
call SPRITEONE
cmp dword [ENTITYVARIANT+eax*4], 0
je ss_done
cmp dword [ACTIVEINDEX+eax*4], 0
jne ss_done
mov ecx, [ACTIVECOUNT]
cmp ecx, 2999
jae ss_done
mov [ACTIVEIDS+ecx*4], eax
inc ecx
mov [ACTIVECOUNT], ecx
mov [ACTIVEINDEX+eax*4], ecx
ss_done:
pop edi
pop esi
pop ebx
pop ebp
ret 44
]]
M.update_original = [[
spriteUpdateOriginal:
push ecx
push ebx
push ebp
push esi
mov esi, ecx
jmp ENTITYRESUME
]]
M.update = [[
spriteUpdate:
pushfd
pushad
xor edx, edx
call SPRITEALL
popad
popfd
call ENTITYORIGINAL
pushfd
pushad
mov edx, 1
call SPRITEALL
if HASDECOR = 1
call UPDATEDECOR
end if
popad
popfd
ret
]]
return M