| 481 | } |
| 482 | |
| 483 | void KillEffect(short fxNumber) |
| 484 | { |
| 485 | if (InItemControlLoop) |
| 486 | { |
| 487 | ItemNewRooms[2 * ItemNewRoomNo] = fxNumber | 0x8000; |
| 488 | ItemNewRoomNo++; |
| 489 | } |
| 490 | else |
| 491 | { |
| 492 | auto* fx = &EffectList[fxNumber]; |
| 493 | DetatchSpark(fxNumber, SP_FX); |
| 494 | |
| 495 | if (NextFxActive == fxNumber) |
| 496 | NextFxActive = fx->nextActive; |
| 497 | else |
| 498 | { |
| 499 | for (short linkNumber = NextFxActive; linkNumber != NO_VALUE; linkNumber = EffectList[linkNumber].nextActive) |
| 500 | { |
| 501 | if (EffectList[linkNumber].nextActive == fxNumber) |
| 502 | { |
| 503 | EffectList[linkNumber].nextActive = fx->nextActive; |
| 504 | break; |
| 505 | } |
| 506 | } |
| 507 | } |
| 508 | |
| 509 | if (g_Level.Rooms[fx->roomNumber].fxNumber == fxNumber) |
| 510 | g_Level.Rooms[fx->roomNumber].fxNumber = fx->nextFx; |
| 511 | else |
| 512 | { |
| 513 | for (short linkNumber = g_Level.Rooms[fx->roomNumber].fxNumber; linkNumber != NO_VALUE; linkNumber = EffectList[linkNumber].nextFx) |
| 514 | { |
| 515 | if (EffectList[linkNumber].nextFx == fxNumber) |
| 516 | { |
| 517 | EffectList[linkNumber].nextFx = fx->nextFx; |
| 518 | break; |
| 519 | } |
| 520 | } |
| 521 | } |
| 522 | |
| 523 | fx->nextFx = NextFxFree; |
| 524 | NextFxFree = fxNumber; |
| 525 | } |
| 526 | |
| 527 | // HACK: Garbage collect nextFx if no active effects were detected. |
| 528 | // This fixes random crashes after spawining multiple FXs (like body part). |
| 529 | |
| 530 | if (NextFxActive == NO_VALUE) |
| 531 | InitializeFXArray(); |
| 532 | } |
| 533 | |
| 534 | short CreateNewEffect(short roomNumber) |
| 535 | { |
no test coverage detected