Compare commits

...

87 Commits

Author SHA1 Message Date
62e702b9fa Merge pull request 'feature/czechlang' (#9) from feature/czechlang into master 2021-02-16 10:14:42 -05:00
428ea1d660 changed czech font to PTSans 2021-02-15 20:00:30 +01:00
0def56d476 added czech 2021-02-15 19:48:57 +01:00
85f2815b6a added player support for new scene images 2020-10-21 23:54:33 +02:00
7b43a86b99
master tracks master
we're just going to rebuild beta off the most recently pushed branch
2020-09-12 16:39:42 -04:00
1dc54f8590
master branch tracks beta translations 2020-09-12 03:03:52 -04:00
d6ac86ed8c
load name variants
global stinx
2020-08-11 12:32:41 -04:00
afd850fbca
make sure translation is supplied when propagating enables 2020-08-11 11:55:19 -04:00
bdc076b664
fixed player supporting global 2020-08-11 11:55:17 -04:00
47e250ba89 support for global languages 2020-05-16 15:39:41 +02:00
14efed32e3 Merge branch 'master' of https://git.poweris.moe/yttt-xdu/XDUPlayer 2020-04-17 14:26:49 -07:00
90236c665d Since we dont have battles we use "divaeffectcontinue" as a fade out but they also sometimes call "fadeout" so set a flag so we don't do fade out again if we are already doing it. 2020-04-17 14:26:12 -07:00
89a93407f1 Update repository links for submodules and player info 2020-02-18 18:18:02 -05:00
2ca5a9e704 js: move bgmloop to data folder
Having xdu-specific data in this repo doesn't make much sense when most of the
data is fairly general to the engine, plus now I don't have to make a commit
every time I want to update the data.
2019-11-12 18:58:42 -05:00
c6c9c99c31 json: update bgmloop 2019-10-25 17:56:09 -04:00
ae90fd1c37 Updated pixi again with fork because im clearly still doing something wrong and still need the sprite hack. 2019-09-29 11:53:12 -07:00
5ca0935ac6 Updated to Pixi v5.
This also fixes a chrome video preload spec change.
2019-09-29 11:19:51 -07:00
0c039b6ed4 1.3.1 version bump 2019-06-09 21:36:52 -04:00
a93978f39d Fix movecamera since its a macro now. 2019-06-01 14:38:39 -07:00
b6821d4157 fix broken links 2019-05-24 10:00:38 -04:00
d8a5d4d177 changelog: 1.3.0 2019-05-24 04:49:54 -04:00
022250c4c4 fonts: re-enable russian font
idk why bingo disabled this
2019-05-24 04:22:04 -04:00
3101868b30 Merge branch 'quest-json' of https://git.poweris.moe/xduplayer into quest-json 2019-05-21 20:56:42 -07:00
bb409c45a1 Fixes for colorTo and tint not being kept during dialogue. 2019-05-21 20:56:37 -07:00
4716b5e8e8 divamovie: respect volume controls 2019-05-21 22:42:52 -04:00
9dc0c8f9cf enable-guard play all 2019-05-17 18:53:17 -04:00
0d522b55c5 fix urlparams play
single value, questscenemstid
2019-05-17 13:00:05 -04:00
f289381955 Merge branch 'quest-json' of git.poweris.moe:xduplayer into quest-json 2019-05-17 12:59:21 -04:00
c1c6cbfd99 demagicify custom namespace 2019-05-17 12:44:14 -04:00
90625d82b6 css for follow links instead of table. 2019-05-17 09:38:16 -07:00
5dba520155 continue playing scene after selecting specific part 2019-05-17 12:31:44 -04:00
0e9f6f8d70 custom doesn't matter for part select
it's decided by the current scene
2019-05-17 12:05:42 -04:00
8786c54200 bgmloop: update
why is this in this repo
2019-05-17 06:37:26 -04:00
25f7d90951 metadata changes and quest selector 2019-05-17 05:20:02 -04:00
526d0a51cc copy macros
macros were being edited in-place and affecting later uses
2019-05-13 20:22:17 -04:00
737b13da42 custom macros
dug out an old copy of the Macros file from the wedding gears
event and set up the player to merge removed macros
2019-05-13 17:41:01 -04:00
269592c3d6 Merge branch 'master' of https://git.poweris.moe/xduplayer 2019-05-13 13:16:45 -07:00
d4e96c66a8 Removed webpack for gulp again because its simpler for a project this size. 2019-05-13 13:16:40 -07:00
effb55871f utage: divamovie support
this is used for skillmovies that play during some missions
they must first be converted into webm format
2019-05-13 16:13:01 -04:00
77fc6e4d69 Merge branch 'master' of git.poweris.moe:xduplayer 2019-05-13 03:42:32 -04:00
bf11050984 utage macro support
xdu ships with a Macro.tsv, and loading commands
out of there instead of defining them manually
saves a lot of trouble

bingo didn't know about it

there's probably some regressions, needs further testing
2019-05-13 03:31:42 -04:00
1d469d4f3e webpack, eslint
javascript didn't have proper modules until es6 what the fuck

bingo's code scares me so i hope i didn't break it when fixing
the linting errors
2019-05-12 20:59:45 -04:00
e3b7233b20 remove emoji strings
replaced with html entities/creation from unicode code-point where applicable
my editor doesn't render emoji
2019-05-11 23:36:58 -04:00
b9e91f4977 version bump 2019-01-20 00:55:51 -05:00
eec0bb137b json: update bgmloop 2019-01-20 00:55:32 -05:00
0b3fb01670 I didnt hit save 2019-01-19 14:58:09 -07:00
fb9cab573e fix unbalanced parenthesis 2019-01-19 16:47:00 -05:00
f3ddb3e58f noise_disappearance commands should work. 2019-01-19 14:02:31 -07:00
24cbf4b5ad Merge branch 'master' of https://git.poweris.moe/xduplayer 2018-12-29 11:45:29 -07:00
e098d27964 Fix player not falling back to utage text if translation file didnt exist at all. 2018-12-29 11:44:34 -07:00
dbf530a333 urlparams: rewrite 2018-12-29 13:34:22 -05:00
rdh
d233bf77ce Merge branch 'master' of file:///mnt/bigstuff/source/xduplayer 2018-12-29 12:53:06 -05:00
42e37585d6 urlparams: rewrite 2018-12-29 12:53:03 -05:00
9ca49d25cc urlparams: rewrite 2018-12-29 12:45:27 -05:00
01245c4477 Merge branch 'master' into release 2018-12-29 12:10:52 -05:00
8933ba986a urlparams: add lang parameter 2018-12-29 12:02:23 -05:00
b98c2d987d Merge branch 'master' into release 2018-12-29 11:30:02 -05:00
62b22d9f96 russian: add font 2018-12-29 11:00:00 -05:00
64d452c7db lang: experimental: enable russian language 2018-12-29 10:34:49 -05:00
c350654ca2 json: update bgmloop 2018-12-29 10:33:48 -05:00
9ca07cca3b Check for when the next mission is disabled will now not fail if the next mission in line is also disabled. 2018-10-24 23:01:44 -07:00
63a21c69d8 Merge branch 'master' into release 2018-10-21 01:21:22 -04:00
99c7afde04 js: update BgmLoop.json 2018-10-21 00:29:19 -04:00
61e5aaca02 Merge branch 'master' into release 2018-09-13 20:34:49 -07:00
cdf61c9d57 Dumb html standard not assuming px thing. 2018-09-13 20:30:27 -07:00
rdh
b74cacb148 Merge branch 'master' into release 2018-09-13 09:23:18 -04:00
82eeacab94 submodule 2018-09-12 12:21:52 -07:00
4c1239ed1a Merge branch 'master' of https://git.poweris.moe/xduplayer 2018-09-12 12:21:45 -07:00
98a45ad4f9 Theoretical support for another font for english.
Extra meta tag.
2018-09-12 12:21:02 -07:00
56da2097b9 Revert "font: switch to source han sans"
This reverts commit 03cbf453498f0dba21b849ed03a7977c4a42b063.
2018-09-12 15:04:08 -04:00
419c896e64 js: update bgm_loop 2018-09-12 12:43:03 -04:00
03cbf45349 font: switch to source han sans 2018-08-01 04:59:26 +09:00
b31d712782 Regex fix 2018-07-29 12:14:01 -07:00
6b8cae2c00 Added custom data folder to gulp dist. 2018-07-27 10:02:31 -07:00
16bec2a1ad submodule 2018-07-27 09:15:42 -07:00
733c576cf2 Support for loop effect from 2018 summer event.
Support for pattern argument including a <character=> tag.
2018-07-24 21:40:00 -07:00
36fd987c4d Added support for custom assets so bridal gears can run more separated from the main assets so the XDU cant break it as easily. 2018-07-06 09:35:43 -07:00
4e3940fff2 Merge branch 'master' of https://git.poweris.moe/xduplayer 2018-07-02 20:15:22 -07:00
7f71e0d89b Language selection wasn't being written to local storage.
Updated submodule.
2018-07-02 20:15:15 -07:00
3a1dc7d640 update bgmloop json 2018-07-02 07:07:09 +09:00
30ce95011a Removed mst ids line 2018-06-14 07:49:14 -07:00
7e8eeffe4d Merge branch 'master' into release 2018-06-14 16:30:13 +09:00
a4676279f3 Merge branch 'master' into release 2018-06-12 23:16:20 +09:00
63478f494d Merge branch 'master' into release 2018-06-11 21:26:34 -07:00
0a56a9b11d Merge branch 'master' into release 2018-06-08 08:25:51 -07:00
e1f09c35b9 Merge branch 'master' into release 2018-06-08 08:24:22 -07:00
7a50205cd1 translations submodule: track branch
use --remote in the future
2018-06-06 02:16:28 +09:00
22 changed files with 9940 additions and 7291 deletions

1
.eslintignore Normal file
View File

@ -0,0 +1 @@
Js/Pixi.min.js

29
.eslintrc.json Normal file
View File

@ -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"
}
}

3
.gitignore vendored
View File

@ -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

6
.gitmodules vendored
View File

@ -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 = .

View File

@ -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.
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

2
Css/generic.min.css vendored
View File

@ -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}
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}

View File

@ -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; }
}
}

1
CustomData Submodule

@ -0,0 +1 @@
Subproject commit e92af8f0d0c0d4246e44dd0b63508f9e460fe3a8

View File

@ -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 = {};
}
}
}

View File

@ -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
}
}
}

View File

@ -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;
}
}
}

View File

@ -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 = '<div><span>Chapter Select:</span><select id="ChapterSelect">';
for(let k of Object.keys(mis.Missions)) {
var m = mis.Missions[k];
if(m.Enabled) {
chapterSelect += `<option value="${m.Id}">${m.Id}</option>`
}
chapterSelect += `<option value="{All}">Play All</option>`
for (const p of scene.Parts) {
chapterSelect += `<option value="${p}">${p}</option>`
}
let detailSrc = `${utage.rootDirectory}${(scene.IsCustom ? "CustomData" : "XDUData")}/Asset/Image/Quest/Snap/Detail/${image}.png`;
let iconSrc = `${utage.rootDirectory}${(scene.IsCustom ? "CustomData" : "XDUData")}/Asset/Image/Quest/Snap/Icon/${image}.png`;
chapterSelect += '</select></div>';
cont.innerHTML = `
<div id="mission-modal" class="modal">
<span class="mission-title">${name || 'none'}</span>
<img id="mission-detail" src="${utage.rootDirectory}XDUData/Asset/Image/Quest/Snap/Detail/${mis.MstId}.png"/>
<img id="mission-icon" src="${utage.rootDirectory}XDUData/Asset/Image/Quest/Snap/Icon/${mis.MstId}.png"/>
<img id="mission-detail" src="${detailSrc}"/>
<img id="mission-icon" src="${iconSrc}"/>
<div id="mission-summary">Summary: ${summary || 'none'}</div>
<div class="flex-grow"></div>
<div>Credits (${selectedLang}): ${credits}</div>
@ -207,8 +327,8 @@ function missionDropDownChanged(event) {
</div>
<div id="modal-buttons">
<button onclick="closeMissionModal(event, false)">Close</button>
<span>MstId: ${mis.MstId}</span>
<button onclick="missionChanged(${mis.MstId})">Play</button>
<span>MstId: ${questSceneMstId}</span>
<button onclick="sceneSet('${questSceneMstId}', '${cust}')">Play</button>
</div>
</div>`;
document.getElementById("click-catcher").style.cssText = 'display: flex;';
@ -217,10 +337,18 @@ function missionDropDownChanged(event) {
function closeMissionModal(event, wasStarted) {
if(!wasStarted) {
document.getElementById('select-mission').value = prevMission;
document.getElementById('select-scene').value = prevScene;
document.getElementById('select-quest').value = prevQuest;
} else {
prevMission = document.getElementById('select-mission').value;
prevScene = document.getElementById('select-scene').value;
prevQuest = document.getElementById('select-quest').value;
}
if (prevScene === '{Select}') {
document.getElementById('select-scene').setAttribute("disabled", "true");
} else {
document.getElementById('select-scene').removeAttribute("disabled");
}
closeModal(event);
}
@ -231,55 +359,85 @@ function closeModal(event) {
cont.innerHTML = '';
}
function missionChanged(mstId, value) {
let mst = utage.groupedMissions[mstId];
let name = mst.Name;
if(utage.missionTranslations[mstId]) {
name = utage.missionTranslations[mstId].Name || name;
function sceneSet(questSceneMstId, cust) {
resetPlaylist();
let part = document.getElementById('ChapterSelect');
utage.scenes[cust][questSceneMstId]['QuestSceneMstId'] = questSceneMstId;
if (!part || part.value === '{All}') {
scenePlaylist.push(utage.scenes[cust][questSceneMstId]);
} else {
currentScene = utage.scenes[cust][questSceneMstId];
try {
partPlaylist.push.apply(partPlaylist, currentScene.Parts.slice(currentScene.Parts.indexOf(part.value)));
} catch (error) {
console.log(error);
return;
}
}
if(!value) {
value = document.getElementById("ChapterSelect").value;
playNext();
}
function playNext() {
if (!partPlaylist.length) {
if (!scenePlaylist.length) {
resetPlaylist();
return; // we're probably done
}
currentScene = scenePlaylist.shift();
partPlaylist = currentScene.Parts.slice();
}
partChanged(partPlaylist.shift());
}
function partChanged(part) {
let cust = currentScene.IsCustom ? CUSTOM.custom : CUSTOM.stock;
let name = currentScene.Name;
let tl_key = utage.sceneTranslations[cust][currentScene.QuestSceneMstId];
if(tl_key) {
name = tl_key.Name || name;
}
if(!audio) {
audio = new audioController(utage);
audio.changeVolume(volume);
audio.mute(isMuted);
player.audio = audio;
}
player.resetAll()
.then((success) => {
let newMission = mst.Missions[value];
checkMissionList(mst.Missions, value);
currentMission = newMission;
currentMissionMst = mstId;
if(!currentMission.Enabled) {
missionChanged(currentMissionMst, mst.Missions[currentMissionList[currentMissionIndex+1]].Id);
return;
if (scenePlaylist.length || partPlaylist.length) {
document.getElementById("skip-button").style.cssText = "display: inline-block;";
} else {
document.getElementById("skip-button").style.cssText = "display: none;";
}
let promises = [];
if(currentScene.IsCustom) {
promises.push(utage.parseMissionFile(`${utage.rootDirectory}CustomData/Utage/${currentScene.Folder}/Scenario/${part}_t.tsv`));
promises.push(utage.loadMissionTranslation(`${utage.rootDirectory}Js/Translations/MissionsCustom/${currentScene.Folder}/${part}_translations_${selectedLang}.json`));
} else {
promises.push(utage.parseMissionFile(`${utage.rootDirectory}XDUData/Utage/${currentScene.Folder}/Scenario/${part}_t.tsv`));
promises.push(utage.loadMissionTranslation(`${utage.rootDirectory}Js/Translations/Missions/${currentScene.Folder}/${part}_translations_${selectedLang}.json`));
}
let promises = [
utage.parseMissionFile(`${utage.rootDirectory}XDUData/${newMission.Path.replace('Asset/', '').replace('.utage', '').replace('.tsv', '_t.tsv')}`),
utage.loadMissionTranslation(`${utage.rootDirectory}Js/Translations/Missions/${currentMission.Path.replace('Asset/Utage/', '').replace('Scenario/', '').replace('.utage', '').replace('.tsv', `_translations_${selectedLang}.json`)}`)
];
closeMissionModal(undefined, true);
Promise.all(promises)
.then((success) => {
document.getElementById("playing-title").innerText = `${name} (${value})`;
document.getElementById("playing-title").innerText = `${name} (${part})`;
document.getElementById("title-tag").innerText = name;
currentPart = part;
player.playFile()
.then((success) => {
if(currentMissionIndex !== currentMissionList.length - 1) {
missionChanged(currentMissionMst, mst.Missions[currentMissionList[currentMissionIndex+1]].Id);
} else {
player.resetAll();
resetMissions();
}
playNext();
}, (failure) => {
player.resetAll();
resetMissions();
resetPlaylist();
console.log(failure);
});
}, (failure) => {
resetMissions();
resetPlaylist();
console.log(failure);
});
}, (failure) => {
@ -291,41 +449,32 @@ function languageChanged(event) {
if(!event || !event.currentTarget || !event.currentTarget.value || event.currentTarget.value === '{Select}' || !languages.includes(event.currentTarget.value)) { return; }
selectedLang = event.currentTarget.value;
let missionPath = '';
if(currentMission) {
missionPath = `${utage.rootDirectory}Js/Translations/Missions/${currentMission.Path.replace('Asset/Utage/', '').replace('Scenario/', '').replace('.utage', '').replace('.tsv', `_translations_${selectedLang}.json`)}`;
if(currentPart) {
if (currentScene.IsCustom) {
missionPath = `${utage.rootDirectory}Js/Translations/CustomMissions/${currentScene.Folder}/${currentPart}_translations_${selectedLang}.json`;
} else {
missionPath = `${utage.rootDirectory}Js/Translations/Missions/${currentScene.Folder}/${currentPart}_translations_${selectedLang}.json`;
}
}
utage.setTranslationLanguage(selectedLang, missionPath)
.then((success) => {
buildMissionSelectList();
document.getElementById('text-container').className = selectedLang;
buildQuestSelectList();
buildSceneSelectList();
localStorage.setItem('language', selectedLang);
});
}
function checkMissionList(missions, currentvalue) {
currentMissionList = [];
let i = 0;
for(var m of Object.keys(missions)) {
currentMissionList.push(m);
if(m === currentvalue) {
currentMissionIndex = i;
}
++i;
}
if(currentMissionIndex + 1 === currentMissionList.length) {
document.getElementById("skip-button").style.cssText = "display: none;";
} else {
document.getElementById("skip-button").style.cssText = "display: inline-block;";
}
}
function resetMissions() {
currentMissionIndex = 0;
currentMissionList = [];
currentMission = undefined;
currentMissionMst = 0;
function resetPlaylist() {
currentScene = {};
scenePlaylist = [];
currentPart = "";
partPlaylist = [];
document.getElementById("skip-button").style.cssText = "display: inline-block;";
document.getElementById("playing-title").innerText = 'None';
document.getElementById("title-tag").innerText = version;
document.getElementById('select-mission').value = '{Select}';
document.getElementById("select-quest").value = '{Select}';
buildSceneSelectList();
}
function onMainClick(event) {
@ -339,10 +488,10 @@ function hideUiClicked(event) {
function skipClicked(event) {
if(player.uiHidden) {
player.hideUiClicked(event);
} else if(player.runEvent && currentMissionIndex !== currentMissionList.length - 1) {
} else if(player.runEvent) {
event.preventDefault();
event.stopPropagation();
missionChanged(currentMissionMst, utage.groupedMissions[currentMissionMst].Missions[currentMissionList[currentMissionIndex+1]].Id);
playNext();
}
}
@ -388,11 +537,17 @@ function openHelpModal(event) {
iOS: 11+, no audio<br/>
</div>
</div>
<a style="margin-top: auto; text-align: center; "href="https://discord.gg/fpQZQ8g">YameteTomete Discord</a>
<div class="follow-links">
<div class="follow-links-header">Follow YameteTomete</div>
<div class="follow-links-links">
<a href="https://discord.gg/fpQZQ8g" target="_blank" >Discord</a>
<a href="https://twitter.com/YameteTomete" target="_blank">Twitter</a>
</div>
</div>
<div style="margin-top: auto; text-align: center;">All Symphogear content belongs to its respective owners</div>
<div id="modal-buttons">
<button onclick="closeModal(event)">Close</button>
<a href="https://git.poweris.moe/xduplayer.git/" target="_blank">Source</a>
<a href="https://git.poweris.moe/yttt-xdu/XDUPlayer" target="_blank">Source</a>
</div>
</div>`;
document.getElementById("click-catcher").style.cssText = 'display: flex;';
@ -406,9 +561,9 @@ function toggleMute(event) {
}
localStorage.setItem('ismuted', 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;
}
}
@ -447,7 +602,7 @@ function onFullScreenChange(event) {
} else {
document.getElementById('other-controls-container').style.cssText = "";
document.getElementById('title-container').style.cssText = "";
document.getElementById('fullscreen-button').innerText = "";
document.getElementById('fullscreen-button').innerText = emoji.HeavyPlusSign;
}
onWindowResize(event, 0);
}

19
Js/Pixi.min.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -1,25 +1,20 @@
//http://glslsandbox.com/e#39992.0
class Shaders {
constructor() {
this.leftToRightFadeShader = `
precision mediump float;
varying vec2 vTextureCoord;
uniform vec2 dimensions;
uniform vec4 filterArea;
uniform vec4 inputPixel;
uniform highp vec4 outputFrame;
uniform float time;
uniform vec4 fadeincolor;
uniform vec4 fadeoutcolor;
vec2 mapCoord( vec2 coord ) {
coord *= filterArea.xy;
coord += filterArea.zw;
return coord;
}
void main( void ) {
vec2 uv = vTextureCoord;
vec2 mappedCoord = mapCoord(uv) / dimensions;
vec2 uv = vTextureCoord * inputPixel.xy / outputFrame.zw;
vec2 mappedCoord = uv;
float step2 = time;
float step3 = time + 0.2;
@ -35,21 +30,16 @@ class Shaders {
this.rightToLeftFadeShader = `
precision mediump float;
varying vec2 vTextureCoord;
uniform vec2 dimensions;
uniform vec4 filterArea;
uniform vec4 inputPixel;
uniform highp vec4 outputFrame;
uniform float time;
uniform vec4 fadeincolor;
uniform vec4 fadeoutcolor;
vec2 mapCoord( vec2 coord ) {
coord *= filterArea.xy;
return coord;
}
void main( void ) {
vec2 uv = vTextureCoord;
vec2 mappedCoord = mapCoord(uv) / dimensions;
vec2 uv = vTextureCoord * inputPixel.xy / outputFrame.zw;
vec2 mappedCoord = uv;
float step2 = (1.0 - time);
float step3 = (1.0 - time) - 0.2;
@ -65,22 +55,16 @@ class Shaders {
this.downToUpFadeShader = `
precision mediump float;
varying vec2 vTextureCoord;
uniform vec2 dimensions;
uniform vec4 filterArea;
uniform vec4 inputPixel;
uniform highp vec4 outputFrame;
uniform float time;
uniform vec4 fadeincolor;
uniform vec4 fadeoutcolor;
vec2 mapCoord( vec2 coord ) {
coord *= filterArea.xy;
coord += filterArea.zw;
return coord;
}
void main( void ) {
vec2 uv = vTextureCoord;
vec2 mappedCoord = mapCoord(uv) / dimensions;
vec2 uv = vTextureCoord * inputPixel.xy / outputFrame.zw;
vec2 mappedCoord = uv;
float step2 = (1.0 - time);
float step3 = (1.0 - time) - 0.2;
@ -96,22 +80,16 @@ class Shaders {
this.uptoDownFadeShader = `
precision mediump float;
varying vec2 vTextureCoord;
uniform vec2 dimensions;
uniform vec4 filterArea;
uniform vec4 inputPixel;
uniform highp vec4 outputFrame;
uniform float time;
uniform vec4 fadeincolor;
uniform vec4 fadeoutcolor;
vec2 mapCoord( vec2 coord ) {
coord *= filterArea.xy;
coord += filterArea.zw;
return coord;
}
void main( void ) {
vec2 uv = vTextureCoord;
vec2 mappedCoord = mapCoord(uv) / dimensions;
vec2 uv = vTextureCoord * inputPixel.xy / outputFrame.zw;
vec2 mappedCoord = uv;
float step2 = time;
float step3 = time + 0.2;
@ -128,7 +106,6 @@ class Shaders {
precision mediump float;
varying vec2 vTextureCoord;
uniform sampler2D uSampler;
uniform vec2 dimensions;
uniform float factor;
vec4 Sepia( in vec4 color )
@ -149,10 +126,11 @@ class Shaders {
}
//https://jsfiddle.net/60e5pp8d/1/
//v5 changes to shaders, https://github.com/pixijs/pixi.js/wiki/v5-Creating-filters
// https://www.html5gamedevs.com/topic/42235-how-to-get-correct-fragment-shader-uv-in-pixi-50-rc0/
buildShaders() {
let divalefttorightfade = new PIXI.Filter(null, this.leftToRightFadeShader, {
time: { type: 'f', value: 0 },
dimensions: { type: 'v2', value: [baseDimensions.width, baseDimensions.height] },
fadeincolor: { type: 'v4', value: [0.0,0.0,0.0,1.0] },
fadeoutcolor: { type: 'v4', value: [0.0,0.0,0.0,0.0] }
});
@ -161,7 +139,6 @@ class Shaders {
let divarighttoleftfade = new PIXI.Filter(null, this.rightToLeftFadeShader, {
time: { type: 'f', value: 0 },
dimensions: { type: 'v2', value: [baseDimensions.width, baseDimensions.height] },
fadeincolor: { type: 'v4', value: [0.0,0.0,0.0,1.0] },
fadeoutcolor: { type: 'v4', value: [0.0,0.0,0.0,0.0] }
});
@ -170,7 +147,6 @@ class Shaders {
let divauptodownfade = new PIXI.Filter(null, this.uptoDownFadeShader, {
time: { type: 'f', value: 0 },
dimensions: { type: 'v2', value: [baseDimensions.width, baseDimensions.height] },
fadeincolor: { type: 'v4', value: [0.0,0.0,0.0,1.0] },
fadeoutcolor: { type: 'v4', value: [0.0,0.0,0.0,0.0] }
});
@ -179,7 +155,6 @@ class Shaders {
let divadowntoupfade = new PIXI.Filter(null, this.downToUpFadeShader, {
time: { type: 'f', value: 0 },
dimensions: { type: 'v2', value: [baseDimensions.width, baseDimensions.height] },
fadeincolor: { type: 'v4', value: [0.0,0.0,0.0,1.0] },
fadeoutcolor: { type: 'v4', value: [0.0,0.0,0.0,0.0] }
});
@ -187,16 +162,13 @@ class Shaders {
this.shaders['divadowntoupfade'] = divadowntoupfade;
let sepia = new PIXI.Filter(null, this.sepiaShader, {
factor: { type: 'f', value: 0.5 },
dimensions: { type: 'v2', value: [baseDimensions.width, baseDimensions.height] }
factor: { type: 'f', value: 0.5 }
});
sepia.apply = baseShaderApply;
this.shaders['sepia'] = sepia;
function baseShaderApply(filterManager, input, output) {
this.uniforms.dimensions[0] = input.sourceFrame.width;
this.uniforms.dimensions[1] = input.sourceFrame.height;
filterManager.applyFilter(this, input, output);
}
}
}
}

View File

@ -84,7 +84,6 @@ class TextFunctions {
function putText() {
// skip over any HTML chars
this.dialogToDisplay.curPos = this.typeHtmlChars(this.dialogToDisplay.text, this.dialogToDisplay.curPos);
let substr = this.dialogToDisplay.text.substr(this.dialogToDisplay.curPos);
if (this.dialogToDisplay.curPos === this.dialogToDisplay.text.length) {
this.showNextIndicator(true);
this.scrollingText = false;
@ -191,4 +190,4 @@ class TextFunctions {
this.scrollingText = false;
this.lineHeight = -1;
}
}
}

@ -1 +1 @@
Subproject commit 5b7839ae9b5e47b5bd29d64c06c22a3b000d8959
Subproject commit ac0bfbd699431e9befdd843379e7c91ad1014cec

View File

@ -6,7 +6,9 @@ class UtageInfo {
this.currentPlayingFile = [];
this.rootDirectory = ``;
this.groupedMissions = {};
this.missionsList = [];
this.quests = {};
this.questList = [];
this.scenes = {};
this.characterInfo = {};
this.layerInfo = {};
this.localizeInfo = {};
@ -16,45 +18,71 @@ class UtageInfo {
this.currentTranslation = 'eng';
this.translationsInner = {};
this.charTranslationsInner = {};
this.missionTranslationsInner = {};
this.questTranslationsInner = {};
this.sceneTranslationsInner = {};
this.bgmLoopData = {};
this.macros = {};
}
loadUtageSettings(resolve, reject) {
loadUtageSettings() {
return new Promise((resolve, reject) => {
let promises = [
commonFunctions.getFileJson(`${this.rootDirectory}Js/Translations/XduMissions.json`),
commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Character.tsv`),
commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Layer.tsv`),
commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Localize.tsv`),
commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Param.tsv`),
commonFunctions.getFileJson(`${this.rootDirectory}Js/Translations/XduQuest.json`), //0
commonFunctions.getFileJson(`${this.rootDirectory}Js/Translations/XduScene.json`), //1
commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Character.tsv`), //2
commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Layer.tsv`), //3
commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Localize.tsv`), //4
//commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Param.tsv`),
//commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Scenario.tsv`),
commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Sound.tsv`),
commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Texture.tsv`),
commonFunctions.getFileJson(`${this.rootDirectory}Js/BgmLoop.json`),
commonFunctions.getFileJson(`${this.rootDirectory}Js/Translations/XduMissionsCustom.json`),
commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Sound.tsv`), //5
commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Texture.tsv`), //6
commonFunctions.getFileJson(`${this.rootDirectory}XDUData/Bgm/BgmLoop.json`), //7
commonFunctions.getFileJson(`${this.rootDirectory}Js/Translations/XduQuestCustom.json`), //8
commonFunctions.getFileJson(`${this.rootDirectory}Js/Translations/XduSceneCustom.json`), //9
commonFunctions.getFileText(`${this.rootDirectory}CustomData/Utage/Diva/Settings/CustomCharacter.tsv`), //10
commonFunctions.getFileText(`${this.rootDirectory}CustomData/Utage/Diva/Settings/CustomSound.tsv`), //11
commonFunctions.getFileText(`${this.rootDirectory}CustomData/Utage/Diva/Settings/CustomTexture.tsv`), //12
commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Scenario/Macro.tsv`), //13
commonFunctions.getFileText(`${this.rootDirectory}CustomData/Utage/Diva/Settings/CustomMacro.tsv`), //14
];
Promise.all(promises)
.then((success) => {
this.groupMissions(success[0], success[8]);
this.missionsList = Object.keys(this.groupedMissions).map((k) => {
return {Name: this.groupedMissions[k].Name, MstId: this.groupedMissions[k].MstId};
this.quests[CUSTOM.stock] = success[0];
this.questList = Object.keys(this.quests[CUSTOM.stock]).map((k) => {
return {QuestMstId: k, Name: this.quests[CUSTOM.stock][k].Name, IsCustom: false};
});
this.missionsList.sort();
this.parseCharacterInfo(success[1]);
this.parseLayerInfo(success[2]);
this.parseLocalizeInfo(success[3]);
this.parseParamInfo(success[4]);
this.quests[CUSTOM.custom] = success[8];
for (const k of Object.keys(this.quests[CUSTOM.custom])) {
this.questList.push({QuestMstId: k, Name: this.quests[CUSTOM.custom][k].Name, IsCustom: true});
}
this.questList.sort((a, b) => { return a.QuestMstId - b.QuestMstId });
this.scenes[CUSTOM.stock] = success[1];
for (const k of Object.keys(this.scenes[CUSTOM.stock])) {
this.scenes[CUSTOM.stock][k]['IsCustom'] = false;
}
this.parseCharacterInfo(success[2]);
this.parseLayerInfo(success[3]);
this.parseLocalizeInfo(success[4]);
//this.parseParamInfo(success[4]);
this.parseSoundInfo(success[5]);
this.parseTextureInfo(success[6]);
this.bgmLoopData = success[7];
this.scenes[CUSTOM.custom] = success[9];
for (const k of Object.keys(this.scenes[CUSTOM.custom])) {
this.scenes[CUSTOM.custom][k]['IsCustom'] = true;
}
this.parseCharacterInfo(success[10], true);
this.parseSoundInfo(success[11], true);
this.parseTextureInfo(success[12], true);
this.parseMacroFile(success[13]);
this.parseMacroFile(success[14]);
resolve();
}, (failure) => {
reject(failure);
});
});
}
parseMissionFile(file) {
return new Promise((resolve, reject) => {
commonFunctions.getFileText(file)
@ -80,39 +108,7 @@ class UtageInfo {
});
});
}
groupMissions(missions, customMissions) {
for(let key of Object.keys(missions)) {
let mis = missions[key];
if(!this.groupedMissions[mis.MstId]) {
this.groupedMissions[mis.MstId] = {
Name: mis.Name,
SummaryText: mis.SummaryText,
MstId: mis.MstId,
Missions: {}
}
this.groupedMissions[mis.MstId].Missions[mis.Id] = { Id: mis.Id, Path: mis.Path, Enabled: mis.Enabled };
} else {
this.groupedMissions[mis.MstId].Missions[mis.Id] = { Id: mis.Id, Path: mis.Path, Enabled: mis.Enabled };
}
}
for(let key of Object.keys(customMissions)) {
let mis = customMissions[key];
if(!this.groupedMissions[mis.MstId]) {
this.groupedMissions[mis.MstId] = {
Name: mis.Name,
SummaryText: mis.SummaryText,
MstId: mis.MstId,
Missions: {}
}
this.groupedMissions[mis.MstId].Missions[mis.Id] = { Id: mis.Id, Path: mis.Path, Enabled: mis.Enabled };
} else {
this.groupedMissions[mis.MstId].Missions[mis.Id] = { Id: mis.Id, Path: mis.Path, Enabled: mis.Enabled };
}
}
}
get translations() {
return this.translationsInner[this.currentTranslation];
}
@ -121,20 +117,40 @@ class UtageInfo {
return this.charTranslationsInner[this.currentTranslation];
}
get missionTranslations() {
return this.missionTranslationsInner[this.currentTranslation];
get questTranslations() {
return this.questTranslationsInner[this.currentTranslation];
}
get sceneTranslations() {
return this.sceneTranslationsInner[this.currentTranslation];
}
setTranslationLanguage(key, missionPath) {
return new Promise((resolve, reject) => {
this.currentTranslation = key;
let promises = [this.loadCharacterTranslations(key),
this.loadMissionNamesTranslations(key)];
this.loadQuestNamesTranslations(key),
this.loadSceneNamesTranslations(key)];
if(missionPath) {
promises.push(this.loadMissionTranslation(missionPath, key));
}
Promise.all(promises)
.then((success) => {
// propagate language-based enables downwards from quests to scenes
for (const c of [CUSTOM.custom, CUSTOM.stock]) {
for (const k of Object.keys(this.questTranslationsInner[this.currentTranslation][c])) {
if (this.questTranslationsInner[this.currentTranslation][c][k].Enabled) {
for (const s of this.quests[c][k].Scenes) {
// only propagate if exists in translation file (THANKS GLOBAL) and translated name is supplied
if (c in this.sceneTranslationsInner[this.currentTranslation]
&& s in this.sceneTranslationsInner[this.currentTranslation][c]
&& this.sceneTranslationsInner[this.currentTranslation][c][s].Name != "") {
this.sceneTranslationsInner[this.currentTranslation][c][s].Enabled = true;
}
}
}
}
}
resolve();
}, (failure) => {
console.log(failure);
@ -165,7 +181,7 @@ class UtageInfo {
if(this.charTranslationsInner[this.currentTranslation]) {
resolve();
} else {
commonFunctions.getFileJson(`${utage.rootDirectory}Js/Translations/nametranslations_${this.currentTranslation}.json`)
commonFunctions.getFileJson(`${this.rootDirectory}Js/Translations/nametranslations_${this.currentTranslation}.json`)
.then((success) => {
this.charTranslationsInner[this.currentTranslation] = success;
resolve();
@ -177,21 +193,20 @@ class UtageInfo {
});
}
loadMissionNamesTranslations() {
loadQuestNamesTranslations() {
return new Promise((resolve, reject) => {
if(this.missionTranslationsInner[this.currentTranslation]) {
if(this.questTranslationsInner[this.currentTranslation]) {
resolve();
} else {
var promises = [
commonFunctions.getFileJson(`${utage.rootDirectory}Js/Translations/XduMissionsNames_${this.currentTranslation}.json`),
commonFunctions.getFileJson(`${utage.rootDirectory}Js/Translations/XduMissionsNamesCustom_${this.currentTranslation}.json`)
commonFunctions.getFileJson(`${this.rootDirectory}Js/Translations/XduQuestNames_${this.currentTranslation}.json`),
commonFunctions.getFileJson(`${this.rootDirectory}Js/Translations/XduQuestNamesCustom_${this.currentTranslation}.json`)
];
Promise.all(promises)
.then((success) => {
for(let m of Object.keys(success[1])) {
success[0][m] = success[1][m];
}
this.missionTranslationsInner[this.currentTranslation] = success[0];
this.questTranslationsInner[this.currentTranslation] = {};
this.questTranslationsInner[this.currentTranslation][CUSTOM.stock] = success[0];
this.questTranslationsInner[this.currentTranslation][CUSTOM.custom] = success[1];
resolve();
}, (failure) => {
console.log(failure);
@ -200,9 +215,62 @@ class UtageInfo {
}
});
}
loadSceneNamesTranslations() {
return new Promise((resolve, reject) => {
if(this.sceneTranslationsInner[this.currentTranslation]) {
resolve();
} else {
var promises = [
commonFunctions.getFileJson(`${this.rootDirectory}Js/Translations/XduSceneNames_${this.currentTranslation}.json`),
commonFunctions.getFileJson(`${this.rootDirectory}Js/Translations/XduSceneNamesCustom_${this.currentTranslation}.json`)
];
Promise.all(promises)
.then((success) => {
this.sceneTranslationsInner[this.currentTranslation] = {};
this.sceneTranslationsInner[this.currentTranslation][CUSTOM.stock] = success[0];
this.sceneTranslationsInner[this.currentTranslation][CUSTOM.custom] = success[1];
resolve();
}, (failure) => {
console.log(failure);
resolve();
});
}
});
}
parseMacroFile(file) {
let lines = file.split('\n');
let header = lines[0].split('\t');
let macro = false;
let name = "";
for (let i = 1; i < lines.length; ++i) {
let line = commonFunctions.readLine(lines[i], header);
if (line && !line.comment) {
if (macro === false) {
if (line.Command[0] === '*') {
name = line.Command.slice(1);
if (!(name in this.macros)) {
macro = true;
this.macros[name] = [];
}
}
} else {
if (line.Command === "EndMacro") {
macro = false;
continue;
}
if (!line.Command && !line.Arg1 && !line.Arg2 && !line.Arg3 && !line.Arg4 && !line.Arg5 && !line.Arg6) {
continue;
}
this.macros[name].push(line);
}
}
}
}
//http://madnesslabo.net/utage/?page_id=4521&lang=en
parseCharacterInfo(text) {
parseCharacterInfo(text, custom = false) {
let lines = text.split("\n");
let headers = [];
let lastCharName = '';
@ -227,10 +295,10 @@ class UtageInfo {
}
if(read.FileName) {
if(!read.FileName.startsWith('file://')) {
read.FileName = `${this.rootDirectory}XDUData/Sample/Texture/Character/${read.FileName}`;
read.FileName = `${this.rootDirectory}${(custom ? "CustomData" : "XDUData")}/Sample/Texture/Character/${read.FileName}`;
} else {
read.FileName = read.FileName.replace('file://', '');
read.FileName = `${this.rootDirectory}XDUData/${read.FileName}`;
read.FileName = `${this.rootDirectory}${(custom ? "CustomData" : "XDUData")}/${read.FileName}`;
}
}
if(!this.characterInfo[lastCharName]) {
@ -294,7 +362,7 @@ class UtageInfo {
}
//http://madnesslabo.net/utage/?page_id=4519&lang=en
parseSoundInfo(text) {
parseSoundInfo(text, custom = false) {
let lines = text.split("\n");
let headers = [];
for(let i = 0; i < lines.length; ++i) {
@ -315,10 +383,10 @@ class UtageInfo {
let s = read.FileName.split(',');
read.FileName = `${s[0].split('_').join('/')}/${s[1]}`;
}
read.FileName = `${this.rootDirectory}XDUData/Se/${read.FileName}`;
read.FileName = `${this.rootDirectory}${(custom ? "CustomData" : "XDUData")}/Se/${read.FileName}`;
break;
case 'bgm':
read.FileName = `${this.rootDirectory}XDUData/Bgm/${read.FileName}`;
read.FileName = `${this.rootDirectory}${(custom ? "CustomData" : "XDUData")}/Bgm/${read.FileName}`;
break;
}
}
@ -329,7 +397,7 @@ class UtageInfo {
}
//http://madnesslabo.net/utage/?page_id=4520&lang=en
parseTextureInfo(text) {
parseTextureInfo(text, custom = false) {
let lines = text.split("\n");
let headers = [];
for(let i = 0; i < lines.length; ++i) {
@ -340,10 +408,10 @@ class UtageInfo {
let read = commonFunctions.readLine(line, headers);
if(read && read.Label) {
if(!read.FileName.startsWith("file://")) {
read.FileName = `${this.rootDirectory}XDUData/Sample/Texture/BG/${read.FileName}`;
read.FileName = `${this.rootDirectory}${(custom ? "CustomData" : "XDUData")}/Sample/Texture/BG/${read.FileName}`;
} else {
read.FileName = read.FileName.replace("file://", '');
read.FileName = `${this.rootDirectory}XDUData/${read.FileName}`;
read.FileName = `${this.rootDirectory}${(custom ? "CustomData" : "XDUData")}/${read.FileName}`;
}
this.textureInfo[read.Label] = read;
}
@ -354,4 +422,4 @@ class UtageInfo {
resetTranslations() {
this.translationsInner = {};
}
}
}

View File

@ -1,7 +1,9 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
<meta name="theme-color" content="#393939"/>
<title id="title-tag"></title>
<link rel="stylesheet" type="text/css" href="Css/generic.min.css">
<link rel="stylesheet" type="text/css" href="Css/main.min.css">
@ -13,10 +15,9 @@
<script src="Js/TextFunctions.js"></script>
<script src="Js/UtageParse.js"></script>
<script src="Js/Audio.js"></script>
<script src="Js/Player.js"></script>
<script src="Js/Main.js"></script> -->
<script src="Js/Player.js"></script>-->
<script src="Js/XduPlayer.min.js"></script>
<div id="loading-container" class="centered">
<div id="loading-container" class="centered" style="z-index: 20;">
<h2 id="loading-utage">Loading Utage Data...</h2>
<h2 id="loading-font">Loading Page Data...</h2>
</div>
@ -24,10 +25,11 @@
<div id="title-container"><span>Now Playing: </span><span id="playing-title">None</span></div>
<div id="other-controls-container">
<div id="volume-control">
<span onclick="toggleMute(event)" id="mute-button">🔊</span>
<span onclick="toggleMute(event)" id="mute-button">&#128266;</span> <!-- loud_sound -->
<input onchange="onVolumeChange(event)" id="volume-range" value="50" type="range" min="0" max="100" step="1"/>
</div>
<select id="select-mission" onchange="missionDropDownChanged(event);"></select>
<select id="select-quest" onchange="questDropDownChanged(event);"></select>
<select id="select-scene" disabled="true" onchange="sceneDropDownChanged(event);"></select>
<select id="select-language" onchange="languageChanged(event);"></select>
<a style="font-size: 20px; margin-left: 5px;" title="info/help" onclick="openHelpModal(event)">?</a>
</div>
@ -35,7 +37,7 @@
The canvas then resizes as the canvas does and the text-container uses transform scale based off this resolution -->
<div id="app-container" onclick="onMainClick(event);">
<div id="text-container">
<div id="fullscreen-button" onclick="toggleFullscreen(event)"></div>
<div id="fullscreen-button" onclick="toggleFullscreen(event)">&#10133;</div> <!-- heavy_plus_sign -->
<img id="main-ui-img" class="hidden" src="Images/newui_main.png"/>
<button id="play-from-query" onclick="playFromQuery(event)" style="display: none;">Play</button>
<div id="title" class="hidden">Title Text</div>
@ -76,4 +78,4 @@
<span style="font-family: 'SourceCodePro-Regular'">test</span> -->
</div>
</body>
</html>
</html>

View File

@ -26,9 +26,6 @@ const cssToCopy = [
"Css/main.min.css",
"Css/generic.min.css"
];
const jsonFiles = [
"Js/BgmLoop.json",
];
const translations = [
"Js/Translations/**"
];
@ -50,10 +47,10 @@ gulp.task('dist', gulp.series(
buildCss,
copyCss
),
buildJson,
buildJsonTranslations,
copyHtml,
copyImages
copyImages,
copyCustomData
),
)
);
@ -111,10 +108,9 @@ function copyImages() {
.pipe(gulp.dest('Dist/Images'));
}
function buildJson() {
return gulp.src(jsonFiles)
.pipe(jsonmin())
.pipe(gulp.dest('Dist/Js'));
function copyCustomData() {
return gulp.src('CustomData/**')
.pipe(gulp.dest('Dist/CustomData'));
}
function buildJsonTranslations() {

14467
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,16 +1,18 @@
{
"name": "XduPlayer",
"version": "1.0.0",
"version": "1.3.0",
"private": true,
"license": "MIT",
"devDependencies": {
"gulp": "github:gulpjs/gulp#4.0",
"gulp": "~4.0.2",
"gulp-concat": "~2.6.1",
"gulp-cssmin": "~0.2.0",
"gulp-jsonminify": "^1.1.0",
"gulp-rename": "~1.2.2",
"gulp-sourcemaps": "~2.6.4",
"gulp-uglify": "~3.0.0",
"gulp-uglify-es": "~1.0.1"
"gulp-uglify-es": "~1.0.1",
"npm": "^6.9.0",
"eslint": "^5.16.0"
}
}