From 6061c6c25407d8ad09b3542174cb6137cbf42996 Mon Sep 17 00:00:00 2001 From: stickyPiston Date: Thu, 16 Apr 2020 18:42:24 +0200 Subject: [PATCH] [levels]: Add all levels and added credits screen. --- res/images/aseprite/example.aseprite | Bin 3669 -> 3702 bytes res/images/aseprite/tilemap.aseprite | Bin 4251 -> 4457 bytes res/images/tilemap.png | Bin 4639 -> 4901 bytes res/lang/default.js | 8 +++ res/tilemap.js | 28 +++++++-- src/entities/chest.js | 2 +- src/entities/portal.js | 18 +++++- src/entities/sign.js | 63 ++++++++++++++++++++ src/helpers/level.js | 14 ++++- src/helpers/textbox.js | 10 ++-- src/index.js | 11 +++- src/levels/0-1.js | 44 ++++++++++++++ src/levels/0-2.js | 68 ++++++++++++++++++++++ src/levels/1-2.js | 35 ++++++----- src/levels/1-3.js | 57 ++++++++++++++++++ src/levels/1-4.js | 45 +++++++++++++++ src/levels/2-1.js | 45 +++++++++++++++ src/levels/2-2.js | 83 +++++++++++++++++++++++++++ src/levels/2-3.js | 52 +++++++++++++++++ src/levels/2-4.js | 44 ++++++++++++++ src/levels/2-5.js | 41 +++++++++++++ src/levels/2-6.js | 50 ++++++++++++++++ src/levels/3-1.js | 69 ++++++++++++++++++++++ src/levels/3-2.js | 0 src/levels/3-3.js | 52 +++++++++++++++++ src/levels/3-4.js | 50 ++++++++++++++++ src/screens/credits.js | 67 +++++++++++++++++++++ src/screens/game.js | 11 +++- src/screens/title.js | 7 +++ 29 files changed, 940 insertions(+), 34 deletions(-) create mode 100644 src/entities/sign.js create mode 100644 src/levels/0-1.js create mode 100644 src/levels/0-2.js create mode 100644 src/levels/1-3.js create mode 100644 src/levels/1-4.js create mode 100644 src/levels/2-1.js create mode 100644 src/levels/2-2.js create mode 100644 src/levels/2-3.js create mode 100644 src/levels/2-4.js create mode 100644 src/levels/2-5.js create mode 100644 src/levels/2-6.js create mode 100644 src/levels/3-1.js create mode 100644 src/levels/3-2.js create mode 100644 src/levels/3-3.js create mode 100644 src/levels/3-4.js create mode 100644 src/screens/credits.js diff --git a/res/images/aseprite/example.aseprite b/res/images/aseprite/example.aseprite index 2fb0c6a931aa99808c454585e0ef95ed7730b83c..6f137a4765372370b161ec095f7c2a38934fcf97 100644 GIT binary patch delta 3362 zcmXw5dpwkB8zya(UNg0p8i#2Xo200QsF>P!H)0c;N)D-L8E2-WG4p0C({4fvC1Z@k zB8KERiBSlvVT{96tRc*#iIKxF$M>7|x8L8_{oK!WU%&f#u4~X(Vyt=jo+hLzxtAzd zg#hm3HH{!@Z&`5rcO68N&hnASFL&<-!iB+*5_ zUww1H661M2vEI+Q9;aH!{m@-GI~ypSaVIY044J!Ypnz<> zs1|K5Hw@L$*z8X%U{%G;U~9it=>ds-H)j@HPNCnkRz!g&W(wLJpGUocqbA>H(X3o5 zm9xX*t!4?3hx+_Gq+G0Jd1$5^aTI7;UYtcT72eFuWkl*))V>%_k7`(aUVBIBh7=+c zAKJOJr^<5B^WnEdD0#}`Ei9+;Z}ofTS!}u9pLWtA^1N&$X_oy?E+5EgXvYqSvDL*>;NZ98^G^6 zPjbztKSbv%oerp)p?SOD3)aF=>hZaS?-oJt-fhO|wl-P8H__=2+}Yb!l=pwe6|OBV za8n`&m7HB0M4(q3*%b;pQ*qHF(GRks9)J3gQsbC4O$q%(Ihd`+YYFRAqGEymdDOE> zN=<2lec}XnpGZ&U^-?DD4D-PJMYl_t(mxbnSsjcECXsX^w0aPI{A12d0VXHsd7miP zk2>H6xa4jAIQ#t&o2>KphEX?r=sFf1F`>w2k$gczE5X9aT8S_S9oD-rOU7?GA( zHL@vztymUkY3=j1=XeI@KVREyw0fWK&N)!2Q%lHy9E~F)Ih^x}=uf&b`qB+`{TO9P z7mGE0)6LLb!Ds}xAT+nAFPkF6<_4-uyy}G=sZ%Y_KVE}5<=2y1T*GG3`MX1)ggyH* zp%3!`9$ij{7|V!TsNd16%u2t2jzBE=b?rnh`F30=%W{m;5*j9`3%8qG><7Vf{E2WK zHUIQnR2cPC_%tyOV|yoiiT)1dw&bJ=TEW<+kCI*ez+L~eAQBBq*hd1@Jc@?Sz7lT$ zKtHgEgm@iy)*vUzpSZpiKGW_4J@N&nus%X1**T_DJ}WSXcDyWUbW znjWXP37#=|^Og5YW{3&EOGM(m#fQU}c@~8=g>?GcE2JQ6?ZaFUR5`f$femM(s5gb( zILf)nzZXYyt#}jrzKH~Gkvvw6p6&uNhWbA*R4>l>Keie~V7>PiL&(Oulzya;c%C)B z3V7G=8D;$RFu?5a_iRjwEO_Bhc1WGcx+Jw|)T5?H<>a*;=ATW&oi(Gi|buD~aS}P)q z_*kC6@fEY)E<-)z5kN!$Sm9*)eL7m?Vm;}u^o&UMAaTBY$=Kc(XK=o5O`)_s7W6rl zuHgDt_*>W4LDp~Iw=?%)@y>asGf=aZ-g`!~{$qf!fI)Pe6Z z-D}|(_^|MJMIHKiA^nIltukxa=0M#1)oE1z3twO`L9a|`IQf@=>i`HO(ca{4pNii| zQ2P?jOqte?oW7-7jKPKAQE``SBw(%TaC%_+W1>^RFtHL5JKreR1mANAI83+X`{ z3OmVzN?EBHkEr7435B9am^`(-2 z5Q7q@nkI>?ESpDTXbzG~VwFE+(aNAMdB^;(%EMK-J1blH3lAoXMB&= z9}8MCZ%6@3~AB|ppsoVz3mPAJYN0ZvH+Y4YQ=%A{d zyzd-l7tBVmD?qk_frh#BRA*PPszEk)pE9>#r|=8|ZU{KXheHN1Q~2B)MJDj)gc%vH zb6Nh-)5d>AO{bG9UViY?Rrv0raqVMeK!S+%1OG1H?Z7?V zde~ryQpn;5jT^hB@IR@dx8aHnQLI}N`;X$xBSA9GXTdkKCvkFxF$-tT2SE$brP5no z%-qEHz{|I=o64!QDJq7SzikfXzX>_<$!S_%s9WD$ft zsfw>|X5l^Q&@n199(_o?*mNTIm0=l%IbDrd~Zu3aez+Jcal4;uL8ffz6NsQ0reG zaSjg2g;p>mT#foof3~XdGxdVq`;dyX+@vtA$QTnjU#_Bi`!qs@SI9mF%QlPNEWn@VW*wZR0M)M<2^rkSAp}kNmCNZn5MgSKOY78h#_8SHT>P;!6z{jru()4-?uM zCZDEb-p>-PVECcf4a%5qaypTcTb-wgCx89VapxO{?W;+lpINZK2d+6~Xrlpk3!4@| zxvlM$Pb;d||sR(&`rfzq!ZDa1s_?JF<8k;#tjoo7u zjWkW%>g(&Htc9k$BvFU;?(^l>3FPKT_MY%Zku@2?r7#C`SP zJ+AD?{YvYj;HK`xd)9c84r-ObX|Bw(R4sptYi5n}YTRn;^Rd=hzFJmNrAhKsi)$h3 z!~3V+AeYZiRQtO*x$`bVAsHrGpPHBNp99aD=b)_~bqijsRUqGfKjPC9kd?+wzW|)G z)`kwh!gr#z4}ltmN2Hkes6YM<0r&v)hxd)&{cE+Zv*>l*DGgA`;_?;SOs#?zC8*JP zo0L+Y++IG}s`g^*>3AkLLGAn-@9?^hEbPkEGD}R-NW(DC^gQ{O@mD1htBf^v=lvH= zw8-l4v#DEiixvt}%c%HIEesPXnNrcbr0Ti7##HL!m>D*-)4=~U3mv}sPLXUwm-8Vo zZ>tk_;8TcY9_A_bYeP@@I$@%_lIU}C-`-j510pS(^gFplr-3;(#Nng~RBtN$G~!}{ zn5+?1iKA`hnz}W`bcAX#if|A-8y*9p;ziVIfjSipjS2Ke6|D?G%TkmYAgrrwA{RKu zG#R}`jrh#&wQ1%Ut9dbA;y*HlG`wD@P6W_{P<|+-?bTMRipoJhmrNeZR*x0|L|I?? za*=S>TD$Jw70C`S_p1ZJvoiLZo19dLs)r$e{twg1 B?mhqj delta 3328 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 B*`NRb literal 4251 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 diff --git a/res/images/tilemap.png b/res/images/tilemap.png index 6ceef374c06ca6b45a68e4128691ad0c0c022697..0b66b38650c26f75f17ab0aa5972bb8894b3eb19 100644 GIT binary patch literal 4901 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 M(Yg&qY1%&jKkZv@-~a#s literal 4639 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 Hb9wL|S6$<7 diff --git a/res/lang/default.js b/res/lang/default.js index c3efd71..12b56df 100644 --- a/res/lang/default.js +++ b/res/lang/default.js @@ -4,6 +4,7 @@ module.exports = { "Press Space to Start!", "Press T for the tutorial", "Press Q to quit", + //"Press G to see the game's code" ] }, tutorial: [ @@ -26,5 +27,12 @@ module.exports = { stamina: "Stamina", keyFind: "You found a key!", keyMissing: "You do not have the key for this door!" + }, + credits: { + credits: "Credits:", + arne: "(almost all) Code by Arne van Iterson", + job: "Code and assets by Job Vonk", + hannah: "Heron't logo by Hannah van Iterson", + font: "The logo's font is “Alagard” by Hewett Tsoi" } }; \ No newline at end of file diff --git a/res/tilemap.js b/res/tilemap.js index e9ab177..28e0b86 100644 --- a/res/tilemap.js +++ b/res/tilemap.js @@ -14,10 +14,10 @@ * 9. Corner right -> bottom * 10. bottom wall piece before 8. * 11. normal bottom wall piece - * 12. Corner bottom -> right - * 13. Corner right -> bottom - * 14. Corner bottom -> left - * 15. Bottom wall piece before 13. + * 12. Corner right -> bottom + * 13. Corner bottom -> right + * 14. Corner left -> bottom + * 15. Bottom wall piece after 14. * 16. Corner left -> bottom * 17. Normal floor tile * 18. +-shaped floor tile @@ -51,8 +51,11 @@ * 46. Fireball * 47. Door_s * 48. Corner bottom -> left after 16 - * 49. Corner right -> bottom before 12 + * 49. Corner right -> bottom before 13 * 50. bottom piece underneath 47 + * 51. Transparent tile (walkable) + * 52. top-piece after corner (1) + * 53. Sign on wall ------------------------------------------------------------------- */ module.exports = [ { @@ -310,4 +313,19 @@ module.exports = [ y: 320, walkable: false }, + { + x: 0, + y: 256, + walkable: true + }, + { + x: 32, + y: 320, + walkable: false + }, + { + x: 64, + y: 320, + walkable: false + }, ]; \ No newline at end of file diff --git a/src/entities/chest.js b/src/entities/chest.js index 8eae900..e1d335e 100644 --- a/src/entities/chest.js +++ b/src/entities/chest.js @@ -71,7 +71,7 @@ class Chest extends TileSprite { this.state = state.open; this.pressed = true; this.action(); - this.level.entities.add(new TextBox(text.game.keyFind, 2.5)); + this.level.entities.add(new TextBox({x: this.pos.x, y: this.pos.y - 10}, text.game.keyFind, 2.5)); sounds.obtain.play(); } else { if (!sounds.forbidden.playing && !this.pressed) { diff --git a/src/entities/portal.js b/src/entities/portal.js index c20bc18..f7d2f42 100644 --- a/src/entities/portal.js +++ b/src/entities/portal.js @@ -27,6 +27,8 @@ class Portal extends TileSprite { this.keys = keys; this.key = key; + this.type = type; + switch (type) { case "Door_n": this.frame = { x: 1, y: 7 }; @@ -64,6 +66,15 @@ class Portal extends TileSprite { h: 30 }; break; + case "Door_hidden": + this.frame = { x: 0, y: 4 }; + this.hitBox = { + x: 1, + y: 1, + w: 30, + h: 45 + }; + break; } } @@ -71,7 +82,7 @@ class Portal extends TileSprite { super.update(dt); if (entity.hit(this, this.player)) { - if (!this.pointer) { + if (!this.pointer && this.type !== "Door_hidden") { var pointer = new Pointer({ x: (this.pos.x + this.tileW / 2) - 8, y: this.pos.y - 16 @@ -80,7 +91,7 @@ class Portal extends TileSprite { this.pointer = pointer; } - if (this.key != "") { + if (this.key != "" && this.type !== "Door_hidden") { if (this.player.items.keys.includes(this.key)) { // Correct key this.pointer.anims.play("white"); @@ -93,7 +104,8 @@ class Portal extends TileSprite { this.pointer.anims.play("red"); if (this.keys.action) { if (!sounds.forbidden.playing && !this.pressed) { - this.level.entities.add(new TextBox(text.game.keyMissing, 2.5)); + console.log(this.player); + 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(); this.pressed = true; } diff --git a/src/entities/sign.js b/src/entities/sign.js new file mode 100644 index 0000000..f098724 --- /dev/null +++ b/src/entities/sign.js @@ -0,0 +1,63 @@ +var asdf = require("asdf-games"); +// eslint-disable-next-line no-unused-vars +const { Texture, TileSprite, entity } = asdf; + +const texture = new Texture(__dirname + "/../../res/images/tilemap.png"); + +const TextBox = require(__dirname + "/../helpers/textbox.js"); + +const Pointer = require("./pointer.js"); + +class Sign extends TileSprite { + constructor(pos, player, keys, level, text) { + super(texture, 32, 32); + this.pos = pos; + this.scale = { x: 1, y: 1 }; + + this.frame = { x : 2, y: 10 }; + this.player = player; + this.level = level; + + this.keys = keys; + + this.pointer = false; + + this.string = text; + + this.hitBox = { + x: 1, + y: 1, + w: 28, + h: 32 + }; + } + + update(dt) { + super.update(dt); + + if (entity.hit(this, this.player)) { + + if (!this.pointer) { + var pointer = new Pointer({ + x: (this.pos.x + this.tileW / 2) - 8, + y: this.pos.y - 16 + }); + this.level.entities.add(pointer); + this.pointer = pointer; + } + this.pointer.anims.play("white"); + + 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); + console.log(box); + this.level.entities.add(box); + } + + } else { + this.level.entities.remove(this.pointer); + this.pointer = false; + } + } +} + +module.exports = Sign; \ No newline at end of file diff --git a/src/helpers/level.js b/src/helpers/level.js index c7f5041..6ded42a 100644 --- a/src/helpers/level.js +++ b/src/helpers/level.js @@ -1,6 +1,6 @@ var asdf = require("asdf-games"); // eslint-disable-next-line no-unused-vars -const { Texture, TileMap, Container } = asdf; +const { Texture, TileMap, Container, Sound } = asdf; const texture = new Texture(__dirname + "/../../res/images/tilemap.png"); const tiles = require("../../res/tilemap.js"); @@ -9,6 +9,11 @@ const tileSize = 32; const Mage = require("../entities/mage.js"); const Chest = require("../entities/chest.js"); const Portal = require("../entities/portal.js"); +const Sign = require("../entities/sign.js"); + +// const sounds = { +// bg: new Sound(__dirname + "/../../res/sounds/bg.wav", { volume: 0.05, loop: true }) +// }; class Level extends TileMap { constructor (level, keys, player) { @@ -27,6 +32,8 @@ class Level extends TileMap { this.keys = keys; this.player = player; + this.gameComplete = false; + this.switch = false; // Handle Entities @@ -42,6 +49,9 @@ class Level extends TileMap { 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); break; + case "Sign": + e.entity = new Sign({ x: e.pos.x / 1, y: e.pos.y / 1 }, this.player, this.keys, this, e.text); + break; } this.children.push(e.entity); } @@ -49,6 +59,8 @@ class Level extends TileMap { this.entities = new Container(); this.children.push(this.entities); + // sounds.bg.play(); + } update(dt) { diff --git a/src/helpers/textbox.js b/src/helpers/textbox.js index 0029249..62d3432 100644 --- a/src/helpers/textbox.js +++ b/src/helpers/textbox.js @@ -5,19 +5,21 @@ const { Container, Text, Rect } = asdf; const fillStyle = {fill: "#ffffff", font: "16px Minecraft"}; class TextBox extends Container { - constructor(string, lifespan) { + constructor(pos, string, lifespan) { super(); - this.pos = { x: 0, y: 0 }; + this.pos = pos !== undefined ? pos : { x: 0, y: 0 }; this.string = string; this.lifespan = lifespan; const background = new Rect(640, 24, {fill: "rgba(0,0,0,0.5)"}); - background.pos = { x: 0, y: 0 }; + background.pos = this.pos; this.add(background); const text = new Text(string, fillStyle); - text.pos = { x: 8, y: 18 }; + text.pos = { x: this.pos.x + 8, y: this.pos.y + 18 }; this.add(text); + + console.log(this); } update(dt) { diff --git a/src/index.js b/src/index.js index f1dcb9d..6a5ecb7 100644 --- a/src/index.js +++ b/src/index.js @@ -1,14 +1,15 @@ const { ipcRenderer, remote } = require("electron"); var asdf = require("asdf-games"); // eslint-disable-next-line no-unused-vars -const { Game, KeyControls, MouseControls } = asdf; +const { Game, KeyControls } = asdf; const Logo = require(__dirname + "/../src/screens/logo.js"), Title = require(__dirname + "/../src/screens/title.js"), Tutorial = require(__dirname + "/../src/screens/tutorial.js"), GameScreen = require(__dirname + "/../src/screens/game.js"), - Gameover = require(__dirname + "/../src/screens/gameover.js") + Gameover = require(__dirname + "/../src/screens/gameover.js"), + Credits = require(__dirname + "/../src/screens/credits.js") ; const window = { w: 640, h: 320 }; @@ -31,7 +32,11 @@ function gameOver() { } function newGame() { - game.scene = new GameScreen(game, window, keys, gameOver); + game.scene = new GameScreen(game, window, keys, gameOver, credits); +} + +function credits() { + game.scene = new Credits(game, keys, titleScreen); } game.scene = new Logo(game, titleScreen); diff --git a/src/levels/0-1.js b/src/levels/0-1.js new file mode 100644 index 0000000..f8fcd46 --- /dev/null +++ b/src/levels/0-1.js @@ -0,0 +1,44 @@ +const tileSize = 32; + +let level = { + tiles: [ + 1, 2, 2, 2, 2, 2, 2, 2, 6, + 4, 21, 22, 23, 21, 22, 23, 21, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 14, 15, 11, 11, 11, 11, 11, 10, 13, + ], + size: { + w: 9 * tileSize, + h: 9 * tileSize + }, + startPos: [ + { x: 5 * tileSize, y: 3 * tileSize } + ], + entities: [ + { + type: "Portal", + pos: { x: 4 * tileSize, y: tileSize }, + texture: "Door_n", + action: (_player, level) => { + level.switch = { module: __dirname + "/0-2.js", pos: 0 }; + }, + key: "" + }, + { + type: "Portal", + pos: { x: 4 * tileSize, y: 6 * tileSize }, + texture: "Ladder", + action: (_player, level) => { + level.switch = { module: __dirname + "/2-6.js", pos: 0 }; + }, + key: "" + } + ] +}; + +module.exports = level; \ No newline at end of file diff --git a/src/levels/0-2.js b/src/levels/0-2.js new file mode 100644 index 0000000..dd9fe49 --- /dev/null +++ b/src/levels/0-2.js @@ -0,0 +1,68 @@ +const tileSize = 32; + +let level = { + tiles: [ + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, + 4, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 14, 11, 11, 11, 11, 11, 16, 47, 12, 11, 11, 11, 11, 11, 13, + 0, 0, 0, 0, 0, 0, 14, 50, 13, 0, 0, 0, 0, 0, 0, 0 + ], + size: { + w: 15 * tileSize, + h: 20 * tileSize + }, + startPos: [ + { x: 7 * tileSize, y: 12 * tileSize } + ], + entities: [ + { + type: "Portal", + pos: { x: 7 * tileSize, y: 13 * tileSize }, + texture: "Door_s", + action: (_player, level) => { + level.switch = { module: __dirname + "/0-1.js", pos: 0 }; + }, + key: "" + }, + { + type: "Chest", + pos: { x: 7 * tileSize, y: 2 * tileSize }, + action: (player) => { + player.items.keys.push("3-4"); + } + }, + { + type: "Mage", + pos: { x: 7 * tileSize, y: 3 * tileSize } + }, + { + type: "Mage", + pos: { x: 2 * tileSize, y: 7 * tileSize } + }, + { + type: "Mage", + pos: { x: 13 * tileSize, y: 7 * tileSize } + }, + { + type: "Mage", + pos: { x: 11 * tileSize, y: 2 * tileSize } + }, + { + type: "Mage", + pos: { x: 7 * tileSize, y: 7 * tileSize } + } + ] +}; + +module.exports = level; \ No newline at end of file diff --git a/src/levels/1-2.js b/src/levels/1-2.js index a619d91..fb01c92 100644 --- a/src/levels/1-2.js +++ b/src/levels/1-2.js @@ -10,8 +10,8 @@ let level = { 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, - 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, - 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 13 + 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, 47, 12, 11, 11, 10, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 50, 13, 0, 0, 0, 0, ], size: { w: 30 * tileSize, @@ -19,20 +19,9 @@ let level = { }, startPos: [ { x: 5 * tileSize, y: 3 * tileSize }, - { x: 48, y: 128 } + { x: 24 * tileSize, y: 6 * tileSize } ], entities: [ - { - type: "Mage", - pos: { x: 1 * tileSize, y: 8 * tileSize } - }, - { - type: "Chest", - pos: { x: 4 * tileSize, y: 2 * tileSize }, - action: (player) => { - player.items.keys.push("1-1_1"); - } - }, { type: "Portal", pos: { x: 5 * tileSize, y: 1 * tileSize }, @@ -41,6 +30,24 @@ let level = { level.switch = { module: __dirname + "/1-1.js", pos: 0 }; }, key: "1-1_1" + }, + { + type: "Portal", + pos: { x: 24 * tileSize, y: 1 * tileSize }, + texture: "Door_n", + action: (_player, level) => { + level.switch = { module: __dirname + "/1-4.js", pos: 0 }; + }, + key: "1-4" + }, + { + type: "Portal", + pos: { x: 24 * tileSize, y: 8 * tileSize }, + texture: "Door_s", + action: (_player, level) => { + level.switch = { module: __dirname + "/1-3.js", pos: 0 }; + }, + key: "" } ] }; diff --git a/src/levels/1-3.js b/src/levels/1-3.js new file mode 100644 index 0000000..02c6490 --- /dev/null +++ b/src/levels/1-3.js @@ -0,0 +1,57 @@ +const tileSize = 32; + +let level = { + tiles: [ + 1, 2, 2, 2, 2, 2, 2, 2, 5, 6, + 4, 21, 22, 23, 21, 22, 23, 21, 22, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 14, 15, 11, 11, 11, 11, 11, 11, 10, 13 + ], + size: { + w: 10 * tileSize, + h: 20 * tileSize + }, + startPos: [ + { x: 5 * tileSize, y: 3 * tileSize } + ], + entities: [ + { + type: "Mage", + pos: { x: 4.5 * tileSize, y: 10 * tileSize } + }, + { + type: "Chest", + pos: { x: 4.5 * tileSize, y: 17 * tileSize }, + action: (player) => { + player.items.keys.push("1-4"); + } + }, + { + type: "Portal", + pos: { x: 5 * tileSize, y: 1 * tileSize }, + texture: "Door_n", + action: (_player, level) => { + level.switch = { module: __dirname + "/1-2.js", pos: 1 }; + }, + key: "" + } + ] +}; + +module.exports = level; \ No newline at end of file diff --git a/src/levels/1-4.js b/src/levels/1-4.js new file mode 100644 index 0000000..2b84d20 --- /dev/null +++ b/src/levels/1-4.js @@ -0,0 +1,45 @@ +const tileSize = 32; + +let level = { + tiles: [ + 1, 2, 2, 2, 2, 2, 2, 2, 6, + 4, 21, 22, 23, 21, 22, 23, 21, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 14, 15, 11, 16, 47, 12, 11, 10, 13, + 0, 0, 0, 14, 50, 13, 0, 0, 0, 0, + ], + size: { + w: 9 * tileSize, + h: 10 * tileSize + }, + startPos: [ + { x: 5 * tileSize, y: 3 * tileSize } + ], + entities: [ + { + type: "Portal", + pos: { x: 4 * tileSize, y: 8 * tileSize }, + texture: "Door_s", + action: (_player, level) => { + level.switch = { module: __dirname + "/1-2.js", pos: 1 }; + }, + key: "" + }, + { + type: "Portal", + pos: { x: 4 * tileSize, y: 3 * tileSize }, + texture: "Ladder", + action: (_player, level) => { + level.switch = { module: __dirname + "/2-1.js", pos: 0 }; + }, + key: "1-4" + } + ] +}; + +module.exports = level; \ No newline at end of file diff --git a/src/levels/2-1.js b/src/levels/2-1.js new file mode 100644 index 0000000..512f114 --- /dev/null +++ b/src/levels/2-1.js @@ -0,0 +1,45 @@ +const tileSize = 32; + +let level = { + tiles: [ + 1, 2, 2, 2, 2, 2, 2, 2, 6, + 4, 21, 22, 23, 21, 22, 23, 21, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 51, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 14, 15, 11, 16, 47, 12, 11, 10, 13, + 0, 0, 0, 14, 50, 13, 0, 0, 0, 0, + ], + size: { + w: 9 * tileSize, + h: 10 * tileSize + }, + startPos: [ + { x: 5 * tileSize, y: 3 * tileSize } + ], + entities: [ + { + type: "Portal", + pos: { x: 4 * tileSize, y: 8 * tileSize }, + texture: "Door_s", + action: (_player, level) => { + level.switch = { module: __dirname + "/2-2.js", pos: 0 }; + }, + key: "" + }, + { + type: "Portal", + pos: { x: 4 * tileSize, y: 3 * tileSize }, + texture: "Ladder", + action: (_player, level) => { + level.switch = { module: __dirname + "/1-4.js", pos: 0 }; + }, + key: "1-4" + } + ] +}; + +module.exports = level; \ No newline at end of file diff --git a/src/levels/2-2.js b/src/levels/2-2.js new file mode 100644 index 0000000..0414fac --- /dev/null +++ b/src/levels/2-2.js @@ -0,0 +1,83 @@ +const tileSize = 32; + +let level = { + tiles: [ + 1, 52, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 6, + 4, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 14, 48, 47, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 16, 47, 12, 11, 10, 13, + 0, 14, 50, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 50, 13, 0, 0, 0, 0, + ], + size: { + w: 20 * tileSize, + h: 7 * tileSize + }, + startPos: [ + { x: 5 * tileSize, y: 3 * tileSize } + ], + entities: [ + { + type: "Portal", + pos: { x: 9 * tileSize, y: 1 * tileSize }, + texture: "Door_n", + action: (_player, level) => { + level.switch = { module: __dirname + "/2-1.js", pos: 0 }; + }, + key: "1-4" + }, + { + type: "Portal", + pos: { x: 4 * tileSize, y: 1 * tileSize }, + texture: "Door_n", + action: (_player, level) => { + level.switch = { module: __dirname + "/2-3.js", pos: 0 }; + }, + key: "2-3" + }, + { + type: "Portal", + pos: { x: 2 * tileSize, y: 5 * tileSize }, + texture: "Door_s", + action: (_player, level) => { + level.switch = { module: __dirname + "/2-4.js", pos: 0 }; + }, + key: "" + }, + { + type: "Portal", + pos: { x: 15 * tileSize, y: 5 * tileSize }, + texture: "Door_s", + action: (_player, level) => { + level.switch = { module: __dirname + "/2-5.js", pos: 0 }; + }, + key: "" + }, + { + type: "Portal", + pos: { x: 17 * tileSize, y: 3 * tileSize }, + texture: "Ladder", + action: (_player, level) => { + level.switch = { module: __dirname + "/3-1.js", pos: 0 }; + }, + key: "3-1" + }, + { + type: "Portal", + pos: { x: 15 * tileSize, y: tileSize }, + texture: "Door_hidden", + action: (_player, level) => { + level.switch = { module: __dirname + "/2-6.js", pos: 0 }; + }, + key: "2-6" + }, + { + type: "Sign", + pos: { x: 14 * tileSize, y: tileSize }, + text: "Many secret to the left" + } + ] +}; + +module.exports = level; \ No newline at end of file diff --git a/src/levels/2-3.js b/src/levels/2-3.js new file mode 100644 index 0000000..17f19d0 --- /dev/null +++ b/src/levels/2-3.js @@ -0,0 +1,52 @@ +const tileSize = 32; + +let level = { + tiles: [ + 1, 2, 5, 2, 5, 2, 5, 2, 5, 6, + 4, 21, 22, 23, 21, 22, 23, 21, 22, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 14, 11, 11, 11, 11, 11, 16, 47, 49, 13, + 0, 0, 0, 0, 0, 0, 14, 50, 13, 0, 0, + ], + size: { + w: 10 * tileSize, + h: 11 * tileSize + }, + startPos: [ + { x: 7 * tileSize, y: 6.8 * tileSize } + ], + entities: [ + { + type: "Portal", + pos: { x: 7 * tileSize, y: 9 * tileSize }, + texture: "Door_s", + action: (_player, level) => { + level.switch = { module: __dirname + "/2-2.js", pos: 0 }; + }, + key: "" + }, + { + type: "Chest", + pos: { x: 1 * tileSize, y: 2 * tileSize }, + action: (player) => { + player.items.keys.push("3-1"); + } + }, + { + type: "Mage", + pos: { x: 7 * tileSize, y: 3 * tileSize } + }, + { + type: "Mage", + pos: { x: 2 * tileSize, y: 7 * tileSize } + } + ] +}; + +module.exports = level; \ No newline at end of file diff --git a/src/levels/2-4.js b/src/levels/2-4.js new file mode 100644 index 0000000..c7fdae1 --- /dev/null +++ b/src/levels/2-4.js @@ -0,0 +1,44 @@ +const tileSize = 32; + +let level = { + tiles: [ + 1, 2, 5, 2, 5, 2, 5, 2, 5, 6, + 4, 21, 22, 23, 21, 22, 23, 21, 22, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 14, 11, 11, 11, 11, 11, 11, 11, 11, 13, + ], + size: { + w: 10 * tileSize, + h: 7 * tileSize + }, + startPos: [ + { x: 7 * tileSize, y: 2 * tileSize } + ], + entities: [ + { + type: "Portal", + pos: { x: 7 * tileSize, y: 1 * tileSize }, + texture: "Door_n", + action: (_player, level) => { + level.switch = { module: __dirname + "/2-2.js", pos: 0 }; + }, + key: "" + }, + { + type: "Chest", + pos: { x: 1 * tileSize, y: 2 * tileSize }, + action: (player) => { + player.items.keys.push("2-3"); + } + }, + { + type: "Mage", + pos: { x: 2 * tileSize, y: 3 * tileSize } + }, + ] +}; + +module.exports = level; \ No newline at end of file diff --git a/src/levels/2-5.js b/src/levels/2-5.js new file mode 100644 index 0000000..58a92b5 --- /dev/null +++ b/src/levels/2-5.js @@ -0,0 +1,41 @@ +const tileSize = 32; + +let level = { + tiles: [ + 1, 2, 5, 2, 5, 2, 5, 2, 5, 6, + 4, 21, 22, 23, 21, 22, 23, 21, 22, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 14, 11, 11, 11, 11, 11, 11, 11, 11, 13, + ], + size: { + w: 10 * tileSize, + h: 7 * tileSize + }, + startPos: [ + { x: 7 * tileSize, y: 2 * tileSize } + ], + entities: [ + { + type: "Portal", + pos: { x: 7 * tileSize, y: 1 * tileSize }, + texture: "Door_n", + action: (_player, level) => { + level.switch = { module: __dirname + "/2-2.js", pos: 0 }; + }, + key: "" + }, + { + type: "Mage", + pos: { x: 2 * tileSize, y: 3 * tileSize } + }, + { + type: "Mage", + pos: { x: 5 * tileSize, y: 4 * tileSize } + }, + ] +}; + +module.exports = level; \ No newline at end of file diff --git a/src/levels/2-6.js b/src/levels/2-6.js new file mode 100644 index 0000000..b9d0c50 --- /dev/null +++ b/src/levels/2-6.js @@ -0,0 +1,50 @@ +const tileSize = 32; + +let level = { + tiles: [ + 1, 2, 2, 2, 2, 2, 2, 2, 6, + 4, 21, 22, 23, 21, 22, 23, 21, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 51, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 14, 15, 11, 16, 47, 12, 11, 10, 13, + 0, 0, 0, 14, 50, 13, 0, 0, 0, 0, + ], + size: { + w: 9 * tileSize, + h: 10 * tileSize + }, + startPos: [ + { x: 5 * tileSize, y: 3 * tileSize } + ], + entities: [ + { + type: "Portal", + pos: { x: 4 * tileSize, y: 8 * tileSize }, + texture: "Door_s", + action: (_player, level) => { + level.switch = { module: __dirname + "/2-2.js", pos: 0 }; + }, + key: "2-6" + }, + { + type: "Portal", + pos: { x: 4 * tileSize, y: 3 * tileSize }, + texture: "Ladder", + action: (_player, level) => { + level.switch = { module: __dirname + "/0-1.js", pos: 0 }; + }, + key: "" + }, + { + type: "Sign", + pos: { x: 3 * tileSize, y: tileSize }, + text: "Impressive, you're good." + } + ] +}; + +module.exports = level; \ No newline at end of file diff --git a/src/levels/3-1.js b/src/levels/3-1.js new file mode 100644 index 0000000..0cf7a7c --- /dev/null +++ b/src/levels/3-1.js @@ -0,0 +1,69 @@ +const tileSize = 32; + +let level = { + 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, 4, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 17, 17, 12, 11, 11, 11, 11, 11, 11, 10, 13, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 17, 17, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 17, 17, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 17, 17, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 17, 17, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 17, 17, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 17, 17, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 17, 17, 17, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 52, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 17, 17, 17, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 17, 17, 17, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 13, 0, 0, 0, 0, 0, 0, 0, 0, + ], + size: { + w: 30 * tileSize, + h: 20 * tileSize + }, + startPos: [ + { x: 25 * tileSize, y: 3 * tileSize }, + { x: 4 * tileSize, y: 15 * tileSize } + ], + entities: [ + { + type: "Portal", + pos: { x: 27 * tileSize, y: 3 * tileSize }, + texture: "Ladder", + action: (_player, level) => { + level.switch = { module: __dirname + "/2-2.js", pos: 0 }; + }, + key: "3-1" + }, + { + type: "Sign", + pos: { x: 25 * tileSize, y: tileSize }, + text: "Climb the ladder and walk two tiles to the left" + }, + { + type: "Portal", + pos: { x: 20 * tileSize, y: tileSize }, + texture: "Door_hidden", + action: (_player, level) => { + level.switch = { module: __dirname + "/3-4.js", pos: 0 }; + }, + key: "3-4" + }, + { + type: "Portal", + pos: { x: 4 * tileSize, y: 14 * tileSize }, + texture: "Door_n", + action: (_player, level) => { + level.switch = { module: __dirname + "/3-3.js", pos: 0 }; + }, + key: "" + } + ] +}; + +module.exports = level; \ No newline at end of file diff --git a/src/levels/3-2.js b/src/levels/3-2.js new file mode 100644 index 0000000..e69de29 diff --git a/src/levels/3-3.js b/src/levels/3-3.js new file mode 100644 index 0000000..12d928d --- /dev/null +++ b/src/levels/3-3.js @@ -0,0 +1,52 @@ +const tileSize = 32; + +let level = { + tiles: [ + 1, 2, 5, 2, 5, 2, 5, 2, 5, 6, + 4, 21, 22, 23, 21, 22, 23, 21, 22, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 17, 7, + 14, 11, 16, 47, 49, 11, 11, 11, 11, 13, + 0, 0, 14, 50, 13, 0, 0, 0, 0, 0, 0, + ], + size: { + w: 10 * tileSize, + h: 11 * tileSize + }, + startPos: [ + { x: 7 * tileSize, y: 6.8 * tileSize } + ], + entities: [ + { + type: "Portal", + pos: { x: 3 * tileSize, y: 9 * tileSize }, + texture: "Door_s", + action: (_player, level) => { + level.switch = { module: __dirname + "/3-1.js", pos: 1 }; + }, + key: "" + }, + { + type: "Chest", + pos: { x: 8 * tileSize, y: 2 * tileSize }, + action: (player) => { + player.items.keys.push("2-6"); + } + }, + { + type: "Mage", + pos: { x: 7 * tileSize, y: 3 * tileSize } + }, + { + type: "Mage", + pos: { x: 2 * tileSize, y: 7 * tileSize } + } + ] +}; + +module.exports = level; \ No newline at end of file diff --git a/src/levels/3-4.js b/src/levels/3-4.js new file mode 100644 index 0000000..426283d --- /dev/null +++ b/src/levels/3-4.js @@ -0,0 +1,50 @@ +const tileSize = 32; + +let level = { + tiles: [ + 1, 2, 2, 2, 2, 2, 2, 2, 6, + 4, 21, 22, 23, 21, 22, 23, 21, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 4, 17, 17, 17, 17, 17, 17, 17, 7, + 14, 15, 11, 16, 47, 12, 11, 10, 13, + 0, 0, 0, 14, 50, 13, 0, 0, 0, 0, + ], + size: { + w: 9 * tileSize, + h: 10 * tileSize + }, + startPos: [ + { x: 5 * tileSize, y: 3 * tileSize } + ], + entities: [ + { + type: "Portal", + pos: { x: 4 * tileSize, y: 8 * tileSize }, + texture: "Door_s", + action: (_player, level) => { + level.switch = { module: __dirname + "/3-1.js", pos: 0 }; + }, + key: "3-4" + }, + { + type: "Portal", + pos: { x: 4 * tileSize, y: tileSize }, + texture: "Door_n", + action: (_player, level) => { + level.gameComplete = true; + }, + key: "3-4" + }, + { + type: "Sign", + pos: { x: 3 * tileSize, y: tileSize }, + text: "Congrats." + } + ] +}; + +module.exports = level; \ No newline at end of file diff --git a/src/screens/credits.js b/src/screens/credits.js new file mode 100644 index 0000000..47f0928 --- /dev/null +++ b/src/screens/credits.js @@ -0,0 +1,67 @@ +const asdf = require("asdf-games"); +// eslint-disable-next-line no-unused-vars +const { Text, Container, Rect, Texture, Sprite } = asdf; + +const text = require(__dirname + "/../../res/lang/default.js"); +const fillStyleHeadline = {fill: "#ffffff", font: "24px Minecraft"}; +const fillStyleNormal = {fill: "#ffffff", font: "16px Minecraft"}; + +const logo = new Texture(__dirname + "/../../res/images/logo.png"); + +class Credits extends Container { + constructor(game, keys, onEnd) { + super(); + this.game = game; + this.keys = keys; + this.onEnd = onEnd; + + this.children = []; + + this.debounceTime = 2; + + this.add(new Rect(this.game.w, this.game.h, { fill: "#333333" })); + + const logoSprite = new Sprite(logo); + logoSprite.pos = { x: 160, y: 0 }; + logoSprite.scale = { x: 0.5, y: 0.5 }; + this.add(logoSprite); + + const creditsText = new Text(text.credits.credits, fillStyleHeadline); + creditsText.pos = { x: 260, y: 120 }; + this.add(creditsText); + + const arneText = new Text(text.credits.arne, fillStyleNormal); + arneText.pos = { x: 125, y: 170 }; + this.add(arneText); + + const jobText = new Text(text.credits.job, fillStyleNormal); + jobText.pos = { x: 125, y: 200 }; + this.add(jobText); + + const hannahText = new Text(text.credits.hannah, fillStyleNormal); + hannahText.pos = { x: 125, y: 230 }; + this.add(hannahText); + + const logoText = new Text(text.credits.font, fillStyleNormal); + logoText.pos = { x: 125, y: 260 }; + this.add(logoText); + + var instruction = new Text(text.gameOver.instruction, fillStyleNormal); + instruction.pos = { x: 175, y: 300 }; + this.add(instruction); + + } + + update(dt, t) { + super.update(dt, t); + + if (this.keys.action && this.debounceTime <= 0) { + this.onEnd(); + } + + this.debounceTime -= dt; + + } +} + +module.exports = Credits; \ No newline at end of file diff --git a/src/screens/game.js b/src/screens/game.js index 69f2869..983e5a0 100644 --- a/src/screens/game.js +++ b/src/screens/game.js @@ -9,20 +9,21 @@ var Player = require(__dirname + "/../entities/player.js"); var Level = require(__dirname + "/../helpers/level.js"); class GameScreen extends Container { - constructor(game, window, keys, onGameOver) { + constructor(game, window, keys, onGameOver, onComplete) { super(); this.game = game; this.window = window; this.keys = keys; this.onGameOver = onGameOver; + this.onComplete = onComplete; this.keys.reset(); // Initialise first level 1-1.js at startPosition 0 var player = new Player(keys, window); - var level = new Level(require(__dirname + "/../levels/1-1.js"), keys, player); + var level = new Level(require(__dirname + "/../levels/2-2.js"), keys, player); player.pos.x = level.startPos[0].x / 1; player.pos.y = level.startPos[0].y / 1; player.level = level; @@ -85,7 +86,7 @@ class GameScreen extends Container { var { camera, player, level, keys } = this; // Debug options - if (debugMode && keys.ctrl && keys.key(66)) { + if (debugMode && keys.escape) { console.debug(level); console.debug(player); } @@ -94,6 +95,10 @@ class GameScreen extends Container { this.onGameOver(); } + if (level.gameComplete) { + this.onComplete(); + } + // Switch to another level if (level.switch) { if (debugMode) { diff --git a/src/screens/title.js b/src/screens/title.js index 4ba948b..fd71c4e 100644 --- a/src/screens/title.js +++ b/src/screens/title.js @@ -2,6 +2,8 @@ const asdf = require("asdf-games"); // eslint-disable-next-line no-unused-vars const { Texture, Container, TileSprite, Text, AnimManager, Rect, Sprite } = asdf; +const { shell } = require("electron"); + const text = require(__dirname + "/../../res/lang/default.js"); const fillStyle = {fill: "#ffffff", font: "24px Minecraft"}; @@ -85,6 +87,11 @@ class Title extends Container { this.onQuit(); } + // Open gitea on key g + if (this.keys.key(71)) { + shell.openExternal("https://gitea.arnweb.nl/Hecc-inc./caa-game"); + } + } }