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 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