Skip to content

Instantly share code, notes, and snippets.

@lovroselic
Created October 17, 2019 13:43
Show Gist options
  • Save lovroselic/ff2161989a4c3858432b8bb6040b6f41 to your computer and use it in GitHub Desktop.
Save lovroselic/ff2161989a4c3858432b8bb6040b6f41 to your computer and use it in GitHub Desktop.
MAP for Deep Down
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