2022-11-11 21:49:57 -05:00
var modName = "mods/cpt_alt.js" ;
var explodeAtPlusMod = "mods/explodeAtPlus.js" ;
2022-11-12 15:44:02 -05:00
var libraryMod = "mods/code_library.js" ;
2022-11-11 21:49:57 -05:00
2022-11-12 15:44:02 -05:00
if ( enabledMods . includes ( explodeAtPlusMod ) && enabledMods . includes ( libraryMod ) ) {
2022-11-11 21:49:57 -05:00
actExcludedElements = [ "wall" , "alt_controllable_pixel" ] ;
function actTryMove ( pixel , x , y ) {
if ( ! tryMove ( pixel , x , y ) ) {
if ( outOfBounds ( x , y ) ) {
return false ;
} ;
if ( ! isEmpty ( x , y , true ) ) {
var newPixel = pixelMap [ x ] [ y ] ;
var newElement = newPixel . element ;
if ( actExcludedElements . includes ( newElement ) ) {
return false ;
} ;
if ( newElement == pixel . element ) { //Copy-paste of "break" code
swapPixels ( pixel , newPixel ) ;
return true ;
} else {
breakCircle ( newPixel . x , newPixel . y , pixel . breakAroundRadius , false , false , false ) ; //does nothing to elements without breakIntos if defaultBreakIntoDust is false
swapPixels ( pixel , newPixel ) ;
return true ;
} ;
} else {
return false ;
} ;
} else {
return true ;
} ;
} ;
function cptaEapFunction ( pixel , x , y , radius , fire , smoke , power , damage ) {
var coords = circleCoords ( pixel . x , pixel . y , radius ) ;
for ( var i = 0 ; i < coords . length ; i ++ ) {
var x = coords [ i ] . x ;
var y = coords [ i ] . y ;
if ( isEmpty ( x , y ) ) { //if there's space for fire
if ( Array . isArray ( fire ) ) { //this should remain "fire"
var newfire = fire [ Math . floor ( Math . random ( ) * fire . length ) ] ;
} else {
var newfire = fire ;
} ;
createPixel ( newfire , x , y ) ; //add fire
var firePixel = pixelMap [ x ] [ y ] ;
firePixel . temp = Math . max ( elements [ newfire ] . temp , firePixel . temp ) ;
firePixel . burning = true ;
} ;
if ( ! isEmpty ( x , y , true ) ) {
pixel . temp += ( 400 * ( ( 1 + ( 5 * damage ) ) * * 2 ) * ( ( power * * 1.5 ) * 1.5 ) ) ;
pixelTempCheck ( pixel ) ;
} ;
if ( enabledMods . includes ( "mods/velocity.js" ) ) {
if ( ! elements [ pixel . element ] . excludeVelocity ) {
var angle = Math . atan2 ( pixel . y - y , pixel . x - x ) ;
pixel . vx = Math . round ( ( pixel . vx | 0 ) + Math . cos ( angle ) * ( radius * power / 10 ) ) ;
pixel . vy = Math . round ( ( pixel . vy | 0 ) + Math . sin ( angle ) * ( radius * power / 10 ) ) ;
}
} ;
} ;
} ;
alt _sussyKey = null ;
isShift = false ;
isAlt = false ;
document . addEventListener ( "keydown" , function ( modifierDownListener ) {
// User presses shift
if ( modifierDownListener . keyCode == 16 ) {
isShift = true ;
}
// User presses alt
if ( modifierDownListener . keyCode == 18 ) {
isAlt = true ;
}
} ) ;
document . addEventListener ( "keyup" , function ( modifierUpListener ) {
// User releases shift
if ( modifierUpListener . keyCode == 16 ) {
isShift = false ;
}
// User releases alt
if ( modifierUpListener . keyCode == 18 ) {
isAlt = false ;
}
} ) ;
document . addEventListener ( "keyup" , function ( alt _sussyListener ) {
switch ( alt _sussyListener . keyCode ) {
case 87 :
alt _sussyKey = "W" ;
break ;
case 65 :
alt _sussyKey = "A" ;
break ;
case 83 :
alt _sussyKey = "S" ;
break ;
case 68 :
alt _sussyKey = "D" ;
break ;
case 81 :
alt _sussyKey = "Q" ;
break ;
case 88 :
alt _sussyKey = "X" ;
break ;
case 90 :
alt _sussyKey = "Z" ;
break ;
case 72 :
alt _sussyKey = "H" ;
break ;
case 76 :
alt _sussyKey = "L" ;
break ;
} ;
} ) ;
2022-11-12 15:44:02 -05:00
function controllablePixelTryCreatePixelNullCheck ( element , x , y ) {
if ( ! elements [ element ] ) { //catch the null
2022-11-11 21:49:57 -05:00
return false ;
} ;
2022-11-12 15:44:02 -05:00
if ( isEmpty ( x , y ) ) {
tryCreatePixel ( element , x , y ) ;
2022-11-11 21:49:57 -05:00
return true ;
} else {
return false ;
}
}
elements . alt _controllable _pixel = {
color : "#7F7F7F" ,
colorOn : "#FFFF00" ,
behavior : behaviors . WALL ,
state : "solid" ,
density : 2000 ,
maxSize : 1 ,
conduct : 1 ,
hardness : 1 ,
movable : true ,
desc : "it breaks things more<br/>Use the console or enable prop.js to set speed / explosionRadius / circleRadius / breakAroundRadius (though it has an Illogical™ random resetting bug)" ,
breakInto : "alt_controllable_pixel" ,
properties : {
speed : 1 ,
explosionRadius : 8 ,
circleRadius : 8 ,
breakAroundRadius : 4 ,
} ,
excludeVelocity : true ,
tick : function ( pixel ) {
userElement = currentElement ;
if ( userElement === pixel . element ) {
userElement = null ;
} ;
if ( isShift && ! isAlt ) {
alt _sussyKey === "Z" ? pixel . color = "rgb(255,191,127)" : pixel . color = "rgb(255,127,127)" ;
}
if ( isAlt && ! isShift ) {
alt _sussyKey === "Z" ? pixel . color = "rgb(191,255,127)" : pixel . color = "rgb(127,255,127)" ;
}
if ( isAlt && isShift ) {
alt _sussyKey === "Z" ? pixel . color = "rgb(255,255,0)" : pixel . color = "rgb(255,255,127)" ;
}
if ( ! isAlt && ! isShift ) {
alt _sussyKey === "Z" ? pixel . color = "rgb(255,255,191)" : pixel . color = "rgb(255,255,255)" ;
}
if ( alt _sussyKey !== null ) {
switch ( alt _sussyKey ) {
case "W" :
if ( isAlt ) { controllablePixelTryCreatePixelNullCheck ( userElement , pixel . x , pixel . y - 1 ) } else { for ( move = 0 ; move < pixel . speed ; move ++ ) { actTryMove ( pixel , pixel . x , pixel . y - 1 ) } } ;
if ( ! isShift ) {
alt _sussyKey = null ;
}
break ;
case "A" :
if ( isAlt ) { controllablePixelTryCreatePixelNullCheck ( userElement , pixel . x - 1 , pixel . y ) } else { for ( move = 0 ; move < pixel . speed ; move ++ ) { actTryMove ( pixel , pixel . x - 1 , pixel . y ) } } ;
if ( ! isShift ) {
alt _sussyKey = null ;
}
break ;
case "S" :
if ( isAlt ) { controllablePixelTryCreatePixelNullCheck ( userElement , pixel . x , pixel . y + 1 ) } else { for ( move = 0 ; move < pixel . speed ; move ++ ) { actTryMove ( pixel , pixel . x , pixel . y + 1 ) } } ;
if ( ! isShift ) {
alt _sussyKey = null ;
}
break ;
case "D" :
for ( move = 0 ; move < pixel . speed ; move ++ ) { actTryMove ( pixel , pixel . x + 1 , pixel . y ) } ;
if ( ! isShift ) {
alt _sussyKey = null ;
}
break ;
case "H" : //Alt+D is something else in some browsers.
if ( isAlt ) {
controllablePixelTryCreatePixelNullCheck ( userElement , pixel . x + 1 , pixel . y ) ;
} ;
if ( ! isShift ) {
alt _sussyKey = null ;
}
break ;
case "X" :
explodeAtPlus ( pixel . x , pixel . y , pixel . explosionRadius , "plasma,fire,fire" , "fire,smoke,smoke" , null , cptaEapFunction )
if ( ! isShift ) {
alt _sussyKey = null ;
}
break ;
case "Z" :
if ( ! pixel . charge && ! pixel . chargeCD && ! isEmpty ( pixel . x , pixel . y , true ) ) {
pixel . charge = 1 ;
}
if ( ! isShift === 0 ) {
alt _sussyKey = null ;
}
break ;
case "L" :
if ( userElement !== null ) {
fillCircle ( currentElement , pixel . x , pixel . y , pixel . circleRadius , false ) ;
if ( ! isShift === 0 ) {
alt _sussyKey = null ;
}
} ;
break ;
case "Q" : //Use if a key gets stuck
alt _sussyKey = null ;
isShift = null ;
isAlt = null ;
break ;
}
}
} ,
}
} else {
2022-11-12 15:44:02 -05:00
if ( ! enabledMods . includes ( explodeAtPlusMod ) ) { enabledMods . splice ( enabledMods . indexOf ( modName ) , 0 , explodeAtPlusMod ) } ;
if ( ! enabledMods . includes ( libraryMod ) ) { enabledMods . splice ( enabledMods . indexOf ( modName ) , 0 , libraryMod ) } ;
alert ( ` The " ${ libraryMod } " and " ${ explodeAtPlusMod } " mods are required; any missing mods in this list have been automatically inserted (reload for this to take effect). ` )
2022-11-11 21:49:57 -05:00
localStorage . setItem ( "enabledMods" , JSON . stringify ( enabledMods ) ) ;
2022-11-12 15:44:02 -05:00
} ;