@sharpee/character 0.9.106 → 0.9.107
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/apply.d.ts +29 -7
- package/apply.d.ts.map +1 -1
- package/apply.js +15 -7
- package/apply.js.map +1 -1
- package/character-builder.d.ts +67 -4
- package/character-builder.d.ts.map +1 -1
- package/character-builder.js +116 -7
- package/character-builder.js.map +1 -1
- package/conversation/acl.d.ts +62 -0
- package/conversation/acl.d.ts.map +1 -0
- package/conversation/acl.js +117 -0
- package/conversation/acl.js.map +1 -0
- package/conversation/builder.d.ts +247 -0
- package/conversation/builder.d.ts.map +1 -0
- package/conversation/builder.js +324 -0
- package/conversation/builder.js.map +1 -0
- package/conversation/constraint-evaluator.d.ts +147 -0
- package/conversation/constraint-evaluator.d.ts.map +1 -0
- package/conversation/constraint-evaluator.js +247 -0
- package/conversation/constraint-evaluator.js.map +1 -0
- package/conversation/conversation-messages.d.ts +56 -0
- package/conversation/conversation-messages.d.ts.map +1 -0
- package/conversation/conversation-messages.js +69 -0
- package/conversation/conversation-messages.js.map +1 -0
- package/conversation/dialogue-extension.d.ts +87 -0
- package/conversation/dialogue-extension.d.ts.map +1 -0
- package/conversation/dialogue-extension.js +302 -0
- package/conversation/dialogue-extension.js.map +1 -0
- package/conversation/dialogue-types.d.ts +71 -0
- package/conversation/dialogue-types.d.ts.map +1 -0
- package/conversation/dialogue-types.js +13 -0
- package/conversation/dialogue-types.js.map +1 -0
- package/conversation/index.d.ts +19 -0
- package/conversation/index.d.ts.map +1 -0
- package/conversation/index.js +37 -0
- package/conversation/index.js.map +1 -0
- package/conversation/lifecycle.d.ts +212 -0
- package/conversation/lifecycle.d.ts.map +1 -0
- package/conversation/lifecycle.js +348 -0
- package/conversation/lifecycle.js.map +1 -0
- package/conversation/response-types.d.ts +98 -0
- package/conversation/response-types.d.ts.map +1 -0
- package/conversation/response-types.js +30 -0
- package/conversation/response-types.js.map +1 -0
- package/conversation/topic-registry.d.ts +130 -0
- package/conversation/topic-registry.d.ts.map +1 -0
- package/conversation/topic-registry.js +187 -0
- package/conversation/topic-registry.js.map +1 -0
- package/goals/builder.d.ts +135 -0
- package/goals/builder.d.ts.map +1 -0
- package/goals/builder.js +193 -0
- package/goals/builder.js.map +1 -0
- package/goals/goal-activation.d.ts +99 -0
- package/goals/goal-activation.d.ts.map +1 -0
- package/goals/goal-activation.js +212 -0
- package/goals/goal-activation.js.map +1 -0
- package/goals/goal-types.d.ts +138 -0
- package/goals/goal-types.d.ts.map +1 -0
- package/goals/goal-types.js +20 -0
- package/goals/goal-types.js.map +1 -0
- package/goals/index.d.ts +15 -0
- package/goals/index.d.ts.map +1 -0
- package/goals/index.js +24 -0
- package/goals/index.js.map +1 -0
- package/goals/pathfinding.d.ts +67 -0
- package/goals/pathfinding.d.ts.map +1 -0
- package/goals/pathfinding.js +134 -0
- package/goals/pathfinding.js.map +1 -0
- package/goals/step-evaluator.d.ts +52 -0
- package/goals/step-evaluator.d.ts.map +1 -0
- package/goals/step-evaluator.js +153 -0
- package/goals/step-evaluator.js.map +1 -0
- package/index.d.ts +6 -1
- package/index.d.ts.map +1 -1
- package/index.js +60 -1
- package/index.js.map +1 -1
- package/influence/builder.d.ts +136 -0
- package/influence/builder.d.ts.map +1 -0
- package/influence/builder.js +198 -0
- package/influence/builder.js.map +1 -0
- package/influence/index.d.ts +16 -0
- package/influence/index.d.ts.map +1 -0
- package/influence/index.js +25 -0
- package/influence/index.js.map +1 -0
- package/influence/influence-duration.d.ts +82 -0
- package/influence/influence-duration.d.ts.map +1 -0
- package/influence/influence-duration.js +148 -0
- package/influence/influence-duration.js.map +1 -0
- package/influence/influence-evaluator.d.ts +55 -0
- package/influence/influence-evaluator.d.ts.map +1 -0
- package/influence/influence-evaluator.js +183 -0
- package/influence/influence-evaluator.js.map +1 -0
- package/influence/influence-messages.d.ts +30 -0
- package/influence/influence-messages.d.ts.map +1 -0
- package/influence/influence-messages.js +40 -0
- package/influence/influence-messages.js.map +1 -0
- package/influence/influence-types.d.ts +123 -0
- package/influence/influence-types.d.ts.map +1 -0
- package/influence/influence-types.js +12 -0
- package/influence/influence-types.js.map +1 -0
- package/influence/pc-influence.d.ts +38 -0
- package/influence/pc-influence.d.ts.map +1 -0
- package/influence/pc-influence.js +56 -0
- package/influence/pc-influence.js.map +1 -0
- package/package.json +4 -3
- package/propagation/builder.d.ts +47 -0
- package/propagation/builder.d.ts.map +1 -0
- package/propagation/builder.js +46 -0
- package/propagation/builder.js.map +1 -0
- package/propagation/fact-transfer.d.ts +47 -0
- package/propagation/fact-transfer.d.ts.map +1 -0
- package/propagation/fact-transfer.js +76 -0
- package/propagation/fact-transfer.js.map +1 -0
- package/propagation/index.d.ts +16 -0
- package/propagation/index.d.ts.map +1 -0
- package/propagation/index.js +28 -0
- package/propagation/index.js.map +1 -0
- package/propagation/propagation-evaluator.d.ts +53 -0
- package/propagation/propagation-evaluator.d.ts.map +1 -0
- package/propagation/propagation-evaluator.js +231 -0
- package/propagation/propagation-evaluator.js.map +1 -0
- package/propagation/propagation-messages.d.ts +30 -0
- package/propagation/propagation-messages.d.ts.map +1 -0
- package/propagation/propagation-messages.js +37 -0
- package/propagation/propagation-messages.js.map +1 -0
- package/propagation/propagation-types.d.ts +100 -0
- package/propagation/propagation-types.d.ts.map +1 -0
- package/propagation/propagation-types.js +68 -0
- package/propagation/propagation-types.js.map +1 -0
- package/propagation/visibility.d.ts +46 -0
- package/propagation/visibility.d.ts.map +1 -0
- package/propagation/visibility.js +79 -0
- package/propagation/visibility.js.map +1 -0
- package/tick-phases.d.ts +93 -0
- package/tick-phases.d.ts.map +1 -0
- package/tick-phases.js +433 -0
- package/tick-phases.js.map +1 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Influence builder API (ADR-146 layer 5)
|
|
3
|
+
*
|
|
4
|
+
* Fluent builder for defining NPC influences and resistances.
|
|
5
|
+
* Returns from CharacterBuilder.influence(name) and compiles to
|
|
6
|
+
* InfluenceDef stored in CompiledCharacter.influenceDefs.
|
|
7
|
+
*
|
|
8
|
+
* Public interface: InfluenceBuilder.
|
|
9
|
+
* Owner context: @sharpee/character / influence
|
|
10
|
+
*/
|
|
11
|
+
import { InfluenceMode, InfluenceRange, InfluenceDuration, InfluenceEffect, InfluenceSchedule, InfluenceDef } from './influence-types';
|
|
12
|
+
/**
|
|
13
|
+
* Fluent builder for a single influence definition.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* ```
|
|
17
|
+
* builder.influence('seduction')
|
|
18
|
+
* .mode('passive')
|
|
19
|
+
* .range('proximity')
|
|
20
|
+
* .effect({ focus: 'clouded', mood: 'distracted' })
|
|
21
|
+
* .duration('while present')
|
|
22
|
+
* .witnessed('ginger-brushes-against-{target}')
|
|
23
|
+
* .resisted('ginger-brushes-against-{target}-no-effect')
|
|
24
|
+
* .done()
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare class InfluenceBuilder<TParent> {
|
|
28
|
+
private readonly _name;
|
|
29
|
+
private readonly _parent;
|
|
30
|
+
private readonly _finalize;
|
|
31
|
+
private _mode;
|
|
32
|
+
private _range;
|
|
33
|
+
private _effect;
|
|
34
|
+
private _duration;
|
|
35
|
+
private _witnessed?;
|
|
36
|
+
private _resisted?;
|
|
37
|
+
private _schedule?;
|
|
38
|
+
private _onPlayerAction?;
|
|
39
|
+
private _lingeringTurns?;
|
|
40
|
+
private _lingeringClearCondition?;
|
|
41
|
+
/**
|
|
42
|
+
* Create a new influence builder.
|
|
43
|
+
*
|
|
44
|
+
* @param name - Author-defined influence name
|
|
45
|
+
* @param parent - Parent builder to return to on .done()
|
|
46
|
+
* @param finalize - Callback to register the compiled InfluenceDef
|
|
47
|
+
*/
|
|
48
|
+
constructor(name: string, parent: TParent, finalize: (def: InfluenceDef) => void);
|
|
49
|
+
/**
|
|
50
|
+
* Set the influence mode.
|
|
51
|
+
*
|
|
52
|
+
* @param mode - 'passive' or 'active'
|
|
53
|
+
* @returns this for chaining
|
|
54
|
+
*/
|
|
55
|
+
mode(mode: InfluenceMode): InfluenceBuilder<TParent>;
|
|
56
|
+
/**
|
|
57
|
+
* Set the influence range.
|
|
58
|
+
*
|
|
59
|
+
* @param range - 'proximity', 'targeted', or 'room'
|
|
60
|
+
* @returns this for chaining
|
|
61
|
+
*/
|
|
62
|
+
range(range: InfluenceRange): InfluenceBuilder<TParent>;
|
|
63
|
+
/**
|
|
64
|
+
* Set the effect mutations applied to targets.
|
|
65
|
+
*
|
|
66
|
+
* @param effect - Character state mutations
|
|
67
|
+
* @returns this for chaining
|
|
68
|
+
*/
|
|
69
|
+
effect(effect: InfluenceEffect): InfluenceBuilder<TParent>;
|
|
70
|
+
/**
|
|
71
|
+
* Set the duration type.
|
|
72
|
+
*
|
|
73
|
+
* @param duration - 'while present', 'momentary', or 'lingering'
|
|
74
|
+
* @returns this for chaining
|
|
75
|
+
*/
|
|
76
|
+
duration(duration: InfluenceDuration): InfluenceBuilder<TParent>;
|
|
77
|
+
/**
|
|
78
|
+
* Set the message ID when the target is affected.
|
|
79
|
+
*
|
|
80
|
+
* @param messageId - Message ID
|
|
81
|
+
* @returns this for chaining
|
|
82
|
+
*/
|
|
83
|
+
witnessed(messageId: string): InfluenceBuilder<TParent>;
|
|
84
|
+
/**
|
|
85
|
+
* Set the message ID when the target resists.
|
|
86
|
+
*
|
|
87
|
+
* @param messageId - Message ID
|
|
88
|
+
* @returns this for chaining
|
|
89
|
+
*/
|
|
90
|
+
resisted(messageId: string): InfluenceBuilder<TParent>;
|
|
91
|
+
/**
|
|
92
|
+
* Set scheduling conditions for passive influences.
|
|
93
|
+
*
|
|
94
|
+
* @param schedule - Schedule with predicate conditions
|
|
95
|
+
* @returns this for chaining
|
|
96
|
+
*/
|
|
97
|
+
schedule(schedule: InfluenceSchedule): InfluenceBuilder<TParent>;
|
|
98
|
+
/**
|
|
99
|
+
* Set the message ID when PC tries to act while under this influence.
|
|
100
|
+
*
|
|
101
|
+
* @param messageId - Message ID
|
|
102
|
+
* @returns this for chaining
|
|
103
|
+
*/
|
|
104
|
+
onPlayerAction(messageId: string): InfluenceBuilder<TParent>;
|
|
105
|
+
/**
|
|
106
|
+
* Set lingering duration in turns.
|
|
107
|
+
*
|
|
108
|
+
* @param turns - Number of turns the effect persists
|
|
109
|
+
* @returns this for chaining
|
|
110
|
+
*/
|
|
111
|
+
lingeringTurns(turns: number): InfluenceBuilder<TParent>;
|
|
112
|
+
/**
|
|
113
|
+
* Set a predicate condition that clears a lingering effect.
|
|
114
|
+
*
|
|
115
|
+
* @param condition - Predicate condition
|
|
116
|
+
* @returns this for chaining
|
|
117
|
+
*/
|
|
118
|
+
clearsWhen(condition: string): InfluenceBuilder<TParent>;
|
|
119
|
+
/**
|
|
120
|
+
* Finalize this influence definition and return the parent builder.
|
|
121
|
+
*
|
|
122
|
+
* @returns The parent builder
|
|
123
|
+
*/
|
|
124
|
+
done(): TParent;
|
|
125
|
+
/**
|
|
126
|
+
* Compile the parent builder, auto-finalizing this influence.
|
|
127
|
+
*
|
|
128
|
+
* @returns Compiled character data (delegates to parent's compile())
|
|
129
|
+
*/
|
|
130
|
+
compile(): ReturnType<TParent extends {
|
|
131
|
+
compile(): infer R;
|
|
132
|
+
} ? () => R : never>;
|
|
133
|
+
/** @internal Build the InfluenceDef without finalizing. */
|
|
134
|
+
_buildDef(): InfluenceDef;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../../../../repos/sharpee/packages/character/src/influence/builder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,YAAY,EACb,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;;;GAcG;AACH,qBAAa,gBAAgB,CAAC,OAAO;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IACxD,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAC,CAAoB;IACtC,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,wBAAwB,CAAC,CAAS;IAE1C;;;;;;OAMG;gBACS,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI;IAMhF;;;;;OAKG;IACH,IAAI,CAAC,IAAI,EAAE,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC;IAKpD;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,cAAc,GAAG,gBAAgB,CAAC,OAAO,CAAC;IAKvD;;;;;OAKG;IACH,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,gBAAgB,CAAC,OAAO,CAAC;IAK1D;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,GAAG,gBAAgB,CAAC,OAAO,CAAC;IAKhE;;;;;OAKG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC;IAKvD;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC;IAKtD;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,GAAG,gBAAgB,CAAC,OAAO,CAAC;IAKhE;;;;;OAKG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC;IAK5D;;;;;OAKG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC;IAKxD;;;;;OAKG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC;IAKxD;;;;OAIG;IACH,IAAI,IAAI,OAAO;IAKf;;;;OAIG;IACH,OAAO,IAAI,UAAU,CAAC,OAAO,SAAS;QAAE,OAAO,IAAI,MAAM,CAAC,CAAA;KAAE,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC;IAK/E,2DAA2D;IAC3D,SAAS,IAAI,YAAY;CAkB1B"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Influence builder API (ADR-146 layer 5)
|
|
4
|
+
*
|
|
5
|
+
* Fluent builder for defining NPC influences and resistances.
|
|
6
|
+
* Returns from CharacterBuilder.influence(name) and compiles to
|
|
7
|
+
* InfluenceDef stored in CompiledCharacter.influenceDefs.
|
|
8
|
+
*
|
|
9
|
+
* Public interface: InfluenceBuilder.
|
|
10
|
+
* Owner context: @sharpee/character / influence
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.InfluenceBuilder = void 0;
|
|
14
|
+
/**
|
|
15
|
+
* Fluent builder for a single influence definition.
|
|
16
|
+
*
|
|
17
|
+
* Usage:
|
|
18
|
+
* ```
|
|
19
|
+
* builder.influence('seduction')
|
|
20
|
+
* .mode('passive')
|
|
21
|
+
* .range('proximity')
|
|
22
|
+
* .effect({ focus: 'clouded', mood: 'distracted' })
|
|
23
|
+
* .duration('while present')
|
|
24
|
+
* .witnessed('ginger-brushes-against-{target}')
|
|
25
|
+
* .resisted('ginger-brushes-against-{target}-no-effect')
|
|
26
|
+
* .done()
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
class InfluenceBuilder {
|
|
30
|
+
_name;
|
|
31
|
+
_parent;
|
|
32
|
+
_finalize;
|
|
33
|
+
_mode = 'passive';
|
|
34
|
+
_range = 'proximity';
|
|
35
|
+
_effect = {};
|
|
36
|
+
_duration = 'while present';
|
|
37
|
+
_witnessed;
|
|
38
|
+
_resisted;
|
|
39
|
+
_schedule;
|
|
40
|
+
_onPlayerAction;
|
|
41
|
+
_lingeringTurns;
|
|
42
|
+
_lingeringClearCondition;
|
|
43
|
+
/**
|
|
44
|
+
* Create a new influence builder.
|
|
45
|
+
*
|
|
46
|
+
* @param name - Author-defined influence name
|
|
47
|
+
* @param parent - Parent builder to return to on .done()
|
|
48
|
+
* @param finalize - Callback to register the compiled InfluenceDef
|
|
49
|
+
*/
|
|
50
|
+
constructor(name, parent, finalize) {
|
|
51
|
+
this._name = name;
|
|
52
|
+
this._parent = parent;
|
|
53
|
+
this._finalize = finalize;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Set the influence mode.
|
|
57
|
+
*
|
|
58
|
+
* @param mode - 'passive' or 'active'
|
|
59
|
+
* @returns this for chaining
|
|
60
|
+
*/
|
|
61
|
+
mode(mode) {
|
|
62
|
+
this._mode = mode;
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Set the influence range.
|
|
67
|
+
*
|
|
68
|
+
* @param range - 'proximity', 'targeted', or 'room'
|
|
69
|
+
* @returns this for chaining
|
|
70
|
+
*/
|
|
71
|
+
range(range) {
|
|
72
|
+
this._range = range;
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Set the effect mutations applied to targets.
|
|
77
|
+
*
|
|
78
|
+
* @param effect - Character state mutations
|
|
79
|
+
* @returns this for chaining
|
|
80
|
+
*/
|
|
81
|
+
effect(effect) {
|
|
82
|
+
this._effect = { ...effect };
|
|
83
|
+
return this;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Set the duration type.
|
|
87
|
+
*
|
|
88
|
+
* @param duration - 'while present', 'momentary', or 'lingering'
|
|
89
|
+
* @returns this for chaining
|
|
90
|
+
*/
|
|
91
|
+
duration(duration) {
|
|
92
|
+
this._duration = duration;
|
|
93
|
+
return this;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Set the message ID when the target is affected.
|
|
97
|
+
*
|
|
98
|
+
* @param messageId - Message ID
|
|
99
|
+
* @returns this for chaining
|
|
100
|
+
*/
|
|
101
|
+
witnessed(messageId) {
|
|
102
|
+
this._witnessed = messageId;
|
|
103
|
+
return this;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Set the message ID when the target resists.
|
|
107
|
+
*
|
|
108
|
+
* @param messageId - Message ID
|
|
109
|
+
* @returns this for chaining
|
|
110
|
+
*/
|
|
111
|
+
resisted(messageId) {
|
|
112
|
+
this._resisted = messageId;
|
|
113
|
+
return this;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Set scheduling conditions for passive influences.
|
|
117
|
+
*
|
|
118
|
+
* @param schedule - Schedule with predicate conditions
|
|
119
|
+
* @returns this for chaining
|
|
120
|
+
*/
|
|
121
|
+
schedule(schedule) {
|
|
122
|
+
this._schedule = { ...schedule };
|
|
123
|
+
return this;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Set the message ID when PC tries to act while under this influence.
|
|
127
|
+
*
|
|
128
|
+
* @param messageId - Message ID
|
|
129
|
+
* @returns this for chaining
|
|
130
|
+
*/
|
|
131
|
+
onPlayerAction(messageId) {
|
|
132
|
+
this._onPlayerAction = messageId;
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Set lingering duration in turns.
|
|
137
|
+
*
|
|
138
|
+
* @param turns - Number of turns the effect persists
|
|
139
|
+
* @returns this for chaining
|
|
140
|
+
*/
|
|
141
|
+
lingeringTurns(turns) {
|
|
142
|
+
this._lingeringTurns = turns;
|
|
143
|
+
return this;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Set a predicate condition that clears a lingering effect.
|
|
147
|
+
*
|
|
148
|
+
* @param condition - Predicate condition
|
|
149
|
+
* @returns this for chaining
|
|
150
|
+
*/
|
|
151
|
+
clearsWhen(condition) {
|
|
152
|
+
this._lingeringClearCondition = condition;
|
|
153
|
+
return this;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Finalize this influence definition and return the parent builder.
|
|
157
|
+
*
|
|
158
|
+
* @returns The parent builder
|
|
159
|
+
*/
|
|
160
|
+
done() {
|
|
161
|
+
this._finalize(this._buildDef());
|
|
162
|
+
return this._parent;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Compile the parent builder, auto-finalizing this influence.
|
|
166
|
+
*
|
|
167
|
+
* @returns Compiled character data (delegates to parent's compile())
|
|
168
|
+
*/
|
|
169
|
+
compile() {
|
|
170
|
+
const parent = this.done();
|
|
171
|
+
return parent.compile();
|
|
172
|
+
}
|
|
173
|
+
/** @internal Build the InfluenceDef without finalizing. */
|
|
174
|
+
_buildDef() {
|
|
175
|
+
const def = {
|
|
176
|
+
name: this._name,
|
|
177
|
+
mode: this._mode,
|
|
178
|
+
range: this._range,
|
|
179
|
+
effect: { ...this._effect },
|
|
180
|
+
duration: this._duration,
|
|
181
|
+
};
|
|
182
|
+
if (this._witnessed !== undefined)
|
|
183
|
+
def.witnessed = this._witnessed;
|
|
184
|
+
if (this._resisted !== undefined)
|
|
185
|
+
def.resisted = this._resisted;
|
|
186
|
+
if (this._schedule !== undefined)
|
|
187
|
+
def.schedule = { ...this._schedule };
|
|
188
|
+
if (this._onPlayerAction !== undefined)
|
|
189
|
+
def.onPlayerAction = this._onPlayerAction;
|
|
190
|
+
if (this._lingeringTurns !== undefined)
|
|
191
|
+
def.lingeringTurns = this._lingeringTurns;
|
|
192
|
+
if (this._lingeringClearCondition !== undefined)
|
|
193
|
+
def.lingeringClearCondition = this._lingeringClearCondition;
|
|
194
|
+
return def;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.InfluenceBuilder = InfluenceBuilder;
|
|
198
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../../../../../repos/sharpee/packages/character/src/influence/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NPC influence exports (ADR-146)
|
|
3
|
+
*
|
|
4
|
+
* Influence definitions, evaluation engine, duration tracking,
|
|
5
|
+
* and PC influence handling.
|
|
6
|
+
*
|
|
7
|
+
* Public interface: All re-exported types, classes, and functions.
|
|
8
|
+
* Owner context: @sharpee/character / influence
|
|
9
|
+
*/
|
|
10
|
+
export { type InfluenceMode, type InfluenceRange, type InfluenceDuration, type InfluenceEffect, type InfluenceSchedule, type InfluenceDef, type ResistanceDef, type ActiveInfluenceEffect, type InfluenceResult, } from './influence-types';
|
|
11
|
+
export { type InfluenceRoomEntity, checkResistance, evaluatePassiveInfluences, evaluateActiveInfluence, } from './influence-evaluator';
|
|
12
|
+
export { InfluenceTracker } from './influence-duration';
|
|
13
|
+
export { type PcInfluenceResult, evaluatePcInfluence, } from './pc-influence';
|
|
14
|
+
export { InfluenceBuilder } from './builder';
|
|
15
|
+
export { InfluenceMessages, type InfluenceMessageId, } from './influence-messages';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../repos/sharpee/packages/character/src/influence/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,GACrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,KAAK,mBAAmB,EACxB,eAAe,EACf,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EACL,KAAK,iBAAiB,EACtB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EACL,iBAAiB,EACjB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* NPC influence exports (ADR-146)
|
|
4
|
+
*
|
|
5
|
+
* Influence definitions, evaluation engine, duration tracking,
|
|
6
|
+
* and PC influence handling.
|
|
7
|
+
*
|
|
8
|
+
* Public interface: All re-exported types, classes, and functions.
|
|
9
|
+
* Owner context: @sharpee/character / influence
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.InfluenceMessages = exports.InfluenceBuilder = exports.evaluatePcInfluence = exports.InfluenceTracker = exports.evaluateActiveInfluence = exports.evaluatePassiveInfluences = exports.checkResistance = void 0;
|
|
13
|
+
var influence_evaluator_1 = require("./influence-evaluator");
|
|
14
|
+
Object.defineProperty(exports, "checkResistance", { enumerable: true, get: function () { return influence_evaluator_1.checkResistance; } });
|
|
15
|
+
Object.defineProperty(exports, "evaluatePassiveInfluences", { enumerable: true, get: function () { return influence_evaluator_1.evaluatePassiveInfluences; } });
|
|
16
|
+
Object.defineProperty(exports, "evaluateActiveInfluence", { enumerable: true, get: function () { return influence_evaluator_1.evaluateActiveInfluence; } });
|
|
17
|
+
var influence_duration_1 = require("./influence-duration");
|
|
18
|
+
Object.defineProperty(exports, "InfluenceTracker", { enumerable: true, get: function () { return influence_duration_1.InfluenceTracker; } });
|
|
19
|
+
var pc_influence_1 = require("./pc-influence");
|
|
20
|
+
Object.defineProperty(exports, "evaluatePcInfluence", { enumerable: true, get: function () { return pc_influence_1.evaluatePcInfluence; } });
|
|
21
|
+
var builder_1 = require("./builder");
|
|
22
|
+
Object.defineProperty(exports, "InfluenceBuilder", { enumerable: true, get: function () { return builder_1.InfluenceBuilder; } });
|
|
23
|
+
var influence_messages_1 = require("./influence-messages");
|
|
24
|
+
Object.defineProperty(exports, "InfluenceMessages", { enumerable: true, get: function () { return influence_messages_1.InfluenceMessages; } });
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../repos/sharpee/packages/character/src/influence/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAcH,6DAK+B;AAH7B,sHAAA,eAAe,OAAA;AACf,gIAAA,yBAAyB,OAAA;AACzB,8HAAA,uBAAuB,OAAA;AAGzB,2DAAwD;AAA/C,sHAAA,gBAAgB,OAAA;AAEzB,+CAGwB;AADtB,mHAAA,mBAAmB,OAAA;AAGrB,qCAA6C;AAApC,2GAAA,gBAAgB,OAAA;AAEzB,2DAG8B;AAF5B,uHAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Influence duration tracking (ADR-146 layer 3)
|
|
3
|
+
*
|
|
4
|
+
* Tracks active influence effects and manages their expiration:
|
|
5
|
+
* 'while present' clears when influencer leaves room,
|
|
6
|
+
* 'momentary' clears after one turn,
|
|
7
|
+
* 'lingering' clears after authored turns or when a condition is met.
|
|
8
|
+
*
|
|
9
|
+
* Public interface: InfluenceTracker.
|
|
10
|
+
* Owner context: @sharpee/character / influence
|
|
11
|
+
*/
|
|
12
|
+
import { ActiveInfluenceEffect, InfluenceEffect, InfluenceDuration } from './influence-types';
|
|
13
|
+
/**
|
|
14
|
+
* Tracks and manages active influence effects across turns.
|
|
15
|
+
*
|
|
16
|
+
* The tracker maintains a list of currently active effects and
|
|
17
|
+
* provides methods to add, query, and expire them.
|
|
18
|
+
*/
|
|
19
|
+
export declare class InfluenceTracker {
|
|
20
|
+
private effects;
|
|
21
|
+
/**
|
|
22
|
+
* Record a new active influence effect.
|
|
23
|
+
*
|
|
24
|
+
* @param influenceName - The influence name
|
|
25
|
+
* @param influencerId - The influencer entity ID
|
|
26
|
+
* @param targetId - The target entity ID
|
|
27
|
+
* @param effect - The applied effect mutations
|
|
28
|
+
* @param options - Duration, timing, and clear condition options
|
|
29
|
+
*/
|
|
30
|
+
track(influenceName: string, influencerId: string, targetId: string, effect: InfluenceEffect, options: {
|
|
31
|
+
duration: InfluenceDuration;
|
|
32
|
+
turn: number;
|
|
33
|
+
lingeringTurns?: number;
|
|
34
|
+
clearCondition?: string;
|
|
35
|
+
}): void;
|
|
36
|
+
/**
|
|
37
|
+
* Get all active effects on a specific target.
|
|
38
|
+
*
|
|
39
|
+
* @param targetId - The target entity ID
|
|
40
|
+
* @returns Active effects affecting this target
|
|
41
|
+
*/
|
|
42
|
+
getEffectsOn(targetId: string): ActiveInfluenceEffect[];
|
|
43
|
+
/**
|
|
44
|
+
* Get all active effects from a specific influencer.
|
|
45
|
+
*
|
|
46
|
+
* @param influencerId - The influencer entity ID
|
|
47
|
+
* @returns Active effects from this influencer
|
|
48
|
+
*/
|
|
49
|
+
getEffectsFrom(influencerId: string): ActiveInfluenceEffect[];
|
|
50
|
+
/**
|
|
51
|
+
* Check if a target is under a specific influence.
|
|
52
|
+
*
|
|
53
|
+
* @param targetId - The target entity ID
|
|
54
|
+
* @param influenceName - The influence name
|
|
55
|
+
* @returns true if the target is currently under this influence
|
|
56
|
+
*/
|
|
57
|
+
isUnderInfluence(targetId: string, influenceName: string): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Expire 'while present' effects when the influencer leaves a room.
|
|
60
|
+
*
|
|
61
|
+
* @param influencerId - The influencer who left
|
|
62
|
+
* @param roomEntityIds - Entity IDs still in the room (targets to clear)
|
|
63
|
+
* @returns Effects that were cleared
|
|
64
|
+
*/
|
|
65
|
+
expireOnDeparture(influencerId: string, roomEntityIds?: string[]): ActiveInfluenceEffect[];
|
|
66
|
+
/**
|
|
67
|
+
* Expire 'momentary' effects and check lingering expiration.
|
|
68
|
+
* Call once per turn.
|
|
69
|
+
*
|
|
70
|
+
* @param currentTurn - The current turn number
|
|
71
|
+
* @param evaluatePredicate - Function to evaluate clear conditions (targetId, predicate) => boolean
|
|
72
|
+
* @returns Effects that were cleared
|
|
73
|
+
*/
|
|
74
|
+
expireTurn(currentTurn: number, evaluatePredicate?: (targetId: string, predicate: string) => boolean): ActiveInfluenceEffect[];
|
|
75
|
+
/** Get the count of active effects. */
|
|
76
|
+
get count(): number;
|
|
77
|
+
/** Export for serialization. */
|
|
78
|
+
toJSON(): ActiveInfluenceEffect[];
|
|
79
|
+
/** Restore from serialized data. */
|
|
80
|
+
static fromJSON(data: ActiveInfluenceEffect[]): InfluenceTracker;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=influence-duration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"influence-duration.d.ts","sourceRoot":"","sources":["../../../../../../repos/sharpee/packages/character/src/influence/influence-duration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAE3B;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAA+B;IAE9C;;;;;;;;OAQG;IACH,KAAK,CACH,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE;QACP,QAAQ,EAAE,iBAAiB,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,GACA,IAAI;IAuBP;;;;;OAKG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,qBAAqB,EAAE;IAIvD;;;;;OAKG;IACH,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,qBAAqB,EAAE;IAI7D;;;;;;OAMG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO;IAMlE;;;;;;OAMG;IACH,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,qBAAqB,EAAE;IAe1F;;;;;;;OAOG;IACH,UAAU,CACR,WAAW,EAAE,MAAM,EACnB,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,GACnE,qBAAqB,EAAE;IAoC1B,uCAAuC;IACvC,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,gCAAgC;IAChC,MAAM,IAAI,qBAAqB,EAAE;IAIjC,oCAAoC;IACpC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,qBAAqB,EAAE,GAAG,gBAAgB;CAKjE"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Influence duration tracking (ADR-146 layer 3)
|
|
4
|
+
*
|
|
5
|
+
* Tracks active influence effects and manages their expiration:
|
|
6
|
+
* 'while present' clears when influencer leaves room,
|
|
7
|
+
* 'momentary' clears after one turn,
|
|
8
|
+
* 'lingering' clears after authored turns or when a condition is met.
|
|
9
|
+
*
|
|
10
|
+
* Public interface: InfluenceTracker.
|
|
11
|
+
* Owner context: @sharpee/character / influence
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.InfluenceTracker = void 0;
|
|
15
|
+
/**
|
|
16
|
+
* Tracks and manages active influence effects across turns.
|
|
17
|
+
*
|
|
18
|
+
* The tracker maintains a list of currently active effects and
|
|
19
|
+
* provides methods to add, query, and expire them.
|
|
20
|
+
*/
|
|
21
|
+
class InfluenceTracker {
|
|
22
|
+
effects = [];
|
|
23
|
+
/**
|
|
24
|
+
* Record a new active influence effect.
|
|
25
|
+
*
|
|
26
|
+
* @param influenceName - The influence name
|
|
27
|
+
* @param influencerId - The influencer entity ID
|
|
28
|
+
* @param targetId - The target entity ID
|
|
29
|
+
* @param effect - The applied effect mutations
|
|
30
|
+
* @param options - Duration, timing, and clear condition options
|
|
31
|
+
*/
|
|
32
|
+
track(influenceName, influencerId, targetId, effect, options) {
|
|
33
|
+
const { duration, turn, lingeringTurns, clearCondition } = options;
|
|
34
|
+
// Don't double-track the same influence on the same target from the same source
|
|
35
|
+
const existing = this.effects.findIndex(e => e.influenceName === influenceName &&
|
|
36
|
+
e.influencerId === influencerId &&
|
|
37
|
+
e.targetId === targetId);
|
|
38
|
+
if (existing >= 0)
|
|
39
|
+
return;
|
|
40
|
+
this.effects.push({
|
|
41
|
+
influenceName,
|
|
42
|
+
influencerId,
|
|
43
|
+
targetId,
|
|
44
|
+
effect: { ...effect },
|
|
45
|
+
duration,
|
|
46
|
+
appliedAtTurn: turn,
|
|
47
|
+
expiresAtTurn: lingeringTurns != null ? turn + lingeringTurns : undefined,
|
|
48
|
+
clearCondition,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get all active effects on a specific target.
|
|
53
|
+
*
|
|
54
|
+
* @param targetId - The target entity ID
|
|
55
|
+
* @returns Active effects affecting this target
|
|
56
|
+
*/
|
|
57
|
+
getEffectsOn(targetId) {
|
|
58
|
+
return this.effects.filter(e => e.targetId === targetId);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get all active effects from a specific influencer.
|
|
62
|
+
*
|
|
63
|
+
* @param influencerId - The influencer entity ID
|
|
64
|
+
* @returns Active effects from this influencer
|
|
65
|
+
*/
|
|
66
|
+
getEffectsFrom(influencerId) {
|
|
67
|
+
return this.effects.filter(e => e.influencerId === influencerId);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Check if a target is under a specific influence.
|
|
71
|
+
*
|
|
72
|
+
* @param targetId - The target entity ID
|
|
73
|
+
* @param influenceName - The influence name
|
|
74
|
+
* @returns true if the target is currently under this influence
|
|
75
|
+
*/
|
|
76
|
+
isUnderInfluence(targetId, influenceName) {
|
|
77
|
+
return this.effects.some(e => e.targetId === targetId && e.influenceName === influenceName);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Expire 'while present' effects when the influencer leaves a room.
|
|
81
|
+
*
|
|
82
|
+
* @param influencerId - The influencer who left
|
|
83
|
+
* @param roomEntityIds - Entity IDs still in the room (targets to clear)
|
|
84
|
+
* @returns Effects that were cleared
|
|
85
|
+
*/
|
|
86
|
+
expireOnDeparture(influencerId, roomEntityIds) {
|
|
87
|
+
const expired = [];
|
|
88
|
+
this.effects = this.effects.filter(e => {
|
|
89
|
+
if (e.influencerId === influencerId &&
|
|
90
|
+
e.duration === 'while present') {
|
|
91
|
+
expired.push(e);
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
return true;
|
|
95
|
+
});
|
|
96
|
+
return expired;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Expire 'momentary' effects and check lingering expiration.
|
|
100
|
+
* Call once per turn.
|
|
101
|
+
*
|
|
102
|
+
* @param currentTurn - The current turn number
|
|
103
|
+
* @param evaluatePredicate - Function to evaluate clear conditions (targetId, predicate) => boolean
|
|
104
|
+
* @returns Effects that were cleared
|
|
105
|
+
*/
|
|
106
|
+
expireTurn(currentTurn, evaluatePredicate) {
|
|
107
|
+
const expired = [];
|
|
108
|
+
this.effects = this.effects.filter(e => {
|
|
109
|
+
// Momentary: expires after one turn (applied on turn N, gone on turn N+1)
|
|
110
|
+
if (e.duration === 'momentary' && currentTurn > e.appliedAtTurn) {
|
|
111
|
+
expired.push(e);
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
// Lingering with turn limit
|
|
115
|
+
if (e.duration === 'lingering' &&
|
|
116
|
+
e.expiresAtTurn !== undefined &&
|
|
117
|
+
currentTurn >= e.expiresAtTurn) {
|
|
118
|
+
expired.push(e);
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
// Lingering with clear condition
|
|
122
|
+
if (e.duration === 'lingering' &&
|
|
123
|
+
e.clearCondition &&
|
|
124
|
+
evaluatePredicate?.(e.targetId, e.clearCondition)) {
|
|
125
|
+
expired.push(e);
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
return true;
|
|
129
|
+
});
|
|
130
|
+
return expired;
|
|
131
|
+
}
|
|
132
|
+
/** Get the count of active effects. */
|
|
133
|
+
get count() {
|
|
134
|
+
return this.effects.length;
|
|
135
|
+
}
|
|
136
|
+
/** Export for serialization. */
|
|
137
|
+
toJSON() {
|
|
138
|
+
return this.effects.map(e => ({ ...e, effect: { ...e.effect } }));
|
|
139
|
+
}
|
|
140
|
+
/** Restore from serialized data. */
|
|
141
|
+
static fromJSON(data) {
|
|
142
|
+
const tracker = new InfluenceTracker();
|
|
143
|
+
tracker.effects = data.map(e => ({ ...e, effect: { ...e.effect } }));
|
|
144
|
+
return tracker;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
exports.InfluenceTracker = InfluenceTracker;
|
|
148
|
+
//# sourceMappingURL=influence-duration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"influence-duration.js","sourceRoot":"","sources":["../../../../../../../repos/sharpee/packages/character/src/influence/influence-duration.ts"],"names":[],"mappings":"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"}
|