@rpgjs/common 3.0.0-beta → 3.0.0-beta.4

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.
@@ -5,4 +5,5 @@ export declare class EventEmitter {
5
5
  on(name: string, cb: Function): EventEmitter;
6
6
  emit(name: string, data?: any, rest?: boolean): Promise<any[]>;
7
7
  off(name: string): void;
8
+ clear(): void;
8
9
  }
@@ -44,6 +44,10 @@ class EventEmitter {
44
44
  delete this.listeners[name];
45
45
  delete this.listenersOnce[name];
46
46
  }
47
+ clear() {
48
+ this.listeners = {};
49
+ this.listenersOnce = {};
50
+ }
47
51
  }
48
52
  exports.EventEmitter = EventEmitter;
49
53
  //# sourceMappingURL=EventEmitter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EventEmitter.js","sourceRoot":"","sources":["../src/EventEmitter.ts"],"names":[],"mappings":";;;AAAA,mCAAmC;AAEnC,MAAa,YAAY;IAAzB;QACY,cAAS,GAEb,EAAE,CAAA;QAEE,kBAAa,GAEjB,EAAE,CAAA;IAqCV,CAAC;IAnCG,IAAI,CAAC,IAAY,EAAE,EAAY;QAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAA;QAC7B,OAAO,IAAI,CAAA;IACf,CAAC;IAED,EAAE,CAAC,IAAY,EAAE,EAAY;QACzB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAA;QACpD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC7B,OAAO,IAAI,CAAA;IACf,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,IAAU,EAAE,OAAgB,KAAK;QAChD,MAAM,GAAG,GAAQ,EAAE,CAAA;QACnB,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;YACtB,KAAK,IAAI,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;gBACvC,IAAI,IAAI;oBAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;;oBAChC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;aAChC;SACJ;aACI,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE;YAC/B,IAAI,IAAI;gBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;;gBAChD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;SAChD;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAC7B,IAAI,CAAC,iBAAS,CAAC,GAAG,CAAC,EAAE;gBACjB,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;aAC9B;YACD,OAAO,GAAG,CAAA;QACd,CAAC,CAAC,CAAC,CAAA;IACP,CAAC;IAED,GAAG,CAAC,IAAY;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAC3B,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC;CACJ;AA5CD,oCA4CC"}
1
+ {"version":3,"file":"EventEmitter.js","sourceRoot":"","sources":["../src/EventEmitter.ts"],"names":[],"mappings":";;;AAAA,mCAAmC;AAEnC,MAAa,YAAY;IAAzB;QACY,cAAS,GAEb,EAAE,CAAA;QAEE,kBAAa,GAEjB,EAAE,CAAA;IA0CV,CAAC;IAxCG,IAAI,CAAC,IAAY,EAAE,EAAY;QAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAA;QAC7B,OAAO,IAAI,CAAA;IACf,CAAC;IAED,EAAE,CAAC,IAAY,EAAE,EAAY;QACzB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAA;QACpD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC7B,OAAO,IAAI,CAAA;IACf,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,IAAU,EAAE,OAAgB,KAAK;QAChD,MAAM,GAAG,GAAQ,EAAE,CAAA;QACnB,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;YACtB,KAAK,IAAI,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;gBACvC,IAAI,IAAI;oBAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;;oBAChC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;aAChC;SACJ;aACI,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE;YAC/B,IAAI,IAAI;gBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;;gBAChD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;SAChD;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YAC7B,IAAI,CAAC,iBAAS,CAAC,GAAG,CAAC,EAAE;gBACjB,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;aAC9B;YACD,OAAO,GAAG,CAAA;QACd,CAAC,CAAC,CAAC,CAAA;IACP,CAAC;IAED,GAAG,CAAC,IAAY;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QAC3B,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC;IAED,KAAK;QACD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;QACnB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAA;IAC3B,CAAC;CACJ;AAjDD,oCAiDC"}
package/lib/Game.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  import { EventEmitter } from './EventEmitter';
2
+ import { Direction } from './Player';
3
+ import { Control } from './Input';
2
4
  export default class Game extends EventEmitter {
3
5
  private side;
4
6
  events: any;
@@ -8,5 +10,7 @@ export default class Game extends EventEmitter {
8
10
  addObject(_class: any, playerId?: any): any;
9
11
  addPlayer(playerClass: any, playerId: any): any;
10
12
  addEvent(eventClass: any): any;
11
- processInput(inputData: any, playerId: any): void;
13
+ processInput(inputData: {
14
+ input: Control | Direction;
15
+ }, playerId: string): void;
12
16
  }
package/lib/Game.js CHANGED
@@ -37,6 +37,7 @@ class Game extends EventEmitter_1.EventEmitter {
37
37
  processInput(inputData, playerId) {
38
38
  const player = this.world.getObject(playerId);
39
39
  const { input } = inputData;
40
+ let moving = false;
40
41
  if (!player)
41
42
  return;
42
43
  if (!player.canMove)
@@ -48,10 +49,11 @@ class Game extends EventEmitter_1.EventEmitter {
48
49
  input == Player_1.Direction.Right ||
49
50
  input == Player_1.Direction.Up ||
50
51
  input == Player_1.Direction.Down) {
52
+ moving = true;
51
53
  player.moveByDirection(input);
52
54
  }
53
55
  if (this.side == 'server')
54
- Plugin_1.RpgPlugin.emit('Server.onInput', [player, inputData], true);
56
+ Plugin_1.RpgPlugin.emit('Server.onInput', [player, Object.assign(Object.assign({}, inputData), { moving })], true);
55
57
  }
56
58
  }
57
59
  exports.default = Game;
package/lib/Game.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Game.js","sourceRoot":"","sources":["../src/Game.ts"],"names":[],"mappings":";;AAAA,mCAAqC;AACrC,iDAA6C;AAC7C,qCAAqD;AACrD,mCAAiC;AACjC,qCAAoC;AAEpC,MAAqB,IAAK,SAAQ,2BAAY;IAK1C,YAAoB,IAAY;QAC5B,KAAK,EAAE,CAAA;QADS,SAAI,GAAJ,IAAI,CAAQ;QAE5B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA,CAAC,+BAA+B;IACpD,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,SAAS,CAAC,MAAM,EAAE,QAAS;QACvB,IAAI,KAAK,CAAA;QACT,IAAI,CAAC,QAAQ;YAAE,QAAQ,GAAG,mBAAW,EAAE,CAAA;QACvC,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,UAAU,EAAE;YACvC,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;SACrC;aACI;YACD,KAAK,GAAG,MAAM,CAAA;SACjB;QACD,OAAO,KAAK,CAAA;IAChB,CAAC;IAED,SAAS,CAAC,WAAW,EAAE,QAAQ;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;QACpD,OAAO,MAAM,CAAA;IACjB,CAAC;IAED,QAAQ,CAAC,UAAU;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QACxC,OAAO,KAAK,CAAA;IAChB,CAAC;IAED,YAAY,CAAC,SAAS,EAAE,QAAQ;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QAC7C,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAA;QAE3B,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAM;QAE3B,IAAI,KAAK,IAAI,eAAO,CAAC,MAAM,EAAE;YACzB,MAAM,CAAC,oBAAoB,CAAC,wBAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;SAC9D;aACI,IACD,KAAK,IAAI,kBAAS,CAAC,IAAI;YACvB,KAAK,IAAI,kBAAS,CAAC,KAAK;YACxB,KAAK,IAAI,kBAAS,CAAC,EAAE;YACrB,KAAK,IAAI,kBAAS,CAAC,IAAI,EACrB;YACF,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;SAChC;QACD,IAAI,IAAI,CAAC,IAAI,IAAI,QAAQ;YAAE,kBAAS,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,CAAA;IAC1F,CAAC;CACJ;AAxDD,uBAwDC"}
1
+ {"version":3,"file":"Game.js","sourceRoot":"","sources":["../src/Game.ts"],"names":[],"mappings":";;AAAA,mCAAqC;AACrC,iDAA6C;AAC7C,qCAAqD;AACrD,mCAAiC;AACjC,qCAAoC;AAEpC,MAAqB,IAAK,SAAQ,2BAAY;IAK1C,YAAoB,IAAY;QAC5B,KAAK,EAAE,CAAA;QADS,SAAI,GAAJ,IAAI,CAAQ;QAE5B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA,CAAC,+BAA+B;IACpD,CAAC;IAED,KAAK,CAAC,KAAK;QACP,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,SAAS,CAAC,MAAM,EAAE,QAAS;QACvB,IAAI,KAAK,CAAA;QACT,IAAI,CAAC,QAAQ;YAAE,QAAQ,GAAG,mBAAW,EAAE,CAAA;QACvC,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,UAAU,EAAE;YACvC,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;SACrC;aACI;YACD,KAAK,GAAG,MAAM,CAAA;SACjB;QACD,OAAO,KAAK,CAAA;IAChB,CAAC;IAED,SAAS,CAAC,WAAW,EAAE,QAAQ;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;QACpD,OAAO,MAAM,CAAA;IACjB,CAAC;IAED,QAAQ,CAAC,UAAU;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QACxC,OAAO,KAAK,CAAA;IAChB,CAAC;IAED,YAAY,CAAC,SAAyC,EAAE,QAAgB;QACpE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QAC7C,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAA;QAC3B,IAAI,MAAM,GAAG,KAAK,CAAA;QAElB,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAM;QAE3B,IAAI,KAAK,IAAI,eAAO,CAAC,MAAM,EAAE;YACzB,MAAM,CAAC,oBAAoB,CAAC,wBAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;SAC9D;aACI,IACD,KAAK,IAAI,kBAAS,CAAC,IAAI;YACvB,KAAK,IAAI,kBAAS,CAAC,KAAK;YACxB,KAAK,IAAI,kBAAS,CAAC,EAAE;YACrB,KAAK,IAAI,kBAAS,CAAC,IAAI,EACrB;YACF,MAAM,GAAG,IAAI,CAAA;YACb,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;SAChC;QACD,IAAI,IAAI,CAAC,IAAI,IAAI,QAAQ;YAAE,kBAAS,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,MAAM,kCAC5D,SAAS,KACZ,MAAM,IACR,EAAE,IAAI,CAAC,CAAA;IACb,CAAC;CACJ;AA7DD,uBA6DC"}
package/lib/Hit.d.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  import SAT from 'sat';
2
2
  export interface HitObject {
3
- ellipse: boolean;
4
- gid: number | null;
3
+ ellipse?: boolean;
4
+ gid?: number;
5
5
  height: number;
6
- polygon: any[] | null;
7
- polyline: any[] | null;
8
- properties: object;
9
- rotation: number;
10
- visible: boolean;
6
+ polygon?: any[];
7
+ polyline?: any[];
8
+ properties?: object;
9
+ rotation?: number;
10
+ visible?: boolean;
11
11
  width: number;
12
12
  x: number;
13
13
  y: number;
@@ -15,12 +15,12 @@ export interface HitObject {
15
15
  name?: string;
16
16
  }
17
17
  declare class HitClass {
18
- createObjectHitbox(x: number, y: number, z: number, w: number, h: number): any;
18
+ createObjectHitbox(x: number, y: number, z: number, w: number, h: number): SAT.Box;
19
19
  getHitbox(obj: HitObject, offset?: {
20
20
  x: number;
21
21
  y: number;
22
22
  }): {
23
- properties: object;
23
+ properties: object | undefined;
24
24
  hitbox: any;
25
25
  type: any;
26
26
  name: string | undefined;
package/lib/Map.d.ts CHANGED
@@ -1,40 +1,237 @@
1
1
  import { HitObject } from './Hit';
2
- import { Shape } from './Shape';
3
- interface TileInfo {
2
+ import { RpgShape } from './Shape';
3
+ export interface TileInfo {
4
4
  tiles: any[];
5
5
  hasCollision: boolean;
6
6
  isClimbable?: boolean;
7
7
  isOverlay: boolean;
8
8
  objectGroups: HitObject[];
9
+ tileIndex: number;
10
+ }
11
+ export interface LayerInfo {
12
+ type: string;
13
+ name: string;
14
+ opacity: number;
15
+ visible: boolean;
16
+ properties: any;
17
+ objects: HitObject[];
18
+ tiles: any[];
9
19
  }
10
20
  export default class RpgCommonMap {
21
+ /**
22
+ * @title Data of map
23
+ * @prop {object} [data]
24
+ * @readonly
25
+ * @memberof Map
26
+ * @memberof RpgSceneMap
27
+ * */
11
28
  data: any;
12
29
  width: number;
13
30
  height: number;
31
+ /**
32
+ * @title Width of a tile
33
+ * @prop {number} [tileWidth]
34
+ * @readonly
35
+ * @memberof Map
36
+ * @memberof RpgSceneMap
37
+ * */
14
38
  tileWidth: number;
39
+ /**
40
+ * @title Height of a tile
41
+ * @prop {number} [tileHeight]
42
+ * @readonly
43
+ * @memberof Map
44
+ * @memberof RpgSceneMap
45
+ * */
15
46
  tileHeight: number;
16
- layers: any[];
47
+ /**
48
+ * @title Layers of map
49
+ * @prop {object[]} [layers]
50
+ * @readonly
51
+ * @memberof Map
52
+ * @memberof RpgSceneMap
53
+ * */
54
+ layers: LayerInfo[];
17
55
  private shapes;
18
56
  static get buffer(): Map<any, any>;
19
57
  load(data: any): void;
58
+ /**
59
+ * @title Width of the map in pixels
60
+ * @prop {number} [widthPx]
61
+ * @readonly
62
+ * @memberof Map
63
+ * @memberof RpgSceneMap
64
+ * */
20
65
  get widthPx(): number;
66
+ /**
67
+ * @title Height of the map in pixels
68
+ * @prop {number} [heightPx]
69
+ * @readonly
70
+ * @memberof Map
71
+ * @memberof RpgSceneMap
72
+ * */
21
73
  get heightPx(): number;
74
+ /**
75
+ * @title The depth of the map in pixels (this is the height of a tile ;))
76
+ * @prop {number} map.zTileHeight
77
+ * @readonly
78
+ * @memberof Map
79
+ * @memberof RpgSceneMap
80
+ * */
22
81
  get zTileHeight(): number;
23
82
  _extractShapes(): void;
24
- createShape(obj: HitObject): Shape;
83
+ /**
84
+ * Find a layer by name. Returns `undefined` is the layer is not found
85
+
86
+ * @title Get Layer by name
87
+ * @method map.getLayerByName(name)
88
+ * @param {string} name layer name
89
+ * @returns {LayerInfo | undefined}
90
+ * @example
91
+ * ```ts
92
+ * const tiles = map.getLayerByName(0, 0)
93
+ * ```
94
+ * @memberof Map
95
+ * @memberof RpgSceneMap
96
+ */
97
+ getLayerByName(name: string): LayerInfo | undefined;
98
+ /**
99
+ * Create a shape dynamically on the map
100
+ *
101
+ * Object:
102
+ * - (number) x: Position X
103
+ * - (number) y: Position Y
104
+ * - (number) width: Width
105
+ * - (number) height: Height
106
+ * - (object) properties (optionnal):
107
+ * - (number) z: Position Z
108
+ * - (hexadecimal) color: Color (shared with client)
109
+ * - (boolean) collision
110
+ * - You can your own properties
111
+ *
112
+ * @title Create Shape
113
+ * @since 3.0.0-beta.3
114
+ * @method map.createShape(obj)
115
+ * @param {object} obj
116
+ * @returns {RpgShape}
117
+ * @memberof Map
118
+ */
119
+ createShape(obj: HitObject): RpgShape;
120
+ /**
121
+ * Delete a shape
122
+ *
123
+ * @title Get Shapes
124
+ * @method map.removeShape(name)
125
+ * @param {string} name Name of shape
126
+ * @returns {void}
127
+ * @memberof Map
128
+ */
25
129
  removeShape(name: string): void;
26
- getShapes(): Shape[];
27
- getPositionByShape(filter: any): {
130
+ /**
131
+ * Return all shapes on the map
132
+ *
133
+ * @title Get Shapes
134
+ * @method map.getShapes()
135
+ * @returns {RpgShape[]}
136
+ * @memberof Map
137
+ * @memberof RpgSceneMap
138
+ */
139
+ getShapes(): RpgShape[];
140
+ /**
141
+ * Returns a shape by its name. Returns undefined is nothing is found
142
+ *
143
+ * @title Get Shape by name
144
+ * @method map.getShape(name)
145
+ * @param {string} name Name of shape
146
+ * @returns {RpgShape[] | undefined}
147
+ * @memberof Map
148
+ * @memberof RpgSceneMap
149
+ */
150
+ getShape(name: string): RpgShape | undefined;
151
+ getPositionByShape(filter: (shape: RpgShape) => {}): {
28
152
  x: number;
29
153
  y: number;
30
154
  z: number;
31
155
  } | null;
32
- getTileIndex(x: any, y: any, [z]: [any]): number;
33
- getTileByIndex(tileIndex: any, zPlayer: any): TileInfo;
34
- getTileOriginPosition(x: any, y: any): {
156
+ setTile(x: number, y: number, layerFilter: string | ((layer: any) => boolean), tileInfo: any): {
157
+ x: number;
158
+ y: number;
159
+ tiles: {
160
+ [tileIndex: number]: object;
161
+ };
162
+ };
163
+ /**
164
+ * Get the tile index on the tileset
165
+ *
166
+ * @title Get index of tile
167
+ * @method map.getTileIndex(x,y)
168
+ * @param {number} x Position X
169
+ * @param {number} x Position Y
170
+ * @returns {number}
171
+ * @memberof Map
172
+ * @memberof RpgSceneMap
173
+ */
174
+ getTileIndex(x: number, y: number, [z]?: [number]): number;
175
+ /**
176
+ * Retrieves tiles according to its index
177
+
178
+ * @title Get tile by index
179
+ * @method map.getTileByIndex(tileIndex)
180
+ * @param {number} tileIndex tile index
181
+ * @returns {TileInfo}
182
+ * @example
183
+ * ```ts
184
+ * const index = map.getTileIndex(0, 0)
185
+ * const tiles = map.getTileByIndex(index)
186
+ * ```
187
+ * @memberof Map
188
+ * @memberof RpgSceneMap
189
+ */
190
+ getTileByIndex(tileIndex: number, zPlayer?: [number, number]): TileInfo;
191
+ /**
192
+ * Find the point of origin (top left) of a tile. Of course, its position depends on the size of the tile
193
+
194
+ * @title Get origin position of tile
195
+ * @method map.getTileOriginPosition(x,y)
196
+ * @param {number} x Position X
197
+ * @param {number} x Position Y
198
+ * @returns { {x: number, y: number }}
199
+ * @example
200
+ * ```ts
201
+ * // If the size of a tile is 32x32px
202
+ * const position = map.getTileOriginPosition(35, 12)
203
+ * console.log(position) // { x: 32, y: 0 }
204
+ * ```
205
+ * @memberof Map
206
+ * @memberof RpgSceneMap
207
+ */
208
+ getTileOriginPosition(x: number, y: number): {
35
209
  x: number;
36
210
  y: number;
37
211
  };
38
- getTileByPosition(x: any, y: any, z: any): TileInfo;
212
+ /**
213
+ * Recover tiles according to a position
214
+
215
+ * @title Get tile by position
216
+ * @method map.getTileByPosition(x,y)
217
+ * @param {number} x Position X
218
+ * @param {number} x Position Y
219
+ * @returns {TileInfo}
220
+ * @example
221
+ * ```ts
222
+ * const tiles = map.getTileByPosition(0, 0)
223
+ * ```
224
+ * @memberof Map
225
+ * @memberof RpgSceneMap
226
+ */
227
+ getTileByPosition(x: number, y: number, z?: [number, number]): TileInfo;
228
+ /**
229
+ * Get tile and verify collision with hitbox
230
+ * @param hitbox
231
+ * @param x
232
+ * @param y
233
+ * @param z
234
+ * @returns TileInfo
235
+ */
236
+ getTile(hitbox: any, x: number, y: number, z?: [number, number]): TileInfo;
39
237
  }
40
- export {};
package/lib/Map.js CHANGED
@@ -2,13 +2,35 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const Utils_1 = require("./Utils");
4
4
  const Shape_1 = require("./Shape");
5
+ const Hit_1 = require("./Hit");
5
6
  const buffer = new Map();
6
7
  class RpgCommonMap {
7
8
  constructor() {
8
9
  this.width = 0;
9
10
  this.height = 0;
11
+ /**
12
+ * @title Width of a tile
13
+ * @prop {number} [tileWidth]
14
+ * @readonly
15
+ * @memberof Map
16
+ * @memberof RpgSceneMap
17
+ * */
10
18
  this.tileWidth = 0;
19
+ /**
20
+ * @title Height of a tile
21
+ * @prop {number} [tileHeight]
22
+ * @readonly
23
+ * @memberof Map
24
+ * @memberof RpgSceneMap
25
+ * */
11
26
  this.tileHeight = 0;
27
+ /**
28
+ * @title Layers of map
29
+ * @prop {object[]} [layers]
30
+ * @readonly
31
+ * @memberof Map
32
+ * @memberof RpgSceneMap
33
+ * */
12
34
  this.layers = [];
13
35
  this.shapes = [];
14
36
  }
@@ -24,12 +46,33 @@ class RpgCommonMap {
24
46
  this.layers = data.layers;
25
47
  this._extractShapes();
26
48
  }
49
+ /**
50
+ * @title Width of the map in pixels
51
+ * @prop {number} [widthPx]
52
+ * @readonly
53
+ * @memberof Map
54
+ * @memberof RpgSceneMap
55
+ * */
27
56
  get widthPx() {
28
57
  return this.width * this.tileWidth;
29
58
  }
59
+ /**
60
+ * @title Height of the map in pixels
61
+ * @prop {number} [heightPx]
62
+ * @readonly
63
+ * @memberof Map
64
+ * @memberof RpgSceneMap
65
+ * */
30
66
  get heightPx() {
31
67
  return this.height * this.tileHeight;
32
68
  }
69
+ /**
70
+ * @title The depth of the map in pixels (this is the height of a tile ;))
71
+ * @prop {number} map.zTileHeight
72
+ * @readonly
73
+ * @memberof Map
74
+ * @memberof RpgSceneMap
75
+ * */
33
76
  get zTileHeight() {
34
77
  return this.tileHeight;
35
78
  }
@@ -42,19 +85,90 @@ class RpgCommonMap {
42
85
  }
43
86
  }
44
87
  }
88
+ /**
89
+ * Find a layer by name. Returns `undefined` is the layer is not found
90
+
91
+ * @title Get Layer by name
92
+ * @method map.getLayerByName(name)
93
+ * @param {string} name layer name
94
+ * @returns {LayerInfo | undefined}
95
+ * @example
96
+ * ```ts
97
+ * const tiles = map.getLayerByName(0, 0)
98
+ * ```
99
+ * @memberof Map
100
+ * @memberof RpgSceneMap
101
+ */
102
+ getLayerByName(name) {
103
+ return this.layers.find(layer => layer.name == name);
104
+ }
105
+ /**
106
+ * Create a shape dynamically on the map
107
+ *
108
+ * Object:
109
+ * - (number) x: Position X
110
+ * - (number) y: Position Y
111
+ * - (number) width: Width
112
+ * - (number) height: Height
113
+ * - (object) properties (optionnal):
114
+ * - (number) z: Position Z
115
+ * - (hexadecimal) color: Color (shared with client)
116
+ * - (boolean) collision
117
+ * - You can your own properties
118
+ *
119
+ * @title Create Shape
120
+ * @since 3.0.0-beta.3
121
+ * @method map.createShape(obj)
122
+ * @param {object} obj
123
+ * @returns {RpgShape}
124
+ * @memberof Map
125
+ */
45
126
  createShape(obj) {
46
127
  obj.name = (obj.name || Utils_1.generateUID());
47
- const shape = new Shape_1.Shape(obj);
128
+ obj.properties = obj.properties || {};
129
+ const shape = new Shape_1.RpgShape(obj);
48
130
  this.shapes.push(shape);
49
- return shape;
131
+ // trick to sync with client
132
+ return this.shapes[this.shapes.length - 1];
50
133
  }
134
+ /**
135
+ * Delete a shape
136
+ *
137
+ * @title Get Shapes
138
+ * @method map.removeShape(name)
139
+ * @param {string} name Name of shape
140
+ * @returns {void}
141
+ * @memberof Map
142
+ */
51
143
  removeShape(name) {
52
144
  // TODO: out players after delete shape
53
145
  this.shapes = this.shapes.filter(shape => shape.name != name);
54
146
  }
147
+ /**
148
+ * Return all shapes on the map
149
+ *
150
+ * @title Get Shapes
151
+ * @method map.getShapes()
152
+ * @returns {RpgShape[]}
153
+ * @memberof Map
154
+ * @memberof RpgSceneMap
155
+ */
55
156
  getShapes() {
56
157
  return this.shapes;
57
158
  }
159
+ /**
160
+ * Returns a shape by its name. Returns undefined is nothing is found
161
+ *
162
+ * @title Get Shape by name
163
+ * @method map.getShape(name)
164
+ * @param {string} name Name of shape
165
+ * @returns {RpgShape[] | undefined}
166
+ * @memberof Map
167
+ * @memberof RpgSceneMap
168
+ */
169
+ getShape(name) {
170
+ return this.shapes.find(shape => shape.name == name);
171
+ }
58
172
  getPositionByShape(filter) {
59
173
  const startsFind = this.getShapes().filter(filter);
60
174
  if (startsFind.length) {
@@ -63,10 +177,58 @@ class RpgCommonMap {
63
177
  }
64
178
  return null;
65
179
  }
66
- getTileIndex(x, y, [z]) {
180
+ setTile(x, y, layerFilter, tileInfo) {
181
+ const tileIndex = this.getTileIndex(x, y);
182
+ let fnFilter;
183
+ let tilesEdited = {};
184
+ if (Utils_1.isString(layerFilter)) {
185
+ fnFilter = (layer) => layer.name == layerFilter;
186
+ }
187
+ else {
188
+ fnFilter = layerFilter;
189
+ }
190
+ for (let layer of this.layers) {
191
+ if (!fnFilter(layer))
192
+ continue;
193
+ tilesEdited[layer.name] = tileInfo;
194
+ layer.tiles[tileIndex] = tilesEdited[layer.name];
195
+ }
196
+ return {
197
+ x,
198
+ y,
199
+ tiles: tilesEdited
200
+ };
201
+ }
202
+ /**
203
+ * Get the tile index on the tileset
204
+ *
205
+ * @title Get index of tile
206
+ * @method map.getTileIndex(x,y)
207
+ * @param {number} x Position X
208
+ * @param {number} x Position Y
209
+ * @returns {number}
210
+ * @memberof Map
211
+ * @memberof RpgSceneMap
212
+ */
213
+ getTileIndex(x, y, [z] = [0]) {
67
214
  return this.width * Math.floor((y - z) / this.tileHeight) + Math.floor(x / this.tileWidth);
68
215
  }
69
- getTileByIndex(tileIndex, zPlayer) {
216
+ /**
217
+ * Retrieves tiles according to its index
218
+
219
+ * @title Get tile by index
220
+ * @method map.getTileByIndex(tileIndex)
221
+ * @param {number} tileIndex tile index
222
+ * @returns {TileInfo}
223
+ * @example
224
+ * ```ts
225
+ * const index = map.getTileIndex(0, 0)
226
+ * const tiles = map.getTileByIndex(index)
227
+ * ```
228
+ * @memberof Map
229
+ * @memberof RpgSceneMap
230
+ */
231
+ getTileByIndex(tileIndex, zPlayer = [0, 0]) {
70
232
  const tiles = [];
71
233
  for (let layer of this.layers) {
72
234
  if (layer.type != 'tile') {
@@ -76,7 +238,9 @@ class RpgCommonMap {
76
238
  if (!_tiles) {
77
239
  continue;
78
240
  }
79
- const zLayer = layer.properties.z;
241
+ if (!_tiles.properties)
242
+ _tiles.properties = {};
243
+ const zLayer = layer.properties ? layer.properties.z : 0;
80
244
  const zTile = _tiles.properties.z;
81
245
  let z, zIntersection;
82
246
  if (zLayer !== undefined) {
@@ -103,7 +267,8 @@ class RpgCommonMap {
103
267
  tiles,
104
268
  hasCollision: true,
105
269
  isOverlay: false,
106
- objectGroups: []
270
+ objectGroups: [],
271
+ tileIndex
107
272
  };
108
273
  }
109
274
  const hasCollision = getLastTile.properties.collision;
@@ -115,19 +280,77 @@ class RpgCommonMap {
115
280
  hasCollision,
116
281
  isOverlay,
117
282
  objectGroups,
118
- isClimbable
283
+ isClimbable,
284
+ tileIndex
119
285
  };
120
286
  }
287
+ /**
288
+ * Find the point of origin (top left) of a tile. Of course, its position depends on the size of the tile
289
+
290
+ * @title Get origin position of tile
291
+ * @method map.getTileOriginPosition(x,y)
292
+ * @param {number} x Position X
293
+ * @param {number} x Position Y
294
+ * @returns { {x: number, y: number }}
295
+ * @example
296
+ * ```ts
297
+ * // If the size of a tile is 32x32px
298
+ * const position = map.getTileOriginPosition(35, 12)
299
+ * console.log(position) // { x: 32, y: 0 }
300
+ * ```
301
+ * @memberof Map
302
+ * @memberof RpgSceneMap
303
+ */
121
304
  getTileOriginPosition(x, y) {
122
305
  return {
123
306
  x: Math.floor(x / this.tileWidth) * this.tileWidth,
124
307
  y: Math.floor(y / this.tileHeight) * this.tileHeight
125
308
  };
126
309
  }
127
- getTileByPosition(x, y, z) {
128
- const tileIndex = this.getTileIndex(x, y, z);
310
+ /**
311
+ * Recover tiles according to a position
312
+
313
+ * @title Get tile by position
314
+ * @method map.getTileByPosition(x,y)
315
+ * @param {number} x Position X
316
+ * @param {number} x Position Y
317
+ * @returns {TileInfo}
318
+ * @example
319
+ * ```ts
320
+ * const tiles = map.getTileByPosition(0, 0)
321
+ * ```
322
+ * @memberof Map
323
+ * @memberof RpgSceneMap
324
+ */
325
+ getTileByPosition(x, y, z = [0, 0]) {
326
+ const tileIndex = this.getTileIndex(x, y, [z[0]]);
129
327
  return this.getTileByIndex(tileIndex, z);
130
328
  }
329
+ /**
330
+ * Get tile and verify collision with hitbox
331
+ * @param hitbox
332
+ * @param x
333
+ * @param y
334
+ * @param z
335
+ * @returns TileInfo
336
+ */
337
+ getTile(hitbox, x, y, z = [0, 0]) {
338
+ const tile = this.getTileByPosition(x, y, z);
339
+ const tilePos = this.getTileOriginPosition(x, y);
340
+ if (tile.objectGroups) {
341
+ for (let object of tile.objectGroups) {
342
+ const hit = Hit_1.Hit.getHitbox(object, {
343
+ x: tilePos.x,
344
+ y: tilePos.y
345
+ });
346
+ const collided = Hit_1.Hit.testPolyCollision(hit.type, hit.hitbox, hitbox);
347
+ if (collided) {
348
+ tile.hasCollision = true;
349
+ }
350
+ }
351
+ }
352
+ return tile;
353
+ }
131
354
  }
132
355
  exports.default = RpgCommonMap;
133
356
  //# sourceMappingURL=Map.js.map