2026-01-23 19:07:53 -05:00
dependOn ( "betterSettings.js" , ( ) => {
const tabweapons = new SettingsTab ( "weapons.js" ) ;
enablestartupprompt = new Setting ( "Startup prompt" , "startup_prompt" , settingType . BOOLEAN , false , defaultValue = true , "The prompt requesting you to add velocity.js, (unavailable for steam edition)" ) ;
tabweapons . registerSetting ( enablestartupprompt ) ;
settingsManager . registerTab ( tabweapons ) ;
runAfterLoad ( async ( ) => {
window . setTimeout ( async ( ) => {
if ( ! enabledMods . includes ( "mods/velocity.js" ) && standaloneType !== "steam" && enablestartupprompt . value === true ) {
_jaydalert ( "velocity.js is recommended for weapons.js to function in its intended way." ) ;
}
} , )
} )
} , true )
async function _weaponsjsprompt ( message , defaultValue = "" ) {
return new Promise ( resolve => {
promptInput ( message , ( result ) => {
resolve ( result ) ;
} , "weapons.js is asking you..." , defaultValue ) ;
} )
}
async function _jaydalert ( message ) {
promptText ( message , undefined , "Jayd:" ) ;
}
async function _weaponsjsdir ( message ) {
promptDir ( message , undefined , "weapons.js is asking you..." ) ;
}
elements . tsar _bomba = {
color : "#969696" ,
tick : ( pixel ) => {
tryMove ( pixel , pixel . x , pixel . y + 1 )
for ( var y = 1 ; y < 4 ; y ++ ) {
if ( ! isEmpty ( pixel . x , pixel . y + y , false ) ) {
explodeAt ( pixel . x , pixel . y , 150 , "plasma" )
}
}
} ,
category : "weapons.js" ,
state : "solid" ,
density : 1300 ,
excludeRandom : true ,
cooldown : defaultCooldown
} ,
elements . missile _left = {
color : "#313131" ,
category : "weapons.js" ,
state : "solid" ,
behavior : [
"EX:20>missile_shrapnel|XX|XX|XX|XX|XX|CR:smoke"
] ,
ignore : "missile_left" ,
tick : function ( pixel ) {
var circlec = circleCoords ( pixel . x , pixel . y , 3 )
for ( var i = 0 ; i < circlec . length ; i ++ ) {
var coord = circlec [ i ]
var x = coord . x
var y = coord . y
if ( ! ( isEmpty ( x , y , true ) || ( x == pixel . x && y == pixel . y ) || elements [ pixelMap [ x ] [ y ] . element ] . state == "gas" || pixelMap [ x ] [ y ] . element == "missile_left" ) ) {
explodeAt ( pixel . x , pixel . y , 20 , "missile_shrapnel" )
}
}
for ( var i = 0 ; i < 3 ; i ++ ) {
tryMove ( pixel , pixel . x - 1 , pixel . y )
}
} ,
density : 1300 ,
excludeRandom : true ,
cooldown : defaultCooldown
} ,
elements . missile _right = {
color : "#313131" ,
category : "weapons.js" ,
state : "solid" ,
behavior : [
"CR:smoke|XX|XX|XX|XX|XX|EX:20>missile_shrapnel"
] ,
ignore : "missile_right" ,
tick : function ( pixel ) {
var circlec = circleCoords ( pixel . x , pixel . y , 3 )
for ( var i = 0 ; i < circlec . length ; i ++ ) {
var coord = circlec [ i ]
var x = coord . x
var y = coord . y
if ( ! ( isEmpty ( x , y , true ) || ( x == pixel . x && y == pixel . y ) || elements [ pixelMap [ x ] [ y ] . element ] . state == "gas" ) ) {
explodeAt ( pixel . x , pixel . y , 20 , "missile_shrapnel" )
}
}
for ( var i = 0 ; i < 3 ; i ++ ) {
tryMove ( pixel , pixel . x + 1 , pixel . y )
}
} ,
density : 1300 ,
excludeRandom : true ,
cooldown : defaultCooldown
}
var target = [ , ] ;
var tgt = "head" ;
elements . tracking _missile = {
color : "#323232" ,
category : "weapons.js" ,
behavior : [
"XX" , "XX" , "CR:smoke"
] ,
onSelect : async ( ) => {
var answer1 = await _weaponsjsprompt ( "Please input the target." , ( tgt || undefined ) ) ;
if ( ! answer1 ) { return }
tgt = answer1 ;
} ,
tick : ( pixel ) => {
var circlec = circleCoords ( pixel . x , pixel . y , 3 )
for ( var i = 0 ; i < circlec . length ; i ++ ) {
var coord = circlec [ i ]
var xe = coord . x
var ye = coord . y
if ( ! ( isEmpty ( xe , ye , true ) || ( xe == pixel . x && ye == pixel . y ) || elements [ pixelMap [ xe ] [ ye ] . element ] . state == "gas" || pixelMap [ xe ] [ ye ] . element == "tracking_missile" ) ) {
explodeAt ( pixel . x , pixel . y , 20 , "missile_shrapnel" )
}
}
for ( var x = 1 ; x < width ; x ++ ) {
for ( var y = 1 ; y < height ; y ++ ) {
if ( ! isEmpty ( x , y ) ) {
if ( pixelMap [ x ] [ y ] . element === tgt ) {
target = [ pixelMap [ x ] [ y ] . x , pixelMap [ x ] [ y ] . y ] ;
}
}
}
}
if ( pixel . x != target [ 0 ] || pixel . y != target [ 1 ] ) {
let { x , y } = pixel ;
const empty = checkForEmptyPixels ( x , y ) ;
const [ tX , tY ] = target ;
let bestVal = Math . sqrt ( Math . pow ( tX - x , 2 ) + Math . pow ( tY - y , 2 ) ) ;
let best = null ;
for ( const pixelPair of empty ) {
const [ x _ , y _ ] = [ x + pixelPair [ 0 ] , y + pixelPair [ 1 ] ] ;
const c = Math . sqrt ( Math . pow ( tX - x _ , 2 ) + Math . pow ( tY - y _ , 2 ) ) ;
if ( c < bestVal ) {
bestVal = c ;
best = pixelPair ;
}
}
if ( best ) {
tryMove ( pixel , x + best [ 0 ] * 2 , y + best [ 1 ] * 2 , undefined , true ) ;
}
}
}
} ,
elements . missile _shrapnel = {
color : "#979ea3" ,
behavior : [
"XX|XX|XX" ,
"XX|EX:5 %20|XX" ,
"M2%20|M1%20|M2%20" ,
] ,
burn : 90 ,
burnTime : 100 ,
density : 2000 ,
conduct : 1 ,
state : "solid" ,
category : "weapons.js"
} ,
elements . cluster _nuke = {
color : "#323232" ,
category : "weapons.js" ,
behavior : behaviors . POWDER ,
maxSize : 1 ,
cooldown : defaultCooldown ,
tick : ( pixel ) => {
for ( var y = 1 ; y < 25 ; y ++ ) {
if ( ! isEmpty ( pixel . x , pixel . y + y , false ) ) {
explodeAt ( pixel . x , pixel . y , 25 , [ "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "dirty_bomb" , "nuke" , ] )
}
}
}
}
// let ammo1 = 1;
// let rdir = 1;
// let ammoLoaded = "";
// elements.railgun = {
// category: "weapons.js",
// behavior: behaviors.WALL,
// onSelect: async (pixel) => {
// var answer1 = await _weaponsjsprompt("Please input the ammo type. \n \n <1 for Armor-Piercing ammo> \n <2 for High-Explosive ammo.>",(ammo1||undefined));
// if (!answer1) {return}
// ammo1 = answer1;
// var answer2 = await _weaponsjsdir("Please input the direction.",(rdir||undefined));
// if (!answer2) {
// console.log(answer2)
// return}
// rdir = answer2;
// },
// tick: async (pixel) => {
// ammoLoaded = "armor_piercing_shell";
// if(ammo1 === 1){
// ammoLoaded = "armor_piercing_shell"
// }
// else if (ammo1 === 2){
// ammoLoaded = "high_explosive_shell"
// }
// if (pixel.charge){
// if(rdir === 1){
// createPixel(ammoLoaded, pixel.x, pixel.y-1);
// }
// if (rdir === 2){
// createPixel(ammoLoaded, pixel.x, pixel.y+1);
// }
// if (rdir === 3){
// createPixel(ammoLoaded, pixel.x-1, pixel.y);
// }
// if (rdir === 4){
// createPixel(ammoLoaded, pixel.x+1, pixel.y);
// }
// }
// doDefaults(pixel);
// },
// color: "#c9c9c9",
// conduct: 1,
// hardness: 8,
// },
// elements.armor_piercing_shell = {
// category: "ammunition",
// color: "#ffc954",
// hardness: 0.9,
// }
// elements.high_explosive_shell = {
// category: "ammunition",
// color: "#ffc954",
// hardness: 0.6,
// }
2026-02-16 16:32:55 -05:00