style(胎动): 连踢「噔噔噔噔」每一拍都清楚踢出褶皱 (v26100411)

- 连踢时褶皱回落加快(4.2/s),拍与拍之间退平,不再糊成一片
- 每拍力度加大,褶皱落点略偏
- 4 下快连踢权重最高;26~33 周连踢概率 50%→60%,34 周起 22%→35%

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-04 03:04:40 +00:00
parent 6c656ecc28
commit 2a95a5f3b9
3 changed files with 11 additions and 9 deletions

View File

@@ -81,12 +81,13 @@
const STAGES = {
// drum:原地带节奏连踢的概率;chain:踢完不歇、旁边紧接着再踢的概率,最多连 chainMax 下(2026-10-04 用户:「有时会带点节奏、可以连续踢」)
flutter: { order: ['flick', 'flick', 'tap', 'flick'], gap: [10, 18], kick: false, again: 0, double: .45, follow: false, drum: 0, chain: 0 },
active: { order: ORDER, gap: [4, 8], kick: true, again: .34, double: 0, follow: true, drum: .5, chain: .3, chainMax: 3 },
late: { order: ['roll', 'butt', 'foot', 'roll', 'knee'], gap: [7, 12], kick: false, again: .15, double: 0, follow: true, slow: true, drum: .22, chain: .15, chainMax: 2 }
active: { order: ORDER, gap: [4, 8], kick: true, again: .34, double: 0, follow: true, drum: .6, chain: .3, chainMax: 3 },
late: { order: ['roll', 'butt', 'foot', 'roll', 'knee'], gap: [7, 12], kick: false, again: .15, double: 0, follow: true, slow: true, drum: .35, chain: .15, chainMax: 2 }
};
// 原地连踢的节奏型(每拍间隔,秒):匀速「哒哒哒」、「哒哒—哒」、「哒—哒哒」、两下一组
// 2026-10-04 加了「噔噔噔」快连踢(.22~.26 秒一下),出现机会最大
const RHYTHMS = [[.24, .24, .24], [.22, .22, .22, .22], [.26, .26, .26], [.42, .42, .42], [.3, .3, .75, .3], [.6, .28, .28], [.38, .38, .38, .38]];
// 「噔噔噔噔」4 下快连踢放了 3 份,最常出现
const RHYTHMS = [[.24, .24, .24, .24], [.22, .22, .22, .22], [.26, .26, .26, .26], [.24, .24, .24], [.42, .42, .42], [.3, .3, .75, .3], [.38, .38, .38, .38]];
const dbgWeek = (location.href.match(/bumpweek=(\d+)/) || [])[1];
let week = dbgWeek ? +dbgWeek : (window.__mbPreg ? window.__mbPreg.week : null);
const stageOf = w => w == null || w < 20 ? null : w < 26 ? STAGES.flutter : w < 34 ? STAGES.active : STAGES.late;
@@ -225,7 +226,7 @@
const inChain = ft.chained || ft.chainLeft > 0;
if (inChain && !P.roll) ft.dur = (1.1 + Math.random() * .6) * (stage && stage.slow ? 1.3 : 1);
// 原地连踢:脚丫 / 拳头 / 膝盖才有;晚期节奏放慢 1.4 倍。拍子排在第一下顶起来之后,整段时长跟着拉长
ft.beats = null; ft.beat = 0; ft.pop = 0; ft.wp = 0; ft.wseed = Math.random() * 1000;
ft.beats = null; ft.beat = 0; ft.pop = 0; ft.wp = 0; ft.wrot = 0; ft.wseed = Math.random() * 1000;
if (!inChain && stage && stage.drum && !P.roll && !P.soft && P !== PARTS.kick && Math.random() < stage.drum) {
const r = RHYTHMS[Math.random() * RHYTHMS.length | 0], m = stage.slow ? 1.4 : 1;
let t = .7; ft.beats = r.map(d => (t += d * m));
@@ -330,7 +331,8 @@
/* ---------- 物理 ---------- */
function step(dt) {
if (ft.wp > 0) ft.wp = Math.max(0, ft.wp - dt * 1.4);
// 连踢时褶皱回落得快(0.24 秒基本退平),每一拍才是清楚的一下「噔」;单踢慢慢退
if (ft.wp > 0) ft.wp = Math.max(0, ft.wp - dt * (ft.beats ? 4.2 : 1.4));
if (mode === 'wait') {
if (active() && idle()) { wait -= dt; if (wait <= 0) appear(); }
} else if (mode === 'show') {
@@ -348,7 +350,7 @@
ft.beat++; ft.h.vel -= 85; ft.pop = .12;
ft.ox += (Math.random() - .5) * 10; ft.oy += (Math.random() - .5) * 10;
}
if (ft.pop > 0 && (ft.pop -= dt) <= 0) { ft.h.vel += stage && stage.slow ? 95 : 150; ft.wp = 1; ft.wseed += 7.3; } // 每一拍褶皱重新被踢出来
if (ft.pop > 0 && (ft.pop -= dt) <= 0) { ft.h.vel += stage && stage.slow ? 110 : 180; ft.wp = 1; ft.wrot = (ft.wrot || 0) + (Math.random() - .5) * .35; } // 每一拍褶皱重新被踢出来,落点略偏一点
}
if (u > ft.dur) {
// 连续踢:这一下收得快一点,旁边紧接着再来,不等下一个间隔
@@ -505,7 +507,7 @@
if (H > .1) {
const P = ft.part, sp = ft.spread.v, k = Math.min(H / 9, 1.3) / sp;
// 2026-10-04 用户:「踢屏幕时前面要有比较明显的褶皱;连续踢就连续被踢出褶」—— 小鱼泡泡(早期)不出褶
if (!P.soft) wrinkles(ft.x + ft.ox + ox, ft.y + ft.oy + oy, P.rx * sp, P.ry * sp, ft.ang + (mode === 'show' ? ft.wob : 0), Math.min(H / P.amp, 1.2), ft.wp || 0, ft.wseed || 0);
if (!P.soft) wrinkles(ft.x + ft.ox + ox, ft.y + ft.oy + oy, P.rx * sp, P.ry * sp, ft.ang + (ft.wrot || 0) + (mode === 'show' ? ft.wob : 0), Math.min(H / P.amp, 1.2), ft.wp || 0, ft.wseed || 0);
blob(ft.x + ft.ox + ox, ft.y + ft.oy + oy, P.rx * sp, P.ry * sp, ft.ang + (mode === 'show' ? ft.wob : 0), [
// 2026-10-04 用户:「凸起就行,不要变颜色(之前踢完泛浅红)」—— 只留中性灰的背光阴影 + 白高光,不带任何暖色
[.16, .22, 1.02, 'rgba(70,62,58,' + (.1 * k).toFixed(3) + ')'],