matrix-engine-wgpu 1.3.17 → 1.3.18

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 (273) hide show
  1. package/.codesandbox/tasks.json +46 -0
  2. package/.devcontainer/devcontainer.json +22 -0
  3. package/.github/dependabot.yml +12 -0
  4. package/REFERENCE.md +59 -0
  5. package/app-worker.js +45 -0
  6. package/dev.md +541 -0
  7. package/empty.js +17 -0
  8. package/examples/camera-texture.js +60 -0
  9. package/examples/games/jamb/html-content.js +128 -0
  10. package/examples/games/jamb/jamb.js +1341 -0
  11. package/examples/games/jamb/readme.md +3 -0
  12. package/examples/load-jamb.js +6 -0
  13. package/examples/load-obj-file.js +95 -0
  14. package/examples/load-objs-sequence.js +68 -0
  15. package/examples/unlit-textures.js +31 -0
  16. package/examples/video-texture.js +61 -0
  17. package/examples.js +73 -0
  18. package/main.js +635 -0
  19. package/non-project-files/cubebuffer-example.js +51 -0
  20. package/non-project-files/dev.txt +21 -0
  21. package/non-project-files/image1.png +0 -0
  22. package/non-project-files/image6.png +0 -0
  23. package/package.json +1 -4
  24. package/public/ammojs/ammo.js +957 -0
  25. package/public/ammojs/ammo.wasm.js +921 -0
  26. package/public/ammojs/ammo.wasm.wasm +0 -0
  27. package/public/app-worker.js +47 -0
  28. package/public/app.js +12744 -0
  29. package/public/css/style.css +711 -0
  30. package/public/empty.html +25 -0
  31. package/public/empty.js +10453 -0
  32. package/public/examples.html +30 -0
  33. package/public/examples.js +11217 -0
  34. package/public/index.html +20 -0
  35. package/public/manifest copy.web +35 -0
  36. package/public/manifest.web +25 -0
  37. package/public/res/audios/block.mp3 +0 -0
  38. package/public/res/audios/dice-roll.mp3 +0 -0
  39. package/public/res/audios/dice1.mp3 +0 -0
  40. package/public/res/audios/dice2.mp3 +0 -0
  41. package/public/res/audios/kenney/Kenney.url +2 -0
  42. package/public/res/audios/kenney/License.txt +22 -0
  43. package/public/res/audios/kenney/Patreon.url +2 -0
  44. package/public/res/audios/kenney/audios/back_001.ogg +0 -0
  45. package/public/res/audios/kenney/audios/back_002.ogg +0 -0
  46. package/public/res/audios/kenney/audios/back_003.ogg +0 -0
  47. package/public/res/audios/kenney/audios/back_004.ogg +0 -0
  48. package/public/res/audios/kenney/audios/bong_001.ogg +0 -0
  49. package/public/res/audios/kenney/audios/click_001.ogg +0 -0
  50. package/public/res/audios/kenney/audios/click_002.ogg +0 -0
  51. package/public/res/audios/kenney/audios/click_003.ogg +0 -0
  52. package/public/res/audios/kenney/audios/click_004.ogg +0 -0
  53. package/public/res/audios/kenney/audios/click_005.ogg +0 -0
  54. package/public/res/audios/kenney/audios/close_001.ogg +0 -0
  55. package/public/res/audios/kenney/audios/close_002.ogg +0 -0
  56. package/public/res/audios/kenney/audios/close_003.ogg +0 -0
  57. package/public/res/audios/kenney/audios/close_004.ogg +0 -0
  58. package/public/res/audios/kenney/audios/confirmation_001.ogg +0 -0
  59. package/public/res/audios/kenney/audios/confirmation_002.ogg +0 -0
  60. package/public/res/audios/kenney/audios/confirmation_003.ogg +0 -0
  61. package/public/res/audios/kenney/audios/confirmation_004.ogg +0 -0
  62. package/public/res/audios/kenney/audios/drop_001.ogg +0 -0
  63. package/public/res/audios/kenney/audios/drop_002.ogg +0 -0
  64. package/public/res/audios/kenney/audios/drop_003.ogg +0 -0
  65. package/public/res/audios/kenney/audios/drop_004.ogg +0 -0
  66. package/public/res/audios/kenney/audios/error_001.ogg +0 -0
  67. package/public/res/audios/kenney/audios/error_002.ogg +0 -0
  68. package/public/res/audios/kenney/audios/error_003.ogg +0 -0
  69. package/public/res/audios/kenney/audios/error_004.ogg +0 -0
  70. package/public/res/audios/kenney/audios/error_005.ogg +0 -0
  71. package/public/res/audios/kenney/audios/error_006.ogg +0 -0
  72. package/public/res/audios/kenney/audios/error_007.ogg +0 -0
  73. package/public/res/audios/kenney/audios/error_008.ogg +0 -0
  74. package/public/res/audios/kenney/audios/glass_001.ogg +0 -0
  75. package/public/res/audios/kenney/audios/glass_002.ogg +0 -0
  76. package/public/res/audios/kenney/audios/glass_003.ogg +0 -0
  77. package/public/res/audios/kenney/audios/glass_004.ogg +0 -0
  78. package/public/res/audios/kenney/audios/glass_005.ogg +0 -0
  79. package/public/res/audios/kenney/audios/glass_006.ogg +0 -0
  80. package/public/res/audios/kenney/audios/glitch_001.ogg +0 -0
  81. package/public/res/audios/kenney/audios/glitch_002.ogg +0 -0
  82. package/public/res/audios/kenney/audios/glitch_003.ogg +0 -0
  83. package/public/res/audios/kenney/audios/glitch_004.ogg +0 -0
  84. package/public/res/audios/kenney/audios/maximize_001.ogg +0 -0
  85. package/public/res/audios/kenney/audios/maximize_002.ogg +0 -0
  86. package/public/res/audios/kenney/audios/maximize_003.ogg +0 -0
  87. package/public/res/audios/kenney/audios/maximize_004.ogg +0 -0
  88. package/public/res/audios/kenney/audios/maximize_005.ogg +0 -0
  89. package/public/res/audios/kenney/audios/maximize_006.ogg +0 -0
  90. package/public/res/audios/kenney/audios/maximize_007.ogg +0 -0
  91. package/public/res/audios/kenney/audios/maximize_008.ogg +0 -0
  92. package/public/res/audios/kenney/audios/maximize_009.ogg +0 -0
  93. package/public/res/audios/kenney/audios/minimize_001.ogg +0 -0
  94. package/public/res/audios/kenney/audios/minimize_002.ogg +0 -0
  95. package/public/res/audios/kenney/audios/minimize_003.ogg +0 -0
  96. package/public/res/audios/kenney/audios/minimize_004.ogg +0 -0
  97. package/public/res/audios/kenney/audios/minimize_005.ogg +0 -0
  98. package/public/res/audios/kenney/audios/minimize_006.ogg +0 -0
  99. package/public/res/audios/kenney/audios/minimize_007.ogg +0 -0
  100. package/public/res/audios/kenney/audios/minimize_008.ogg +0 -0
  101. package/public/res/audios/kenney/audios/minimize_009.ogg +0 -0
  102. package/public/res/audios/kenney/audios/open_001.ogg +0 -0
  103. package/public/res/audios/kenney/audios/open_002.ogg +0 -0
  104. package/public/res/audios/kenney/audios/open_003.ogg +0 -0
  105. package/public/res/audios/kenney/audios/open_004.ogg +0 -0
  106. package/public/res/audios/kenney/audios/pluck_001.ogg +0 -0
  107. package/public/res/audios/kenney/audios/pluck_002.ogg +0 -0
  108. package/public/res/audios/kenney/audios/question_001.ogg +0 -0
  109. package/public/res/audios/kenney/audios/question_002.ogg +0 -0
  110. package/public/res/audios/kenney/audios/question_003.ogg +0 -0
  111. package/public/res/audios/kenney/audios/question_004.ogg +0 -0
  112. package/public/res/audios/kenney/audios/scratch_001.ogg +0 -0
  113. package/public/res/audios/kenney/audios/scratch_002.ogg +0 -0
  114. package/public/res/audios/kenney/audios/scratch_003.ogg +0 -0
  115. package/public/res/audios/kenney/audios/scratch_004.ogg +0 -0
  116. package/public/res/audios/kenney/audios/scratch_005.ogg +0 -0
  117. package/public/res/audios/kenney/audios/scroll_001.ogg +0 -0
  118. package/public/res/audios/kenney/audios/scroll_002.ogg +0 -0
  119. package/public/res/audios/kenney/audios/scroll_003.ogg +0 -0
  120. package/public/res/audios/kenney/audios/scroll_004.ogg +0 -0
  121. package/public/res/audios/kenney/audios/scroll_005.ogg +0 -0
  122. package/public/res/audios/kenney/audios/select_001.ogg +0 -0
  123. package/public/res/audios/kenney/audios/select_002.ogg +0 -0
  124. package/public/res/audios/kenney/audios/select_003.ogg +0 -0
  125. package/public/res/audios/kenney/audios/select_004.ogg +0 -0
  126. package/public/res/audios/kenney/audios/select_005.ogg +0 -0
  127. package/public/res/audios/kenney/audios/select_006.ogg +0 -0
  128. package/public/res/audios/kenney/audios/select_007.ogg +0 -0
  129. package/public/res/audios/kenney/audios/select_008.ogg +0 -0
  130. package/public/res/audios/kenney/audios/switch_001.ogg +0 -0
  131. package/public/res/audios/kenney/audios/switch_002.ogg +0 -0
  132. package/public/res/audios/kenney/audios/switch_003.ogg +0 -0
  133. package/public/res/audios/kenney/audios/switch_004.ogg +0 -0
  134. package/public/res/audios/kenney/audios/switch_005.ogg +0 -0
  135. package/public/res/audios/kenney/audios/switch_006.ogg +0 -0
  136. package/public/res/audios/kenney/audios/switch_007.ogg +0 -0
  137. package/public/res/audios/kenney/audios/tick_001.ogg +0 -0
  138. package/public/res/audios/kenney/audios/tick_002.ogg +0 -0
  139. package/public/res/audios/kenney/audios/tick_004.ogg +0 -0
  140. package/public/res/audios/kenney/audios/toggle_001.ogg +0 -0
  141. package/public/res/audios/kenney/audios/toggle_002.ogg +0 -0
  142. package/public/res/audios/kenney/audios/toggle_003.ogg +0 -0
  143. package/public/res/audios/kenney/audios/toggle_004.ogg +0 -0
  144. package/public/res/audios/start.mp3 +0 -0
  145. package/public/res/audios/toggle_002.mp3 +0 -0
  146. package/public/res/fonts/Accuratist.ttf +0 -0
  147. package/public/res/fonts/Closeness.ttf +0 -0
  148. package/public/res/fonts/WARGAMES.TTF +0 -0
  149. package/public/res/fonts/readme.txt +5 -0
  150. package/public/res/fonts/stormfaze.ttf +0 -0
  151. package/public/res/icons/512.png +0 -0
  152. package/public/res/icons/webgpu-horizontal.svg +45 -0
  153. package/public/res/meshes/blender/cube.blend +0 -0
  154. package/public/res/meshes/blender/cube.blend1 +0 -0
  155. package/public/res/meshes/blender/cube.mtl +12 -0
  156. package/public/res/meshes/blender/cube.obj +46 -0
  157. package/public/res/meshes/blender/cube.png +0 -0
  158. package/public/res/meshes/blender/cubeSmartUV.blend +0 -0
  159. package/public/res/meshes/blender/cubeSmartUV.mtl +12 -0
  160. package/public/res/meshes/blender/cubeSmartUV.obj +46 -0
  161. package/public/res/meshes/blender/lopta.mtl +10 -0
  162. package/public/res/meshes/blender/lopta.obj +3402 -0
  163. package/public/res/meshes/blender/piramyd.blend +0 -0
  164. package/public/res/meshes/blender/piramyd.blend1 +0 -0
  165. package/public/res/meshes/blender/piramyd.js +42 -0
  166. package/public/res/meshes/blender/piramyd.mtl +10 -0
  167. package/public/res/meshes/blender/piramyd.obj +18696 -0
  168. package/public/res/meshes/blender/piramyd1.js +42 -0
  169. package/public/res/meshes/blender/sphepe.blend +0 -0
  170. package/public/res/meshes/blender/sphepe.blend1 +0 -0
  171. package/public/res/meshes/blender/sphere.mtl +10 -0
  172. package/public/res/meshes/blender/sphere.obj +3402 -0
  173. package/public/res/meshes/blender/welcomeTextblend.blend +0 -0
  174. package/public/res/meshes/dragon/stanfordDragonData.js +5 -0
  175. package/public/res/meshes/jamb/bg.blend +0 -0
  176. package/public/res/meshes/jamb/bg.blend1 +0 -0
  177. package/public/res/meshes/jamb/bg.mtl +12 -0
  178. package/public/res/meshes/jamb/bg.obj +17 -0
  179. package/public/res/meshes/jamb/bg.png +0 -0
  180. package/public/res/meshes/jamb/dice-default.png +0 -0
  181. package/public/res/meshes/jamb/dice-mark.png +0 -0
  182. package/public/res/meshes/jamb/dice.mtl +12 -0
  183. package/public/res/meshes/jamb/dice.obj +40 -0
  184. package/public/res/meshes/jamb/dice.png +0 -0
  185. package/public/res/meshes/jamb/jamb-title.mtl +12 -0
  186. package/public/res/meshes/jamb/jamb-title.obj +26008 -0
  187. package/public/res/meshes/jamb/jamb.blend +0 -0
  188. package/public/res/meshes/jamb/jamb.blend1 +0 -0
  189. package/public/res/meshes/jamb/logo.png +0 -0
  190. package/public/res/meshes/jamb/nidzaDice.blend +0 -0
  191. package/public/res/meshes/jamb/nidzaDice.blend1 +0 -0
  192. package/public/res/meshes/jamb/pile.blend +0 -0
  193. package/public/res/meshes/jamb/simpleCube.blend +0 -0
  194. package/public/res/meshes/jamb/simpleCube.blend1 +0 -0
  195. package/public/res/meshes/jamb/sounds/roll1.wav +0 -0
  196. package/public/res/meshes/jamb/text.png +0 -0
  197. package/public/res/meshes/obj/armor.obj +319 -0
  198. package/public/res/meshes/obj/armor.png +0 -0
  199. package/public/res/meshes/objs-sequence/swat-walk-pistol_000001.mtl +22 -0
  200. package/public/res/meshes/objs-sequence/swat-walk-pistol_000001.obj +23264 -0
  201. package/public/res/meshes/objs-sequence/swat-walk-pistol_000002.mtl +22 -0
  202. package/public/res/meshes/objs-sequence/swat-walk-pistol_000002.obj +23261 -0
  203. package/public/res/meshes/objs-sequence/swat-walk-pistol_000003.mtl +22 -0
  204. package/public/res/meshes/objs-sequence/swat-walk-pistol_000003.obj +23264 -0
  205. package/public/res/meshes/objs-sequence/swat-walk-pistol_000004.mtl +22 -0
  206. package/public/res/meshes/objs-sequence/swat-walk-pistol_000004.obj +23261 -0
  207. package/public/res/meshes/objs-sequence/swat-walk-pistol_000005.mtl +22 -0
  208. package/public/res/meshes/objs-sequence/swat-walk-pistol_000005.obj +23261 -0
  209. package/public/res/meshes/objs-sequence/swat-walk-pistol_000006.mtl +22 -0
  210. package/public/res/meshes/objs-sequence/swat-walk-pistol_000006.obj +23261 -0
  211. package/public/res/meshes/objs-sequence/swat-walk-pistol_000007.mtl +22 -0
  212. package/public/res/meshes/objs-sequence/swat-walk-pistol_000007.obj +23264 -0
  213. package/public/res/meshes/objs-sequence/swat-walk-pistol_000008.mtl +22 -0
  214. package/public/res/meshes/objs-sequence/swat-walk-pistol_000008.obj +23263 -0
  215. package/public/res/meshes/objs-sequence/swat-walk-pistol_000009.mtl +22 -0
  216. package/public/res/meshes/objs-sequence/swat-walk-pistol_000009.obj +23264 -0
  217. package/public/res/meshes/objs-sequence/swat-walk-pistol_000010.mtl +22 -0
  218. package/public/res/meshes/objs-sequence/swat-walk-pistol_000010.obj +23260 -0
  219. package/public/res/meshes/objs-sequence/swat-walk-pistol_000011.mtl +22 -0
  220. package/public/res/meshes/objs-sequence/swat-walk-pistol_000011.obj +23262 -0
  221. package/public/res/meshes/objs-sequence/swat-walk-pistol_000012.mtl +22 -0
  222. package/public/res/meshes/objs-sequence/swat-walk-pistol_000012.obj +23262 -0
  223. package/public/res/meshes/objs-sequence/swat-walk-pistol_000013.mtl +22 -0
  224. package/public/res/meshes/objs-sequence/swat-walk-pistol_000013.obj +23263 -0
  225. package/public/res/meshes/objs-sequence/swat-walk-pistol_000014.mtl +22 -0
  226. package/public/res/meshes/objs-sequence/swat-walk-pistol_000014.obj +23262 -0
  227. package/public/res/meshes/objs-sequence/swat-walk-pistol_000015.mtl +22 -0
  228. package/public/res/meshes/objs-sequence/swat-walk-pistol_000015.obj +23263 -0
  229. package/public/res/meshes/objs-sequence/swat-walk-pistol_000016.mtl +22 -0
  230. package/public/res/meshes/objs-sequence/swat-walk-pistol_000016.obj +23264 -0
  231. package/public/res/meshes/objs-sequence/swat-walk-pistol_000017.mtl +22 -0
  232. package/public/res/meshes/objs-sequence/swat-walk-pistol_000017.obj +23263 -0
  233. package/public/res/meshes/objs-sequence/swat-walk-pistol_000018.mtl +22 -0
  234. package/public/res/meshes/objs-sequence/swat-walk-pistol_000018.obj +23261 -0
  235. package/public/res/meshes/objs-sequence/swat-walk-pistol_000019.mtl +22 -0
  236. package/public/res/meshes/objs-sequence/swat-walk-pistol_000019.obj +23263 -0
  237. package/public/res/meshes/objs-sequence/swat-walk-pistol_000020.mtl +22 -0
  238. package/public/res/meshes/objs-sequence/swat-walk-pistol_000020.obj +23261 -0
  239. package/public/res/meshes/shapes/star1.obj +60 -0
  240. package/public/res/multilang/en.json +39 -0
  241. package/public/res/multilang/sr.json +39 -0
  242. package/public/res/textures/default.png +0 -0
  243. package/public/res/textures/rust.jpg +0 -0
  244. package/public/res/textures/tex1.jpg +0 -0
  245. package/public/res/videos/readme.txt +2 -0
  246. package/public/res/videos/tunel.mp4 +0 -0
  247. package/public/test.html +636 -0
  248. package/public/three-test.js +165 -0
  249. package/public/worker.html +25 -0
  250. package/src/engine/ball.js +482 -0
  251. package/src/engine/cube.js +496 -0
  252. package/src/engine/engine.js +404 -0
  253. package/src/engine/final/adaptJSON1.js +53 -0
  254. package/src/engine/final/utils2.js +63 -0
  255. package/src/engine/lights.js +153 -0
  256. package/src/engine/loader-obj.js +473 -0
  257. package/src/engine/materials.js +295 -0
  258. package/src/engine/matrix-class.js +252 -0
  259. package/src/engine/mesh-obj.js +574 -0
  260. package/src/engine/raycast.js +218 -0
  261. package/src/engine/utils.js +881 -0
  262. package/src/libs/mat.js +0 -0
  263. package/src/multilang/lang.js +35 -0
  264. package/src/physics/matrix-ammo.js +363 -0
  265. package/src/shaders/fragment.video.wgsl.js +83 -0
  266. package/src/shaders/fragment.wgsl.js +75 -0
  267. package/src/shaders/shaders.js +51 -0
  268. package/src/shaders/standard-matrix-engine-shaders/standard-matrix-engine-fs.glsl +56 -0
  269. package/src/shaders/standard-matrix-engine-shaders/standard-matrix-engine-vs.glsl +75 -0
  270. package/src/shaders/vertex.wgsl.js +54 -0
  271. package/src/shaders/vertexShadow.wgsl.js +20 -0
  272. package/src/sounds/sounds.js +69 -0
  273. package/src/world.js +474 -0
@@ -0,0 +1,1341 @@
1
+ import {LOG_FUNNY, LOG_INFO, LOG_MATRIX, byId, mb, setupCanvasFilters, typeText} from "../../../src/engine/utils.js";
2
+ import {settingsBox, welcomeBoxHTML} from "./html-content.js";
3
+
4
+ export let dices = {
5
+ C: 0,
6
+ STATUS: 'FREE_TO_PLAY',
7
+ R: {},
8
+ SAVED_DICES: {},
9
+ pickDice: function(dice) {
10
+ if(Object.keys(this.SAVED_DICES).length >= 5) {
11
+ console.log("⚠️ You can only select up to 5 dice!");
12
+ return; // prevent adding more
13
+ }
14
+ this.SAVED_DICES[dice] = this.R[dice]
15
+ this.refreshSelectedBox()
16
+ },
17
+
18
+ setStartUpPosition: () => {
19
+ //
20
+ let currentIndex = 0;
21
+ for(var x = 1;x < 7;x++) {
22
+ app.matrixAmmo.getBodyByName(('CubePhysics' + x)).MEObject.position.setPosition(-5 + currentIndex * 5, 2, -15);
23
+ }
24
+ },
25
+
26
+ refreshSelectedBox: function(arg) {
27
+ let currentIndex = 0;
28
+ for(var key in this.SAVED_DICES) {
29
+ let B = app.matrixAmmo.getBodyByName(key);
30
+ this.deactivatePhysics(B);
31
+ const transform = new Ammo.btTransform();
32
+ transform.setIdentity();
33
+ transform.setOrigin(new Ammo.btVector3(0, 0, 0));
34
+ B.setWorldTransform(transform);
35
+ B.MEObject.position.setPosition(-5 + currentIndex, 5, -16);
36
+ currentIndex += 3;
37
+ }
38
+ },
39
+
40
+ deactivatePhysics: function(body) {
41
+ const CF_KINEMATIC_OBJECT = 2;
42
+ const DISABLE_DEACTIVATION = 4;
43
+ // 1. Remove from world
44
+ app.matrixAmmo.dynamicsWorld.removeRigidBody(body);
45
+ // 2. Set body to kinematic
46
+ const flags = body.getCollisionFlags();
47
+ body.setCollisionFlags(flags | CF_KINEMATIC_OBJECT);
48
+ body.setActivationState(DISABLE_DEACTIVATION); // no auto-wakeup
49
+ // 3. Clear motion
50
+ const zero = new Ammo.btVector3(0, 0, 0);
51
+ body.setLinearVelocity(zero);
52
+ body.setAngularVelocity(zero);
53
+ // 4. Reset transform to current position (optional — preserves pose)
54
+ const currentTransform = body.getWorldTransform();
55
+ body.setWorldTransform(currentTransform);
56
+ body.getMotionState().setWorldTransform(currentTransform);
57
+ // 5. Add back to physics world
58
+ app.matrixAmmo.dynamicsWorld.addRigidBody(body);
59
+ // 6. Mark it manually (logic flag)
60
+ body.isKinematic = true;
61
+ },
62
+
63
+ resetBodyAboveFloor: function(body, z = -14) {
64
+ const transform = new Ammo.btTransform();
65
+ transform.setIdentity();
66
+ transform.setOrigin(new Ammo.btVector3(-1 + Math.random(), 3, z));
67
+ body.setWorldTransform(transform);
68
+ body.getMotionState().setWorldTransform(transform);
69
+ },
70
+
71
+ activatePhysics: function(body) {
72
+ // 1. Make it dynamic again
73
+ body.setCollisionFlags(body.getCollisionFlags() & ~2); // remove kinematic
74
+ body.setActivationState(1); // ACTIVE_TAG
75
+ body.isKinematic = false;
76
+
77
+ // 2. Reset position ABOVE the floor — force it out of collision
78
+ // const newY = 3 + Math.random(); // ensure it’s above the floor
79
+ const transform = new Ammo.btTransform();
80
+ transform.setIdentity();
81
+ const newX = (Math.random() - 0.5) * 4; // spread from -2 to +2 on X
82
+ const newY = 3; // fixed height above floor
83
+ transform.setOrigin(new Ammo.btVector3(newX, newY, 0));
84
+ body.setWorldTransform(transform);
85
+
86
+ // 3. Clear velocities
87
+ body.setLinearVelocity(new Ammo.btVector3(0, 0, 0));
88
+ body.setAngularVelocity(new Ammo.btVector3(0, 0, 0));
89
+
90
+ // 4. Enable CCD (to prevent tunneling)
91
+ const size = 1; // cube side length
92
+ body.setCcdMotionThreshold(1e-7);
93
+ body.setCcdSweptSphereRadius(size * 0.5);
94
+
95
+ // Re-add to world if needed
96
+ // Optionally: remove and re-add if not responding
97
+ app.matrixAmmo.dynamicsWorld.removeRigidBody(body);
98
+ app.matrixAmmo.dynamicsWorld.addRigidBody(body);
99
+
100
+ // 5. Reactivate it
101
+ body.activate(true);
102
+
103
+ this.resetBodyAboveFloor(body);
104
+ },
105
+
106
+ activateAllDicesPhysics: function() {
107
+ this.getAllDices()
108
+ // .filter((item) => {
109
+ // let test = app.matrixAmmo.getBodyByName(item.name)?.isKinematicObject();
110
+ // if(test === true) {
111
+ // return true;
112
+ // } else {
113
+ // return false;
114
+ // }
115
+ // })
116
+ .forEach((dice) => {
117
+ const body = app.matrixAmmo.getBodyByName(dice.name);
118
+ if(body) {
119
+ this.activatePhysics(body); // <--- FIX: pass the physics body, not the dice object
120
+ }
121
+ });
122
+ },
123
+
124
+ getAllDices: function() {
125
+ return app.mainRenderBundle.filter(item => item.name.indexOf("CubePhysics") !== -1);
126
+ },
127
+
128
+ getDiceByName: function(name) {
129
+ return app.mainRenderBundle.find(item => item.name === name);
130
+ },
131
+
132
+ checkAll: function() {
133
+ this.C++;
134
+
135
+ let activeRollingCount = 0;
136
+ let allReady = true;
137
+
138
+ for(let i = 1;i <= 6;i++) {
139
+ const key = "CubePhysics" + i;
140
+ if(key in this.SAVED_DICES) continue; // skip saved ones
141
+ activeRollingCount++; // count how many are still active
142
+ if(typeof this.R[key] === 'undefined') {
143
+ allReady = false;
144
+ break;
145
+ }
146
+ }
147
+ // Dynamic threshold: min wait time based on rolling dice
148
+ const minWait = Math.max(200, activeRollingCount * 200); // e.g. 1 die => 200, 5 dice => 1000, 6 dice => 1200
149
+ if(allReady && this.C > minWait) {
150
+ dispatchEvent(new CustomEvent('all-done', {detail: {}}));
151
+ this.C = 0;
152
+ }
153
+ },
154
+
155
+ validatePass: function() {
156
+ if(Object.keys(this.SAVED_DICES).length !== 5) {
157
+ console.log('%cBLOCK', LOG_FUNNY)
158
+ mb.error(`Must select (minimum) 5 dices before add results...`);
159
+ return false;
160
+ }
161
+ if(dices.STATUS != "FINISHED") {
162
+ console.log('%cBLOCK', LOG_FUNNY)
163
+ mb.error(`STATUS IS ${dices.STATUS}, please wait for results...`);
164
+ app.matrixSounds.play('block')
165
+ return false;
166
+ } else {
167
+ return true;
168
+ }
169
+ }
170
+ };
171
+
172
+ export let myDom = {
173
+
174
+ state: {
175
+ rowDown: []
176
+ },
177
+
178
+ memoNumberRow: [],
179
+
180
+ hideSettings: function() {
181
+ byId('blocker').style.display = 'none';
182
+ byId('messageBox').style.display = 'none';
183
+ },
184
+
185
+ createMenu: function() {
186
+
187
+ var root = document.createElement('div')
188
+ root.id = 'hud';
189
+ root.style.position = 'absolute';
190
+ root.style.right = '10%';
191
+ root.style.top = '10%';
192
+
193
+ var help = document.createElement('div')
194
+ help.id = 'HELP';
195
+ help.classList.add('btn')
196
+ help.innerHTML = `<span data-label="help"></span>`;
197
+ help.addEventListener('click', () => {
198
+ if(byId('helpBox').style.display != 'none') {
199
+ byId('helpBox').style.display = 'none';
200
+ } else {
201
+ byId('helpBox').style.display = 'block';
202
+ }
203
+ });
204
+
205
+ var table = document.createElement('div')
206
+ table.id = 'showHideTableDOM';
207
+ table.classList.add('btn')
208
+ table.innerHTML = `<span data-label="table"></span>`;
209
+ table.addEventListener('click', () => {
210
+ this.showHideJambTable()
211
+ });
212
+
213
+ var settings = document.createElement('div')
214
+ settings.id = 'settings';
215
+ settings.classList.add('btn')
216
+ settings.innerHTML = `<span data-label="settings"></span>`;
217
+ settings.addEventListener('click', () => {
218
+ if(document.getElementById('messageBox').getAttribute('data-loaded') != null) {
219
+ byId('blocker').style.display = 'flex';
220
+ byId('messageBox').style.display = 'unset';
221
+ return;
222
+ }
223
+ byId('messageBox').innerHTML = settingsBox;
224
+ byId('blocker').style.display = 'flex';
225
+ byId('messageBox').style.display = 'unset';
226
+ dispatchEvent(new CustomEvent('updateLang', {}))
227
+
228
+ byId('settingsAudios').click()
229
+ byId('settingsAudios').addEventListener('change', (e) => {
230
+ if(e.target.checked == true) {
231
+ app.matrixSounds.unmuteAll();
232
+ } else {
233
+ app.matrixSounds.muteAll();
234
+ }
235
+ });
236
+ setupCanvasFilters();
237
+ byId('messageBox').setAttribute('data-loaded', 'loaded');
238
+ document.getElementById('physicsSpeed').value = app.matrixAmmo.speedUpSimulation;
239
+ byId("physicsSpeed").addEventListener("change", (e) => {
240
+ app.matrixAmmo.speedUpSimulation = parseInt(e.target.value);
241
+ });
242
+
243
+ })
244
+
245
+ // test help
246
+ var helpBox = document.createElement('div')
247
+ helpBox.id = 'helpBox';
248
+ helpBox.style.position = 'absolute';
249
+ helpBox.style.right = '20%';
250
+ helpBox.style.zIndex = '2';
251
+ helpBox.style.top = '15%';
252
+ helpBox.style.width = '60%';
253
+ helpBox.style.height = '50%';
254
+ helpBox.style.fontSize = '100%';
255
+ helpBox.classList.add('btn');
256
+ helpBox.addEventListener('click', () => {
257
+ byId('helpBox').style.display = 'none';
258
+ });
259
+ document.body.appendChild(helpBox)
260
+ console.log('what is dom, ', byId('helpBox'))
261
+ typeText('helpBox', app.label.get.about, 10);
262
+ //
263
+ var roll = document.createElement('div')
264
+ roll.id = 'hud-roll';
265
+ roll.classList.add('btn');
266
+ roll.innerHTML = `<span data-label="roll"></span>`;
267
+ roll.addEventListener('click', () => {
268
+ app.ROLL()
269
+ })
270
+
271
+ var separator = document.createElement('div')
272
+ separator.innerHTML = `✨maximumroulette.com✨`;
273
+
274
+ root.append(settings)
275
+ root.append(table);
276
+ root.append(help)
277
+ root.append(separator)
278
+ root.append(roll)
279
+
280
+ document.body.appendChild(root)
281
+
282
+ // global access
283
+ // app.label.update()
284
+ dispatchEvent(new CustomEvent('updateLang', {}))
285
+ },
286
+
287
+ createBlocker: function() {
288
+ var root = document.createElement('div')
289
+ root.id = 'blocker';
290
+
291
+ var messageBox = document.createElement('div')
292
+ messageBox.id = 'messageBox';
293
+
294
+ // console.log('TEST', app.label.get)
295
+ messageBox.innerHTML = welcomeBoxHTML;
296
+
297
+
298
+ let initialMsgBoxEvent = function() {
299
+ console.log('click on msgbox')
300
+ byId('messageBox').innerHTML = ``;
301
+ byId('blocker').style.display = 'none';
302
+ myDom.createMenu();
303
+ messageBox.removeEventListener('click', initialMsgBoxEvent)
304
+
305
+ document.querySelectorAll('.btn, .fancy-label, .fancy-title').forEach(el => {
306
+ el.addEventListener('mouseenter', () => {
307
+ app.matrixSounds.play('hover');
308
+ });
309
+ });
310
+ };
311
+ root.append(messageBox)
312
+ document.body.appendChild(root);
313
+ app.label.update();
314
+ document.querySelectorAll('.btn, .fancy-label, .fancy-title').forEach(el => {
315
+ el.addEventListener('mouseenter', () => {
316
+ app.matrixSounds.play('hover');
317
+ });
318
+ });
319
+
320
+ setTimeout(() => {
321
+ byId('startFromWelcome').addEventListener('click', initialMsgBoxEvent)
322
+ }, 200);
323
+ },
324
+
325
+ createJamb: function() {
326
+ var root = document.createElement('div')
327
+ root.id = 'jambTable';
328
+ root.style.position = 'absolute';
329
+
330
+ var dragHandler = document.createElement('div')
331
+ dragHandler.id = 'dragHandler';
332
+ dragHandler.classList.add('dragHandler')
333
+ dragHandler.innerHTML = "⇅ Drag";
334
+ root.append(dragHandler)
335
+
336
+ var rowHeader = document.createElement('div')
337
+ rowHeader.id = 'rowHeader';
338
+ rowHeader.style.top = '10px';
339
+ rowHeader.style.left = '10px';
340
+ rowHeader.style.width = '200px';
341
+ rowHeader.innerHTML = '<span data-label="cornerText"></span><span id="user-points">0</span>';
342
+ root.appendChild(rowHeader);
343
+ rowHeader.classList.add('fancy-label')
344
+
345
+ var rowDown = document.createElement('div')
346
+ rowDown.id = 'rowDown';
347
+ rowDown.style.top = '10px';
348
+ rowDown.style.left = '10px';
349
+ rowDown.style.width = '200px';
350
+ rowDown.innerHTML = '↓<span data-label="down"></span>';
351
+ rowDown.classList.add('fancy-label')
352
+ rowDown.classList.add('btn')
353
+ root.appendChild(rowDown);
354
+
355
+ var rowFree = document.createElement('div')
356
+ rowFree.id = 'rowFree';
357
+ rowFree.style.top = '10px';
358
+ rowFree.style.left = '10px';
359
+ rowFree.style.width = '200px';
360
+ rowFree.innerHTML = '↕<span data-label="free"></span>';
361
+ rowFree.classList.add('fancy-label')
362
+ rowFree.classList.add('btn')
363
+ root.appendChild(rowFree);
364
+
365
+ var rowUp = document.createElement('div')
366
+ rowUp.id = 'rowUp';
367
+ rowUp.style.top = '10px';
368
+ rowUp.style.left = '10px';
369
+ rowUp.style.width = '200px';
370
+ rowUp.innerHTML = '↑<span data-label="up"></span>';
371
+ rowUp.classList.add('fancy-label')
372
+ rowUp.classList.add('btn')
373
+ root.appendChild(rowUp);
374
+
375
+ var rowHand = document.createElement('div')
376
+ rowHand.id = 'rowHand';
377
+ rowHand.style.top = '10px';
378
+ rowHand.style.left = '10px';
379
+ rowHand.style.width = '200px';
380
+ rowHand.innerHTML = '<span data-label="hand"></span>';
381
+ rowHand.classList.add('fancy-label')
382
+ rowHand.classList.add('btn')
383
+ root.appendChild(rowHand);
384
+
385
+ // INJECT TABLE HEADER ROW
386
+ this.createLeftHeaderRow(rowHeader);
387
+ this.createRowDown(rowDown);
388
+ this.createRowFree(rowFree);
389
+ this.createRow(rowUp);
390
+ this.createRow(rowHand);
391
+
392
+ this.createSelectedBox();
393
+
394
+ document.body.appendChild(root);
395
+ // console.log('JambTable added.')
396
+ },
397
+
398
+ showHideJambTable: () => {
399
+ const panel = document.getElementById('jambTable');
400
+ if(panel.classList.contains('show')) {
401
+ panel.classList.remove('show');
402
+ panel.classList.add('hide');
403
+ // Delay actual hiding from layout to finish animation
404
+ setTimeout(() => {
405
+ panel.style.display = 'none';
406
+ }, 300);
407
+ } else {
408
+ panel.style.display = 'flex';
409
+ setTimeout(() => {
410
+ panel.classList.remove('hide');
411
+ panel.classList.add('show');
412
+ }, 10); // allow repaint
413
+ }
414
+ },
415
+ createSelectedBox: function() {
416
+ var topTitleDOM = document.createElement('div')
417
+ topTitleDOM.id = 'topTitleDOM';
418
+ topTitleDOM.style.width = 'auto';
419
+ topTitleDOM.style.position = 'absolute';
420
+ topTitleDOM.style.left = '35%';
421
+ topTitleDOM.style.fontSize = '175%';
422
+ topTitleDOM.style.top = '4%';
423
+ topTitleDOM.style.background = '#7d7d7d8c';
424
+ topTitleDOM.innerHTML = app.label.get.ready + ", " + app.userState.name + '.';
425
+ topTitleDOM.setAttribute('data-gamestatus', 'FREE');
426
+ document.body.appendChild(topTitleDOM);
427
+ addEventListener('updateTitle', (e) => {
428
+ typeText('topTitleDOM', e.detail.text);
429
+ topTitleDOM.setAttribute('data-gamestatus', e.detail.status);
430
+ })
431
+ },
432
+
433
+ createLeftHeaderRow: function(myRoot) {
434
+ for(var x = 1;x < 7;x++) {
435
+ var rowNumber = document.createElement('div')
436
+ rowNumber.id = 'rowNumber' + x;
437
+ rowNumber.style.top = '10px';
438
+ rowNumber.style.left = '10px';
439
+ rowNumber.style.width = 'auto';
440
+ rowNumber.style.background = '#7d7d7d8c';
441
+ rowNumber.innerHTML = `<span>${x}</span>`;
442
+ myRoot.appendChild(rowNumber);
443
+ }
444
+
445
+ var rowNumberSum = document.createElement('div')
446
+ rowNumberSum.id = 'H_rowNumberSum';
447
+
448
+ rowNumberSum.style.width = 'auto';
449
+ rowNumberSum.style.background = '#7d7d7d8c';
450
+ rowNumberSum.innerHTML = `Σ`;
451
+ myRoot.appendChild(rowNumberSum);
452
+
453
+ var rowMax = document.createElement('div')
454
+ rowMax.id = 'H_rowMax';
455
+ rowMax.style.width = 'auto';
456
+ rowMax.style.background = '#7d7d7d8c';
457
+ rowMax.innerHTML = `<span data-label="MAX"></span>`;
458
+ myRoot.appendChild(rowMax);
459
+
460
+ var rowMin = document.createElement('div')
461
+ rowMin.id = 'H_rowMax';
462
+ rowMin.style.width = 'auto';
463
+ rowMin.style.background = '#7d7d7d8c';
464
+ rowMin.innerHTML = `<span data-label="MIN"></span>`;
465
+ myRoot.appendChild(rowMin);
466
+
467
+ var rowMaxMinSum = document.createElement('div')
468
+ rowMaxMinSum.id = 'H_rowMaxMinSum';
469
+ rowMaxMinSum.style.width = 'auto';
470
+ rowMaxMinSum.style.background = '#7d7d7d8c';
471
+ rowMaxMinSum.innerHTML = `Σ`;
472
+ myRoot.appendChild(rowMaxMinSum);
473
+
474
+ var largeStraight = document.createElement('div')
475
+ largeStraight.id = 'H_largeStraight';
476
+ largeStraight.style.width = 'auto';
477
+ largeStraight.style.background = '#7d7d7d8c';
478
+ largeStraight.innerHTML = `<span data-label="straight"></span>`;
479
+ myRoot.appendChild(largeStraight);
480
+
481
+ var threeOfAKind = document.createElement('div')
482
+ threeOfAKind.id = 'H_threeOfAKind';
483
+ threeOfAKind.style.width = 'auto';
484
+ threeOfAKind.style.background = '#7d7d7d8c';
485
+ threeOfAKind.innerHTML = `<span data-label="threeOf"></span>`;
486
+ myRoot.appendChild(threeOfAKind);
487
+
488
+ var fullHouse = document.createElement('div')
489
+ fullHouse.id = 'H_fullHouse';
490
+ fullHouse.style.width = 'auto';
491
+ fullHouse.style.background = '#7d7d7d8c';
492
+ fullHouse.innerHTML = `<span data-label="fullhouse"></span>`;
493
+ myRoot.appendChild(fullHouse);
494
+
495
+ var poker = document.createElement('div')
496
+ poker.id = 'H_poker';
497
+ poker.style.width = 'auto';
498
+ poker.style.background = '#7d7d7d8c';
499
+ poker.innerHTML = `<span data-label="poker"></span>`;
500
+ myRoot.appendChild(poker);
501
+
502
+ var jamb = document.createElement('div')
503
+ jamb.id = 'H_jamb';
504
+ jamb.style.width = 'auto';
505
+ jamb.style.background = '#7d7d7d8c';
506
+ jamb.innerHTML = `<span data-label="jamb"></span>`;
507
+ myRoot.appendChild(jamb);
508
+
509
+ var rowSum = document.createElement('div')
510
+ rowSum.id = 'H_rowSum';
511
+ rowSum.style.width = 'auto';
512
+ rowSum.style.background = '#7d7d7d8c';
513
+ rowSum.innerHTML = `Σ`;
514
+ myRoot.appendChild(rowSum);
515
+
516
+ var rowSumFINAL = document.createElement('div')
517
+ rowSumFINAL.id = 'H_rowSumFINAL';
518
+ rowSumFINAL.style.width = 'auto';
519
+ rowSumFINAL.style.background = '#7d7d7d8c';
520
+ rowSumFINAL.innerHTML = `<spam data-label="final"></span>`;
521
+ myRoot.appendChild(rowSumFINAL);
522
+ },
523
+
524
+ createRow: function(myRoot) {
525
+ for(var x = 1;x < 7;x++) {
526
+ var rowNumber = document.createElement('div')
527
+ rowNumber.id = 'rowNumber' + x;
528
+ rowNumber.style.top = '10px';
529
+ rowNumber.style.left = '10px';
530
+ rowNumber.style.width = 'auto';
531
+ rowNumber.style.background = '#7d7d7d8c';
532
+ rowNumber.innerHTML = `-`;
533
+ rowNumber.addEventListener('click', () => {
534
+ console.log('LOG THIS ', this)
535
+ // works
536
+ // rowDown
537
+ if(this.state.rowDown.length == 0) {
538
+ console.log('it is no play yet in this row ', this)
539
+
540
+ }
541
+ })
542
+ myRoot.appendChild(rowNumber);
543
+ }
544
+
545
+ var rowNumberSum = document.createElement('div')
546
+ rowNumberSum.id = 'rowNumberSum';
547
+
548
+ rowNumberSum.style.width = 'auto';
549
+ rowNumberSum.style.background = '#7d7d7d8c';
550
+ rowNumberSum.innerHTML = `-`;
551
+ myRoot.appendChild(rowNumberSum);
552
+
553
+ var rowMax = document.createElement('div')
554
+ rowMax.id = 'rowMax';
555
+ rowMax.style.width = 'auto';
556
+ rowMax.style.background = '#7d7d7d8c';
557
+ rowMax.innerHTML = `-`;
558
+ myRoot.appendChild(rowMax);
559
+
560
+ var rowMin = document.createElement('div')
561
+ rowMin.id = 'rowMax';
562
+ rowMin.style.width = 'auto';
563
+ rowMin.style.background = '#7d7d7d8c';
564
+ rowMin.innerHTML = `-`;
565
+ myRoot.appendChild(rowMin);
566
+
567
+ var rowMaxMinSum = document.createElement('div')
568
+ rowMaxMinSum.id = 'rowMaxMinSum';
569
+ rowMaxMinSum.style.width = 'auto';
570
+ rowMaxMinSum.style.background = '#7d7d7d8c';
571
+ rowMaxMinSum.innerHTML = `-`;
572
+ myRoot.appendChild(rowMaxMinSum);
573
+
574
+ var largeStraight = document.createElement('div')
575
+ largeStraight.id = 'largeStraight';
576
+ largeStraight.style.width = 'auto';
577
+ largeStraight.style.background = '#7d7d7d8c';
578
+ largeStraight.innerHTML = `-`;
579
+ myRoot.appendChild(largeStraight);
580
+
581
+ var threeOfAKind = document.createElement('div')
582
+ threeOfAKind.id = 'down_threeOfAKind';
583
+ threeOfAKind.style.width = 'auto';
584
+ threeOfAKind.style.background = '#7d7d7d8c';
585
+ threeOfAKind.innerHTML = `-`;
586
+ myRoot.appendChild(threeOfAKind);
587
+
588
+ var fullHouse = document.createElement('div')
589
+ fullHouse.id = 'fullHouse';
590
+ fullHouse.style.width = 'auto';
591
+ fullHouse.style.background = '#7d7d7d8c';
592
+ fullHouse.innerHTML = `-`;
593
+ myRoot.appendChild(fullHouse);
594
+
595
+ var poker = document.createElement('div')
596
+ poker.id = 'poker';
597
+ poker.style.width = 'auto';
598
+ poker.style.background = '#7d7d7d8c';
599
+ poker.innerHTML = `-`;
600
+ myRoot.appendChild(poker);
601
+
602
+ var jamb = document.createElement('div')
603
+ jamb.id = 'jamb';
604
+ jamb.style.width = 'auto';
605
+ jamb.style.background = '#7d7d7d8c';
606
+ jamb.innerHTML = `-`;
607
+ myRoot.appendChild(jamb);
608
+
609
+ var rowSum = document.createElement('div')
610
+ rowSum.id = 'rowSum';
611
+ rowSum.style.width = 'auto';
612
+ rowSum.style.background = '#7d7d7d8c';
613
+ rowSum.innerHTML = `-`;
614
+ myRoot.appendChild(rowSum);
615
+
616
+
617
+ },
618
+
619
+ createRowFree: function(myRoot) {
620
+ for(var x = 1;x < 7;x++) {
621
+ var rowNumber = document.createElement('div')
622
+ rowNumber.id = 'free-rowNumber' + x;
623
+ rowNumber.style.top = '10px';
624
+ rowNumber.style.left = '10px';
625
+ rowNumber.style.width = 'auto';
626
+ rowNumber.style.background = '#7d7d7d8c';
627
+ rowNumber.innerHTML = `-`;
628
+ rowNumber.addEventListener('click', (e) => {
629
+ if(dices.validatePass() == false) return;
630
+ var getName = e.target.id;
631
+ getName = getName.replace('free-rowNumber', '')
632
+ var count23456 = 0;
633
+ for(let key in dices.SAVED_DICES) {
634
+ if(parseInt(dices.R[key]) == parseInt(getName)) {
635
+ count23456++;
636
+ }
637
+ }
638
+ this.state.rowDown.push((count23456 * parseInt(getName)))
639
+ e.target.innerHTML = (count23456 * parseInt(getName));
640
+ if(parseInt(getName) == 6) {
641
+ myDom.calcFreeNumbers()
642
+ }
643
+ dices.STATUS = "FREE_TO_PLAY";
644
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
645
+ })
646
+ myRoot.appendChild(rowNumber);
647
+ }
648
+
649
+ var rowNumberSum = document.createElement('div')
650
+ rowNumberSum.id = 'free-rowNumberSum';
651
+ rowNumberSum.style.width = 'auto';
652
+ rowNumberSum.style.background = '#7d7d7d8c';
653
+ rowNumberSum.innerHTML = `-`;
654
+ myRoot.appendChild(rowNumberSum);
655
+
656
+ var rowMax = document.createElement('div')
657
+ rowMax.id = 'free-rowMax';
658
+ rowMax.style.width = 'auto';
659
+ rowMax.style.background = '#7d7d7d8c';
660
+ rowMax.innerHTML = `-`;
661
+ rowMax.addEventListener("click", this.calcFreeRowMax);
662
+ myRoot.appendChild(rowMax);
663
+
664
+ var rowMin = document.createElement('div')
665
+ rowMin.id = 'free-rowMin';
666
+ rowMin.style.width = 'auto';
667
+ rowMin.style.background = '#7d7d7d8c';
668
+ rowMin.innerHTML = `-`;
669
+ rowMin.addEventListener('click', this.calcFreeRowMin);
670
+ myRoot.appendChild(rowMin);
671
+
672
+ var rowMaxMinSum = document.createElement('div')
673
+ rowMaxMinSum.id = 'free-rowMaxMinSum';
674
+ rowMaxMinSum.style.width = 'auto';
675
+ rowMaxMinSum.style.background = '#7d7d7d8c';
676
+ rowMaxMinSum.innerHTML = `-`;
677
+ myRoot.appendChild(rowMaxMinSum);
678
+
679
+ var largeStraight = document.createElement('div')
680
+ largeStraight.id = 'free-largeStraight';
681
+ largeStraight.style.width = 'auto';
682
+ largeStraight.style.background = '#7d7d7d8c';
683
+ largeStraight.innerHTML = `-`;
684
+ largeStraight.addEventListener('click', this.attachFreeKenta);
685
+ myRoot.appendChild(largeStraight);
686
+
687
+ var threeOfAKind = document.createElement('div')
688
+ threeOfAKind.id = 'free-threeOfAKind';
689
+ threeOfAKind.style.width = 'auto';
690
+ threeOfAKind.style.background = '#7d7d7d8c';
691
+ threeOfAKind.innerHTML = `-`;
692
+ threeOfAKind.addEventListener('click', this.attachFreeTrilling)
693
+ myRoot.appendChild(threeOfAKind);
694
+
695
+ var fullHouse = document.createElement('div')
696
+ fullHouse.id = 'free-fullHouse';
697
+ fullHouse.style.width = 'auto';
698
+ fullHouse.style.background = '#7d7d7d8c';
699
+ fullHouse.innerHTML = `-`;
700
+ fullHouse.addEventListener('click', this.attachFreeFullHouse)
701
+ myRoot.appendChild(fullHouse);
702
+
703
+ var poker = document.createElement('div')
704
+ poker.id = 'free-poker';
705
+ poker.style.width = 'auto';
706
+ poker.style.background = '#7d7d7d8c';
707
+ poker.innerHTML = `-`;
708
+ poker.addEventListener('click', this.attachFreePoker)
709
+ myRoot.appendChild(poker);
710
+
711
+ var jamb = document.createElement('div')
712
+ jamb.id = 'free-jamb';
713
+ jamb.style.width = 'auto';
714
+ jamb.style.background = '#7d7d7d8c';
715
+ jamb.innerHTML = `-`;
716
+ jamb.addEventListener('click', this.attachFreeJamb)
717
+ myRoot.appendChild(jamb);
718
+
719
+ var rowSum = document.createElement('div')
720
+ rowSum.id = 'free-rowSum';
721
+ rowSum.style.width = 'auto';
722
+ rowSum.style.background = '#7d7d7d8c';
723
+ rowSum.innerHTML = `-`;
724
+ myRoot.appendChild(rowSum);
725
+ },
726
+
727
+ createRowDown: function(myRoot) {
728
+ for(var x = 1;x < 7;x++) {
729
+ var rowNumber = document.createElement('div')
730
+ rowNumber.id = 'down-rowNumber' + x;
731
+ rowNumber.style.top = '10px';
732
+ rowNumber.style.left = '10px';
733
+ rowNumber.style.width = 'auto';
734
+ rowNumber.style.background = '#7d7d7d8c';
735
+ rowNumber.style.cursor = 'pointer';
736
+ rowNumber.innerHTML = `-`;
737
+
738
+ this.memoNumberRow.push(rowNumber)
739
+ // initial
740
+ if(x == 1) {
741
+ rowNumber.classList.add('canPlay')
742
+ }
743
+
744
+ rowNumber.addEventListener('click', (e) => {
745
+
746
+ if(dices.validatePass() == false) return;
747
+
748
+ var getName = e.target.id;
749
+ getName = getName.replace('down-rowNumber', '')
750
+ if(this.state.rowDown.length == 0) {
751
+ console.log('LOG ', getName)
752
+ if(parseInt(getName) == 1) {
753
+ var count1 = 0;
754
+ for(let key in dices.SAVED_DICES) {
755
+ if(parseInt(dices.R[key]) == 1) {
756
+ console.log('yeap', dices.R)
757
+ count1++;
758
+ }
759
+ }
760
+ this.state.rowDown.push(count1)
761
+ e.target.innerHTML = count1;
762
+ e.target.classList.remove('canPlay')
763
+ this.memoNumberRow[1].classList.add('canPlay')
764
+ dices.STATUS = "FREE_TO_PLAY";
765
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
766
+ } else {
767
+ console.log('BLOCK')
768
+
769
+ }
770
+ } else {
771
+ if(this.state.rowDown.length > 0) {
772
+ if(parseInt(getName) == this.state.rowDown.length + 1) {
773
+ console.log('moze za ', parseInt(getName))
774
+ var count23456 = 0;
775
+ for(let key in dices.SAVED_DICES) {
776
+ if(parseInt(dices.R[key]) == parseInt(getName)) {
777
+ console.log('yeap', dices.R)
778
+ count23456++;
779
+ }
780
+ }
781
+ this.state.rowDown.push((count23456 * parseInt(getName)))
782
+ //
783
+ e.target.innerHTML = (count23456 * parseInt(getName));
784
+ if(parseInt(getName) == 6) {
785
+ // calc sum
786
+ console.log('calc sum for numb ~ ')
787
+ // this.state.rowDown.length + 1
788
+ myDom.calcDownNumbers()
789
+ e.target.classList.remove('canPlay')
790
+ this.rowMax.classList.add('canPlay')
791
+ } else {
792
+ e.target.classList.remove('canPlay')
793
+ this.memoNumberRow[parseInt(getName)].classList.add('canPlay')
794
+ }
795
+ dices.STATUS = "FREE_TO_PLAY";
796
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
797
+ } else {
798
+ console.log('BLOCK')
799
+ }
800
+ }
801
+ }
802
+ })
803
+ myRoot.appendChild(rowNumber);
804
+ }
805
+
806
+ var rowNumberSum = document.createElement('div')
807
+ rowNumberSum.id = 'down-rowNumberSum';
808
+
809
+ rowNumberSum.style.width = 'auto';
810
+ rowNumberSum.style.background = '#7d7d7d8c';
811
+ rowNumberSum.innerHTML = `-`;
812
+ myRoot.appendChild(rowNumberSum);
813
+
814
+ var rowMax = document.createElement('div')
815
+ rowMax.id = 'down-rowMax';
816
+ rowMax.style.width = 'auto';
817
+ rowMax.style.background = '#7d7d7d8c';
818
+ rowMax.innerHTML = `-`;
819
+ myRoot.appendChild(rowMax);
820
+ this.rowMax = rowMax;
821
+ // this.rowMax.addEventListener("click", (e) => {
822
+ // e.target.classList.remove('canPlay')
823
+ // this.rowMin.classList.add('canPlay')
824
+ // })
825
+
826
+ var rowMin = document.createElement('div')
827
+ rowMin.id = 'down-rowMin';
828
+ rowMin.style.width = 'auto';
829
+ rowMin.style.background = '#7d7d7d8c';
830
+ rowMin.innerHTML = `-`;
831
+ // this.rowMin = rowMin;
832
+ myRoot.appendChild(rowMin);
833
+ var rowMaxMinSum = document.createElement('div')
834
+ rowMaxMinSum.id = 'down-rowMaxMinSum';
835
+ rowMaxMinSum.style.width = 'auto';
836
+ rowMaxMinSum.style.background = '#7d7d7d8c';
837
+ rowMaxMinSum.innerHTML = `-`;
838
+ myRoot.appendChild(rowMaxMinSum);
839
+
840
+ var largeStraight = document.createElement('div')
841
+ largeStraight.id = 'down-largeStraight';
842
+ largeStraight.style.width = 'auto';
843
+ largeStraight.style.background = '#7d7d7d8c';
844
+ largeStraight.innerHTML = `-`;
845
+ myRoot.appendChild(largeStraight);
846
+
847
+ var threeOfAKind = document.createElement('div')
848
+ threeOfAKind.id = 'down-threeOfAKind';
849
+ threeOfAKind.style.width = 'auto';
850
+ threeOfAKind.style.background = '#7d7d7d8c';
851
+ threeOfAKind.innerHTML = `-`;
852
+ myRoot.appendChild(threeOfAKind);
853
+
854
+ var fullHouse = document.createElement('div')
855
+ fullHouse.id = 'down-fullHouse';
856
+ fullHouse.style.width = 'auto';
857
+ fullHouse.style.background = '#7d7d7d8c';
858
+ fullHouse.innerHTML = `-`;
859
+ myRoot.appendChild(fullHouse);
860
+
861
+ var poker = document.createElement('div')
862
+ poker.id = 'down-poker';
863
+ poker.style.width = 'auto';
864
+ poker.style.background = '#7d7d7d8c';
865
+ poker.innerHTML = `-`;
866
+ myRoot.appendChild(poker);
867
+
868
+ var jamb = document.createElement('div')
869
+ jamb.id = 'down-jamb';
870
+ jamb.style.width = 'auto';
871
+ jamb.style.background = '#7d7d7d8c';
872
+ jamb.innerHTML = `-`;
873
+ myRoot.appendChild(jamb);
874
+
875
+ var rowSum = document.createElement('div')
876
+ rowSum.id = 'down-rowSum';
877
+ rowSum.style.width = 'auto';
878
+ rowSum.style.background = '#7d7d7d8c';
879
+ rowSum.innerHTML = `-`;
880
+ myRoot.appendChild(rowSum);
881
+ },
882
+
883
+ calcDownNumbers: function() {
884
+ var s = 0;
885
+ this.state.rowDown.forEach((i) => {
886
+ console.log(parseFloat(i))
887
+ s += parseFloat(i)
888
+ })
889
+ byId('down-rowNumberSum').style.background = 'rgb(113 0 0 / 55%)';
890
+ byId('down-rowNumberSum').innerHTML = s;
891
+ // console.log('this.rowMax also set free to plat status', this.rowMax)
892
+ dices.STATUS = "FREE_TO_PLAY";
893
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
894
+ this.rowMax.addEventListener("click", this.calcDownRowMax)
895
+ },
896
+
897
+ // free row start
898
+
899
+ calcFreeNumbers: function() {
900
+ var s = 0;
901
+ this.state.rowDown.forEach((i) => {
902
+ console.log(parseFloat(i))
903
+ s += parseFloat(i)
904
+ })
905
+ byId('free-rowNumberSum').style.background = 'rgb(113 0 0 / 55%)';
906
+ byId('free-rowNumberSum').innerHTML = s;
907
+ // console.log('this.rowMax also set free to plat status', this.rowMax)
908
+ dices.STATUS = "FREE_TO_PLAY";
909
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
910
+ byId('free-rowMax').addEventListener("click", this.calc)
911
+ },
912
+
913
+ calcFreeRowMax: (e) => {
914
+ if(dices.validatePass() == false) return;
915
+ var test = 0;
916
+ let keyLessNum = Object.keys(dices.R).reduce((key, v) => dices.R[v] < dices.R[key] ? v : key);
917
+ for(var key in dices.R) {
918
+ if(key != keyLessNum) {
919
+ test += parseFloat(dices.R[key]);
920
+ }
921
+ }
922
+ e.target.innerHTML = test;
923
+ // now attach next event.
924
+ dices.STATUS = "FREE_TO_PLAY";
925
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}));
926
+ byId('free-rowMax').removeEventListener("click", this.calcFreeRowMax);
927
+ },
928
+
929
+ calcFreeRowMin: () => {
930
+ if(dices.validatePass() == false) return;
931
+ var maxTestKey = Object.keys(dices.R).reduce(function(a, b) {return dices.R[a] > dices.R[b] ? a : b});
932
+ var test = 0;
933
+ for(var key in dices.R) {
934
+ if(key != maxTestKey) {
935
+ test += parseFloat(dices.R[key])
936
+ } else {
937
+ console.log('not calc dice ', dices.R[key])
938
+ }
939
+ }
940
+ byId('free-rowMin').innerHTML = test;
941
+ byId('free-rowMin').removeEventListener('click', this.calcFreeRowMin);
942
+ // calc max min dont forget rules for bonus +30
943
+ var SUMMINMAX = parseFloat(byId('free-rowMax').innerHTML) - parseFloat(byId('free-rowMin').innerHTML)
944
+ byId('free-rowMaxMinSum').innerHTML = SUMMINMAX;
945
+ myDom.incrasePoints(SUMMINMAX);
946
+ dices.STATUS = "FREE_TO_PLAY";
947
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
948
+ },
949
+
950
+ attachFreeKenta: function() {
951
+ if(dices.validatePass() == false) return;
952
+
953
+ console.log('Test free kenta :', dices.R)
954
+ var result = app.myDom.checkForDuplicate()[0];
955
+ var testArray = app.myDom.checkForDuplicate()[1];
956
+ console.log('TEST duplik: ' + result);
957
+ if(result.length == 2) {
958
+ console.log('TEST duplik less 3 : ' + result);
959
+ var locPrevent = false;
960
+ testArray.forEach((item, index, array) => {
961
+ if(result[0].value == item.value && locPrevent == false) {
962
+ console.log('detect by value item.value', item.value)
963
+ locPrevent = true;
964
+ array.splice(index, 1);
965
+ }
966
+ })
967
+ // if we catch 1 and 6 in same stack then it is not possible for kenta...
968
+ var test1 = false, test6 = false;
969
+ testArray.forEach((item, index, array) => {
970
+ if(item.value == 1) {
971
+ test1 = true;
972
+ } else if(item.value == 6) {
973
+ test6 = true;
974
+ }
975
+ })
976
+ if(test1 == true && test6 == true) {
977
+ byId('free-largeStraight').innerHTML = `0`;
978
+ } else if(test1 == true) {
979
+ byId('free-largeStraight').innerHTML = 15 + 50;
980
+ myDom.incrasePoints(15 + 50);
981
+ } else if(test6 == true) {
982
+ byId('free-largeStraight').innerHTML = 20 + 50;
983
+ myDom.incrasePoints(20 + 50);
984
+ }
985
+ } else if(result < 2) {
986
+ byId('free-largeStraight').innerHTML = 66;
987
+ myDom.incrasePoints(66);
988
+ } else {
989
+ // zero value
990
+ byId('free-largeStraight').innerHTML = `0`;
991
+ }
992
+ byId('free-largeStraight').removeEventListener('click', this.attachFreeKenta)
993
+ dices.STATUS = "FREE_TO_PLAY";
994
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
995
+ },
996
+
997
+ attachFreeTrilling: function() {
998
+ if(dices.validatePass() == false) return;
999
+
1000
+ var result = app.myDom.checkForDuplicate()[0];
1001
+ // var testArray = app.myDom.checkForDuplicate()[1];
1002
+ // console.log('DUPLICATE FOR TRILING ', result);
1003
+ if(result.length > 2) {
1004
+ var testWin = 0;
1005
+ var TEST = app.myDom.checkForAllDuplicate();
1006
+ console.log('DUPLICATE FOR TRILING TEST ', TEST);
1007
+ for(var key in TEST) {
1008
+ if(TEST[key] > 2) {
1009
+ // win
1010
+ var getDiceID = parseInt(key.replace('value__', ''))
1011
+ testWin = getDiceID * 3;
1012
+ }
1013
+ }
1014
+ console.log('DUPLICATE FOR TRILING 30 + TEST ', testWin);
1015
+ if(testWin > 0) {
1016
+ byId('free-threeOfAKind').innerHTML = 20 + testWin;
1017
+ myDom.incrasePoints(20 + testWin);
1018
+ }
1019
+ } else {
1020
+ byId('free-threeOfAKind').innerHTML = 0;
1021
+ }
1022
+ byId('free-threeOfAKind').removeEventListener('click', this.attachFreeTrilling)
1023
+ dices.STATUS = "FREE_TO_PLAY";
1024
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
1025
+ },
1026
+
1027
+ attachFreeFullHouse: function() {
1028
+
1029
+ if(dices.validatePass() == false) return;
1030
+
1031
+ var TEST = app.myDom.checkForAllDuplicate();
1032
+ // console.log('DUPLICATE FOR FULL HOUSE 30 + TEST ');
1033
+ var win = 0;
1034
+ var testPair = false;
1035
+ var testTrilling = false;
1036
+ var testWinPair = 0;
1037
+ var testWinTrilling = 0;
1038
+ for(var key in TEST) {
1039
+ if(TEST[key] == 2) {
1040
+ // win
1041
+ var getDiceID = parseInt(key.replace('value__', ''))
1042
+ testWinPair = getDiceID * 2;
1043
+ testPair = true;
1044
+ } else if(TEST[key] == 3) {
1045
+ var getDiceID = parseInt(key.replace('value__', ''))
1046
+ testWinTrilling = getDiceID * 3;
1047
+ testTrilling = true;
1048
+ }
1049
+ }
1050
+ if(testPair == true && testTrilling == true) {
1051
+ win = testWinPair + testWinTrilling;
1052
+ byId('free-fullHouse').innerHTML = win + 30;
1053
+ myDom.incrasePoints(win + 30);
1054
+ } else {
1055
+ byId('free-fullHouse').innerHTML = 0;
1056
+ }
1057
+
1058
+ byId('free-fullHouse').removeEventListener('click', this.attachFreeFullHouse)
1059
+ dices.STATUS = "FREE_TO_PLAY";
1060
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
1061
+ },
1062
+
1063
+ attachFreePoker: function() {
1064
+ if(dices.validatePass() == false) return;
1065
+
1066
+ var TEST = app.myDom.checkForAllDuplicate();
1067
+ // console.log('DUPLICATE FOR poker 40 + TEST ');
1068
+ for(var key in TEST) {
1069
+ if(TEST[key] == 4 || TEST[key] > 4) {
1070
+ var getDiceID = parseInt(key.replace('value__', ''))
1071
+ var win = getDiceID * 4;
1072
+ byId('free-poker').innerHTML = win + 40;
1073
+ myDom.incrasePoints(win + 40);
1074
+ }
1075
+ }
1076
+ byId('free-poker').removeEventListener('click', this.attachFreePoker)
1077
+ dices.STATUS = "FREE_TO_PLAY";
1078
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
1079
+ },
1080
+
1081
+ attachFreeJamb: function() {
1082
+ if(dices.validatePass() == false) return;
1083
+ // console.log('<GAMEPLAY><FREE ROW IS FEELED>')
1084
+ var TEST = app.myDom.checkForAllDuplicate();
1085
+ for(var key in TEST) {
1086
+ if(TEST[key] == 5) {
1087
+ // win
1088
+ var getDiceID = parseInt(key.replace('value__', ''))
1089
+ var win = getDiceID * 5;
1090
+ byId('free-poker').innerHTML = win + 50;
1091
+ myDom.incrasePoints(win + 50);
1092
+ }
1093
+ }
1094
+ byId('free-jamb').removeEventListener('click', this.attachFreeJamb)
1095
+ dices.STATUS = "FREE_TO_PLAY";
1096
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
1097
+ },
1098
+ // end of free row
1099
+
1100
+ calcDownRowMax: (e) => {
1101
+ if(dices.validatePass() == false) return;
1102
+ e.target.classList.remove('canPlay');
1103
+ byId('down-rowMin').classList.add('canPlay');
1104
+ var test = 0;
1105
+ let keyLessNum = Object.keys(dices.R).reduce((key, v) => dices.R[v] < dices.R[key] ? v : key);
1106
+ // console.log('FIND MIN DICE TO REMOVE FROM SUM ', keyLessNum);
1107
+ for(var key in dices.SAVED_DICES) {
1108
+ if(key != keyLessNum) {
1109
+ test += parseFloat(dices.R[key]);
1110
+ }
1111
+ }
1112
+ e.target.innerHTML = test;
1113
+ // now attach next event.
1114
+ dices.STATUS = "FREE_TO_PLAY";
1115
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}));
1116
+ byId('down-rowMax').removeEventListener("click", myDom.calcDownRowMax);
1117
+ byId('down-rowMin').addEventListener('click', myDom.calcDownRowMin);
1118
+ },
1119
+
1120
+ incrasePoints: function(arg) {
1121
+ byId('user-points').innerHTML = parseInt(byId('user-points').innerHTML) + parseInt(arg);
1122
+ },
1123
+
1124
+ calcDownRowMin: () => {
1125
+ if(dices.validatePass() == false) return;
1126
+ byId('down-rowMin').classList.remove('canPlay')
1127
+ console.log('MIN ENABLED')
1128
+ var maxTestKey = Object.keys(dices.R).reduce(function(a, b) {return dices.R[a] > dices.R[b] ? a : b});
1129
+ var test = 0;
1130
+ for(var key in dices.R) {
1131
+ // if(key != maxTestKey) {
1132
+ test += parseFloat(dices.R[key])
1133
+ // } else {
1134
+ // console.log('not calc dice ', dices.R[key])
1135
+ // }
1136
+ }
1137
+ byId('down-rowMin').innerHTML = test;
1138
+ byId('down-rowMin').removeEventListener('click', myDom.calcDownRowMin);
1139
+ // calc max min dont forget rules for bonus +30
1140
+ var SUMMINMAX = parseFloat(byId('down-rowMax').innerHTML) - parseFloat(byId('down-rowMin').innerHTML)
1141
+ byId('down-rowMaxMinSum').innerHTML = SUMMINMAX;
1142
+ myDom.incrasePoints(SUMMINMAX);
1143
+ dices.STATUS = "FREE_TO_PLAY";
1144
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
1145
+ byId('down-largeStraight').classList.add('canPlay');
1146
+ byId('down-largeStraight').addEventListener('click', myDom.attachKenta)
1147
+ byId('down-rowMin').removeEventListener('click', myDom.calcDownRowMin);
1148
+ },
1149
+
1150
+ checkForDuplicate: function() {
1151
+ var testArray = [];
1152
+ for(var key in dices.SAVED_DICES) {
1153
+ var gen = {myId: key, value: dices.R[key]};
1154
+ testArray.push(gen);
1155
+ }
1156
+ var result = Object.values(testArray.reduce((c, v) => {
1157
+ let k = v.value;
1158
+ c[k] = c[k] || [];
1159
+ c[k].push(v);
1160
+ return c;
1161
+ }, {})).reduce((c, v) => v.length > 1 ? c.concat(v) : c, []);
1162
+
1163
+ return [result, testArray];
1164
+ },
1165
+
1166
+ checkForAllDuplicate: function() {
1167
+ var testArray = [];
1168
+ for(var key in dices.SAVED_DICES) {
1169
+ var gen = {myId: key, value: dices.R[key]};
1170
+ testArray.push(gen);
1171
+ }
1172
+ // console.log('testArray ', testArray)
1173
+ var result = Object.values(testArray.reduce((c, v) => {
1174
+ let k = v.value;
1175
+ c[k] = c[k] || [];
1176
+ c[k].push(v);
1177
+ return c;
1178
+ }, {})).reduce((c, v) => v.length > 1 ? c.concat(v) : c, []);
1179
+ var discret = {};
1180
+ result.forEach((item, index, array) => {
1181
+ if(typeof discret['value__' + item.value] === 'undefined') {
1182
+ discret['value__' + item.value] = 1;
1183
+ } else {
1184
+ discret['value__' + item.value] += 1;
1185
+ }
1186
+ })
1187
+ return discret;
1188
+ },
1189
+
1190
+ attachKenta: function() {
1191
+ console.log('Test kenta ', dices.SAVED_DICES)
1192
+ byId('down-largeStraight').classList.remove('canPlay')
1193
+ var result = app.myDom.checkForDuplicate()[0];
1194
+ var testArray = app.myDom.checkForDuplicate()[1];
1195
+ console.log('TEST duplik: ' + result);
1196
+ if(result.length > 0) {
1197
+ console.log('TEST duplik l : ' + result);
1198
+ var locPrevent = false;
1199
+ testArray.forEach((item, index, array) => {
1200
+ if(result[0].value == item.value && locPrevent == false) {
1201
+ console.log('detect by value item.value', item.value)
1202
+ locPrevent = true;
1203
+ array.splice(index, 1);
1204
+ }
1205
+ })
1206
+ byId('down-largeStraight').innerHTML = `0`;
1207
+
1208
+ } else if(result < 2) {
1209
+ byId('down-largeStraight').innerHTML = 66;
1210
+ myDom.incrasePoints(66);
1211
+ } else {
1212
+ // zero value
1213
+ byId('down-largeStraight').innerHTML = `0`;
1214
+ }
1215
+ byId('down-threeOfAKind').addEventListener('click', myDom.attachDownTrilling)
1216
+ byId('down-largeStraight').removeEventListener('click', myDom.attachKenta)
1217
+ dices.STATUS = "FREE_TO_PLAY";
1218
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
1219
+ },
1220
+
1221
+ attachDownTrilling: function() {
1222
+ var result = app.myDom.checkForDuplicate()[0];
1223
+ // var testArray = app.myDom.checkForDuplicate()[1];
1224
+ // console.log('DUPLICATE FOR TRILING ', result);
1225
+ if(result.length > 2) {
1226
+ var testWin = 0;
1227
+ var TEST = app.myDom.checkForAllDuplicate();
1228
+ console.log('DUPLICATE FOR TRILING TEST ', TEST);
1229
+ for(var key in TEST) {
1230
+ if(TEST[key] > 2) {
1231
+ // win
1232
+ var getDiceID = parseInt(key.replace('value__', ''))
1233
+ testWin = getDiceID * 3;
1234
+ }
1235
+ }
1236
+ console.log('DUPLICATE FOR TRILING 30 + TEST ', testWin);
1237
+ byId('down-threeOfAKind').innerHTML = 20 + testWin;
1238
+ myDom.incrasePoints(20 + testWin);
1239
+ } else {
1240
+ byId('down-threeOfAKind').innerHTML = 0;
1241
+ }
1242
+ byId('down-threeOfAKind').removeEventListener('click', myDom.attachDownTrilling)
1243
+ byId('down-fullHouse').addEventListener('click', myDom.attachDownFullHouse)
1244
+ dices.STATUS = "FREE_TO_PLAY";
1245
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
1246
+ },
1247
+
1248
+ attachDownFullHouse: function() {
1249
+ var TEST = app.myDom.checkForAllDuplicate();
1250
+ // console.log('DUPLICATE FOR FULL HOUSE 30 + TEST ');
1251
+ var win = 0;
1252
+ var testPair = false;
1253
+ var testTrilling = false;
1254
+ var testWinPair = 0;
1255
+ var testWinTrilling = 0;
1256
+ for(var key in TEST) {
1257
+ if(TEST[key] == 2) {
1258
+ // win
1259
+ var getDiceID = parseInt(key.replace('value__', ''))
1260
+ testWinPair = getDiceID * 2;
1261
+ testPair = true;
1262
+ } else if(TEST[key] == 3) {
1263
+ var getDiceID = parseInt(key.replace('value__', ''))
1264
+ testWinTrilling = getDiceID * 3;
1265
+ testTrilling = true;
1266
+ }
1267
+ }
1268
+ if(testPair == true && testTrilling == true) {
1269
+ win = testWinPair + testWinTrilling;
1270
+ byId('down-fullHouse').innerHTML = win + 30;
1271
+ myDom.incrasePoints(win + 30);
1272
+ } else {
1273
+ byId('down-fullHouse').innerHTML = 0;
1274
+ }
1275
+ byId('down-poker').addEventListener('click', myDom.attachDownPoker)
1276
+ byId('down-fullHouse').removeEventListener('click', myDom.attachDownFullHouse)
1277
+ dices.STATUS = "FREE_TO_PLAY";
1278
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
1279
+ },
1280
+
1281
+ attachDownPoker: function() {
1282
+ var TEST = app.myDom.checkForAllDuplicate();
1283
+ // console.log('DUPLICATE FOR poker 40 + TEST ');
1284
+ for(var key in TEST) {
1285
+ if(TEST[key] == 4 || TEST[key] > 4) {
1286
+ // win
1287
+ var getDiceID = parseInt(key.replace('value__', ''))
1288
+ var win = getDiceID * 4;
1289
+ byId('down-poker').innerHTML = win + 40;
1290
+ myDom.incrasePoints(win + 40);
1291
+ }
1292
+ }
1293
+ byId('down-poker').removeEventListener('click', myDom.attachDownPoker)
1294
+ byId('down-jamb').addEventListener('click', myDom.attachDownJamb)
1295
+ dices.STATUS = "FREE_TO_PLAY";
1296
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
1297
+ },
1298
+
1299
+ attachDownJamb: function() {
1300
+ byId('down-jamb').removeEventListener('click', myDom.attachDownJamb)
1301
+ console.log('<GAMEPLAY><DOWN ROW IS FEELED>')
1302
+ var TEST = app.myDom.checkForAllDuplicate();
1303
+ for(var key in TEST) {
1304
+ if(TEST[key] == 5 || TEST[key] > 5) {
1305
+ // win
1306
+ var getDiceID = parseInt(key.replace('value__', ''))
1307
+ var win = getDiceID * 5;
1308
+ byId('down-poker').innerHTML = win + 50;
1309
+ myDom.incrasePoints(win + 50);
1310
+ }
1311
+ }
1312
+ dices.STATUS = "FREE_TO_PLAY";
1313
+ dispatchEvent(new CustomEvent('FREE_TO_PLAY', {}))
1314
+ },
1315
+
1316
+ isDragging: false,
1317
+ offsetX: 0,
1318
+ offsetY: 0,
1319
+ addDraggerForTable: () => {
1320
+ byId('dragHandler').addEventListener('pointerdown', (e) => {
1321
+ myDom.isDragging = true;
1322
+ const rect = byId('jambTable').getBoundingClientRect();
1323
+ myDom.offsetX = e.clientX - rect.left;
1324
+ myDom.offsetY = e.clientY - rect.top;
1325
+ byId('dragHandler').setPointerCapture(e.pointerId);
1326
+ });
1327
+
1328
+ byId('dragHandler').addEventListener('pointermove', (e) => {
1329
+ if(myDom.isDragging) {
1330
+ byId('jambTable').style.left = `${e.clientX - myDom.offsetX}px`;
1331
+ byId('jambTable').style.top = `${e.clientY - myDom.offsetY}px`;
1332
+ }
1333
+ });
1334
+
1335
+ byId('dragHandler').addEventListener('pointerup', (e) => {
1336
+ myDom.isDragging = false;
1337
+ byId('dragHandler').releasePointerCapture(e.pointerId);
1338
+ });
1339
+ }
1340
+
1341
+ }