2014-08-23 02:10:55 +00:00
function scaleCanvas ( ) {
2015-05-24 14:54:12 +00:00
canvas . width = $ ( window ) . width ( ) ;
canvas . height = $ ( window ) . height ( ) ;
if ( canvas . height > canvas . width ) {
settings . scale = ( canvas . width / 800 ) * settings . baseScale ;
} else {
settings . scale = ( canvas . height / 800 ) * settings . baseScale ;
}
trueCanvas = {
width : canvas . width ,
height : canvas . height
} ;
if ( window . devicePixelRatio ) {
var cw = $ ( "#canvas" ) . attr ( 'width' ) ;
var ch = $ ( "#canvas" ) . attr ( 'height' ) ;
$ ( "#canvas" ) . attr ( 'width' , cw * window . devicePixelRatio ) ;
$ ( "#canvas" ) . attr ( 'height' , ch * window . devicePixelRatio ) ;
$ ( "#canvas" ) . css ( 'width' , cw ) ;
$ ( "#canvas" ) . css ( 'height' , ch ) ;
trueCanvas = {
width : cw ,
height : ch
} ;
ctx . scale ( window . devicePixelRatio , window . devicePixelRatio ) ;
}
2015-09-21 06:27:05 +00:00
setBottomContainer ( ) ;
set _score _pos ( ) ;
}
2015-08-27 05:10:20 +00:00
2015-09-21 06:27:05 +00:00
function setBottomContainer ( ) {
2015-08-27 05:10:20 +00:00
var buttonOffset = $ ( "#buttonCont" ) . offset ( ) . top ;
var playOffset = trueCanvas . height / 2 + 100 * settings . scale ;
var delta = buttonOffset - playOffset - 29 ;
if ( delta < 0 ) {
$ ( "#bottomContainer" ) . css ( "margin-bottom" , "-" + Math . abs ( delta ) + "px" ) ;
}
2014-08-23 02:10:55 +00:00
}
2015-09-21 06:27:05 +00:00
function set _score _pos ( ) {
$ ( "#container" ) . css ( 'margin-top' , '0' ) ;
2015-09-26 02:02:57 +00:00
var middle _of _container = ( $ ( "#container" ) . height ( ) / 2 + $ ( "#container" ) . offset ( ) . top ) ;
2015-09-21 06:27:05 +00:00
var top _of _bottom _container = $ ( "#buttonCont" ) . offset ( ) . top
2015-09-26 02:02:57 +00:00
var igt = $ ( "#highScoreInGameText" )
var igt _bottom = igt . offset ( ) . top + igt [ 0 ] . offsetHeight
var target _midpoint = ( top _of _bottom _container + igt _bottom ) / 2
var diff = ( target _midpoint - middle _of _container )
$ ( "#container" ) . css ( "margin-top" , diff + "px" ) ;
2015-09-21 06:27:05 +00:00
}
2014-08-23 02:10:55 +00:00
function toggleDevTools ( ) {
2015-05-24 14:54:12 +00:00
$ ( '#devtools' ) . toggle ( ) ;
2014-08-23 02:10:55 +00:00
}
function resumeGame ( ) {
2015-05-24 14:54:12 +00:00
gameState = 1 ;
hideUIElements ( ) ;
$ ( '#pauseBtn' ) . show ( ) ;
$ ( '#restartBtn' ) . hide ( ) ;
importing = 0 ;
startTime = Date . now ( ) ;
setTimeout ( function ( ) {
if ( ( gameState == 1 || gameState == 2 ) && ! $ ( '#helpScreen' ) . is ( ':visible' ) ) {
2015-05-24 16:35:09 +00:00
$ ( '#openSideBar' ) . fadeOut ( 150 , "linear" ) ;
2015-05-24 14:54:12 +00:00
}
} , 7000 ) ;
checkVisualElements ( ) ;
2014-08-23 02:10:55 +00:00
}
function checkVisualElements ( ) {
2015-05-24 16:35:09 +00:00
if ( $ ( '#openSideBar' ) . is ( ":visible" ) ) $ ( '#openSideBar' ) . fadeOut ( 150 , "linear" ) ;
2015-05-24 14:54:12 +00:00
if ( ! $ ( '#pauseBtn' ) . is ( ':visible' ) ) $ ( '#pauseBtn' ) . fadeIn ( 150 , "linear" ) ;
$ ( '#fork-ribbon' ) . fadeOut ( 150 ) ;
if ( ! $ ( '#restartBtn' ) . is ( ':visible' ) ) $ ( '#restartBtn' ) . fadeOut ( 150 , "linear" ) ;
2015-05-30 15:53:46 +00:00
if ( $ ( '#buttonCont' ) . is ( ':visible' ) ) $ ( '#buttonCont' ) . fadeOut ( 150 , "linear" ) ;
2014-08-23 02:10:55 +00:00
}
function hideUIElements ( ) {
2015-05-24 14:54:12 +00:00
$ ( '#pauseBtn' ) . hide ( ) ;
$ ( '#restartBtn' ) . hide ( ) ;
$ ( '#startBtn' ) . hide ( ) ;
2014-08-23 02:10:55 +00:00
}
function init ( b ) {
2015-05-24 14:54:12 +00:00
if ( settings . ending _block && b == 1 ) { return ; }
if ( b ) {
2015-09-21 06:27:05 +00:00
$ ( "#pauseBtn" ) . attr ( 'src' , "./images/btn_pause.svg" ) ;
if ( $ ( '#helpScreen' ) . is ( ":visible" ) ) {
$ ( '#helpScreen' ) . fadeOut ( 150 , "linear" ) ;
}
2015-05-24 14:54:12 +00:00
2015-09-21 06:27:05 +00:00
setTimeout ( function ( ) {
$ ( '#openSideBar' ) . fadeOut ( 150 , "linear" ) ;
infobuttonfading = false ;
} , 7000 ) ;
clearSaveState ( ) ;
checkVisualElements ( ) ;
2015-05-24 14:54:12 +00:00
}
2015-08-27 01:28:53 +00:00
if ( highscores . length === 0 ) {
$ ( "#currentHighScore" ) . text ( 0 ) ;
}
else {
$ ( "#currentHighScore" ) . text ( highscores [ 0 ] )
}
2015-05-24 14:54:12 +00:00
infobuttonfading = true ;
2015-05-24 16:35:09 +00:00
$ ( "#pauseBtn" ) . attr ( 'src' , "./images/btn_pause.svg" ) ;
2015-05-24 14:54:12 +00:00
hideUIElements ( ) ;
var saveState = localStorage . getItem ( "saveState" ) || "{}" ;
saveState = JSONfn . parse ( saveState ) ;
document . getElementById ( "canvas" ) . className = "" ;
history = { } ;
importedHistory = undefined ;
importing = 0 ;
score = saveState . score || 0 ;
prevScore = 0 ;
spawnLane = 0 ;
op = 0 ;
tweetblock = false ;
scoreOpacity = 0 ;
gameState = 1 ;
$ ( "#restartBtn" ) . hide ( ) ;
$ ( "#pauseBtn" ) . show ( ) ;
if ( saveState . hex !== undefined ) gameState = 1 ;
settings . blockHeight = settings . baseBlockHeight * settings . scale ;
settings . hexWidth = settings . baseHexWidth * settings . scale ;
MainHex = saveState . hex || new Hex ( settings . hexWidth ) ;
if ( saveState . hex ) {
MainHex . playThrough += 1 ;
}
MainHex . sideLength = settings . hexWidth ;
var i ;
var block ;
if ( saveState . blocks ) {
saveState . blocks . map ( function ( o ) {
if ( rgbToHex [ o . color ] ) {
o . color = rgbToHex [ o . color ] ;
}
} ) ;
for ( i = 0 ; i < saveState . blocks . length ; i ++ ) {
block = saveState . blocks [ i ] ;
blocks . push ( block ) ;
}
} else {
blocks = [ ] ;
}
gdx = saveState . gdx || 0 ;
gdy = saveState . gdy || 0 ;
comboTime = saveState . comboTime || 0 ;
for ( i = 0 ; i < MainHex . blocks . length ; i ++ ) {
for ( var j = 0 ; j < MainHex . blocks [ i ] . length ; j ++ ) {
MainHex . blocks [ i ] [ j ] . height = settings . blockHeight ;
MainHex . blocks [ i ] [ j ] . settled = 0 ;
}
}
MainHex . blocks . map ( function ( i ) {
i . map ( function ( o ) {
if ( rgbToHex [ o . color ] ) {
o . color = rgbToHex [ o . color ] ;
}
} ) ;
} ) ;
MainHex . y = - 100 ;
startTime = Date . now ( ) ;
waveone = saveState . wavegen || new waveGen ( MainHex ) ;
MainHex . texts = [ ] ; //clear texts
MainHex . delay = 15 ;
hideText ( ) ;
2014-08-23 02:10:55 +00:00
}
function addNewBlock ( blocklane , color , iter , distFromHex , settled ) { //last two are optional parameters
2015-05-24 14:54:12 +00:00
iter *= settings . speedModifier ;
if ( ! history [ MainHex . ct ] ) {
history [ MainHex . ct ] = { } ;
}
history [ MainHex . ct ] . block = {
blocklane : blocklane ,
color : color ,
iter : iter
} ;
if ( distFromHex ) {
history [ MainHex . ct ] . distFromHex = distFromHex ;
}
if ( settled ) {
blockHist [ MainHex . ct ] . settled = settled ;
}
blocks . push ( new Block ( blocklane , color , iter , distFromHex , settled ) ) ;
2014-08-23 02:10:55 +00:00
}
function exportHistory ( ) {
2015-05-24 14:54:12 +00:00
$ ( '#devtoolsText' ) . html ( JSON . stringify ( history ) ) ;
toggleDevTools ( ) ;
2014-08-23 02:10:55 +00:00
}
function setStartScreen ( ) {
2015-05-24 14:54:12 +00:00
$ ( '#startBtn' ) . show ( ) ;
init ( ) ;
if ( isStateSaved ( ) ) {
importing = 0 ;
} else {
importing = 1 ;
}
$ ( '#pauseBtn' ) . hide ( ) ;
$ ( '#restartBtn' ) . hide ( ) ;
$ ( '#startBtn' ) . show ( ) ;
gameState = 0 ;
requestAnimFrame ( animLoop ) ;
2014-08-23 02:10:55 +00:00
}
2014-11-01 23:23:58 +00:00
var spd = 1 ;
2014-08-23 02:10:55 +00:00
function animLoop ( ) {
2015-05-24 14:54:12 +00:00
switch ( gameState ) {
2015-09-21 06:27:05 +00:00
case 1 :
requestAnimFrame ( animLoop ) ;
render ( ) ;
var now = Date . now ( ) ;
var dt = ( now - lastTime ) / 16.666 * rush ;
if ( spd > 1 ) {
dt *= spd ;
}
2015-05-24 14:54:12 +00:00
2015-09-21 06:27:05 +00:00
if ( gameState == 1 ) {
if ( ! MainHex . delay ) {
update ( dt ) ;
2015-05-24 14:54:12 +00:00
}
2015-09-21 06:27:05 +00:00
else {
MainHex . delay -- ;
}
}
2015-05-24 14:54:12 +00:00
2015-09-21 06:27:05 +00:00
lastTime = now ;
2015-05-24 14:54:12 +00:00
2015-09-21 06:27:05 +00:00
if ( checkGameOver ( ) && ! importing ) {
var saveState = localStorage . getItem ( "saveState" ) || "{}" ;
saveState = JSONfn . parse ( saveState ) ;
gameState = 2 ;
2015-05-24 14:54:12 +00:00
2015-09-21 06:27:05 +00:00
setTimeout ( function ( ) {
enableRestart ( ) ;
} , 150 ) ;
2015-05-24 14:54:12 +00:00
2015-09-21 06:27:05 +00:00
if ( $ ( '#helpScreen' ) . is ( ':visible' ) ) {
$ ( '#helpScreen' ) . fadeOut ( 150 , "linear" ) ;
}
2015-05-24 14:54:12 +00:00
2015-09-21 06:27:05 +00:00
if ( $ ( '#pauseBtn' ) . is ( ':visible' ) ) $ ( '#pauseBtn' ) . fadeOut ( 150 , "linear" ) ;
if ( $ ( '#restartBtn' ) . is ( ':visible' ) ) $ ( '#restartBtn' ) . fadeOut ( 150 , "linear" ) ;
if ( $ ( '#openSideBar' ) . is ( ':visible' ) ) $ ( '.openSideBar' ) . fadeOut ( 150 , "linear" ) ;
2015-05-24 14:54:12 +00:00
2015-09-21 06:27:05 +00:00
canRestart = 0 ;
clearSaveState ( ) ;
}
break ;
case 0 :
requestAnimFrame ( animLoop ) ;
render ( ) ;
break ;
case - 1 :
requestAnimFrame ( animLoop ) ;
render ( ) ;
break ;
case 2 :
var now = Date . now ( ) ;
var dt = ( now - lastTime ) / 16.666 * rush ;
requestAnimFrame ( animLoop ) ;
update ( dt ) ;
render ( ) ;
lastTime = now ;
break ;
case 3 :
requestAnimFrame ( animLoop ) ;
fadeOutObjectsOnScreen ( ) ;
render ( ) ;
break ;
case 4 :
setTimeout ( function ( ) {
initialize ( 1 ) ;
} , 1 ) ;
render ( ) ;
return ;
default :
initialize ( ) ;
setStartScreen ( ) ;
break ;
2015-05-24 14:54:12 +00:00
}
if ( ! ( gameState == 1 || gameState == 2 ) ) {
lastTime = Date . now ( ) ;
}
2014-08-23 02:10:55 +00:00
}
function enableRestart ( ) {
2015-05-24 14:54:12 +00:00
canRestart = 1 ;
2014-08-23 02:10:55 +00:00
}
function isInfringing ( hex ) {
2015-05-24 14:54:12 +00:00
for ( var i = 0 ; i < hex . sides ; i ++ ) {
var subTotal = 0 ;
for ( var j = 0 ; j < hex . blocks [ i ] . length ; j ++ ) {
subTotal += hex . blocks [ i ] [ j ] . deleted ;
}
if ( hex . blocks [ i ] . length - subTotal > settings . rows ) {
return true ;
}
}
return false ;
2014-08-23 02:10:55 +00:00
}
function checkGameOver ( ) {
2015-05-24 14:54:12 +00:00
for ( var i = 0 ; i < MainHex . sides ; i ++ ) {
if ( isInfringing ( MainHex ) ) {
$ . get ( 'http://54.183.184.126/' + String ( score ) )
if ( highscores . indexOf ( score ) == - 1 ) {
highscores . push ( score ) ;
}
writeHighScores ( ) ;
gameOverDisplay ( ) ;
return true ;
}
}
return false ;
2014-08-23 02:10:55 +00:00
}
function showHelp ( ) {
2015-05-26 14:52:15 +00:00
if ( $ ( '#openSideBar' ) . attr ( 'src' ) == './images/btn_back.svg' ) {
$ ( '#openSideBar' ) . attr ( 'src' , './images/btn_help.svg' ) ;
if ( gameState != 0 && gameState != - 1 && gameState != 2 ) {
$ ( '#fork-ribbon' ) . fadeOut ( 150 , 'linear' ) ;
}
} else {
$ ( '#openSideBar' ) . attr ( 'src' , './images/btn_back.svg' ) ;
if ( gameState == 0 && gameState == - 1 && gameState == 2 ) {
$ ( '#fork-ribbon' ) . fadeIn ( 150 , 'linear' ) ;
}
}
2015-06-10 23:08:04 +00:00
$ ( "#inst_main_body" ) . html ( "<div id = 'instructions_head'>HOW TO PLAY</div><p>The goal of Hextris is to stop blocks from leaving the inside of the outer gray hexagon.</p><p>" + ( settings . platform != 'mobile' ? 'Press the right and left arrow keys' : 'Tap the left and right sides of the screen' ) + " to rotate the Hexagon</p><p>Clear blocks and get points by making 3 or more blocks of the same color touch.</p><p>Time left before your combo streak disappears is indicated by <span style='color:#f1c40f;'>the</span> <span style='color:#e74c3c'>colored</span> <span style='color:#3498db'>lines</span> <span style='color:#2ecc71'>on</span> the outer hexagon</p> <hr> <p id = 'afterhr'></p> By <a href='http://loganengstrom.com' target='_blank'>Logan Engstrom</a> & <a href='http://github.com/garrettdreyfus' target='_blank'>Garrett Finucane</a><br>Find Hextris on <a href = 'https://itunes.apple.com/us/app/id903769553?mt=8' target='_blank'>iOS</a> & <a href ='https://play.google.com/store/apps/details?id=com.hextris.hextris' target='_blank'>Android</a><br>More @ the <a href ='http://hextris.github.io/' target='_blank'>Hextris Website</a>" ) ;
2015-05-24 14:54:12 +00:00
if ( gameState == 1 ) {
pause ( ) ;
}
2014-08-23 05:16:15 +00:00
2015-05-26 14:52:15 +00:00
if ( $ ( "#pauseBtn" ) . attr ( 'src' ) == "./images/btn_pause.svg" && gameState != 0 && ! infobuttonfading ) {
2015-05-24 14:54:12 +00:00
return ;
}
2014-08-23 05:16:15 +00:00
2015-05-24 14:54:12 +00:00
$ ( "#openSideBar" ) . fadeIn ( 150 , "linear" ) ;
$ ( '#helpScreen' ) . fadeToggle ( 150 , "linear" ) ;
2015-05-28 01:44:19 +00:00
}