@myclaw163/clawclaw-cli 0.6.76 → 0.6.78
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.
- package/README.md +387 -387
- package/bin/clawclaw-cli.mjs +3 -3
- package/package.json +48 -48
- package/personas//347/220/206/346/231/272/346/270/251/345/222/214.md +23 -23
- package/personas//350/200/201/350/260/213/346/267/261/347/256/227.md +22 -22
- package/personas//350/257/232/346/201/263/347/233/264/347/216/207.md +22 -22
- package/personas//350/275/273/346/235/276/346/264/273/346/263/274.md +22 -22
- package/personas//351/207/216/346/200/247/345/217/233/351/200/206.md +23 -23
- package/scripts/check-skill-command-surface.mjs +116 -116
- package/scripts/find-hide-spots.py +157 -157
- package/scripts/postinstall.mjs +20 -20
- package/scripts/sync-bundled-skill.mjs +254 -245
- package/scripts/sync-bundled-skill.test.mjs +152 -152
- package/skills/clawclaw/SKILL.md +248 -248
- package/skills/clawclaw/references/CHATTERBOX.md +141 -141
- package/skills/clawclaw/references/COMMANDS.md +160 -160
- package/skills/clawclaw/references/GAME-MECHANICS.md +188 -188
- package/skills/clawclaw/references/HUB.md +48 -48
- package/skills/clawclaw/references/KNOWLEDGE.md +42 -42
- package/skills/clawclaw/references/STRATEGIES.md +59 -59
- package/skills/clawclaw/references/STREAM.md +93 -93
- package/skills/clawclaw/references/TACTICS.md +65 -65
- package/src/assets/clawclaw-ascii-map.txt +40 -40
- package/src/cli.ts +112 -112
- package/src/commands/_schema.ts +124 -124
- package/src/commands/account.ts +209 -209
- package/src/commands/data.test.ts +33 -33
- package/src/commands/data.ts +22 -22
- package/src/commands/do.test.ts +84 -84
- package/src/commands/do.ts +130 -130
- package/src/commands/events.test.ts +100 -100
- package/src/commands/events.ts +250 -250
- package/src/commands/game-map.test.ts +28 -28
- package/src/commands/game-start-plan.test.ts +84 -84
- package/src/commands/game.ts +1113 -1113
- package/src/commands/history-player.test.ts +102 -102
- package/src/commands/history.ts +573 -573
- package/src/commands/hub.test.ts +96 -96
- package/src/commands/hub.ts +234 -234
- package/src/commands/knowledge.test.ts +13 -13
- package/src/commands/knowledge.ts +139 -139
- package/src/commands/load.test.ts +51 -51
- package/src/commands/load.ts +13 -13
- package/src/commands/meeting-history.test.ts +106 -106
- package/src/commands/memory.ts +40 -40
- package/src/commands/peek.ts +45 -45
- package/src/commands/persona.ts +57 -57
- package/src/commands/setup/codex.ts +266 -266
- package/src/commands/skill.ts +128 -128
- package/src/commands/state.ts +46 -46
- package/src/commands/strategy.test.ts +153 -153
- package/src/commands/strategy.ts +183 -183
- package/src/commands/tts.ts +128 -128
- package/src/commands/upgrade.test.ts +82 -82
- package/src/commands/upgrade.ts +148 -148
- package/src/commands/watch.test.ts +999 -999
- package/src/commands/watch.ts +660 -660
- package/src/lib/auth.test.ts +86 -86
- package/src/lib/auth.ts +223 -223
- package/src/lib/command-meta.ts +37 -37
- package/src/lib/game-client.ts +403 -403
- package/src/lib/game-context.ts +92 -92
- package/src/lib/http-keepalive.ts +15 -15
- package/src/lib/http-transport.test.ts +42 -42
- package/src/lib/http-transport.ts +113 -113
- package/src/lib/hub-client.test.ts +56 -56
- package/src/lib/hub-client.ts +88 -88
- package/src/lib/hub-install.test.ts +98 -98
- package/src/lib/hub-install.ts +160 -160
- package/src/lib/hub-reminder.ts +78 -78
- package/src/lib/hub-unzip.test.ts +69 -69
- package/src/lib/hub-unzip.ts +62 -62
- package/src/lib/init-command.test.ts +75 -75
- package/src/lib/init-command.ts +130 -130
- package/src/lib/knowledge-store.test.ts +170 -170
- package/src/lib/knowledge-store.ts +369 -369
- package/src/lib/load-context.test.ts +52 -52
- package/src/lib/load-context.ts +52 -52
- package/src/lib/match-state.test.ts +134 -134
- package/src/lib/match-state.ts +94 -94
- package/src/lib/netease-tts.ts +83 -83
- package/src/lib/normalize.ts +42 -42
- package/src/lib/persona.test.ts +41 -41
- package/src/lib/persona.ts +72 -72
- package/src/lib/server-registry.ts +152 -152
- package/src/lib/skill-version.test.ts +48 -48
- package/src/lib/skill-version.ts +19 -19
- package/src/lib/strategy-export.test.ts +240 -240
- package/src/lib/strategy-export.ts +247 -247
- package/src/lib/tts-keys.ts +7 -7
- package/src/lib/tts-speech.test.ts +63 -63
- package/src/lib/tts-speech.ts +76 -76
- package/src/lib/user-data.test.ts +96 -96
- package/src/lib/user-data.ts +400 -400
- package/src/lib/workspace-argv.test.ts +49 -49
- package/src/lib/workspace-argv.ts +44 -44
- package/src/perception/player-history-store.test.ts +87 -87
- package/src/perception/player-history-store.ts +194 -194
- package/src/pipeline/event-format.test.ts +243 -243
- package/src/pipeline/event-format.ts +501 -501
- package/src/pipeline/event-hints.ts +195 -195
- package/src/pipeline/event-store.test.ts +28 -28
- package/src/pipeline/event-store.ts +193 -193
- package/src/pipeline/pipeline.ts +35 -35
- package/src/pipeline/player-projection.test.ts +168 -168
- package/src/pipeline/player-projection.ts +370 -370
- package/src/runtime/auto-upgrade.test.ts +66 -66
- package/src/runtime/auto-upgrade.ts +31 -31
- package/src/runtime/event-daemon.test.ts +209 -209
- package/src/runtime/event-daemon.ts +519 -519
- package/src/runtime/owner-control.ts +150 -150
- package/src/runtime/raw-ws-log.test.ts +33 -33
- package/src/runtime/raw-ws-log.ts +32 -32
- package/src/runtime/runtime-logger.ts +107 -107
- package/src/runtime/ws-client.test.ts +125 -125
- package/src/runtime/ws-client.ts +287 -287
- package/src/sdk/action.ts +166 -166
- package/src/sdk/index.ts +110 -110
- package/src/sdk/types.ts +161 -161
- package/src/strategies/avoid-lone.ts +12 -12
- package/src/strategies/avoid-players.knowledge.md +19 -19
- package/src/strategies/avoid-players.ts +16 -16
- package/src/strategies/corpse-patrol.ts +23 -23
- package/src/strategies/crab-sabotage.ts +22 -22
- package/src/strategies/custom-module.test.ts +270 -270
- package/src/strategies/find-player.ts +17 -17
- package/src/strategies/game-utils.test.ts +242 -242
- package/src/strategies/game-utils.ts +846 -846
- package/src/strategies/goals/anchor-linger.ts +77 -77
- package/src/strategies/goals/avoid-lone-top.ts +168 -168
- package/src/strategies/goals/avoid-players-top.test.ts +83 -83
- package/src/strategies/goals/avoid-players-top.ts +121 -121
- package/src/strategies/goals/conversation-goal.ts +51 -51
- package/src/strategies/goals/corpse-patrol-top.ts +113 -113
- package/src/strategies/goals/crab-octopus-reflexes.ts +101 -101
- package/src/strategies/goals/crab-sabotage-top.ts +197 -197
- package/src/strategies/goals/emergency-hunt-goal.ts +28 -28
- package/src/strategies/goals/find-player-top.ts +93 -93
- package/src/strategies/goals/flee-players-goal.ts +53 -53
- package/src/strategies/goals/follow-companion-goal.ts +106 -106
- package/src/strategies/goals/goal-manager.ts +41 -41
- package/src/strategies/goals/goal-root-strategy.ts +49 -49
- package/src/strategies/goals/goal.ts +28 -28
- package/src/strategies/goals/hide-top.ts +197 -197
- package/src/strategies/goals/keep-away-goal.ts +221 -221
- package/src/strategies/goals/kill-frenzy-top.ts +80 -80
- package/src/strategies/goals/kill-lone-top.ts +160 -160
- package/src/strategies/goals/kill-target-goal.ts +59 -59
- package/src/strategies/goals/kill-target-top.ts +109 -109
- package/src/strategies/goals/leaf-goal.ts +27 -27
- package/src/strategies/goals/linger-corpse-goal.ts +35 -35
- package/src/strategies/goals/lone-kill-core.ts +82 -82
- package/src/strategies/goals/lone-kill-goal.ts +24 -24
- package/src/strategies/goals/lone-kill-task-top.test.ts +85 -85
- package/src/strategies/goals/lone-kill-task-top.ts +133 -133
- package/src/strategies/goals/move-room-goal.ts +60 -60
- package/src/strategies/goals/normal-shrimp-top.test.ts +80 -80
- package/src/strategies/goals/normal-shrimp-top.ts +242 -242
- package/src/strategies/goals/paradise-fish-top.test.ts +126 -126
- package/src/strategies/goals/paradise-fish-top.ts +224 -224
- package/src/strategies/goals/patrol-top.ts +57 -57
- package/src/strategies/goals/report-patrol-top.ts +80 -80
- package/src/strategies/goals/safe-task-goal.ts +102 -102
- package/src/strategies/goals/social-task-top.ts +161 -161
- package/src/strategies/goals/task-kill-report-top.ts +163 -163
- package/src/strategies/goals/task-only-top.ts +57 -57
- package/src/strategies/goals/task-or-patrol-goal.ts +41 -41
- package/src/strategies/goals/task-report-top.ts +57 -57
- package/src/strategies/goals/wander-task-goal.ts +33 -33
- package/src/strategies/goals/warrior-shrimp-top.test.ts +87 -87
- package/src/strategies/goals/warrior-shrimp-top.ts +267 -267
- package/src/strategies/greeting.ts +53 -53
- package/src/strategies/hide-spots.ts +59 -59
- package/src/strategies/hide.ts +24 -24
- package/src/strategies/kill-frenzy.ts +13 -13
- package/src/strategies/kill-lone.knowledge.md +17 -17
- package/src/strategies/kill-lone.ts +14 -14
- package/src/strategies/kill-target.ts +19 -19
- package/src/strategies/loader.test.ts +678 -678
- package/src/strategies/loader.ts +181 -181
- package/src/strategies/lone-kill-task.ts +22 -22
- package/src/strategies/meeting-gate.test.ts +59 -59
- package/src/strategies/meeting-gate.ts +23 -23
- package/src/strategies/move-room.ts +16 -16
- package/src/strategies/new-events-backfill.ts +98 -98
- package/src/strategies/off-route-points.ts +105 -105
- package/src/strategies/paradise-fish.knowledge.md +19 -19
- package/src/strategies/paradise-fish.ts +26 -26
- package/src/strategies/pathfind/distance-field.ts +150 -150
- package/src/strategies/pathfind/escape-planner.test.ts +197 -197
- package/src/strategies/pathfind/escape-planner.ts +355 -355
- package/src/strategies/pathfind/walkable-grid.ts +117 -117
- package/src/strategies/patrol.ts +12 -12
- package/src/strategies/player-targets.ts +13 -13
- package/src/strategies/report-patrol.ts +12 -12
- package/src/strategies/shrimp-memory.knowledge.md +19 -19
- package/src/strategies/shrimp-memory.ts +26 -26
- package/src/strategies/social-task.test.ts +28 -28
- package/src/strategies/social-task.ts +50 -50
- package/src/strategies/spawn.ts +82 -82
- package/src/strategies/speech-module.ts +123 -123
- package/src/strategies/strategy-loop.test.ts +15 -15
- package/src/strategies/strategy-loop.ts +776 -776
- package/src/strategies/task-kill-report.ts +18 -18
- package/src/strategies/task-only.ts +12 -12
- package/src/strategies/task-report.ts +23 -23
- package/src/strategies/types.ts +109 -109
- package/src/strategies/warrior-memory.knowledge.md +21 -21
- package/src/strategies/warrior-memory.ts +17 -17
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
import type { Position } from '../sdk/types.js';
|
|
2
|
-
import { nearestSafePoint, type OffRoutePoint } from './off-route-points.js';
|
|
3
|
-
|
|
4
|
-
/** 藏身角落,离路点的一种(见 OffRoutePoint)。 */
|
|
5
|
-
export type HideSpot = OffRoutePoint;
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* 躲藏点:离线从服务端烘焙地图(config/clawclaw/clawclaw.tmj.baked.npz)算出的「藏身角落」。筛选条件:
|
|
9
|
-
* - 所在房间有 ≥2 个出口(非死胡同,被追能逃);**走廊**(做任务的必经路线)一律排除;
|
|
10
|
-
* - 出口 ≥4 的枢纽房间排除(穿行人流太大,藏不住);
|
|
11
|
-
* - 取房间内「离各出口最深、且远离任务点/出生点」的可走格(缩在内侧角落,避开穿行线与刷新点)。
|
|
12
|
-
*
|
|
13
|
-
* 重新生成:scripts/find-hide-spots.py(用后端 venv 解释器跑,读 baked.npz,打印可粘贴的本数组)。
|
|
14
|
-
* 这是离线烘焙数据,和 pathfind 的可行走网格一样:运行时按需 snap 到最近可走格即可。
|
|
15
|
-
*/
|
|
16
|
-
export const HIDE_SPOTS: readonly HideSpot[] = [
|
|
17
|
-
{ x: 2882, y: 1362, room: '导航仓' },
|
|
18
|
-
{ x: 2386, y: 1138, room: '健身房' },
|
|
19
|
-
{ x: 1922, y: 1234, room: '酒吧' },
|
|
20
|
-
{ x: 2418, y: 2130, room: '休闲会所' },
|
|
21
|
-
{ x: 1538, y: 1826, room: '监控室' },
|
|
22
|
-
{ x: 514, y: 2402, room: '动力监控室' },
|
|
23
|
-
{ x: 1538, y: 2514, room: '自助餐厅' },
|
|
24
|
-
{ x: 1314, y: 2674, room: '制氧舱' },
|
|
25
|
-
{ x: 2514, y: 2882, room: '中央厨房' },
|
|
26
|
-
{ x: 2882, y: 2994, room: '冷库' },
|
|
27
|
-
{ x: 3858, y: 2434, room: '情报室' },
|
|
28
|
-
];
|
|
29
|
-
|
|
30
|
-
/** 躲藏点离任一威胁多近就硬排除(与 nearestSafeTask 的端点排除同量级)。 */
|
|
31
|
-
export const HIDE_THREAT_EXCLUDE_RANGE = 500;
|
|
32
|
-
/** 去躲藏点的测地路径经过威胁这个距离内也排除(避免走向把守者)。 */
|
|
33
|
-
export const HIDE_PATH_THREAT_RADIUS = 350;
|
|
34
|
-
|
|
35
|
-
export interface NearestSafeHideOptions {
|
|
36
|
-
threatExcludeRadius?: number;
|
|
37
|
-
pathThreatRadius?: number;
|
|
38
|
-
/** 当前已选躲藏点:仍是合法候选就保持不变,杜绝等距摇摆。 */
|
|
39
|
-
stickyTo?: HideSpot | null;
|
|
40
|
-
/** 被标记为不可达的移动目标:在其附近的点跳过。 */
|
|
41
|
-
blockedTarget?: Position | null;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* 选「最近的安全躲藏点」:威胁旁的点硬排除、去路经过威胁附近的点排除,余者取测地最近,带粘性
|
|
46
|
-
* (当前点仍合法就不换),全部被封死时退回「离威胁最远」的点。实现复用 nearestSafePoint。
|
|
47
|
-
*/
|
|
48
|
-
export function nearestSafeHideSpot(
|
|
49
|
-
from: Position,
|
|
50
|
-
threatPoints: Position[] = [],
|
|
51
|
-
opts: NearestSafeHideOptions = {},
|
|
52
|
-
): HideSpot | null {
|
|
53
|
-
return nearestSafePoint(HIDE_SPOTS, from, threatPoints, {
|
|
54
|
-
threatExcludeRadius: opts.threatExcludeRadius ?? HIDE_THREAT_EXCLUDE_RANGE,
|
|
55
|
-
pathThreatRadius: opts.pathThreatRadius ?? HIDE_PATH_THREAT_RADIUS,
|
|
56
|
-
stickyTo: opts.stickyTo ?? null,
|
|
57
|
-
blockedTarget: opts.blockedTarget ?? null,
|
|
58
|
-
});
|
|
59
|
-
}
|
|
1
|
+
import type { Position } from '../sdk/types.js';
|
|
2
|
+
import { nearestSafePoint, type OffRoutePoint } from './off-route-points.js';
|
|
3
|
+
|
|
4
|
+
/** 藏身角落,离路点的一种(见 OffRoutePoint)。 */
|
|
5
|
+
export type HideSpot = OffRoutePoint;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 躲藏点:离线从服务端烘焙地图(config/clawclaw/clawclaw.tmj.baked.npz)算出的「藏身角落」。筛选条件:
|
|
9
|
+
* - 所在房间有 ≥2 个出口(非死胡同,被追能逃);**走廊**(做任务的必经路线)一律排除;
|
|
10
|
+
* - 出口 ≥4 的枢纽房间排除(穿行人流太大,藏不住);
|
|
11
|
+
* - 取房间内「离各出口最深、且远离任务点/出生点」的可走格(缩在内侧角落,避开穿行线与刷新点)。
|
|
12
|
+
*
|
|
13
|
+
* 重新生成:scripts/find-hide-spots.py(用后端 venv 解释器跑,读 baked.npz,打印可粘贴的本数组)。
|
|
14
|
+
* 这是离线烘焙数据,和 pathfind 的可行走网格一样:运行时按需 snap 到最近可走格即可。
|
|
15
|
+
*/
|
|
16
|
+
export const HIDE_SPOTS: readonly HideSpot[] = [
|
|
17
|
+
{ x: 2882, y: 1362, room: '导航仓' },
|
|
18
|
+
{ x: 2386, y: 1138, room: '健身房' },
|
|
19
|
+
{ x: 1922, y: 1234, room: '酒吧' },
|
|
20
|
+
{ x: 2418, y: 2130, room: '休闲会所' },
|
|
21
|
+
{ x: 1538, y: 1826, room: '监控室' },
|
|
22
|
+
{ x: 514, y: 2402, room: '动力监控室' },
|
|
23
|
+
{ x: 1538, y: 2514, room: '自助餐厅' },
|
|
24
|
+
{ x: 1314, y: 2674, room: '制氧舱' },
|
|
25
|
+
{ x: 2514, y: 2882, room: '中央厨房' },
|
|
26
|
+
{ x: 2882, y: 2994, room: '冷库' },
|
|
27
|
+
{ x: 3858, y: 2434, room: '情报室' },
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
/** 躲藏点离任一威胁多近就硬排除(与 nearestSafeTask 的端点排除同量级)。 */
|
|
31
|
+
export const HIDE_THREAT_EXCLUDE_RANGE = 500;
|
|
32
|
+
/** 去躲藏点的测地路径经过威胁这个距离内也排除(避免走向把守者)。 */
|
|
33
|
+
export const HIDE_PATH_THREAT_RADIUS = 350;
|
|
34
|
+
|
|
35
|
+
export interface NearestSafeHideOptions {
|
|
36
|
+
threatExcludeRadius?: number;
|
|
37
|
+
pathThreatRadius?: number;
|
|
38
|
+
/** 当前已选躲藏点:仍是合法候选就保持不变,杜绝等距摇摆。 */
|
|
39
|
+
stickyTo?: HideSpot | null;
|
|
40
|
+
/** 被标记为不可达的移动目标:在其附近的点跳过。 */
|
|
41
|
+
blockedTarget?: Position | null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 选「最近的安全躲藏点」:威胁旁的点硬排除、去路经过威胁附近的点排除,余者取测地最近,带粘性
|
|
46
|
+
* (当前点仍合法就不换),全部被封死时退回「离威胁最远」的点。实现复用 nearestSafePoint。
|
|
47
|
+
*/
|
|
48
|
+
export function nearestSafeHideSpot(
|
|
49
|
+
from: Position,
|
|
50
|
+
threatPoints: Position[] = [],
|
|
51
|
+
opts: NearestSafeHideOptions = {},
|
|
52
|
+
): HideSpot | null {
|
|
53
|
+
return nearestSafePoint(HIDE_SPOTS, from, threatPoints, {
|
|
54
|
+
threatExcludeRadius: opts.threatExcludeRadius ?? HIDE_THREAT_EXCLUDE_RANGE,
|
|
55
|
+
pathThreatRadius: opts.pathThreatRadius ?? HIDE_PATH_THREAT_RADIUS,
|
|
56
|
+
stickyTo: opts.stickyTo ?? null,
|
|
57
|
+
blockedTarget: opts.blockedTarget ?? null,
|
|
58
|
+
});
|
|
59
|
+
}
|
package/src/strategies/hide.ts
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import type { StrategyEntry } from './types.js';
|
|
2
|
-
import { GoalRootStrategy } from './goals/goal-root-strategy.js';
|
|
3
|
-
import { HideTop } from './goals/hide-top.js';
|
|
4
|
-
|
|
5
|
-
/** 解析参数:kill/fight → 死角自保开;nokill/flee/pacifist → 关;缺省(null)= 按角色默认。 */
|
|
6
|
-
export function parseHideKillArg(args?: string[]): boolean | null {
|
|
7
|
-
for (const raw of args ?? []) {
|
|
8
|
-
const a = raw.trim().toLowerCase();
|
|
9
|
-
if (a === 'kill' || a === 'fight' || a === 'kill=on') return true;
|
|
10
|
-
if (a === 'nokill' || a === 'flee' || a === 'pacifist' || a === 'kill=off') return false;
|
|
11
|
-
}
|
|
12
|
-
return null;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export const strategy: StrategyEntry = {
|
|
16
|
-
id: 'hide',
|
|
17
|
-
name: '躲藏',
|
|
18
|
-
description:
|
|
19
|
-
'躲藏策略:在离线从地图算好的若干「非走廊、≥2 出口可逃、远离任务点/出生点」的藏身角落里,选测地最近且不挨威胁的一个潜伏不动;视野里一出现非队友,就像 shrimp-memory 那样保持距离甩开(KeepAway),并边逃边重算排除该威胁的新藏点,逃完落到新点继续潜伏。蟹不躲队友。可选参数 kill / nokill 控制「被单个对手逼进出刀距离且无路可逃时是否出刀自保」——缺省按角色:蟹/章鱼默认开,武士虾/枪虾(及无刀角色)默认关。',
|
|
20
|
-
create(args?: string[]) {
|
|
21
|
-
const killWhenCornered = parseHideKillArg(args);
|
|
22
|
-
return new GoalRootStrategy('hide', () => new HideTop(killWhenCornered), { resetOnMeetingResume: false });
|
|
23
|
-
},
|
|
24
|
-
};
|
|
1
|
+
import type { StrategyEntry } from './types.js';
|
|
2
|
+
import { GoalRootStrategy } from './goals/goal-root-strategy.js';
|
|
3
|
+
import { HideTop } from './goals/hide-top.js';
|
|
4
|
+
|
|
5
|
+
/** 解析参数:kill/fight → 死角自保开;nokill/flee/pacifist → 关;缺省(null)= 按角色默认。 */
|
|
6
|
+
export function parseHideKillArg(args?: string[]): boolean | null {
|
|
7
|
+
for (const raw of args ?? []) {
|
|
8
|
+
const a = raw.trim().toLowerCase();
|
|
9
|
+
if (a === 'kill' || a === 'fight' || a === 'kill=on') return true;
|
|
10
|
+
if (a === 'nokill' || a === 'flee' || a === 'pacifist' || a === 'kill=off') return false;
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const strategy: StrategyEntry = {
|
|
16
|
+
id: 'hide',
|
|
17
|
+
name: '躲藏',
|
|
18
|
+
description:
|
|
19
|
+
'躲藏策略:在离线从地图算好的若干「非走廊、≥2 出口可逃、远离任务点/出生点」的藏身角落里,选测地最近且不挨威胁的一个潜伏不动;视野里一出现非队友,就像 shrimp-memory 那样保持距离甩开(KeepAway),并边逃边重算排除该威胁的新藏点,逃完落到新点继续潜伏。蟹不躲队友。可选参数 kill / nokill 控制「被单个对手逼进出刀距离且无路可逃时是否出刀自保」——缺省按角色:蟹/章鱼默认开,武士虾/枪虾(及无刀角色)默认关。',
|
|
20
|
+
create(args?: string[]) {
|
|
21
|
+
const killWhenCornered = parseHideKillArg(args);
|
|
22
|
+
return new GoalRootStrategy('hide', () => new HideTop(killWhenCornered), { resetOnMeetingResume: false });
|
|
23
|
+
},
|
|
24
|
+
};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type { StrategyEntry } from './types.js';
|
|
2
|
-
import { GoalRootStrategy } from './goals/goal-root-strategy.js';
|
|
3
|
-
import { KillFrenzyTop } from './goals/kill-frenzy-top.js';
|
|
4
|
-
|
|
5
|
-
export const strategy: StrategyEntry = {
|
|
6
|
-
id: 'kill-frenzy',
|
|
7
|
-
name: '屠夫',
|
|
8
|
-
description:
|
|
9
|
-
'疯狂砍人:见谁杀谁(除队友外所有可见玩家),多人在场也照杀。按房间顺序巡逻,视野里只要有非队友就冲向最近的那个,50内且冷却好就出刀,冷却中保持10距离贴身跟随等冷却。与 kill-lone 不同,不会因为周围人多而暂停攻击。永不停手。',
|
|
10
|
-
create() {
|
|
11
|
-
return new GoalRootStrategy('kill-frenzy', () => new KillFrenzyTop(), { resetOnMeetingResume: false });
|
|
12
|
-
},
|
|
13
|
-
};
|
|
1
|
+
import type { StrategyEntry } from './types.js';
|
|
2
|
+
import { GoalRootStrategy } from './goals/goal-root-strategy.js';
|
|
3
|
+
import { KillFrenzyTop } from './goals/kill-frenzy-top.js';
|
|
4
|
+
|
|
5
|
+
export const strategy: StrategyEntry = {
|
|
6
|
+
id: 'kill-frenzy',
|
|
7
|
+
name: '屠夫',
|
|
8
|
+
description:
|
|
9
|
+
'疯狂砍人:见谁杀谁(除队友外所有可见玩家),多人在场也照杀。按房间顺序巡逻,视野里只要有非队友就冲向最近的那个,50内且冷却好就出刀,冷却中保持10距离贴身跟随等冷却。与 kill-lone 不同,不会因为周围人多而暂停攻击。永不停手。',
|
|
10
|
+
create() {
|
|
11
|
+
return new GoalRootStrategy('kill-frenzy', () => new KillFrenzyTop(), { resetOnMeetingResume: false });
|
|
12
|
+
},
|
|
13
|
+
};
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
# kill-lone 知识契约
|
|
2
|
-
|
|
3
|
-
`kill-lone` 读取两档玩家标记,**未标记的一律默认「被怀疑」**:
|
|
4
|
-
|
|
5
|
-
| 标记 | 行为 |
|
|
6
|
-
|------|------|
|
|
7
|
-
| `hostile`(坏人) | 视为明确猎杀目标,见到就追杀,可突破多人保护规则 |
|
|
8
|
-
| `trusted`(好人) | 永不击杀,优先级高于其他猎杀判断 |
|
|
9
|
-
| 未标记(被怀疑) | 维持默认行为:仅猎杀落单的非队友,不因被怀疑就升级为主动猎杀 |
|
|
10
|
-
|
|
11
|
-
```bash
|
|
12
|
-
ccl knowledge mark 5 hostile --note "确认敌对"
|
|
13
|
-
ccl knowledge mark 3 trusted --note "已澄清"
|
|
14
|
-
ccl knowledge del player 5 # 取消标记 → 回到默认「被怀疑」
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
`role` 是纯身份事实,不直接控制策略。
|
|
1
|
+
# kill-lone 知识契约
|
|
2
|
+
|
|
3
|
+
`kill-lone` 读取两档玩家标记,**未标记的一律默认「被怀疑」**:
|
|
4
|
+
|
|
5
|
+
| 标记 | 行为 |
|
|
6
|
+
|------|------|
|
|
7
|
+
| `hostile`(坏人) | 视为明确猎杀目标,见到就追杀,可突破多人保护规则 |
|
|
8
|
+
| `trusted`(好人) | 永不击杀,优先级高于其他猎杀判断 |
|
|
9
|
+
| 未标记(被怀疑) | 维持默认行为:仅猎杀落单的非队友,不因被怀疑就升级为主动猎杀 |
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
ccl knowledge mark 5 hostile --note "确认敌对"
|
|
13
|
+
ccl knowledge mark 3 trusted --note "已澄清"
|
|
14
|
+
ccl knowledge del player 5 # 取消标记 → 回到默认「被怀疑」
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`role` 是纯身份事实,不直接控制策略。
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import type { StrategyEntry } from './types.js';
|
|
2
|
-
import { GoalRootStrategy } from './goals/goal-root-strategy.js';
|
|
3
|
-
import { KillLoneTop } from './goals/kill-lone-top.js';
|
|
4
|
-
import { parseTargetArgs } from './player-targets.js';
|
|
5
|
-
|
|
6
|
-
export const strategy: StrategyEntry = {
|
|
7
|
-
id: 'kill-lone',
|
|
8
|
-
name: '猎独',
|
|
9
|
-
description: '按照房间顺序进行巡逻,巡逻时遇到人会判断。可传入避免击杀的座位号或名字列表。视野里只有一个非队友且不在避免名单内就靠近,进入50距离就出刀;冷却中贴在10距离附近等。视野里出现两人以上时,暂停攻击10秒并继续巡逻。',
|
|
10
|
-
create(args?: string[]) {
|
|
11
|
-
const protectedTargets = args ? parseTargetArgs(args) : [];
|
|
12
|
-
return new GoalRootStrategy('kill-lone', () => new KillLoneTop(protectedTargets), { resetOnMeetingResume: false });
|
|
13
|
-
},
|
|
14
|
-
};
|
|
1
|
+
import type { StrategyEntry } from './types.js';
|
|
2
|
+
import { GoalRootStrategy } from './goals/goal-root-strategy.js';
|
|
3
|
+
import { KillLoneTop } from './goals/kill-lone-top.js';
|
|
4
|
+
import { parseTargetArgs } from './player-targets.js';
|
|
5
|
+
|
|
6
|
+
export const strategy: StrategyEntry = {
|
|
7
|
+
id: 'kill-lone',
|
|
8
|
+
name: '猎独',
|
|
9
|
+
description: '按照房间顺序进行巡逻,巡逻时遇到人会判断。可传入避免击杀的座位号或名字列表。视野里只有一个非队友且不在避免名单内就靠近,进入50距离就出刀;冷却中贴在10距离附近等。视野里出现两人以上时,暂停攻击10秒并继续巡逻。',
|
|
10
|
+
create(args?: string[]) {
|
|
11
|
+
const protectedTargets = args ? parseTargetArgs(args) : [];
|
|
12
|
+
return new GoalRootStrategy('kill-lone', () => new KillLoneTop(protectedTargets), { resetOnMeetingResume: false });
|
|
13
|
+
},
|
|
14
|
+
};
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import type { StrategyEntry } from './types.js';
|
|
2
|
-
import { GoalRootStrategy } from './goals/goal-root-strategy.js';
|
|
3
|
-
import { KillTargetTop } from './goals/kill-target-top.js';
|
|
4
|
-
import { parseTargetArgs } from './player-targets.js';
|
|
5
|
-
|
|
6
|
-
export const strategy: StrategyEntry = {
|
|
7
|
-
id: 'kill-target',
|
|
8
|
-
name: '追杀',
|
|
9
|
-
description: '专门追杀指定目标(传入座位号或名字,可多人)。按照房间顺序进行巡逻,目标进入视野就冲上去,50内且冷却好就出刀;冷却中保持10距离贴身跟随等待。找目标时路过其他玩家不会停步。所有目标死亡后停止。',
|
|
10
|
-
create(args?: string[]) {
|
|
11
|
-
const targets = args ? parseTargetArgs(args) : [];
|
|
12
|
-
if (targets.length === 0) {
|
|
13
|
-
throw new Error(
|
|
14
|
-
'kill-target strategy requires target seat numbers or player names (comma- or space-separated).',
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
return new GoalRootStrategy('kill-target', () => new KillTargetTop(targets), { resetOnMeetingResume: false });
|
|
18
|
-
},
|
|
19
|
-
};
|
|
1
|
+
import type { StrategyEntry } from './types.js';
|
|
2
|
+
import { GoalRootStrategy } from './goals/goal-root-strategy.js';
|
|
3
|
+
import { KillTargetTop } from './goals/kill-target-top.js';
|
|
4
|
+
import { parseTargetArgs } from './player-targets.js';
|
|
5
|
+
|
|
6
|
+
export const strategy: StrategyEntry = {
|
|
7
|
+
id: 'kill-target',
|
|
8
|
+
name: '追杀',
|
|
9
|
+
description: '专门追杀指定目标(传入座位号或名字,可多人)。按照房间顺序进行巡逻,目标进入视野就冲上去,50内且冷却好就出刀;冷却中保持10距离贴身跟随等待。找目标时路过其他玩家不会停步。所有目标死亡后停止。',
|
|
10
|
+
create(args?: string[]) {
|
|
11
|
+
const targets = args ? parseTargetArgs(args) : [];
|
|
12
|
+
if (targets.length === 0) {
|
|
13
|
+
throw new Error(
|
|
14
|
+
'kill-target strategy requires target seat numbers or player names (comma- or space-separated).',
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
return new GoalRootStrategy('kill-target', () => new KillTargetTop(targets), { resetOnMeetingResume: false });
|
|
18
|
+
},
|
|
19
|
+
};
|