add sound and set mode

main
Ugo Finnendahl 13 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. 120
      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;
}
}
.sidebyside{
display: flex;
& > * {
flex-grow: 1;
flex-basis: 1;
}
}
}
.playerselect{
& > h2{
@ -447,7 +454,12 @@ body.xoi{
"navi navi navi navi navi"
;
background-color: black;
&.Throw{
box-shadow: 0px 0px 2rem 2rem green;
}
&.Takeout{
box-shadow: 0px 0px 2rem 2rem orange;
}
.bigToGo{
margin: $line;
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,31 +6,34 @@ import { computed } from "vue";
function setPoints(page, set){
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) {
const set = page.game.sets[i];
const points = legPoints(page, set, set.legs[set.legs.length-1]);
const winner = getWinner(points, page.legs);
const s = page.game.sets[i];
const p = legPoints(s, s.legs[s.legs.length-1]);
const winner = getWinner(p, page.legs);
if (winner > -1)
points[winner] += 1;
else
else if (winner == -2) {
points[0] += 0.5;
points[1] += 0.5;
} else
return points;
if (set == set){
if (s == set){
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 ret;
const m = set.legs.length-1;
for (const i in set.legs) {
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;
}
if (l.visits[l.visits.length-1].toGo[0] == 0)
@ -61,8 +64,9 @@ function newPlayerStats(player) {
}
function addNewSetStats(stats, scorers) {
stats["sets"].push(newStats(scorers));
stats["sets"][0]["legs"] = [];
const s = newStats(scorers)
s["legs"] = [];
stats["sets"].push(s);
return stats;
}
@ -142,7 +146,6 @@ function addNewLeg(page){
const set = page.game.sets[page.game.sets.length-1];
const leg = set.legs[set.legs.length-1];
const k = player2scorer(page)[leg.visits[0].player];
console.log(k, k+1);
const p = page.scorers[(k+1)%2].member[0].uuid;
page.game.sets[page.game.sets.length-1].legs.push({
@ -187,6 +190,7 @@ export function initGame(page) {
function updateStats(page, visit){
const playerUUIDs = allPlayers(page).map((p) => p.uuid);
const p = player2scorer(page)[visit.player];
const k = playerUUIDs.indexOf(visit.player);
const todos = [page.stats["stats"][k]];
@ -200,7 +204,7 @@ function updateStats(page, visit){
todos[i]["first9"][0] += visit["sum"];
todos[i]["first9"][1] += visit["numDarts"];
}
if (visit["toGo"][k] == 0) {
if (visit["toGo"][p] == 0) {
todos[i]["checkouts"][0] += 1;
todos[i]["checkoutPoints"].push(visit["sum"]);
}
@ -277,6 +281,7 @@ export function recalcStats(page){
});
if (j == lastleg && i != lastset) {
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 {
// rest == 0 leg finished
const newlegp = legPoints(page, set, leg);
const newlegp = legPoints(set, leg);
let winner = getWinner(newlegp, page.legs);
console.log(winner);
if (winner == -1) {
// new Leg
addNewLeg(page);
@ -355,6 +363,7 @@ export function storeVisit(page, throws, sum, numDarts, outTries, inTries=0) {
// new set?
const newsetp = setPoints(page, set);
winner = getWinner(newsetp, page.sets);
console.log("Set", winner, newsetp, page.sets);
if (winner == -1) {
// new Set
addNewSet(page);
@ -387,7 +396,6 @@ export function endGame(page){
export function extension(page){
const set = page.game.sets[page.game.sets.length-1];
const leg = set.legs[set.legs.length-1];
page.enddate = undefined;
// leg["points"] = newlegp;
// 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
/////////////////////////////////////////
@ -448,7 +484,7 @@ export function getGameProps(page, current_set, current_leg) {
const current_leg_points = computed(() => {
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;
});
@ -482,33 +518,7 @@ export function getGameProps(page, current_set, current_leg) {
});
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) => {
if (sum > 180 || [179, 178, 176, 175, 173, 172, 169, 166, 163].indexOf(sum) > -1) {
return -1;
@ -528,16 +538,28 @@ export function getGameProps(page, current_set, current_leg) {
return 2;
}
const checkVisit = (throws) => {
const checkVisit = (throws) => {
const tr = throws.split(",");
let sum = 0;
let numDarts = 0;
let fifty = current_toGo.value[current_scorer_idx.value] == 50;
let tries = 0;
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);
return [res, sum];
return [res, sum, [numDarts, tries]];
}
ret.checkVisit = checkVisit;
return ret;
}
}

@ -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 { handleActive, ArrowVerticalKeyHandler, ArrowHorizontalKeyHandler, NumberKeyHandler } from "../../handlers.js";
import { overlayAndGet, powerStateMachine, overlayAndPop, popLastElem } from "../../componentPromise.js";
import { getGameProps, initGame, initStats, storeVisit, formatDate, removeLastVisit, extension, getFinalWinner, playerFromUUID } from "./logic.js";
import { autodartsState } from '../../websocket.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] };
@ -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 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">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">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">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><d-plainElem text="Start" v-index="active" @click="$emit('resolve', page)"></d-plainElem></div>
</div>
@ -358,7 +359,7 @@ const game = {
}
const gameinput = {
props: ['input','active', 'stack'],
props: ['input','active', 'stack', 'toGo'],
setup(props, context) {
handleActive(props, []);
const check_remove = (event) => {
@ -367,6 +368,55 @@ const gameinput = {
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) => {
if (e.key == "F1" || e.keyCode == 112) {
e.preventDefault();
@ -384,12 +434,11 @@ const gameinput = {
e.preventDefault();
context.emit('resolve', -1*parseFloat(e.target.value));
}
}
return { check_remove, keyhandler }
return { check_remove, keyhandler, inputtext }
},
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);
let current_stat;
if (props.inspect) {
handleActive(props, [ArrowHorizontalKeyHandler]);
current_set = computed(() => props.page.game.sets[set_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]);
@ -423,7 +473,9 @@ const xoi = {
const computedProps = getGameProps(props.page, current_set, current_leg);
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 () => {
@ -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`
<div class="xoi">
<div class="xoi" :class="autodartsState.status">
<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>
<div class="bigToGo two" :class="{'active' : current_scorer_idx==1 }">{{ current_toGo[1] }}</div>
@ -450,10 +502,10 @@ const xoi = {
</d-game>
<d-scorer class="scorer2" :page="page" :id="1" :current_stat="current_stat" :current_leg="current_leg"></d-scorer>
<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 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>
`
@ -704,10 +756,11 @@ const gameStateMachine = (gamestack, stack, page, computedProps) => {
1: async (input, reGet) => {
// Normal Game Loop
// 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 ){
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
if (error != undefined) {
@ -722,15 +775,21 @@ const gameStateMachine = (gamestack, stack, page, computedProps) => {
// Validate throw
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) {
// Impossible
const [_, error] = await overlayAndPop("d-dialog", impossibleDialog(sum), stack);
return [1, visit];
} else if (ret == -2) {
// Bust TODO
const [_, error] = await overlayAndPop("d-dialog", impossibleDialog(sum), stack);
return [1, visit];
// const [_, error] = await overlayAndPop("d-dialog", impossibleDialog(sum), stack);
storeVisit(page, visit.split(","), 0, 3, 0);
saveGame(page);
return [1, undefined];
} else if (ret == 3) {
// Checkins
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);
saveGame(page);
return [1, undefined]
} else if (ret == 0) {
} else if (ret == 0 && manual) {
// Checkout: Ask for num Darts
[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
[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];
} else {
const points = storeVisit(page, visit.split(","), sum, numDarts, tries);
console.log(points);
if (points){
// Game Over
const winner = getFinalWinner(page);
let name = "DRAW"
if (winner != -2){
name = page.scorers[winner].member.map((p) => p.forename).join(" + ");
@ -877,6 +939,7 @@ const stateMachine = (stack, page) => {
const ret = await savePregame(page);
return [2, page];
}
await reloadGame(page);
return [4, result];
},
4: async (winnerUUID, reGet) => {

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

@ -26,11 +26,54 @@
app.component("d-renderer", renderer);
app.mount('main')
</script>
<!-- <script type="module">
import { connect } from "<?= asset("assets/js/websocket.js") ?>";
connect("<?= $page->id() ?>", (event) => {
console.log("Message from server ", JSON.parse(event.data));
});
<script type="module">
import { connect, autodartsState } from "<?= asset("assets/js/websocket.js") ?>";
</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") ?>

Loading…
Cancel
Save