witchday/OverworldMap.js
2024-08-05 18:14:13 +02:00

161 lines
4.1 KiB
JavaScript

class OverworldMap {
constructor(config) {
this.gameObjects = config.gameObjects;
this.walls = config.walls || {};
this.lowerImage = new Image();
this.lowerImage.src = config.lowerSrc;
this.upperImage = new Image();
this.upperImage.src = config.upperSrc;
this.isCutscenePlaying = false;
}
drawLowerImage(ctx, cameraPerson) {
ctx.drawImage(this.lowerImage, utils.withGrid(10.5) - cameraPerson.x, utils.withGrid(6) - cameraPerson.y);
}
drawUpperImage(ctx, cameraPerson) {
ctx.drawImage(this.upperImage, utils.withGrid(10.5) - cameraPerson.x, utils.withGrid(6) - cameraPerson.y);
}
isSpaceTaken(currentX, currentY, direction) {
const {x, y} = utils.nextPosition(currentX, currentY, direction);
return this.walls[`${x},${y}`] || false;
}
mountObjects() {
Object.keys(this.gameObjects).forEach(key => {
let object = this.gameObjects[key];
object.id = key;
object.mount(this);
})
}
async startCutscene(events) {
this.isCutscenePlaying = true;
for (let i = 0; i < events.length; i++) {
const eventHandler = new OverworldEvent({
event: events[i],
map: this,
})
await eventHandler.init();
}
this.isCutscenePlaying = false;
// reset npcs
Object.values(this.gameObjects).forEach(object => object.doBehaviorEvent(this))
}
addWall(x, y) {
this.walls[`${x},${y}`] = true;
}
removeWall(x, y) {
delete this.walls[`${x},${y}`];
}
moveWall(wasX, wasY, direction) {
this.removeWall(wasX, wasY);
const {x, y} = utils.nextPosition(wasX, wasY, direction);
this.addWall(x, y);
}
}
window.OverworldMaps = {
DemoRoom: {
lowerSrc: "/images/maps/map-room-entrance.png",
upperSrc: "",
gameObjects: {
hero: new Person({
isPlayerControlled: true,
x: utils.withGrid(8),
y: utils.withGrid(2),
}),
npc1: new Person({
x: utils.withGrid(6),
y: utils.withGrid(5),
behaviorLoop: [
{ type: "stand", direction: "down", time: 800 },
{ type: "stand", direction: "right", time: 300 },
{ type: "stand", direction: "down", time: 400 },
{ type: "stand", direction: "up", time: 700 },
]
}),
npc2: new Person({
x: utils.withGrid(8),
y: utils.withGrid(9),
behaviorLoop: [
{ type: "walk", direction: "left" },
{ type: "stand", direction: "up", time: 800 },
{ type: "walk", direction: "up" },
{ type: "walk", direction: "right" },
{ type: "walk", direction: "down" },
]
})
},
walls: {
// "16,16": true
[utils.asGridCoord(5,2)] : true,
[utils.asGridCoord(5,3)] : true,
[utils.asGridCoord(5,4)] : true,
[utils.asGridCoord(4,4)] : true,
[utils.asGridCoord(3,4)] : true,
[utils.asGridCoord(2,4)] : true,
[utils.asGridCoord(1,5)] : true,
[utils.asGridCoord(0,6)] : true,
[utils.asGridCoord(1,7)] : true,
[utils.asGridCoord(2,8)] : true,
[utils.asGridCoord(3,8)] : true,
[utils.asGridCoord(4,8)] : true,
[utils.asGridCoord(5,8)] : true,
[utils.asGridCoord(5,9)] : true,
[utils.asGridCoord(5,10)] : true,
[utils.asGridCoord(4,11)] : true,
[utils.asGridCoord(5,12)] : true,
[utils.asGridCoord(6,12)] : true,
[utils.asGridCoord(7,12)] : true,
[utils.asGridCoord(7,13)] : true,
[utils.asGridCoord(8,14)] : true,
[utils.asGridCoord(9,13)] : true,
[utils.asGridCoord(9,12)] : true,
[utils.asGridCoord(10,12)] : true,
[utils.asGridCoord(11,12)] : true,
[utils.asGridCoord(12,11)] : true,
[utils.asGridCoord(11,10)] : true,
[utils.asGridCoord(11,9)] : true,
[utils.asGridCoord(11,8)] : true,
[utils.asGridCoord(11,7)] : true,
[utils.asGridCoord(11,6)] : true,
[utils.asGridCoord(12,5)] : true,
[utils.asGridCoord(11,4)] : true,
[utils.asGridCoord(11,3)] : true,
[utils.asGridCoord(11,2)] : true,
[utils.asGridCoord(10,1)] : true,
[utils.asGridCoord(9,1)] : true,
[utils.asGridCoord(8,1)] : true,
[utils.asGridCoord(7,1)] : true,
[utils.asGridCoord(6,1)] : true,
}
},
Kitchen: {
lowerSrc: "/images/maps/room-builder.png",
upperSrc: "/images/maps/room-builder.png",
gameObjects: {
hero: new GameObject({
x: 2,
y: 3,
}),
npc1: new GameObject({
x: 3,
y: 6,
src: "/images/characters/people/hero-run.png"
})
}
}
}