add sound and set mode

main
Ugo Finnendahl 17 hours ago
parent 6d0654ac14
commit 69cb0edb60
  1. 348
      assets/audio/dotty-floor-english.json
  2. BIN
      assets/audio/dotty-floor-english.mp3
  3. 1
      assets/audio/dotty-floor-german.json
  4. BIN
      assets/audio/dotty-floor-german.mp3
  5. 14
      assets/css/src/style.scss
  6. 2
      assets/css/style.min.css
  7. 2
      assets/js/howler/howler.core.min.js
  8. 3252
      assets/js/howler/howler.es6.js
  9. 3248
      assets/js/howler/howler.js
  10. 4
      assets/js/howler/howler.min.js
  11. 2
      assets/js/howler/howler.spatial.min.js
  12. 374
      assets/js/sound.js
  13. 114
      assets/js/views/xoi/logic.js
  14. 107
      assets/js/views/xoi/main.js
  15. 13
      assets/js/websocket.js
  16. 55
      site/templates/xoi.php

@ -0,0 +1,348 @@
{
"1": [0, 654],
"2": [654, 498],
"3": [1152, 560],
"4": [1712, 544],
"5": [2256, 564],
"6": [2820, 663],
"7": [3483, 591],
"8": [4074, 545],
"9": [4619, 560],
"10": [5179, 524],
"11": [5703, 645],
"12": [6348, 581],
"13": [6929, 847],
"14": [7776, 733],
"15": [8509, 873],
"16": [9382, 1020],
"17": [10402, 964],
"18": [11366, 847],
"19": [12213, 930],
"20": [13143, 729],
"21": [13872, 964],
"22": [14836, 950],
"23": [15786, 914],
"24": [16700, 901],
"25": [17601, 986],
"26": [18587, 981],
"27": [19568, 959],
"28": [20527, 923],
"29": [21450, 1047],
"30": [22497, 688],
"31": [23185, 970],
"32": [24155, 858],
"33": [25013, 1050],
"34": [26063, 942],
"35": [27005, 924],
"36": [27929, 972],
"37": [28901, 977],
"38": [29878, 844],
"39": [30722, 918],
"40": [31640, 667],
"41": [32307, 845],
"42": [33152, 928],
"43": [34080, 936],
"44": [35016, 964],
"45": [35980, 992],
"46": [36972, 964],
"47": [37936, 882],
"48": [38818, 863],
"49": [39681, 919],
"50": [40600, 678],
"51": [41278, 912],
"52": [42190, 870],
"53": [43060, 940],
"54": [44000, 883],
"55": [44883, 950],
"56": [45833, 1000],
"57": [46833, 992],
"58": [47825, 906],
"59": [48731, 954],
"60": [49685, 795],
"61": [50480, 993],
"62": [51473, 982],
"63": [52455, 989],
"64": [53444, 1003],
"65": [54447, 1009],
"66": [55456, 1119],
"67": [56575, 1076],
"68": [57651, 1133],
"69": [58784, 1077],
"70": [59861, 874],
"71": [60735, 990],
"72": [61725, 973],
"73": [62698, 1099],
"74": [63797, 1101],
"75": [64898, 1015],
"76": [65913, 1095],
"77": [67008, 1112],
"78": [68120, 1064],
"79": [69184, 1070],
"80": [70254, 661],
"81": [70915, 787],
"82": [71702, 800],
"83": [72502, 930],
"84": [73432, 938],
"85": [74370, 943],
"86": [75313, 957],
"87": [76270, 859],
"88": [77129, 834],
"89": [77963, 876],
"90": [78839, 790],
"91": [79629, 942],
"92": [80571, 973],
"93": [81544, 1017],
"94": [82561, 1019],
"95": [83580, 1003],
"96": [84583, 1113],
"97": [85696, 949],
"98": [86645, 1010],
"99": [87655, 1068],
"100": [88723, 917],
"101": [89640, 1371],
"102": [91011, 1295],
"103": [92306, 1382],
"104": [93688, 1273],
"105": [94961, 1360],
"106": [96321, 1368],
"107": [97689, 1289],
"108": [98978, 1297],
"109": [100275, 1353],
"110": [101628, 1256],
"111": [102884, 1437],
"112": [104321, 1484],
"113": [105805, 1453],
"114": [107258, 1501],
"115": [108759, 1595],
"116": [110354, 1534],
"117": [111888, 1680],
"118": [113568, 1566],
"119": [115134, 1506],
"120": [116640, 1373],
"121": [118013, 1704],
"122": [119717, 1711],
"123": [121428, 1685],
"124": [123113, 1741],
"125": [124854, 1909],
"126": [126763, 1750],
"127": [128513, 1877],
"128": [130390, 1839],
"129": [132229, 1758],
"130": [133987, 1704],
"131": [135691, 1787],
"132": [137478, 1721],
"133": [139199, 1793],
"134": [140992, 1829],
"135": [142821, 1846],
"136": [144667, 1805],
"137": [146472, 1728],
"138": [148200, 1817],
"139": [150017, 1879],
"140": [151896, 1468],
"141": [153364, 1624],
"142": [154988, 1754],
"143": [156742, 1711],
"144": [158453, 1845],
"145": [160298, 1754],
"146": [162052, 1832],
"147": [163884, 1746],
"148": [165630, 1761],
"149": [167391, 1745],
"150": [169136, 1497],
"151": [170633, 1664],
"152": [172297, 1704],
"153": [174001, 1825],
"154": [175826, 1813],
"155": [177639, 1818],
"156": [179457, 1902],
"157": [181359, 1780],
"158": [183139, 1738],
"159": [184877, 1793],
"160": [186670, 1667],
"161": [188337, 1683],
"162": [190020, 1769],
"164": [191789, 1745],
"165": [193534, 1822],
"167": [195356, 1816],
"168": [197172, 1768],
"170": [198940, 1529],
"171": [200469, 1709],
"174": [202178, 1723],
"177": [203901, 1830],
"180": [205731, 1454],
"require_1": [207185, 1659],
"require_2": [208844, 1408],
"require_3": [210252, 1474],
"require_4": [211726, 1549],
"require_5": [213274, 1569],
"require_6": [214843, 1549],
"require_7": [216392, 1505],
"require_8": [217897, 1533],
"require_9": [219430, 1474],
"require_10": [220904, 1444],
"require_11": [222348, 1633],
"require_12": [223981, 1404],
"require_13": [225385, 1761],
"require_14": [227145, 1652],
"require_15": [228797, 1861],
"require_16": [230658, 2008],
"require_17": [232666, 1883],
"require_18": [234549, 1757],
"require_19": [236306, 1844],
"require_20": [238150, 1717],
"require_21": [239867, 1952],
"require_22": [241818, 1870],
"require_23": [243688, 1990],
"require_24": [245678, 1815],
"require_25": [247493, 1991],
"require_26": [249484, 1900],
"require_27": [251384, 1799],
"require_28": [253183, 1746],
"require_29": [254929, 1933],
"require_30": [256861, 1602],
"require_31": [258463, 1975],
"require_32": [260438, 1698],
"require_33": [262136, 2055],
"require_34": [264191, 1862],
"require_35": [266053, 1747],
"require_36": [267800, 1882],
"require_37": [269682, 1896],
"require_38": [271577, 1754],
"require_39": [273331, 1923],
"require_40": [275254, 1672],
"require_41": [276926, 1921],
"require_42": [278847, 1847],
"require_43": [280694, 1924],
"require_44": [282618, 1969],
"require_45": [284587, 2068],
"require_46": [286655, 2040],
"require_47": [288695, 1705],
"require_48": [290400, 1686],
"require_49": [292085, 1838],
"require_50": [293923, 1598],
"require_51": [295521, 1735],
"require_52": [297256, 1710],
"require_53": [298966, 1945],
"require_54": [300911, 1797],
"require_55": [302708, 2026],
"require_56": [304734, 2005],
"require_57": [306739, 1906],
"require_58": [308644, 1894],
"require_59": [310538, 1959],
"require_60": [312497, 1618],
"require_61": [314115, 1903],
"require_62": [316018, 2058],
"require_63": [318076, 1899],
"require_64": [319975, 1923],
"require_65": [321898, 1832],
"require_66": [323729, 2124],
"require_67": [325853, 1962],
"require_68": [327815, 2043],
"require_69": [329858, 1987],
"require_70": [331845, 1784],
"require_71": [333629, 1876],
"require_72": [335505, 2049],
"require_73": [337554, 1939],
"require_74": [339492, 2106],
"require_75": [341598, 1855],
"require_76": [343453, 2171],
"require_77": [345624, 2022],
"require_78": [347646, 1904],
"require_79": [349550, 1980],
"require_80": [351530, 1575],
"require_81": [353105, 1697],
"require_82": [354801, 1805],
"require_83": [356606, 1850],
"require_84": [358456, 1858],
"require_85": [360314, 1862],
"require_86": [362176, 1843],
"require_87": [364019, 1935],
"require_88": [365954, 1720],
"require_89": [367674, 1790],
"require_90": [369463, 1709],
"require_91": [371172, 1765],
"require_92": [372937, 1813],
"require_93": [374750, 1927],
"require_94": [376677, 1939],
"require_95": [378616, 2079],
"require_96": [380695, 2023],
"require_97": [382718, 1835],
"require_98": [384552, 1998],
"require_99": [386550, 1982],
"require_100": [388532, 1922],
"require_101": [390454, 2447],
"require_102": [392901, 2283],
"require_103": [395184, 2302],
"require_104": [397486, 2159],
"require_105": [399645, 2436],
"require_106": [402080, 2208],
"require_107": [404288, 2203],
"require_108": [406491, 2285],
"require_109": [408776, 2272],
"require_110": [411048, 2079],
"require_111": [413127, 2351],
"require_112": [415478, 2489],
"require_113": [417967, 2373],
"require_114": [420339, 2324],
"require_115": [422663, 2418],
"require_116": [425081, 2420],
"require_117": [427501, 2520],
"require_118": [430021, 2554],
"require_119": [432575, 2511],
"require_120": [435086, 2361],
"require_121": [437447, 2614],
"require_122": [440060, 2631],
"require_123": [442691, 2571],
"require_124": [445262, 2564],
"require_125": [447826, 2823],
"require_126": [450649, 2738],
"require_127": [453387, 2882],
"require_128": [456269, 2662],
"require_129": [458931, 2763],
"require_130": [461693, 2692],
"require_131": [464385, 2673],
"require_132": [467058, 2561],
"require_133": [469619, 2798],
"require_134": [472417, 2743],
"require_135": [475160, 2922],
"require_136": [478082, 2881],
"require_137": [480963, 2638],
"require_138": [483600, 2822],
"require_139": [486422, 2702],
"require_140": [489124, 2456],
"require_141": [491580, 2544],
"require_142": [494124, 2664],
"require_143": [496788, 2625],
"require_144": [499413, 2833],
"require_145": [502246, 2668],
"require_146": [504914, 2655],
"require_147": [507568, 2666],
"require_148": [510234, 2601],
"require_149": [512835, 2750],
"require_150": [515585, 2485],
"require_151": [518070, 2652],
"require_152": [520722, 2590],
"require_153": [523312, 2830],
"require_154": [526142, 2733],
"require_155": [528874, 2641],
"require_156": [531515, 2890],
"require_157": [534405, 2699],
"require_158": [537104, 2578],
"require_159": [539682, 2869],
"require_160": [542551, 2581],
"require_161": [545132, 2602],
"require_162": [547734, 2689],
"require_164": [550423, 2585],
"require_165": [553008, 2732],
"require_167": [555739, 2821],
"require_168": [558560, 2756],
"require_170": [561316, 2415],
"require_171": [563731, 2785],
"require_174": [566516, 2633],
"require_177": [569149, 2835],
"require_180": [571984, 2442],
"game_on": [574426, 904],
"game_shot": [575330, 887],
"game_shot_match": [576217, 1724],
"0": [577941, 903]
}

File diff suppressed because one or more lines are too long

@ -427,6 +427,13 @@ body.xoi{
margin-bottom: 1.3em; margin-bottom: 1.3em;
} }
} }
.sidebyside{
display: flex;
& > * {
flex-grow: 1;
flex-basis: 1;
}
}
} }
.playerselect{ .playerselect{
& > h2{ & > h2{
@ -447,7 +454,12 @@ body.xoi{
"navi navi navi navi navi" "navi navi navi navi navi"
; ;
background-color: black; background-color: black;
&.Throw{
box-shadow: 0px 0px 2rem 2rem green;
}
&.Takeout{
box-shadow: 0px 0px 2rem 2rem orange;
}
.bigToGo{ .bigToGo{
margin: $line; margin: $line;
background-color: white; background-color: white;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,374 @@
import './howler/howler.js';
const ToDo = [];
var looperActive = false;
function looper() {
looperActive = true;
if (ToDo.length >= 1) {
const elem = ToDo.shift();
caller.play(elem)
} else {
looperActive = false;
}
}
export function playSound(sound) {
ToDo.push(sound);
if (!looperActive){
looper();
}
}
export const caller = new Howl({
src: ['/assets/audio/dotty-floor-english.mp3'],
onend: function() {
looper()
},
sprite: {
"1": [0, 654],
"2": [654, 498],
"3": [1152, 560],
"4": [1712, 544],
"5": [2256, 564],
"6": [2820, 663],
"7": [3483, 591],
"8": [4074, 545],
"9": [4619, 560],
"10": [5179, 524],
"11": [5703, 645],
"12": [6348, 581],
"13": [6929, 847],
"14": [7776, 733],
"15": [8509, 873],
"16": [9382, 1020],
"17": [10402, 964],
"18": [11366, 847],
"19": [12213, 930],
"20": [13143, 729],
"21": [13872, 964],
"22": [14836, 950],
"23": [15786, 914],
"24": [16700, 901],
"25": [17601, 986],
"26": [18587, 981],
"27": [19568, 959],
"28": [20527, 923],
"29": [21450, 1047],
"30": [22497, 688],
"31": [23185, 970],
"32": [24155, 858],
"33": [25013, 1050],
"34": [26063, 942],
"35": [27005, 924],
"36": [27929, 972],
"37": [28901, 977],
"38": [29878, 844],
"39": [30722, 918],
"40": [31640, 667],
"41": [32307, 845],
"42": [33152, 928],
"43": [34080, 936],
"44": [35016, 964],
"45": [35980, 992],
"46": [36972, 964],
"47": [37936, 882],
"48": [38818, 863],
"49": [39681, 919],
"50": [40600, 678],
"51": [41278, 912],
"52": [42190, 870],
"53": [43060, 940],
"54": [44000, 883],
"55": [44883, 950],
"56": [45833, 1000],
"57": [46833, 992],
"58": [47825, 906],
"59": [48731, 954],
"60": [49685, 795],
"61": [50480, 993],
"62": [51473, 982],
"63": [52455, 989],
"64": [53444, 1003],
"65": [54447, 1009],
"66": [55456, 1119],
"67": [56575, 1076],
"68": [57651, 1133],
"69": [58784, 1077],
"70": [59861, 874],
"71": [60735, 990],
"72": [61725, 973],
"73": [62698, 1099],
"74": [63797, 1101],
"75": [64898, 1015],
"76": [65913, 1095],
"77": [67008, 1112],
"78": [68120, 1064],
"79": [69184, 1070],
"80": [70254, 661],
"81": [70915, 787],
"82": [71702, 800],
"83": [72502, 930],
"84": [73432, 938],
"85": [74370, 943],
"86": [75313, 957],
"87": [76270, 859],
"88": [77129, 834],
"89": [77963, 876],
"90": [78839, 790],
"91": [79629, 942],
"92": [80571, 973],
"93": [81544, 1017],
"94": [82561, 1019],
"95": [83580, 1003],
"96": [84583, 1113],
"97": [85696, 949],
"98": [86645, 1010],
"99": [87655, 1068],
"100": [88723, 917],
"101": [89640, 1371],
"102": [91011, 1295],
"103": [92306, 1382],
"104": [93688, 1273],
"105": [94961, 1360],
"106": [96321, 1368],
"107": [97689, 1289],
"108": [98978, 1297],
"109": [100275, 1353],
"110": [101628, 1256],
"111": [102884, 1437],
"112": [104321, 1484],
"113": [105805, 1453],
"114": [107258, 1501],
"115": [108759, 1595],
"116": [110354, 1534],
"117": [111888, 1680],
"118": [113568, 1566],
"119": [115134, 1506],
"120": [116640, 1373],
"121": [118013, 1704],
"122": [119717, 1711],
"123": [121428, 1685],
"124": [123113, 1741],
"125": [124854, 1909],
"126": [126763, 1750],
"127": [128513, 1877],
"128": [130390, 1839],
"129": [132229, 1758],
"130": [133987, 1704],
"131": [135691, 1787],
"132": [137478, 1721],
"133": [139199, 1793],
"134": [140992, 1829],
"135": [142821, 1846],
"136": [144667, 1805],
"137": [146472, 1728],
"138": [148200, 1817],
"139": [150017, 1879],
"140": [151896, 1468],
"141": [153364, 1624],
"142": [154988, 1754],
"143": [156742, 1711],
"144": [158453, 1845],
"145": [160298, 1754],
"146": [162052, 1832],
"147": [163884, 1746],
"148": [165630, 1761],
"149": [167391, 1745],
"150": [169136, 1497],
"151": [170633, 1664],
"152": [172297, 1704],
"153": [174001, 1825],
"154": [175826, 1813],
"155": [177639, 1818],
"156": [179457, 1902],
"157": [181359, 1780],
"158": [183139, 1738],
"159": [184877, 1793],
"160": [186670, 1667],
"161": [188337, 1683],
"162": [190020, 1769],
"164": [191789, 1745],
"165": [193534, 1822],
"167": [195356, 1816],
"168": [197172, 1768],
"170": [198940, 1529],
"171": [200469, 1709],
"174": [202178, 1723],
"177": [203901, 1830],
"180": [205731, 1454],
"require_1": [207185, 1659],
"require_2": [208844, 1408],
"require_3": [210252, 1474],
"require_4": [211726, 1549],
"require_5": [213274, 1569],
"require_6": [214843, 1549],
"require_7": [216392, 1505],
"require_8": [217897, 1533],
"require_9": [219430, 1474],
"require_10": [220904, 1444],
"require_11": [222348, 1633],
"require_12": [223981, 1404],
"require_13": [225385, 1761],
"require_14": [227145, 1652],
"require_15": [228797, 1861],
"require_16": [230658, 2008],
"require_17": [232666, 1883],
"require_18": [234549, 1757],
"require_19": [236306, 1844],
"require_20": [238150, 1717],
"require_21": [239867, 1952],
"require_22": [241818, 1870],
"require_23": [243688, 1990],
"require_24": [245678, 1815],
"require_25": [247493, 1991],
"require_26": [249484, 1900],
"require_27": [251384, 1799],
"require_28": [253183, 1746],
"require_29": [254929, 1933],
"require_30": [256861, 1602],
"require_31": [258463, 1975],
"require_32": [260438, 1698],
"require_33": [262136, 2055],
"require_34": [264191, 1862],
"require_35": [266053, 1747],
"require_36": [267800, 1882],
"require_37": [269682, 1896],
"require_38": [271577, 1754],
"require_39": [273331, 1923],
"require_40": [275254, 1672],
"require_41": [276926, 1921],
"require_42": [278847, 1847],
"require_43": [280694, 1924],
"require_44": [282618, 1969],
"require_45": [284587, 2068],
"require_46": [286655, 2040],
"require_47": [288695, 1705],
"require_48": [290400, 1686],
"require_49": [292085, 1838],
"require_50": [293923, 1598],
"require_51": [295521, 1735],
"require_52": [297256, 1710],
"require_53": [298966, 1945],
"require_54": [300911, 1797],
"require_55": [302708, 2026],
"require_56": [304734, 2005],
"require_57": [306739, 1906],
"require_58": [308644, 1894],
"require_59": [310538, 1959],
"require_60": [312497, 1618],
"require_61": [314115, 1903],
"require_62": [316018, 2058],
"require_63": [318076, 1899],
"require_64": [319975, 1923],
"require_65": [321898, 1832],
"require_66": [323729, 2124],
"require_67": [325853, 1962],
"require_68": [327815, 2043],
"require_69": [329858, 1987],
"require_70": [331845, 1784],
"require_71": [333629, 1876],
"require_72": [335505, 2049],
"require_73": [337554, 1939],
"require_74": [339492, 2106],
"require_75": [341598, 1855],
"require_76": [343453, 2171],
"require_77": [345624, 2022],
"require_78": [347646, 1904],
"require_79": [349550, 1980],
"require_80": [351530, 1575],
"require_81": [353105, 1697],
"require_82": [354801, 1805],
"require_83": [356606, 1850],
"require_84": [358456, 1858],
"require_85": [360314, 1862],
"require_86": [362176, 1843],
"require_87": [364019, 1935],
"require_88": [365954, 1720],
"require_89": [367674, 1790],
"require_90": [369463, 1709],
"require_91": [371172, 1765],
"require_92": [372937, 1813],
"require_93": [374750, 1927],
"require_94": [376677, 1939],
"require_95": [378616, 2079],
"require_96": [380695, 2023],
"require_97": [382718, 1835],
"require_98": [384552, 1998],
"require_99": [386550, 1982],
"require_100": [388532, 1922],
"require_101": [390454, 2447],
"require_102": [392901, 2283],
"require_103": [395184, 2302],
"require_104": [397486, 2159],
"require_105": [399645, 2436],
"require_106": [402080, 2208],
"require_107": [404288, 2203],
"require_108": [406491, 2285],
"require_109": [408776, 2272],
"require_110": [411048, 2079],
"require_111": [413127, 2351],
"require_112": [415478, 2489],
"require_113": [417967, 2373],
"require_114": [420339, 2324],
"require_115": [422663, 2418],
"require_116": [425081, 2420],
"require_117": [427501, 2520],
"require_118": [430021, 2554],
"require_119": [432575, 2511],
"require_120": [435086, 2361],
"require_121": [437447, 2614],
"require_122": [440060, 2631],
"require_123": [442691, 2571],
"require_124": [445262, 2564],
"require_125": [447826, 2823],
"require_126": [450649, 2738],
"require_127": [453387, 2882],
"require_128": [456269, 2662],
"require_129": [458931, 2763],
"require_130": [461693, 2692],
"require_131": [464385, 2673],
"require_132": [467058, 2561],
"require_133": [469619, 2798],
"require_134": [472417, 2743],
"require_135": [475160, 2922],
"require_136": [478082, 2881],
"require_137": [480963, 2638],
"require_138": [483600, 2822],
"require_139": [486422, 2702],
"require_140": [489124, 2456],
"require_141": [491580, 2544],
"require_142": [494124, 2664],
"require_143": [496788, 2625],
"require_144": [499413, 2833],
"require_145": [502246, 2668],
"require_146": [504914, 2655],
"require_147": [507568, 2666],
"require_148": [510234, 2601],
"require_149": [512835, 2750],
"require_150": [515585, 2485],
"require_151": [518070, 2652],
"require_152": [520722, 2590],
"require_153": [523312, 2830],
"require_154": [526142, 2733],
"require_155": [528874, 2641],
"require_156": [531515, 2890],
"require_157": [534405, 2699],
"require_158": [537104, 2578],
"require_159": [539682, 2869],
"require_160": [542551, 2581],
"require_161": [545132, 2602],
"require_162": [547734, 2689],
"require_164": [550423, 2585],
"require_165": [553008, 2732],
"require_167": [555739, 2821],
"require_168": [558560, 2756],
"require_170": [561316, 2415],
"require_171": [563731, 2785],
"require_174": [566516, 2633],
"require_177": [569149, 2835],
"require_180": [571984, 2442],
"game_on": [574426, 904],
"game_shot": [575330, 887],
"game_shot_match": [576217, 1724],
"0": [577941, 903]
}
});

@ -6,30 +6,33 @@ import { computed } from "vue";
function setPoints(page, set){ function setPoints(page, set){
let points = [0, 0]; // need to get updated for more player let points = [0, 0]; // need to get updated for more player
let ret;
const m = page.game.sets.length-1;
for (const i in page.game.sets) { for (const i in page.game.sets) {
const set = page.game.sets[i]; const s = page.game.sets[i];
const points = legPoints(page, set, set.legs[set.legs.length-1]); const p = legPoints(s, s.legs[s.legs.length-1]);
const winner = getWinner(points, page.legs);
const winner = getWinner(p, page.legs);
if (winner > -1) if (winner > -1)
points[winner] += 1; points[winner] += 1;
else else if (winner == -2) {
points[0] += 0.5;
points[1] += 0.5;
} else
return points; return points;
if (set == set){ if (s == set){
return points; return points;
} }
} }
return points; return points;
} }
function legPoints(page, set, leg){ function legPoints(set, leg){
let points = [0, 0]; // need to get updated for more player let points = [0, 0]; // need to get updated for more player
let ret;
const m = set.legs.length-1;
for (const i in set.legs) { for (const i in set.legs) {
const l = set.legs[i]; const l = set.legs[i];
if (l.visits[l.visits.length-1].toGo === undefined) { if (l.visits[l.visits.length-1].toGo === undefined) {
return points; return points;
} }
@ -61,8 +64,9 @@ function newPlayerStats(player) {
} }
function addNewSetStats(stats, scorers) { function addNewSetStats(stats, scorers) {
stats["sets"].push(newStats(scorers)); const s = newStats(scorers)
stats["sets"][0]["legs"] = []; s["legs"] = [];
stats["sets"].push(s);
return stats; return stats;
} }
@ -142,7 +146,6 @@ function addNewLeg(page){
const set = page.game.sets[page.game.sets.length-1]; const set = page.game.sets[page.game.sets.length-1];
const leg = set.legs[set.legs.length-1]; const leg = set.legs[set.legs.length-1];
const k = player2scorer(page)[leg.visits[0].player]; const k = player2scorer(page)[leg.visits[0].player];
console.log(k, k+1);
const p = page.scorers[(k+1)%2].member[0].uuid; const p = page.scorers[(k+1)%2].member[0].uuid;
page.game.sets[page.game.sets.length-1].legs.push({ page.game.sets[page.game.sets.length-1].legs.push({
@ -187,6 +190,7 @@ export function initGame(page) {
function updateStats(page, visit){ function updateStats(page, visit){
const playerUUIDs = allPlayers(page).map((p) => p.uuid); const playerUUIDs = allPlayers(page).map((p) => p.uuid);
const p = player2scorer(page)[visit.player];
const k = playerUUIDs.indexOf(visit.player); const k = playerUUIDs.indexOf(visit.player);
const todos = [page.stats["stats"][k]]; const todos = [page.stats["stats"][k]];
@ -200,7 +204,7 @@ function updateStats(page, visit){
todos[i]["first9"][0] += visit["sum"]; todos[i]["first9"][0] += visit["sum"];
todos[i]["first9"][1] += visit["numDarts"]; todos[i]["first9"][1] += visit["numDarts"];
} }
if (visit["toGo"][k] == 0) { if (visit["toGo"][p] == 0) {
todos[i]["checkouts"][0] += 1; todos[i]["checkouts"][0] += 1;
todos[i]["checkoutPoints"].push(visit["sum"]); todos[i]["checkoutPoints"].push(visit["sum"]);
} }
@ -277,6 +281,7 @@ export function recalcStats(page){
}); });
if (j == lastleg && i != lastset) { if (j == lastleg && i != lastset) {
addNewSetStats(page.stats, page.scorers); addNewSetStats(page.stats, page.scorers);
addNewLegStats(page.stats, page.scorers);
} }
}); });
}); });
@ -345,8 +350,11 @@ export function storeVisit(page, throws, sum, numDarts, outTries, inTries=0) {
} }
else { else {
// rest == 0 leg finished // rest == 0 leg finished
const newlegp = legPoints(page, set, leg);
const newlegp = legPoints(set, leg);
let winner = getWinner(newlegp, page.legs); let winner = getWinner(newlegp, page.legs);
console.log(winner);
if (winner == -1) { if (winner == -1) {
// new Leg // new Leg
addNewLeg(page); addNewLeg(page);
@ -355,6 +363,7 @@ export function storeVisit(page, throws, sum, numDarts, outTries, inTries=0) {
// new set? // new set?
const newsetp = setPoints(page, set); const newsetp = setPoints(page, set);
winner = getWinner(newsetp, page.sets); winner = getWinner(newsetp, page.sets);
console.log("Set", winner, newsetp, page.sets);
if (winner == -1) { if (winner == -1) {
// new Set // new Set
addNewSet(page); addNewSet(page);
@ -387,7 +396,6 @@ export function endGame(page){
export function extension(page){ export function extension(page){
const set = page.game.sets[page.game.sets.length-1]; const set = page.game.sets[page.game.sets.length-1];
const leg = set.legs[set.legs.length-1];
page.enddate = undefined; page.enddate = undefined;
// leg["points"] = newlegp; // leg["points"] = newlegp;
// new Leg // new Leg
@ -396,6 +404,34 @@ export function extension(page){
} }
export const getVal = (tr) => {
const val = tr.trim().toLowerCase();
if (val == "") {
return 0;
}
if (val == "sb") {
return 25;
}
if (val == "db" || val == "bull") {
return 50;
}
if (val[0] == "s" || val[0] == "o" || val[0] == "i") {
return parseFloat(val.substring(1));
}
if (val[0] == "d") {
return 2 * parseFloat(val.substring(1));
}
if (val[0] == "t") {
return 3 * parseFloat(val.substring(1));
}
if (val[0] == "m") {
return 0;
} else {
// TODO: Check for Na
return parseFloat(val);
}
}
///////////////////////////////////////// /////////////////////////////////////////
// GameProps // GameProps
///////////////////////////////////////// /////////////////////////////////////////
@ -448,7 +484,7 @@ export function getGameProps(page, current_set, current_leg) {
const current_leg_points = computed(() => { const current_leg_points = computed(() => {
if (current_set.value != undefined || current_leg.value != undefined) { if (current_set.value != undefined || current_leg.value != undefined) {
return legPoints(page, current_set.value, current_leg.value); return legPoints(current_set.value, current_leg.value);
} }
return undefined; return undefined;
}); });
@ -482,33 +518,7 @@ export function getGameProps(page, current_set, current_leg) {
}); });
ret.breaks = breaks; ret.breaks = breaks;
const getVal = (tr) => {
const val = tr.trim();
if (val == "") {
return 0;
}
if (val == "SB") {
return 25;
}
if (val == "DB") {
return 50;
}
if (val[0] == "S" || val[0] == "O" || val[0] == "I") {
return parseFloat(val.substring(1));
}
if (val[0] == "D") {
return 2 * parseFloat(val.substring(1));
}
if (val[0] == "T") {
return 3 * parseFloat(val.substring(1));
}
if (val[0] == "M") {
return 0;
} else {
// TODO: Check for Na
return parseFloat(val);
}
}
const verifySum = (sum) => { const verifySum = (sum) => {
if (sum > 180 || [179, 178, 176, 175, 173, 172, 169, 166, 163].indexOf(sum) > -1) { if (sum > 180 || [179, 178, 176, 175, 173, 172, 169, 166, 163].indexOf(sum) > -1) {
return -1; return -1;
@ -531,11 +541,23 @@ export function getGameProps(page, current_set, current_leg) {
const checkVisit = (throws) => { const checkVisit = (throws) => {
const tr = throws.split(","); const tr = throws.split(",");
let sum = 0; let sum = 0;
let numDarts = 0;
let fifty = current_toGo.value[current_scorer_idx.value] == 50;
let tries = 0;
tr.forEach((t, i) => { tr.forEach((t, i) => {
sum += getVal(t); const val = getVal(t);
let rest = current_toGo.value[current_scorer_idx.value] - sum;
if ((rest <= 40 && rest % 2 == 0) || (fifty && val != 18 && val != 10)){
tries += 1
fifty = false
} else if (rest == 50) {
fifty = true;
}
sum += val;
numDarts += 1
}); });
const res = verifySum(sum); const res = verifySum(sum);
return [res, sum]; return [res, sum, [numDarts, tries]];
} }
ret.checkVisit = checkVisit; ret.checkVisit = checkVisit;

@ -1,9 +1,10 @@
import { reactive, ref, computed, onMounted, toRaw } from "vue"; import { reactive, ref, computed, onMounted, onUnmounted, toRaw } from "vue";
import { getQuery, setKirby } from "../../kirby.js"; import { getQuery, setKirby } from "../../kirby.js";
import { handleActive, ArrowVerticalKeyHandler, ArrowHorizontalKeyHandler, NumberKeyHandler } from "../../handlers.js"; import { handleActive, ArrowVerticalKeyHandler, ArrowHorizontalKeyHandler, NumberKeyHandler } from "../../handlers.js";
import { overlayAndGet, powerStateMachine, overlayAndPop, popLastElem } from "../../componentPromise.js"; import { overlayAndGet, powerStateMachine, overlayAndPop, popLastElem } from "../../componentPromise.js";
import { autodartsState } from '../../websocket.js'
import { getGameProps, initGame, initStats, storeVisit, formatDate, removeLastVisit, extension, getFinalWinner, playerFromUUID } from "./logic.js"; import { getGameProps, initGame, initStats, storeVisit, formatDate, removeLastVisit, extension, getFinalWinner, getVal } from "./logic.js";
import { playSound } from '../../sound.js';
const html = (v) => { return v[0] }; const html = (v) => { return v[0] };
@ -69,9 +70,9 @@ const pregame = {
<div><span class="label">Scorer 1:</span><d-scorerElem v-index="active" @click="selectScorer(0)" :scorer="page.scorers[0]"></d-scorerElem></div> <div><span class="label">Scorer 1:</span><d-scorerElem v-index="active" @click="selectScorer(0)" :scorer="page.scorers[0]"></d-scorerElem></div>
<div><span class="label">Scorer 2:</span><d-scorerElem v-index="active" @click="selectScorer(1)" :scorer="page.scorers[1]"></d-scorerElem></div> <div><span class="label">Scorer 2:</span><d-scorerElem v-index="active" @click="selectScorer(1)" :scorer="page.scorers[1]"></d-scorerElem></div>
<div><span class="label">X01:</span><d-plainElem v-index="active" @click="selectX01()" :text="page.modus"></d-plainElem></div> <!-- <div><span class="label">X01:</span><d-plainElem v-index="active" @click="selectX01()" :text="page.modus"></d-plainElem></div> -->
<div><span class="label">In:</span><d-plainElem v-index="active" @click="selectIn()" :text="page.in"></d-plainElem></div> <!-- <div><span class="label">In:</span><d-plainElem v-index="active" @click="selectIn()" :text="page.in"></d-plainElem></div> -->
<!-- <div><span class="label">Best of Sets:</span><d-inputElem v-index="active" v-model="page.sets"></d-inputElem></div> --> <div><span class="label">Best of Sets:</span><d-inputElem v-index="active" v-model="page.sets"></d-inputElem></div>
<div><span class="label">Best of Legs (per Set):</span><d-inputElem v-index="active" v-model="page.legs"></d-inputElem></div> <div><span class="label">Best of Legs (per Set):</span><d-inputElem v-index="active" v-model="page.legs"></d-inputElem></div>
<div><d-plainElem text="Start" v-index="active" @click="$emit('resolve', page)"></d-plainElem></div> <div><d-plainElem text="Start" v-index="active" @click="$emit('resolve', page)"></d-plainElem></div>
</div> </div>
@ -358,7 +359,7 @@ const game = {
} }
const gameinput = { const gameinput = {
props: ['input','active', 'stack'], props: ['input','active', 'stack', 'toGo'],
setup(props, context) { setup(props, context) {
handleActive(props, []); handleActive(props, []);
const check_remove = (event) => { const check_remove = (event) => {
@ -367,6 +368,55 @@ const gameinput = {
context.emit('reject', -2); context.emit('reject', -2);
} }
} }
let inputtext = ref(props.input || "")
// if (websocket){
let throwdetect = (event) => {
if (event.detail.data.event == "Takeout started"){
return
}
if (event.detail.data.event == "Takeout finished" && inputtext.value != "" && inputtext.value != undefined && inputtext.value != NaN){
context.emit('resolve', inputtext.value);
return
}
let throws = event.detail.data.throws;
if (!throws){
return
}
const scored = throws.at(-1).segment.name
if (throws.length == 1) {
inputtext.value = scored;
} else {
inputtext.value += "," + scored
}
const tr = inputtext.value.split(",");
let sum = 0;
tr.forEach((t, i) => {
sum += getVal(t);
});
if (props.toGo - sum == 0 && scored.startsWith("D")) {
playSound("game_shot");
return
}
if (props.toGo - sum <= 1) {
playSound("0");
return
}
if (throws.length == 3) {
playSound(""+sum);
}
};
onMounted(() => {
document.body.addEventListener("autodarts", throwdetect);
if (props.toGo < 170 && [169, 168, 166, 165, 163, 162, 159].indexOf(props.toGo) == -1) {
playSound("require_"+ props.toGo);
}
})
onUnmounted(() => document.body.removeEventListener("autodarts", throwdetect))
// }
const keyhandler = (e) => { const keyhandler = (e) => {
if (e.key == "F1" || e.keyCode == 112) { if (e.key == "F1" || e.keyCode == 112) {
e.preventDefault(); e.preventDefault();
@ -384,12 +434,11 @@ const gameinput = {
e.preventDefault(); e.preventDefault();
context.emit('resolve', -1*parseFloat(e.target.value)); context.emit('resolve', -1*parseFloat(e.target.value));
} }
} }
return { check_remove, keyhandler } return { check_remove, keyhandler, inputtext }
}, },
template: html` template: html`
<input v-index="active" :value="input" @keydown="keyhandler" @keydown.enter.stop="$emit('resolve', $event.target.value)" @keydown.backspace="check_remove($event)"> <input v-index="active" v-model="inputtext" @keydown="keyhandler" @keydown.enter.stop="$emit('resolve', inputtext)" @keydown.backspace="check_remove($event)">
` `
} }
@ -409,6 +458,7 @@ const xoi = {
const leg_id = ref(props.page.game.sets[set_id.value].legs.length - 1); const leg_id = ref(props.page.game.sets[set_id.value].legs.length - 1);
let current_stat; let current_stat;
if (props.inspect) { if (props.inspect) {
handleActive(props, [ArrowHorizontalKeyHandler]);
current_set = computed(() => props.page.game.sets[set_id.value]); current_set = computed(() => props.page.game.sets[set_id.value]);
current_leg = computed(() => current_set.value.legs[leg_id.value]); current_leg = computed(() => current_set.value.legs[leg_id.value]);
current_stat = computed(() => props.page.stats?.sets[set_id.value].legs[leg_id.value]); current_stat = computed(() => props.page.stats?.sets[set_id.value].legs[leg_id.value]);
@ -423,7 +473,9 @@ const xoi = {
const computedProps = getGameProps(props.page, current_set, current_leg); const computedProps = getGameProps(props.page, current_set, current_leg);
if (!props.inspect) { if (!props.inspect) {
current_stat = computed( () => props.page.stats?.sets[props.page.stats.sets.length-1].legs[computedProps.current_set.value.legs.length-1]); current_stat = computed( () => {
return props.page.stats?.sets[props.page.stats.sets.length-1].legs[computedProps.current_set.value.legs.length-1];
});
} }
const mounted = onMounted(async () => { const mounted = onMounted(async () => {
@ -437,10 +489,10 @@ const xoi = {
} }
} }
}) })
return { ...computedProps, set_id, leg_id, gamestack, inspectstack, current_stat } return { ...computedProps, set_id, leg_id, gamestack, inspectstack, current_stat, autodartsState}
}, },
template: html` template: html`
<div class="xoi"> <div class="xoi" :class="autodartsState.status">
<div class="bigToGo one" :class="{'active' : current_scorer_idx==0 }">{{ current_toGo[0] }}</div> <div class="bigToGo one" :class="{'active' : current_scorer_idx==0 }">{{ current_toGo[0] }}</div>
<d-score :page="page" :justlegs="page && page.sets == 1" :current_set_points="current_set_points" :current_leg_points="current_leg_points"></d-score> <d-score :page="page" :justlegs="page && page.sets == 1" :current_set_points="current_set_points" :current_leg_points="current_leg_points"></d-score>
<div class="bigToGo two" :class="{'active' : current_scorer_idx==1 }">{{ current_toGo[1] }}</div> <div class="bigToGo two" :class="{'active' : current_scorer_idx==1 }">{{ current_toGo[1] }}</div>
@ -450,10 +502,10 @@ const xoi = {
</d-game> </d-game>
<d-scorer class="scorer2" :page="page" :id="1" :current_stat="current_stat" :current_leg="current_leg"></d-scorer> <d-scorer class="scorer2" :page="page" :id="1" :current_stat="current_stat" :current_leg="current_leg"></d-scorer>
<div class="nav" v-if="inspect"> <div class="nav" v-if="inspect">
<span class="label" v-if="page.sets != 1">Set:</span><d-plainElem :text="set_id+1" v-if="page.sets != 1" v-index="active" @click="set_id = (set_id+1)%page.game.sets.length; leg_id=0"></d-plainElem><span class="label">Leg:</span><d-plainElem style="padding:0.2em 0.5em" :text="leg_id+1" v-index="active" v-autofocus="true" @click="leg_id = (leg_id+1)%current_set.legs.length"></d-plainElem> <span class="label" v-if="page.sets != 1">Set:</span><d-plainElem style="padding:0.2em 0.5em" :text="set_id+1" v-if="page.sets != 1" v-index="active" @click="set_id = (set_id+1)%page.game.sets.length; leg_id=0"></d-plainElem><span class="label">Leg:</span><d-plainElem style="padding:0.2em 0.5em" :text="leg_id+1" v-index="active" v-autofocus="true" @click="leg_id = (leg_id+1)%current_set.legs.length"></d-plainElem>
</div> </div>
<div class="nav" v-if="!!!inspect"> <div class="nav" v-if="!!!inspect">
<span>Shortkeys:</span><span>60 (F1)</span><span>45 (F2)</span><span>41 (F3)</span><span>26 (F4)</span> <span>Shortkeys:</span><span>60 (F1)</span><span>45 (F2)</span><span>41 (F3)</span><span>26 (F4)</span><span>{{ autodartsState.status}}</span>
</div> </div>
</div> </div>
` `
@ -704,10 +756,11 @@ const gameStateMachine = (gamestack, stack, page, computedProps) => {
1: async (input, reGet) => { 1: async (input, reGet) => {
// Normal Game Loop // Normal Game Loop
// Get Game Input // Get Game Input
let [visit, error] = await overlayAndPop("d-gameinput", { input: input }, gamestack); const toGo = computedProps.current_toGo.value[computedProps.current_scorer_idx.value * 1]
let [visit, error] = await overlayAndPop("d-gameinput", { input: input, toGo: toGo}, gamestack);
if (parseFloat(visit) < 0 ){ if (parseFloat(visit) < 0 ){
visit = ""+(computedProps.current_toGo.value[computedProps.current_scorer_idx.value * 1] - parseFloat(visit)*-1); visit = ""+(computedProps.current_toGo.value[computedProps.current_scorer_idx.value * 1] + parseFloat(visit));
} }
// back/delete last throw // back/delete last throw
if (error != undefined) { if (error != undefined) {
@ -722,15 +775,21 @@ const gameStateMachine = (gamestack, stack, page, computedProps) => {
// Validate throw // Validate throw
let numDarts, tries; let numDarts, tries;
const [ret, sum] = computedProps.checkVisit(visit); const [ret, sum, extra] = computedProps.checkVisit(visit);
[numDarts, tries] = extra;
const manual = !(visit.split(",").length > 1) && !visit.toLowerCase().startsWith("s") && !visit.toLowerCase().startsWith("d") && !visit.toLowerCase().startsWith("t") && !visit.toLowerCase().startsWith("b")
console.log(manual);
if (ret == -1) { if (ret == -1) {
// Impossible // Impossible
const [_, error] = await overlayAndPop("d-dialog", impossibleDialog(sum), stack); const [_, error] = await overlayAndPop("d-dialog", impossibleDialog(sum), stack);
return [1, visit]; return [1, visit];
} else if (ret == -2) { } else if (ret == -2) {
// Bust TODO // Bust TODO
const [_, error] = await overlayAndPop("d-dialog", impossibleDialog(sum), stack); // const [_, error] = await overlayAndPop("d-dialog", impossibleDialog(sum), stack);
return [1, visit]; storeVisit(page, visit.split(","), 0, 3, 0);
saveGame(page);
return [1, undefined];
} else if (ret == 3) { } else if (ret == 3) {
// Checkins // Checkins
const [ret, error] = await overlayAndPop("d-dialog", numCheckinTriesDialog(3), stack); const [ret, error] = await overlayAndPop("d-dialog", numCheckinTriesDialog(3), stack);
@ -745,10 +804,10 @@ const gameStateMachine = (gamestack, stack, page, computedProps) => {
storeVisit(page, visit.split(","), sum, 3, 0); storeVisit(page, visit.split(","), sum, 3, 0);
saveGame(page); saveGame(page);
return [1, undefined] return [1, undefined]
} else if (ret == 0) { } else if (ret == 0 && manual) {
// Checkout: Ask for num Darts // Checkout: Ask for num Darts
[numDarts, tries] = await powerStateMachine(checkoutPipeline(stack), stack, /*initState=*/0, /*initInput=*/sum); [numDarts, tries] = await powerStateMachine(checkoutPipeline(stack), stack, /*initState=*/0, /*initInput=*/sum);
} else if (ret == 1) { } else if (ret == 1 && manual) {
// <=50: Ask for checkout tries // <=50: Ask for checkout tries
[numDarts, tries] = await powerStateMachine(checkoutPipeline(stack), stack, /*initState=*/1, /*initInput=*/[3,0]); [numDarts, tries] = await powerStateMachine(checkoutPipeline(stack), stack, /*initState=*/1, /*initInput=*/[3,0]);
} }
@ -758,9 +817,12 @@ const gameStateMachine = (gamestack, stack, page, computedProps) => {
return [1, visit]; return [1, visit];
} else { } else {
const points = storeVisit(page, visit.split(","), sum, numDarts, tries); const points = storeVisit(page, visit.split(","), sum, numDarts, tries);
console.log(points);
if (points){ if (points){
// Game Over // Game Over
const winner = getFinalWinner(page); const winner = getFinalWinner(page);
let name = "DRAW" let name = "DRAW"
if (winner != -2){ if (winner != -2){
name = page.scorers[winner].member.map((p) => p.forename).join(" + "); name = page.scorers[winner].member.map((p) => p.forename).join(" + ");
@ -877,6 +939,7 @@ const stateMachine = (stack, page) => {
const ret = await savePregame(page); const ret = await savePregame(page);
return [2, page]; return [2, page];
} }
await reloadGame(page);
return [4, result]; return [4, result];
}, },
4: async (winnerUUID, reGet) => { 4: async (winnerUUID, reGet) => {

@ -1,12 +1,11 @@
import { reactive, ref } from "vue";
export function connect(endpoint, callback){ export function connect(endpoint, callback){
const socket = new WebSocket("ws://localhost:4040/subscribe"); const socket = new WebSocket(endpoint);
// Connection opened // Connection opened
socket.addEventListener("open", (event) => { socket.addEventListener("open", (event) => {
socket.send(JSON.stringify({ console.log("Connection open");
"action": "subscribe",
"value": endpoint
}));
}); });
// Listen for messages // Listen for messages
@ -16,3 +15,7 @@ export function connect(endpoint, callback){
socket.close(); socket.close();
}; };
} }
export let autodartsState = reactive({
status: null
})

@ -26,11 +26,54 @@
app.component("d-renderer", renderer); app.component("d-renderer", renderer);
app.mount('main') app.mount('main')
</script> </script>
<!-- <script type="module"> <script type="module">
import { connect } from "<?= asset("assets/js/websocket.js") ?>"; import { connect, autodartsState } from "<?= asset("assets/js/websocket.js") ?>";
connect("<?= $page->id() ?>", (event) => {
console.log("Message from server ", JSON.parse(event.data));
});
</script> -->
document.addEventListener("keydown", (event) => {
if (event.key == "F6"){
event.preventDefault();
fetch('http://localhost:3180/api/reset', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
})
}
if (event.key == "F7"){
event.preventDefault();
fetch('http://localhost:3180/api/start', {
method: 'PUT',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
})
}
if (event.key == "F8"){
event.preventDefault();
fetch('http://localhost:3180/api/stop', {
method: 'PUT',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
})
}
if (event.key == "u"){
event.preventDefault();
connect("ws://localhost:3180/api/events", (event) => {
let data = JSON.parse(event.data);
if(data.type == "state"){
autodartsState.status = data.data.status;
const evt = new CustomEvent("autodarts", {detail: data});
document.body.dispatchEvent(evt);
console.log("Message from server ", data);
console.log(autodartsState.status);
}
});
}
});
</script>
<?php snippet("footer") ?> <?php snippet("footer") ?>

Loading…
Cancel
Save