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.
00 · Giải thích dễ hiểu
Đọc phần này trước bảng kỹ thuật. Câu chuyện chỉ về rung khi bấm nút UI trên iOS (ButtonClickAddShake), đã chứng minh trên máy jailbreak.
Server không gửi hai feature riêng cho máy cũ / máy mới. Nó gửi một cấu hình live id 331749003 với shakeLevel: [4, 2]. Số đầu = Soft (level 4). Số sau = Medium (level 2). Máy tự chọn đúng ô theo tuổi model.
App đọc chuỗi model kiểu iPhoneM,N từ hs.deviceInfo.data.device_model (không đọc utsname). Lấy số major trước dấu phẩy. Major ≥ 13 → lấy ô thứ hai (Medium 2). Major < 13 → lấy ô thứ nhất (Soft 4). Hàm tên checkAfterIPhone13.
Máy jailbreak đo được: iPhone10,5 → major 10 → cửa false → index 0 → level 4 Soft. Khi chơi tay, path thật đã bắn 1 lần PlayHaptic: level 4 Soft (không phải đường startShake, vì style2 tắt điểm BUTTONCLICK).
Cùng cohort server [4, 2], iPhone major ≥ 13 lấy ô [1] → level 2 Medium. Cùng một feature, cùng một mảng — chỉ đổi index theo model. Catalogue RAM còn biến thể [1, 1] (Light/Light) nhưng không phải arm live của máy này.
| Ai | Model ví dụ | Gate | Ô lấy | Cảm giác |
|---|---|---|---|---|
| Máy cũ / JB dump | iPhone10,5 | false | [0] = 4 | Soft |
| Máy mới (proxy) | major ≥ 13 | true | [1] = 2 | Medium |
| Android APK | — | luôn false | path iOS level không chạy | dùng pipeline Android |
Bằng chứng: carve gate + device_model_probe.json + organic Soft-4 trong button_click_path_hit.json. Chi tiết kỹ thuật: mục 07 · Phân đoạn máy và ios/docs/HAPTIC-SERVER.md.
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 live id 331749003 · server shakeLevel:[4,2] · boardOpShake:false. Gate: device_model major≥13 → index 1 else 0. JB dump iPhone10,5 → level 4 Soft. Catalogue khác: [1,1] (xem HAPTIC-SERVER.md).
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 · Sóng param
Không phải envelope vibrator_manager. Teal = proxy amp/ms từ level UIImpact / Core Haptics / AB props. Amber nét đứt = candidate sau scaleAmp/scaleMs. Đơn vị minh họa: amp 0–255, ms.
04 · 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 |
05 · 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 |
06 · 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).
07 · 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 (ab_configs.json / local_mirror.json). Không có bucket A/B theo model. Model chỉ chọn index shakeLevel nút. Map sink: HAPTIC-SERVER.md.
NativeVibrator.playContinuousHaptics / stopHapticsEngine chỉ chạy khi deviceInfo.isMoreThanVersion("6.9.9"). Đây là version app, không phải model.
Live heap: đọc hs.deviceInfo.data.device_model (iPhoneM,N), Number(major) ≥ 13 → index [1], không thì [0]. Không dùng utsname. Cohort live shakeLevel:[4,2] — không phải bucket A/B theo model.
Máy dump iPhone10,5 → gate false → level 4 Soft. Android APK: checkAfterIPhone13 luôn false — path iOS level không chạy.
Gate body: ios/logic/modules/ButtonClickAddShakeTrait.js + ios/docs/HAPTIC-SERVER.md. Catalogue RAM còn arm [1,1] (không live). Path live: organic 1× Soft level 4 (button_click_path_hit.json); style2 BUTTONCLICK=0 nên không phải startShake.
08 · 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á 184 trait. ButtonClick gate methods đã carve; full twin Android vẫn thiếu. |