Added several features and moved some strings

- Moved sign strings to default.js
- Textboxes are fixed to scene and center text
- Pause function added (press escape)
- Chests now be assigned textboxes individually
- Added source button to titlescreen
This commit is contained in:
Arne van Iterson 2020-04-17 00:36:18 +02:00
parent 6061c6c254
commit c7a629517c
22 changed files with 101 additions and 48 deletions

6
package-lock.json generated
View File

@ -290,9 +290,9 @@
} }
}, },
"asdf-games": { "asdf-games": {
"version": "1.0.14", "version": "1.0.15",
"resolved": "https://registry.npmjs.org/asdf-games/-/asdf-games-1.0.14.tgz", "resolved": "https://registry.npmjs.org/asdf-games/-/asdf-games-1.0.15.tgz",
"integrity": "sha512-0CCsgxfPjJL5BI7a8CYw49Y14rslG1BIsg20gnaf8Hi0SOaXJ61mZXf6Q96l9h5OhDaOLsv9e/yAMY9P0vq3IQ==" "integrity": "sha512-wq3hDDkVGCbQ8CnQVh0IjzXNMG/mXwSQPJDx87pNg0Zw5k93sim6iD2NPpXfur/PZOR48spNXsQQOQeTvMYf1w=="
}, },
"astral-regex": { "astral-regex": {
"version": "1.0.0", "version": "1.0.0",

View File

@ -37,7 +37,7 @@
], ],
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"asdf-games": "^1.0.14" "asdf-games": "^1.0.15"
}, },
"devDependencies": { "devDependencies": {
"cross-env": "^7.0.2", "cross-env": "^7.0.2",

BIN
res/images/keys/s.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 B

View File

@ -4,7 +4,7 @@ module.exports = {
"Press Space to Start!", "Press Space to Start!",
"Press T for the tutorial", "Press T for the tutorial",
"Press Q to quit", "Press Q to quit",
//"Press G to see the game's code" "Press S to go to the source code"
] ]
}, },
tutorial: [ tutorial: [
@ -19,14 +19,18 @@ module.exports = {
dead: "You died!", dead: "You died!",
instruction: "Press space to return to title" instruction: "Press space to return to title"
}, },
logoScreen: [
"Made by JoVo and McArn"
],
game: { game: {
lives: "Lives", lives: "Lives",
stamina: "Stamina", stamina: "Stamina",
keyFind: "You found a key!", keyFind: "You found a key!",
keyMissing: "You do not have the key for this door!" keyMissing: "You do not have the key for this door!",
lifeBoost: "You found some health replenishing food!",
signs: {
"2-2": "Many secrets to the left",
"2-6": "Impressive, you're good.",
"3-1": "Climb the ladder and walk two tiles to the left",
"3-4": "Congrats."
}
}, },
credits: { credits: {
credits: "Credits:", credits: "Credits:",

View File

@ -8,9 +8,6 @@ const sounds = {
obtain: new Sound(__dirname + "/../../res/sounds/obtain.wav", { volume: 0.1 }) obtain: new Sound(__dirname + "/../../res/sounds/obtain.wav", { volume: 0.1 })
}; };
const TextBox = require(__dirname + "/../helpers/textbox.js");
const text = require(__dirname + "/../../res/lang/default.js");
const Pointer = require("./pointer.js"); const Pointer = require("./pointer.js");
const state = { const state = {
@ -70,8 +67,7 @@ class Chest extends TileSprite {
if (this.state == state.closed) { if (this.state == state.closed) {
this.state = state.open; this.state = state.open;
this.pressed = true; this.pressed = true;
this.action(); this.action();
this.level.entities.add(new TextBox({x: this.pos.x, y: this.pos.y - 10}, text.game.keyFind, 2.5));
sounds.obtain.play(); sounds.obtain.play();
} else { } else {
if (!sounds.forbidden.playing && !this.pressed) { if (!sounds.forbidden.playing && !this.pressed) {

View File

@ -97,15 +97,13 @@ class Portal extends TileSprite {
this.pointer.anims.play("white"); this.pointer.anims.play("white");
if (this.keys.action) { if (this.keys.action) {
this.action(); this.action();
console.warn("action");
} }
} else { } else {
// No key or not the correct key // No key or not the correct key
this.pointer.anims.play("red"); this.pointer.anims.play("red");
if (this.keys.action) { if (this.keys.action) {
if (!sounds.forbidden.playing && !this.pressed) { if (!sounds.forbidden.playing && !this.pressed) {
console.log(this.player); this.level.textbox.add(new TextBox(text.game.keyMissing));
this.level.entities.add(new TextBox({x: this.player.pos.x - Math.pow(this.player.pos.x, 160 / 177) - 25, y: this.player.pos.y > 160 ? this.player.pos.y - 160 : 0}, text.game.keyMissing, 2.5));
sounds.forbidden.play(); sounds.forbidden.play();
this.pressed = true; this.pressed = true;
} }

View File

@ -48,9 +48,8 @@ class Sign extends TileSprite {
this.pointer.anims.play("white"); this.pointer.anims.play("white");
if (this.keys.action) { if (this.keys.action) {
const box = new TextBox({x: this.player.pos.x - Math.pow(this.player.pos.x, 160 / 177) - 25, y: this.player.pos.y > 160 ? this.player.pos.y - 160 : 0}, this.string, 2.5); const box = new TextBox(this.string);
console.log(box); this.level.textbox.add(box);
this.level.entities.add(box);
} }
} else { } else {

View File

@ -16,7 +16,7 @@ const Sign = require("../entities/sign.js");
// }; // };
class Level extends TileMap { class Level extends TileMap {
constructor (level, keys, player) { constructor (level, keys, player, game) {
// Convert id array to tile array // Convert id array to tile array
var levelTiles = level.tiles.map(function(e) { var levelTiles = level.tiles.map(function(e) {
return { x: (tiles[e].x / tileSize), y: (tiles[e].y / tileSize), walkable: tiles[e].walkable }; return { x: (tiles[e].x / tileSize), y: (tiles[e].y / tileSize), walkable: tiles[e].walkable };
@ -31,6 +31,7 @@ class Level extends TileMap {
this.h = level.size.h; this.h = level.size.h;
this.keys = keys; this.keys = keys;
this.player = player; this.player = player;
this.game = game;
this.gameComplete = false; this.gameComplete = false;
@ -44,7 +45,7 @@ class Level extends TileMap {
e.entity = new Mage({ x: e.pos.x / 1, y: e.pos.y / 1 }, this.player, this); e.entity = new Mage({ x: e.pos.x / 1, y: e.pos.y / 1 }, this.player, this);
break; break;
case "Chest": case "Chest":
e.entity = new Chest({ x: e.pos.x / 1, y: e.pos.y / 1 }, this.player, this.keys, this, () => { return e.action(this.player); }); e.entity = new Chest({ x: e.pos.x / 1, y: e.pos.y / 1 }, this.player, this.keys, this, () => { return e.action(this.player, this); });
break; break;
case "Portal": case "Portal":
e.entity = new Portal({ x: e.pos.x / 1, y: e.pos.y / 1 }, this.player, this.keys, this, e.texture, () => { return e.action(this.player, this); }, e.key); e.entity = new Portal({ x: e.pos.x / 1, y: e.pos.y / 1 }, this.player, this.keys, this, e.texture, () => { return e.action(this.player, this); }, e.key);
@ -59,6 +60,9 @@ class Level extends TileMap {
this.entities = new Container(); this.entities = new Container();
this.children.push(this.entities); this.children.push(this.entities);
this.textbox = new Container();
this.game.add(this.textbox);
// sounds.bg.play(); // sounds.bg.play();
} }

View File

@ -5,9 +5,9 @@ const { Container, Text, Rect } = asdf;
const fillStyle = {fill: "#ffffff", font: "16px Minecraft"}; const fillStyle = {fill: "#ffffff", font: "16px Minecraft"};
class TextBox extends Container { class TextBox extends Container {
constructor(pos, string, lifespan) { constructor(string, lifespan = 2.5) {
super(); super();
this.pos = pos !== undefined ? pos : { x: 0, y: 0 }; this.pos = { x: 0, y: 0 };
this.string = string; this.string = string;
this.lifespan = lifespan; this.lifespan = lifespan;
@ -16,10 +16,13 @@ class TextBox extends Container {
this.add(background); this.add(background);
const text = new Text(string, fillStyle); const text = new Text(string, fillStyle);
text.pos = { x: this.pos.x + 8, y: this.pos.y + 18 }; var letters = string.split("");
// 10px is the average letter width
text.pos = {
x: (640 / 2) - ((letters.length * 10) / 2),
y: 16
};
this.add(text); this.add(text);
console.log(this);
} }
update(dt) { update(dt) {

View File

@ -14,7 +14,7 @@ const
const window = { w: 640, h: 320 }; const window = { w: 640, h: 320 };
const game = new Game(window.w, window.h, true); var game = new Game(window.w, window.h, true);
ipcRenderer.send("resize", window); ipcRenderer.send("resize", window);
const keys = new KeyControls(); const keys = new KeyControls();
@ -41,8 +41,12 @@ function credits() {
game.scene = new Logo(game, titleScreen); game.scene = new Logo(game, titleScreen);
game.run(); game.run(() => {
if (keys.escape) {
toggleMenu();
keys.reset();
}
});
/* ********************************************************* /* *********************************************************
Settings behavior Settings behavior
@ -52,6 +56,7 @@ game.run();
function toggleMenu() { function toggleMenu() {
const menuRef = document.getElementById("menu"); const menuRef = document.getElementById("menu");
menuRef.style.display = menuRef.style.display === "block" ? "none" : "block"; menuRef.style.display = menuRef.style.display === "block" ? "none" : "block";
game.paused = game.paused ? false : true;
} }
const elements = [...document.querySelectorAll("#settings, #resume")]; const elements = [...document.querySelectorAll("#settings, #resume")];

View File

@ -1,5 +1,8 @@
const tileSize = 32; const tileSize = 32;
const text = require(__dirname + "/../../res/lang/default.js");
const TextBox = require(__dirname + "/../helpers/textbox.js");
let level = { let level = {
tiles: [ tiles: [
1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6,
@ -38,7 +41,8 @@ let level = {
{ {
type: "Chest", type: "Chest",
pos: { x: 7 * tileSize, y: 2 * tileSize }, pos: { x: 7 * tileSize, y: 2 * tileSize },
action: (player) => { action: (player, level) => {
level.textbox.add(new TextBox(text.game.keyFind));
player.items.keys.push("3-4"); player.items.keys.push("3-4");
} }
}, },

View File

@ -1,5 +1,8 @@
const tileSize = 32; const tileSize = 32;
const text = require(__dirname + "/../../res/lang/default.js");
const TextBox = require(__dirname + "/../helpers/textbox.js");
let level = { let level = {
tiles: [ tiles: [
1, 2, 2, 5, 6, 1, 2, 2, 5, 6,
@ -21,7 +24,8 @@ let level = {
{ {
type: "Chest", type: "Chest",
pos: { x: 2 * tileSize, y: 2 * tileSize }, pos: { x: 2 * tileSize, y: 2 * tileSize },
action: (player) => { action: (player, level) => {
level.textbox.add(new TextBox(text.game.keyFind));
player.items.keys.push("1-1_1"); player.items.keys.push("1-1_1");
} }
}, },

View File

@ -1,5 +1,8 @@
const tileSize = 32; const tileSize = 32;
const text = require(__dirname + "/../../res/lang/default.js");
const TextBox = require(__dirname + "/../helpers/textbox.js");
let level = { let level = {
tiles: [ tiles: [
1, 2, 2, 2, 2, 2, 2, 2, 5, 6, 1, 2, 2, 2, 2, 2, 2, 2, 5, 6,
@ -38,7 +41,8 @@ let level = {
{ {
type: "Chest", type: "Chest",
pos: { x: 4.5 * tileSize, y: 17 * tileSize }, pos: { x: 4.5 * tileSize, y: 17 * tileSize },
action: (player) => { action: (player, level) => {
level.textbox.add(new TextBox(text.game.keyFind));
player.items.keys.push("1-4"); player.items.keys.push("1-4");
} }
}, },

View File

@ -1,5 +1,8 @@
const tileSize = 32; const tileSize = 32;
const text = require(__dirname + "/../../res/lang/default.js");
const TextBox = require(__dirname + "/../helpers/textbox.js");
let level = { let level = {
tiles: [ tiles: [
1, 52, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 6, 1, 52, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 6,
@ -27,6 +30,14 @@ let level = {
}, },
key: "1-4" key: "1-4"
}, },
{
type: "Chest",
pos: { x: 1 * tileSize, y: 2 * tileSize },
action: (player, level) => {
level.textbox.add(new TextBox(text.game.lifeBoost));
player.lives = 5;
}
},
{ {
type: "Portal", type: "Portal",
pos: { x: 4 * tileSize, y: 1 * tileSize }, pos: { x: 4 * tileSize, y: 1 * tileSize },
@ -75,7 +86,7 @@ let level = {
{ {
type: "Sign", type: "Sign",
pos: { x: 14 * tileSize, y: tileSize }, pos: { x: 14 * tileSize, y: tileSize },
text: "Many secret to the left" text: text.game.signs["2-2"]
} }
] ]
}; };

View File

@ -1,5 +1,8 @@
const tileSize = 32; const tileSize = 32;
const text = require(__dirname + "/../../res/lang/default.js");
const TextBox = require(__dirname + "/../helpers/textbox.js");
let level = { let level = {
tiles: [ tiles: [
1, 2, 5, 2, 5, 2, 5, 2, 5, 6, 1, 2, 5, 2, 5, 2, 5, 2, 5, 6,
@ -34,7 +37,8 @@ let level = {
{ {
type: "Chest", type: "Chest",
pos: { x: 1 * tileSize, y: 2 * tileSize }, pos: { x: 1 * tileSize, y: 2 * tileSize },
action: (player) => { action: (player, level) => {
level.textbox.add(new TextBox(text.game.keyFind));
player.items.keys.push("3-1"); player.items.keys.push("3-1");
} }
}, },

View File

@ -1,5 +1,8 @@
const tileSize = 32; const tileSize = 32;
const text = require(__dirname + "/../../res/lang/default.js");
const TextBox = require(__dirname + "/../helpers/textbox.js");
let level = { let level = {
tiles: [ tiles: [
1, 2, 5, 2, 5, 2, 5, 2, 5, 6, 1, 2, 5, 2, 5, 2, 5, 2, 5, 6,
@ -30,7 +33,8 @@ let level = {
{ {
type: "Chest", type: "Chest",
pos: { x: 1 * tileSize, y: 2 * tileSize }, pos: { x: 1 * tileSize, y: 2 * tileSize },
action: (player) => { action: (player, level) => {
level.textbox.add(new TextBox(text.game.keyFind));
player.items.keys.push("2-3"); player.items.keys.push("2-3");
} }
}, },

View File

@ -1,5 +1,7 @@
const tileSize = 32; const tileSize = 32;
const text = require(__dirname + "/../../res/lang/default.js");
let level = { let level = {
tiles: [ tiles: [
1, 2, 2, 2, 2, 2, 2, 2, 6, 1, 2, 2, 2, 2, 2, 2, 2, 6,
@ -42,7 +44,7 @@ let level = {
{ {
type: "Sign", type: "Sign",
pos: { x: 3 * tileSize, y: tileSize }, pos: { x: 3 * tileSize, y: tileSize },
text: "Impressive, you're good." text: text.game.signs["2-6"]
} }
] ]
}; };

View File

@ -1,5 +1,7 @@
const tileSize = 32; const tileSize = 32;
const text = require(__dirname + "/../../res/lang/default.js");
let level = { let level = {
tiles: [ tiles: [
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 52, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 52, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 6,
@ -43,7 +45,7 @@ let level = {
{ {
type: "Sign", type: "Sign",
pos: { x: 25 * tileSize, y: tileSize }, pos: { x: 25 * tileSize, y: tileSize },
text: "Climb the ladder and walk two tiles to the left" text: text.game.signs["3-1"]
}, },
{ {
type: "Portal", type: "Portal",

View File

@ -1,5 +1,8 @@
const tileSize = 32; const tileSize = 32;
const text = require(__dirname + "/../../res/lang/default.js");
const TextBox = require(__dirname + "/../helpers/textbox.js");
let level = { let level = {
tiles: [ tiles: [
1, 2, 5, 2, 5, 2, 5, 2, 5, 6, 1, 2, 5, 2, 5, 2, 5, 2, 5, 6,
@ -34,7 +37,8 @@ let level = {
{ {
type: "Chest", type: "Chest",
pos: { x: 8 * tileSize, y: 2 * tileSize }, pos: { x: 8 * tileSize, y: 2 * tileSize },
action: (player) => { action: (player, level) => {
level.textbox.add(new TextBox(text.game.keyFind));
player.items.keys.push("2-6"); player.items.keys.push("2-6");
} }
}, },

View File

@ -1,5 +1,7 @@
const tileSize = 32; const tileSize = 32;
const text = require(__dirname + "/../../res/lang/default.js");
let level = { let level = {
tiles: [ tiles: [
1, 2, 2, 2, 2, 2, 2, 2, 6, 1, 2, 2, 2, 2, 2, 2, 2, 6,
@ -42,7 +44,7 @@ let level = {
{ {
type: "Sign", type: "Sign",
pos: { x: 3 * tileSize, y: tileSize }, pos: { x: 3 * tileSize, y: tileSize },
text: "Congrats." text: text.game.signs["3-4"]
} }
] ]
}; };

View File

@ -13,6 +13,7 @@ class GameScreen extends Container {
super(); super();
this.game = game; this.game = game;
this.scene = this;
this.window = window; this.window = window;
this.keys = keys; this.keys = keys;
this.onGameOver = onGameOver; this.onGameOver = onGameOver;
@ -23,7 +24,7 @@ class GameScreen extends Container {
// Initialise first level 1-1.js at startPosition 0 // Initialise first level 1-1.js at startPosition 0
var player = new Player(keys, window); var player = new Player(keys, window);
var level = new Level(require(__dirname + "/../levels/2-2.js"), keys, player); var level = new Level(require(__dirname + "/../levels/2-2.js"), keys, player, this);
player.pos.x = level.startPos[0].x / 1; player.pos.x = level.startPos[0].x / 1;
player.pos.y = level.startPos[0].y / 1; player.pos.y = level.startPos[0].y / 1;
player.level = level; player.level = level;
@ -43,7 +44,7 @@ class GameScreen extends Container {
} }
switchLevel(module, pos = 0) { switchLevel(module, pos = 0) {
var { camera, player, level, stats, keys } = this; var { scene, camera, player, level, stats, keys } = this;
camera.map(function(e) { camera.map(function(e) {
camera.remove(e); camera.remove(e);
@ -54,7 +55,7 @@ class GameScreen extends Container {
var p = new Player(keys, window); var p = new Player(keys, window);
player = p; player = p;
e = new Level(module, keys, player); e = new Level(module, keys, player, scene);
level = e; level = e;
player.pos.x = level.startPos[pos].x / 1; player.pos.x = level.startPos[pos].x / 1;

View File

@ -11,6 +11,7 @@ const textures = {
space: new Texture("../res/images/keys/space.png"), space: new Texture("../res/images/keys/space.png"),
t: new Texture("../res/images/keys/t.png"), t: new Texture("../res/images/keys/t.png"),
q: new Texture("../res/images/keys/q.png"), q: new Texture("../res/images/keys/q.png"),
s: new Texture("../res/images/keys/s.png"),
logo: new Texture("../res/images/logo.png") logo: new Texture("../res/images/logo.png")
}; };
@ -35,7 +36,8 @@ class Title extends Container {
this.keyCaps = [ this.keyCaps = [
new TileSprite(textures.space, 64, 16), new TileSprite(textures.space, 64, 16),
new TileSprite(textures.t, 16, 16), new TileSprite(textures.t, 16, 16),
new TileSprite(textures.q, 16, 16) new TileSprite(textures.q, 16, 16),
new TileSprite(textures.s, 16, 16)
]; ];
this.keyCaps.forEach(element => { this.keyCaps.forEach(element => {
@ -43,10 +45,9 @@ class Title extends Container {
element.anims = new AnimManager(element); element.anims = new AnimManager(element);
element.anims.add("press", [0, 1].map(y => ({ x: 0, y })), 0.50); element.anims.add("press", [0, 1].map(y => ({ x: 0, y })), 0.50);
element.anims.play("press"); element.anims.play("press");
console.log(element);
}); });
const textPos = { x: 220, y: 240 }; const textPos = { x: 160, y: 210 };
for (let index = 0; index < text.titleScreen.instructions.length; index++) { for (let index = 0; index < text.titleScreen.instructions.length; index++) {
const keyCap = this.keyCaps[index]; const keyCap = this.keyCaps[index];
if (index == 0) { if (index == 0) {
@ -87,9 +88,10 @@ class Title extends Container {
this.onQuit(); this.onQuit();
} }
// Open gitea on key g // Open source code on key s
if (this.keys.key(71)) { if (this.keys.key(83)) {
shell.openExternal("https://gitea.arnweb.nl/Hecc-inc./caa-game"); shell.openExternal("https://gitea.arnweb.nl/Hecc-inc./caa-game");
this.keys.reset();
} }
} }