Quote from: WillLem on April 07, 2026, 10:39:10 PMAlways happy to accept help wherever offered! It's good to not have to always figure these things out on my ownI am SO happy to hear this.
Besides, I figured that some re-rendering prevention guard is what was needed. You helped pin it down to exactly where the guard needed to be - this is much appreciated!
Quote from: roltemurto on April 07, 2026, 09:18:38 PMI hope I don't overstep my boundaries by doing this but I just want to be helpful.

Quote from: roltemurto on April 07, 2026, 09:18:38 PMFix 1 — Re-entrancy guard on ResetLevelImage
Prevent NLEditForm_Resize from triggering a render if one is already in progress
Quote from: roltemurto on April 07, 2026, 09:18:38 PMFix 2 — Ensure UnlockBits is always called in BmpModify.DrawOn
The existing DrawOn method almost certainly does LockBits without a try/finally guarantee on UnlockBits. If any exception occurs mid-render, the bitmap stays locked forever for the lifetime of the object. Fix the locking pattern:
Quote from: roltemurto on April 07, 2026, 09:18:38 PMFix 3 (optional hardening) — Debounce resize events
Resize events can fire dozens of times per second during a resolution change. Even with the re-entrancy guard, it is worth debouncing to avoid hammering the renderer immediately after wake:
Quote from: WillLem on April 07, 2026, 03:45:11 PMNot sure exactly why the exception occurred though. Maybe more resolution-specific guards need to be in place.
NLEditForm_Resize → ResetLevelImage → CombineLayers → CreateLevelImageFromLayers → BmpModify.DrawOn → Bitmap.LockBits// In SLXEditForm:
private bool _isRendering = false;
private void ResetLevelImage()
{
if (_isRendering) return; // Guard against re-entrant calls
_isRendering = true;
try
{
// ... existing ResetLevelImage body ...
}
finally
{
_isRendering = false;
}
}// In BmpModify.DrawOn — wrap the LockBits/UnlockBits pair in try/finally:
BitmapData bmpData = null;
try
{
bmpData = origBmp.LockBits(rect, ImageLockMode.ReadOnly, origBmp.PixelFormat);
// ... pixel operations ...
}
finally
{
if (bmpData != null)
origBmp.UnlockBits(bmpData);
}private System.Windows.Forms.Timer _resizeDebounce;
private void NLEditForm_Resize(object sender, EventArgs e)
{
if (_resizeDebounce == null)
{
_resizeDebounce = new System.Windows.Forms.Timer { Interval = 150 };
_resizeDebounce.Tick += (s, _) =>
{
_resizeDebounce.Stop();
ResetLevelImage();
};
}
_resizeDebounce.Stop();
_resizeDebounce.Start();
}| Fix | What it addresses |
| Re-entrancy guard (_isRendering) | Stops a second render from starting while one is in progress |
| try/finally around LockBits | Guarantees unlock even if a render throws mid-way |
| Resize debounce | Reduces needless render thrash during resolution changes |

Yes, feel free to reference them if necessary while remaking the levels in L1 styles Quote from: Proxima on April 04, 2026, 12:42:28 PMLem Dunk is possible to save all but one. It would almost certainly be possible to save 100% if the trapdoor order were 1 - 3 - 2, haven't verified this yet.
However, this depends on the RR being 25 in NeoLemmix, which is slower than the slowest possible RR in other engines, so that's something we would have to change anyway.
Quote from: Proxima on April 04, 2026, 12:42:28 PMWillLem voted for keeping the Mazu / Clam / IS levels (and Betcha can't save is by IS) so I'm pretty sure he does want it considered for v5Quote from: WillLem on April 04, 2026, 01:44:58 PMThe lists I posted are just there to document my favourites, really. Of course I'd like to see them included, but I'm equally happy to leave level selection entirely up to Proxima; I'll ultimately back whatever he decides upon, even if it means some of my picks don't make the cut.

QuoteIt's a very tricky question, exactly how far it's okay to change other people's levels. As mobius listed in his post above, in v4 he changed a few levels to 10-of-all that weren't originally, and on the one hand, that is changing them from the author's intent, but on the other hand, the pack benefits from having some easy levels to start with. So I'd love to hear more people's opinions on what to do with those levels, and with the start of the pack in general.
QuoteI am completely against changing levels just to make 100% possible. That you can't save 100% on every level has always been part of the game. "Betcha can't save" is designed so that saving even one is difficult, and that shouldn't be messed with.
It's not L2 anyway, where it's been proven that it's possible to save all on all 120 levels of the game and even then it's still possible to get gold if you lose some depending on the level/tribe. I digress though.