@luceosports/play-rendering 1.12.5 → 1.13.1

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.
Files changed (60) hide show
  1. package/dist/play-rendering.js +3 -3
  2. package/dist/play-rendering.js.map +1 -1
  3. package/index.js +2 -1
  4. package/package.json +1 -1
  5. package/src/constants.js +19 -19
  6. package/src/layers/CourtLayer.js +8 -4
  7. package/src/layers/base/BaseLayer.js +7 -2
  8. package/src/layers/court/base/InternalCourtLayer.js +7 -0
  9. package/src/layers/court/index.js +48 -6
  10. package/src/layers/court/layers/BASKETBALL/common/LaneMarkingNBATrait.js +34 -0
  11. package/src/layers/court/layers/BASKETBALL/common/LaneMarkingNCAATrait.js +30 -0
  12. package/src/layers/court/layers/BASKETBALL/constants.js +7 -0
  13. package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/constants.js +13 -0
  14. package/src/layers/court/layers/{NBA → BASKETBALL/courtTypes/BIG3/layers}/Big3Layer.js +4 -9
  15. package/src/layers/court/layers/BASKETBALL/courtTypes/BIG3/layers/LaneMarkingLayer.js +12 -0
  16. package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/constants.js +13 -0
  17. package/src/layers/court/layers/BASKETBALL/courtTypes/FIBA/layers/LaneMarkingLayer.js +38 -0
  18. package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/constants.js +13 -0
  19. package/src/layers/court/layers/BASKETBALL/courtTypes/NBA/layers/LaneMarkingLayer.js +12 -0
  20. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/constants.js +13 -0
  21. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAM/layers/LaneMarkingLayer.js +12 -0
  22. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/constants.js +13 -0
  23. package/src/layers/court/layers/BASKETBALL/courtTypes/NCAAW/layers/LaneMarkingLayer.js +12 -0
  24. package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/constants.js +13 -0
  25. package/src/layers/court/layers/BASKETBALL/courtTypes/US_HIGH_SCHOOL/layers/LaneMarkingLayer.js +12 -0
  26. package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/constants.js +13 -0
  27. package/src/layers/court/layers/BASKETBALL/courtTypes/US_JUNIOR_HIGH/layers/LaneMarkingLayer.js +12 -0
  28. package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/constants.js +13 -0
  29. package/src/layers/court/layers/BASKETBALL/courtTypes/WNBA/layers/LaneMarkingLayer.js +12 -0
  30. package/src/layers/court/layers/{NBA → BASKETBALL/layers}/BaseLineMarkingLayer.js +8 -5
  31. package/src/layers/court/layers/{NBA → BASKETBALL/layers}/BenchAreaLayer.js +6 -4
  32. package/src/layers/court/layers/BASKETBALL/layers/BorderRectLayer.js +12 -0
  33. package/src/layers/court/layers/BASKETBALL/layers/CenterCircleLayer.js +21 -0
  34. package/src/layers/court/layers/BASKETBALL/layers/CenterLineLayer.js +16 -0
  35. package/src/layers/court/layers/{NBA → BASKETBALL/layers}/FreeThrowLayer.js +5 -3
  36. package/src/layers/court/layers/BASKETBALL/layers/HoopLayer.js +26 -0
  37. package/src/layers/court/layers/BASKETBALL/layers/InnerOuterRectLayer.js +24 -0
  38. package/src/layers/court/layers/{NBA → BASKETBALL/layers}/RestrictedAreaLayer.js +6 -5
  39. package/src/layers/court/layers/BASKETBALL/layers/ThreePointLineLayer.js +42 -0
  40. package/src/layers/court/layers/FOOTBALL/constants.js +9 -0
  41. package/src/layers/court/layers/FOOTBALL/courtTypes/HIGH_SCHOOL_FOOTBALL/constants.js +3 -0
  42. package/src/layers/court/layers/FOOTBALL/layers/BorderRectLayer.js +12 -0
  43. package/src/layers/court/layers/FOOTBALL/layers/CenterLineLayer.js +16 -0
  44. package/src/layers/court/layers/FOOTBALL/{EndZoneLayer.js → layers/EndZoneLayer.js} +3 -6
  45. package/src/layers/court/layers/FOOTBALL/{FieldNumberLayer.js → layers/FieldNumberLayer.js} +4 -7
  46. package/src/layers/court/layers/FOOTBALL/{HashMarkLayer.js → layers/HashMarkLayer.js} +11 -13
  47. package/src/layers/court/layers/FOOTBALL/layers/YardLineLayer.js +23 -0
  48. package/src/models/Frame.js +21 -2
  49. package/src/models/Play/Options.js +0 -1
  50. package/src/models/Play.js +3 -3
  51. package/src/layers/court/layers/FOOTBALL/BorderRectLayer.js +0 -15
  52. package/src/layers/court/layers/FOOTBALL/CenterLineLayer.js +0 -19
  53. package/src/layers/court/layers/FOOTBALL/YardLineLayer.js +0 -25
  54. package/src/layers/court/layers/NBA/BorderRectLayer.js +0 -15
  55. package/src/layers/court/layers/NBA/CenterCircleLayer.js +0 -21
  56. package/src/layers/court/layers/NBA/CenterLineLayer.js +0 -19
  57. package/src/layers/court/layers/NBA/HoopLayer.js +0 -24
  58. package/src/layers/court/layers/NBA/InnerOuterRectLayer.js +0 -26
  59. package/src/layers/court/layers/NBA/LaneMarkingLayer.js +0 -65
  60. package/src/layers/court/layers/NBA/ThreePointLineLayer.js +0 -35
@@ -1,4 +1,4 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
1
+ const InternalCourtLayer = require('../../../base/InternalCourtLayer');
2
2
 
3
3
  class FreeThrowLayer extends InternalCourtLayer {
4
4
  reflection() {
@@ -6,8 +6,8 @@ class FreeThrowLayer extends InternalCourtLayer {
6
6
  }
7
7
 
8
8
  drawLogic() {
9
- const freeThrowSemiCircleCenterPoint = { x: 25.0, y: 19.0 };
10
- const freeThrowSemiCircleRadius = 6.0;
9
+ const freeThrowSemiCircleCenterPoint = { x: this.courtCenter.x, y: 19.0 };
10
+ const freeThrowSemiCircleRadius = this.courtTypeConstants.FREE_THROW_INNER_WIDTH / 2;
11
11
 
12
12
  this.ctx.beginPath();
13
13
  this.ctx.arc(
@@ -20,6 +20,8 @@ class FreeThrowLayer extends InternalCourtLayer {
20
20
  );
21
21
  this.ctx.stroke();
22
22
 
23
+ if (!this.courtTypeConstants.FREE_THROW_INNER_DASHED_CIRCLE) return;
24
+
23
25
  this.ctx.setLineDash([1, 0.5]);
24
26
  this.ctx.beginPath();
25
27
  this.ctx.arc(
@@ -0,0 +1,26 @@
1
+ const InternalCourtLayer = require('../../../base/InternalCourtLayer');
2
+
3
+ const COURT_HOOP_LINE_OFFSET = 3;
4
+
5
+ class HoopLayer extends InternalCourtLayer {
6
+ reflection() {
7
+ return true;
8
+ }
9
+
10
+ drawLogic() {
11
+ const courtHoopRadius = 0.75;
12
+ const courtHoopCenter = { x: this.courtCenter.x, y: 5.25 };
13
+ const courtHoopLineOrigin = { x: courtHoopCenter.x - COURT_HOOP_LINE_OFFSET, y: 4.0 };
14
+ const courtHoopLineTerminus = { x: courtHoopCenter.x + COURT_HOOP_LINE_OFFSET, y: 4.0 };
15
+
16
+ this.ctx.beginPath();
17
+ this.ctx.moveTo(courtHoopLineOrigin.x, courtHoopLineOrigin.y);
18
+ this.ctx.lineTo(courtHoopLineTerminus.x, courtHoopLineTerminus.y);
19
+ this.ctx.stroke();
20
+ this.ctx.beginPath();
21
+ this.ctx.arc(courtHoopCenter.x, courtHoopCenter.y, courtHoopRadius, 0, 2 * Math.PI, true);
22
+ this.ctx.stroke();
23
+ }
24
+ }
25
+
26
+ module.exports = HoopLayer;
@@ -0,0 +1,24 @@
1
+ const InternalCourtLayer = require('../../../base/InternalCourtLayer');
2
+
3
+ class InnerOuterRectLayer extends InternalCourtLayer {
4
+ reflection() {
5
+ return true;
6
+ }
7
+
8
+ drawLogic() {
9
+ const courtRectHeight = 19;
10
+ const courtInnerRectWidth = this.courtTypeConstants.FREE_THROW_INNER_WIDTH;
11
+ const courtOuterRectWidth = this.courtTypeConstants.FREE_THROW_OUTER_WIDTH;
12
+ const courtInnerRectOrigin = { x: this.courtCenter.x - courtInnerRectWidth / 2, y: 0 };
13
+ const courtOuterRectOrigin = { x: this.courtCenter.x - courtOuterRectWidth / 2, y: 0 };
14
+
15
+ this.ctx.beginPath();
16
+ this.ctx.rect(courtInnerRectOrigin.x, courtInnerRectOrigin.y, courtInnerRectWidth, courtRectHeight);
17
+ this.ctx.stroke();
18
+ this.ctx.beginPath();
19
+ this.ctx.rect(courtOuterRectOrigin.x, courtOuterRectOrigin.y, courtOuterRectWidth, courtRectHeight);
20
+ this.ctx.stroke();
21
+ }
22
+ }
23
+
24
+ module.exports = InnerOuterRectLayer;
@@ -1,16 +1,17 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
1
+ const InternalCourtLayer = require('../../../base/InternalCourtLayer');
2
2
 
3
+ const RESTRICTED_AREA_MARK_OFFSET = 4;
3
4
  class RestrictedAreaLayer extends InternalCourtLayer {
4
5
  reflection() {
5
6
  return true;
6
7
  }
7
8
 
8
9
  drawLogic() {
9
- const restrictedAreaCourtHoopCenter = { x: 25.0, y: 5.25 };
10
10
  const restrictedAreaCourtRadius = 4.0;
11
- const restrictedAreaCourtStartPoint = { x: 29.0, y: 4.0 };
12
- const restrictedAreaCourtFirstLineTerminus = { x: 29.0, y: 5.25 };
13
- const restrictedAreaCourtEndPoint = { x: 21.0, y: 4.0 };
11
+ const restrictedAreaCourtHoopCenter = { x: this.courtCenter.x, y: 5.25 };
12
+ const restrictedAreaCourtStartPoint = { x: this.courtCenter.x + RESTRICTED_AREA_MARK_OFFSET, y: 4.0 };
13
+ const restrictedAreaCourtFirstLineTerminus = { x: this.courtCenter.x + RESTRICTED_AREA_MARK_OFFSET, y: 5.25 };
14
+ const restrictedAreaCourtEndPoint = { x: this.courtCenter.x - RESTRICTED_AREA_MARK_OFFSET, y: 4.0 };
14
15
 
15
16
  this.ctx.beginPath();
16
17
  this.ctx.moveTo(restrictedAreaCourtStartPoint.x, restrictedAreaCourtStartPoint.y);
@@ -0,0 +1,42 @@
1
+ const InternalCourtLayer = require('../../../base/InternalCourtLayer');
2
+
3
+ class ThreePointLineLayer extends InternalCourtLayer {
4
+ reflection() {
5
+ return true;
6
+ }
7
+
8
+ drawLogic() {
9
+ const courtRimDistanceToBackboard = 0.5;
10
+ const courtThreePointOffsetOrigin = this.courtCenter.x - this.courtTypeConstants.HOOP_CORNER_DISTANCE;
11
+ const courtThreePointOffsetTerminus = this.courtTypeConstants.COURT_RECT_WIDTH - courtThreePointOffsetOrigin;
12
+ const courtThreePointOrigin = { x: courtThreePointOffsetOrigin, y: 0.0 };
13
+ const courtThreePointFirstLineTerminus = {
14
+ x: courtThreePointOffsetOrigin,
15
+ y: this.courtTypeConstants.THREE_POINT_OFFSET_ORIGIN_Y_APPROX
16
+ };
17
+ const courtThreePointSecondLineTerminus = { x: courtThreePointOffsetTerminus, y: 0.0 };
18
+ const courtThreePointHoopCenter = { x: this.courtCenter.x, y: 4.75 + courtRimDistanceToBackboard };
19
+
20
+ const endAngle = Math.asin(
21
+ (this.courtTypeConstants.THREE_POINT_ASIN_APPROX - 0.75 - courtRimDistanceToBackboard) /
22
+ this.courtTypeConstants.THREE_POINT_ARC_RADIUS
23
+ );
24
+ const startAngle = Math.PI - endAngle;
25
+
26
+ this.ctx.beginPath();
27
+ this.ctx.moveTo(courtThreePointOrigin.x, courtThreePointOrigin.y);
28
+ this.ctx.lineTo(courtThreePointFirstLineTerminus.x, courtThreePointFirstLineTerminus.y);
29
+ this.ctx.arc(
30
+ courtThreePointHoopCenter.x,
31
+ courtThreePointHoopCenter.y,
32
+ this.courtTypeConstants.THREE_POINT_ARC_RADIUS,
33
+ startAngle,
34
+ endAngle,
35
+ true
36
+ );
37
+ this.ctx.lineTo(courtThreePointSecondLineTerminus.x, courtThreePointSecondLineTerminus.y);
38
+ this.ctx.stroke();
39
+ }
40
+ }
41
+
42
+ module.exports = ThreePointLineLayer;
@@ -0,0 +1,9 @@
1
+ module.exports = Object.freeze({
2
+ COURT_LINE_WIDTH: 0.32,
3
+ COURT_RECT_WIDTH: 160.0,
4
+ COURT_RECT_HEIGHT: 360.0,
5
+ PLAYER_TOKEN_RADIUS: 1.5,
6
+ PLAYER_TOKEN_SCALE: 2,
7
+ LINE_WIDTH: 0.55,
8
+ LINE_MASKING: false
9
+ });
@@ -0,0 +1,3 @@
1
+ module.exports = Object.freeze({
2
+ END_ZONE_HEIGHT: 30
3
+ });
@@ -0,0 +1,12 @@
1
+ const InternalCourtLayer = require('../../../base/InternalCourtLayer');
2
+
3
+ class BorderRectLayer extends InternalCourtLayer {
4
+ drawLogic() {
5
+ this.ctx.beginPath();
6
+ this.ctx.lineWidth = this.courtTypeConstants.COURT_LINE_WIDTH * 2;
7
+ this.ctx.rect(0, 0, this.courtTypeConstants.COURT_RECT_WIDTH, this.courtTypeConstants.COURT_RECT_HEIGHT);
8
+ this.ctx.stroke();
9
+ }
10
+ }
11
+
12
+ module.exports = BorderRectLayer;
@@ -0,0 +1,16 @@
1
+ const InternalCourtLayer = require('../../../base/InternalCourtLayer');
2
+
3
+ class CenterLineLayer extends InternalCourtLayer {
4
+ drawLogic() {
5
+ const courtOrigin = { x: 0.0, y: this.courtCenter.y };
6
+ const courtTerminus = { x: this.courtTypeConstants.COURT_RECT_WIDTH, y: this.courtCenter.y };
7
+
8
+ this.ctx.beginPath();
9
+ this.ctx.lineWidth = this.courtTypeConstants.COURT_LINE_WIDTH * 2;
10
+ this.ctx.moveTo(courtOrigin.x, courtOrigin.y);
11
+ this.ctx.lineTo(courtTerminus.x, courtTerminus.y);
12
+ this.ctx.stroke();
13
+ }
14
+ }
15
+
16
+ module.exports = CenterLineLayer;
@@ -1,7 +1,4 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
2
- const {
3
- FOOTBALL: { COURT_RECT_WIDTH, COURT_LINE_WIDTH }
4
- } = require('../../../../constants');
1
+ const InternalCourtLayer = require('../../../base/InternalCourtLayer');
5
2
 
6
3
  class EndZoneLayer extends InternalCourtLayer {
7
4
  reflection() {
@@ -10,10 +7,10 @@ class EndZoneLayer extends InternalCourtLayer {
10
7
 
11
8
  drawLogic() {
12
9
  const courtOrigin = { x: 0.0, y: 30 };
13
- const courtTerminus = { x: COURT_RECT_WIDTH, y: 30 };
10
+ const courtTerminus = { x: this.courtTypeConstants.COURT_RECT_WIDTH, y: 30 };
14
11
 
15
12
  this.ctx.beginPath();
16
- this.ctx.lineWidth = COURT_LINE_WIDTH * 2;
13
+ this.ctx.lineWidth = this.courtTypeConstants.COURT_LINE_WIDTH * 2;
17
14
  this.ctx.moveTo(courtOrigin.x, courtOrigin.y);
18
15
  this.ctx.lineTo(courtTerminus.x, courtTerminus.y);
19
16
  this.ctx.stroke();
@@ -1,14 +1,11 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
2
- const {
3
- FOOTBALL: { COURT_RECT_WIDTH, END_ZONE_HEIGHT }
4
- } = require('../../../../constants');
1
+ const InternalCourtLayer = require('../../../base/InternalCourtLayer');
5
2
 
6
3
  const NUMBER_VERTICAL_OFFSET = -6;
7
4
 
8
5
  class FieldNumberLayer extends InternalCourtLayer {
9
6
  drawLogic() {
10
7
  const x = 20;
11
- const y = END_ZONE_HEIGHT;
8
+ const y = this.courtTypeConstants.END_ZONE_HEIGHT;
12
9
 
13
10
  const thinSpaceChar = String.fromCharCode(8202);
14
11
 
@@ -19,14 +16,14 @@ class FieldNumberLayer extends InternalCourtLayer {
19
16
  const number = i <= 5 ? i : 10 - i;
20
17
  const yardMarkLabel = `${number}${thinSpaceChar}0`;
21
18
 
22
- this.ctx.translate(0, END_ZONE_HEIGHT);
19
+ this.ctx.translate(0, this.courtTypeConstants.END_ZONE_HEIGHT);
23
20
 
24
21
  this.ctx.save();
25
22
 
26
23
  this.ctx.rotate(Math.PI / 2); // 90
27
24
  this.ctx.fillText(yardMarkLabel, NUMBER_VERTICAL_OFFSET, 0);
28
25
 
29
- this.ctx.translate(0, 20 * 2 - COURT_RECT_WIDTH);
26
+ this.ctx.translate(0, 20 * 2 - this.courtTypeConstants.COURT_RECT_WIDTH);
30
27
  this.ctx.rotate(Math.PI); // 180
31
28
  this.ctx.fillText(yardMarkLabel, NUMBER_VERTICAL_OFFSET, 0);
32
29
 
@@ -1,16 +1,7 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
2
- const {
3
- FOOTBALL: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH, END_ZONE_HEIGHT }
4
- } = require('../../../../constants');
1
+ const InternalCourtLayer = require('../../../base/InternalCourtLayer');
5
2
 
6
3
  const HASH_MARK_OFFSET_X = 3;
7
4
  const HASH_MARK_LENGTH = 3;
8
- const HASH_MARK_X_POSITIONS = [
9
- HASH_MARK_OFFSET_X,
10
- 53,
11
- COURT_RECT_WIDTH - 53 - HASH_MARK_LENGTH,
12
- COURT_RECT_WIDTH - HASH_MARK_OFFSET_X - HASH_MARK_LENGTH
13
- ];
14
5
 
15
6
  class HashMarkLayer extends InternalCourtLayer {
16
7
  reflection() {
@@ -18,12 +9,19 @@ class HashMarkLayer extends InternalCourtLayer {
18
9
  }
19
10
 
20
11
  drawLogic() {
12
+ const hashMarkPositionsX = [
13
+ HASH_MARK_OFFSET_X,
14
+ 53,
15
+ this.courtTypeConstants.COURT_RECT_WIDTH - 53 - HASH_MARK_LENGTH,
16
+ this.courtTypeConstants.COURT_RECT_WIDTH - HASH_MARK_OFFSET_X - HASH_MARK_LENGTH
17
+ ];
18
+
21
19
  this.ctx.save();
22
20
 
23
- this.ctx.lineWidth = COURT_LINE_WIDTH;
21
+ this.ctx.lineWidth = this.courtTypeConstants.COURT_LINE_WIDTH;
24
22
 
25
- for (let y = END_ZONE_HEIGHT + 15; y <= COURT_RECT_HEIGHT / 2; y += 15) {
26
- HASH_MARK_X_POSITIONS.forEach(px => {
23
+ for (let y = this.courtTypeConstants.END_ZONE_HEIGHT + 15; y <= this.courtCenter.y; y += 15) {
24
+ hashMarkPositionsX.forEach(px => {
27
25
  for (let i = 0; i < 4; i++) {
28
26
  const hashMarkVerticalStep = 3 + i * 3;
29
27
  const courtOrigin = { x: px, y: y - hashMarkVerticalStep };
@@ -0,0 +1,23 @@
1
+ const InternalCourtLayer = require('../../../base/InternalCourtLayer');
2
+
3
+ class YardLineLayer extends InternalCourtLayer {
4
+ reflection() {
5
+ return true;
6
+ }
7
+
8
+ drawLogic() {
9
+ for (let y = this.courtTypeConstants.END_ZONE_HEIGHT; y <= this.courtCenter.y; y += 15) {
10
+ const courtOrigin = { x: 0.0, y };
11
+ const courtTerminus = { x: this.courtTypeConstants.COURT_RECT_WIDTH, y };
12
+
13
+ this.ctx.beginPath();
14
+ this.ctx.lineWidth =
15
+ y % 30 === 0 ? this.courtTypeConstants.COURT_LINE_WIDTH * 2 : this.courtTypeConstants.COURT_LINE_WIDTH;
16
+ this.ctx.moveTo(courtOrigin.x, courtOrigin.y);
17
+ this.ctx.lineTo(courtTerminus.x, courtTerminus.y);
18
+ this.ctx.stroke();
19
+ }
20
+ }
21
+ }
22
+
23
+ module.exports = YardLineLayer;
@@ -13,6 +13,12 @@ const Line = require('./Line');
13
13
  const Player = require('./Player');
14
14
  const Note = require('./Note');
15
15
  const ShapeModels = require('./ShapeModels');
16
+ const {
17
+ COURT_TYPE_HIGH_SCHOOL_FOOTBALL,
18
+ COURT_TYPE_HIGH_SCHOOL_FOOTBALL_LEGACY,
19
+ SPORT_TYPE_FOOTBALL,
20
+ SPORT_TYPE_BASKETBALL
21
+ } = require('../constants');
16
22
 
17
23
  class Frame {
18
24
  constructor(play, phase = 1, animationGlobalProgress = false) {
@@ -22,8 +28,20 @@ class Frame {
22
28
  this.animationGlobalProgressPrev = animationGlobalProgress;
23
29
  }
24
30
 
31
+ get sport() {
32
+ const { court, sport } = this.play.playData;
33
+ if (sport) return sport;
34
+ return [COURT_TYPE_HIGH_SCHOOL_FOOTBALL_LEGACY, COURT_TYPE_HIGH_SCHOOL_FOOTBALL].includes(court.type)
35
+ ? SPORT_TYPE_FOOTBALL
36
+ : SPORT_TYPE_BASKETBALL;
37
+ }
38
+
25
39
  get court() {
26
- return this.play.playData.court;
40
+ const { court } = this.play.playData;
41
+ return {
42
+ ...court,
43
+ type: court.type === COURT_TYPE_HIGH_SCHOOL_FOOTBALL_LEGACY ? COURT_TYPE_HIGH_SCHOOL_FOOTBALL : court.type
44
+ };
27
45
  }
28
46
 
29
47
  get frameWidth() {
@@ -36,7 +54,8 @@ class Frame {
36
54
 
37
55
  get frameData() {
38
56
  return {
39
- court: this.play.playData.court,
57
+ sport: this.sport,
58
+ court: this.court,
40
59
  lines: this.lines,
41
60
  players: this.players,
42
61
  shapes: this.shapes,
@@ -21,7 +21,6 @@ module.exports = {
21
21
  legacyPrintStyle: false,
22
22
  playerTokenScale: 1,
23
23
  // TODO: refactor NBA court type constants below
24
- big3: false,
25
24
  showHalfCourtCircle: true
26
25
  };
27
26
  return {
@@ -3,6 +3,7 @@ const { loadImage } = require('canvas');
3
3
  const playerHatsConfig = require('../playerHatsConfig');
4
4
  const shapesConfig = require('../shapesConfig');
5
5
  const { useDefaults } = require('./Play/Options');
6
+ const { SPORT_TYPE_BASKETBALL, SPORT_TYPE_FOOTBALL } = require('../constants');
6
7
 
7
8
  const STORAGE_URL = 'https://playbooksstore.blob.core.windows.net/public';
8
9
  const LUCEOSPORTS_WATERMARK_PATH = 'partners/LuceoSports/luceo-sports-logo-powered-by-sm.png';
@@ -25,9 +26,8 @@ class Play {
25
26
 
26
27
  Play.backgroundOptions = {
27
28
  Hardwood: hardwoodImage,
28
- NBA: hardwoodImage,
29
- NCAA: hardwoodImage,
30
- FOOTBALL: grassImage
29
+ [SPORT_TYPE_BASKETBALL]: hardwoodImage,
30
+ [SPORT_TYPE_FOOTBALL]: grassImage
31
31
  };
32
32
 
33
33
  const luceoSportsWatermark = await loadImage(`${STORAGE_URL}/${LUCEOSPORTS_WATERMARK_PATH}`);
@@ -1,15 +0,0 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
2
- const {
3
- FOOTBALL: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH }
4
- } = require('../../../../constants');
5
-
6
- class BorderRectLayer extends InternalCourtLayer {
7
- drawLogic() {
8
- this.ctx.beginPath();
9
- this.ctx.lineWidth = COURT_LINE_WIDTH * 2;
10
- this.ctx.rect(0, 0, COURT_RECT_WIDTH, COURT_RECT_HEIGHT);
11
- this.ctx.stroke();
12
- }
13
- }
14
-
15
- module.exports = BorderRectLayer;
@@ -1,19 +0,0 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
2
- const {
3
- FOOTBALL: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH }
4
- } = require('../../../../constants');
5
-
6
- class CenterLineLayer extends InternalCourtLayer {
7
- drawLogic() {
8
- const courtOrigin = { x: 0.0, y: COURT_RECT_HEIGHT / 2 };
9
- const courtTerminus = { x: COURT_RECT_WIDTH, y: COURT_RECT_HEIGHT / 2 };
10
-
11
- this.ctx.beginPath();
12
- this.ctx.lineWidth = COURT_LINE_WIDTH * 2;
13
- this.ctx.moveTo(courtOrigin.x, courtOrigin.y);
14
- this.ctx.lineTo(courtTerminus.x, courtTerminus.y);
15
- this.ctx.stroke();
16
- }
17
- }
18
-
19
- module.exports = CenterLineLayer;
@@ -1,25 +0,0 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
2
- const {
3
- FOOTBALL: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH, END_ZONE_HEIGHT }
4
- } = require('../../../../constants');
5
-
6
- class YardLineLayer extends InternalCourtLayer {
7
- reflection() {
8
- return true;
9
- }
10
-
11
- drawLogic() {
12
- for (let y = END_ZONE_HEIGHT; y <= COURT_RECT_HEIGHT / 2; y += 15) {
13
- const courtOrigin = { x: 0.0, y };
14
- const courtTerminus = { x: COURT_RECT_WIDTH, y };
15
-
16
- this.ctx.beginPath();
17
- this.ctx.lineWidth = y % 30 === 0 ? COURT_LINE_WIDTH * 2 : COURT_LINE_WIDTH;
18
- this.ctx.moveTo(courtOrigin.x, courtOrigin.y);
19
- this.ctx.lineTo(courtTerminus.x, courtTerminus.y);
20
- this.ctx.stroke();
21
- }
22
- }
23
- }
24
-
25
- module.exports = YardLineLayer;
@@ -1,15 +0,0 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
2
- const {
3
- NBA: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH }
4
- } = require('../../../../constants');
5
-
6
- class BorderRectLayer extends InternalCourtLayer {
7
- drawLogic() {
8
- this.ctx.beginPath();
9
- this.ctx.lineWidth = COURT_LINE_WIDTH * 2;
10
- this.ctx.rect(0, 0, COURT_RECT_WIDTH, COURT_RECT_HEIGHT);
11
- this.ctx.stroke();
12
- }
13
- }
14
-
15
- module.exports = BorderRectLayer;
@@ -1,21 +0,0 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
2
- const {
3
- NBA: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT }
4
- } = require('../../../../constants');
5
-
6
- class CenterCircleLayer extends InternalCourtLayer {
7
- drawLogic() {
8
- if (!this.options.showHalfCourtCircle) return;
9
-
10
- const outerCenterRadius = 6.0;
11
- const innerCenterRadius = 2.0;
12
- const centerCourtPoint = { x: COURT_RECT_WIDTH / 2, y: COURT_RECT_HEIGHT / 2 };
13
-
14
- this.ctx.beginPath();
15
- this.ctx.arc(centerCourtPoint.x, centerCourtPoint.y, outerCenterRadius, 0, Math.PI * 2, true);
16
- this.ctx.arc(centerCourtPoint.x, centerCourtPoint.y, innerCenterRadius, 0, Math.PI * 2, true);
17
- this.ctx.stroke();
18
- }
19
- }
20
-
21
- module.exports = CenterCircleLayer;
@@ -1,19 +0,0 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
2
- const {
3
- NBA: { COURT_RECT_WIDTH, COURT_RECT_HEIGHT, COURT_LINE_WIDTH }
4
- } = require('../../../../constants');
5
-
6
- class CenterLineLayer extends InternalCourtLayer {
7
- drawLogic() {
8
- const courtOrigin = { x: 0.0, y: COURT_RECT_HEIGHT / 2 };
9
- const courtTerminus = { x: COURT_RECT_WIDTH, y: COURT_RECT_HEIGHT / 2 };
10
-
11
- this.ctx.beginPath();
12
- this.ctx.lineWidth = COURT_LINE_WIDTH * 2;
13
- this.ctx.moveTo(courtOrigin.x, courtOrigin.y);
14
- this.ctx.lineTo(courtTerminus.x, courtTerminus.y);
15
- this.ctx.stroke();
16
- }
17
- }
18
-
19
- module.exports = CenterLineLayer;
@@ -1,24 +0,0 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
2
-
3
- class HoopLayer extends InternalCourtLayer {
4
- reflection() {
5
- return true;
6
- }
7
-
8
- drawLogic() {
9
- const hoopCourtOrigin = { x: 22.0, y: 4.0 };
10
- const hoopCourtTerminus = { x: 28.0, y: 4.0 };
11
- const courtHoopCenter = { x: 25.0, y: 5.25 };
12
- const courtHoopRadius = 0.75;
13
-
14
- this.ctx.beginPath();
15
- this.ctx.moveTo(hoopCourtOrigin.x, hoopCourtOrigin.y);
16
- this.ctx.lineTo(hoopCourtTerminus.x, hoopCourtTerminus.y);
17
- this.ctx.stroke();
18
- this.ctx.beginPath();
19
- this.ctx.arc(courtHoopCenter.x, courtHoopCenter.y, courtHoopRadius, 0, 2 * Math.PI, true);
20
- this.ctx.stroke();
21
- }
22
- }
23
-
24
- module.exports = HoopLayer;
@@ -1,26 +0,0 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
2
-
3
- class InnerOuterRectLayer extends InternalCourtLayer {
4
- reflection() {
5
- return true;
6
- }
7
-
8
- drawLogic() {
9
- const courtInnerRectOrigin = { x: 19, y: 0 };
10
- const courtInnerRectWidth = 12;
11
- const courtInnerRectHeight = 19;
12
-
13
- const courtOuterRectOrigin = { x: 17, y: 0 };
14
- const courtOuterRectWidth = 16;
15
- const courtOuterRectHeight = 19;
16
-
17
- this.ctx.beginPath();
18
- this.ctx.rect(courtInnerRectOrigin.x, courtInnerRectOrigin.y, courtInnerRectWidth, courtInnerRectHeight);
19
- this.ctx.stroke();
20
- this.ctx.beginPath();
21
- this.ctx.rect(courtOuterRectOrigin.x, courtOuterRectOrigin.y, courtOuterRectWidth, courtOuterRectHeight);
22
- this.ctx.stroke();
23
- }
24
- }
25
-
26
- module.exports = InnerOuterRectLayer;
@@ -1,65 +0,0 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
2
-
3
- class LaneMarkingLayer extends InternalCourtLayer {
4
- reflection() {
5
- return true;
6
- }
7
-
8
- drawLogic() {
9
- const courtMarkingWidth = 0.667;
10
- const courtPath1Origin = { x: 17.0, y: 7.0 };
11
- const courtPath1Terminus = { x: 17.0 - courtMarkingWidth, y: 7.0 };
12
-
13
- this.ctx.beginPath();
14
- this.ctx.moveTo(courtPath1Origin.x, courtPath1Origin.y);
15
- this.ctx.lineTo(courtPath1Terminus.x, courtPath1Terminus.y);
16
- this.ctx.stroke();
17
-
18
- this.ctx.beginPath();
19
- this.ctx.moveTo(17.0, 8.0);
20
- this.ctx.lineTo(17.0 - courtMarkingWidth, 8.0);
21
- this.ctx.stroke();
22
-
23
- this.ctx.beginPath();
24
- this.ctx.moveTo(17.0, 11.0);
25
- this.ctx.lineTo(17.0 - courtMarkingWidth, 11.0);
26
- this.ctx.stroke();
27
-
28
- this.ctx.beginPath();
29
- this.ctx.moveTo(17.0, 14.0);
30
- this.ctx.lineTo(17.0 - courtMarkingWidth, 14.0);
31
- this.ctx.stroke();
32
-
33
- this.ctx.beginPath();
34
- this.ctx.moveTo(33.0, 7.0);
35
- this.ctx.lineTo(33.0 + courtMarkingWidth, 7.0);
36
- this.ctx.stroke();
37
-
38
- this.ctx.beginPath();
39
- this.ctx.moveTo(33.0, 8.0);
40
- this.ctx.lineTo(33.0 + courtMarkingWidth, 8.0);
41
- this.ctx.stroke();
42
-
43
- this.ctx.beginPath();
44
- this.ctx.moveTo(33.0, 11.0);
45
- this.ctx.lineTo(33.0 + courtMarkingWidth, 11.0);
46
- this.ctx.stroke();
47
-
48
- this.ctx.beginPath();
49
- this.ctx.moveTo(33.0, 14.0);
50
- this.ctx.lineTo(33.0 + courtMarkingWidth, 14.0);
51
- this.ctx.stroke();
52
-
53
- this.ctx.beginPath();
54
- this.ctx.moveTo(20.0, 13.0);
55
- this.ctx.lineTo(20.0 + 0.5, 13.0);
56
- this.ctx.stroke();
57
-
58
- this.ctx.beginPath();
59
- this.ctx.moveTo(30.0, 13.0);
60
- this.ctx.lineTo(30.0 - 0.5, 13.0);
61
- this.ctx.stroke();
62
- }
63
- }
64
-
65
- module.exports = LaneMarkingLayer;
@@ -1,35 +0,0 @@
1
- const InternalCourtLayer = require('../../base/InternalCourtLayer');
2
-
3
- class ThreePointLineLayer extends InternalCourtLayer {
4
- reflection() {
5
- return true;
6
- }
7
-
8
- drawLogic() {
9
- const courtRimDistanceToBackboard = 0.5;
10
- const courtThreePointOrigin = { x: 3.0, y: 0.0 };
11
- const courtThreePointFirstLineTerminus = { x: 3.0, y: 14.0 };
12
- const courtThreePointSecondLineTerminus = { x: 47.0, y: 0.0 };
13
- const courtThreePointHoopCenter = { x: 25.0, y: 4.75 + courtRimDistanceToBackboard };
14
- const courtThreePointArcRadius = 23.6762;
15
-
16
- const endAngle = Math.asin((10.0 - 0.75 - courtRimDistanceToBackboard) / courtThreePointArcRadius);
17
- const startAngle = Math.PI - endAngle;
18
-
19
- this.ctx.beginPath();
20
- this.ctx.moveTo(courtThreePointOrigin.x, courtThreePointOrigin.y);
21
- this.ctx.lineTo(courtThreePointFirstLineTerminus.x, courtThreePointFirstLineTerminus.y);
22
- this.ctx.arc(
23
- courtThreePointHoopCenter.x,
24
- courtThreePointHoopCenter.y,
25
- courtThreePointArcRadius,
26
- startAngle,
27
- endAngle,
28
- true
29
- );
30
- this.ctx.lineTo(courtThreePointSecondLineTerminus.x, courtThreePointSecondLineTerminus.y);
31
- this.ctx.stroke();
32
- }
33
- }
34
-
35
- module.exports = ThreePointLineLayer;