@rpgjs/action-battle 5.0.0-beta.11 → 5.0.0-beta.12
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/CHANGELOG.md +11 -0
- package/dist/client/ai.server.d.ts +45 -8
- package/dist/client/attack-input.d.ts +3 -0
- package/dist/client/core/action-use.d.ts +18 -0
- package/dist/client/core/ai-behavior-tree.d.ts +99 -0
- package/dist/client/core/attack-runtime.d.ts +2 -0
- package/dist/client/core/defaults.d.ts +2 -1
- package/dist/client/core/equipment.d.ts +1 -0
- package/dist/client/core/targets.d.ts +15 -0
- package/dist/client/enemies/factory.d.ts +2 -0
- package/dist/client/index.d.ts +12 -7
- package/dist/client/index.js +16 -11
- package/dist/client/index10.js +32 -56
- package/dist/client/index11.js +99 -52
- package/dist/client/index12.js +76 -103
- package/dist/client/index13.js +72 -135
- package/dist/client/index14.js +67 -23
- package/dist/client/index15.js +197 -63
- package/dist/client/index16.js +112 -1337
- package/dist/client/index17.js +193 -7
- package/dist/client/index18.js +32 -58
- package/dist/client/index19.js +70 -8
- package/dist/client/index20.js +57 -501
- package/dist/client/index21.js +69 -0
- package/dist/client/index22.js +225 -0
- package/dist/client/index23.js +16 -0
- package/dist/client/index24.js +25 -0
- package/dist/client/index25.js +107 -0
- package/dist/client/index26.js +1707 -0
- package/dist/client/index27.js +12 -0
- package/dist/client/index28.js +589 -0
- package/dist/client/index4.js +79 -38
- package/dist/client/index6.js +65 -306
- package/dist/client/index7.js +33 -33
- package/dist/client/index8.js +24 -100
- package/dist/client/index9.js +293 -61
- package/dist/client/locomotion.d.ts +16 -0
- package/dist/client/movement.d.ts +14 -0
- package/dist/client/server.d.ts +7 -3
- package/dist/client/ui.d.ts +22 -0
- package/dist/client/visual.d.ts +15 -0
- package/dist/server/ai.server.d.ts +45 -8
- package/dist/server/attack-input.d.ts +3 -0
- package/dist/server/core/action-use.d.ts +18 -0
- package/dist/server/core/ai-behavior-tree.d.ts +99 -0
- package/dist/server/core/attack-runtime.d.ts +2 -0
- package/dist/server/core/defaults.d.ts +2 -1
- package/dist/server/core/equipment.d.ts +1 -0
- package/dist/server/core/targets.d.ts +15 -0
- package/dist/server/enemies/factory.d.ts +2 -0
- package/dist/server/index.d.ts +12 -7
- package/dist/server/index.js +14 -9
- package/dist/server/index10.js +64 -1336
- package/dist/server/index11.js +33 -33
- package/dist/server/index13.js +66 -11
- package/dist/server/index14.js +206 -484
- package/dist/server/index15.js +15 -9
- package/dist/server/index16.js +26 -0
- package/dist/server/index17.js +25 -0
- package/dist/server/index18.js +107 -0
- package/dist/server/index19.js +1707 -0
- package/dist/server/index2.js +10 -2
- package/dist/server/index20.js +37 -0
- package/dist/server/index21.js +588 -0
- package/dist/server/index22.js +78 -0
- package/dist/server/index23.js +12 -0
- package/dist/server/index5.js +79 -38
- package/dist/server/index6.js +192 -129
- package/dist/server/index7.js +198 -24
- package/dist/server/index8.js +28 -66
- package/dist/server/index9.js +68 -51
- package/dist/server/locomotion.d.ts +16 -0
- package/dist/server/movement.d.ts +14 -0
- package/dist/server/server.d.ts +7 -3
- package/dist/server/ui.d.ts +22 -0
- package/dist/server/visual.d.ts +15 -0
- package/package.json +5 -5
- package/src/ai.server.spec.ts +233 -0
- package/src/ai.server.ts +627 -108
- package/src/animations.spec.ts +40 -0
- package/src/animations.ts +31 -9
- package/src/attack-input.spec.ts +51 -0
- package/src/attack-input.ts +59 -0
- package/src/client.ts +75 -62
- package/src/config.ts +84 -37
- package/src/core/action-use.spec.ts +317 -0
- package/src/core/action-use.ts +386 -0
- package/src/core/ai-behavior-tree.spec.ts +116 -0
- package/src/core/ai-behavior-tree.ts +272 -0
- package/src/core/attack-profile.spec.ts +46 -0
- package/src/core/attack-runtime.spec.ts +35 -0
- package/src/core/attack-runtime.ts +32 -0
- package/src/core/context.ts +9 -0
- package/src/core/contracts.ts +146 -1
- package/src/core/defaults.ts +56 -0
- package/src/core/equipment.ts +9 -5
- package/src/core/targets.spec.ts +112 -0
- package/src/core/targets.ts +147 -0
- package/src/enemies/factory.ts +8 -0
- package/src/index.ts +111 -2
- package/src/locomotion.spec.ts +51 -0
- package/src/locomotion.ts +48 -0
- package/src/movement.spec.ts +78 -0
- package/src/movement.ts +46 -0
- package/src/server.ts +242 -66
- package/src/types.ts +105 -35
- package/src/ui.ts +113 -0
- package/src/visual.spec.ts +166 -0
- package/src/visual.ts +285 -0
- package/README.md +0 -1242
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# @rpgjs/action-battle
|
|
2
2
|
|
|
3
|
+
## 5.0.0-beta.12
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Prepare beta.12 with action battle AI, area queries, client visuals, event component resolvers, projectile handling, and related Vite/runtime updates.
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @rpgjs/client@5.0.0-beta.12
|
|
10
|
+
- @rpgjs/common@5.0.0-beta.12
|
|
11
|
+
- @rpgjs/server@5.0.0-beta.12
|
|
12
|
+
- @rpgjs/vite@5.0.0-beta.12
|
|
13
|
+
|
|
3
14
|
## 5.0.0-beta.11
|
|
4
15
|
|
|
5
16
|
### Patch Changes
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { RpgEvent, RpgPlayer } from '@rpgjs/server';
|
|
2
2
|
import { ActionBattleEnemyAttackProfileMap } from './core/enemy-attack-profiles';
|
|
3
|
-
import {
|
|
3
|
+
import { ActionBattleAiSimpleBehavior, ActionBattleAiTreeInput } from './core/ai-behavior-tree';
|
|
4
|
+
import { ActionBattleAiPreset, ActionBattleDamageResult, ActionBattleEntity, ActionBattleTargetSelector } from './core/contracts';
|
|
4
5
|
import { NormalizedActionBattleHitReactionProfile, ActionBattleAnimationOptions } from './types';
|
|
5
6
|
type RpgEventWithBattleAi = RpgEvent & {
|
|
6
7
|
battleAi?: BattleAi;
|
|
@@ -23,13 +24,16 @@ export interface BattleAiDefeatReward {
|
|
|
23
24
|
}
|
|
24
25
|
export interface BattleAiDefeatedContext {
|
|
25
26
|
event: RpgEvent;
|
|
26
|
-
attacker?:
|
|
27
|
+
attacker?: ActionBattleEntity;
|
|
27
28
|
reward: BattleAiDefeatReward;
|
|
28
29
|
remove: () => void;
|
|
29
30
|
}
|
|
30
31
|
export type BattleAiDefeatedCallback = (context: BattleAiDefeatedContext) => void;
|
|
31
|
-
export type BattleAiLegacyDefeatedCallback = (event: RpgEvent, attacker?:
|
|
32
|
+
export type BattleAiLegacyDefeatedCallback = (event: RpgEvent, attacker?: ActionBattleEntity) => void;
|
|
32
33
|
export interface BattleAiBaseOptions {
|
|
34
|
+
preset?: string | ActionBattleAiPreset;
|
|
35
|
+
faction?: string;
|
|
36
|
+
targets?: ActionBattleTargetSelector;
|
|
33
37
|
enemyType?: EnemyType;
|
|
34
38
|
attackCooldown?: number;
|
|
35
39
|
visionRange?: number;
|
|
@@ -58,6 +62,9 @@ export interface BattleAiBaseOptions {
|
|
|
58
62
|
retreatThreshold?: number;
|
|
59
63
|
};
|
|
60
64
|
behaviorKey?: string;
|
|
65
|
+
tree?: ActionBattleAiTreeInput;
|
|
66
|
+
behaviorTree?: ActionBattleAiTreeInput;
|
|
67
|
+
simpleBehavior?: ActionBattleAiSimpleBehavior;
|
|
61
68
|
animations?: ActionBattleAnimationOptions;
|
|
62
69
|
rewards?: BattleAiRewards;
|
|
63
70
|
autoAwardRewards?: boolean;
|
|
@@ -280,6 +287,8 @@ export declare class BattleAi {
|
|
|
280
287
|
private stateStartTime;
|
|
281
288
|
private stunnedUntil;
|
|
282
289
|
private enemyType;
|
|
290
|
+
private faction?;
|
|
291
|
+
private targets;
|
|
283
292
|
private attackCooldown;
|
|
284
293
|
private visionRange;
|
|
285
294
|
private attackRange;
|
|
@@ -322,9 +331,15 @@ export declare class BattleAi {
|
|
|
322
331
|
private lastRetreatTime;
|
|
323
332
|
private timers;
|
|
324
333
|
private behaviorKey?;
|
|
334
|
+
private behaviorTree?;
|
|
335
|
+
private aiMemory;
|
|
325
336
|
private poise;
|
|
326
337
|
private hitstunMs;
|
|
327
338
|
private invincibilityMs;
|
|
339
|
+
private visionShape?;
|
|
340
|
+
private visionSetupRetries;
|
|
341
|
+
private maxVisionSetupRetries;
|
|
342
|
+
private destroyed;
|
|
328
343
|
/**
|
|
329
344
|
* Create a new Battle AI Controller
|
|
330
345
|
*
|
|
@@ -362,6 +377,7 @@ export declare class BattleAi {
|
|
|
362
377
|
* Setup vision detection
|
|
363
378
|
*/
|
|
364
379
|
private setupVision;
|
|
380
|
+
private scheduleVisionSetup;
|
|
365
381
|
/**
|
|
366
382
|
* Start the AI behavior loop
|
|
367
383
|
*/
|
|
@@ -412,6 +428,9 @@ export declare class BattleAi {
|
|
|
412
428
|
* Perform basic hitbox attack when no skill is set
|
|
413
429
|
*/
|
|
414
430
|
private performBasicHitbox;
|
|
431
|
+
private resolveBasicHitboxes;
|
|
432
|
+
private queryHitboxCandidates;
|
|
433
|
+
private processHitboxHits;
|
|
415
434
|
/**
|
|
416
435
|
* Apply hit to target using RPGJS damage system with knockback
|
|
417
436
|
*
|
|
@@ -524,19 +543,20 @@ export declare class BattleAi {
|
|
|
524
543
|
/**
|
|
525
544
|
* Handle player entering vision
|
|
526
545
|
*/
|
|
527
|
-
onDetectInShape(
|
|
546
|
+
onDetectInShape(target: ActionBattleEntity, shape: any): void;
|
|
547
|
+
private engageTarget;
|
|
528
548
|
/**
|
|
529
549
|
* Handle player leaving vision
|
|
530
550
|
*/
|
|
531
|
-
onDetectOutShape(
|
|
551
|
+
onDetectOutShape(target: ActionBattleEntity, shape: any): void;
|
|
532
552
|
/**
|
|
533
553
|
* Handle taking damage (called from server.ts)
|
|
534
554
|
*
|
|
535
555
|
* This triggers state changes like stun and flee check.
|
|
536
556
|
* The actual damage is applied externally via RPGJS API.
|
|
537
557
|
*/
|
|
538
|
-
takeDamage(attacker:
|
|
539
|
-
handleDamage(attacker:
|
|
558
|
+
takeDamage(attacker: ActionBattleEntity): boolean;
|
|
559
|
+
handleDamage(attacker: ActionBattleEntity, damageResult: ActionBattleDamageResult & {
|
|
540
560
|
reaction?: NormalizedActionBattleHitReactionProfile;
|
|
541
561
|
}): boolean;
|
|
542
562
|
/**
|
|
@@ -550,16 +570,33 @@ export declare class BattleAi {
|
|
|
550
570
|
* Get distance between entities
|
|
551
571
|
*/
|
|
552
572
|
private getDistance;
|
|
573
|
+
private resolveUsable;
|
|
574
|
+
private getCurrentActionRange;
|
|
575
|
+
private canTarget;
|
|
576
|
+
private findNearestTarget;
|
|
577
|
+
private isTargetDefeated;
|
|
578
|
+
private clearTarget;
|
|
553
579
|
private updateBehavior;
|
|
554
580
|
private applyCustomBehavior;
|
|
581
|
+
private applyAiDecision;
|
|
582
|
+
private createAiTreeContext;
|
|
583
|
+
private executeAiIntents;
|
|
584
|
+
private executeAiIntent;
|
|
585
|
+
private executeKeepDistance;
|
|
586
|
+
private executeRequestedAttack;
|
|
587
|
+
private executeRequestedSkill;
|
|
555
588
|
private handleTacticalMovement;
|
|
556
589
|
private handleAssaultMovement;
|
|
557
590
|
private requestMoveTo;
|
|
558
591
|
private schedule;
|
|
559
592
|
getHealth(): number;
|
|
560
593
|
getMaxHealth(): number;
|
|
561
|
-
getTarget():
|
|
594
|
+
getTarget(): ActionBattleEntity | null;
|
|
562
595
|
getState(): AiState;
|
|
596
|
+
getFaction(): string | undefined;
|
|
597
|
+
setFaction(faction: string | undefined): void;
|
|
598
|
+
getTargets(): ActionBattleTargetSelector;
|
|
599
|
+
setTargets(targets: ActionBattleTargetSelector): void;
|
|
563
600
|
getEnemyType(): EnemyType;
|
|
564
601
|
/**
|
|
565
602
|
* Clean up
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type ActionBattleResolvedDirection = "up" | "down" | "left" | "right";
|
|
2
|
+
export declare const resolveActionBattleAttackDirection: (entity: any, input?: any) => ActionBattleResolvedDirection;
|
|
3
|
+
export declare const applyActionBattleAttackDirection: (entity: any, direction: ActionBattleResolvedDirection) => void;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ActionBattleActionConfig, ActionBattleActionTarget, ActionBattleEntity, ActionBattleTargetOptions, ActionBattleProjectileImpactContext } from './contracts';
|
|
2
|
+
import { NormalizedActionBattleAttackProfile } from '../types';
|
|
3
|
+
export declare const getActionBattleActionConfig: (usable: any) => ActionBattleActionConfig | undefined;
|
|
4
|
+
export declare const getActionBattleActionRange: (usable: any) => number | undefined;
|
|
5
|
+
export declare const canActionBattleUseTarget: (attacker: ActionBattleEntity, target: ActionBattleEntity, actionTarget?: ActionBattleActionTarget, options?: ActionBattleTargetOptions) => boolean;
|
|
6
|
+
export declare const shouldUseActionBattleUsable: (usable: any, explicitSkill?: any) => boolean;
|
|
7
|
+
export declare const executeActionBattleUse: (input: {
|
|
8
|
+
attacker: ActionBattleEntity;
|
|
9
|
+
target?: ActionBattleEntity | ActionBattleEntity[] | null;
|
|
10
|
+
usable: any;
|
|
11
|
+
skill?: any;
|
|
12
|
+
weapon?: any;
|
|
13
|
+
pattern?: string;
|
|
14
|
+
profile?: NormalizedActionBattleAttackProfile;
|
|
15
|
+
playVisual?: boolean;
|
|
16
|
+
}) => boolean;
|
|
17
|
+
export declare const handleActionBattleProjectileImpact: (context: ActionBattleProjectileImpactContext) => void;
|
|
18
|
+
export declare const handleActionBattleProjectileDestroy: (projectileId: string) => void;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { RpgEvent, RpgPlayer } from '@rpgjs/server';
|
|
2
|
+
import { AiState, AttackPattern, EnemyType } from '../ai.server';
|
|
3
|
+
import { ActionBattleAiContext, ActionBattleAiDecision } from './contracts';
|
|
4
|
+
export type ActionBattleAiTreeStatus = "success" | "failure" | "running";
|
|
5
|
+
export type ActionBattleAiMemory = Record<string, any>;
|
|
6
|
+
export interface ActionBattleAiIntentBase {
|
|
7
|
+
consume?: boolean;
|
|
8
|
+
metadata?: Record<string, any>;
|
|
9
|
+
}
|
|
10
|
+
export type ActionBattleAiIntent = (ActionBattleAiIntentBase & {
|
|
11
|
+
type: "idle";
|
|
12
|
+
}) | (ActionBattleAiIntentBase & {
|
|
13
|
+
type: "patrol";
|
|
14
|
+
}) | (ActionBattleAiIntentBase & {
|
|
15
|
+
type: "faceTarget";
|
|
16
|
+
}) | (ActionBattleAiIntentBase & {
|
|
17
|
+
type: "moveToTarget";
|
|
18
|
+
}) | (ActionBattleAiIntentBase & {
|
|
19
|
+
type: "fleeFromTarget";
|
|
20
|
+
}) | (ActionBattleAiIntentBase & {
|
|
21
|
+
type: "keepDistance";
|
|
22
|
+
distance: number;
|
|
23
|
+
tolerance?: number;
|
|
24
|
+
}) | (ActionBattleAiIntentBase & {
|
|
25
|
+
type: "useAttack";
|
|
26
|
+
pattern?: AttackPattern | string;
|
|
27
|
+
}) | (ActionBattleAiIntentBase & {
|
|
28
|
+
type: "useSkill";
|
|
29
|
+
skill: any;
|
|
30
|
+
}) | (ActionBattleAiIntentBase & {
|
|
31
|
+
type: "setMode";
|
|
32
|
+
mode: NonNullable<ActionBattleAiDecision["mode"]>;
|
|
33
|
+
});
|
|
34
|
+
export interface ActionBattleAiSnapshotSelf {
|
|
35
|
+
event: RpgEvent;
|
|
36
|
+
state: AiState;
|
|
37
|
+
enemyType: EnemyType;
|
|
38
|
+
hpPercent: number | null;
|
|
39
|
+
attackRange: number;
|
|
40
|
+
}
|
|
41
|
+
export interface ActionBattleAiSnapshotTarget {
|
|
42
|
+
entity: RpgPlayer;
|
|
43
|
+
distance: number;
|
|
44
|
+
inAttackRange: boolean;
|
|
45
|
+
visible: boolean;
|
|
46
|
+
}
|
|
47
|
+
export interface ActionBattleAiTreeContext extends ActionBattleAiContext {
|
|
48
|
+
self: ActionBattleAiSnapshotSelf;
|
|
49
|
+
targetInfo: ActionBattleAiSnapshotTarget | null;
|
|
50
|
+
memory: ActionBattleAiMemory;
|
|
51
|
+
}
|
|
52
|
+
export interface ActionBattleAiTreeResult {
|
|
53
|
+
status: ActionBattleAiTreeStatus;
|
|
54
|
+
decision?: ActionBattleAiDecision;
|
|
55
|
+
intent?: ActionBattleAiIntent | ActionBattleAiIntent[];
|
|
56
|
+
}
|
|
57
|
+
export interface ActionBattleAiTreeNode {
|
|
58
|
+
tick(context: ActionBattleAiTreeContext): ActionBattleAiTreeResult;
|
|
59
|
+
}
|
|
60
|
+
export type ActionBattleAiTreeInput = ActionBattleAiTreeNode | ((context: ActionBattleAiTreeContext) => ActionBattleAiTreeResult | void);
|
|
61
|
+
export type ActionBattleAiCondition = (context: ActionBattleAiTreeContext) => boolean;
|
|
62
|
+
export type ActionBattleAiIntentInput = ActionBattleAiIntent | ActionBattleAiIntent[] | ActionBattleAiTreeNode | ((context: ActionBattleAiTreeContext) => ActionBattleAiIntent | ActionBattleAiIntent[]);
|
|
63
|
+
export interface ActionBattleAiRule {
|
|
64
|
+
condition: ActionBattleAiCondition;
|
|
65
|
+
then: ActionBattleAiIntentInput;
|
|
66
|
+
}
|
|
67
|
+
export interface ActionBattleAiSimpleBehavior {
|
|
68
|
+
when?: ActionBattleAiRule[];
|
|
69
|
+
otherwise?: ActionBattleAiIntentInput;
|
|
70
|
+
}
|
|
71
|
+
export declare const defineAiTree: (input: ActionBattleAiTreeInput) => ActionBattleAiTreeNode;
|
|
72
|
+
export declare const selector: (children: ActionBattleAiTreeInput[]) => ActionBattleAiTreeNode;
|
|
73
|
+
export declare const sequence: (children: ActionBattleAiTreeInput[]) => ActionBattleAiTreeNode;
|
|
74
|
+
export declare const condition: (predicate: ActionBattleAiCondition) => ActionBattleAiTreeNode;
|
|
75
|
+
export declare const action: (input: ActionBattleAiIntentInput, status?: ActionBattleAiTreeStatus) => ActionBattleAiTreeNode;
|
|
76
|
+
export declare const decision: (resolve: ActionBattleAiDecision | ((context: ActionBattleAiTreeContext) => ActionBattleAiDecision)) => ActionBattleAiTreeNode;
|
|
77
|
+
export declare const rule: (predicate: ActionBattleAiCondition, then: ActionBattleAiIntentInput) => ActionBattleAiRule;
|
|
78
|
+
export declare const defineAiBehavior: (behavior: ActionBattleAiSimpleBehavior) => ActionBattleAiTreeNode;
|
|
79
|
+
export declare const hpBelow: (ratio: number) => ActionBattleAiCondition;
|
|
80
|
+
export declare const targetVisible: () => ActionBattleAiCondition;
|
|
81
|
+
export declare const targetInRange: (range?: number) => ActionBattleAiCondition;
|
|
82
|
+
export declare const distanceLessThan: (distance: number) => ActionBattleAiCondition;
|
|
83
|
+
export declare const inState: (state: AiState) => ActionBattleAiCondition;
|
|
84
|
+
export declare const isEnemyType: (enemyType: EnemyType) => ActionBattleAiCondition;
|
|
85
|
+
export declare const idle: () => ActionBattleAiIntent;
|
|
86
|
+
export declare const patrol: () => ActionBattleAiIntent;
|
|
87
|
+
export declare const faceTarget: () => ActionBattleAiIntent;
|
|
88
|
+
export declare const chase: () => ActionBattleAiIntent;
|
|
89
|
+
export declare const moveToTarget: () => ActionBattleAiIntent;
|
|
90
|
+
export declare const flee: () => ActionBattleAiIntent;
|
|
91
|
+
export declare const fleeFromTarget: () => ActionBattleAiIntent;
|
|
92
|
+
export declare const keepDistance: (distance: number, tolerance?: number) => ActionBattleAiIntent;
|
|
93
|
+
export declare const useAttack: (pattern?: AttackPattern | string) => ActionBattleAiIntent;
|
|
94
|
+
export declare const useSkill: (skill: any) => ActionBattleAiIntent;
|
|
95
|
+
export declare const setMode: (mode: NonNullable<ActionBattleAiDecision["mode"]>) => ActionBattleAiIntent;
|
|
96
|
+
export declare const ifHpBelow: (ratio: number, then: ActionBattleAiIntentInput) => ActionBattleAiRule;
|
|
97
|
+
export declare const ifTargetVisible: (then: ActionBattleAiIntentInput) => ActionBattleAiRule;
|
|
98
|
+
export declare const ifTargetInRange: (then: ActionBattleAiIntentInput, range?: number) => ActionBattleAiRule;
|
|
99
|
+
export declare const ifDistanceLessThan: (distance: number, then: ActionBattleAiIntentInput) => ActionBattleAiRule;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { ActionBattleAttackHitPolicy, ActionBattleOptions, NormalizedActionBattleAttackProfile } from '../types';
|
|
2
|
+
import { ActionBattleHitbox } from './contracts';
|
|
2
3
|
export declare const ACTION_BATTLE_HITBOX_FRAME_MS = 16;
|
|
3
4
|
export declare function getNormalizedActionBattleAttackProfile(options?: ActionBattleOptions): NormalizedActionBattleAttackProfile;
|
|
4
5
|
export declare function resolveActionBattleHitboxSpeed(profile: NormalizedActionBattleAttackProfile, hitboxCount: number): number;
|
|
5
6
|
export declare function scheduleActionBattleStartup(profile: NormalizedActionBattleAttackProfile, callback: () => void, scheduler?: (callback: () => void, delayMs: number) => unknown): unknown;
|
|
7
|
+
export declare function runActionBattleActiveHitbox(profile: NormalizedActionBattleAttackProfile, resolveHitboxes: () => ActionBattleHitbox[], onHitboxes: (hitboxes: ActionBattleHitbox[]) => void, scheduler?: (callback: () => void, delayMs: number) => unknown): unknown;
|
|
6
8
|
export declare function createActionBattleAttackId(attackerId: string | number | undefined, profileId: string): string;
|
|
7
9
|
export declare class ActionBattleHitTracker {
|
|
8
10
|
private readonly hitPolicy;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RpgPlayer } from '@rpgjs/server';
|
|
2
|
-
import { ActionBattleAiBehavior, ActionBattleAttackContext, ActionBattleCombatSystem, ActionBattleDamageContext, ActionBattleKnockbackContext, ActionBattleKnockbackResult, ActionBattleSystems } from './contracts';
|
|
2
|
+
import { ActionBattleAiBehavior, ActionBattleAiPreset, ActionBattleAttackContext, ActionBattleCombatSystem, ActionBattleDamageContext, ActionBattleKnockbackContext, ActionBattleKnockbackResult, ActionBattleSystems } from './contracts';
|
|
3
3
|
export declare const DEFAULT_ZELDA_PLAYER_HITBOXES: {
|
|
4
4
|
up: {
|
|
5
5
|
offsetX: number;
|
|
@@ -77,5 +77,6 @@ export declare const defaultRpgjsDamageResolver: (context: ActionBattleDamageCon
|
|
|
77
77
|
export declare const defaultKnockbackResolver: (context: ActionBattleKnockbackContext) => ActionBattleKnockbackResult;
|
|
78
78
|
export declare const defaultCombatSystem: ActionBattleCombatSystem;
|
|
79
79
|
export declare const defaultEnemyBehaviors: Record<string, ActionBattleAiBehavior>;
|
|
80
|
+
export declare const defaultEnemyPresets: Record<string, ActionBattleAiPreset>;
|
|
80
81
|
export declare const defaultActionBattleSystems: ActionBattleSystems;
|
|
81
82
|
export declare const getEntityWeaponKnockbackForce: (entity: RpgPlayer) => number;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ActionBattleEntity, ActionBattleTargetContext, ActionBattleTargetOptions, ActionBattleTargetSelector } from './contracts';
|
|
2
|
+
export declare const ACTION_BATTLE_PLAYER_FACTION = "players";
|
|
3
|
+
export declare const ACTION_BATTLE_ENEMY_FACTION = "enemies";
|
|
4
|
+
type EntityKind = "player" | "event";
|
|
5
|
+
export declare const getActionBattleEntityKind: (entity: ActionBattleEntity) => EntityKind;
|
|
6
|
+
export declare const isActionBattlePlayer: (entity: ActionBattleEntity) => boolean;
|
|
7
|
+
export declare const isActionBattleEvent: (entity: ActionBattleEntity) => boolean;
|
|
8
|
+
export declare const isActionBattleCombatEntity: (entity: ActionBattleEntity | undefined | null) => entity is ActionBattleEntity;
|
|
9
|
+
export declare const getActionBattleFaction: (entity: ActionBattleEntity, options?: ActionBattleTargetOptions) => string | undefined;
|
|
10
|
+
export declare const getActionBattleTargets: (entity: ActionBattleEntity, fallback: ActionBattleTargetSelector) => ActionBattleTargetSelector;
|
|
11
|
+
export declare const isActionBattleTargetDefeated: (target: ActionBattleEntity | null | undefined) => boolean;
|
|
12
|
+
export declare const matchesActionBattleTargetSelector: (selector: ActionBattleTargetSelector | undefined, context: ActionBattleTargetContext) => boolean;
|
|
13
|
+
export declare const canActionBattleTarget: (attacker: ActionBattleEntity, target: ActionBattleEntity, selector: ActionBattleTargetSelector | undefined, options?: ActionBattleTargetOptions) => boolean;
|
|
14
|
+
export declare const getActionBattleEntitiesInRange: (attacker: ActionBattleEntity, radius: number, selector: ActionBattleTargetSelector | undefined, options?: ActionBattleTargetOptions) => ActionBattleEntity[];
|
|
15
|
+
export {};
|
|
@@ -4,4 +4,6 @@ export interface ActionBattleEnemyPreset extends BattleAiOptions {
|
|
|
4
4
|
stats?: (event: RpgEvent) => void;
|
|
5
5
|
}
|
|
6
6
|
export type ActionBattleEnemyPresetMap = Record<string, ActionBattleEnemyPreset>;
|
|
7
|
+
export declare const defineActionBattleEnemy: <T extends ActionBattleEnemyPreset>(preset: T) => T;
|
|
8
|
+
export declare const defineActionBattleAiPreset: <T extends BattleAiOptions>(preset: T) => T;
|
|
7
9
|
export declare const createActionEnemy: (event: RpgEvent, presetOrOptions: string | BattleAiOptions, presets?: ActionBattleEnemyPresetMap) => BattleAi;
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import { ActionBattleOptions } from './types';
|
|
2
2
|
export { BattleAi, AiState, EnemyType, AttackPattern, AiDebug, DEFAULT_KNOCKBACK } from './ai.server';
|
|
3
3
|
export type { HitResult, ApplyHitHooks, BattleAiOptions, BattleAiDefeatedCallback, BattleAiDefeatedContext, BattleAiDefeatReward, BattleAiLegacyDefeatedCallback, BattleAiLegacyOptions, BattleAiRewardItem, BattleAiRewards, } from './ai.server';
|
|
4
|
-
export type { ActionBattleAnimationContext, ActionBattleAnimationEntity, ActionBattleAnimationKey, ActionBattleAnimationOptions, ActionBattleAnimationResolver, ActionBattleAnimationResult, ActionBattleOptions, ActionBattleActionBarData, ActionBattleActionBarItem, ActionBattleActionBarSkill, ActionBattleSkillTargeting, ActionBattleSkillTargetingResolver, ActionBattleAttackOptions, ActionBattleUiOptions, ActionBattleUiActionBarOptions, ActionBattleUiTargetingOptions, ActionBattleAttackDirection, ActionBattleAttackHitboxConfig, ActionBattleAttackHitboxMap, ActionBattleAttackHitPolicy, ActionBattleAttackProfile,
|
|
5
|
-
export type { ActionBattleAiBehavior, ActionBattleAiContext, ActionBattleAiDecision, ActionBattleAttackContext, ActionBattleCombatSystem, ActionBattleDamageContext, ActionBattleDamageResult, ActionBattleDirection, ActionBattleEntity, ActionBattleHitContext, ActionBattleHitHooks, ActionBattleHitResult, ActionBattleHitbox, ActionBattleKnockbackContext, ActionBattleKnockbackResult, ActionBattleSystems, } from './core/contracts';
|
|
4
|
+
export type { ActionBattleAnimationContext, ActionBattleAnimationEntity, ActionBattleAnimationKey, ActionBattleAnimationOptions, ActionBattleAnimationResolver, ActionBattleAnimationResult, ActionBattleAiOptions, ActionBattleOptions, ActionBattleActionBarData, ActionBattleActionBarItem, ActionBattleActionBarSkill, ActionBattleSkillTargeting, ActionBattleSkillTargetingResolver, ActionBattleAttackOptions, ActionBattleUiOptions, ActionBattleUiActionBarOptions, ActionBattleUiAttackPreviewOptions, ActionBattleUiGuiEntry, ActionBattleUiTargetingOptions, ActionBattleAttackDirection, ActionBattleAttackHitboxConfig, ActionBattleAttackHitboxMap, ActionBattleAttackHitPolicy, ActionBattleAttackProfile, ActionBattleHitReactionProfile, NormalizedActionBattleHitReactionProfile, NormalizedActionBattleAttackProfile, ActionBattleCombatOptions, ActionBattleSystemOptions, ActionBattleAiSystemOptions, ActionBattleVisualComposer, ActionBattleVisualContext, ActionBattleVisualHelpers, ActionBattleVisualInput, ActionBattleVisualMoment, ActionBattleVisualPart, ActionBattleVisualPreset, } from './types';
|
|
5
|
+
export type { ActionBattleAiBehavior, ActionBattleAiContext, ActionBattleAiDecision, ActionBattleAiPreset, ActionBattleAttackContext, ActionBattleCombatSystem, ActionBattleDamageContext, ActionBattleDamageResult, ActionBattleDirection, ActionBattleEntity, ActionBattleActionConfig, ActionBattleActionMode, ActionBattleActionTarget, ActionBattleTargetContext, ActionBattleTargetOptions, ActionBattleTargetSelector, ActionBattleProjectileImpactContext, ActionBattleProjectileOptions, ActionBattleUsable, ActionBattleUseContext, ActionBattleHitContext, ActionBattleHitHooks, ActionBattleHitResult, ActionBattleHitbox, ActionBattleKnockbackContext, ActionBattleKnockbackResult, ActionBattleSystems, } from './core/contracts';
|
|
6
|
+
export { action, chase, condition, decision, defineAiBehavior, defineAiTree, distanceLessThan, faceTarget, flee, fleeFromTarget, hpBelow, idle, ifDistanceLessThan, ifHpBelow, ifTargetInRange, ifTargetVisible, inState, isEnemyType, keepDistance, moveToTarget, patrol, rule, selector, sequence, setMode, targetInRange, targetVisible, useAttack, useSkill, type ActionBattleAiCondition, type ActionBattleAiIntent, type ActionBattleAiIntentInput, type ActionBattleAiMemory, type ActionBattleAiRule, type ActionBattleAiSimpleBehavior, type ActionBattleAiSnapshotSelf, type ActionBattleAiSnapshotTarget, type ActionBattleAiTreeContext, type ActionBattleAiTreeInput, type ActionBattleAiTreeNode, type ActionBattleAiTreeResult, type ActionBattleAiTreeStatus, } from './core/ai-behavior-tree';
|
|
6
7
|
export { DEFAULT_ACTION_BATTLE_ATTACK_PROFILE, normalizeActionBattleAttackProfile, type ActionBattleAttackProfileFallbacks, } from './core/attack-profile';
|
|
7
|
-
export { ACTION_BATTLE_HITBOX_FRAME_MS, ActionBattleHitTracker, createActionBattleAttackId, getNormalizedActionBattleAttackProfile, resolveActionBattleHitboxSpeed, scheduleActionBattleStartup, } from './core/attack-runtime';
|
|
8
|
+
export { ACTION_BATTLE_HITBOX_FRAME_MS, ActionBattleHitTracker, createActionBattleAttackId, getNormalizedActionBattleAttackProfile, resolveActionBattleHitboxSpeed, runActionBattleActiveHitbox, scheduleActionBattleStartup, } from './core/attack-runtime';
|
|
9
|
+
export { canActionBattleUseTarget, executeActionBattleUse, getActionBattleActionConfig, getActionBattleActionRange, handleActionBattleProjectileDestroy, handleActionBattleProjectileImpact, shouldUseActionBattleUsable, } from './core/action-use';
|
|
8
10
|
export { DEFAULT_ACTION_BATTLE_HIT_REACTION, isActionBattleEntityInvincible, normalizeActionBattleHitReaction, setActionBattleInvincibility, } from './core/hit-reaction';
|
|
9
11
|
export { DEFAULT_ACTION_BATTLE_ENEMY_ATTACK_PROFILES, normalizeActionBattleEnemyAttackProfiles, type ActionBattleEnemyAttackProfileKey, type ActionBattleEnemyAttackProfileMap, type NormalizedActionBattleEnemyAttackProfileMap, } from './core/enemy-attack-profiles';
|
|
10
|
-
export { resolveActionBattleWeaponAttackProfile } from './core/equipment';
|
|
11
|
-
export { DEFAULT_ZELDA_PLAYER_HITBOXES, createDefaultPlayerHitboxResolver, defaultCombatSystem, defaultEnemyBehaviors, defaultKnockbackResolver, defaultRpgjsDamageResolver, } from './core/defaults';
|
|
12
|
+
export { resolveActionBattleWeapon, resolveActionBattleWeaponAttackProfile, } from './core/equipment';
|
|
13
|
+
export { DEFAULT_ZELDA_PLAYER_HITBOXES, createDefaultPlayerHitboxResolver, defaultCombatSystem, defaultEnemyBehaviors, defaultEnemyPresets, defaultKnockbackResolver, defaultRpgjsDamageResolver, } from './core/defaults';
|
|
14
|
+
export { ACTION_BATTLE_ENEMY_FACTION, ACTION_BATTLE_PLAYER_FACTION, canActionBattleTarget, getActionBattleFaction, getActionBattleTargets, isActionBattleCombatEntity, isActionBattleEvent, isActionBattlePlayer, matchesActionBattleTargetSelector, } from './core/targets';
|
|
12
15
|
export { createActionBattleSystems, getActionBattleSystems, } from './core/context';
|
|
13
16
|
export { applyActionBattleHit } from './core/hit';
|
|
14
|
-
export {
|
|
15
|
-
export {
|
|
17
|
+
export { ACTION_BATTLE_CLIENT_VISUAL_ID, ACTION_BATTLE_HIT_FX_COMPONENT_ID, createActionBattleClientVisuals, createActionBattleVisual, createClassicActionBattleVisual, createFxActionBattleVisual, emitActionBattleClientVisual, playActionBattleVisual, setActionBattlePreviewStarter, } from './visual';
|
|
18
|
+
export { ActionBattleUi, createActionBattleUi, resolveActionBattleUi, type ResolvedActionBattleUi, } from './ui';
|
|
19
|
+
export { createActionEnemy, defineActionBattleAiPreset, defineActionBattleEnemy, type ActionBattleEnemyPreset, type ActionBattleEnemyPresetMap, } from './enemies/factory';
|
|
20
|
+
export { DEFAULT_PLAYER_ATTACK_HITBOXES, getPlayerWeaponKnockbackForce, applyActionBattleEntityHit, applyPlayerHitToEvent, ACTION_BATTLE_ACTION_BAR_GUI_ID, openActionBattleActionBar, updateActionBattleActionBar, createActionBattleServer, } from './server';
|
|
16
21
|
export declare function provideActionBattle(options?: ActionBattleOptions): any[];
|
|
17
22
|
declare const _default: {
|
|
18
23
|
server: import('@rpgjs/server').RpgServer;
|
package/dist/client/index.js
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import { DEFAULT_ACTION_BATTLE_HIT_REACTION, isActionBattleEntityInvincible, normalizeActionBattleHitReaction, setActionBattleInvincibility } from "./index2.js";
|
|
2
2
|
import { DEFAULT_ACTION_BATTLE_ATTACK_PROFILE, normalizeActionBattleAttackProfile } from "./index3.js";
|
|
3
|
-
import { ACTION_BATTLE_HITBOX_FRAME_MS, ActionBattleHitTracker, createActionBattleAttackId, getNormalizedActionBattleAttackProfile, resolveActionBattleHitboxSpeed, scheduleActionBattleStartup } from "./
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { applyActionBattleHit } from "./
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
3
|
+
import { ACTION_BATTLE_HITBOX_FRAME_MS, ActionBattleHitTracker, createActionBattleAttackId, getNormalizedActionBattleAttackProfile, resolveActionBattleHitboxSpeed, runActionBattleActiveHitbox, scheduleActionBattleStartup } from "./index6.js";
|
|
4
|
+
import { ActionBattleUi, createActionBattleUi, resolveActionBattleUi } from "./index13.js";
|
|
5
|
+
import { ACTION_BATTLE_CLIENT_VISUAL_ID, ACTION_BATTLE_HIT_FX_COMPONENT_ID, createActionBattleClientVisuals, createActionBattleVisual, createClassicActionBattleVisual, createFxActionBattleVisual, emitActionBattleClientVisual, playActionBattleVisual, setActionBattlePreviewStarter } from "./index15.js";
|
|
6
|
+
import client_default, { createActionBattleClient } from "./index16.js";
|
|
7
|
+
import { DEFAULT_ZELDA_PLAYER_HITBOXES, createDefaultPlayerHitboxResolver, defaultCombatSystem, defaultEnemyBehaviors, defaultEnemyPresets, defaultKnockbackResolver, defaultRpgjsDamageResolver } from "./index17.js";
|
|
8
|
+
import { createActionBattleSystems, getActionBattleSystems } from "./index18.js";
|
|
9
|
+
import { DEFAULT_ACTION_BATTLE_ENEMY_ATTACK_PROFILES, normalizeActionBattleEnemyAttackProfiles } from "./index19.js";
|
|
10
|
+
import { applyActionBattleHit } from "./index20.js";
|
|
11
|
+
import { ACTION_BATTLE_ENEMY_FACTION, ACTION_BATTLE_PLAYER_FACTION, canActionBattleTarget, getActionBattleFaction, getActionBattleTargets, isActionBattleCombatEntity, isActionBattleEvent, isActionBattlePlayer, matchesActionBattleTargetSelector } from "./index21.js";
|
|
12
|
+
import { canActionBattleUseTarget, executeActionBattleUse, getActionBattleActionConfig, getActionBattleActionRange, handleActionBattleProjectileDestroy, handleActionBattleProjectileImpact, shouldUseActionBattleUsable } from "./index22.js";
|
|
13
|
+
import { resolveActionBattleWeapon, resolveActionBattleWeaponAttackProfile } from "./index23.js";
|
|
14
|
+
import { action, chase, condition, decision, defineAiBehavior, defineAiTree, distanceLessThan, faceTarget, flee, fleeFromTarget, hpBelow, idle, ifDistanceLessThan, ifHpBelow, ifTargetInRange, ifTargetVisible, inState, isEnemyType, keepDistance, moveToTarget, patrol, rule, selector, sequence, setMode, targetInRange, targetVisible, useAttack, useSkill } from "./index25.js";
|
|
15
|
+
import { AiDebug, AiState, AttackPattern, BattleAi, DEFAULT_KNOCKBACK, EnemyType } from "./index26.js";
|
|
16
|
+
import { createActionEnemy, defineActionBattleAiPreset, defineActionBattleEnemy } from "./index27.js";
|
|
17
|
+
import { ACTION_BATTLE_ACTION_BAR_GUI_ID, DEFAULT_PLAYER_ATTACK_HITBOXES, applyActionBattleEntityHit, applyPlayerHitToEvent, createActionBattleServer, getPlayerWeaponKnockbackForce, openActionBattleActionBar, updateActionBattleActionBar } from "./index28.js";
|
|
13
18
|
import { createModule } from "@rpgjs/common";
|
|
14
19
|
//#region src/index.ts
|
|
15
20
|
var server = null;
|
|
@@ -25,4 +30,4 @@ var src_default = {
|
|
|
25
30
|
client: client_default
|
|
26
31
|
};
|
|
27
32
|
//#endregion
|
|
28
|
-
export { ACTION_BATTLE_ACTION_BAR_GUI_ID, ACTION_BATTLE_HITBOX_FRAME_MS, ActionBattleHitTracker, AiDebug, AiState, AttackPattern, BattleAi, DEFAULT_ACTION_BATTLE_ATTACK_PROFILE, DEFAULT_ACTION_BATTLE_ENEMY_ATTACK_PROFILES, DEFAULT_ACTION_BATTLE_HIT_REACTION, DEFAULT_KNOCKBACK, DEFAULT_PLAYER_ATTACK_HITBOXES, DEFAULT_ZELDA_PLAYER_HITBOXES, EnemyType, applyActionBattleHit, applyPlayerHitToEvent, createActionBattleAttackId, createActionBattleServer, createActionBattleSystems, createActionEnemy, createDefaultPlayerHitboxResolver, src_default as default, defaultCombatSystem, defaultEnemyBehaviors, defaultKnockbackResolver, defaultRpgjsDamageResolver, getActionBattleSystems, getNormalizedActionBattleAttackProfile, getPlayerWeaponKnockbackForce, isActionBattleEntityInvincible, normalizeActionBattleAttackProfile, normalizeActionBattleEnemyAttackProfiles, normalizeActionBattleHitReaction, openActionBattleActionBar, provideActionBattle, resolveActionBattleHitboxSpeed, resolveActionBattleWeaponAttackProfile, scheduleActionBattleStartup, setActionBattleInvincibility, updateActionBattleActionBar };
|
|
33
|
+
export { ACTION_BATTLE_ACTION_BAR_GUI_ID, ACTION_BATTLE_CLIENT_VISUAL_ID, ACTION_BATTLE_ENEMY_FACTION, ACTION_BATTLE_HITBOX_FRAME_MS, ACTION_BATTLE_HIT_FX_COMPONENT_ID, ACTION_BATTLE_PLAYER_FACTION, ActionBattleHitTracker, ActionBattleUi, AiDebug, AiState, AttackPattern, BattleAi, DEFAULT_ACTION_BATTLE_ATTACK_PROFILE, DEFAULT_ACTION_BATTLE_ENEMY_ATTACK_PROFILES, DEFAULT_ACTION_BATTLE_HIT_REACTION, DEFAULT_KNOCKBACK, DEFAULT_PLAYER_ATTACK_HITBOXES, DEFAULT_ZELDA_PLAYER_HITBOXES, EnemyType, action, applyActionBattleEntityHit, applyActionBattleHit, applyPlayerHitToEvent, canActionBattleTarget, canActionBattleUseTarget, chase, condition, createActionBattleAttackId, createActionBattleClientVisuals, createActionBattleServer, createActionBattleSystems, createActionBattleUi, createActionBattleVisual, createActionEnemy, createClassicActionBattleVisual, createDefaultPlayerHitboxResolver, createFxActionBattleVisual, decision, src_default as default, defaultCombatSystem, defaultEnemyBehaviors, defaultEnemyPresets, defaultKnockbackResolver, defaultRpgjsDamageResolver, defineActionBattleAiPreset, defineActionBattleEnemy, defineAiBehavior, defineAiTree, distanceLessThan, emitActionBattleClientVisual, executeActionBattleUse, faceTarget, flee, fleeFromTarget, getActionBattleActionConfig, getActionBattleActionRange, getActionBattleFaction, getActionBattleSystems, getActionBattleTargets, getNormalizedActionBattleAttackProfile, getPlayerWeaponKnockbackForce, handleActionBattleProjectileDestroy, handleActionBattleProjectileImpact, hpBelow, idle, ifDistanceLessThan, ifHpBelow, ifTargetInRange, ifTargetVisible, inState, isActionBattleCombatEntity, isActionBattleEntityInvincible, isActionBattleEvent, isActionBattlePlayer, isEnemyType, keepDistance, matchesActionBattleTargetSelector, moveToTarget, normalizeActionBattleAttackProfile, normalizeActionBattleEnemyAttackProfiles, normalizeActionBattleHitReaction, openActionBattleActionBar, patrol, playActionBattleVisual, provideActionBattle, resolveActionBattleHitboxSpeed, resolveActionBattleUi, resolveActionBattleWeapon, resolveActionBattleWeaponAttackProfile, rule, runActionBattleActiveHitbox, scheduleActionBattleStartup, selector, sequence, setActionBattleInvincibility, setActionBattlePreviewStarter, setMode, shouldUseActionBattleUsable, targetInRange, targetVisible, updateActionBattleActionBar, useAttack, useSkill };
|
package/dist/client/index10.js
CHANGED
|
@@ -1,61 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
castSpell: "skill"
|
|
1
|
+
//#region src/targeting.ts
|
|
2
|
+
var normalizeMaskRows = (mask) => {
|
|
3
|
+
if (!mask) return ["#"];
|
|
4
|
+
if (Array.isArray(mask)) return mask;
|
|
5
|
+
return mask.trim().split("\n").map((row) => row.replace(/\r/g, ""));
|
|
7
6
|
};
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
7
|
+
var parseAoeMask = (mask) => {
|
|
8
|
+
const rows = normalizeMaskRows(mask);
|
|
9
|
+
const height = rows.length;
|
|
10
|
+
const width = rows.reduce((max, row) => Math.max(max, row.length), 0);
|
|
11
|
+
const centerX = Math.floor(width / 2);
|
|
12
|
+
const centerY = Math.floor(height / 2);
|
|
13
|
+
const cells = [];
|
|
14
|
+
rows.forEach((row, y) => {
|
|
15
|
+
for (let x = 0; x < row.length; x++) {
|
|
16
|
+
const char = row[x];
|
|
17
|
+
if (char && char !== "." && char !== " ") cells.push({
|
|
18
|
+
dx: x - centerX,
|
|
19
|
+
dy: y - centerY
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
if (cells.length === 0) cells.push({
|
|
24
|
+
dx: 0,
|
|
25
|
+
dy: 0
|
|
26
|
+
});
|
|
22
27
|
return {
|
|
23
|
-
|
|
24
|
-
|
|
28
|
+
width,
|
|
29
|
+
height,
|
|
30
|
+
centerX,
|
|
31
|
+
centerY,
|
|
32
|
+
cells
|
|
25
33
|
};
|
|
26
34
|
};
|
|
27
|
-
|
|
28
|
-
const defaultAnimationName = defaults.animationName ?? DEFAULT_ANIMATION_BY_KEY[key];
|
|
29
|
-
const defaultRepeat = defaults.repeat ?? 1;
|
|
30
|
-
const { hasConfiguredAnimation, configured: configuredAnimation } = getConfiguredAnimation(key, animations);
|
|
31
|
-
if (!hasConfiguredAnimation && key !== "attack") return null;
|
|
32
|
-
const configured = hasConfiguredAnimation ? configuredAnimation : defaultAnimationName;
|
|
33
|
-
const result = typeof configured === "function" ? configured(entity, context) : configured;
|
|
34
|
-
if (result == null) return null;
|
|
35
|
-
if (typeof result === "string") return {
|
|
36
|
-
animationName: result,
|
|
37
|
-
repeat: defaultRepeat,
|
|
38
|
-
waitEnd: false
|
|
39
|
-
};
|
|
40
|
-
return {
|
|
41
|
-
animationName: result.animationName ?? defaultAnimationName,
|
|
42
|
-
graphic: result.graphic,
|
|
43
|
-
repeat: result.repeat ?? defaultRepeat,
|
|
44
|
-
waitEnd: result.waitEnd ?? false,
|
|
45
|
-
delayMs: result.delayMs
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
function playActionBattleAnimation(key, entity, animations, context, defaults = {}) {
|
|
49
|
-
const animation = resolveActionBattleAnimation(key, entity, animations, context, defaults);
|
|
50
|
-
if (!animation) return null;
|
|
51
|
-
if (animation.graphic !== void 0) entity.setGraphicAnimation(animation.animationName, animation.graphic, animation.repeat);
|
|
52
|
-
else entity.setGraphicAnimation(animation.animationName, animation.repeat);
|
|
53
|
-
return animation;
|
|
54
|
-
}
|
|
55
|
-
function getActionBattleAnimationRemovalDelay(animation) {
|
|
56
|
-
if (!animation) return 0;
|
|
57
|
-
if (animation.delayMs !== void 0) return animation.delayMs;
|
|
58
|
-
return animation.waitEnd ? 500 : 0;
|
|
59
|
-
}
|
|
35
|
+
var manhattanDistance = (a, b) => Math.abs(a.x - b.x) + Math.abs(a.y - b.y);
|
|
60
36
|
//#endregion
|
|
61
|
-
export {
|
|
37
|
+
export { manhattanDistance, parseAoeMask };
|