diff --git a/PROJECT.md b/PROJECT.md index 5d0ffdc..07f412b 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -365,6 +365,19 @@ zombie (now an occasional opponent, `TUNE.racketEvery`, not the every-game fixtu together. Draws stay integer-aligned with **no vertical offset**: a fractional `dy` on a scaled image re-snaps its pixel rows every frame under nearest-neighbour — that boiling beside the HUD was the "scoreboard flicker". +- **THE APPLAUSE HAS TO HAPPEN WHERE THE HUD IS NOT.** A raise is only detectable where there is + empty stand above somebody's head — that is how the arms are told apart from the roll's drift — + and the sheet only offers that above the top row of each seating block. One of those rows sits at + the very top of the picture, which is exactly where the scoreboard is: measured, 31 of 134 raisers + were being drawn under the board or the blood panel. Oliver: "in the upper parts of the crowd there + seems to be a lot more action going on, but I can barely see it because the hud is covering it." + Two rules now hold the line, and BOTH are needed — the second alone would just delete the + applause: + 1. the arms-up rolls are asked for standers **in the lower two thirds only** (`_crowdroll.py`); + 2. `_crowdpass.py` drops any raiser whose box centre falls under the board or the blood panel + (`HUD`, in portrait logical px — landscape has a shorter band, so the rule is conservative + there rather than over-eager). + Result: 92 of 101 raisers below the board's bottom edge, against 103 of 134 before. - **A raiser is ~8x6 logical px, so a pose that appears and holds is invisible.** What reads as applause is the CYCLE — arms high, hands together, up, down, at about 3.5 Hz — and how many people are doing it at once (`crowd.pop`). Oliver on the first per-person cut: "when clapping I barely see diff --git a/assets/_crowdpass.py b/assets/_crowdpass.py index a746b25..e6dedc0 100644 --- a/assets/_crowdpass.py +++ b/assets/_crowdpass.py @@ -62,6 +62,19 @@ GRADE_REF = '76ea1d0' # borrows the hard-court sheet and does its own dimming in `COURTS.dim`, so it is fixed there. COURTS = [('x_crowd', 0.72), ('x_crowd_c', 1.0), ('x_crowd_h', 1.0)] +# WHAT THE HUD EATS. A raiser drawn under the scoreboard is a draw call nobody sees, and worse: the +# "how many join in" fraction spends part of every cheer on them. Oliver: "in the upper parts of the +# crowd there seems to be a lot more action going on, but I can barely see it because the hud is +# covering it." Measured on the sheet before this rule, 31 of 134 raisers sat behind the board or the +# blood panel. They are dropped here, which also makes the visible applause denser for free. +# In LOGICAL px of the PORTRAIT layout, which is the primary target: the board sits at (6,6) 150x42 +# with its game/sets panel under it, the blood panel is up in the right corner, and the stand band is +# about 195 px tall (render.js: standsBottom - AD_H). Landscape has a shorter band, so the same +# fractions cover more of the sheet there — this rule is conservative, never over-eager. +HUD_W, HUD_BAND = 270, 195 +HUD = [(6, 6, 156, 62), # scoreboard + the GAME/SETS panel under it + (170, 6, 264, 30)] # the BLOOD panel, clear of the quit chip + MIN_AREA, MAX_AREA = 150, 3000 # an arm blob: one pair of raised arms, or one arm ARM_H, ARM_W = (10, 70), (8, 90) # ...and its shape, in px of the 1408x768 sheet BAND = 8 # rows the background colour is sampled over @@ -138,6 +151,17 @@ def merge(boxes): return boxes +def visible(boxes, h, w): + """Drop the raisers the HUD sits on top of — see HUD above.""" + out = [] + for y0, x0, y1, x1, m in boxes: + cx, cy = (x0 + x1) / 2 / w * HUD_W, (y0 + y1) / 2 / h * HUD_BAND + if any(a <= cx <= c and b <= cy <= d for a, b, c, d in HUD): + continue + out.append([y0, x0, y1, x1, m]) + return out + + def grade(src, ref): """Per-channel histogram match: the roll's colours redistributed onto a court's own look. Returns a function, so the pair can be graded with ONE transform.""" @@ -199,7 +223,9 @@ def main(review): print(f' pose {bit + 1}: {len(arms)} arm blobs, {moved:.1f}% of the sheet ' f'(the roll itself drifted {drift:.1f}%)') boxes = merge(boxes) - rows = write_table(boxes, h, w, len(frames)) + seen = visible(boxes, h, w) + print(f' {len(boxes) - len(seen)} of {len(boxes)} raisers dropped: the HUD covers them') + rows = write_table(seen, h, w, len(frames)) both = sum(1 for r in rows if r[4] == 3) print(f'{len(rows)} spectators can move, {both} of them with both poses (a real clap)') diff --git a/assets/_crowdroll.py b/assets/_crowdroll.py index fb76375..2d294f1 100644 --- a/assets/_crowdroll.py +++ b/assets/_crowdroll.py @@ -83,7 +83,8 @@ MID = ( "standing with both arms raised straight above their heads. Redraw it EXACTLY — the same crowd, " "the same people in the same seats, the same clothes, hair, hats and colours, the same rows, " "railing, empty seats and stairways, the same lighting, pixel for pixel — WITH ONE CHANGE: " - "every spectator who is standing with their arms up has now brought their HANDS TOGETHER IN " + "every spectator who is standing with their arms up — all of them in the lower two thirds of " + "the picture — has now brought their HANDS TOGETHER IN " "FRONT OF THEIR FACE at chin height, elbows bent and pointing out to the sides, in the middle of " "a clap. They are the same standing people in the same places; only their arms have come down " "and in. Their hands and elbows still rise above the row in front of them. " @@ -94,9 +95,12 @@ CLAP = ( "This reference image is a stadium grandstand full of seated spectators. Redraw it EXACTLY — the " "same crowd, the same people in the same seats, the same clothes, hair, hats and colours, the " "same rows, railing, empty seats and stairways, the same lighting, pixel for pixel — WITH ONE " - "CHANGE: about forty of the spectators, scattered evenly all over the picture, are now ON THEIR " - "FEET APPLAUDING with both arms raised above their heads, hands together, clapping. " - "Each of those forty is the SAME PERSON as in the reference — same face, same hair, same " + "CHANGE: about sixty of the spectators are now ON THEIR FEET APPLAUDING with both arms raised " + "above their heads, hands together, clapping. " + "EVERY ONE OF THEM IS IN THE LOWER TWO THIRDS OF THE PICTURE — the rows nearest the court, " + "below the horizontal railing — spread evenly from the left edge to the right edge. NOBODY in " + "the top third of the picture stands up; those rows are exactly as they are in the reference. " + "Each of those sixty is the SAME PERSON as in the reference — same face, same hair, same " "clothing — just standing and reaching up, so their head and hands rise above the row in front. " "EVERYONE ELSE IN THE PICTURE IS COMPLETELY UNCHANGED, identical to the reference. " "The three grey-green zombie spectators do NOT move and do NOT applaud. " + STYLE diff --git a/assets/_sheet_crowd3b.png b/assets/_sheet_crowd3b.png index 5e363f9..08a6318 100644 Binary files a/assets/_sheet_crowd3b.png and b/assets/_sheet_crowd3b.png differ diff --git a/assets/_sheet_crowd3c.png b/assets/_sheet_crowd3c.png index 5e5d33a..64848b3 100644 Binary files a/assets/_sheet_crowd3c.png and b/assets/_sheet_crowd3c.png differ diff --git a/assets/x_crowd.png b/assets/x_crowd.png index 4525db7..2f95fd7 100644 Binary files a/assets/x_crowd.png and b/assets/x_crowd.png differ diff --git a/assets/x_crowd_c.png b/assets/x_crowd_c.png index 26eb549..511926a 100644 Binary files a/assets/x_crowd_c.png and b/assets/x_crowd_c.png differ diff --git a/assets/x_crowd_h.png b/assets/x_crowd_h.png index dda0b20..3d01876 100644 Binary files a/assets/x_crowd_h.png and b/assets/x_crowd_h.png differ diff --git a/index.html b/index.html index c4a1609..1c3e71f 100644 --- a/index.html +++ b/index.html @@ -664,6 +664,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat - + diff --git a/src/crowd.js b/src/crowd.js index 534a704..743d13b 100644 --- a/src/crowd.js +++ b/src/crowd.js @@ -8,138 +8,105 @@ // with no seam. See "THE CROWD SHEET" in PROJECT.md. export const FRAMES = 3; export const RAISERS = [ + [-0.0014, 0.1107, 0.0447, 0.0247, 2], + [-0.0014, 0.6458, 0.0327, 0.0560, 2], + [-0.0014, 0.7682, 0.0419, 0.0221, 2], [-0.0014, 0.8451, 0.0327, 0.0521, 3], - [0.0021, 0.6458, 0.0291, 0.0247, 2], - [0.0021, 0.7148, 0.0256, 0.0286, 1], - [0.0071, 0.9128, 0.0369, 0.0456, 1], - [0.0234, 0.5560, 0.1037, 0.0625, 3], - [0.0355, 0.6419, 0.0419, 0.0286, 3], - [0.0533, 0.7669, 0.0241, 0.0247, 1], - [0.0646, 0.7135, 0.0369, 0.0299, 1], - [0.0689, 0.0521, 0.0227, 0.0221, 1], - [0.0689, 0.0977, 0.0291, 0.0208, 2], - [0.0859, 0.7669, 0.0249, 0.0247, 1], - [0.1016, 0.2630, 0.0256, 0.0326, 3], - [0.1065, 0.8086, 0.0206, 0.0273, 2], - [0.1236, 0.7214, 0.0376, 0.0221, 1], - [0.1321, 0.0911, 0.0277, 0.0312, 2], - [0.1399, 0.8516, 0.0249, 0.0273, 3], - [0.1435, 0.1224, 0.0334, 0.0221, 1], - [0.1577, 0.1732, 0.0199, 0.0586, 1], - [0.1605, 0.5990, 0.0213, 0.0299, 2], - [0.1641, 0.8190, 0.0589, 0.0286, 2], - [0.1690, 0.0898, 0.0284, 0.0286, 2], - [0.1690, 0.3086, 0.0249, 0.0299, 2], - [0.1896, 0.7669, 0.0213, 0.0247, 1], - [0.1932, 0.1732, 0.0170, 0.0508, 1], - [0.1982, 0.5612, 0.0334, 0.0260, 2], - [0.1996, 0.0742, 0.0312, 0.0443, 3], - [0.2017, 0.5990, 0.0298, 0.0299, 3], - [0.2067, 0.3008, 0.0206, 0.0312, 2], - [0.2067, 0.7148, 0.0263, 0.0286, 1], - [0.2358, 0.0820, 0.0334, 0.0365, 2], - [0.2358, 0.6458, 0.0291, 0.0247, 2], - [0.2358, 0.8086, 0.0291, 0.0391, 2], - [0.2358, 0.8594, 0.0462, 0.0365, 3], - [0.2401, 0.7669, 0.0241, 0.0247, 1], - [0.2599, 0.5586, 0.0518, 0.0599, 1], - [0.2628, 0.1732, 0.0178, 0.0521, 1], - [0.2734, 0.6458, 0.0249, 0.0247, 2], - [0.2898, 0.7135, 0.0376, 0.0299, 1], + [0.0028, 0.7878, 0.0369, 0.0286, 2], + [0.0064, 0.3190, 0.0206, 0.0286, 3], + [0.0071, 0.9128, 0.0369, 0.0286, 3], + [0.0234, 0.5521, 0.0163, 0.0456, 1], + [0.0234, 0.9440, 0.0206, 0.0286, 2], + [0.0355, 0.6419, 0.0753, 0.0677, 3], + [0.0568, 0.8503, 0.0412, 0.0273, 1], + [0.0689, 0.3190, 0.0334, 0.0286, 2], + [0.0859, 0.7669, 0.0249, 0.0247, 2], + [0.0952, 0.5586, 0.0320, 0.0690, 3], + [0.0980, 0.9544, 0.0419, 0.0286, 2], + [0.1065, 0.8086, 0.0206, 0.0273, 3], + [0.1278, 0.6719, 0.0284, 0.0299, 2], + [0.1293, 0.5000, 0.0511, 0.0755, 1], + [0.1357, 0.7930, 0.1037, 0.0547, 3], + [0.1392, 0.9362, 0.0213, 0.0234, 2], + [0.1399, 0.3190, 0.0249, 0.0286, 2], + [0.1562, 0.6732, 0.0206, 0.0286, 2], + [0.1598, 0.9518, 0.0213, 0.0234, 2], + [0.1619, 0.6003, 0.0199, 0.0286, 2], + [0.1641, 0.8672, 0.0298, 0.0430, 2], + [0.1690, 0.9753, 0.0291, 0.0221, 2], + [0.1768, 0.7305, 0.0376, 0.0299, 1], + [0.1854, 0.5052, 0.0170, 0.0469, 1], + [0.1918, 0.5964, 0.0526, 0.0326, 2], + [0.2259, 0.4857, 0.0732, 0.0911, 3], + [0.2393, 0.8594, 0.0298, 0.0299, 2], + [0.2401, 0.7669, 0.0241, 0.0247, 3], + [0.2528, 0.9336, 0.0284, 0.0391, 3], + [0.2557, 0.7305, 0.0213, 0.0299, 1], + [0.2599, 0.5924, 0.0384, 0.0365, 2], + [0.2734, 0.6458, 0.0199, 0.0221, 2], + [0.2891, 0.8398, 0.2088, 0.1419, 3], + [0.2976, 0.6732, 0.0170, 0.0326, 2], [0.2976, 0.8086, 0.0384, 0.0286, 3], - [0.2997, 0.0326, 0.0362, 0.0651, 1], - [0.3026, 0.2253, 0.0241, 0.0247, 2], - [0.3026, 0.7669, 0.0419, 0.0286, 1], - [0.3068, 0.6458, 0.0206, 0.0247, 2], - [0.3068, 0.8828, 0.1044, 0.0755, 3], - [0.3189, 0.1732, 0.0185, 0.0482, 1], - [0.3643, 0.4883, 0.0170, 0.0781, 3], - [0.3686, 0.7148, 0.0312, 0.0286, 1], - [0.3693, 0.2878, 0.0320, 0.0260, 2], - [0.3693, 0.8138, 0.0291, 0.0378, 2], - [0.3729, 0.0977, 0.0249, 0.0208, 2], - [0.3771, 0.1732, 0.0334, 0.0885, 3], - [0.3885, 0.4883, 0.0178, 0.0729, 1], - [0.3899, 0.7669, 0.0192, 0.0247, 1], - [0.3984, 0.8503, 0.0284, 0.0234, 3], - [0.4062, 0.2604, 0.0206, 0.0247, 3], - [0.4062, 0.5755, 0.0334, 0.0638, 3], - [0.4070, 0.8086, 0.0199, 0.0273, 2], - [0.4233, 0.7148, 0.0376, 0.0286, 1], - [0.4233, 0.9271, 0.0540, 0.0352, 1], - [0.4268, 0.1914, 0.0107, 0.0417, 1], - [0.4276, 0.8438, 0.0369, 0.0534, 3], - [0.4354, 0.6523, 0.0298, 0.0286, 2], - [0.4645, 0.0286, 0.0376, 0.0612, 1], - [0.4730, 0.8216, 0.0241, 0.0260, 2], - [0.4737, 0.5534, 0.0284, 0.0456, 1], - [0.4858, 0.9232, 0.0206, 0.0286, 1], - [0.4901, 0.6315, 0.0455, 0.0443, 3], - [0.4901, 0.7669, 0.0533, 0.0247, 1], - [0.4979, 0.7148, 0.0355, 0.0286, 1], - [0.5064, 0.5755, 0.0213, 0.0234, 1], - [0.5355, 0.8086, 0.0249, 0.0286, 2], - [0.5398, 0.5586, 0.0206, 0.0404, 1], - [0.5568, 0.7148, 0.0376, 0.0286, 1], - [0.5604, 0.9128, 0.0831, 0.0495, 1], - [0.5625, 0.1497, 0.0391, 0.0312, 3], - [0.5689, 0.0977, 0.0291, 0.0208, 2], - [0.5973, 0.5586, 0.0298, 0.0247, 1], - [0.6023, 0.2630, 0.0249, 0.0221, 3], - [0.6101, 0.1185, 0.0341, 0.0339, 2], - [0.6186, 0.8516, 0.0582, 0.0299, 3], - [0.6271, 0.7669, 0.0163, 0.0247, 1], - [0.6293, 0.7214, 0.0476, 0.0221, 1], - [0.6314, 0.0846, 0.0305, 0.0378, 2], - [0.6435, 0.1224, 0.0341, 0.0221, 1], - [0.6562, 0.7526, 0.0249, 0.0391, 1], - [0.6584, 0.1732, 0.0192, 0.0586, 1], - [0.6648, 0.5612, 0.0291, 0.0260, 2], - [0.6690, 0.0898, 0.0284, 0.0286, 2], - [0.6690, 0.3021, 0.0249, 0.0365, 2], - [0.6854, 0.7565, 0.0540, 0.0352, 1], - [0.6925, 0.1732, 0.0178, 0.0508, 1], - [0.6974, 0.9271, 0.0462, 0.0352, 1], - [0.6996, 0.0742, 0.0341, 0.0443, 3], - [0.7024, 0.6458, 0.0249, 0.0286, 2], - [0.7060, 0.8529, 0.0256, 0.0260, 3], - [0.7266, 0.5586, 0.0426, 0.0430, 1], - [0.7351, 0.0820, 0.0341, 0.0365, 2], - [0.7358, 0.6458, 0.0291, 0.0247, 2], - [0.7393, 0.7669, 0.0249, 0.0286, 1], - [0.7401, 0.5977, 0.0249, 0.0208, 1], - [0.7401, 0.8398, 0.0327, 0.0273, 2], - [0.7521, 0.9128, 0.1207, 0.0456, 1], - [0.7585, 0.0430, 0.0398, 0.0247, 1], - [0.7621, 0.1732, 0.0156, 0.0521, 1], - [0.7692, 0.5755, 0.0249, 0.0221, 1], - [0.7898, 0.7135, 0.0376, 0.0299, 1], - [0.7997, 0.0326, 0.0362, 0.0651, 1], + [0.3026, 0.7682, 0.0419, 0.0273, 3], + [0.3359, 0.4844, 0.0724, 0.0911, 3], + [0.3729, 0.6602, 0.0206, 0.0312, 2], + [0.3899, 0.6003, 0.0447, 0.0391, 2], + [0.3977, 0.6523, 0.0831, 0.0638, 3], + [0.4055, 0.7669, 0.0724, 0.0690, 3], + [0.4062, 0.4857, 0.0376, 0.1133, 3], + [0.4730, 0.5534, 0.0291, 0.0508, 3], + [0.4901, 0.6458, 0.0533, 0.0560, 2], + [0.4936, 0.7044, 0.0298, 0.0247, 2], + [0.4936, 0.7669, 0.0497, 0.0247, 2], + [0.5021, 0.8503, 0.0291, 0.0312, 3], + [0.5064, 0.3190, 0.0206, 0.0286, 2], + [0.5064, 0.5755, 0.0206, 0.0234, 1], + [0.5064, 0.9049, 0.0241, 0.0260, 3], + [0.5312, 0.9141, 0.0831, 0.0690, 3], + [0.5355, 0.8086, 0.0249, 0.0286, 3], + [0.5398, 0.4922, 0.1300, 0.1367, 3], + [0.5611, 0.6719, 0.0291, 0.0299, 2], + [0.5646, 0.7878, 0.0668, 0.0391, 3], + [0.5682, 0.1562, 0.0334, 0.0247, 1], + [0.5682, 0.8776, 0.0298, 0.0221, 2], + [0.5689, 0.3190, 0.0334, 0.0286, 2], + [0.5895, 0.6732, 0.0192, 0.0286, 2], + [0.5938, 0.1107, 0.0462, 0.0312, 2], + [0.6023, 0.2643, 0.0249, 0.0208, 2], + [0.6186, 0.9362, 0.0249, 0.0365, 3], + [0.6357, 0.7227, 0.0284, 0.0208, 2], + [0.6357, 0.8516, 0.0284, 0.0273, 3], + [0.6371, 0.6458, 0.1271, 0.0703, 3], + [0.6399, 0.3190, 0.0249, 0.0286, 2], + [0.6776, 0.6003, 0.0249, 0.0286, 2], + [0.6925, 0.4870, 0.1016, 0.1146, 3], + [0.6974, 0.9271, 0.0497, 0.0456, 3], + [0.7230, 0.7669, 0.0412, 0.0312, 2], + [0.7393, 0.8672, 0.0213, 0.0234, 2], + [0.7401, 0.5990, 0.0327, 0.0299, 2], + [0.7401, 0.8398, 0.0327, 0.0273, 1], + [0.7727, 0.8086, 0.0923, 0.0729, 3], + [0.7940, 0.8828, 0.0788, 0.0586, 3], + [0.7940, 0.9440, 0.0163, 0.0286, 2], + [0.7983, 0.6732, 0.0163, 0.0326, 2], [0.8026, 0.2253, 0.0241, 0.0247, 2], - [0.8026, 0.8086, 0.0334, 0.0417, 2], - [0.8068, 0.6458, 0.0241, 0.0247, 2], - [0.8068, 0.7669, 0.0419, 0.0286, 1], - [0.8232, 0.1758, 0.0142, 0.0469, 1], - [0.8374, 0.5221, 0.0227, 0.0378, 2], - [0.8438, 0.1185, 0.0291, 0.0260, 2], - [0.8523, 0.7669, 0.0213, 0.0247, 1], - [0.8636, 0.7148, 0.0348, 0.0286, 1], - [0.8643, 0.4883, 0.0419, 0.0781, 3], - [0.8693, 0.2878, 0.0284, 0.0260, 2], - [0.8693, 0.8138, 0.0291, 0.0378, 2], - [0.8729, 0.0977, 0.0249, 0.0208, 2], - [0.8771, 0.1732, 0.0327, 0.0885, 3], - [0.8984, 0.8503, 0.0284, 0.0234, 3], - [0.9062, 0.2604, 0.0206, 0.0247, 3], - [0.9062, 0.5755, 0.0341, 0.0638, 3], - [0.9070, 0.8086, 0.0199, 0.0273, 2], - [0.9233, 0.7148, 0.0376, 0.0286, 1], - [0.9268, 0.1901, 0.0149, 0.0430, 1], - [0.9276, 0.8438, 0.0369, 0.0534, 3], - [0.9318, 0.6914, 0.0334, 0.0208, 1], - [0.9318, 0.9271, 0.0455, 0.0352, 1], - [0.9645, 0.0286, 0.0369, 0.0612, 1], - [0.9695, 0.8594, 0.0320, 0.0234, 2], - [0.9730, 0.8216, 0.0241, 0.0365, 2], - [0.9737, 0.5586, 0.0241, 0.0404, 1], + [0.8068, 0.7695, 0.0419, 0.0260, 3], + [0.8565, 0.9440, 0.0206, 0.0378, 2], + [0.8622, 0.4844, 0.0817, 0.1549, 3], + [0.8686, 0.8503, 0.0291, 0.0326, 3], + [0.8693, 0.2878, 0.0327, 0.0260, 2], + [0.8771, 0.2253, 0.0206, 0.0365, 3], + [0.8899, 0.9440, 0.0206, 0.0378, 2], + [0.8977, 0.6732, 0.0249, 0.0286, 2], + [0.8984, 0.8503, 0.0284, 0.0234, 1], + [0.9048, 0.2604, 0.0220, 0.0247, 1], + [0.9062, 0.7982, 0.0249, 0.0378, 3], + [0.9062, 0.8776, 0.0206, 0.0326, 3], + [0.9233, 0.6523, 0.0582, 0.0599, 3], + [0.9240, 0.7669, 0.0533, 0.0247, 2], + [0.9240, 0.9271, 0.0533, 0.0456, 3], + [0.9354, 0.2461, 0.0291, 0.0286, 2], + [0.9354, 0.8438, 0.0291, 0.0534, 3], + [0.9730, 0.5586, 0.0284, 0.0456, 3], + [0.9730, 0.8672, 0.0249, 0.0234, 2], ]; diff --git a/src/render.js b/src/render.js index 97067f0..e7932ca 100644 --- a/src/render.js +++ b/src/render.js @@ -235,7 +235,7 @@ function farB(z) { // Asset cache-buster — bump with main.js?v=N (see the img.src note below). EXPORTED because the // menu screens hang tags on the same files, and two copies of this number is one copy too // many: the one that does not get bumped is the one that serves a cached 404. -export const SPRV = 146; +export const SPRV = 147; // The boot bar in main.js watches this. Nothing here CHANGES when things load — every sprite was // already requested at import — it just makes the wait visible and holds the menu back until the // last sheet has landed. See the onerror note below for the other half of "sometimes missing".