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-08-02 01:35:20 +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-08-02 01:35:20 +00:00
var scoreSize = 50 ;
var scoreString = String ( score ) ;
if ( scoreString . length == 6 ) {
scoreSize = 43 ;
} else if ( scoreString . length == 7 ) {
scoreSize = 35 ;
} else if ( scoreString . length == 8 ) {
scoreSize = 31 ;
} else if ( scoreString . length == 9 ) {
scoreSize = 27 ;
2014-06-24 00:55:04 +00:00
}
2014-08-02 01:35:20 +00:00
if ( gameState === 0 ) {
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!' ) ;
} else if ( gameState != 0 && textOpacity > 0 ) {
2014-07-02 14:58:02 +00:00
textOpacity -= 0.05 ;
2014-08-02 01:35:20 +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 14:58:02 +00:00
ctx . globalAlpha = scoreOpacity ;
2014-08-02 01:35:20 +00:00
renderText ( trueCanvas . width / 2 + gdx , trueCanvas . height / 2 + gdy , scoreSize , "rgb(236, 240, 241)" , score ) ;
} else {
2014-07-02 14:58:02 +00:00
ctx . globalAlpha = scoreOpacity ;
2014-08-02 01:35:20 +00:00
renderText ( trueCanvas . width / 2 + gdx , trueCanvas . height / 2 + gdy , scoreSize , "rgb(236, 240, 241)" , score ) ;
2014-06-24 00:55:04 +00:00
}
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-08-02 01:35:20 +00:00
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 toggleClass ( element , active ) {
if ( $ ( element ) . hasClass ( active ) ) {
$ ( element ) . removeClass ( active ) ;
2014-08-02 01:35:20 +00:00
} else {
2014-05-23 05:10:12 +00:00
$ ( element ) . addClass ( active ) ;
}
2014-06-01 00:10:32 +00:00
}
2014-07-05 14:21:07 +00:00
2014-08-02 01:35:20 +00:00
function showText ( text ) {
2014-07-02 15:10:36 +00:00
var messages = {
2014-08-02 01:35:20 +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>" ,
'pausedMobile' : "<div class='centeredHeader unselectable'>Paused</div><br><div class='unselectable centeredSubHeader'>Press <i class='fa fa-play'></i> to resume</div><div style='height:100px;line-height:100px;cursor:pointer;'></div>" ,
'start' : "<div class='centeredHeader unselectable' style='line-height:80px;'>Press enter to start</div>" ,
'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-27 23:10:40 +00:00
if ( text == 'paused' ) {
if ( settings . platform == 'mobile' ) {
text = 'pausedMobile' ;
}
}
2014-08-02 01:35:20 +00:00
2014-07-05 14:21:07 +00:00
if ( text == 'gameover' ) {
var allZ = 1 ;
var i ;
2014-08-02 01:31:24 +00:00
2014-07-05 14:21:07 +00:00
for ( i = 0 ; i < 3 ; i ++ ) {
2014-07-24 15:16:53 +00:00
if ( highscores . length > i ) {
2014-08-02 01:35:20 +00:00
messages [ 'gameover' ] += "<tr> <th class='tg-031e'>" + ( i + 1 ) + ".</th> <th class='tg-031e'>" + highscores [ i ] + " pts</th> </tr>" ;
2014-07-05 14:21:07 +00:00
}
}
2014-08-02 01:35:20 +00:00
2014-07-05 14:21:07 +00:00
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-08-02 01:35:20 +00:00
2014-07-19 20:19:07 +00:00
if ( allZ ) {
for ( i = 0 ; i < highscores . length ; i ++ ) {
2014-07-24 15:16:53 +00:00
if ( highscores [ i ] !== 0 ) {
2014-07-19 20:19:07 +00:00
allZ = 0 ;
}
2014-07-05 14:21:07 +00:00
}
2014-07-05 13:57:51 +00:00
}
}
2014-07-26 13:23:03 +00:00
$ ( "#overlay" ) . html ( messages [ text ] ) ;
2014-08-02 01:35:20 +00:00
$ ( "#overlay" ) . fadeIn ( "1000" , "swing" ) ;
2014-07-19 21:36:43 +00:00
2014-07-23 01:52:02 +00:00
if ( text == 'gameover' ) {
if ( settings . platform == 'mobile' ) {
$ ( '.tg' ) . css ( 'margin-top' , '4px' ) ;
}
2014-07-19 21:36:43 +00:00
}
2014-07-02 15:10:36 +00:00
}
2014-07-19 22:06:14 +00:00
function setMainMenu ( ) {
2014-07-19 22:51:35 +00:00
gameState = 4 ;
canRestart = false ;
2014-08-02 01:35:20 +00:00
setTimeout ( function ( ) {
2014-07-19 22:51:35 +00:00
canRestart = 's' ;
} , 500 ) ;
$ ( '#restartBtn' ) . show ( ) ;
2014-07-19 22:06:14 +00:00
if ( $ ( $ ( "#pauseBtn" ) . children ( ) [ 0 ] ) . attr ( 'class' ) . indexOf ( 'pause' ) == - 1 ) {
2014-07-27 23:10:40 +00:00
$ ( "#pauseBtnInner" ) . html ( '<i class="fa fa-pause fa-2x"></i>' ) ;
2014-07-19 22:06:14 +00:00
} else {
2014-07-27 23:10:40 +00:00
$ ( "#pauseBtnInner" ) . html ( '<i class="fa fa-play fa-2x"></i>' ) ;
2014-07-19 22:06:14 +00:00
}
}
2014-07-24 15:16:53 +00:00
function hideText ( ) {
2014-08-02 01:35:20 +00:00
$ ( "#overlay" ) . fadeOut ( "1000" , function ( ) {
$ ( "#overlay" ) . html ( "" ) ;
} )
2014-07-02 15:10:36 +00:00
}
2014-07-24 15:16:53 +00:00
2014-08-02 01:35:20 +00:00
function gameOverDisplay ( ) {
2014-07-26 13:23:03 +00:00
$ ( "#attributions" ) . show ( ) ;
2014-07-02 15:10:36 +00:00
var c = document . getElementById ( "canvas" ) ;
c . className = "blur" ;
showText ( 'gameover' ) ;
2014-07-26 13:23:03 +00:00
showbottombar ( ) ;
2014-07-02 15:10:36 +00:00
}
2014-07-04 20:42:55 +00:00
function pause ( o ) {
2014-07-26 13:23:03 +00:00
writeHighScores ( ) ;
2014-07-04 20:42:55 +00:00
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" ) ;
2014-07-20 02:03:22 +00:00
if ( gameState == - 1 ) {
if ( $ ( '#helpScreen' ) . is ( ':visible' ) ) {
$ ( '#helpScreen' ) . fadeOut ( 150 , "linear" ) ;
}
2014-07-27 23:10:40 +00:00
$ ( "#pauseBtnInner" ) . html ( '<i class="fa fa-pause fa-2x"></i>' ) ;
2014-07-24 02:00:46 +00:00
$ ( '.helpText' ) . fadeOut ( 200 , 'linear' ) ;
2014-07-02 15:10:36 +00:00
hideText ( ) ;
2014-07-22 01:41:04 +00:00
hidebottombar ( ) ;
2014-08-02 01:35:20 +00:00
setTimeout ( function ( ) {
2014-07-26 13:23:03 +00:00
gameState = prevGameState ;
2014-08-02 01:35:20 +00:00
} , 200 )
2014-07-02 15:10:36 +00:00
2014-08-02 01:35:20 +00:00
} else if ( gameState != - 2 && gameState !== 0 && gameState !== 2 ) {
2014-07-24 02:00:46 +00:00
$ ( '.helpText' ) . fadeIn ( 200 , 'linear' ) ;
2014-07-22 01:41:04 +00:00
showbottombar ( ) ;
2014-07-05 04:32:54 +00:00
if ( message == 'paused' ) {
showText ( message ) ;
2014-07-04 20:42:55 +00:00
}
2014-08-02 01:35:20 +00:00
2014-07-27 23:10:40 +00:00
$ ( "#pauseBtnInner" ) . html ( '<i class="fa fa-play fa-2x"></i>' ) ;
2014-07-02 15:10:36 +00:00
prevGameState = gameState ;
gameState = - 1 ;
}
2014-08-09 13:39:02 +00:00
}