You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
230 lines
7.3 KiB
230 lines
7.3 KiB
function DialogueSequence( sequence ){ |
|
|
|
var targetStory = story[sequence] ? story[sequence].slice(0) : ( messages[sequence] ? messages[sequence].slice(0) : [] ); |
|
|
|
return { |
|
next: function(){ |
|
return targetStory.shift().split(": "); |
|
}, |
|
more: function(){ |
|
return targetStory.length > 0; |
|
} |
|
} |
|
} |
|
|
|
function DialogUI( stage, gameState ){ |
|
var that = this; |
|
// Dialog States |
|
var DIALOG_RECEDING = 0; |
|
var DIALOG_SHOWING = 1; |
|
var DIALOG_PAUSING = 2; |
|
var MILLIS_PER_CHAR = 100; |
|
|
|
var peopleImg = { |
|
"Boyfriend": new createjs.Bitmap("res/people/Boyfriend.png"), |
|
"Brother": new createjs.Bitmap("res/people/Brother.png"), |
|
"Cat": new createjs.Bitmap("res/people/Cat.png"), |
|
"Dad": new createjs.Bitmap("res/people/Dad.png"), |
|
"Girlfriend": new createjs.Bitmap("res/people/Girlfriend.png"), |
|
"Grandma": new createjs.Bitmap("res/people/Grandma.png"), |
|
"Grandpa": new createjs.Bitmap("res/people/Grandpa.png"), |
|
"Mom": new createjs.Bitmap("res/people/Mom.png"), |
|
"Female": new createjs.Bitmap("res/people/PlayerFemale.png"), |
|
"Male": new createjs.Bitmap("res/people/PlayerMale.png"), |
|
"Turkey": new createjs.Bitmap("res/people/TurkeyGhost.png") |
|
}; |
|
|
|
var dialogueList = Object.keys(story); |
|
|
|
this.dialogSpeed = 30; |
|
this.dialogState = DIALOG_PAUSING; |
|
|
|
this.dialogMotionQueue = [DIALOG_RECEDING]; |
|
this.currDialogueSeq = new DialogueSequence("Null"); |
|
dialogQueue = []; |
|
|
|
this.dialogBox = new createjs.Bitmap("res/screens/GUI/DialogueBox.png"); |
|
this.dialogBox.x = 0; |
|
this.dialogBox.y = 250; |
|
|
|
this.currentFace = peopleImg["Male"]; |
|
this.currentFace.x = 0; |
|
|
|
this.textContent = new createjs.Text( "", "24px Arial", "black" ); |
|
this.textContent.x = 205; |
|
this.textContent.y = 705; |
|
this.textContent.lineWidth = 565; |
|
this.textContent.lineHeight = 30; |
|
this.textContent.textBaseline = "alphabetic"; |
|
|
|
this.dialogBox.addEventListener( "mouseover", function(){ document.body.style.cursor='pointer'; } ); |
|
this.dialogBox.addEventListener( "mouseout", function(){ document.body.style.cursor='default'; } ); |
|
this.dialogBox.addEventListener( "click", function(){ setTimeout( clickEvent, 100); }); |
|
|
|
this.textContent.addEventListener( "mouseover", function(){ document.body.style.cursor='pointer'; } ); |
|
this.textContent.addEventListener( "mouseout", function(){ document.body.style.cursor='default'; } ); |
|
this.textContent.addEventListener( "click", function(){ setTimeout( clickEvent, 100); }); |
|
|
|
// negate double setTimeout if clicked |
|
var oldTime = new Date().getTime(); |
|
var delayCounter = 0; |
|
|
|
this.endFunc = function(){}; |
|
|
|
this.showDialog= function( textSeq ){ |
|
if(DEBUG) console.log("showing"+ textSeq); |
|
if( !peopleImg["Me"] ){ |
|
peopleImg["Me"] = peopleImg[gameState.gender]; |
|
} |
|
|
|
if( !peopleImg["Spouse"] ){ |
|
if( gameState.gender == "Male" ){ |
|
peopleImg["Spouse"] = peopleImg["Girlfriend"] ; |
|
}else{ |
|
peopleImg["Spouse"] = peopleImg["Boyfriend"] ; |
|
} |
|
} |
|
|
|
if( textSeq.seq == "custom" ){ |
|
messages["custom"] = ["Me: " + textSeq.customText ]; |
|
} |
|
|
|
|
|
if( textSeq.random ){ |
|
that.showRandomConvo(); |
|
return; |
|
} |
|
delayCounter = 0; |
|
oldTime = new Date().getTime(); |
|
that.currDialogueSeq = new DialogueSequence( textSeq.seq ); |
|
var nextDialogue = that.currDialogueSeq.next(); |
|
|
|
that.endFunc = textSeq.endFunc || function(){}; |
|
|
|
that.textContent.text=nextDialogue[1].replace(/\[GenderPronoun\]/g, gameState.pronoun ).replace(/\[Player\]/g, gameState.name || "Sam" ); |
|
|
|
that.currentFace.y = 250; |
|
that.currentFace = peopleImg[nextDialogue[0]] || that.currentFace; |
|
that.autoAdvance = textSeq.autoAdvance; |
|
that.dialogMotionQueue = [DIALOG_SHOWING]; |
|
} |
|
|
|
this.showRandomConvo = function(){ |
|
// No more stories, thanks for playing |
|
if( dialogueList.length == 0 ) return; |
|
|
|
dialogueList = Object.keys(story); |
|
var randomKey = UtilityFunctions.randRange(0, dialogueList.length); |
|
|
|
// check if there is something going on |
|
if( !that.currDialogueSeq.more() ){ |
|
if(DEBUG) console.log("random story"); |
|
this.showDialog( {seq: dialogueList[ randomKey ] || "Dad Tells a bad Joke", autoAdvance:true } ); |
|
delete story[ dialogueList[ randomKey ] ]; |
|
gameState.dialogueHeard++; |
|
} |
|
} |
|
|
|
gameState.pubsub.subscribe( "ShowDialog", this.showDialog ); |
|
|
|
var clickEvent = function( timer ){ |
|
|
|
if( !peopleImg["Me"] ){ |
|
peopleImg["Me"] = peopleImg[gameState.gender]; |
|
} |
|
|
|
// if there is more dialogue text, then keep going, otherwise, recede |
|
if( that.currDialogueSeq.more() ){ |
|
var nextDialogue = that.currDialogueSeq.next(); |
|
|
|
that.dialogMotionQueue.push(DIALOG_SHOWING); |
|
that.textContent.text=nextDialogue[1].replace(/\[GenderPronoun\]/g, gameState.pronoun ).replace(/\[Player\]/g, gameState.name || "Sam" ); |
|
if(DEBUG) console.log("showing face:" +nextDialogue[0] ); |
|
|
|
// swap out face immediately |
|
that.currentFace.y = 250; |
|
that.currentFace = peopleImg[nextDialogue[0]] || that.currentFace; |
|
that.currentFace.y = 0; |
|
}else{ |
|
// pause and close dialog |
|
setTimeout( function(){ |
|
that.dialogMotionQueue.push(DIALOG_RECEDING); |
|
if( that.endFunc ) |
|
that.endFunc(); |
|
}, 250 ); |
|
} |
|
delayCounter = 0; |
|
oldTime = new Date().getTime(); |
|
} |
|
|
|
stage.addChild( this.dialogBox ); |
|
stage.addChild( this.textContent ); |
|
|
|
for(var i in peopleImg ){ |
|
peopleImg[i].alpha = 1; |
|
peopleImg[i].y = 250; |
|
stage.addChild( peopleImg[i] ); |
|
} |
|
|
|
return { |
|
tick: function(){ |
|
|
|
if( that.autoAdvance == true && that.dialogBox.y ==0 && delayCounter > ( (that.textContent.text.length * MILLIS_PER_CHAR) < 2000 ? 2000 : (that.textContent.text.length * MILLIS_PER_CHAR) ) ){ |
|
clickEvent(); |
|
} |
|
|
|
if( that.dialogState == DIALOG_RECEDING ){ |
|
that.dialogBox.y+=that.dialogSpeed; |
|
that.textContent.y += that.dialogSpeed; |
|
that.currentFace.y += that.dialogSpeed; |
|
//if(DEBUG) console.log( "Receding" + that.dialogBox.y ); |
|
} |
|
if( that.dialogState == DIALOG_SHOWING ){ |
|
that.dialogBox.y-=that.dialogSpeed; |
|
that.textContent.y -= that.dialogSpeed; |
|
that.currentFace.y -= that.dialogSpeed; |
|
//if(DEBUG) console.log( "Advancing" + that.dialogBox.y ); |
|
} |
|
|
|
// toggle states |
|
if( that.dialogBox.y > 250 && that.dialogState == DIALOG_RECEDING ){ |
|
that.dialogBox.y = 250; |
|
that.textContent.y = 735; |
|
that.currentFace.y = 250; |
|
that.dialogState = DIALOG_PAUSING; |
|
//if(DEBUG) console.log( "Pausing on recede" + that.dialogBox.y ); |
|
|
|
} |
|
if( that.dialogBox.y < 0 && that.dialogState == DIALOG_SHOWING ){ |
|
that.dialogBox.y = 0; |
|
that.textContent.y = 480; |
|
that.currentFace.y = 0; |
|
that.dialogState = DIALOG_PAUSING; |
|
//if(DEBUG) console.log( "Pausing on showing" + that.dialogBox.y ); |
|
} |
|
|
|
/* next states if there are any on the queue */ |
|
if( that.dialogMotionQueue.length > 0 && that.dialogState == DIALOG_PAUSING ){ |
|
that.dialogState = that.dialogMotionQueue.shift(); |
|
} |
|
delayCounter = new Date().getTime() - oldTime; |
|
}, |
|
|
|
minDialog: function(){ |
|
that.dialogMotionQueue.push( DIALOG_RECEDING ); |
|
}, |
|
|
|
maxDialog: function(){ |
|
that.dialogMotionQueue.push( DIALOG_SHOWING ); |
|
}, |
|
render: function(){ |
|
stage.addChild( that.dialogBox ); |
|
stage.addChild( that.textContent ); |
|
|
|
for(var i in peopleImg ){ |
|
peopleImg[i].alpha = 1; |
|
stage.addChild( peopleImg[i] ); |
|
} |
|
} |
|
} |
|
} |