evotars 0.0.7 → 0.0.9

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 (80) hide show
  1. package/.editorconfig +13 -0
  2. package/.prettierrc.json +3 -0
  3. package/README.md +3 -5
  4. package/index.html +13 -0
  5. package/package.json +3 -16
  6. package/playground/main.ts +48 -0
  7. package/playground/styles.css +17 -0
  8. package/public/evotars/agent/data.json +18 -0
  9. package/public/evotars/agent/sprite.json +166 -0
  10. package/public/evotars/agent/sprite.png +0 -0
  11. package/public/evotars/cat/data.json +18 -0
  12. package/public/evotars/cat/sprite.json +231 -0
  13. package/public/evotars/cat/sprite.png +0 -0
  14. package/public/evotars/dude/data.json +18 -0
  15. package/public/evotars/dude/sprite.json +231 -0
  16. package/public/evotars/dude/sprite.png +0 -0
  17. package/public/evotars/girl/data.json +18 -0
  18. package/public/evotars/girl/sprite.json +231 -0
  19. package/public/evotars/girl/sprite.png +0 -0
  20. package/public/evotars/nerd/data.json +18 -0
  21. package/public/evotars/nerd/sprite.json +231 -0
  22. package/public/evotars/nerd/sprite.png +0 -0
  23. package/public/evotars/senior/data.json +18 -0
  24. package/public/evotars/senior/sprite.json +231 -0
  25. package/public/evotars/senior/sprite.png +0 -0
  26. package/public/evotars/set.json +10 -0
  27. package/public/evotars/sith/data.json +18 -0
  28. package/public/evotars/sith/sprite.json +166 -0
  29. package/public/evotars/sith/sprite.png +0 -0
  30. package/public/evotars/sponge/data.json +18 -0
  31. package/public/evotars/sponge/sprite.json +231 -0
  32. package/public/evotars/sponge/sprite.png +0 -0
  33. package/public/fonts/Rubik.ttf +0 -0
  34. package/public/sounds/jump.mp3 +0 -0
  35. package/src/app.ts +71 -0
  36. package/src/config/constants.ts +1 -0
  37. package/src/entities/EmoteSpitter.ts +102 -0
  38. package/src/entities/Evotar.ts +468 -0
  39. package/src/entities/Message.ts +164 -0
  40. package/src/entities/Name.ts +33 -0
  41. package/src/entities/SpriteContainer.ts +65 -0
  42. package/src/entities/TrailEffect.ts +73 -0
  43. package/src/evotars.ts +75 -0
  44. package/src/evotarsManager.ts +313 -0
  45. package/src/helpers/timer.ts +43 -0
  46. package/src/helpers/types.ts +4 -0
  47. package/src/services/soundService.ts +30 -0
  48. package/src/services/spriteService.ts +167 -0
  49. package/src/types/dto/action.ts +79 -0
  50. package/{dist/types/dto/chatter.d.ts → src/types/dto/chatter.ts} +2 -2
  51. package/src/types/dto/event.ts +9 -0
  52. package/src/types/dto/message.ts +8 -0
  53. package/src/types/dto/settings.ts +5 -0
  54. package/src/types/dto/user.ts +13 -0
  55. package/tsconfig.json +23 -0
  56. package/vite.config.js +26 -0
  57. package/dist/app.d.ts +0 -24
  58. package/dist/config/constants.d.ts +0 -1
  59. package/dist/entities/EmoteSpitter.d.ts +0 -15
  60. package/dist/entities/Evotar.d.ts +0 -78
  61. package/dist/entities/Message.d.ts +0 -27
  62. package/dist/entities/Name.d.ts +0 -14
  63. package/dist/entities/SpriteContainer.d.ts +0 -16
  64. package/dist/entities/TrailEffect.d.ts +0 -15
  65. package/dist/evotars.d.ts +0 -15
  66. package/dist/evotars.js +0 -705
  67. package/dist/evotars.umd.cjs +0 -1
  68. package/dist/evotarsManager.d.ts +0 -30
  69. package/dist/helpers/timer.d.ts +0 -14
  70. package/dist/helpers/types.d.ts +0 -10
  71. package/dist/services/soundService.d.ts +0 -14
  72. package/dist/services/spriteService.d.ts +0 -63
  73. package/dist/types/dto/action.d.ts +0 -56
  74. package/dist/types/dto/event.d.ts +0 -9
  75. package/dist/types/dto/message.d.ts +0 -8
  76. package/dist/types/dto/settings.d.ts +0 -5
  77. package/dist/types/dto/user.d.ts +0 -12
  78. /package/{dist/index.d.ts → src/index.ts} +0 -0
  79. /package/{dist/types/dto/index.d.ts → src/types/dto/index.ts} +0 -0
  80. /package/{dist/types/index.d.ts → src/types/index.ts} +0 -0
@@ -0,0 +1,166 @@
1
+ { "frames": {
2
+ "sith_Body_0": {
3
+ "frame": { "x": 0, "y": 0, "w": 32, "h": 32 },
4
+ "rotated": false,
5
+ "trimmed": false,
6
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
7
+ "sourceSize": { "w": 32, "h": 32 },
8
+ "duration": 300
9
+ },
10
+ "sith_Body_1": {
11
+ "frame": { "x": 32, "y": 0, "w": 32, "h": 32 },
12
+ "rotated": false,
13
+ "trimmed": false,
14
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
15
+ "sourceSize": { "w": 32, "h": 32 },
16
+ "duration": 300
17
+ },
18
+ "sith_Body_2": {
19
+ "frame": { "x": 64, "y": 0, "w": 32, "h": 32 },
20
+ "rotated": false,
21
+ "trimmed": false,
22
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
23
+ "sourceSize": { "w": 32, "h": 32 },
24
+ "duration": 300
25
+ },
26
+ "sith_Body_3": {
27
+ "frame": { "x": 96, "y": 0, "w": 32, "h": 32 },
28
+ "rotated": false,
29
+ "trimmed": false,
30
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
31
+ "sourceSize": { "w": 32, "h": 32 },
32
+ "duration": 100
33
+ },
34
+ "sith_Body_4": {
35
+ "frame": { "x": 128, "y": 0, "w": 32, "h": 32 },
36
+ "rotated": false,
37
+ "trimmed": false,
38
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
39
+ "sourceSize": { "w": 32, "h": 32 },
40
+ "duration": 100
41
+ },
42
+ "sith_Body_5": {
43
+ "frame": { "x": 160, "y": 0, "w": 32, "h": 32 },
44
+ "rotated": false,
45
+ "trimmed": false,
46
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
47
+ "sourceSize": { "w": 32, "h": 32 },
48
+ "duration": 100
49
+ },
50
+ "sith_Body_6": {
51
+ "frame": { "x": 192, "y": 0, "w": 32, "h": 32 },
52
+ "rotated": false,
53
+ "trimmed": false,
54
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
55
+ "sourceSize": { "w": 32, "h": 32 },
56
+ "duration": 100
57
+ },
58
+ "sith_Body_7": {
59
+ "frame": { "x": 224, "y": 0, "w": 32, "h": 32 },
60
+ "rotated": false,
61
+ "trimmed": false,
62
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
63
+ "sourceSize": { "w": 32, "h": 32 },
64
+ "duration": 100
65
+ },
66
+ "sith_Body_8": {
67
+ "frame": { "x": 256, "y": 0, "w": 32, "h": 32 },
68
+ "rotated": false,
69
+ "trimmed": false,
70
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
71
+ "sourceSize": { "w": 32, "h": 32 },
72
+ "duration": 100
73
+ },
74
+ "sith_Eyes_0": {
75
+ "frame": { "x": 0, "y": 32, "w": 32, "h": 32 },
76
+ "rotated": false,
77
+ "trimmed": false,
78
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
79
+ "sourceSize": { "w": 32, "h": 32 },
80
+ "duration": 300
81
+ },
82
+ "sith_Eyes_1": {
83
+ "frame": { "x": 32, "y": 32, "w": 32, "h": 32 },
84
+ "rotated": false,
85
+ "trimmed": false,
86
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
87
+ "sourceSize": { "w": 32, "h": 32 },
88
+ "duration": 300
89
+ },
90
+ "sith_Eyes_2": {
91
+ "frame": { "x": 64, "y": 32, "w": 32, "h": 32 },
92
+ "rotated": false,
93
+ "trimmed": false,
94
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
95
+ "sourceSize": { "w": 32, "h": 32 },
96
+ "duration": 300
97
+ },
98
+ "sith_Eyes_3": {
99
+ "frame": { "x": 96, "y": 32, "w": 32, "h": 32 },
100
+ "rotated": false,
101
+ "trimmed": false,
102
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
103
+ "sourceSize": { "w": 32, "h": 32 },
104
+ "duration": 100
105
+ },
106
+ "sith_Eyes_4": {
107
+ "frame": { "x": 128, "y": 32, "w": 32, "h": 32 },
108
+ "rotated": false,
109
+ "trimmed": false,
110
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
111
+ "sourceSize": { "w": 32, "h": 32 },
112
+ "duration": 100
113
+ },
114
+ "sith_Eyes_5": {
115
+ "frame": { "x": 160, "y": 32, "w": 32, "h": 32 },
116
+ "rotated": false,
117
+ "trimmed": false,
118
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
119
+ "sourceSize": { "w": 32, "h": 32 },
120
+ "duration": 100
121
+ },
122
+ "sith_Eyes_6": {
123
+ "frame": { "x": 192, "y": 32, "w": 32, "h": 32 },
124
+ "rotated": false,
125
+ "trimmed": false,
126
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
127
+ "sourceSize": { "w": 32, "h": 32 },
128
+ "duration": 100
129
+ },
130
+ "sith_Eyes_7": {
131
+ "frame": { "x": 224, "y": 32, "w": 32, "h": 32 },
132
+ "rotated": false,
133
+ "trimmed": false,
134
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
135
+ "sourceSize": { "w": 32, "h": 32 },
136
+ "duration": 100
137
+ },
138
+ "sith_Eyes_8": {
139
+ "frame": { "x": 256, "y": 32, "w": 32, "h": 32 },
140
+ "rotated": false,
141
+ "trimmed": false,
142
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
143
+ "sourceSize": { "w": 32, "h": 32 },
144
+ "duration": 100
145
+ }
146
+ },
147
+ "meta": {
148
+ "app": "https://www.aseprite.org/",
149
+ "version": "1.x-dev",
150
+ "image": "sith.png",
151
+ "format": "RGBA8888",
152
+ "size": { "w": 288, "h": 64 },
153
+ "scale": "1",
154
+ "frameTags": [
155
+ { "name": "Idle", "from": 0, "to": 2, "direction": "forward", "color": "#000000ff" },
156
+ { "name": "Jump", "from": 3, "to": 3, "direction": "forward", "color": "#000000ff" },
157
+ { "name": "Fall", "from": 4, "to": 4, "direction": "forward", "color": "#000000ff" },
158
+ { "name": "Land", "from": 5, "to": 5, "direction": "forward", "color": "#000000ff" },
159
+ { "name": "Run", "from": 6, "to": 8, "direction": "forward", "color": "#000000ff" }
160
+ ],
161
+ "layers": [
162
+ { "name": "Body", "opacity": 255, "blendMode": "normal" },
163
+ { "name": "Eyes", "opacity": 255, "blendMode": "normal" }
164
+ ]
165
+ }
166
+ }
Binary file
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "sponge",
3
+ "collider": {
4
+ "x": 8,
5
+ "y": 7,
6
+ "w": 16,
7
+ "h": 18
8
+ },
9
+ "size": {
10
+ "w": 32,
11
+ "h": 32
12
+ },
13
+ "scale": 4,
14
+ "flip": true,
15
+ "colored": [
16
+ "Body"
17
+ ]
18
+ }
@@ -0,0 +1,231 @@
1
+ { "frames": {
2
+ "sponge_Body_0": {
3
+ "frame": { "x": 0, "y": 0, "w": 32, "h": 32 },
4
+ "rotated": false,
5
+ "trimmed": false,
6
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
7
+ "sourceSize": { "w": 32, "h": 32 },
8
+ "duration": 300
9
+ },
10
+ "sponge_Body_1": {
11
+ "frame": { "x": 32, "y": 0, "w": 32, "h": 32 },
12
+ "rotated": false,
13
+ "trimmed": false,
14
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
15
+ "sourceSize": { "w": 32, "h": 32 },
16
+ "duration": 300
17
+ },
18
+ "sponge_Body_2": {
19
+ "frame": { "x": 64, "y": 0, "w": 32, "h": 32 },
20
+ "rotated": false,
21
+ "trimmed": false,
22
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
23
+ "sourceSize": { "w": 32, "h": 32 },
24
+ "duration": 300
25
+ },
26
+ "sponge_Body_3": {
27
+ "frame": { "x": 96, "y": 0, "w": 32, "h": 32 },
28
+ "rotated": false,
29
+ "trimmed": false,
30
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
31
+ "sourceSize": { "w": 32, "h": 32 },
32
+ "duration": 100
33
+ },
34
+ "sponge_Body_4": {
35
+ "frame": { "x": 128, "y": 0, "w": 32, "h": 32 },
36
+ "rotated": false,
37
+ "trimmed": false,
38
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
39
+ "sourceSize": { "w": 32, "h": 32 },
40
+ "duration": 100
41
+ },
42
+ "sponge_Body_5": {
43
+ "frame": { "x": 160, "y": 0, "w": 32, "h": 32 },
44
+ "rotated": false,
45
+ "trimmed": false,
46
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
47
+ "sourceSize": { "w": 32, "h": 32 },
48
+ "duration": 100
49
+ },
50
+ "sponge_Body_6": {
51
+ "frame": { "x": 192, "y": 0, "w": 32, "h": 32 },
52
+ "rotated": false,
53
+ "trimmed": false,
54
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
55
+ "sourceSize": { "w": 32, "h": 32 },
56
+ "duration": 100
57
+ },
58
+ "sponge_Body_7": {
59
+ "frame": { "x": 224, "y": 0, "w": 32, "h": 32 },
60
+ "rotated": false,
61
+ "trimmed": false,
62
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
63
+ "sourceSize": { "w": 32, "h": 32 },
64
+ "duration": 100
65
+ },
66
+ "sponge_Body_8": {
67
+ "frame": { "x": 256, "y": 0, "w": 32, "h": 32 },
68
+ "rotated": false,
69
+ "trimmed": false,
70
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
71
+ "sourceSize": { "w": 32, "h": 32 },
72
+ "duration": 100
73
+ },
74
+ "sponge_Body_9": {
75
+ "frame": { "x": 288, "y": 0, "w": 32, "h": 32 },
76
+ "rotated": false,
77
+ "trimmed": false,
78
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
79
+ "sourceSize": { "w": 32, "h": 32 },
80
+ "duration": 300
81
+ },
82
+ "sponge_Body_10": {
83
+ "frame": { "x": 320, "y": 0, "w": 32, "h": 32 },
84
+ "rotated": false,
85
+ "trimmed": false,
86
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
87
+ "sourceSize": { "w": 32, "h": 32 },
88
+ "duration": 300
89
+ },
90
+ "sponge_Body_11": {
91
+ "frame": { "x": 352, "y": 0, "w": 32, "h": 32 },
92
+ "rotated": false,
93
+ "trimmed": false,
94
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
95
+ "sourceSize": { "w": 32, "h": 32 },
96
+ "duration": 300
97
+ },
98
+ "sponge_Body_12": {
99
+ "frame": { "x": 384, "y": 0, "w": 32, "h": 32 },
100
+ "rotated": false,
101
+ "trimmed": false,
102
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
103
+ "sourceSize": { "w": 32, "h": 32 },
104
+ "duration": 1000
105
+ },
106
+ "sponge_Eyes_0": {
107
+ "frame": { "x": 0, "y": 32, "w": 32, "h": 32 },
108
+ "rotated": false,
109
+ "trimmed": false,
110
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
111
+ "sourceSize": { "w": 32, "h": 32 },
112
+ "duration": 300
113
+ },
114
+ "sponge_Eyes_1": {
115
+ "frame": { "x": 32, "y": 32, "w": 32, "h": 32 },
116
+ "rotated": false,
117
+ "trimmed": false,
118
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
119
+ "sourceSize": { "w": 32, "h": 32 },
120
+ "duration": 300
121
+ },
122
+ "sponge_Eyes_2": {
123
+ "frame": { "x": 64, "y": 32, "w": 32, "h": 32 },
124
+ "rotated": false,
125
+ "trimmed": false,
126
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
127
+ "sourceSize": { "w": 32, "h": 32 },
128
+ "duration": 300
129
+ },
130
+ "sponge_Eyes_3": {
131
+ "frame": { "x": 96, "y": 32, "w": 32, "h": 32 },
132
+ "rotated": false,
133
+ "trimmed": false,
134
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
135
+ "sourceSize": { "w": 32, "h": 32 },
136
+ "duration": 100
137
+ },
138
+ "sponge_Eyes_4": {
139
+ "frame": { "x": 128, "y": 32, "w": 32, "h": 32 },
140
+ "rotated": false,
141
+ "trimmed": false,
142
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
143
+ "sourceSize": { "w": 32, "h": 32 },
144
+ "duration": 100
145
+ },
146
+ "sponge_Eyes_5": {
147
+ "frame": { "x": 160, "y": 32, "w": 32, "h": 32 },
148
+ "rotated": false,
149
+ "trimmed": false,
150
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
151
+ "sourceSize": { "w": 32, "h": 32 },
152
+ "duration": 100
153
+ },
154
+ "sponge_Eyes_6": {
155
+ "frame": { "x": 192, "y": 32, "w": 32, "h": 32 },
156
+ "rotated": false,
157
+ "trimmed": false,
158
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
159
+ "sourceSize": { "w": 32, "h": 32 },
160
+ "duration": 100
161
+ },
162
+ "sponge_Eyes_7": {
163
+ "frame": { "x": 224, "y": 32, "w": 32, "h": 32 },
164
+ "rotated": false,
165
+ "trimmed": false,
166
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
167
+ "sourceSize": { "w": 32, "h": 32 },
168
+ "duration": 100
169
+ },
170
+ "sponge_Eyes_8": {
171
+ "frame": { "x": 256, "y": 32, "w": 32, "h": 32 },
172
+ "rotated": false,
173
+ "trimmed": false,
174
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
175
+ "sourceSize": { "w": 32, "h": 32 },
176
+ "duration": 100
177
+ },
178
+ "sponge_Eyes_9": {
179
+ "frame": { "x": 288, "y": 32, "w": 32, "h": 32 },
180
+ "rotated": false,
181
+ "trimmed": false,
182
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
183
+ "sourceSize": { "w": 32, "h": 32 },
184
+ "duration": 300
185
+ },
186
+ "sponge_Eyes_10": {
187
+ "frame": { "x": 320, "y": 32, "w": 32, "h": 32 },
188
+ "rotated": false,
189
+ "trimmed": false,
190
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
191
+ "sourceSize": { "w": 32, "h": 32 },
192
+ "duration": 300
193
+ },
194
+ "sponge_Eyes_11": {
195
+ "frame": { "x": 352, "y": 32, "w": 32, "h": 32 },
196
+ "rotated": false,
197
+ "trimmed": false,
198
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
199
+ "sourceSize": { "w": 32, "h": 32 },
200
+ "duration": 300
201
+ },
202
+ "sponge_Eyes_12": {
203
+ "frame": { "x": 384, "y": 32, "w": 32, "h": 32 },
204
+ "rotated": false,
205
+ "trimmed": false,
206
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 32, "h": 32 },
207
+ "sourceSize": { "w": 32, "h": 32 },
208
+ "duration": 1000
209
+ }
210
+ },
211
+ "meta": {
212
+ "app": "https://www.aseprite.org/",
213
+ "version": "1.x-dev",
214
+ "image": "sponge.png",
215
+ "format": "RGBA8888",
216
+ "size": { "w": 416, "h": 64 },
217
+ "scale": "1",
218
+ "frameTags": [
219
+ { "name": "Idle", "from": 0, "to": 2, "direction": "forward", "color": "#000000ff" },
220
+ { "name": "Jump", "from": 3, "to": 3, "direction": "forward", "color": "#000000ff" },
221
+ { "name": "Fall", "from": 4, "to": 4, "direction": "forward", "color": "#000000ff" },
222
+ { "name": "Land", "from": 5, "to": 5, "direction": "forward", "color": "#000000ff" },
223
+ { "name": "Run", "from": 6, "to": 8, "direction": "forward", "color": "#000000ff" },
224
+ { "name": "Die", "from": 9, "to": 12, "direction": "forward", "color": "#000000ff" }
225
+ ],
226
+ "layers": [
227
+ { "name": "Body", "opacity": 255, "blendMode": "normal" },
228
+ { "name": "Eyes", "opacity": 255, "blendMode": "normal" }
229
+ ]
230
+ }
231
+ }
Binary file
Binary file
Binary file
package/src/app.ts ADDED
@@ -0,0 +1,71 @@
1
+ import * as PIXI from 'pixi.js';
2
+ import { Evotar } from './entities/Evotar';
3
+ import { timers } from './helpers/timer';
4
+ import { evotarsManager } from './evotarsManager';
5
+ import { SoundOptions, soundService } from './services/soundService';
6
+ import { SettingsEntity } from './types';
7
+ import { SpriteLoaderFn, spriteService } from './services/spriteService';
8
+
9
+ export type AppOptions = {
10
+ font?: string;
11
+ sounds?: SoundOptions;
12
+ spriteLoaderFn: SpriteLoaderFn;
13
+ };
14
+
15
+ export class App {
16
+ public stage: PIXI.Container = new PIXI.Container();
17
+ public evotars: Record<string, Evotar> = {};
18
+
19
+ public chatterIds: string[] = [];
20
+
21
+ public settings: SettingsEntity = {};
22
+
23
+ public renderer!: PIXI.Renderer;
24
+
25
+ public font?: string;
26
+
27
+ public async initialize(
28
+ element: HTMLElement,
29
+ options: AppOptions,
30
+ ): Promise<void> {
31
+ this.font = options.font;
32
+
33
+ spriteService.initialize(options.spriteLoaderFn);
34
+ soundService.initialize(options.sounds);
35
+
36
+ this.renderer = new PIXI.Renderer({
37
+ width: element.clientWidth,
38
+ height: element.clientHeight,
39
+ backgroundAlpha: 0,
40
+ });
41
+
42
+ element.appendChild(this.renderer.view as HTMLCanvasElement);
43
+
44
+ window.onresize = (): void => {
45
+ this.renderer.resize(element.clientWidth, element.clientHeight);
46
+ };
47
+
48
+ this.stage.sortableChildren = true;
49
+
50
+ evotarsManager.subscribe({
51
+ onAdd: (evotar: Evotar) => this.stage.addChild(evotar.container),
52
+ onDelete: (evotar: Evotar) => {
53
+ this.stage.removeChild(evotar.container);
54
+ this.stage.removeChild(evotar.trail.container);
55
+ },
56
+ });
57
+ }
58
+
59
+ public updateSettings(data: SettingsEntity): void {
60
+ this.settings = data;
61
+ }
62
+
63
+ public update(): void {
64
+ timers.tick();
65
+ evotarsManager.update();
66
+
67
+ this.renderer.render(this.stage);
68
+ }
69
+ }
70
+
71
+ export const app = new App();
@@ -0,0 +1 @@
1
+ export const FIXED_DELTA_TIME = 0.02 * 1000;
@@ -0,0 +1,102 @@
1
+ import * as PIXI from 'pixi.js';
2
+ import '@pixi/gif';
3
+ import { Point } from '../helpers/types';
4
+ import { Timer } from '../helpers/timer';
5
+ import { FIXED_DELTA_TIME } from '../config/constants';
6
+ import { AnimatedGIF } from '@pixi/gif';
7
+
8
+ export type EvotarEmoteSpitterProps = {
9
+ position: Point;
10
+ };
11
+
12
+ const GIFCache: Record<string, AnimatedGIF> = {};
13
+
14
+ export class EvotarEmoteSpitter {
15
+ public container: PIXI.Container = new PIXI.Container();
16
+
17
+ private emotes: PIXI.Sprite[] = [];
18
+
19
+ private moveSpeed = 50;
20
+ private alphaSpeed = 1;
21
+ private scaleSpeed = 0.5;
22
+
23
+ private timer?: Timer;
24
+
25
+ public async add(url: string): Promise<void> {
26
+ const cachedGIF = GIFCache[url];
27
+
28
+ let image;
29
+
30
+ if (cachedGIF) {
31
+ image = cachedGIF.clone();
32
+ } else {
33
+ const res = await fetch(url);
34
+ const contentType = res.headers.get('content-type');
35
+
36
+ switch (contentType) {
37
+ case 'image/gif': {
38
+ const buffer = await res.arrayBuffer();
39
+ image = AnimatedGIF.fromBuffer(buffer);
40
+ GIFCache[url] = image;
41
+ break;
42
+ }
43
+ case 'image/png': {
44
+ image = PIXI.Sprite.from(url);
45
+ break;
46
+ }
47
+ default: {
48
+ console.warn('Unsupported content type: ', contentType);
49
+ return;
50
+ }
51
+ }
52
+ }
53
+
54
+ if (image) {
55
+ image.anchor.set(0.5, 0.5);
56
+ image.scale.set(0, 0);
57
+
58
+ this.emotes.push(image);
59
+ }
60
+ }
61
+
62
+ private isAnimatedGIF(sprite: any): sprite is AnimatedGIF {
63
+ return sprite.currentFrame;
64
+ }
65
+
66
+ public update(props: EvotarEmoteSpitterProps): void {
67
+ this.timer?.tick();
68
+
69
+ if (!this.timer || this.timer.isCompleted) {
70
+ if (this.emotes.length > 0) {
71
+ this.timer = new Timer(2000, () => {
72
+ const sprite = this.emotes.shift();
73
+
74
+ if (sprite) {
75
+ if (this.isAnimatedGIF(sprite)) {
76
+ sprite.currentFrame = 0;
77
+ }
78
+
79
+ this.container.addChild(sprite);
80
+ }
81
+ });
82
+ }
83
+ }
84
+
85
+ this.container.position.x = props.position.x ?? this.container.position.x;
86
+ this.container.position.y = props.position.y ?? this.container.position.y;
87
+
88
+ for (const child of this.container.children) {
89
+ child.position.y -= (FIXED_DELTA_TIME * this.moveSpeed) / 1000;
90
+ child.scale.x += (FIXED_DELTA_TIME * this.scaleSpeed) / 1000;
91
+ child.scale.y += (FIXED_DELTA_TIME * this.scaleSpeed) / 1000;
92
+
93
+ if (child.scale.x > 1) {
94
+ child.alpha -= (FIXED_DELTA_TIME * this.alphaSpeed) / 1000;
95
+ }
96
+
97
+ if (child.alpha <= 0) {
98
+ this.container.removeChild(child);
99
+ }
100
+ }
101
+ }
102
+ }