| @@ -7,6 +7,11 @@ html, body, .scene { | |||||
| margin: 0px; | margin: 0px; | ||||
| } | } | ||||
| body { | |||||
| position: fixed; | |||||
| top: 0px; | |||||
| width: 100%; | |||||
| } | |||||
| .hidden-scene { | .hidden-scene { | ||||
| display: none; | display: none; | ||||
| } | } | ||||
| @@ -322,15 +327,17 @@ a:hover { | |||||
| } | } | ||||
| #move-holder { | #move-holder { | ||||
| width: 90%; | |||||
| height: 90%; | |||||
| position: absolute; | position: absolute; | ||||
| left: 50%; | |||||
| margin-left: -100px; | |||||
| top: 5%; | top: 5%; | ||||
| } | |||||
| .move-button { | |||||
| width: 200px; | |||||
| height: 50px; | |||||
| left: 50%; | |||||
| transform: translate(-50%, 0); | |||||
| display: grid; | |||||
| grid-template-columns: auto auto auto; | |||||
| grid-template-rows: auto auto auto auto; | |||||
| column-gap: 8pt; | |||||
| row-gap: 8pt; | |||||
| } | } | ||||
| .move-button { | .move-button { | ||||
| @@ -341,78 +348,58 @@ a:hover { | |||||
| font-size: 24px; | font-size: 24px; | ||||
| } | } | ||||
| .move-button:focus { | |||||
| outline: 0px; | |||||
| } | |||||
| .disabled { | |||||
| background-color: #444; | |||||
| border: none; | |||||
| } | |||||
| .missing { | |||||
| background-color: #444; | |||||
| color: #aaa !important; | |||||
| } | |||||
| #move-up-left { | #move-up-left { | ||||
| position: absolute; | |||||
| left: -140px; | |||||
| top: 60px; | |||||
| grid-column-start: 1; | |||||
| } | } | ||||
| #move-up { | #move-up { | ||||
| position: absolute; | |||||
| left: 0px; | |||||
| top: 0px; | |||||
| grid-column-start: 2; | |||||
| } | } | ||||
| #move-up-right { | #move-up-right { | ||||
| position: absolute; | |||||
| left: 140px; | |||||
| top: 60px; | |||||
| grid-column-start: 3; | |||||
| } | } | ||||
| #move-left { | #move-left { | ||||
| position: absolute; | |||||
| left: -200px; | |||||
| top: 120px; | |||||
| grid-column-start: 1; | |||||
| } | } | ||||
| #move-right { | #move-right { | ||||
| position: absolute; | |||||
| left: 200px; | |||||
| top: 120px; | |||||
| grid-column-start: 3; | |||||
| } | } | ||||
| #move-down-left { | #move-down-left { | ||||
| position: absolute; | |||||
| left: -140px; | |||||
| top: 180px; | |||||
| grid-column-start: 1; | |||||
| } | } | ||||
| #move-down { | #move-down { | ||||
| position: absolute; | |||||
| left: 0px; | |||||
| top: 240px; | |||||
| grid-column-start: 2; | |||||
| } | } | ||||
| #move-down-right { | #move-down-right { | ||||
| position: absolute; | |||||
| left: 140px; | |||||
| top: 180px; | |||||
| grid-column-start: 3; | |||||
| } | } | ||||
| #move-ascend { | #move-ascend { | ||||
| position: absolute; | |||||
| left: -200px; | |||||
| top: 300px; | |||||
| grid-column-start: 1; | |||||
| } | } | ||||
| #move-descend { | #move-descend { | ||||
| position: absolute; | |||||
| left: 200px; | |||||
| top: 300px; | |||||
| grid-column-start: 3; | |||||
| } | |||||
| .move-button:focus { | |||||
| outline: 0px; | |||||
| } | |||||
| .disabled { | |||||
| background-color: #444; | |||||
| border: none; | |||||
| } | |||||
| .missing { | |||||
| background-color: #444; | |||||
| color: #aaa !important; | |||||
| } | } | ||||
| #area-name { | #area-name { | ||||
| @@ -461,3 +448,29 @@ a:hover { | |||||
| #log::-webkit-scrollbar-corner { | #log::-webkit-scrollbar-corner { | ||||
| background: transparent; | background: transparent; | ||||
| } | } | ||||
| #story-info { | |||||
| display: flex; | |||||
| flex-direction: column; | |||||
| } | |||||
| .tooltip { | |||||
| position: relative; | |||||
| } | |||||
| .tooltip::before { | |||||
| content: attr(data-tooltip); | |||||
| position: absolute; | |||||
| display: none; | |||||
| background: gray; | |||||
| top: -20pt; | |||||
| left: 50%; | |||||
| color: #eee; | |||||
| border-radius: 5pt; | |||||
| pointer-events: none; | |||||
| transform: translate(-50%, 0); | |||||
| } | |||||
| .tooltip:hover::before { | |||||
| display: inline-block; | |||||
| } | |||||
| @@ -20,14 +20,13 @@ | |||||
| <body> | <body> | ||||
| <div class="scene" id="pick"> | <div class="scene" id="pick"> | ||||
| <div id="pick-blurb"> | <div id="pick-blurb"> | ||||
| <p>Welcome to Satiate</p> | |||||
| <h1>Welcome to Satiate</h1> | |||||
| <a href="https://discord.gg/dSwNN8T">Discord Server</a> | <a href="https://discord.gg/dSwNN8T">Discord Server</a> | ||||
| <br> | <br> | ||||
| <a href="https://crux.sexy/changelog#satiate">Changelog</a> | <a href="https://crux.sexy/changelog#satiate">Changelog</a> | ||||
| <p class="version">Version: </p> | <p class="version">Version: </p> | ||||
| <p><b>This game contains 18+ content</b></p> | <p><b>This game contains 18+ content</b></p> | ||||
| <p><b>Most of the games have sound!</b></p> | <p><b>Most of the games have sound!</b></p> | ||||
| <p>Select a story:</p> | |||||
| </div> | </div> | ||||
| <div> | <div> | ||||
| <select id="game-select"> | <select id="game-select"> | ||||
| @@ -35,8 +34,14 @@ | |||||
| </select> | </select> | ||||
| </div> | </div> | ||||
| <button id="start-button">Start</button> | <button id="start-button">Start</button> | ||||
| <div id="tags-header">Tags</div> | |||||
| <div id="tags"></div> | |||||
| <div id="story-info"> | |||||
| <h2>Title</h2> | |||||
| <div id="title"></div> | |||||
| <h2>Description</h2> | |||||
| <div id="description"></div> | |||||
| <h2>Tags</h2> | |||||
| <div id="tags"></div> | |||||
| </div> | |||||
| </div> | </div> | ||||
| <div class="hidden-scene" id="game"> | <div class="hidden-scene" id="game"> | ||||
| <div id="info-area"> | <div id="info-area"> | ||||
| @@ -9,6 +9,45 @@ let state; | |||||
| let refreshHook; | let refreshHook; | ||||
| const tags = { | |||||
| "prey": { | |||||
| name: "Prey", | |||||
| desc: "You can be eaten in this story" | |||||
| }, | |||||
| "pred": { | |||||
| name: "Predator", | |||||
| desc: "You can eat others in this story" | |||||
| }, | |||||
| "fatal": { | |||||
| name: "Fatal Vore", | |||||
| desc: "Vore may result in death" | |||||
| }, | |||||
| "non-fatal": { | |||||
| name: "Non-Fatal Vore", | |||||
| desc: "Vore may result in endo or other safe outcomes" | |||||
| }, | |||||
| "soft-digestion": { | |||||
| name: "Soft Digestion", | |||||
| desc: "Non-graphic depictions of digestion" | |||||
| }, | |||||
| "hard-digestion": { | |||||
| name: "Hard Digestion", | |||||
| desc: "Gory, gross digestion" | |||||
| }, | |||||
| "oral-vore": { | |||||
| name: "Oral Vore", | |||||
| desc: "The classic" | |||||
| }, | |||||
| "hard-vore": { | |||||
| name: "Hard Vore", | |||||
| desc: "Biting, chewing, and other gory means of consumption" | |||||
| }, | |||||
| "macro-micro": { | |||||
| name: "Macro/Micro", | |||||
| desc: "Characters will have significant size differences" | |||||
| } | |||||
| }; | |||||
| function print(lines) { | function print(lines) { | ||||
| (lines.concat([newline])).forEach(line => { | (lines.concat([newline])).forEach(line => { | ||||
| const log = document.querySelector("#log"); | const log = document.querySelector("#log"); | ||||
| @@ -117,7 +156,7 @@ function initStart() { | |||||
| stories.forEach(story => { | stories.forEach(story => { | ||||
| const option = document.createElement("option"); | const option = document.createElement("option"); | ||||
| option.value = story.id; | option.value = story.id; | ||||
| option.textContent = story.name; | |||||
| option.textContent = story.info.name; | |||||
| select.appendChild(option); | select.appendChild(option); | ||||
| options[story.id] = story; | options[story.id] = story; | ||||
| }) | }) | ||||
| @@ -128,16 +167,17 @@ function initStart() { | |||||
| holder.innerHTML = ""; | holder.innerHTML = ""; | ||||
| const story = stories.filter(s => s.id == [event.target.value])[0]; | const story = stories.filter(s => s.id == [event.target.value])[0]; | ||||
| const tags = story.tags; | |||||
| initAudio(story); | initAudio(story); | ||||
| story.preload.forEach(sound => loadAudio(sound)); | story.preload.forEach(sound => loadAudio(sound)); | ||||
| tags.forEach(tag => { | |||||
| story.info.tags.forEach(tag => { | |||||
| const div = document.createElement("div"); | const div = document.createElement("div"); | ||||
| div.textContent = tag; | |||||
| div.textContent = tags[tag].name; | |||||
| div.dataset.tooltip = tags[tag].desc; | |||||
| div.classList.add("tag"); | div.classList.add("tag"); | ||||
| div.classList.add("tooltip"); | |||||
| holder.appendChild(div); | holder.appendChild(div); | ||||
| }) | }) | ||||
| }); | }); | ||||
| @@ -1,9 +1,10 @@ | |||||
| stories.push({ | stories.push({ | ||||
| "id": "demo", | "id": "demo", | ||||
| "name": "Tech Demo", | |||||
| "tags": [ | |||||
| "Memes" | |||||
| ], | |||||
| "info": { | |||||
| "name": "Tech Demo", | |||||
| "desc": "Shows what the game engine can do", | |||||
| "tags": [] | |||||
| }, | |||||
| "intro": { | "intro": { | ||||
| "start": "Home", | "start": "Home", | ||||
| "setup": () => { | "setup": () => { | ||||
| @@ -1,10 +1,14 @@ | |||||
| stories.push({ | stories.push({ | ||||
| id: "fen-snack", | id: "fen-snack", | ||||
| name: "Fen's Food", | |||||
| tags: [ | |||||
| "Player Prey", | |||||
| "Digestion" | |||||
| ], | |||||
| info: { | |||||
| name: "Fen's Food", | |||||
| desc: "Struggle inside of a predatory crux until you're digested.", | |||||
| tags: [ | |||||
| "prey", | |||||
| "fatal", | |||||
| "hard-digestion" | |||||
| ], | |||||
| }, | |||||
| sounds: [ | sounds: [ | ||||
| "sfx/digested-test.ogg", | "sfx/digested-test.ogg", | ||||
| "sfx/stomach-to-intestines.ogg", | "sfx/stomach-to-intestines.ogg", | ||||