A Pen by Lovro Selic on CodePen.
Created
October 17, 2019 13:43
-
-
Save lovroselic/ff2161989a4c3858432b8bb6040b6f41 to your computer and use it in GitHub Desktop.
MAP for Deep Down
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| var MAP = { | |
| 1: { | |
| width: 50, | |
| height: 50, | |
| floor: "BrickWall4", | |
| background: "BrickWall", | |
| leaveDeadEnds: 8, | |
| bias: 2, | |
| MAX_ROOM: 10, | |
| ITERATIONS: 4 | |
| }, | |
| 2: { | |
| width: "50", | |
| height: "50", | |
| //floor: "StoneFloor3", | |
| floor: "BrickWall4", | |
| background: "StoneWall", | |
| leaveDeadEnds: 8, | |
| bias: 3, | |
| MAX_ROOM: 10, | |
| ITERATIONS: 4 | |
| }, | |
| clear: function(){ | |
| console.log("clearing map"); | |
| for (let x = 1; x <= HERO.maxDepth; x++){ | |
| MAP[x].dungeonExist = false; | |
| } | |
| } | |
| }; | |
| var CreateDungeon = { | |
| init: function() { | |
| MAZE.storeDeadEnds = true; | |
| MAZE.connectDeadEnds = false; | |
| MAZE.connectSome = true; | |
| MAZE.polishDeadEnds = true; | |
| MAZE.addConnections = false; | |
| MAZE.useBias = true; | |
| DUNGEON.CONFIGURE = true; | |
| DUNGEON.MIN_PADDING = 2; | |
| DUNGEON.MIN_ROOM = 4; | |
| }, | |
| setUp: function(level) { | |
| MAZE.leaveDeadEnds = MAP[level].leaveDeadEnds; | |
| MAZE.bias = MAP[level].bias; | |
| DUNGEON.MAX_ROOM = MAP[level].MAX_ROOM; | |
| DUNGEON.ITERATIONS = MAP[level].ITERATIONS; | |
| DUNGEON.PAD = DUNGEON.MIN_ROOM + 2 * DUNGEON.MIN_PADDING; //minimum area | |
| DUNGEON.FREE = DUNGEON.MAX_ROOM + 4 * DUNGEON.MIN_PADDING; //not carving further | |
| }, | |
| spreadScrolls: function(level) { | |
| let scrolls = [ | |
| { type: "Light", use: "explore" }, | |
| { type: "Light", use: "explore" }, | |
| { type: "Invisibility", use: "explore" }, | |
| { type: "Map", use: "explore" }, | |
| { type: "Map", use: "explore" }, | |
| { type: "Map", use: "explore" }, | |
| { type: "DrainMana", use: "explore" }, | |
| { type: "Cripple", use: "explore" }, | |
| { type: "BoostWeapon", use: "fight" }, | |
| { type: "BoostArmor", use: "fight" }, | |
| { type: "DestroyArmor", use: "fight" }, | |
| { type: "DestroyWeapon", use: "fight" }, | |
| ]; | |
| MAP[level].DUNGEON.scrolls = []; | |
| for (let q = 0; q < INI.SCRpLVL; q++) { | |
| let grid = MAP[level].DUNGEON.getFreeAnyGrid(); | |
| let selected = scrolls.chooseRandom(); | |
| MAP[level].DUNGEON.scrolls.push( | |
| new Scroll(grid, selected.type, selected.use) | |
| ); | |
| } | |
| }, | |
| spreadBoosts: function(level) { | |
| MAP[level].DUNGEON.boosts = []; | |
| for (let q = 0; q < INI.WpLVL; q++) { | |
| let grid = MAP[level].DUNGEON.getFreeAnyGrid(); | |
| MAP[level].DUNGEON.boosts.push(new Boost("weapon", grid)); | |
| grid = MAP[level].DUNGEON.getFreeAnyGrid(); | |
| MAP[level].DUNGEON.boosts.push(new Boost("armor", grid)); | |
| } | |
| let grid = MAP[level].DUNGEON.getFreeAnyGrid(); | |
| MAP[level].DUNGEON.boosts.push(new Boost("health", grid)); | |
| grid = MAP[level].DUNGEON.getFreeAnyGrid(); | |
| MAP[level].DUNGEON.boosts.push(new Boost("mana", grid)); | |
| grid = MAP[level].DUNGEON.getFreeAnyGrid(); | |
| MAP[level].DUNGEON.boosts.push(new Boost("magic", grid)); | |
| if (MAP[level].DUNGEON.deadEnds.length > 0) { | |
| grid = MAP[level].DUNGEON.deadEnds.removeRandom(); | |
| MAP[level].DUNGEON.reserved.push(grid); | |
| } else { | |
| grid = MAP[level].DUNGEON.getFreeAnyGrid(); | |
| } | |
| MAP[level].DUNGEON.boosts.push(new Boost("agility", grid)); | |
| //add random boost to start | |
| let start = MAP[level].DUNGEON.findRoom("start"); | |
| let grid1 = start.randomGrid(); | |
| start.reserved.push(grid1); | |
| let boosts = ["weapon", "armor", "health", "mana", "magic", "agility"]; | |
| MAP[level].DUNGEON.boosts.push(new Boost(boosts.chooseRandom(), grid1)); | |
| }, | |
| spreadPotions: function(level) { | |
| MAP[level].DUNGEON.potions = []; | |
| //start room has 2 health potions | |
| let start = MAP[level].DUNGEON.findRoom("start"); | |
| for (let s = 0; s < 2; s++){ | |
| let grid = start.randomGrid(); | |
| start.reserved.push(grid); | |
| MAP[level].DUNGEON.potions.push(new Potion("health", grid)); | |
| } | |
| for (let q = 0; q < INI.HPpLVL; q++) { | |
| let grid = MAP[level].DUNGEON.getFreeRoomGrid(); | |
| MAP[level].DUNGEON.potions.push(new Potion("health", grid)); | |
| } | |
| for (let q = 0; q < INI.MPpCRD; q++) { | |
| let grid = MAP[level].DUNGEON.getFreeCorrGrid(); | |
| let isDE = grid.isInAt(MAP[level].DUNGEON.deadEnds); | |
| if (isDE !== -1) MAP[level].DUNGEON.deadEnds.splice(isDE, 1); | |
| MAP[level].DUNGEON.potions.push(new Potion("magic", grid)); | |
| } | |
| }, | |
| spreadLamp: function(level) { | |
| MAP[level].DUNGEON.lamps = []; | |
| let start = MAP[level].DUNGEON.findRoom("start"); | |
| let grid = start.randomGrid(); | |
| start.reserved.push(grid); | |
| MAP[level].DUNGEON.lamps.push(new Lamp(grid)); | |
| for (let q = 0; q < INI.LMPpLVL - 1; q++) { | |
| let grid = MAP[level].DUNGEON.getFreeAnyGrid(); | |
| MAP[level].DUNGEON.lamps.push(new Lamp(grid)); | |
| } | |
| }, | |
| spreadGold: function(level) { | |
| MAP[level].DUNGEON.gold = []; | |
| for (let q = 0; q < INI.GBpLVL; q++) { | |
| let grid = MAP[level].DUNGEON.getFreeRoomGrid(); | |
| MAP[level].DUNGEON.gold.push(new Gold(100, grid)); | |
| } | |
| let GBpDE = INI.GBpDE; | |
| while (GBpDE > 0) { | |
| if (MAP[level].DUNGEON.deadEnds.length > 0) { | |
| let grid = MAP[level].DUNGEON.deadEnds.removeRandom(); | |
| MAP[level].DUNGEON.gold.push(new Gold(100, grid)); | |
| MAP[level].DUNGEON.reserved.push(grid); | |
| } | |
| GBpDE--; | |
| } | |
| for (let q = 0; q < INI.CpLVL; q++) { | |
| let grid = MAP[level].DUNGEON.getFreeRoomGrid(); | |
| MAP[level].DUNGEON.gold.push(new Gold(RND(1, 10), grid)); | |
| } | |
| for (let q = 0; q < INI.CpCRD; q++) { | |
| let grid = MAP[level].DUNGEON.getFreeCorrGrid(); | |
| let isDE = grid.isInAt(MAP[level].DUNGEON.deadEnds); | |
| if (isDE !== -1) MAP[level].DUNGEON.deadEnds.splice(isDE, 1); | |
| MAP[level].DUNGEON.gold.push(new Gold(RND(1, 10), grid)); | |
| } | |
| }, | |
| spreadChests: function(level) { | |
| MAP[level].DUNGEON.chests = []; | |
| let number = INI.CHpLVL; | |
| let DE_number = RND( | |
| RND( | |
| Math.max(MAP[level].DUNGEON.deadEnds.length - 2, 0), | |
| MAP[level].DUNGEON.deadEnds.length | |
| ), | |
| MAP[level].DUNGEON.deadEnds.length | |
| ); | |
| number -= DE_number; | |
| while (DE_number > 0) { | |
| let grid = MAP[level].DUNGEON.deadEnds.removeRandom(); | |
| MAP[level].DUNGEON.chests.push(new Chest(grid)); | |
| MAP[level].DUNGEON.reserved.push(grid); | |
| DE_number--; | |
| } | |
| while (number > 0) { | |
| let grid = MAP[level].DUNGEON.getFreeRoomGrid(); | |
| MAP[level].DUNGEON.chests.push(new Chest(grid)); | |
| number--; | |
| } | |
| }, | |
| spawn: function(level) { | |
| MAP[level].DUNGEON.ENEMY = []; | |
| let rooms = MAP[level].DUNGEON.rooms; | |
| for (let q = 0, QL = rooms.length; q < QL; q++) { | |
| let room = rooms[q]; | |
| let CN; | |
| switch (room.type) { | |
| case "common": | |
| CN = getCommonNumber(); | |
| spawnRoom(room, CN, "common"); | |
| break; | |
| case "key": | |
| case "silver": | |
| CN = getCommonNumber(); | |
| spawnRoom(room, CN, "common"); | |
| spawnRoom(room, INI.ENEMY_KEY_ADD, "key"); | |
| break; | |
| case "start": | |
| spawnRoom(room, INI.ENEMY_START, "start"); | |
| break; | |
| case "end": | |
| CN = getCommonNumber(); | |
| spawnRoom(room, CN, "common"); | |
| spawnRoom(room, INI.ENEMY_END_ADD, "end"); | |
| spawnRoom(room, 1, "boss"); | |
| break; | |
| case "temple": | |
| spawnRoom(room, INI.ENEMY_TEMPLE, "temple"); | |
| break; | |
| default: | |
| console.log("room.type ERROR"); | |
| } | |
| } | |
| for (let q = 0; q < INI.ENEMY_CORRIDOR; q++) { | |
| let grid = MAP[level].DUNGEON.getUninhabitedCorrGrid(); | |
| MAP[level].DUNGEON.ENEMY.push( | |
| new Monster(MONSTER_LAYOUT[level].corridor.chooseRandom(), grid) | |
| ); | |
| } | |
| return; | |
| function getCommonNumber() { | |
| return RND(INI.ENEMY_COMMON - 1, INI.ENEMY_COMMON + 1); | |
| } | |
| function spawnRoom(room, number, type) { | |
| let grid; | |
| do { | |
| grid = room.random_Uninhabited_Grid(MAP[GAME.level].DUNGEON.obstacles); | |
| MAP[level].DUNGEON.ENEMY.push( | |
| new Monster(MONSTER_LAYOUT[level][type].chooseRandom(), grid) | |
| ); | |
| number--; | |
| } while (number > 0); | |
| return; | |
| } | |
| }, | |
| spawnNemesis: function(level){ | |
| let grid = MAP[level].DUNGEON.entrance; | |
| MAP[level].DUNGEON.ENEMY.push(new Monster(MONSTER_LAYOUT[level].nemesis.chooseRandom(), grid, true)); | |
| }, | |
| mapAnchors: function(level) { | |
| MAP[level].DUNGEON.mapAnchors = []; | |
| MAP[level].DUNGEON.mapAnchors.push( | |
| MAP[level].DUNGEON.temple, | |
| MAP[level].DUNGEON.exit, | |
| MAP[level].DUNGEON.goldKey, | |
| MAP[level].DUNGEON.silverKey | |
| ); | |
| }, | |
| create: function(level) { | |
| console.log(`%cCreating Dungeon for level ${level}`, "color: #888"); | |
| CreateDungeon.setUp(level); | |
| let t1 = performance.now(); | |
| let dungeon = DUNGEON.create(MAP[level].width, MAP[level].height); | |
| MAP[level].DUNGEON = dungeon; | |
| MAP[level].grid = dungeon.grid; | |
| MAP[level].dungeonExist = true; | |
| MAP[level].returning = false; | |
| CreateDungeon.spreadLamp(level); | |
| CreateDungeon.spreadGold(level); | |
| CreateDungeon.spreadPotions(level); | |
| CreateDungeon.spreadBoosts(level); | |
| CreateDungeon.spreadChests(level); | |
| CreateDungeon.spreadScrolls(level); | |
| MAP[level].DUNGEON.setObstacles( | |
| MAP[level].DUNGEON.door, | |
| MAP[level].DUNGEON.gate | |
| ); | |
| CreateDungeon.spawn(level); | |
| CreateDungeon.mapAnchors(level); | |
| console.log( | |
| "Created Dungeon: ", | |
| MAP[level].DUNGEON, | |
| " in ", | |
| performance.now() - t1, | |
| " ms." | |
| ); | |
| console.log(`%c--------------------`, "color: #888"); | |
| } | |
| }; | |
| var MONSTER = { | |
| LittleSnake: { | |
| name: "LittleGreenSnake", | |
| title: "Little Green Snake", | |
| speed: 2, | |
| weapon: 2, | |
| armor: 0, | |
| magicResistance: 0, | |
| health: 10, | |
| mana: 0, | |
| magic: 0, | |
| agility: 2, | |
| exp: 5, | |
| gold: 5, | |
| strategy: "wander", | |
| triggers: { | |
| hunt: 3, | |
| wander: 6 | |
| } | |
| }, | |
| TinySnake: { | |
| name: "LittleGreenSnake", | |
| title: "Tiny Green Snake", | |
| speed: 3, | |
| weapon: 1, | |
| armor: 0, | |
| magicResistance: 0, | |
| health: 5, | |
| mana: 0, | |
| magic: 0, | |
| agility: 1, | |
| exp: 2, | |
| gold: 2, | |
| strategy: "wander", | |
| triggers: { | |
| hunt: 3, | |
| wander: 6 | |
| } | |
| }, | |
| BabySnake: { | |
| name: "LittleGreenSnake", | |
| title: "Baby Snake", | |
| speed: 1, | |
| weapon: 1, | |
| armor: 0, | |
| magicResistance: 0, | |
| health: 2, | |
| mana: 0, | |
| magic: 0, | |
| agility: 1, | |
| exp: 1, | |
| gold: 1, | |
| strategy: "wander", | |
| triggers: { | |
| hunt: 5, | |
| wander: 8 | |
| } | |
| }, | |
| GreenSnake: { | |
| name: "Snake", | |
| title: "Green Snake", | |
| speed: 1, | |
| weapon: 3, | |
| armor: 0, | |
| magicResistance: 0, | |
| health: 12, | |
| mana: 0, | |
| magic: 0, | |
| agility: 3, | |
| exp: 10, | |
| gold: 10, | |
| strategy: "wander", | |
| triggers: { | |
| hunt: 3, | |
| wander: 6 | |
| } | |
| }, | |
| NastyGreenSnake: { | |
| name: "Snake", | |
| title: "Nasty Green Snake", | |
| speed: 1, | |
| weapon: 5, | |
| armor: 0, | |
| magicResistance: 0, | |
| health: 15, | |
| mana: 0, | |
| magic: 0, | |
| agility: 2, | |
| exp: 20, | |
| gold: 25, | |
| strategy: "wander", | |
| triggers: { | |
| hunt: 3, | |
| wander: 6 | |
| } | |
| }, | |
| BrittleSkeleton: { | |
| name: "Wanderer", | |
| title: "Brittle Skeleton", | |
| speed: 2, | |
| weapon: 4, | |
| armor: 0, | |
| magicResistance: 0, | |
| health: 8, | |
| mana: 0, | |
| magic: 0, | |
| agility: 2, | |
| exp: 15, | |
| gold: 10, | |
| strategy: "wander", | |
| triggers: { | |
| hunt: 3, | |
| wander: 6 | |
| } | |
| }, | |
| Skeleton: { | |
| name: "Wanderer", | |
| title: "Skeleton", | |
| speed: 2, | |
| weapon: 4, | |
| armor: 1, | |
| magicResistance: 1, | |
| health: 13, | |
| mana: 0, | |
| magic: 0, | |
| agility: 2, | |
| exp: 20, | |
| gold: 20, | |
| strategy: "wander", | |
| triggers: { | |
| hunt: 5, | |
| wander: 10 | |
| } | |
| }, | |
| Ghosty: { | |
| name: "Ghosty", | |
| title: "Ghosty", | |
| speed: 4, | |
| weapon: 6, | |
| armor: 2, | |
| magicResistance: 5, | |
| health: 25, | |
| mana: 12, | |
| magic: 2, | |
| agility: 5, | |
| exp: 25, | |
| gold: 50, | |
| strategy: "wander", | |
| triggers: { | |
| hunt: 3, | |
| wander: 6 | |
| }, | |
| inventory: { | |
| type: "boost", | |
| value: ["weapon", "armor", "magic"] | |
| } | |
| }, | |
| ApprenticeWizard: { | |
| name: "Wizard", | |
| title: "Apprentice Wizard", | |
| speed: 2, | |
| weapon: 5, | |
| armor: 3, | |
| magicResistance: 3, | |
| health: 13, | |
| mana: 25, | |
| magic: 4, | |
| agility: 2, | |
| exp: 50, | |
| gold: 40, | |
| strategy: "hunt", | |
| triggers: { | |
| hunt: 999, | |
| wander: 999 | |
| }, | |
| inventory: { | |
| type: "boost", | |
| //type: "potion", | |
| //value: ["health", "magic"], | |
| //value: ["health", "mana", "weapon", "armor", "magic"], | |
| value: ["health", "mana", "magic"] | |
| } | |
| }, | |
| BlackSnake: { | |
| name: "BlackSnake", | |
| title: "Timid Black Snake", | |
| speed: 2, | |
| weapon: 5, | |
| armor: 1, | |
| magicResistance: 1, | |
| health: 15, | |
| mana: 0, | |
| magic: 0, | |
| agility: 3, | |
| exp: 30, | |
| gold: 50, | |
| strategy: "goto", | |
| triggers: { | |
| hunt: 1, | |
| wander: 999 | |
| } | |
| }, | |
| }; | |
| var MONSTER_LAYOUT = { | |
| 1: { | |
| common: [ | |
| MONSTER.TinySnake, | |
| MONSTER.LittleSnake, | |
| MONSTER.LittleSnake, | |
| MONSTER.GreenSnake, | |
| MONSTER.BrittleSkeleton, | |
| MONSTER.NastyGreenSnake | |
| ], | |
| start: [MONSTER.BabySnake], | |
| //end: [MONSTER.Skeleton, MONSTER.NastyGreenSnake, MONSTER.BlackSnake, MONSTER.BlackSnake], | |
| end: [MONSTER.BlackSnake, MONSTER.BlackSnake], | |
| boss: [MONSTER.Ghosty], | |
| key: [ | |
| MONSTER.Ghosty, | |
| MONSTER.Skeleton, | |
| MONSTER.GreenSnake, | |
| MONSTER.NastyGreenSnake | |
| ], | |
| temple: [MONSTER.LittleSnake, MONSTER.TinySnake], | |
| corridor: [ | |
| MONSTER.TinySnake, | |
| MONSTER.TinySnake, | |
| MONSTER.LittleSnake, | |
| MONSTER.LittleSnake, | |
| MONSTER.LittleSnake, | |
| MONSTER.GreenSnake, | |
| MONSTER.GreenSnake, | |
| MONSTER.BrittleSkeleton, | |
| MONSTER.BrittleSkeleton, | |
| MONSTER.NastyGreenSnake | |
| ], | |
| nemesis: [MONSTER.ApprenticeWizard] | |
| }, | |
| 2: { | |
| common: [ | |
| MONSTER.NastyGreenSnake, | |
| MONSTER.Skeleton, | |
| ], | |
| start: [MONSTER.BrittleSkeleton], | |
| end: [MONSTER.Skeleton, MONSTER.NastyGreenSnake], | |
| boss: [MONSTER.Ghosty], | |
| key: [ | |
| MONSTER.Ghosty, | |
| MONSTER.Skeleton, | |
| MONSTER.GreenSnake, | |
| MONSTER.NastyGreenSnake | |
| ], | |
| temple: [MONSTER.NastyGreenSnake,], | |
| corridor: [ | |
| MONSTER.NastyGreenSnake, | |
| MONSTER.Skeleton, | |
| ], | |
| nemesis: [MONSTER.ApprenticeWizard] | |
| } | |
| }; | |
| console.log("%cMAP for Deep Down Into Darkness loaded.", "color: #888"); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment