main menu

This commit is contained in:
Daniel Bulant 2021-06-09 18:18:57 +02:00
parent 3c7597f030
commit ff37f5b6f9
7 changed files with 155 additions and 24 deletions

View file

@ -14,10 +14,14 @@
preloads.get(url).src = url;
}
for(let character of characters) {
preload(character.art); // preload art
if(character.art) {
preload(character.art); // preload art
}
}
for(let d of dialog) {
preload(d.background); // preload art
if(d.background) {
preload(d.background); // preload art
}
}
var music = new Howl({

View file

@ -47,6 +47,7 @@ export class GameScene extends Phaser.Scene {
this.load.setBaseURL();
this.load.image("level1", "/sprite/level1.webp");
this.load.image("level2", "/sprite/level2.webp");
this.load.image("level3", "/sprite/level3.webp");
this.load.image("lyre", "/sprite/lyre.webp");
this.load.image("cloud", "/sprite/clouds.webp");
this.load.image("pillar", "/sprite/pillar.webp");

View file

@ -1,9 +1,10 @@
<script>
import Button from "./button.svelte";
import { Howl } from "howler";
import { dialog } from "../stores/dialog.js";
import { chapters, dialog } from "../stores/dialog.js";
import { characters } from "../stores/characters.js";
import { gameActive } from "../stores/gameActive";
import { gameActive } from "../stores/gameActive";
import { toRoman } from "../utils";
export var current;
export var page;
@ -28,6 +29,7 @@ import { gameActive } from "../stores/gameActive";
var activeButton = -1;
function select(i) {
console.log("Switching", i);
if(!allowSwitch) return;
var next;
if(d.buttons) {
@ -61,20 +63,33 @@ import { gameActive } from "../stores/gameActive";
failure = false;
current = next;
d = dialog[current];
art = !character ? null : d.character_art || d.pose ? character.poses[d.pose] : character.art;
art = !character ? null : (d.character_art || d.pose && character.poses ? character.poses[d.pose] : character.art);
background = d.background;
if(d.map) {
$gameActive = true;
setTimeout(() => {
$gameActive = true;
}, 300);
}
console.log("selected", d);
if(!d.flags || !d.flags.includes("nosave")) localStorage.setItem("dialog-page", next);
if(d.chapter) {
if(!chaptersDone.includes(d.chapter)) {
chaptersDone.push(d.chapter);
localStorage.setItem("chapters", JSON.stringify(chaptersDone));
}
}
localStorage.setItem("dialog-page", next);
}
var chaptersDone = JSON.parse(localStorage.getItem("chapters") || "[]");
function keydown(e) {
switch(e.key) {
case "ArrowUp":
case "ArrowLeft":
activeButton--;
if(activeButton < 0) activeButton = 0;
break;
case "ArrowRight":
case "ArrowDown":
activeButton++;
if(d.buttons && activeButton > d.buttons.length - 1) activeButton = d.buttons.length - 1;
@ -94,7 +109,7 @@ import { gameActive } from "../stores/gameActive";
*/
function next(e) {
var path = e.composedPath();
if(path.includes(buttons)) return;
if(buttons && path.includes(buttons)) return;
reset();
select();
}
@ -142,7 +157,15 @@ import { gameActive } from "../stores/gameActive";
{:else}
<h1>???</h1>
{/if}
<p class="animate" bind:this={textElement}>{d.text}</p>
{#if d.text}
<p class="animate" bind:this={textElement}>
{#if d.flags && d.flags.includes("chapters") && chaptersDone.length === 0}
{d.alt}
{:else}
{d.text}
{/if}
</p>
{/if}
</div>
<div class="buttons" bind:this={buttons}>
{#if d.buttons}
@ -150,6 +173,15 @@ import { gameActive } from "../stores/gameActive";
<Button active={i === activeButton} on:click={() => select(i)}>{button.text}</Button>
{/each}
{/if}
{#if d && d.flags && d.flags.includes("chapters") && chaptersDone.length}
<div class="chapters">
{#each Object.keys(chapters) as chapter}
<div class="chapter" class:active={chaptersDone && chaptersDone.includes(chapter)}>
{toRoman(chapters[chapter])}
</div>
{/each}
</div>
{/if}
</div>
{#if success}
<h2>SUCCESS</h2>
@ -159,6 +191,22 @@ import { gameActive } from "../stores/gameActive";
</div>
<style>
.chapters {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
}
.chapter {
border: 2px solid rgb(155, 0, 0);
padding: 4px;
margin: 3px;
cursor: not-allowed;
}
.chapter.active {
cursor: pointer;
border-color: red;
}
.dialog {
background: #02021A;
color: white;

View file

@ -5,6 +5,7 @@
import { onMount } from "svelte";
import { setCanvas, setMap, resize, stop } from "../game";
import { steps } from "../stores/step";
import { toRoman } from "../utils";
export var current;
@ -16,20 +17,6 @@
var character;
$: character = characters[characterIndex];
function toRoman(num) {
if (isNaN(num))
return NaN;
var digits = String(+num).split(""),
key = ["","C","CC","CCC","CD","D","DC","DCC","DCCC","CM",
"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",
"","I","II","III","IV","V","VI","VII","VIII","IX"],
roman = "",
i = 3;
while (i--)
roman = (key[+digits.pop() + (i * 10)] || "") + roman;
return Array(+digits.join("") + 1).join("M") + roman;
}
var canvas;
onMount(() => {

View file

@ -41,4 +41,7 @@ export const characters = [{
happy: "/sprite/azrael_happy.webp",
angry: "/sprite/azrael_angry.webp"
}
}, {
name: "Hadraniel",
title: "the seraphim"
}];

View file

@ -1,4 +1,68 @@
export const chapters = {
uriel: 1,
michael: 2,
uziel: 3,
gabriel: 4,
azrael: 5
};
/**
* @type {{
* name: string,
* background: string,
* character: string,
* text: string,
* next?: string,
* pose?: string,
* map?: string,
* chapter?: keyof typeof chapters,
* buttons: { text: string, next: string }[],
* flags?: string[]
* }[]}
*/
export const dialog = [{
name: "start",
background: "/sprite/menu.webp",
text: "Hello and welcome on your way to heaven. My name is Hadraniel, and I'm the one appointed to you at the moment.",
next: "start2",
buttons: [{
text: "I'd like to go to the heaven's gate.",
next: "start2"
}]
}, {
name: "start2",
background: "/sprite/menu.webp",
character: "Hadraniel",
text: "Sure. Oh and before you go there, just a warning: don't even think about trying to seduce the angels. It doesn't work here the same as down there.",
next: "start3"
}, {
name: "start3",
background: "/sprite/menu.webp",
character: "Hadraniel",
text: "Wait where are you going? That's not the way to the main gate-",
next: "uriel_entrance"
}, {
name: "menu",
background: "/sprite/menu.webp",
character: "Hadraniel",
text: "",
buttons: [{
text: "Start",
next: "uriel_entrance"
}, {
text: "Chapter select",
next: "chapters"
}],
flags: ["menu", "nosave"]
}, {
name: "chapters",
background: "/sprite/menu.webp",
character: "Hadraniel",
text: "Which chapter would you like to solve?",
alt: "You must first complete a chapter to be able to solve it.",
next: "menu",
flags: ["chapters", "nosave"]
}, {
name: "uriel_entrance",
background: "/sprite/backg.webp",
character: "Uriel",
@ -28,6 +92,7 @@ export const dialog = [{
pose: "bat"
}, {
name: "uriel_success",
chapter: "uriel",
background: "/sprite/backg.webp",
character: "Uriel",
text: "Well since it already got boring around here, and how can I say no to pancakes.",
@ -49,6 +114,7 @@ export const dialog = [{
}]
}, {
name: "michael_success",
chapter: "michael",
background: "/sprite/backg.webp",
character: "Michael",
pose: "happy",
@ -85,6 +151,7 @@ export const dialog = [{
pose: "dead"
}, {
name: "uziel_success",
chapter: "uziel",
background: "/sprite/backg.webp",
character: "Uziel",
pose: "happy",
@ -105,6 +172,7 @@ export const dialog = [{
}]
}, {
name: "gabriel_success",
chapter: "gabriel",
background: "/sprite/backg.webp",
character: "Gabriel",
text: "That... That would be lovely actually. Could you buy me some coffee? After my department got defund I can't even afford it.",
@ -152,7 +220,8 @@ export const dialog = [{
pose: "angry"
}, {
name: "azrael_win",
next: "uriel_entrance",
chapter: "azrael",
next: "menu",
background: "/sprite/backg.webp",
character: "Azrael",
pose: "happy",

19
src/utils.js Normal file
View file

@ -0,0 +1,19 @@
/**
* Converts given number to string roman numeral
* @param {number} num
* @returns {string}
*/
export function toRoman(num) {
if (isNaN(num))
return NaN;
var digits = String(+num).split(""),
key = ["","C","CC","CCC","CD","D","DC","DCC","DCCC","CM",
"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC",
"","I","II","III","IV","V","VI","VII","VIII","IX"],
roman = "",
i = 3;
while (i--)
roman = (key[+digits.pop() + (i * 10)] || "") + roman;
return Array(+digits.join("") + 1).join("M") + roman;
}