diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..3c6bd60 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +Js/Pixi.min.js diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..c92e89c --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,29 @@ +{ + "env": { + "browser": true, + "es6": true + }, + "extends": "eslint:recommended", + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly", + "PIXI": "readonly", + "UtageInfo": "readonly", + "TextFunctions": "readonly", + "Player": "readonly", + "Shaders": "readonly", + "baseDimensions": "readonly", + "commonFunctions": "readonly", + "audioController": "readonly" + }, + "parserOptions": { + "ecmaVersion": 2018, + "sourceType": "module" + }, + "rules": { + "no-console": "off", + "no-unused-vars": [2, { "vars": "local", "argsIgnorePattern": "^(success|event|resource|delta|reject)$"}], + "no-empty": ["error", { "allowEmptyCatch": true }], + "no-mixed-spaces-and-tabs": "off" + } +} diff --git a/.gitignore b/.gitignore index 7d9fd68..60674bd 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ web.config /Js/Typed /Js/[Pp]ixi.js +/Js/[Pp]ixi.js.map +/Js/[Pp]ixi.min.js.map /node_modules /Js/XduPlayer.js /Js/XduPlayer.min.js.map @@ -10,3 +12,4 @@ web.config /Dist /Css/main.min.css /Js/XduPlayer.min.js +/**/.*.swp \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 11fbc2a..2ce17f3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,8 @@ [submodule "Js/Translations"] path = Js/Translations - url = https://git.poweris.moe/xdutranslations.git + url = https://git.poweris.moe/yttt-xdu/xdutranslations.git + branch = master +[submodule "CustomData"] + path = CustomData + url = https://git.poweris.moe/yttt-xdu/customdata.git branch = . diff --git a/CHANGELOG.md b/CHANGELOG.md index f2c525c..d5b8181 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,4 +14,37 @@ Added null check for pixi sprite calculateverticies because it sometimes makes a DPI is now taken into account when resizing. Added credits to mission modal. Added ability to go fullscreen. -Missions JSON moved to translations submodule so missions can be added/enabled without disturbing main project. \ No newline at end of file +Missions JSON moved to translations submodule so missions can be added/enabled without disturbing main project. + +## V1.2.1 (2018-12-29) + +Custom asset support +Russian language support +Fix translation fallback + +## V1.2.2 (2019-01-20) + +Add language url parameter +Fix noise\_disappearance commands + +## V1.3.0 (2019-05-13) + +Macro support +DivaMovie +Changed metadata to include quests +Per-language quest enabling +Sort scenes into quests to reduce clutter +Preserve ColorTo tinting properly +urlparam: questSceneMstId + +## V1.3.1 (2019-06-09) + +Fix MoveCamera macro + +## V1.4.0 (2019-09-29) + +Updated Pixi.js to v5 + +## V1.5.0 (2020-07-31) + +XDU Global support diff --git a/Css/generic.min.css b/Css/generic.min.css index fb2a566..08dcf65 100644 --- a/Css/generic.min.css +++ b/Css/generic.min.css @@ -1 +1 @@ -html{font-size:16px;font-family:arial;background-color:#393939;color:rgba(255,255,255,.7)}html body{border-color:rgba(255,255,255,.2)}html body a{color:#0096cf}html body a:not([href]){text-decoration:underline;cursor:pointer}html body .hover-span{color:#0096cf}.fade-in{opacity:0;transition:opacity .5s} \ No newline at end of file +html{font-size:16px;font-family:arial;background-color:#393939;color:rgba(255,255,255,.7)}html body{border-color:rgba(255,255,255,.2)}html body a{color:#0096cf}html body a:not([href]){text-decoration:underline;cursor:pointer}html body .hover-span{color:#0096cf}.fade-in{opacity:0;transition:opacity .5s}.centered{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center} \ No newline at end of file diff --git a/Css/main.css b/Css/main.css index af07dd0..779762e 100644 --- a/Css/main.css +++ b/Css/main.css @@ -35,10 +35,20 @@ } @font-face { - font-family: SourceCodePro-Regular; - src: url(../Fonts/SourceCodePro-Regular.woff2) format('woff'); + font-family: Orbitron-Medium; + src: url(../Fonts/Orbitron Medium.woff2) format('woff'); } +@font-face { + font-family: PTSans; + src: url(../Fonts/PTSans.woff2) format('woff'); +} + +/*@font-face { + font-family: SourceSansVariable-Roman; + src: url(../Fonts/SourceSansVariable-Roman.woff2) format('woff'); +}*/ + @-webkit-keyframes smallbounce { from { transform: translate(0, 5px); } to { transform: translate(0, -5px); } @@ -52,22 +62,30 @@ to { transform: translate(0, -5px); } } -body { margin: 0; } +html { height: 100%; } + +body { margin: 0; height: 100%; } .flex-grow { flex-grow: 1; } -.centered { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); text-align: center; } - .hidden { opacity: 0; } .shown { opacity: 0; } #app-container { position: relative; width: 1334px; height: 750px; display: flex; justify-content: center; align-items: center; } -#parent-container { display: flex; flex-direction: column; align-items: center; } +#parent-container { height: 100%; display: flex; flex-direction: column; align-items: center; } #text-container { color: white; position: absolute; margin: auto; height: 750px; width: 1334px; font-family: 'FOT-RodinNTLGPro'; } +#text-container.eng { font-family: 'FOT-RodinNTLGPro'; } + +#text-container.jpn { font-family: 'FOT-RodinNTLGPro'; } + +#text-container.rus { font-family: 'PTSans'; } + +#text-container.cze { font-family: 'PTSans'; } + #text-container #fullscreen-button { position: absolute; top: 0.5rem; left: 0.5rem; font-size: 30px; line-height: 30px; opacity: 0.35; z-index: 11; } #text-container #title { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); text-align: center; font-size: 20px; transition: opacity 0.3s; cursor: default; user-select: none; } @@ -104,11 +122,13 @@ body { margin: 0; } #dialog-scroll img { height: 35px; } -#title-container { margin-bottom: 2px; } +#title-container { padding: 2px 0; } -#other-controls-container { display: flex; width: 550px; justify-content: center; align-items: center; z-index: 10; } +#other-controls-container { padding-bottom: 4px; display: flex; width: 100%; justify-content: center; align-items: center; z-index: 10; } -#select-mission { min-width: 0; } +#select-quest { min-width: 0; width: 25% } + +#select-scene { min-width: 0; width: 25% } #select-language { margin-left: 10px; } @@ -138,6 +158,12 @@ body { margin: 0; } #modal-buttons { bottom: 0; margin-top: auto; width: 100%; display: flex; justify-content: space-between; min-height: 21px; } +#mission-modal .follow-links { margin-top: auto; display: flex; flex-direction: column; text-align: center; width:100%; } + +#mission-modal .follow-links .follow-links-header { font-weight: bold; } + +#mission-modal .follow-links .follow-links-links { display: flex; flex-direction: row; justify-content: space-around; margin-top: 5px; } + @media screen and (max-width: 812px) { #modal-container { top: 0; bottom: 0; left: 0; right: 0; transform: none; } .modal { width: 100%; height: 100%; border-radius: 0; } @@ -151,4 +177,4 @@ body { margin: 0; } @media screen and (max-height: 600px) { #mission-modal #mission-detail { display: none; } #mission-modal #mission-icon { display: block; max-height: 20%; margin: 10px 0 10px 0; object-fit: contain; } -} \ No newline at end of file +} diff --git a/CustomData b/CustomData new file mode 160000 index 0000000..e92af8f --- /dev/null +++ b/CustomData @@ -0,0 +1 @@ +Subproject commit e92af8f0d0c0d4246e44dd0b63508f9e460fe3a8 diff --git a/Js/Audio.js b/Js/Audio.js index 8a6c748..bb1c33b 100644 --- a/Js/Audio.js +++ b/Js/Audio.js @@ -1,5 +1,4 @@ //(Math.exp(x)-1)/(Math.E-1) -//🔊 class bufferLoader { constructor(context, soundMap, callback) { @@ -182,4 +181,4 @@ class audioController { } this.sources = {}; } -} \ No newline at end of file +} diff --git a/Js/BgmLoop.json b/Js/BgmLoop.json deleted file mode 100644 index ff86d76..0000000 --- a/Js/BgmLoop.json +++ /dev/null @@ -1,899 +0,0 @@ -{ - "bgm_adv_battle_01": { - "duration": 93.01484375, - "loop_end": { - "samples_48k": 4464640, - "samples_native": 2976427, - "seconds": 93.01334375 - }, - "loop_start": { - "samples_48k": 543504, - "samples_native": 362336, - "seconds": 11.323 - } - }, - "bgm_adv_comical_01": { - "duration": 57.7235625, - "loop_end": { - "samples_48k": 2770663, - "samples_native": 1847109, - "seconds": 57.72215625 - }, - "loop_start": { - "samples_48k": 250656, - "samples_native": 167104, - "seconds": 5.222 - } - }, - "bgm_adv_emergency_01": { - "duration": 98.295, - "loop_end": { - "samples_48k": 4718094, - "samples_native": 3145396, - "seconds": 98.293625 - }, - "loop_start": { - "samples_48k": 1304784, - "samples_native": 869856, - "seconds": 27.183 - } - }, - "bgm_adv_everyday_01": { - "duration": 75.8483125, - "loop_end": { - "samples_48k": 3640636, - "samples_native": 2427091, - "seconds": 75.84659375 - }, - "loop_start": { - "samples_48k": 349200, - "samples_native": 232800, - "seconds": 7.275 - } - }, - "bgm_adv_everyday_02": { - "duration": 70.43615625, - "loop_end": { - "samples_48k": 3380871, - "samples_native": 2253914, - "seconds": 70.4348125 - }, - "loop_start": { - "samples_48k": 588144, - "samples_native": 392096, - "seconds": 12.253 - } - }, - "bgm_adv_everyday_03": { - "duration": 78.99671875, - "loop_end": { - "samples_48k": 3791752, - "samples_native": 2527835, - "seconds": 78.99484375 - }, - "loop_start": { - "samples_48k": 436416, - "samples_native": 290944, - "seconds": 9.092 - } - }, - "bgm_adv_highlight_01": { - "duration": 97.1335, - "loop_end": { - "samples_48k": 4662328, - "samples_native": 3108219, - "seconds": 97.13184375 - }, - "loop_start": { - "samples_48k": 473232, - "samples_native": 315488, - "seconds": 9.859 - } - }, - "bgm_adv_highlight_02": { - "duration": 76.46521875, - "loop_end": { - "samples_48k": 3670234, - "samples_native": 2446823, - "seconds": 76.46321875 - }, - "loop_start": { - "samples_48k": 648768, - "samples_native": 432512, - "seconds": 13.516 - } - }, - "bgm_adv_highlight_03": { - "duration": 109.82465625, - "loop_end": { - "samples_48k": 5271502, - "samples_native": 3514335, - "seconds": 109.82296875 - }, - "loop_start": { - "samples_48k": 1476672, - "samples_native": 984448, - "seconds": 30.764 - } - }, - "bgm_adv_peace_01": { - "duration": 83.74309375, - "loop_end": { - "samples_48k": 4019584, - "samples_native": 2679723, - "seconds": 83.74134375 - }, - "loop_start": { - "samples_48k": 541344, - "samples_native": 360896, - "seconds": 11.278 - } - }, - "bgm_adv_sorrow_01": { - "duration": 75.9431875, - "loop_end": { - "samples_48k": 3645204, - "samples_native": 2430136, - "seconds": 75.94175 - }, - "loop_start": { - "samples_48k": 975936, - "samples_native": 650624, - "seconds": 20.332 - } - }, - "bgm_adv_tension_01": { - "duration": 66.506, - "loop_end": { - "samples_48k": 3192193, - "samples_native": 2128129, - "seconds": 66.50403125 - }, - "loop_start": { - "samples_48k": 411504, - "samples_native": 274336, - "seconds": 8.573 - } - }, - "bgm_home_01": { - "duration": 76.73034375, - "loop_end": { - "samples_48k": 3682962, - "samples_native": 2455308, - "seconds": 76.728375 - }, - "loop_start": { - "samples_48k": 850176, - "samples_native": 566784, - "seconds": 17.712 - } - }, - "bgm_raid_01": { - "duration": 111.7009375, - "loop_end": { - "samples_48k": 5361571, - "samples_native": 3574381, - "seconds": 111.69940625 - }, - "loop_start": { - "samples_48k": 1110144, - "samples_native": 740096, - "seconds": 23.128 - } - }, - "jingle_gacha": { - "duration": 15.652, - "loop_end": { - "samples_48k": 751200, - "samples_native": 500800, - "seconds": 15.65 - }, - "loop_start": { - "samples_48k": 290400, - "samples_native": 193600, - "seconds": 6.05 - } - }, - "musicBase": { - "duration": 86.40134375, - "loop_end": { - "samples_48k": 4147201, - "samples_native": 2764801, - "seconds": 86.40003125 - }, - "loop_start": { - "samples_48k": 0, - "samples_native": 0, - "seconds": 0.0 - } - }, - "music_apple": { - "duration": 86.01065625, - "loop_end": { - "samples_48k": 4128439, - "samples_native": 2752293, - "seconds": 86.00915625 - }, - "loop_start": { - "samples_48k": 0, - "samples_native": 0, - "seconds": 0.0 - } - }, - "music_asu_no_gaika": { - "duration": 89.30321875, - "loop_end": { - "samples_48k": 4286482, - "samples_native": 2857655, - "seconds": 89.30171875 - }, - "loop_start": { - "samples_48k": 961632, - "samples_native": 641088, - "seconds": 20.034 - } - }, - "music_beyond_the_blade": { - "duration": 107.07978125, - "loop_end": { - "samples_48k": 5139739, - "samples_native": 3426493, - "seconds": 107.07790625 - }, - "loop_start": { - "samples_48k": 1172256, - "samples_native": 781504, - "seconds": 24.422 - } - }, - "music_bye_bye_lullaby": { - "duration": 77.39109375, - "loop_end": { - "samples_48k": 3714693, - "samples_native": 2476462, - "seconds": 77.3894375 - }, - "loop_start": { - "samples_48k": 892320, - "samples_native": 594880, - "seconds": 18.59 - } - }, - "music_dangerous_sunshine": { - "duration": 99.20853125, - "loop_end": { - "samples_48k": 4761918, - "samples_native": 3174612, - "seconds": 99.206625 - }, - "loop_start": { - "samples_48k": 1238112, - "samples_native": 825408, - "seconds": 25.794 - } - }, - "music_dareka_no_tame_no_hikari": { - "duration": 108.5063125, - "loop_end": { - "samples_48k": 5208220, - "samples_native": 3472147, - "seconds": 108.50459375 - }, - "loop_start": { - "samples_48k": 2697264, - "samples_native": 1798176, - "seconds": 56.193 - } - }, - "music_edge_works_of_goddess_zababa": { - "duration": 91.3029375, - "loop_end": { - "samples_48k": 4382446, - "samples_native": 2921631, - "seconds": 91.30096875 - }, - "loop_start": { - "samples_48k": 1080480, - "samples_native": 720320, - "seconds": 22.51 - } - }, - "music_eiai_promise": { - "duration": 123.58634375, - "loop_end": { - "samples_48k": 5932080, - "samples_native": 3954720, - "seconds": 123.585 - }, - "loop_start": { - "samples_48k": 1861680, - "samples_native": 1241120, - "seconds": 38.785 - } - }, - "music_first_love_song": { - "duration": 104.9476875, - "loop_end": { - "samples_48k": 5037417, - "samples_native": 3358278, - "seconds": 104.9461875 - }, - "loop_start": { - "samples_48k": 585072, - "samples_native": 390048, - "seconds": 12.189 - } - }, - "music_fushichou_no_flamme": { - "duration": 129.0045, - "loop_end": { - "samples_48k": 6192121, - "samples_native": 4128081, - "seconds": 129.00253125 - }, - "loop_start": { - "samples_48k": 2669376, - "samples_native": 1779584, - "seconds": 55.612 - } - }, - "music_gekisou_gungnir": { - "duration": 100.545375, - "loop_end": { - "samples_48k": 4826109, - "samples_native": 3217406, - "seconds": 100.5439375 - }, - "loop_start": { - "samples_48k": 1120224, - "samples_native": 746816, - "seconds": 23.338 - } - }, - "music_gekisyou_infinity": { - "duration": 152.32209375, - "loop_end": { - "samples_48k": 7311394, - "samples_native": 4874263, - "seconds": 152.32071875 - }, - "loop_start": { - "samples_48k": 3361680, - "samples_native": 2241120, - "seconds": 70.035 - } - }, - "music_gekkabijin": { - "duration": 99.34246875, - "loop_end": { - "samples_48k": 4768356, - "samples_native": 3178904, - "seconds": 99.34075 - }, - "loop_start": { - "samples_48k": 1268592, - "samples_native": 845728, - "seconds": 26.429 - } - }, - "music_gekkou_no_tsurugi": { - "duration": 86.184875, - "loop_end": { - "samples_48k": 4136785, - "samples_native": 2757857, - "seconds": 86.18303125 - }, - "loop_start": { - "samples_48k": 833472, - "samples_native": 555648, - "seconds": 17.364 - } - }, - "music_genkaitoppa_g_beat": { - "duration": 121.08309375, - "loop_end": { - "samples_48k": 5811907, - "samples_native": 3874605, - "seconds": 121.08140625 - }, - "loop_start": { - "samples_48k": 1906128, - "samples_native": 1270752, - "seconds": 39.711 - } - }, - "music_genocide_saw": { - "duration": 95.9691875, - "loop_end": { - "samples_48k": 4606449, - "samples_native": 3070966, - "seconds": 95.9676875 - }, - "loop_start": { - "samples_48k": 1209408, - "samples_native": 806272, - "seconds": 25.196 - } - }, - "music_ginwan_airget_lamh": { - "duration": 99.313, - "loop_end": { - "samples_48k": 4766931, - "samples_native": 3177954, - "seconds": 99.3110625 - }, - "loop_start": { - "samples_48k": 1055424, - "samples_native": 703616, - "seconds": 21.988 - } - }, - "music_gohoushi_maidmode": { - "duration": 95.612125, - "loop_end": { - "samples_48k": 4589314, - "samples_native": 3059543, - "seconds": 95.61071875 - }, - "loop_start": { - "samples_48k": 1287408, - "samples_native": 858272, - "seconds": 26.821 - } - }, - "music_gokuren_igalima": { - "duration": 80.25296875, - "loop_end": { - "samples_48k": 3852064, - "samples_native": 2568043, - "seconds": 80.25134375 - }, - "loop_start": { - "samples_48k": 476784, - "samples_native": 317856, - "seconds": 9.933 - } - }, - "music_gun_bullet_xxx": { - "duration": 83.22640625, - "loop_end": { - "samples_48k": 3994797, - "samples_native": 2663198, - "seconds": 83.2249375 - }, - "loop_start": { - "samples_48k": 117312, - "samples_native": 78208, - "seconds": 2.444 - } - }, - "music_gyakkou_no_flugel": { - "duration": 114.43875, - "loop_end": { - "samples_48k": 5492964, - "samples_native": 3661976, - "seconds": 114.43675 - }, - "loop_start": { - "samples_48k": 1260816, - "samples_native": 840544, - "seconds": 26.267 - } - }, - "music_gyakkou_no_resolve": { - "duration": 111.3798125, - "loop_end": { - "samples_48k": 5346163, - "samples_native": 3564109, - "seconds": 111.37840625 - }, - "loop_start": { - "samples_48k": 1638576, - "samples_native": 1092384, - "seconds": 34.137 - } - }, - "music_hadakaninatte_natsu": { - "duration": 85.93515625, - "loop_end": { - "samples_48k": 4124794, - "samples_native": 2749863, - "seconds": 85.93321875 - }, - "loop_start": { - "samples_48k": 654768, - "samples_native": 436512, - "seconds": 13.641 - } - }, - "music_hajimarino_uta": { - "duration": 167.56865625, - "loop_end": { - "samples_48k": 8043231, - "samples_native": 5362154, - "seconds": 167.5673125 - }, - "loop_start": { - "samples_48k": 1400592, - "samples_native": 933728, - "seconds": 29.179 - } - }, - "music_hidamari_memoria": { - "duration": 107.5283125, - "loop_end": { - "samples_48k": 5161266, - "samples_native": 3440844, - "seconds": 107.526375 - }, - "loop_start": { - "samples_48k": 861504, - "samples_native": 574336, - "seconds": 17.948 - } - }, - "music_kimitoiu_otokanade_tsukirumade": { - "duration": 95.7555, - "loop_end": { - "samples_48k": 4596183, - "samples_native": 3064122, - "seconds": 95.7538125 - }, - "loop_start": { - "samples_48k": 845616, - "samples_native": 563744, - "seconds": 17.617 - } - }, - "music_koi_no_okehazama": { - "duration": 76.1594375, - "loop_end": { - "samples_48k": 3655587, - "samples_native": 2437058, - "seconds": 76.1580625 - }, - "loop_start": { - "samples_48k": 710064, - "samples_native": 473376, - "seconds": 14.793 - } - }, - "music_kono_ima_wo_ikite": { - "duration": 161.39909375, - "loop_end": { - "samples_48k": 7747063, - "samples_native": 5164709, - "seconds": 161.39715625 - }, - "loop_start": { - "samples_48k": 939792, - "samples_native": 626528, - "seconds": 19.579 - } - }, - "music_kyoushitsu_monochrome": { - "duration": 79.831625, - "loop_end": { - "samples_48k": 3831834, - "samples_native": 2554556, - "seconds": 79.829875 - }, - "loop_start": { - "samples_48k": 489168, - "samples_native": 326112, - "seconds": 10.191 - } - }, - "music_makenaiai_ga_kokoniaru": { - "duration": 93.74815625, - "loop_end": { - "samples_48k": 4499835, - "samples_native": 2999890, - "seconds": 93.7465625 - }, - "loop_start": { - "samples_48k": 1334880, - "samples_native": 889920, - "seconds": 27.81 - } - }, - "music_makyu_ichiibal": { - "duration": 81.071375, - "loop_end": { - "samples_48k": 3891351, - "samples_native": 2594234, - "seconds": 81.0698125 - }, - "loop_start": { - "samples_48k": 650016, - "samples_native": 433344, - "seconds": 13.542 - } - }, - "music_melodious_moonlight": { - "duration": 99.05025, - "loop_end": { - "samples_48k": 4754340, - "samples_native": 3169560, - "seconds": 99.04875 - }, - "loop_start": { - "samples_48k": 1230576, - "samples_native": 820384, - "seconds": 25.637 - } - }, - "music_nijiiro_no_flugel": { - "duration": 112.277, - "loop_end": { - "samples_48k": 5389231, - "samples_native": 3592821, - "seconds": 112.27565625 - }, - "loop_start": { - "samples_48k": 1157088, - "samples_native": 771392, - "seconds": 24.106 - } - }, - "music_orbital_beat": { - "duration": 74.67153125, - "loop_end": { - "samples_48k": 3584140, - "samples_native": 2389427, - "seconds": 74.66959375 - }, - "loop_start": { - "samples_48k": 1202976, - "samples_native": 801984, - "seconds": 25.062 - } - }, - "music_oukyo_sulsagana": { - "duration": 100.1548125, - "loop_end": { - "samples_48k": 4807359, - "samples_native": 3204906, - "seconds": 100.1533125 - }, - "loop_start": { - "samples_48k": 1065168, - "samples_native": 710112, - "seconds": 22.191 - } - }, - "music_over_killscythe_hell": { - "duration": 91.43084375, - "loop_end": { - "samples_48k": 4388601, - "samples_native": 2925734, - "seconds": 91.4291875 - }, - "loop_start": { - "samples_48k": 1212432, - "samples_native": 808288, - "seconds": 25.259 - } - }, - "music_practice_mode": { - "duration": 108.994625, - "loop_end": { - "samples_48k": 5231652, - "samples_native": 3487768, - "seconds": 108.99275 - }, - "loop_start": { - "samples_48k": 1314384, - "samples_native": 876256, - "seconds": 27.383 - } - }, - "music_ressou_gungnir": { - "duration": 141.42465625, - "loop_end": { - "samples_48k": 6788316, - "samples_native": 4525544, - "seconds": 141.42325 - }, - "loop_start": { - "samples_48k": 3042432, - "samples_native": 2028288, - "seconds": 63.384 - } - }, - "music_sakura_blizzard": { - "duration": 101.234875, - "loop_end": { - "samples_48k": 4859196, - "samples_native": 3239464, - "seconds": 101.23325 - }, - "loop_start": { - "samples_48k": 1204704, - "samples_native": 803136, - "seconds": 25.098 - } - }, - "music_santa_ga_machi_ni_yattekuru": { - "duration": 104.1534375, - "loop_end": { - "samples_48k": 4999269, - "samples_native": 3332846, - "seconds": 104.1514375 - }, - "loop_start": { - "samples_48k": 662304, - "samples_native": 441536, - "seconds": 13.798 - } - }, - "music_seigiwoshinjite_nigirishimete": { - "duration": 87.9635625, - "loop_end": { - "samples_48k": 4222179, - "samples_native": 2814786, - "seconds": 87.9620625 - }, - "loop_start": { - "samples_48k": 382512, - "samples_native": 255008, - "seconds": 7.969 - } - }, - "music_seiten_galaxy_cross": { - "duration": 126.5226875, - "loop_end": { - "samples_48k": 6073014, - "samples_native": 4048676, - "seconds": 126.521125 - }, - "loop_start": { - "samples_48k": 1793712, - "samples_native": 1195808, - "seconds": 37.369 - } - }, - "music_senkin_daurudabura": { - "duration": 110.1046875, - "loop_end": { - "samples_48k": 5284932, - "samples_native": 3523288, - "seconds": 110.10275 - }, - "loop_start": { - "samples_48k": 1316256, - "samples_native": 877504, - "seconds": 27.422 - } - }, - "music_senkin_daurudabura_test01": { - "duration": 82.6820625, - "loop_end": { - "samples_48k": 3968674, - "samples_native": 2645783, - "seconds": 82.68071875 - }, - "loop_start": { - "samples_48k": 0, - "samples_native": 0, - "seconds": 0.0 - } - }, - "music_senritsu_sorority": { - "duration": 162.176125, - "loop_end": { - "samples_48k": 7784385, - "samples_native": 5189590, - "seconds": 162.1746875 - }, - "loop_start": { - "samples_48k": 3414720, - "samples_native": 2276480, - "seconds": 71.14 - } - }, - "music_shinwasekai_karano_kyousyuu": { - "duration": 70.55734375, - "loop_end": { - "samples_48k": 3386688, - "samples_native": 2257792, - "seconds": 70.556 - }, - "loop_start": { - "samples_48k": 0, - "samples_native": 0, - "seconds": 0.0 - } - }, - "music_sorae": { - "duration": 128.56625, - "loop_end": { - "samples_48k": 6171114, - "samples_native": 4114076, - "seconds": 128.564875 - }, - "loop_start": { - "samples_48k": 2426880, - "samples_native": 1617920, - "seconds": 50.56 - } - }, - "music_stand_up_ready": { - "duration": 111.54221875, - "loop_end": { - "samples_48k": 5353941, - "samples_native": 3569294, - "seconds": 111.5404375 - }, - "loop_start": { - "samples_48k": 1302960, - "samples_native": 868640, - "seconds": 27.145 - } - }, - "music_the_moon_is_a_harsh_mistress": { - "duration": 96.8825, - "loop_end": { - "samples_48k": 4650280, - "samples_native": 3100187, - "seconds": 96.88084375 - }, - "loop_start": { - "samples_48k": 1302096, - "samples_native": 868064, - "seconds": 27.127 - } - }, - "music_trust_heart": { - "duration": 90.5468125, - "loop_end": { - "samples_48k": 4346170, - "samples_native": 2897447, - "seconds": 90.54521875 - }, - "loop_start": { - "samples_48k": 1176384, - "samples_native": 784256, - "seconds": 24.508 - } - }, - "music_waikyou_shenshoujin": { - "duration": 117.59053125, - "loop_end": { - "samples_48k": 5644249, - "samples_native": 3762833, - "seconds": 117.58853125 - }, - "loop_start": { - "samples_48k": 1612608, - "samples_native": 1075072, - "seconds": 33.596 - } - }, - "music_watashitoiu_otohibiki_sonosakini": { - "duration": 93.04259375, - "loop_end": { - "samples_48k": 4465980, - "samples_native": 2977320, - "seconds": 93.04125 - }, - "loop_start": { - "samples_48k": 716208, - "samples_native": 477472, - "seconds": 14.921 - } - }, - "music_zettou_amenohabakiri": { - "duration": 113.1419375, - "loop_end": { - "samples_48k": 5430724, - "samples_native": 3620483, - "seconds": 113.14009375 - }, - "loop_start": { - "samples_48k": 1179312, - "samples_native": 786208, - "seconds": 24.569 - } - } -} \ No newline at end of file diff --git a/Js/Common.js b/Js/Common.js index 4f0cb8e..31f73fb 100644 --- a/Js/Common.js +++ b/Js/Common.js @@ -4,6 +4,11 @@ let rootUrl = `${window.location.protocol}//${window.location.host}/`; const baseDimensions = {width: 1334, height: 750}; const screenRatio = 9/16; +const CUSTOM = { + custom: 'Custom', + stock: 'Stock' +} + class commonFunctions { static getFileText(file) { return new Promise((resolve, reject) => { @@ -334,8 +339,7 @@ class commonFunctions { if(props[i] == " ") { break; } retval.color += props[i]; } - retval.color = retval.color; } return retval; } -} \ No newline at end of file +} diff --git a/Js/Main.js b/Js/Main.js index 5ff9c78..7ba61db 100644 --- a/Js/Main.js +++ b/Js/Main.js @@ -2,7 +2,7 @@ const pixiApp = { app: new PIXI.Application(baseDimensions), - loader: PIXI.loader + loader: PIXI.Loader.shared }; const utage = new UtageInfo(); @@ -10,16 +10,17 @@ const shaders = new Shaders(); const textFunc = new TextFunctions(); let audio = undefined; //Cant create a audio context without user input. const player = new Player(pixiApp, utage, textFunc, audio, shaders); -const languages = ["eng", "jpn"]; -const version = "YameteTomete XDUPlayer V1.2.0"; +const languages = ["eng", "jpn", "rus", "cze", "enm", "kor", "zho"]; +const version = "YameteTomete XDUPlayer V1.5.0"; let bodyLoaded = false; let utageLoaded = false; let languagesLoaded = false; let selectedLang = "eng"; -let currentMission = undefined; -let currentMissionMst = 0; -let currentMissionIndex = 0; -let currentMissionList = []; +let currentScene = {}; +let currentSceneId = ""; +let scenePlaylist = []; +let currentPart = ""; +let partPlaylist = []; let urlParams = {}; let screenw = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); let screenh = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); @@ -27,16 +28,22 @@ let screenSizeTimeout = undefined; let isMuted = false; let volume = 0.5; let fullScreen = false; -let prevMission = '{Select}'; -const availableMstIds = [202070, 202071, 202013, 338001, 338002, 338003, 338004]//[202070, 202013, 338001, 338002, 338003, 338004, 338005, 338006, 338007, 338009, 338010, 338011]; +let prevScene = '{Select}'; +let prevQuest = '{Select}'; + +const emoji = { + LoudSound: String.fromCodePoint(0x1f50a), + Mute: String.fromCodePoint(0x1f507), + HeavyPlusSign: String.fromCodePoint(0x2795) +}; function onBodyLoaded() { bodyLoaded = true; document.getElementById("title-tag").innerText = version; document.addEventListener('webkitfullscreenchange', onFullScreenChange, false); - document.addEventListener('mozfullscreenchange', onFullScreenChange, false); - document.addEventListener('fullscreenchange', onFullScreenChange, false); - document.addEventListener('MSFullscreenChange', onFullScreenChange, false); + document.addEventListener('mozfullscreenchange', onFullScreenChange, false); + document.addEventListener('fullscreenchange', onFullScreenChange, false); + document.addEventListener('MSFullscreenChange', onFullScreenChange, false); } (function startLoad() { @@ -55,6 +62,7 @@ function onBodyLoaded() { (function checkIsLoaded() { if(bodyLoaded) { document.getElementById('loading-font').style.cssText = "display: none;"; + checkQueryParameters(); loadLocalStorage(); } if(utageLoaded && languagesLoaded) { @@ -70,7 +78,8 @@ function onBodyLoaded() { function onAllLoaded(success) { textFunc.findTextElements(); - buildMissionSelectList(); + buildQuestSelectList(); + buildSceneSelectList(); buildLanguageList(); let appContainer = document.getElementById('app-container'); appContainer.appendChild(pixiApp.app.view); @@ -96,15 +105,16 @@ function loadLocalStorage() { audio.mute(isMuted); } if(isMuted) { - document.getElementById('mute-button').innerText = "🔇"; + document.getElementById('mute-button').innerText = emoji.Mute; } else { - document.getElementById('mute-button').innerText = "🔊"; + document.getElementById('mute-button').innerText = emoji.LoudSound; } //language - let lang = localStorage.getItem('language') || "eng"; + let lang = urlParams['lang'] || localStorage.getItem('language') || "eng"; if(languages.includes(lang)) { selectedLang = lang; } + document.getElementById('text-container').className = selectedLang; utage.setTranslationLanguage(selectedLang, '') .then((success) => { languagesLoaded = true; @@ -117,27 +127,79 @@ function loadLocalStorage() { } } -function buildMissionSelectList() { - let selectBox = document.getElementById('select-mission'); - selectBox.innerHTML = ''; - for(let i = -1; i < utage.missionsList.length; ++i) { - let opt = document.createElement('option'); - if(i === -1) { +function buildQuestSelectList() { + let questBox = document.getElementById('select-quest'); + questBox.innerHTML = ''; + for (let i = -1; i < utage.questList.length; ++i) { + let opt = document.createElement('option') + if (i === -1) { opt.setAttribute('value', '{Select}'); - opt.innerText = 'Select Mission'; + opt.innerText = 'Select Event'; } else { - let m = utage.missionsList[i]; - if(!Object.keys(utage.groupedMissions[m.MstId].Missions).some((mis) => { return utage.groupedMissions[m.MstId].Missions[mis].Enabled === true })) { + let q = utage.questList[i]; + let cust = q.IsCustom ? CUSTOM.custom : CUSTOM.stock; + let name = q.Name; + let tl_key = utage.questTranslations[cust][q.QuestMstId]; + if (!tl_key) { + console.log("Failed to build quest list: missing translations"); continue; } - opt.setAttribute('value', m.MstId); - let name = m.Name; - if(utage.missionTranslations[m.MstId]) { - name = utage.missionTranslations[m.MstId].Name || name; + if (!tl_key.Enabled && !utage.quests[cust][q.QuestMstId].Scenes.some((s) => { return utage.sceneTranslations[cust][s].Enabled === true })) { + continue; } + name = tl_key.Name || name; + opt.setAttribute('value', `${cust}|${q.QuestMstId}`); opt.innerText = name; } - selectBox.appendChild(opt); + questBox.appendChild(opt); + } +} + +function buildSceneSelectList() { + let sceneBox = document.getElementById('select-scene'); + let questBox = document.getElementById('select-quest'); + sceneBox.innerHTML = ''; + + let opt = document.createElement('option'); + opt.setAttribute('value', '{Select}'); + opt.innerText = "Select Scene"; + + if (questBox.value === '{Select}') { + sceneBox.appendChild(opt); + sceneBox.setAttribute("disabled", "true"); + return; + } else { + sceneBox.removeAttribute("disabled"); + } + + let cust = questBox.value.split("|")[0]; + let questMstId = questBox.value.split("|")[1]; + + for (let i = -2; i < utage.quests[cust][questMstId].Scenes.length; ++i) { + let opt = document.createElement('option'); + if (i === -2) { + opt.setAttribute('value', '{Select}'); + opt.innerText = 'Select Scene'; + } else if (i === -1) { + opt.setAttribute('value', '{All}'); + opt.innerText = 'Play All'; + } else { + let questSceneMstId = utage.quests[cust][questMstId].Scenes[i]; + let s = utage.scenes[cust][questSceneMstId]; + opt.setAttribute('value', `${cust}|${questSceneMstId}`); + let name = s.Name; + let tl_key = utage.sceneTranslations[cust][questSceneMstId]; + if (!tl_key) { + console.log("Failed to build scene list: missing translations"); + continue; + } + if (!tl_key.Enabled) { + continue; + } + name = tl_key.Name || name; + opt.innerText = name; + } + sceneBox.appendChild(opt); } } @@ -155,29 +217,85 @@ function buildLanguageList() { function checkQueryParameters() { urlParams = commonFunctions.readQueryParameters(); - if(urlParams['mstid'] && urlParams['id'] && utage.groupedMissions[urlParams['mstid']] && utage.groupedMissions[urlParams['mstid']].Missions[urlParams['id']]) { - document.getElementById('play-from-query').style.cssText = "position: fixed; z-index: 15; text-align: center; top: 50%; left: 50%; display: block;"; + if (languagesLoaded) { + let cust; + + if (urlParams['custom'] && urlParams['custom'] === "1") { + cust = CUSTOM.custom; + } else { + cust = CUSTOM.stock; + } + + let playable = (urlParams['questscenemstid'] && + utage.scenes[cust][urlParams['questscenemstid']] && + utage.sceneTranslations[cust][urlParams['questscenemstid']] && + utage.sceneTranslations[cust][urlParams['questscenemstid']].Enabled); + + if(playable) { + document.getElementById('play-from-query').style.cssText = "position: fixed; z-index: 15; text-align: center; top: 50%; left: 50%; display: block;"; + } } } function playFromQuery(event) { - missionChanged(urlParams['mstid'], urlParams['id']); + let cust; + if (urlParams['custom'] && urlParams['custom'] === "1") { + cust = CUSTOM.custom; + } else { + cust = CUSTOM.stock; + } + sceneSet(urlParams['questscenemstid'], cust); document.getElementById('play-from-query').style.cssText = "display: none;"; } -function missionDropDownChanged(event) { +function questDropDownChanged(event) { + if(!event || !event.currentTarget || !event.currentTarget.value) { return; } + buildSceneSelectList(); +} + +function sceneDropDownChanged(event) { if(!event || !event.currentTarget || !event.currentTarget.value || event.currentTarget.value === '{Select}') { return; } + + if (event.currentTarget.value === '{All}') { + let quest = document.getElementById("select-quest"); + let cust = quest.value.split("|")[0]; + let questMstId = quest.value.split("|")[1]; + let scene = utage.quests[cust][questMstId].Scenes; + resetPlaylist(); + for (const s of scene) { + let tl_key = utage.sceneTranslations[cust][s]; + if (tl_key) { + if (utage.sceneTranslations[cust][s].Enabled) { + utage.scenes[cust][s]['QuestSceneMstId'] = s; + scenePlaylist.push(utage.scenes[cust][s]); + } + } + } + playNext(); + return; + } + let cont = document.getElementById("modal-container"); - let misId = event.currentTarget.value; - let mis = utage.groupedMissions[misId]; - if(!mis) { console.log(`Mission ${misId} not found`); return; } - let name = mis.Name; - let summary = mis.SummaryText; + + let cust = event.currentTarget.value.split("|")[0]; + let questSceneMstId = event.currentTarget.value.split("|")[1]; + + let scene = utage.scenes[cust][questSceneMstId]; + if(!scene) { console.log(`Scene ${questSceneMstId} not found`); return; } + + let name = scene.Name; + let summary = scene.SummaryText; + let image = questSceneMstId; + if ("Image" in scene) { + image = scene.Image; + } let credits = ""; - if(utage.missionTranslations[mis.MstId]) { - name = utage.missionTranslations[mis.MstId].Name || name; - summary = utage.missionTranslations[mis.MstId].SummaryText || summary; - credits = utage.missionTranslations[mis.MstId].Credits || credits; + let tl_key = utage.sceneTranslations[cust][questSceneMstId]; + + if(tl_key) { + name = tl_key.Name || name; + summary = tl_key.SummaryText || summary; + credits = tl_key.Credits || credits; } if(!credits) { if(selectedLang === "eng") { @@ -186,19 +304,21 @@ function missionDropDownChanged(event) { credits = "None"; } } + let chapterSelect = '
= 0x80 (not a basic code point)","invalid-input":"Invalid input"},N=w-E,B=Math.floor,F=String.fromCharCode;if(b={version:"1.4.1",ucs2:{decode:u,encode:h},decode:f,encode:p,toASCII:g,toUnicode:v},"function"==typeof t&&"object"==typeof t.amd&&t.amd)t("punycode",function(){return b});else if(y&&m)if(r.exports==y)m.exports=b;else for(x in b)b.hasOwnProperty(x)&&(y[x]=b[x]);else i.punycode=b}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],28:[function(t,e,r){"use strict";function n(t,e){return Object.prototype.hasOwnProperty.call(t,e)}e.exports=function(t,e,r,o){e=e||"&",r=r||"=";var s={};if("string"!=typeof t||0===t.length)return s;var a=/\+/g;t=t.split(e);var u=1e3;o&&"number"==typeof o.maxKeys&&(u=o.maxKeys);var h=t.length;u>0&&h>u&&(h=u);for(var l=0;l=0?t:16777215,this.dirty=!0},r.align.get=function(){return this._font.align},r.align.set=function(t){this._font.align=t||"left",this.dirty=!0},r.anchor.get=function(){return this._anchor},r.anchor.set=function(t){"number"==typeof t?this._anchor.set(t):this._anchor.copyFrom(t)},r.font.get=function(){return this._font},r.font.set=function(t){t&&("string"==typeof t?(t=t.split(" "),this._font.name=1===t.length?t[0]:t.slice(1).join(" "),this._font.size=t.length>=2?parseInt(t[0],10):e.fonts[this._font.name].size):(this._font.name=t.name,this._font.size="number"==typeof t.size?t.size:parseInt(t.size,10)),this.dirty=!0)},r.text.get=function(){return this._text},r.text.set=function(t){t=String(null==t?"":t),this._text!==t&&(this._text=t,this.dirty=!0)},r.maxWidth.get=function(){return this._maxWidth},r.maxWidth.set=function(t){this._maxWidth!==t&&(this._maxWidth=t,this.dirty=!0)},r.maxLineHeight.get=function(){return this.validate(),this._maxLineHeight},r.textWidth.get=function(){return this.validate(),this._textWidth},r.letterSpacing.get=function(){return this._letterSpacing},r.letterSpacing.set=function(t){this._letterSpacing!==t&&(this._letterSpacing=t,this.dirty=!0)},r.textHeight.get=function(){return this.validate(),this._textHeight},e.registerFont=function(t,r){var i={},n=t.getElementsByTagName("info")[0],o=t.getElementsByTagName("common")[0],s=t.getElementsByTagName("page"),a=ae(s[0].getAttribute("file"),g.RESOLUTION),h={};i.font=n.getAttribute("face"),i.size=parseInt(n.getAttribute("size"),10),i.lineHeight=parseInt(o.getAttribute("lineHeight"),10)/a,i.chars={},r instanceof br&&(r=[r]);for(var u=0;u