@luceosports/play-rendering 2.7.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,6 +9,8 @@ export class PlayerModel {
9
9
  get isDefender(): boolean;
10
10
  get possession(): boolean;
11
11
  set possession(data: boolean);
12
+ get startBallsCount();
13
+ set startBallsCount(data: number);
12
14
  get position(): Position;
13
15
  get location(): CourtPoint;
14
16
  get color(): Color;
@@ -62,6 +62,7 @@ export interface Court {
62
62
  export interface Player {
63
63
  id: string;
64
64
  possession: boolean;
65
+ startBallsCount?: number;
65
66
  color: Color;
66
67
  position: Position;
67
68
  location: CourtPoint;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luceosports/play-rendering",
3
- "version": "2.7.0",
3
+ "version": "2.8.0",
4
4
  "main": "dist/play-rendering.js",
5
5
  "types": "dist/play-rendering.d.ts",
6
6
  "scripts": {
@@ -30,6 +30,19 @@ export default class PlayerModel extends Model<PlayerData, PlayerData> {
30
30
  this._setAttr('possession', data);
31
31
  }
32
32
 
33
+ get startBallsCount() {
34
+ const raw = this._getAttr('startBallsCount');
35
+ if (typeof raw === 'number') return raw;
36
+
37
+ // Backward-compatible fallback:
38
+ // legacy model encoded "starts with 1 ball" as possession=true.
39
+ return this.possession ? 1 : 0;
40
+ }
41
+
42
+ set startBallsCount(data) {
43
+ this._setAttr('startBallsCount', data);
44
+ }
45
+
33
46
  get position() {
34
47
  return this._getAttr('position');
35
48
  }
@@ -47,10 +60,12 @@ export default class PlayerModel extends Model<PlayerData, PlayerData> {
47
60
  }
48
61
 
49
62
  setPossession(prevPassLines: Line[]) {
50
- if (!prevPassLines.length) return;
51
- let possessionCount = this.possession ? 1 : 0;
52
- possessionCount += prevPassLines.filter(l => l.playerPositionTerminus === this.position).length;
53
- possessionCount -= prevPassLines.filter(l => l.playerPositionOrigin === this.position).length;
54
- this.possession = possessionCount > 0;
63
+ // Support multiple balls: start from startBallsCount, then apply transfers.
64
+ let ballsCount = this.startBallsCount;
65
+
66
+ ballsCount += prevPassLines.filter(l => l.playerPositionTerminus === this.position).length;
67
+ ballsCount -= prevPassLines.filter(l => l.playerPositionOrigin === this.position).length;
68
+
69
+ this.possession = ballsCount > 0;
55
70
  }
56
71
  }
@@ -136,6 +136,11 @@ export interface Court {
136
136
  export interface Player {
137
137
  id: string;
138
138
  possession: boolean;
139
+ /**
140
+ * How many balls the player starts with before applying PASS/HANDOFF/SHOT transfers.
141
+ * If omitted, legacy data falls back to `possession ? 1 : 0`.
142
+ */
143
+ startBallsCount?: number;
139
144
  color: Color;
140
145
  position: Position;
141
146
  location: CourtPoint;