diff --git a/satiate.js b/satiate.js index 15bf7bf..6603ca3 100644 --- a/satiate.js +++ b/satiate.js @@ -6,8 +6,11 @@ let state = { player: { items: { keys: [ - "Locked Room" + ] + }, + rooms: { + } } } @@ -26,6 +29,7 @@ function print(lines) { // setup the game function init() { + initWorld(state); initAudio(); moveToRoom("Home", state); diff --git a/world.js b/world.js index 491a0ca..3b35590 100644 --- a/world.js +++ b/world.js @@ -11,6 +11,17 @@ dirs = { "descend": "Down" } +function initWorld(state) { + initRoomState(state); +} + +function initRoomState(state) { + state.player.rooms = {}; + Object.entries(world).forEach(([key, val]) => { + state.player.rooms[key] = {}; + }); +} + function moveToRoom(dest, state) { updateRoom(dest, state); } @@ -18,15 +29,19 @@ function moveToRoom(dest, state) { function updateRoom(dest, state) { const room = world[dest]; + if (!state.player.rooms[dest.id]) { + state.player.rooms[dest.id] = {}; + } + const areaName = document.querySelector("#area-name"); const areaDesc = document.querySelector("#area-desc"); areaName.textContent = room.name; areaDesc.textContent = room.desc; - const holder = document.querySelector("#move-holder"); + const moveHolder = document.querySelector("#move-holder"); - holder.innerHTML = ""; + moveHolder.innerHTML = ""; Object.entries(dirs).forEach(([dir, name]) => { const button = document.createElement("button"); @@ -35,64 +50,129 @@ function updateRoom(dest, state) { button.classList.add("disabled"); button.setAttribute("disabled", "true"); button.textContent = dirs[dir]; - holder.appendChild(button); + moveHolder.appendChild(button); }); - Object.entries(room.exits).forEach(([dir, exit]) => { - const button = document.querySelector("#move-" + dir); - const dest = world[exit.target]; + if (room.exits) { + Object.entries(room.exits).forEach(([dir, exit]) => { + const button = document.querySelector("#move-" + dir); + const dest = world[exit.target]; - // don't even show an exit if this fails! + // don't even show an exit if this fails! - if (exit.show) { - if (!exit.show.every(cond => cond(state))) { - return; + if (exit.show) { + if (!exit.show.every(cond => cond(room, state))) { + return; + } } - } - button.textContent = dest.name; + button.textContent = dest.name; - // if any condition fails, don't enable/add a listener - if (exit.conditions) { - if (!exit.conditions.every(cond => cond(state))) { - return; + // if any condition fails, don't enable/add a listener + if (exit.conditions) { + if (!exit.conditions.every(cond => cond(room,state))) { + return; + } } - } - button.classList.remove("disabled"); - button.removeAttribute("disabled"); + button.classList.remove("disabled"); + button.removeAttribute("disabled"); + + button.addEventListener("click", () => { + // todo: log + moveToRoom(exit.target, state); + }) + }); + } + + const actionHolder = document.querySelector("#actions"); + actionHolder.innerHTML = ""; + + if (room.actions) { + room.actions.forEach(action => { + const button = document.createElement("button"); + button.classList.add("action-button"); + + if (action.show) { + if (!action.show.every(cond => cond(room, state))) { + return; + } + } + + button.textContent = action.name; + + actionHolder.appendChild(button); + + if (action.conditions) { + if (!action.conditions.every(cond => cond(room, state))) { + button.classList.add("disabled"); + button.setAttribute("disabled", "true"); + return; + } + } + + button.addEventListener("click", () => { + action.execute(room, state); + updateRoom(room.id, state); + }); + + + }); + } + + - button.addEventListener("click", () => { - // todo: log - moveToRoom(exit.target, state); - }) - }); } world = { "Home": { + "id": "Home", "name": "Home", "desc": "Where the wifi autoconnects", + "actions": [ + { + "name": "Squint", + "desc": "Squint in a very aggressive manner", + "execute": (self, state) => { + state.player.rooms[self.id].squinted = true; + print(["You stare at the wall and notice a secret door. But where is the key?"]); + } + }, + { + "name": "Find Keys", + "desc": "Find your keys", + "execute": (self, state) => { + state.player.items.keys.push("Locked Room"); + print(["You found your keys under the couch cushions"]); + }, + "show": [ + (self, state) => { + return state.player.rooms[self.id].squinted; + } + ] + } + ], "exits": { "up": { "target": "Locked Room", "desc": "It's locked!", "move": "You enter the secret locked room", "conditions": [ - state => { + (self, state) => { return state.player.items.keys.includes("Locked Room"); } ], - "show": [ - state => { - return state.player.items.keys.includes("Locked Room"); + (self, state) => { + console.log(self); + return state.player.rooms[self.id].squinted; } ] } } }, "Locked Room": { + "id": "Locked Room", "name": "Locked Room", "desc": "Super seecret", "exits": {