@@ -160,9 +160,8 @@ int Tomb1MGetSecretCount()
160
160
161
161
for (int i = 0 ; i < RoomCount ; i ++ ) {
162
162
ROOM_INFO * r = & RoomInfo [i ];
163
- for (int j = 0 ; j < r -> y_size * r -> x_size ; j ++ ) {
164
- FLOOR_INFO * floor = & r -> floor [j ];
165
-
163
+ FLOOR_INFO * floor = & r -> floor [0 ];
164
+ for (int j = 0 ; j < r -> y_size * r -> x_size ; j ++ , floor ++ ) {
166
165
int k = floor -> index ;
167
166
if (!k ) {
168
167
continue ;
@@ -194,9 +193,7 @@ int Tomb1MGetSecretCount()
194
193
int16_t command = FloorData [k ++ ];
195
194
if (TRIG_BITS (command ) == TO_CAMERA ) {
196
195
k ++ ;
197
- }
198
-
199
- if (TRIG_BITS (command ) == TO_SECRET ) {
196
+ } else if (TRIG_BITS (command ) == TO_SECRET ) {
200
197
int16_t number = command & VALUE_BITS ;
201
198
if (!(secrets & (1 << number ))) {
202
199
secrets |= (1 << number );
@@ -221,3 +218,75 @@ int Tomb1MGetSecretCount()
221
218
222
219
return count ;
223
220
}
221
+
222
+ void Tomb1MFixPyramidSecretTrigger ()
223
+ {
224
+ if (CurrentLevel != LV_LEVEL10C ) {
225
+ return ;
226
+ }
227
+
228
+ uint32_t global_secrets = 0 ;
229
+
230
+ for (int i = 0 ; i < RoomCount ; i ++ ) {
231
+ uint32_t room_secrets = 0 ;
232
+ ROOM_INFO * r = & RoomInfo [i ];
233
+ FLOOR_INFO * floor = & r -> floor [0 ];
234
+ for (int j = 0 ; j < r -> y_size * r -> x_size ; j ++ , floor ++ ) {
235
+ int k = floor -> index ;
236
+ if (!k ) {
237
+ continue ;
238
+ }
239
+
240
+ while (k < FloorDataSize ) {
241
+ uint16_t floor = FloorData [k ++ ];
242
+
243
+ switch (floor & DATA_TYPE ) {
244
+ case FT_DOOR :
245
+ case FT_ROOF :
246
+ case FT_TILT :
247
+ k ++ ;
248
+ break ;
249
+
250
+ case FT_LAVA :
251
+ break ;
252
+
253
+ case FT_TRIGGER : {
254
+ uint16_t trig_type = (floor & 0x3F00 ) >> 8 ;
255
+ k ++ ; // skip basic trigger stuff
256
+
257
+ if (trig_type == TT_SWITCH || trig_type == TT_KEY
258
+ || trig_type == TT_PICKUP ) {
259
+ k ++ ;
260
+ }
261
+
262
+ while (1 ) {
263
+ int16_t * command = & FloorData [k ++ ];
264
+ if (TRIG_BITS (* command ) == TO_CAMERA ) {
265
+ k ++ ;
266
+ } else if (TRIG_BITS (* command ) == TO_SECRET ) {
267
+ int16_t number = * command & VALUE_BITS ;
268
+ if (global_secrets & (1 << number ) && number == 0 ) {
269
+ // the secret number was already used.
270
+ // update the number to 2.
271
+ * command |= 2 ;
272
+ } else {
273
+ room_secrets |= (1 << number );
274
+ }
275
+ }
276
+
277
+ if (* command & END_BIT ) {
278
+ break ;
279
+ }
280
+ }
281
+ break ;
282
+ }
283
+ }
284
+
285
+ if (floor & END_BIT ) {
286
+ break ;
287
+ }
288
+ }
289
+ }
290
+ global_secrets |= room_secrets ;
291
+ }
292
+ }
0 commit comments