Nút UI
ButtonClickAddShake → shakeGP → vibrateRepeat26. Cohort: boardOpShake=false → place im, nút vẫn rung.
Tổng hợp tầng đếm (schema / registry / cohort), nhóm sự kiện, đồ thị biên độ theo thời gian từ số đo thật, và 5 hướng chọn cho port.
01 · Đếm tầng
Mỗi tầng đếm một thứ khác. Cohort live chỉ 2 feature; số lớn là kho thí nghiệm A/B trên schema/CDN.
317
Schema gộp X / XTrait
221
Haptic theo tên feature
157
Chỉ rung (vibration)
76
Bundle CDN registry
~224
Hợp registry ∪ schema haptic
2
Cohort user hiện tại
1
Trait JS giải mã được
50
Ghép lân cận (có thể nhiễu)
| Tầng | N | Ý nghĩa |
|---|---|---|
| Schema A/B sau gộp | 317 | Mọi mục dump từ RAM schema |
| … haptic-named | 221 | 157 rung · 56 lắc màn · 7 cả hai · 1 visual |
| … ghép lân cận | 50 | Có tham số/hàm rung; có thể lẫn chuỗi kế bên |
| … Revive lắc khối | 46 | Đổi khối, không rung motor |
| CDN traits_registry | 76 | 73 có bundle trong registry |
| Cohort live (jsb) | 2 | ButtonClickAddShake + isOpenVibrate |
| JS decoded | 1 | ButtonClickAddShakeTrait (HEK còn lại) |
Server layer ~215 features; chỉ 2 haptic được gán cho cohort này. Biến thể sóng khác chỉ server có — bơm local không nạp trait nếu server không bật.
02 · Nhóm sự kiện
Cùng pipeline L3–L6, nhưng mỗi nhóm gate và waveform khác nhau.
ButtonClickAddShake → shakeGP → vibrateRepeat26. Cohort: boardOpShake=false → place im, nút vẫn rung.
Cùng trait nút; cần boardOpShake true. Cohort hiện tại tắt.
EliminationVibrationTier (L1+L6). Không trong cohort live; port hardcode 25/40/55/70 ms @255.
ShakeNativeByChangSkin → allClearShake tiers 1–6 (amp↑, ms↓, pulses=tier).
vibrateRepeatFrequency: chống dồn 25 ms; timings [0,40,25,40,25], amp 180.
sg_fkmj_* → types "1"…"5" (30–150 ms, pattern 2 nhịp).
Toggle isOpenVibrate; Cocos2dxHelper.vibrate(sec); RN VibrationModule.
shakeIOS → shakeOnceIOS(level) từ buttonClickIosShakeLevel[0|1]. Android: checkAfterIPhone13 luôn false.
03 · Sóng mạnh/yếu
Từng tab = một nhóm 01–08. Teal = gốc (dump / vibrate_feel.h). Amber nét đứt = candidate sau scaleAmp / scaleMs. Δamp / Δms hiện dưới mỗi panel. Đơn vị: amp 0–255, ms.
04 · Hướng chọn
Khuyên B cho parity cảm giác gần gốc mà không cần server gán đủ trait.
Nút theo shakeTimes/Strength cohort; place im (boardOpShake false); không clear/all-clear. Khớp máy test hiện tại, lệch GDD cảm giác xoá hàng.
Giữ sóng nút live. Thêm eliminationTierMs [25,40,55,70] và allClearShake tiers 1–6 từ cohort cũ / GDD. Đã có sẵn trong vibrate_feel.h.
Đưa bảng duration/amp/gate lên RC. Đổi cohort không ship app. Cần pipeline config + fallback khi thiếu key.
75/76 trait còn HEK. Bơm feature local không nạp trait. Chỉ lấy thêm khi server chia cohort rồi quét RAM.
Một amp/ms cho mọi event, hoặc tôn trọng toggle off. Nhanh nhưng lệch feel gốc rõ.
Port hiện tại đi hướng B: nút từ trait cohort + clear/all-clear hardcode trong core.
05 · Giới hạn
| Rủi ro | Hệ quả |
|---|---|
| 50 mục "ghép lân cận" | Có thể lẫn chuỗi RAM kế bên — không coi là 50 sóng chắc. |
| 224 ≠ 224 sóng trên 1 máy | Cohort chỉ 2; còn lại là kho thí nghiệm server. |
| HEK trait | Không bẻ khoá; không claim đã có logic 75 trait còn lại. |
| OS + motor | Cùng waveform app; cảm giác tay khác theo máy / scale OS. |
| iOS IPA chưa có | Simulator boot sẵn; dump static khi có IPA trong ref_ipa/. |
Dump Frida trên máy thật: organic PlayHaptic, map level→UIImpact, 26 feature A/B cohort, và force continuous Core Haptics.
01 · Đếm tầng
Discrete đi PlayHaptic: → UIImpactFeedbackGenerator. Continuous đi HSHapticsInterface (app ≥ 6.9.9). Cohort iOS dump này = 26 feature — rộng hơn Android live (2).
365
Organic PlayHaptic (120s)
236
Level 1 · Light
53
Level 2 · Medium
73
Level 3 · Heavy
3
Level 4–5 · Soft/Rigid
26
A/B feature cohort
184
Trait tên (CDN hash rỗng)
1+1
Force continuous play+stop
| Tầng | N | Ý nghĩa |
|---|---|---|
| Organic PlayHaptic | 365 | Chơi tay 120s · attach-reuse · shakeSwitch ON |
| initWithStyle + impactOccurred | 365 + 365 | Mỗi PlayHaptic tạo generator rồi impact |
| Continuous organic (cửa sổ put/clear) | 0 | Không gọi trong cửa sổ đo |
| Continuous force | 2 | 1 play + 1 stop · ClearBoardFeedbackTier params |
| A/B haptic cohort | 26 | ios/logic/ab_configs.json |
| traits_registry | 184 | Chỉ tên; hash CDN rỗng trên iOS RAM |
| shakeStyle active | 2 | startShake.shakeLev=3 |
organic OK: 365 PlayHaptic in 120.0s attach-reuse (levels {'3': 73, '1': 236, '2': 53, '4': 1, '5': 2}); shakeSwitch ON; continuous=0 in this window.
02 · Nhóm sự kiện
User hiện tại: startShake.shakeLev=3 → style index 2. Level 0 = tắt điểm đó.
RootViewController +PlayHaptic: → UIImpactFeedbackGenerator style (N−1) → impactOccurred.
vibrateByType → shakeWays[type−1] → shakeOnceIOS(level). Bảng dưới.
ButtonClickAddShake · shakeLevel:[4,2] · boardOpShake:false. Index mảng theo checkAfterIPhone13 (xem §06).
EliminationVibrationTier + ClearVibrationRhythm + combo screen shake — cohort có đủ.
ClearBoardFeedbackTier → Core Haptics intensity/sharpness/duration (≥ 6.9.9). Organic cửa sổ put/clear = 0; force đã xác nhận IMP.
isOpenVibrate + MMKV block-blast-shakeSwitch=true. Continuous thêm gate version app.
| # | ShakePoint | level | UIImpact |
|---|---|---|---|
| 1 | TAPBLOCK | 0 (tắt) | — |
| 2 | PUTBLOCK | 1 | Light |
| 3 | REMOVEBLOCK | 1 | Light |
| 4 | RECORDBREAK | 3 | Heavy |
| 5 | BUTTONCLICK | 0 (tắt) | — |
| 6 | MULTICLEAR | 2 | Medium |
| 7 | COMBO | 2 | Medium |
| 8 | CLEARALL | 5 | Rigid |
| 9 | COLLECT | 4 | Soft |
| 10 | MOVEREMOVE | 4 | Soft |
| 11 | SCROLLSCORE | 1 | Light |
| 12 | TARGETSHOW | 2 | Medium |
| 13 | TARGETOVER | 4 | Soft |
| 14 | MOSAICANIM | 1 | Light |
| 15 | RECOVERCDTIME | 4 | Soft |
03 · Level → style
Force calib Frida. Không phải waveform ms/amp Android.
| level | style | tên | organic count |
|---|---|---|---|
| 1 | 0 | Light | 236 |
| 2 | 1 | Medium | 53 |
| 3 | 2 | Heavy | 73 |
| 4 | 3 | Soft | 1 |
| 5 | 4 | Rigid | 2 |
04 · A/B cohort
Không phải kho schema 200+ — đây là cohort live trên tiến trình dump. So Android live chỉ 2 feature.
| feature_key | id | props chính |
|---|---|---|
| startShake | 421001 | firing=1, shakeLev=3 |
| continueShake | 910001 | |
| ButtonClickAddShake | 331749003 | boardOpShake=!1, shakeLevel=[ 4 |
| DragBlockHapticFeedback | 332815001 | goodPlacementBorderRateThreshold=80, noEliminateConfirmFeedbackEnabled=!0, prePlacementFeedbackMode=0, processVibrationLevels=1, reentryTriggerMode=0, resultVibrationLevels=1 |
| ReviveChangeAllBlockByShake | 331428002 | isAlgorithmType=!1 |
| ClassSplashRollVibrate | 333691005 | newVibrationFeatureEnabled=!0, openingScrollVibrationStep=2, settlementRollVibrationStep=1, vibrationIntensityLevel=2 |
| ClearVibrationRhythm | 19454001 | vibrationInterval=100, vibrationWeakRatio=.5 |
| HapticTriggerEdgePlacementHapticBoost | 333960003 | edgeRateThreshold=.5, strengthParamet=2 |
| AdsorptionVibration | 331134001 | |
| HapticTriggerCorrectPlacementHapticBoost | 333963002 | strengthParamet=3 |
| HapticTriggerBlockPlacementEdgeHapticBoost | 333999002 | edgeRateThreshold=.5, strengthParamet=3 |
| HapticTriggerBlockPlacementOptimalHapticBoost | 334000002 | strengthParamet=3 |
| HapticTriggerThinkSolveSuccessHapticTrigger | 334020001 | isExclusiveWithClearCount=!0, thinkSeconds=8, vibrationCount=2, vibrationIntensity=3 |
| ClearBoardFeedbackTier | 332201001 | animationTimeScale=.45, highScoreThreshold=1e4, midScoreThreshold=5e3, shakeDuration=.5, shakeIntensity=1, shakeSharpness=.1 |
| ClickVibrationFeedback | 334618003 | triggerScope=1, vibrationIntensity=0 |
| FeedbackVibrate | 331497001 | clearBoardShakeScreenCount=1, clearBoardVibrationCount=3, clearBoardVibrationStrength=1, clearBoardVibrationType="light", highScoreShakeScreenCount=1, highScoreVibrationCount=3… |
| VibrationProjectFruit | 333973001 | fruitHecheng=[ 3, fruitOnBottom=[ 5, fruitOnFruit=[ 5, hechengNewFruit=[ 3, winBestScore=[ 1, winCrown=[ 3… |
| ComboShakeScreen | 331403004 | eliminateTimes=1 |
| SoundVibrationRecovery | 334371002 | scene1Enabled=1, scene2Enabled=0, scene3Enabled=0 |
| PrecisionPlaceShake | 333340001 | mergeIntervalMs=200, planType=0 |
| ComboClearShakeTier | 334307003 | bigClearSegmentation="ibU\5µkÿ<2 N/2:_¦^0.5/3:_¦^1/4:_¦^2/e"5:_¦^3 ÿ", comboSegmentation=":SôRµkÿ1 N/2-3:_¦^0.5/4-6:_¦^1/7-9:_¦^2/10+:_¦^3 ÿ", conflictRule="ÖSØ:_¦^", intensityLevels="5µkÿ N¨R/:_¦^0.5/:_¦^1/:_¦^2/:_¦^3 ÿ" |
| isOpenVibrate | 167900002 | defaultStatus=1, firing=1 |
| extComboShake | 227200001 | |
| ShakeNativeByChangSkin | 328856001 | shakeDelay=800, shakeMaxCount=6, shakeMsTime=200, shakeType=0 |
| SetShakeBar | 330606001 | stayTime=1.5 |
| EliminationVibrationTier | 334583004 | comboBonusThresholds=[ 4, multiClearLineThreshold=4, vibrationDurations=[ 25 |
05 · Continuous
Không có envelope ms/amp Android. Tham số: intensity · sharpness · duration · threaded · fullIntensity.
1
intensity
0.1
sharpness
0.5s
duration
true
threaded
false
fullIntensity
| Mục | Giá trị |
|---|---|
| Sample AB | ClearBoardFeedbackTier |
| Class / sel | HSHapticsInterface +playContinuousHaptics:sharpness:duration:threaded:fullIntensity: |
| Events | 1 play + 1 stopHapticsEngine |
| Jsonl | ios/logic/haptic_calls_continuous_force.jsonl |
| Gate JS | deviceInfo.isMoreThanVersion("6.9.9") + shakeSwitch |
| RVC JSON bridge | Absent trên build này — sink = float API HSHapticsInterface |
Forced HSHapticsInterface +playContinuousHaptics:sharpness:duration:threaded:fullIntensity: (RootViewController JSON bridge absent). Defaults match ClearBoardFeedbackTier AB (shakeIntensity=1, shakeSharpness=0.1, shakeDuration=0.5).
06 · Phân đoạn máy
Bằng chứng từ dump + module: cohort theo feature server; model chỉ ảnh hưởng chọn phần tử mảng level nút — không phải bucket A/B riêng.
Máy dump nhận 26 feature_key trong ab_configs.json (ug/get_universal_data). Không thấy key/bucket theo model (iPhone14, iPhone15…). Trait CDN hash rỗng — không đọc được thân trait remote để tìm nhánh model.
NativeVibrator.playContinuousHaptics / stopHapticsEngine chỉ chạy khi deviceInfo.isMoreThanVersion("6.9.9"). Đây là version app, không phải model.
Android docs: buttonClickIosShakeLevel[0|1] — dùng [1] nếu checkAfterIPhone13(), không thì [0]. Cohort iOS có shakeLevel:[4,2]. Không phải split feature A/B theo model.
Trên Android, checkAfterIPhone13 luôn false — path iOS level không chạy.
Không tìm thấy chuỗi model/utsname/deviceModel trong 8 module JS carve. Phân đoạn model (nếu có) nằm server-side hoặc trong trait HEK chưa giải mã.
07 · Giới hạn
| Rủi ro | Hệ quả |
|---|---|
| 184 trait hash rỗng | Chỉ có tên; không claim đã có logic 184 trait. |
| Continuous organic = 0 | Cửa sổ put/clear không gọi; force mới xác nhận path. |
| Float SIMD hook | Intensity/sharpness không đọc từ args arm64 — số lấy từ force payload. |
| 1 máy / 1 cohort | 26 feature là cohort máy dump — máy khác có thể khác. |
| HEK trait body | Không bẻ khoá; ButtonClickAddShakeTrait iOS chưa carve đủ như Android. |