Merge branch 'master' into release

This commit is contained in:
fire bingo 2018-06-08 08:24:22 -07:00
commit e1f09c35b9
12 changed files with 607 additions and 105 deletions

1
.gitignore vendored
View File

@ -2,6 +2,7 @@
/ /
web.config web.config
/Js/Typed /Js/Typed
/Js/[Pp]ixi.js
/node_modules /node_modules
/Js/XduPlayer.js /Js/XduPlayer.js
/Js/XduPlayer.min.js.map /Js/XduPlayer.min.js.map

View File

@ -64,7 +64,7 @@ body { margin: 0; }
#parent-container { display: flex; flex-direction: column; align-items: center; } #parent-container { display: flex; flex-direction: column; align-items: center; }
#text-container { position: absolute; margin: auto; height: 750px; width: 1334px; font-family: 'FOT-RodinNTLGPro'; } #text-container { color: white; position: absolute; margin: auto; height: 750px; width: 1334px; font-family: 'FOT-RodinNTLGPro'; }
#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; } #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; }
@ -74,7 +74,7 @@ body { margin: 0; }
#text-container #main-ui-img { width: 100%; height:100%; transition: opacity 0.1s; } #text-container #main-ui-img { width: 100%; height:100%; transition: opacity 0.1s; }
#dialog-box { color: white; font-weight: bold; text-shadow: 1px 1px 6px black; transition: opacity 0.1s; } #dialog-box { font-weight: bold; text-shadow: 1px 1px 6px black; transition: opacity 0.1s; }
#dialog-box #character { position: absolute; left: 70px; font-size: 30px; cursor: default; user-select: none; } #dialog-box #character { position: absolute; left: 70px; font-size: 30px; cursor: default; user-select: none; }

View File

@ -90,7 +90,7 @@ class audioController {
if(!this.loader.bufferList[sound]) { if(!this.loader.bufferList[sound]) {
return; return;
} }
let source = this.audioCtx.createBufferSource() let source = this.audioCtx.createBufferSource();
this.sources[sound] = source; this.sources[sound] = source;
source.buffer = this.loader.bufferList[sound]; source.buffer = this.loader.bufferList[sound];
source.loop = false; source.loop = false;

View File

@ -158,11 +158,12 @@ class commonFunctions {
let color = ''; let color = '';
name = name.substring(1); name = name.substring(1);
if(name.length === 8) { if(name.length === 8) {
color = name.slice(0, 6); color = parseInt(name.slice(0, 6), 16);
alpha = name.slice(6, 8); alpha = parseInt(name.slice(6, 8), 16) / 255;
} else {
color = parseInt(name, 16);
alpha = 1;
} }
color = parseInt(color, 16);
alpha = parseInt(alpha, 16) / 255;
return { color, alpha }; return { color, alpha };
} else { } else {
switch(name.toLowerCase()) { switch(name.toLowerCase()) {
@ -184,6 +185,15 @@ class commonFunctions {
return [r/255, g/255, b/255]; return [r/255, g/255, b/255];
} }
static componentToHex(c) {
var hex = parseInt(c).toString(16);
return hex.length == 1 ? "0" + hex : hex;
}
static rgbToHex(rgb) {
return `#${this.componentToHex(rgb[0] * 255)}${this.componentToHex(rgb[1]* 255)}${this.componentToHex(rgb[2]* 255)}`;
}
static convertUtageTextTags(text) { static convertUtageTextTags(text) {
text = text.replace(/<speed.*?>|<\/speed>/g, ""); text = text.replace(/<speed.*?>|<\/speed>/g, "");
text = text.replace(/\\n/g, "<br/>") text = text.replace(/\\n/g, "<br/>")
@ -317,6 +327,15 @@ class commonFunctions {
} }
retval.speed = Number(retval.speed); retval.speed = Number(retval.speed);
} }
let indexC = props.indexOf("color=");
if(indexC !== -1) {
retval.color = "";
for(let i = indexC + 6; i < props.length; ++i) {
if(props[i] == " ") { break; }
retval.color += props[i];
}
retval.color = retval.color;
}
return retval; return retval;
} }
} }

View File

@ -26,7 +26,7 @@ let screenSizeTimeout = undefined;
let isMuted = false; let isMuted = false;
let volume = 0.5; let volume = 0.5;
let prevMission = '{Select}'; let prevMission = '{Select}';
const availableMstIds = [202070, 202013]; const availableMstIds = [202070, 202013, 338001, 338002, 338003, 338004]//[202070, 202013, 338001, 338002, 338003, 338004, 338005, 338006, 338007, 338009, 338010, 338011];
function onBodyLoaded() { function onBodyLoaded() {
bodyLoaded = true; bodyLoaded = true;
@ -269,7 +269,10 @@ function languageChanged(event) {
if(currentMission) { if(currentMission) {
missionPath = `${utage.rootDirectory}Js/Translations/Missions/${currentMission.Path.replace('Asset/Utage/', '').replace('Scenario/', '').replace('.utage', '').replace('.tsv', `_translations_${selectedLang}.json`)}`; missionPath = `${utage.rootDirectory}Js/Translations/Missions/${currentMission.Path.replace('Asset/Utage/', '').replace('Scenario/', '').replace('.utage', '').replace('.tsv', `_translations_${selectedLang}.json`)}`;
} }
utage.setTranslationLanguage(selectedLang, missionPath); utage.setTranslationLanguage(selectedLang, missionPath)
.then((success) => {
buildMissionSelectList();
});
} }
function checkMissionList(missions, currentvalue) { function checkMissionList(missions, currentvalue) {
@ -330,7 +333,11 @@ function dialogScrollDown(event) {
} }
function onBodyKey(event) { function onBodyKey(event) {
if(event.code.toLowerCase() === "space") { if(event.code.toLowerCase() === "arrowdown") {
dialogScrollDown(event)
} else if(event.code.toLowerCase() === "arrowup") {
dialogScrollUp(event);
} else if(event.code.toLowerCase() === "space") {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
player.onMainClick(event); player.onMainClick(event);

30
Js/Pixi.min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -18,7 +18,6 @@ class Player {
this.currentCharacters = {}; this.currentCharacters = {};
this.layers = {}; this.layers = {};
this.sprites = {};
this.currentCommand = undefined; this.currentCommand = undefined;
this.runEvent = false; this.runEvent = false;
this.secondTicker = 1000; this.secondTicker = 1000;
@ -138,6 +137,13 @@ class Player {
this.loader.add(`char|${c.Arg1}|${Arg2}`, this.utage.characterInfo[c.Arg1][Arg2].FileName); this.loader.add(`char|${c.Arg1}|${Arg2}`, this.utage.characterInfo[c.Arg1][Arg2].FileName);
} }
} }
if(this.utage.soundInfo["se_変身演出"]) {
if(!toLoadSe["se_変身演出"]) {
toLoadSe["se_変身演出"] = this.utage.soundInfo["se_変身演出"];
}
} else {
console.log(`Failed to get Henshin SE: se_変身演出`);
}
break; break;
} }
case "henshin01": { case "henshin01": {
@ -157,33 +163,113 @@ class Player {
} else { } else {
console.log(`Failed to get BGM: ${c.Arg4}`); console.log(`Failed to get BGM: ${c.Arg4}`);
} }
if(this.utage.soundInfo["se_変身演出"]) {
if(!toLoadSe["se_変身演出"]) {
toLoadSe["se_変身演出"] = this.utage.soundInfo["se_変身演出"];
}
} else {
console.log(`Failed to get Henshin SE: se_変身演出`);
}
break; break;
} }
case "somethingnew_appearance01":
case "unhappyseed_appearance01":
case "unhappyseed_appearance02":
case "arcanoise_appearance02": case "arcanoise_appearance02":
case "arcanoise_appearance03": { case "arcanoise_appearance03":
let Pat = this.defaultCharPattern; case "darkaura01": {
switch(c.Command ? c.Command.toLowerCase() : '') {
case "somethingnew_appearance01":
if(this.utage.soundInfo['Se_サムシング・ニューの叫び声(アアア”ア”ア”)']) {
toLoadSe['Se_サムシング・ニューの叫び声(アアア”ア”ア”)'] = this.utage.soundInfo['Se_サムシング・ニューの叫び声(アアア”ア”ア”)'];
} else {
console.log(`Failed to get somethingnew_appearance01 SE: Se_サムシング・ニューの叫び声(アアア”ア”ア”)`);
}
break;
case "darkaura01":
case "unhappyseed_appearance02":
case "unhappyseed_appearance01":
if(this.utage.soundInfo['Se_不幸のオーラ(ヴォォオンン)']) {
toLoadSe['Se_不幸のオーラ(ヴォォオンン)'] = this.utage.soundInfo['Se_不幸のオーラ(ヴォォオンン)'];
} else {
console.log(`Failed to get unhappyseed_appearance SE: Se_不幸のオーラ(ヴォォオンン)`);
}
break;
}
let pat = this.defaultCharPattern;
if(c.Arg1) { if(c.Arg1) {
if(this.utage.characterInfo[c.Arg1] && this.utage.characterInfo[c.Arg1][Pat]) { if(this.utage.characterInfo[c.Arg1] && this.utage.characterInfo[c.Arg1][pat]) {
if(!this.loader.resources[`char|${c.Arg1}|${Pat}`]) { if(!this.loader.resources[`char|${c.Arg1}|${pat}`]) {
this.loader.add(`char|${c.Arg1}|${Pat}`, this.utage.characterInfo[c.Arg1][Pat].FileName); this.loader.add(`char|${c.Arg1}|${pat}`, this.utage.characterInfo[c.Arg1][pat].FileName);
} }
} }
} }
if(c.Arg2) { if(c.Arg2) {
if(this.utage.characterInfo[c.Arg2] && this.utage.characterInfo[c.Arg2][Pat]) { if(this.utage.characterInfo[c.Arg2] && this.utage.characterInfo[c.Arg2][pat]) {
if(!this.loader.resources[`char|${c.Arg2}|${Pat}`]) { if(!this.loader.resources[`char|${c.Arg2}|${pat}`]) {
this.loader.add(`char|${c.Arg2}|${Pat}`, this.utage.characterInfo[c.Arg2][Pat].FileName); this.loader.add(`char|${c.Arg2}|${pat}`, this.utage.characterInfo[c.Arg2][pat].FileName);
} }
} }
} }
if(c.Arg3) { if(c.Arg3) {
if(this.utage.characterInfo[c.Arg3] && this.utage.characterInfo[c.Arg3][Pat]) { if(this.utage.characterInfo[c.Arg3] && this.utage.characterInfo[c.Arg3][pat]) {
if(!this.loader.resources[`char|${c.Arg3}|${Pat}`]) { if(!this.loader.resources[`char|${c.Arg3}|${pat}`]) {
this.loader.add(`char|${c.Arg3}|${Pat}`, this.utage.characterInfo[c.Arg3][Pat].FileName); this.loader.add(`char|${c.Arg3}|${pat}`, this.utage.characterInfo[c.Arg3][pat].FileName);
} }
} }
} }
break;
} }
case "scenetitle01":
//this isint in the texture file.
this.loader.add('bg|titlecard', `${this.utage.rootDirectory}XDUData/Sample/Texture/BG/bg_title.jpg`);
break;
case "scenetitle13":
this.loader.add('bg|titlecard', `${this.utage.rootDirectory}XDUData/Sample/Texture/BG/event0010.png`);
break;
case "attachit02":
case "attachit03":
if(this.utage.soundInfo['se_打撃音']) {
toLoadSe['se_打撃音'] = this.utage.soundInfo['se_打撃音'];
} else {
console.log(`Failed to get attachit SE: se_打撃音`);
}
break;
case "attacshot02":
if(this.utage.soundInfo['se_銃撃単発']) {
toLoadSe['se_銃撃単発'] = this.utage.soundInfo['se_銃撃単発'];
} else {
console.log(`Failed to get attacshot SE: se_ガトリング音`);
}
case "attacshot11":
case "attacshot12":
if(this.utage.soundInfo['se_ガトリング音']) {
toLoadSe['se_ガトリング音'] = this.utage.soundInfo['se_ガトリング音'];
} else {
console.log(`Failed to get attacshot SE: se_ガトリング音`);
}
break;
case "attacslash01":
case "attacslash02":
case "attacslash03":
case "attacslash04":
case "attacslash05":
if(this.utage.soundInfo['se_斬撃音']) {
toLoadSe['se_斬撃音'] = this.utage.soundInfo['se_斬撃音'];
} else {
console.log(`Failed to get attacslash SE: se_斬撃音`);
}
break;
case "attaclaser01":
if(this.utage.soundInfo['se_レーザーが放たれる音']) {
toLoadSe['se_レーザーが放たれる音'] = this.utage.soundInfo['se_レーザーが放たれる音'];
} else {
console.log(`Failed to get attaclaser SE: se_レーザーが放たれる音`);
}
break;
case "":
break;
} }
} catch (error) { } catch (error) {
console.log(error); console.log(error);
@ -202,8 +288,6 @@ class Player {
}); });
//Manually load white bg for fading. Can be tinted to change color. //Manually load white bg for fading. Can be tinted to change color.
this.loader.add('bg|whiteFade', `${this.utage.rootDirectory}Images/white.png`); this.loader.add('bg|whiteFade', `${this.utage.rootDirectory}Images/white.png`);
//this isint in the texture file.
this.loader.add('bg|titlecard', `${this.utage.rootDirectory}XDUData/Sample/Texture/BG/bg_title.jpg`)
this.loader this.loader
.on("progress", (loader, resource) => { .on("progress", (loader, resource) => {
this.onPixiProgress(loader, resource); this.onPixiProgress(loader, resource);
@ -348,17 +432,11 @@ class Player {
if(pos >= 1) { if(pos >= 1) {
pos = 1; pos = 1;
toRemove.push(i); toRemove.push(i);
if(l.post) { let postRes = postLerpAction(l)
let split = l.post.split('|'); if(postRes === "continue") {
switch(split[0].toLowerCase()) {
case "destroy":
l.object.destroy();
continue; continue;
case "clearshader": } else if(postRes === "break") {
l.object.filters = null; false;
l.object.alpha = Number(split[1]);
break;
}
} }
} }
switch(l.type) { switch(l.type) {
@ -391,6 +469,18 @@ class Player {
l.object.filters[0].uniforms.time = pos; l.object.filters[0].uniforms.time = pos;
l.object.filters[0].apply(); l.object.filters[0].apply();
} catch(error) {} } catch(error) {}
break;
}
case "tint": {
let lRgb = commonFunctions.hexToRgb(l.initV);
let fRgb = commonFunctions.hexToRgb(l.finalV);
let newR = commonFunctions.lerp(lRgb[0], fRgb[0], pos, inter);
let newG = commonFunctions.lerp(lRgb[1], fRgb[1], pos, inter);
let newB = commonFunctions.lerp(lRgb[2], fRgb[2], pos, inter);
let hexValue = commonFunctions.rgbToHex([newR, newG, newB]);
let newValue = commonFunctions.getColorFromName(hexValue).color;
l.object.tint = newValue;
break;
} }
default: { default: {
let newValue = commonFunctions.lerp(l.initV, l.finalV, pos, inter); let newValue = commonFunctions.lerp(l.initV, l.finalV, pos, inter);
@ -412,6 +502,7 @@ class Player {
} catch(error) { } catch(error) {
//If we got an exception during this it probably means the object doesnt exist anymore so just remove it. //If we got an exception during this it probably means the object doesnt exist anymore so just remove it.
toRemove.push(i); toRemove.push(i);
postLerpAction(this.lerpTargets[i]);
} }
} }
for(let i = toRemove.length - 1; i > -1; --i) { for(let i = toRemove.length - 1; i > -1; --i) {
@ -420,6 +511,24 @@ class Player {
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }
function postLerpAction(postLerp) {
try {
if(!postLerp || !postLerp.object || !postLerp.post) {
return '';
}
let split = postLerp.post.split('|');
switch(split[0].toLowerCase()) {
case "destroy":
postLerp.object.destroy({children: true});
return 'continue';
case "clearshader":
postLerp.object.filters = null;
postLerp.object.alpha = Number(split[1]);
return 'break';
}
} catch(error) { }
}
} }
//Processes a line from the mission tsv //Processes a line from the mission tsv
@ -430,8 +539,11 @@ class Player {
if(cur.Arg2 === 'Off>') { if(cur.Arg2 === 'Off>') {
cur.Arg2 = '<off>'; cur.Arg2 = '<off>';
} }
if ((cur.Command || "").toLowerCase().includes('scenetitle')) {
cur.Command = 'scenetitle';
}
switch((cur.Command || "").toLowerCase()) { switch((cur.Command || "").toLowerCase()) {
case "scenetitle01": { case "scenetitle": {
this.waitTime = this.titleWaitTime * 1000; this.waitTime = this.titleWaitTime * 1000;
try { try {
let container = this.layers[this.bgLayerName].container; let container = this.layers[this.bgLayerName].container;
@ -447,9 +559,6 @@ class Player {
let text = cur.English ? (utage.translations[cur.English] || cur.Text) : cur.Text; let text = cur.English ? (utage.translations[cur.English] || cur.Text) : cur.Text;
this.text.titleText(true, text); this.text.titleText(true, text);
break; break;
}
case "scenetitle13": {
} }
case "divaeffect": { case "divaeffect": {
this.waitTime = Number(cur.Arg5) * 1000; this.waitTime = Number(cur.Arg5) * 1000;
@ -536,7 +645,7 @@ class Player {
} else { } else {
//clear the sprite for the bg currently in use. //clear the sprite for the bg currently in use.
for(let i = 0; i < container.children.length; ++i) { for(let i = 0; i < container.children.length; ++i) {
container.children[i].destroy(); container.children[i].destroy({children: true});
} }
} }
container.visible = true; container.visible = true;
@ -610,8 +719,12 @@ class Player {
break; break;
} }
case "characteroff": { case "characteroff": {
if(cur.Text) {
checkPutText(cur);
} else {
this.text.dialogText(false, ""); this.text.dialogText(false, "");
this.text.characterName(false, ""); this.text.characterName(false, "");
}
for(let c of Object.keys(this.currentCharacters)) { for(let c of Object.keys(this.currentCharacters)) {
if(!this.currentCharacters[c]) { continue; } if(!this.currentCharacters[c]) { continue; }
let curChar = this.currentCharacters[c]; let curChar = this.currentCharacters[c];
@ -623,6 +736,7 @@ class Player {
break; break;
} }
} }
break;
} }
case "tween": case "tween":
this.processTween(delta, cur); this.processTween(delta, cur);
@ -652,44 +766,93 @@ class Player {
break; break;
//custom effects //custom effects
case "henshin01_bgmoff": //101000111 case "henshin01_bgmoff": //101000111
this.waitTime = 1000; this.waitTime = 3850;
this.audio.stopSound('bgm'); this.audio.stopSound('bgm');
this.checkPutCharacterScreen(cur, true); this.checkPutCharacterScreen(cur, true);
this.audio.playSound('se_変身演出', 'Se');
break; break;
case "henshin01": case "henshin01":
this.waitTime = 1000; this.waitTime = 3850;
this.audio.stopSound('bgm'); this.audio.stopSound('bgm');
if(this.utage.soundInfo[cur.Arg4]) { if(this.utage.soundInfo[cur.Arg4]) {
this.audio.playSound(cur.Arg4, 'bgm'); this.audio.playSound(cur.Arg4, 'bgm');
} }
this.audio.playSound('se_変身演出', 'Se');
cur.Arg4 = 0; cur.Arg4 = 0;
this.checkPutCharacterScreen(cur, true); this.checkPutCharacterScreen(cur, true);
break; break;
case "attachit02": //103500221 case "attachit02": //103500221
this.waitTime = 850;
this.audio.playSound('se_打撃音', 'Se');
break; break;
case "attachit03": case "attachit03": //312000112
this.waitTime = 850;
this.audio.playSound('se_打撃音', 'Se');
break; break;
case "attacshot12": //103500231 case "attacshot02":
break; this.waitTime = 1500;
case "attacslash01": //103500642 this.audio.playSound('se_銃撃単発', 'Se');
break;
case "attacslash02": //103500231
break;
case "attacslash05": //103500552
break; break;
case "attacshot11": //103500251 case "attacshot11": //103500251
this.waitTime = 1680;
this.audio.playSound('se_ガトリング音', 'Se');
break;
case "attacshot12": //103500231
this.waitTime = 1680;
this.audio.playSound('se_ガトリング音', 'Se');
break;
case "attacslash01": //103500642
this.waitTime = 870;
this.audio.playSound('se_斬撃音', 'Se');
break;
case "attacslash02": //103500231
this.waitTime = 870;
this.audio.playSound('se_斬撃音', 'Se');
break;
case "attacslash03": //312000112
this.waitTime = 870;
this.audio.playSound('se_斬撃音', 'Se');
break;
case "attacslash04": //312000142
this.waitTime = 870;
this.audio.playSound('se_斬撃音', 'Se');
break;
case "attacslash05": //103500552
this.waitTime = 870;
this.audio.playSound('se_斬撃音', 'Se');
break;
case "attaclaser01": //312000222
this.waitTime = 2360;
this.audio.playSound('se_レーザーが放たれる音', 'Se');
break; break;
case "getitem01": //103400252 case "getitem01": //103400252
break; break;
case "skillmovie": //103500341 case "skillmovie": //103500341
break; break;
case "unhappyseed_appearance01": { //312000112
this.audio.stopSound('Se_不幸のオーラ(ヴォォオンン)');
this.audio.playSound('Se_不幸のオーラ(ヴォォオンン)', 'Se');
this.waitTime = 2000;
let customCommand = { Command: "", Arg1: cur.Arg1, Arg2: this.defaultCharPattern, Arg3: 'キャラ中央', Arg6: .5 };
this.checkPutCharacterScreen(customCommand, false);
break;
}
case "unhappyseed_appearance02": //312000111
case "arcanoise_appearance02": { //103500341 case "arcanoise_appearance02": { //103500341
if(cur.Arg1 && cur.Arg2) { let spawnTime = 0.5;
if(cur.Command.toLowerCase().includes("unhappyseed_appearance")) {
this.audio.stopSound('Se_不幸のオーラ(ヴォォオンン)');
this.audio.playSound('Se_不幸のオーラ(ヴォォオンン)', 'Se');
this.waitTime = 3000;
spawnTime = 2.5;
} else {
this.waitTime = 1000; this.waitTime = 1000;
let customCommand1 = { Command: "", Arg1: cur.Arg1, Arg2: this.defaultCharPattern, Arg3: 'キャラ右', Arg6: .5 }; }
if(cur.Arg1 && cur.Arg2) {
let customCommand1 = { Command: "", Arg1: cur.Arg1, Arg2: this.defaultCharPattern, Arg3: 'キャラ右', Arg6: spawnTime };
this.checkPutCharacterScreen(customCommand1, false); this.checkPutCharacterScreen(customCommand1, false);
let customCommand2 = { Command: "", Arg1: cur.Arg2, Arg2: this.defaultCharPattern, Arg3: 'キャラ左', Arg6: .5 }; let customCommand2 = { Command: "", Arg1: cur.Arg2, Arg2: this.defaultCharPattern, Arg3: 'キャラ左', Arg6: spawnTime };
this.checkPutCharacterScreen(customCommand2, false); this.checkPutCharacterScreen(customCommand2, false);
} }
break; break;
@ -724,7 +887,6 @@ class Player {
break; break;
} }
case "noise_disappearance03": { //103500552 case "noise_disappearance03": { //103500552
debugger;
this.waitTime = Number(cur.Arg1) * 1000; this.waitTime = Number(cur.Arg1) * 1000;
let c1 = this.currentCharacters['キャラ右'] || this.currentCharacters['キャラ右02']; let c1 = this.currentCharacters['キャラ右'] || this.currentCharacters['キャラ右02'];
if(c1) { if(c1) {
@ -745,6 +907,33 @@ class Player {
case "noise_disappearance11": //103500341 case "noise_disappearance11": //103500341
this.waitTime = Number(cur.Arg1) * 1000; this.waitTime = Number(cur.Arg1) * 1000;
break; break;
case "enemy_disappearance01": //312000112
case "enemy_disappearance02": //312000111
case "enemy_disappearance03": //312000142
this.processTryRemoveChar(cur.Arg1);
if(cur.Arg2) {
this.processTryRemoveChar(cur.Arg2);
}
if(cur.Arg3) {
this.processTryRemoveChar(cur.Arg3);
}
break;
case "darkaura01": //312000111
this.audio.stopSound('Se_不幸のオーラ(ヴォォオンン)');
this.audio.playSound('Se_不幸のオーラ(ヴォォオンン)', 'Se');
this.waitTime = 2500;
break;
case "somethingnew_appearance01": { //312000111
this.audio.playSound('Se_サムシング・ニューの叫び声(アアア”ア”ア”)', 'Se');
let c = this.currentCharacters['キャラ中央'];
this.waitTime = 4000;
if(c) {
this.lerpTargets.push({type: 'alpha', object: c.sprite, curTime: 0, time: 3000, finalV: 0, initV: 1, post: "destroy" });
}
let customCommand = { Command: "", Arg1: cur.Arg1, Arg2: this.defaultCharPattern, Arg3: 'キャラ中央', Arg6: 3 };
this.checkPutCharacterScreen(customCommand, false, true);
break;
}
case "continue01": case "continue01":
break; break;
} }
@ -799,13 +988,16 @@ class Player {
this.checkPutText(cur); this.checkPutText(cur);
} }
//Checks if the current command is trying to put a new character on the screen or not //Checks if the current command is trying to put a new character on the screen or not.
checkPutCharacterScreen(cur, special = false) { //special is used if the command actually has a command param such as Henshin since normal text commands dont.
//ignoreCurrent is used for if you are remvoing a current character yourself and don't want this to add another fade out to it such as somethingnew_appearance01.
checkPutCharacterScreen(cur, special = false, ignoreCurrent = false,) {
if((!cur.Command || special) && cur.Arg1 && this.utage.characterInfo[cur.Arg1]) { if((!cur.Command || special) && cur.Arg1 && this.utage.characterInfo[cur.Arg1]) {
let lay = undefined; let lay = undefined;
let curChar = undefined; //The character that is currently on screen with the same name as Arg1. let curChar = undefined; //The character that is currently on screen with the same name as Arg1.
let prevChar = undefined; //The character that is already on the layer we are trying to put the new char on. let prevChar = undefined; //The character that is already on the layer we are trying to put the new char on.
//First check if the character is already on screen //First check if the character is already on screen
if(!ignoreCurrent) {
for(let c of Object.keys(this.currentCharacters)) { for(let c of Object.keys(this.currentCharacters)) {
if(!this.currentCharacters[c]) { continue; } if(!this.currentCharacters[c]) { continue; }
if(this.currentCharacters[c].charName === cur.Arg1) { if(this.currentCharacters[c].charName === cur.Arg1) {
@ -816,6 +1008,7 @@ class Player {
} }
} }
} }
}
//Sometimes they don't give a pattern so just assume the default. //Sometimes they don't give a pattern so just assume the default.
if(!cur.Arg2 && !curChar) { if(!cur.Arg2 && !curChar) {
cur.Arg2 = this.defaultCharPattern; cur.Arg2 = this.defaultCharPattern;
@ -859,11 +1052,13 @@ class Player {
return; return;
} }
if(!ignoreCurrent) {
//If the layer already has a different character on it remove it. //If the layer already has a different character on it remove it.
if(prevChar && (prevChar.charName !== cur.Arg1 || prevChar.character.Pattern !== chr.Pattern)) { if(prevChar && (prevChar.charName !== cur.Arg1 || prevChar.character.Pattern !== chr.Pattern)) {
this.lerpTargets.push({type: 'alpha', object: prevChar.sprite, curTime: 0, time: 200, finalV: 0, initV: 1, post: "destroy" }); this.lerpTargets.push({type: 'alpha', object: prevChar.sprite, curTime: 0, time: 200, finalV: 0, initV: 1, post: "destroy" });
this.currentCharacters[cur.Arg3] = undefined; this.currentCharacters[cur.Arg3] = undefined;
} }
}
let sprite = new PIXI.Sprite(this.loader.resources[`char|${cur.Arg1}|${cur.Arg2}`].texture); let sprite = new PIXI.Sprite(this.loader.resources[`char|${cur.Arg1}|${cur.Arg2}`].texture);
sprite.scale.set(Number(chr.Scale), Number(chr.Scale)); sprite.scale.set(Number(chr.Scale), Number(chr.Scale));
@ -872,7 +1067,7 @@ class Player {
sprite.alpha = 0; sprite.alpha = 0;
let fadeTime = 200; let fadeTime = 200;
//If the character is already on screen put the new sprite in the same position as the old one. //If the character is already on screen put the new sprite in the same position as the old one.
if(curChar) { if(curChar && curChar.layer.info.LayerName === cur.Arg3) {
sprite.position.x = curChar.sprite.position.x; sprite.position.x = curChar.sprite.position.x;
sprite.position.y = curChar.sprite.position.y; sprite.position.y = curChar.sprite.position.y;
//if the current character is doing a tween transfer the tween to the new one. //if the current character is doing a tween transfer the tween to the new one.
@ -930,6 +1125,21 @@ class Player {
} }
} }
processTryRemoveChar(character) {
let curChar = undefined;
for(let c of Object.keys(this.currentCharacters)) {
if(!this.currentCharacters[c]) { continue; }
if(this.currentCharacters[c].charName === character) {
curChar = this.currentCharacters[c];
}
}
if(!curChar) {
return;
}
this.lerpTargets.push({type: 'alpha', object: curChar.sprite, curTime: 0, time: 500, finalV: 0, initV: 1, post: "destroy" });
this.currentCharacters[curChar.layer.info.LayerName] = undefined;
}
//Checks if the current command is trying to put text on the screen. //Checks if the current command is trying to put text on the screen.
checkPutText(cur) { checkPutText(cur) {
if(this.playingVoice) { if(this.playingVoice) {
@ -1062,13 +1272,24 @@ class Player {
case "colorto": { case "colorto": {
let props = commonFunctions.getPropertiesFromTweenCommand(cur.Arg3); let props = commonFunctions.getPropertiesFromTweenCommand(cur.Arg3);
if(props.alpha != undefined) { if(props.alpha != undefined) {
this.cancelLerpOfType('alpha', curChar.sprite);
if(props.time) { if(props.time) {
this.lerpTargets.push({type: 'alpha', object: curChar.sprite, curTime: 0 - (props.delay || 0), time: props.time, this.lerpTargets.push({type: 'alpha', object: curChar.sprite, curTime: 0 - (props.delay || 0), time: props.time,
finalV: props.alpha, initV: curChar.sprite.alpha }); finalV: props.alpha, initV: curChar.sprite.alpha });
} else { } else {
curChar.sprite.alpha = props.alpha; curChar.sprite.alpha = props.alpha;
} }
this.cancelLerpOfType('alpha', curChar.sprite);
}
if(props.color != undefined) {
this.cancelLerpOfType('tint', curChar.sprite);
let color = commonFunctions.getColorFromName(props.color);
if(props.time) {
this.lerpTargets.push({type: 'tint', object: curChar.sprite, curTime: 0 - (props.delay || 0), time: props.time,
finalV: color.color, initV: curChar.sprite.tint });
} else {
curChar.sprite.tint = color.color;
}
} }
} }
} }
@ -1163,11 +1384,11 @@ class Player {
processEndCommand(delta) { processEndCommand(delta) {
let cur = this.currentCommand; let cur = this.currentCommand;
switch(cur.Command) { switch((cur.Command || "").toLowerCase()) {
case "SceneTitle01": case "scenetitle":
this.text.titleText(false, ''); this.text.titleText(false, '');
break; break;
case "DivaEffect": case "divaeffect":
this.text.divaText(false, ''); this.text.divaText(false, '');
break; break;
} }
@ -1231,17 +1452,9 @@ class Player {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
try { try {
this.pixi.app.ticker.remove(this.onPixiTick, this); this.pixi.app.ticker.remove(this.onPixiTick, this);
this.pixi.app.stage.children.forEach(function(child) { child.destroy(true, true, true); });
for(let tex of Object.keys(PIXI.utils.TextureCache)) {
if(PIXI.utils.TextureCache[tex]) {
PIXI.utils.TextureCache[tex].destroy(true);
}
}
utage.currentPlayingFile.length = 0; utage.currentPlayingFile.length = 0;
this.loader.reset();
this.currentCharacters = {}; this.currentCharacters = {};
this.layers = {}; this.layers = {};
this.sprites = {};
this.currentCommand = undefined; this.currentCommand = undefined;
this.runEvent = false; this.runEvent = false;
this.secondTicker = 1000; this.secondTicker = 1000;
@ -1255,6 +1468,18 @@ class Player {
this.text.resetAll(); this.text.resetAll();
this.audio.resetAll(); this.audio.resetAll();
this.utage.resetTranslations(); this.utage.resetTranslations();
this.pixi.app.stage.children.forEach(function(child) { child.destroy({children: true, texture: true, baseTexture: true}); });
for(let tex of Object.keys(PIXI.utils.TextureCache)) {
if(PIXI.utils.TextureCache[tex]) {
PIXI.utils.TextureCache[tex].destroy(true);
}
}
for(let tex of Object.keys(PIXI.utils.BaseTextureCache)) {
if(PIXI.utils.BaseTextureCache[tex]) {
PIXI.utils.BaseTextureCache[tex].destroy(true);
}
}
this.loader.reset();
resolve(); resolve();
} catch (error) { } catch (error) {
reject(error); reject(error);

View File

@ -88,6 +88,7 @@ class TextFunctions {
if (this.dialogToDisplay.curPos === this.dialogToDisplay.text.length) { if (this.dialogToDisplay.curPos === this.dialogToDisplay.text.length) {
this.showNextIndicator(true); this.showNextIndicator(true);
this.scrollingText = false; this.scrollingText = false;
this.dialog.scrollTop = 0;
return; return;
} else { } else {
this.dialogToDisplay.curPos += 1; this.dialogToDisplay.curPos += 1;
@ -113,7 +114,7 @@ class TextFunctions {
this.dialogInner.innerHTML = this.dialogToDisplay.fullText; this.dialogInner.innerHTML = this.dialogToDisplay.fullText;
let lHeight = this.lineHeight * 2; let lHeight = this.lineHeight * 2;
if(this.dialogInner.offsetHeight > lHeight + 5) { if(this.dialogInner.offsetHeight > lHeight + 5) {
this.dialog.scrollTop = this.dialogInner.offsetHeight - lHeight; this.dialog.scrollTop = 0//this.dialogInner.offsetHeight - lHeight;
this.showScrollControls(true); this.showScrollControls(true);
} }
this.showNextIndicator(true); this.showNextIndicator(true);

@ -1 +1 @@
Subproject commit 33001c747cc5bad3ce398f72058088fad34124be Subproject commit 9785aafc39465a98f1c60b0656133cba3ef44ce6

View File

@ -32,10 +32,11 @@ class UtageInfo {
commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Sound.tsv`), commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Sound.tsv`),
commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Texture.tsv`), commonFunctions.getFileText(`${this.rootDirectory}XDUData/Utage/Diva/Settings/Texture.tsv`),
commonFunctions.getFileJson(`${this.rootDirectory}Js/BgmLoop.json`), commonFunctions.getFileJson(`${this.rootDirectory}Js/BgmLoop.json`),
commonFunctions.getFileJson(`${this.rootDirectory}Js/XduMissionsCustom.json`),
]; ];
Promise.all(promises) Promise.all(promises)
.then((success) => { .then((success) => {
this.groupMissions(success[0]); this.groupMissions(success[0], success[8]);
this.missionsList = Object.keys(this.groupedMissions).map((k) => { this.missionsList = Object.keys(this.groupedMissions).map((k) => {
return {Name: this.groupedMissions[k].Name, MstId: this.groupedMissions[k].MstId}; return {Name: this.groupedMissions[k].Name, MstId: this.groupedMissions[k].MstId};
}); });
@ -81,7 +82,7 @@ class UtageInfo {
} }
groupMissions(missions) { groupMissions(missions, customMissions) {
for(let key of Object.keys(missions)) { for(let key of Object.keys(missions)) {
let mis = missions[key]; let mis = missions[key];
if(!this.groupedMissions[mis.MstId]) { if(!this.groupedMissions[mis.MstId]) {
@ -96,6 +97,20 @@ class UtageInfo {
this.groupedMissions[mis.MstId].Missions[mis.Id] = { Id: mis.Id, Path: mis.Path }; this.groupedMissions[mis.MstId].Missions[mis.Id] = { Id: mis.Id, Path: mis.Path };
} }
} }
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 };
} else {
this.groupedMissions[mis.MstId].Missions[mis.Id] = { Id: mis.Id, Path: mis.Path };
}
}
} }
get translations() { get translations() {
@ -167,9 +182,16 @@ class UtageInfo {
if(this.missionTranslationsInner[this.currentTranslation]) { if(this.missionTranslationsInner[this.currentTranslation]) {
resolve(); resolve();
} else { } else {
commonFunctions.getFileJson(`${utage.rootDirectory}Js/Translations/XduMissionsNames_${this.currentTranslation}.json`) var promises = [
commonFunctions.getFileJson(`${utage.rootDirectory}Js/Translations/XduMissionsNames_${this.currentTranslation}.json`),
commonFunctions.getFileJson(`${utage.rootDirectory}Js/Translations/XduMissionsNamesCustom_${this.currentTranslation}.json`)
];
Promise.all(promises)
.then((success) => { .then((success) => {
this.missionTranslationsInner[this.currentTranslation] = success; for(let m of Object.keys(success[1])) {
success[0][m] = success[1][m];
}
this.missionTranslationsInner[this.currentTranslation] = success[0];
resolve(); resolve();
}, (failure) => { }, (failure) => {
console.log(failure); console.log(failure);

226
Js/XduMissionsCustom.json Normal file
View File

@ -0,0 +1,226 @@
{
"312000111": {
"Path": "Asset/Utage/event011/Scenario/312000111.tsv.utage",
"MstId": 338001,
"Id": "312000111",
"Name": "EV31-1:黒衣の花嫁",
"SummaryText": ""
},
"312000112": {
"Path": "Asset/Utage/event011/Scenario/312000112.tsv.utage",
"MstId": 338001,
"Id": "312000112",
"Name": "EV31-1:黒衣の花嫁",
"SummaryText": ""
},
"312000121": {
"Path": "Asset/Utage/event011/Scenario/312000121.tsv.utage",
"MstId": 338001,
"Id": "312000121",
"Name": "EV31-1:黒衣の花嫁",
"SummaryText": ""
},
"312000122": {
"Path": "Asset/Utage/event011/Scenario/312000122.tsv.utage",
"MstId": 338001,
"Id": "312000122",
"Name": "EV31-1:黒衣の花嫁",
"SummaryText": ""
},
"312000131": {
"Path": "Asset/Utage/event011/Scenario/312000131.tsv.utage",
"MstId": 338001,
"Id": "312000131",
"Name": "EV31-1:黒衣の花嫁",
"SummaryText": ""
},
"312000132": {
"Path": "Asset/Utage/event011/Scenario/312000132.tsv.utage",
"MstId": 338001,
"Id": "312000132",
"Name": "EV31-1:黒衣の花嫁",
"SummaryText": ""
},
"312000141": {
"Path": "Asset/Utage/event011/Scenario/312000141.tsv.utage",
"MstId": 338001,
"Id": "312000141",
"Name": "EV31-1:黒衣の花嫁",
"SummaryText": ""
},
"312000142": {
"Path": "Asset/Utage/event011/Scenario/312000142.tsv.utage",
"MstId": 338001,
"Id": "312000142",
"Name": "EV31-1:黒衣の花嫁",
"SummaryText": ""
},
"312000211": {
"Path": "Asset/Utage/event011/Scenario/312000211.tsv.utage",
"MstId": 338002,
"Id": "312000211",
"Name": "EV31-2:純白の光明",
"SummaryText": ""
},
"312000212": {
"Path": "Asset/Utage/event011/Scenario/312000212.tsv.utage",
"MstId": 338002,
"Id": "312000212",
"Name": "EV31-2:純白の光明",
"SummaryText": ""
},
"312000221": {
"Path": "Asset/Utage/event011/Scenario/312000221.tsv.utage",
"MstId": 338002,
"Id": "312000221",
"Name": "EV31-2:純白の光明",
"SummaryText": ""
},
"312000222": {
"Path": "Asset/Utage/event011/Scenario/312000222.tsv.utage",
"MstId": 338002,
"Id": "312000222",
"Name": "EV31-2:純白の光明",
"SummaryText": ""
},
"312000311": {
"Path": "Asset/Utage/event011/Scenario/312000311.tsv.utage",
"MstId": 338003,
"Id": "312000311",
"Name": "EV31-3:立ちはだかる黒",
"SummaryText": ""
},
"312000312": {
"Path": "Asset/Utage/event011/Scenario/312000312.tsv.utage",
"MstId": 338003,
"Id": "312000312",
"Name": "EV31-3:立ちはだかる黒",
"SummaryText": ""
},
"312000411": {
"Path": "Asset/Utage/event011/Scenario/312000411.tsv.utage",
"MstId": 338004,
"Id": "312000411",
"Name": "EV31-4:その身に纏う純白",
"SummaryText": ""
},
"312000412": {
"Path": "Asset/Utage/event011/Scenario/312000412.tsv.utage",
"MstId": 338004,
"Id": "312000412",
"Name": "EV31-4:その身に纏う純白",
"SummaryText": ""
},
"312000421": {
"Path": "Asset/Utage/event011/Scenario/312000421.tsv.utage",
"MstId": 338004,
"Id": "312000421",
"Name": "EV31-4:その身に纏う純白",
"SummaryText": ""
},
"312000422": {
"Path": "Asset/Utage/event011/Scenario/312000422.tsv.utage",
"MstId": 338004,
"Id": "312000422",
"Name": "EV31-4:その身に纏う純白",
"SummaryText": ""
},
"312000511": {
"Path": "Asset/Utage/event011/Scenario/312000511.tsv.utage",
"MstId": 338005,
"Id": "312000511",
"Name": "EV31-5:ブルー……。",
"SummaryText": ""
},
"312000512": {
"Path": "Asset/Utage/event011/Scenario/312000512.tsv.utage",
"MstId": 338005,
"Id": "312000512",
"Name": "EV31-5:ブルー……。",
"SummaryText": ""
},
"312000611": {
"Path": "Asset/Utage/event011/Scenario/312000611.tsv.utage",
"MstId": 338006,
"Id": "312000611",
"Name": "EV31-6:マリッジブルー",
"SummaryText": ""
},
"312000612": {
"Path": "Asset/Utage/event011/Scenario/312000612.tsv.utage",
"MstId": 338006,
"Id": "312000612",
"Name": "EV31-6:マリッジブルー",
"SummaryText": ""
},
"312000711": {
"Path": "Asset/Utage/event011/Scenario/312000711.tsv.utage",
"MstId": 338007,
"Id": "312000711",
"Name": "EV31-7:ウェディングドレス?",
"SummaryText": ""
},
"312000712": {
"Path": "Asset/Utage/event011/Scenario/312000712.tsv.utage",
"MstId": 338007,
"Id": "312000712",
"Name": "EV31-7:ウェディングドレス?",
"SummaryText": ""
},
"312000811": {
"Path": "Asset/Utage/event011/Scenario/312000811.tsv.utage",
"MstId": 338008,
"Id": "312000811",
"Name": "EV31-8:幸せを呼び起こせッ!",
"SummaryText": ""
},
"312000812": {
"Path": "Asset/Utage/event011/Scenario/312000812.tsv.utage",
"MstId": 338008,
"Id": "312000812",
"Name": "EV31-8:幸せを呼び起こせッ!",
"SummaryText": ""
},
"312000821": {
"Path": "Asset/Utage/event011/Scenario/312000821.tsv.utage",
"MstId": 338008,
"Id": "312000821",
"Name": "EV31-8:幸せを呼び起こせッ!",
"SummaryText": ""
},
"312000822": {
"Path": "Asset/Utage/event011/Scenario/312000822.tsv.utage",
"MstId": 338008,
"Id": "312000822",
"Name": "EV31-8:幸せを呼び起こせッ!",
"SummaryText": ""
},
"312000911": {
"Path": "Asset/Utage/event011/Scenario/312000911.tsv.utage",
"MstId": 338009,
"Id": "312000911",
"Name": "EV31-9:ブライダル戦姫ッ!",
"SummaryText": ""
},
"312000912": {
"Path": "Asset/Utage/event011/Scenario/312000912.tsv.utage",
"MstId": 338009,
"Id": "312000912",
"Name": "EV31-9:ブライダル戦姫ッ!",
"SummaryText": ""
},
"312001011": {
"Path": "Asset/Utage/event011/Scenario/312001011.tsv.utage",
"MstId": 338010,
"Id": "312001011",
"Name": "EV31-10:ウェディングドレスッ!",
"SummaryText": ""
},
"312001111": {
"Path": "Asset/Utage/event011/Scenario/312001111.tsv.utage",
"MstId": 338011,
"Id": "312001111",
"Name": "EV31-11:ふたりのしあわせ",
"SummaryText": ""
}
}

View File

@ -28,7 +28,8 @@ const cssToCopy = [
]; ];
const jsonFiles = [ const jsonFiles = [
"Js/BgmLoop.json", "Js/BgmLoop.json",
"Js/XduMissions.json" "Js/XduMissions.json",
"Js/XduMissionsCustom.json"
]; ];
const translations = [ const translations = [
"Js/Translations/**" "Js/Translations/**"