2014-07-01 15:02:52 +00:00
// t: current time, b: begInnIng value, c: change In value, d: duration
function easeOutCubic ( t , b , c , d ) {
2014-07-19 20:19:07 +00:00
return c * ( ( t = t / d - 1 ) * t * t + 1 ) + b ;
2014-07-01 15:02:52 +00:00
}
2014-06-24 00:55:04 +00:00
function renderText ( x , y , fontSize , color , text , font ) {
2014-07-03 20:30:56 +00:00
ctx . save ( ) ;
2014-06-24 00:55:04 +00:00
if ( ! font ) {
font = 'px/0 Roboto' ;
}
2014-06-22 04:26:46 +00:00
fontSize *= settings . scale ;
2014-06-24 00:55:04 +00:00
ctx . font = fontSize + font ;
2014-05-21 00:33:44 +00:00
ctx . textAlign = 'center' ;
2014-05-26 05:11:47 +00:00
ctx . fillStyle = color ;
2014-06-22 04:26:46 +00:00
ctx . fillText ( text , x , y + ( fontSize / 2 ) - 9 * settings . scale ) ;
2014-07-03 20:30:56 +00:00
ctx . restore ( ) ;
2014-05-21 00:33:44 +00:00
}
2014-06-22 16:32:23 +00:00
2014-05-26 03:42:06 +00:00
function drawScoreboard ( ) {
2014-06-24 02:26:00 +00:00
if ( scoreOpacity < 1 ) {
scoreOpacity += 0.01 ;
2014-07-02 14:58:02 +00:00
textOpacity += 0.01 ;
2014-05-26 18:24:38 +00:00
}
2014-06-24 00:55:04 +00:00
2014-07-02 14:58:02 +00:00
ctx . globalAlpha = textOpacity ;
2014-06-24 00:58:07 +00:00
if ( gameState === 0 ) {
2014-06-24 00:55:04 +00:00
renderText ( trueCanvas . width / 2 + gdx + 6 * settings . scale , trueCanvas . height / 2 + gdy , 60 , "rgb(236, 240, 241)" , String . fromCharCode ( "0xf04b" ) , 'px FontAwesome' ) ;
renderText ( trueCanvas . width / 2 + gdx + 6 * settings . scale , trueCanvas . height / 2 + gdy - 170 * settings . scale , 150 , "#2c3e50" , "Hextris" ) ;
renderText ( trueCanvas . width / 2 + gdx + 5 * settings . scale , trueCanvas . height / 2 + gdy + 100 * settings . scale , 20 , "rgb(44,62,80)" , 'Play!' ) ;
}
2014-07-02 15:10:36 +00:00
else if ( gameState != 0 && textOpacity > 0 ) {
2014-07-02 14:58:02 +00:00
textOpacity -= 0.05 ;
renderText ( trueCanvas . width / 2 + gdx + 6 * settings . scale , trueCanvas . height / 2 + gdy , 60 , "rgb(236, 240, 241)" , String . fromCharCode ( "0xf04b" ) , 'px FontAwesome' ) ;
renderText ( trueCanvas . width / 2 + gdx + 6 * settings . scale , trueCanvas . height / 2 + gdy - 170 * settings . scale , 150 , "#2c3e50" , "Hextris" ) ;
renderText ( trueCanvas . width / 2 + gdx + 5 * settings . scale , trueCanvas . height / 2 + gdy + 100 * settings . scale , 20 , "rgb(44,62,80)" , 'Play!' ) ;
ctx . globalAlpha = scoreOpacity ;
renderText ( trueCanvas . width / 2 + gdx , trueCanvas . height / 2 + gdy , 50 , "rgb(236, 240, 241)" , score ) ;
}
2014-06-24 00:55:04 +00:00
else {
2014-07-02 14:58:02 +00:00
ctx . globalAlpha = scoreOpacity ;
2014-06-24 00:55:04 +00:00
renderText ( trueCanvas . width / 2 + gdx , trueCanvas . height / 2 + gdy , 50 , "rgb(236, 240, 241)" , score ) ;
}
2014-06-24 00:58:07 +00:00
2014-05-26 18:24:38 +00:00
ctx . globalAlpha = 1 ;
2014-05-23 04:51:03 +00:00
}
2014-05-21 00:33:44 +00:00
2014-05-20 12:30:14 +00:00
function clearGameBoard ( ) {
2014-05-25 22:27:25 +00:00
drawPolygon ( trueCanvas . width / 2 , trueCanvas . height / 2 , 6 , trueCanvas . width / 2 , 30 , hexagonBackgroundColor , 0 , 'rgba(0,0,0,0)' ) ;
2014-05-20 12:30:14 +00:00
}
2014-05-26 01:49:03 +00:00
function drawPolygon ( x , y , sides , radius , theta , fillColor , lineWidth , lineColor ) {
2014-05-24 19:06:57 +00:00
ctx . fillStyle = fillColor ;
ctx . lineWidth = lineWidth ;
ctx . strokeStyle = lineColor ;
2014-05-20 12:30:14 +00:00
ctx . beginPath ( ) ;
var coords = rotatePoint ( 0 , radius , theta ) ;
ctx . moveTo ( coords . x + x , coords . y + y ) ;
var oldX = coords . x ;
var oldY = coords . y ;
for ( var i = 0 ; i < sides ; i ++ ) {
coords = rotatePoint ( oldX , oldY , 360 / sides ) ;
ctx . lineTo ( coords . x + x , coords . y + y ) ;
oldX = coords . x ;
oldY = coords . y ;
}
2014-05-25 14:41:06 +00:00
2014-05-20 12:30:14 +00:00
ctx . closePath ( ) ;
2014-05-24 19:06:57 +00:00
ctx . fill ( ) ;
ctx . stroke ( ) ;
2014-05-26 05:11:47 +00:00
ctx . strokeStyle = 'rgba(0,0,0,0)' ;
2014-05-25 14:41:06 +00:00
}
2014-05-23 05:10:12 +00:00
function showHighScores ( ) {
$ ( '#highscores' ) . html ( function ( ) {
var str = '<li> High Scores: </li>' ;
for ( var i = 0 ; i < highscores . length ; i ++ ) {
2014-07-05 13:57:51 +00:00
str += '<li>' + highscores [ i ] + '</li>' ;
2014-05-23 05:10:12 +00:00
}
return str ;
} ) ;
toggleClass ( '#highscores' , 'not-visible' ) ;
}
function toggleClass ( element , active ) {
if ( $ ( element ) . hasClass ( active ) ) {
$ ( element ) . removeClass ( active ) ;
}
else {
$ ( element ) . addClass ( active ) ;
}
2014-06-01 00:10:32 +00:00
}
2014-07-05 14:21:07 +00:00
2014-07-02 15:10:36 +00:00
function showText ( text ) {
var messages = {
2014-07-19 21:49:39 +00:00
'paused' : "<div class='centeredHeader unselectable'>Paused</div><br><div class='unselectable centeredSubHeader'>Press p to resume</div><div style='height:100px;line-height:100px;cursor:pointer;'><div class = 'centeredSubSubHeader'>Click here for the main menu!</div></div>" ,
'pausedMobile' : "<div class='centeredHeader unselectable'>Paused</div><div style='height:100px;line-height:100px;cursor:pointer;'><div class = 'centeredSubSubHeader'>Tap here for the main menu!</div></div>" ,
2014-07-05 02:23:19 +00:00
'start' : "<div class='centeredHeader unselectable' style='line-height:80px;'>Press enter to start</div>" ,
2014-07-05 13:57:51 +00:00
'gameover' : "<div class='centeredHeader unselectable'> Game Over: " + score + " pts</div><br><div style='font-size:24px;' class='centeredHeader unselectable'> High Scores:</div><table class='tg' style='margin:0px auto'>"
2014-07-02 15:10:36 +00:00
} ;
2014-07-05 13:57:51 +00:00
2014-07-05 14:21:07 +00:00
if ( text == 'gameover' ) {
var allZ = 1 ;
var i ;
for ( i = 0 ; i < 3 ; i ++ ) {
2014-07-19 22:03:16 +00:00
if ( highscores [ i ] !== undefined && highscores [ i ] != 0 ) {
2014-07-05 14:21:07 +00:00
messages [ 'gameover' ] += "<tr> <th class='tg-031e'>1.</th> <th class='tg-031e'>" + highscores [ i ] + " pts</th> </tr>" ;
}
}
var restartText ;
if ( settings . platform == 'mobile' ) {
restartText = 'Tap anywhere to restart!' ;
} else {
restartText = 'Press enter (or click anywhere!) to restart!' ;
2014-07-05 13:57:51 +00:00
}
2014-07-05 14:21:07 +00:00
messages [ 'gameover' ] += "</table><br><div class='unselectable centeredSubHeader'>" + restartText + "</div>" ;
2014-07-19 20:19:07 +00:00
if ( allZ ) {
for ( i = 0 ; i < highscores . length ; i ++ ) {
if ( highscores [ i ] != 0 ) {
allZ = 0 ;
}
2014-07-05 14:21:07 +00:00
}
2014-07-05 13:57:51 +00:00
}
}
2014-07-02 15:10:36 +00:00
var pt = document . getElementById ( "overlay" ) ;
pt . className = 'unfaded' ;
2014-07-19 20:19:07 +00:00
if ( text == 'paused' ) {
$ ( pt ) . css ( 'margin-top' , '-5%' ) ;
if ( settings . platform == 'mobile' ) {
text = 'pausedMobile' ;
}
} else {
$ ( pt ) . css ( 'margin-top' , '-10%' ) ;
2014-07-04 18:09:14 +00:00
}
2014-07-02 15:10:36 +00:00
pt . innerHTML = messages [ text ] ;
2014-07-19 21:36:43 +00:00
if ( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i . test ( navigator . userAgent ) ) {
$ ( "#restartBtn" ) . on ( 'touchstart' , function ( ) {
if ( gameState == 2 || gameState == 1 || importing == 1 ) {
init ( 1 ) ;
canRestart = false ;
}
else if ( gameState === 0 ) {
resumeGame ( ) ;
}
} ) ;
}
else {
$ ( "#restartBtn" ) . on ( 'mousedown' , function ( ) {
if ( gameState == 2 || gameState == 1 || importing == 1 ) {
init ( 1 ) ;
canRestart = false ;
}
else if ( gameState === 0 ) {
resumeGame ( ) ;
}
} ) ;
}
if ( text == 'paused' ) {
$ ( ".centeredSubSubHeader" ) . on ( 'mousedown' , function ( ) {
2014-07-19 21:49:39 +00:00
localStorage . setItem ( "saveState" , exportSaveState ( ) ) ;
setTimeout ( function ( ) { gameState = 4 ; } , 2 ) ;
2014-07-19 21:36:43 +00:00
} ) ;
} else if ( text == 'pausedMobile' ) {
$ ( ".centeredSubSubHeader" ) . on ( 'touchstart' , function ( ) {
2014-07-19 21:49:39 +00:00
localStorage . setItem ( "saveState" , exportSaveState ( ) ) ;
setTimeout ( function ( ) { gameState = 4 ; } , 2 ) ;
2014-07-19 21:36:43 +00:00
} ) ;
}
2014-07-02 15:10:36 +00:00
}
function hideText ( text ) {
var pt = document . getElementById ( "overlay" ) ;
pt . className = 'faded' ;
pt . innerHTML = '' ;
}
function gameOverDisplay ( ) {
var c = document . getElementById ( "canvas" ) ;
c . className = "blur" ;
showText ( 'gameover' ) ;
}
2014-07-04 20:42:55 +00:00
function pause ( o ) {
var message ;
if ( o ) {
message = '' ;
} else {
2014-07-05 00:33:26 +00:00
message = 'paused' ;
2014-07-04 20:42:55 +00:00
}
2014-07-02 15:10:36 +00:00
var c = document . getElementById ( "canvas" ) ;
if ( gameState == - 1 ) {
hideText ( ) ;
2014-07-19 20:19:07 +00:00
gameState = prevGameState ;
2014-07-02 15:10:36 +00:00
}
else if ( gameState != - 2 && gameState !== 0 && gameState !== 2 ) {
2014-07-05 04:32:54 +00:00
if ( message == 'paused' ) {
showText ( message ) ;
2014-07-04 20:42:55 +00:00
}
2014-07-02 15:10:36 +00:00
prevGameState = gameState ;
gameState = - 1 ;
}
2014-07-18 01:11:05 +00:00
}