@realnation/builder-shared-sdk 2.7.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../../src/gamepad/controls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,mFAAmF;AACnF,eAAO,MAAM,aAAa,uEAAwE,CAAC;AAEnG;;;;GAIG;AACH,eAAO,MAAM,eAAe,+OAoBlB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AACzD,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAC7D,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,aAAa,CAAC;AAEtD,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAA2C,CAAC;AAE5F,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;CACf;AAsCD,eAAO,MAAM,QAAQ,EAAE,SAAS,iBAAiB,EAOhD,CAAC;AAKF,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,iBAAiB,CAIlE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAEpE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,IAAI,WAAW,CAEpE"}
1
+ {"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../../src/gamepad/controls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,mFAAmF;AACnF,eAAO,MAAM,aAAa,uEAAwE,CAAC;AAEnG;;;;GAIG;AACH,eAAO,MAAM,eAAe,+OAoBlB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AACzD,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAC7D,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,aAAa,CAAC;AAEtD,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAA2C,CAAC;AAE5F,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;CACf;AAqDD,eAAO,MAAM,QAAQ,EAAE,SAAS,iBAAiB,EAOhD,CAAC;AAKF,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,iBAAiB,CAIlE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAEpE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,IAAI,WAAW,CAEpE"}
@@ -49,6 +49,20 @@ export const CONTROL_NAMES = [...AXIS_CONTROLS, ...BUTTON_CONTROLS];
49
49
  */
50
50
  const AXIS_BASE = 1001;
51
51
  const BUTTON_BASE = 1011;
52
+ /**
53
+ * 下拉里给运营看的名字。**与上面的 name 刻意不一致**(PF 2026-09-22)。
54
+ *
55
+ * name 是平台内部的角色名,档案按它映射按键,改它会动到导出的类型;label 只管一件事:
56
+ * 运营拿着方向盘的时候,能不能在下拉里一眼找到手上按的那个键。所以:
57
+ *
58
+ * - 背面四个用 `L1 / R1 / L2 / R2`。这是手柄行业的通用叫法,比原来自创的
59
+ * Paddle / Shoulder 通用,而且原来那个区分根本不存在——实测两次都落在同一对物理键上
60
+ * (换挡拨片就是 L2 / R2,见 profiles.ts)。
61
+ * - 正面四个用符号。Builder 的下拉**不可能知道现场插哪只盘**(配活动时设备还不在),
62
+ * 所以没有任何一种标签能对所有型号都准;既然如此,就对着我们实际在用的那只盘做到最好用。
63
+ * 词 + 符号并写:光一个 `△` 在下拉收起来时像渲染坏了,而且打不出来、搜不到;
64
+ * Inter 也确实没有这四个字形(2026-09-22 实测,会回退到系统字体),带着词就不怕它糊。
65
+ */
52
66
  const LABELS = {
53
67
  'wheel-left': 'Wheel Left',
54
68
  'wheel-right': 'Wheel Right',
@@ -58,18 +72,19 @@ const LABELS = {
58
72
  start: 'Wheel Start',
59
73
  select: 'Wheel Select',
60
74
  home: 'Wheel Home',
61
- 'paddle-left': 'Paddle Left',
62
- 'paddle-right': 'Paddle Right',
75
+ 'paddle-left': 'L2',
76
+ 'paddle-right': 'R2',
63
77
  'dpad-up': 'D-pad Up',
64
78
  'dpad-down': 'D-pad Down',
65
79
  'dpad-left': 'D-pad Left',
66
80
  'dpad-right': 'D-pad Right',
67
- 'action-1': 'Action 1',
68
- 'action-2': 'Action 2',
69
- 'action-3': 'Action 3',
70
- 'action-4': 'Action 4',
71
- 'shoulder-left': 'Shoulder Left',
72
- 'shoulder-right': 'Shoulder Right',
81
+ // 符号与位置的对应实测自 PS3/PC Wheel:△ 上、○ 右、✕ 下、□ 左(见 profiles.ts 的注释)
82
+ 'action-1': 'Cross (✕)',
83
+ 'action-2': 'Circle (○)',
84
+ 'action-3': 'Square (□)',
85
+ 'action-4': 'Triangle (△)',
86
+ 'shoulder-left': 'L1',
87
+ 'shoulder-right': 'R1',
73
88
  'aux-1': 'Aux 1',
74
89
  'aux-2': 'Aux 2',
75
90
  'aux-3': 'Aux 3',
@@ -15,7 +15,7 @@ export { createGamepad, GamepadSession, explainGamepadMiss } from './session.js'
15
15
  export type { AxesUpdate, CreateGamepadOptions, GamepadMissReason, GamepadState, GamepadStatus, Unsubscribe, } from './session.js';
16
16
  export { AXIS_CONTROLS, BUTTON_CONTROLS, CONTROLS, CONTROL_NAMES, controlByCode, controlByName, controlCode, isAxisControl, isControlCode, } from './controls.js';
17
17
  export type { AxisControl, ButtonControl, ControlDefinition, ControlName } from './controls.js';
18
- export { DEFAULT_THRESHOLDS, releaseAll, resolveThresholds, stepSignals } from './signals.js';
18
+ export { DEFAULT_THRESHOLDS, releaseAll, resolveThresholds, SENSITIVITY_MAX, SENSITIVITY_MIN, sensitivityFactor, stepSignals, } from './signals.js';
19
19
  export type { ControlEvent, ControlReading, SignalState, Thresholds } from './signals.js';
20
20
  export { PROFILES, matchProfile, selectDevice } from './profiles.js';
21
21
  export type { GamepadProfile, ProfileLookup, ProfileMatch } from './profiles.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gamepad/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACjF,YAAY,EACV,UAAU,EACV,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,WAAW,GACZ,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,aAAa,EACb,eAAe,EACf,QAAQ,EACR,aAAa,EACb,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEhG,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9F,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1F,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACrE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEjF,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC1G,YAAY,EACV,WAAW,EACX,OAAO,EACP,aAAa,EACb,cAAc,EACd,WAAW,EACX,UAAU,GACX,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC5E,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gamepad/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACjF,YAAY,EACV,UAAU,EACV,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,WAAW,GACZ,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,aAAa,EACb,eAAe,EACf,QAAQ,EACR,aAAa,EACb,aAAa,EACb,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEhG,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1F,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACrE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEjF,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC1G,YAAY,EACV,WAAW,EACX,OAAO,EACP,aAAa,EACb,cAAc,EACd,WAAW,EACX,UAAU,GACX,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC5E,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
@@ -13,7 +13,7 @@
13
13
  */
14
14
  export { createGamepad, GamepadSession, explainGamepadMiss } from './session.js';
15
15
  export { AXIS_CONTROLS, BUTTON_CONTROLS, CONTROLS, CONTROL_NAMES, controlByCode, controlByName, controlCode, isAxisControl, isControlCode, } from './controls.js';
16
- export { DEFAULT_THRESHOLDS, releaseAll, resolveThresholds, stepSignals } from './signals.js';
16
+ export { DEFAULT_THRESHOLDS, releaseAll, resolveThresholds, SENSITIVITY_MAX, SENSITIVITY_MIN, sensitivityFactor, stepSignals, } from './signals.js';
17
17
  export { PROFILES, matchProfile, selectDevice } from './profiles.js';
18
18
  export { decodeHat, deviceKey, normalizeBinding, parseDeviceIdentity, readBinding } from './normalize.js';
19
19
  export { LiveGamepadSource, MockGamepadSource, mockPad } from './source.js';
@@ -80,4 +80,8 @@ export declare function releaseAll(previous: SignalState): {
80
80
  state: SignalState;
81
81
  events: ControlEvent[];
82
82
  };
83
+ export declare const SENSITIVITY_MIN = 1;
84
+ export declare const SENSITIVITY_MAX = 10;
85
+ /** 这一档等于设备档案出厂手感的多少倍。超出 1-10 的输入按中间档处理。 */
86
+ export declare function sensitivityFactor(level: number): number;
83
87
  //# sourceMappingURL=signals.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../src/gamepad/signals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,eAAe,CAAC;AAG9D,MAAM,WAAW,UAAU;IACzB,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,kBAAkB,EAAE,UAOhC,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAE7E;AAED,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,kFAAkF;AAClF,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAE1E,eAAO,MAAM,kBAAkB,EAAE,WAAgB,CAAC;AAElD,wBAAgB,YAAY,IAAI,cAAc,CAE7C;AAqDD;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,cAAc,EACvB,UAAU,GAAE,UAA+B,GAC1C;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,YAAY,EAAE,CAAA;CAAE,CAmBhD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,WAAW,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,YAAY,EAAE,CAAA;CAAE,CAMhG"}
1
+ {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../src/gamepad/signals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,eAAe,CAAC;AAG9D,MAAM,WAAW,UAAU;IACzB,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,kBAAkB,EAAE,UAOhC,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAE7E;AAED,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,kFAAkF;AAClF,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAE1E,eAAO,MAAM,kBAAkB,EAAE,WAAgB,CAAC;AAElD,wBAAgB,YAAY,IAAI,cAAc,CAE7C;AAqDD;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,cAAc,EACvB,UAAU,GAAE,UAA+B,GAC1C;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,YAAY,EAAE,CAAA;CAAE,CAmBhD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,WAAW,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,YAAY,EAAE,CAAA;CAAE,CAMhG;AAeD,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,2CAA2C;AAC3C,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIvD"}
@@ -115,3 +115,24 @@ export function releaseAll(previous) {
115
115
  }
116
116
  return { state: EMPTY_SIGNAL_STATE, events };
117
117
  }
118
+ /**
119
+ * 运营配的灵敏度(1-10)换成阈值倍率。
120
+ *
121
+ * 倍率越小越灵敏(阈值越低,越早算按下)。`5` 必须正好是 `1.0`,也就是「不覆盖,用设备
122
+ * 档案自己的值」。乘在**档案的阈值**上而不是一组写死的数字上:900 度与 270 度的方向盘,
123
+ * 同样「正常」对应的行程完全不同,这样换一只盘、同一个活动还是正常。
124
+ *
125
+ * 放在 SDK 而不是各端各写一份:runner 拿它算真的阈值,Builder 拿它在字段说明里报出
126
+ * 「这一档相当于出厂手感的百分之多少」(设计系统 module-config §12 要求抽象档位必须报出
127
+ * 换算值)。两边抄两份的话,数字一旦不一致,Builder 的提示就会说谎。
128
+ */
129
+ const SENSITIVITY_FACTORS = [2.5, 2.0, 1.6, 1.3, 1.0, 0.85, 0.72, 0.6, 0.5, 0.4];
130
+ export const SENSITIVITY_MIN = 1;
131
+ export const SENSITIVITY_MAX = 10;
132
+ /** 这一档等于设备档案出厂手感的多少倍。超出 1-10 的输入按中间档处理。 */
133
+ export function sensitivityFactor(level) {
134
+ if (!Number.isFinite(level))
135
+ return 1;
136
+ const index = Math.round(level) - SENSITIVITY_MIN;
137
+ return SENSITIVITY_FACTORS[index] ?? 1;
138
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@realnation/builder-shared-sdk",
3
- "version": "2.7.0",
3
+ "version": "2.8.0",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "exports": {