How to make a map in n-gon
(Without pictures)
First go to https://github.com/landgreen/n-gon
Click on the big green button that looks something like
Click Download ZIP
Then unzip it I guess
Open the unzipped file
Go to the js file
Open level.js (if you're on mac use vscode or something similar)
Learn javascript (do not skip)
Find template() and copy the entire thing
What you copied should look like this:
template() {
// simulation.enableConstructMode()
level.setPosToSpawn(0, -50); //normal spawn
level.exit.x = 1500;
level.exit.y = -1875;
spawn.mapRect(level.enter.x, level.enter.y + 20, 100, 20); //bump for level entrance
spawn.mapRect(level.exit.x, level.exit.y + 20, 100, 20); //bump for level exit
level.defaultZoom = 1800
simulation.zoomTransition(level.defaultZoom)
document.body.style.backgroundColor = "#d8dadf";
// color.map = "#444" //custom map color
level.custom = () => {
level.exit.drawAndCheck();
level.enter.draw();
};
level.customTopLayer = () => { };
spawn.mapRect(-100, 0, 1000, 100);
// powerUps.spawnStartingPowerUps(1475, -1175);
// spawn.debris(750, -2200, 3700, 16); //16 debris per level
// spawn.bodyRect(1540, -1110, 300, 25, 0.9);
// spawn.randomSmallMob(1300, -70);
// spawn.randomMob(2650, -975, 0.8);
// spawn.randomGroup(1700, -900, 0.4);
// if (simulation.difficulty > 1) spawn.randomLevelBoss(2200, -1300);
// spawn.secondaryBossChance(100, -1500)
powerUps.addResearchToLevel() //needs to run after mobs are spawned
},
Proceed to name it whatever you want it to be.
It would look like mylevel {...} but with what you'd call it.
Type lore.unlockTesting() and simulation.enableConstructMode() into the javascript console.
(If you don't know how press Fn + F12)
Go to the top of level.js, and ctrl + f level[simulation.isTraining ? "walk" : "intro"]().
Replace "intro" with the name of your level (do not replace the "").
Open testing mode in n-gon, and you should be able to create rectangles by dragging.
Right click to create blocks, left click to create map elements. Middle click will spawn mobs.
Write your level (if you need help join this discord server if you haven't already.)
If you want to know more tricks to enhance your map, simply skim through the other maps.
After you feel that your level has something special compared to other maps, and that it
is at least somewhat balanced, go to the github page again.
Click on the issues tab.
Click on
Make the title something like: New community map: [your community map name],
and paste your level code inside the form box that says "leave a comment".
Check the comment every day or so until landgreen rejects your map or accepts it.
If you didn't do anything that can modify gameplay after your map, landgreen
will likely accept your map. Good job! 🎉

List of n-mods
(No, not the ones in the discord server)
n-scythe by _destined_
n-sword by _destined_
n-gon mobile by cornbread2100
n-gon multiplayer by cornbread2100
More to come, hopefully.

Commands
(Commands that can sometimes be used in map making)
Some can break the game without the necessary preparations
b.AoEStunEffect(where, range, cycles = 120 + 60 * Math.random())
b.boomBot(position = { x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, isConsole = true)
b.bulletDo()
b.bulletDraw()
b.bulletRemove()
b.clearPermanentBots()
b.convertBotsTo(type)
b.crit(mob, bullet)
b.delayDrones(where, droneCount = 1)
b.drone(where = { x: m.pos.x + 30 * Math.cos(m.angle) + 20 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 20 * (Math.random() - 0.5) }, speed = 1)
b.droneRadioactive(where = { x: m.pos.x + 30 * Math.cos(m.angle) + 20 * (Math.random() - 0.5), y: m.pos.y + 30 * Math.sin(m.angle) + 20 * (Math.random() - 0.5) }, speed = 1)
b.dynamoBot(position = player.position, isConsole = true)
b.explosion(where, radius, color = "rgba(255,25,0,0.6)")
b.explosionRange()
b.extruder()
b.fire()
b.fireAlwaysFire()
b.fireAttributes(dir, rotate = true)
b.fireFloat()
b.fireFlower(where, size)
b.fireNormal()
b.fireNotMove()
b.fireProps(cd, speed, dir, me)
b.fireWithAmmo()
b.fireworks(where, size)
b.flea(where, velocity, radius = 6 + 3 * Math.random() + 10 * tech.wormSize * Math.random())
b.foam(position, velocity, radius)
b.foamBot(position = { x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, isConsole = true)
b.giveGuns(gun = "random", ammoPacks = 10)
b.grapple(where, angle = m.angle, harpoonSize = 1)
b.grenade()
b.grenadeEnd()
b.harpoon(where, target, angle = m.angle, harpoonSize = 1, isReturn = false, totalCycles = 35, isReturnAmmo = true, thrust = 0.1)
b.hasBotUpgrade()
b.iceIX(speed = 0, dir = m.angle + Math.PI * 2 * Math.random(), where = { x: m.pos.x + 30 * Math.cos(m.angle), y: m.pos.y + 30 * Math.sin(m.angle) })
b.laser(where = { x: m.pos.x + 20 * Math.cos(m.angle), y: m.pos.y + 20 * Math.sin(m.angle) }, whereEnd = { x: where.x + 3000 * Math.cos(m.angle), y: where.y + 3000 * Math.sin(m.angle) }, dmg = tech.laserDamage, reflections = tech.laserReflections, isThickBeam = false, push = 1)
b.laserBot(position = { x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, isConsole = true)
b.laserMine(position, velocity = { x: 0, y: -8 })
b.mine(where, velocity, angle = 0)
b.missile(where, angle, speed, size = 1)
b.missileBot(position = { x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, isConsole = true)
b.muzzleFlash(radius = 30)
b.nail(pos, velocity, dmg = 1)
b.nailBot(position = { x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, isConsole = true)
b.needle(angle = m.angle)
b.onCollision(event)
b.orbitBot(position = player.position, isConsole = true)
b.outOfAmmo()
b.plasma()
b.plasmaBot(position = { x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, isConsole = true)
b.pulse(charge, angle = m.angle, where = m.pos)
b.randomBot(where = player.position, isKeep = true, isLaser = true)
b.refundAmmo()
b.removeAllGuns()
b.removeBot()
b.removeConsBB(me)
b.removeGun(gunName)
b.respawnBots()
b.setDynamoBotDelay()
b.setFireCD()
b.setFireMethod()
b.setGrenadeMode()
b.soundBot(position = { x: player.position.x + 50 * (Math.random() - 0.5), y: player.position.y + 50 * (Math.random() - 0.5) }, isConsole = true)
b.spore(where, isFreeze = tech.isSporeFreeze)
b.starburst(where, size)
b.superBall(where, velocity, radius)
b.targetedBall(position, num = 1, speed = 42 + 12 * Math.random(), range = 1200, isRandomAim = true)
b.targetedBlock(who, speed = 50 - Math.min(20, who.mass * 2), range = 1600)
b.targetedFoam(position, num = 1, speed = 21 + 7 * Math.random(), range = 1200, isRandomAim = true)
b.targetedNail(position, num = 1, speed = 40 + 10 * Math.random(), range = 1200, isRandomAim = true, damage = 1.4)
b.totalBots()
b.worm(where, isFreeze = tech.isSporeFreeze)
b.zeroBotCount()
spawn.MACHO(x = m.pos.x, y = m.pos.y)
spawn.WIMP(x = level.exit.x + tech.wimpCount * 200 * (Math.random() - 0.5), y = level.exit.y + tech.wimpCount * 200 * (Math.random() - 0.5))
spawn.beamer(x, y, radius = 15 + Math.ceil(Math.random() * 15))
spawn.beetleBoss(x, y, radius = 50)
spawn.blinkBoss(x, y)
spawn.blockBoss(x, y, radius = 60)
spawn.blockDoor(x, y, blockSize = 60)
spawn.blockGroup(x, y, num = 3 + Math.random() * 8)
spawn.blockGroupMob(x, y, radius = 25 + Math.floor(Math.random() * 20))
spawn.blockMob(x, y, host, growCycles = 60)
spawn.bodyRect(x, y, width, height, chance = 1, properties = { friction: 0.05, frictionAir: 0.001 })
spawn.bodyVertex(x, y, vector, properties)
spawn.bomb(x, y, radius = 9, sides = 5)
spawn.bomberBoss(x, y, radius = 88)
spawn.boost(x, y, height = 1000)
spawn.bounceBoss(x, y, radius = 80, isSpawnBossPowerUp = true)
spawn.bounceBullet(x, y, velocity = { x: 0, y: 0 }, radius = 11, sides = 6)
spawn.bullet(x, y, radius = 9, sides = 0)
spawn.cellBoss(x, y, radius = 20, cellID)
spawn.cellBossCulture(x, y, radius = 20, num = 5)
spawn.constrain2AdjacentMobs(nodes, stiffness, loop = false, damping = 0)
spawn.constrainAllMobCombos(nodes, stiffness)
spawn.constraintBB(bodyIndexA, bodyIndexB, stiffness)
spawn.constraintPB(x, y, bodyIndex, stiffness)
spawn.debris(x, y, width, number = Math.floor(2 + Math.random() * 9))
spawn.dragonFlyBoss(x, y, radius = 42)
spawn.exploder(x, y, radius = 40 + Math.ceil(Math.random() * 50))
spawn.finalBoss(x, y, radius = 300)
spawn.flutter(x, y, radius = 20 + 6 * Math.random())
spawn.focuser(x, y, radius = 30 + Math.ceil(Math.random() * 10))
spawn.ghoster(x, y, radius = 50 + Math.ceil(Math.random() * 90))
spawn.grenade(x, y, lifeSpan = 90 + Math.ceil(60 / simulation.accelScale), pulseRadius = Math.min(550, 250 + simulation.difficulty * 3), size = 3)
spawn.grenadier(x, y, radius = 35 + Math.ceil(Math.random() * 20))
spawn.grenadierBoss(x, y, radius = 95)
spawn.groupShield(targets, x, y, radius, stiffness = 0.4)
spawn.growBoss(x, y, radius, buffID)
spawn.growBossCulture(x, y, radius = 17, nodes = 12 + Math.min(10, simulation.difficulty * 0.25))
spawn.grower(x, y, radius = 15)
spawn.historyBoss(x, y, radius = 30)
spawn.hopBullet(x, y, radius = 10 + Math.ceil(Math.random() * 8))
spawn.hopMomBoss(x, y, radius = 120)
spawn.hopper(x, y, radius = 30 + Math.ceil(Math.random() * 30))
spawn.laser(x, y, radius = 30)
spawn.laserBombingBoss(x, y, radius = 80)
spawn.laserBoss(x, y, radius = 30)
spawn.laserTargetingBoss(x, y, radius = 80)
spawn.launcher(x, y, radius = 30 + Math.ceil(Math.random() * 40))
spawn.launcherBoss(x, y, radius = 90, isSpawnBossPowerUp = true)
spawn.launcherOne(x, y, radius = 30 + Math.ceil(Math.random() * 40))
spawn.mantisBoss(x, y, radius = 35, isSpawnBossPowerUp = true)
spawn.mapRect(x, y, width, height, properties)
spawn.mapRectNow(x, y, width, height, properties, isRedrawMap = true)
spawn.mapVertex(x, y, vector, properties)
spawn.mapVertexNow
spawn.mapVertexNow(x, y, vector, properties, isRedrawMap = true)
spawn.mine(x, y)
spawn.mineBoss(x, y, radius = 120, isSpawnBossPowerUp = true)
spawn.orbital(who, radius, phase, speed)
spawn.orbitalBoss(x, y, radius = 70)
spawn.powerUpBoss(x, y, vertices = 9, radius = 130)
spawn.powerUpBossBaby(x, y, vertices = 9, radius = 60)
spawn.pulsar(x, y, radius = 40)
spawn.pulsarBoss(x, y, radius = 90, isNonCollide = false)
spawn.randomGroup(x, y, chance = 1)
spawn.randomLevelBoss(x, y, options = [])
spawn.randomMob(x, y, chance = 1)
spawn.randomSmallMob(x, y, num = Math.max(Math.min(Math.round(Math.random() * simulation.difficulty * 0.2), 4), 0), size = 16 + Math.ceil(Math.random() * 15), chance = 1)
spawn.revolutionBoss(x, y, radius = 70)
spawn.secondaryBossChance(x, y)
spawn.seeker(x, y, radius = 8, sides = 6)
spawn.setSpawnList()
spawn.shield(target, x, y, chance = Math.min(0.02 + simulation.difficulty * 0.005, 0.2) + tech.duplicationChance(), isExtraShield = false)
spawn.shieldingBoss(x, y, radius = 200)
spawn.shooter(x, y, radius = 25 + Math.ceil(Math.random() * 50))
spawn.shooterBoss(x, y, radius = 110, isSpawnBossPowerUp = true)
spawn.slashBoss(x, y, radius = 80)
spawn.slasher(x, y, radius = 33 + Math.ceil(Math.random() * 30))
spawn.slasher2(x, y, radius = 33 + Math.ceil(Math.random() * 30))
spawn.slasher3(x, y, radius = 33 + Math.ceil(Math.random() * 30))
spawn.snakeBody(x, y, radius = 10)
spawn.snakeSpitBoss(x, y, radius = 50)
spawn.sneakBoss(x, y, radius = 70)
spawn.sneaker(x, y, radius = 15 + Math.ceil(Math.random() * 10))
spawn.sniper(x, y, radius = 35 + Math.ceil(Math.random() * 30))
spawn.sniperBullet(x, y, radius = 9, sides = 5)
spawn.spawnBuilding(x, y, w, h, leftDoor, rightDoor, walledSide)
spawn.spawnChance(chance)
spawn.spawnOrbitals(who, radius, chance = Math.min(0.25 + simulation.difficulty * 0.005))
spawn.spawnStairs(x, y, num, w, h, stepRight)
spawn.spawner(x, y, radius = 55 + Math.ceil(Math.random() * 50))
spawn.spawnerBoss(x, y, radius, spawnID)
spawn.spawnerBossCulture(x, y, radius = 50, num = 8 + Math.min(20, simulation.difficulty * 0.4))
spawn.spawns(x, y, radius = 15)
spawn.spiderBoss(x, y, radius = 60 + Math.ceil(Math.random() * 10))
spawn.spinner(x, y, radius = 30 + Math.ceil(Math.random() * 35))
spawn.sprayBoss(x, y, radius = 40, isSpawnBossPowerUp = true)
spawn.springer(x, y, radius = 20 + Math.ceil(Math.random() * 35))
spawn.stabber(x, y, radius = 25 + Math.ceil(Math.random() * 12), spikeMax = 7)
spawn.starter(x, y, radius = Math.floor(15 + 20 * Math.random()))
spawn.streamBoss(x, y, radius = 110)
spawn.striker(x, y, radius = 14 + Math.ceil(Math.random() * 25))
spawn.sucker(x, y, radius = 30 + Math.ceil(Math.random() * 25))
spawn.suckerBoss(x, y, radius = 25)
spawn.tetherBoss(x, y, constraint, radius = 90)
spawn.timeBoss(x, y, radius = 50, isSpawnBossPowerUp = true)
spawn.timeSkipBoss(x, y, radius = 50)
spawn.wireFoot()
spawn.wireFootLeft()
spawn.wireHead()
spawn.wireKnee()
spawn.wireKneeLeft()
spawn.zombie(x, y, radius, sides, color)
tech.addJunkTechToPool(percent)
tech.countJunkTech()
tech.damageFromTech()
tech.duplicationChance()
tech.giveRandomJUNK()
tech.giveTech(index = 'random')
tech.hasEsplosiveDamageCheck()
tech.haveGunCheck(name, needActive = true)
tech.maxDuplicationEvent()
tech.removeJunkTechFromPool()
tech.removeTech(index = 'random')
tech.setBotTechFrequency(f = 0)
tech.setCheating()
tech.setTechFrequency(name, frequency)
tech.setupAllTech()