From c86f2ed3700e5b04c13bfd046cbd51009a43bf81 Mon Sep 17 00:00:00 2001 From: Arne van Iterson Date: Sun, 29 Mar 2020 15:40:57 +0200 Subject: [PATCH] Added mages, stamina and improved running/walking --- res/aseprite/tilemap.aseprite | Bin 3518 -> 3496 bytes res/mage.png | Bin 0 -> 1087 bytes res/tilemap.min.js | 83 +++++++++++++++++----------------- res/tilemap.png | Bin 3660 -> 3689 bytes src/entities/mage.js | 81 +++++++++++++++++++++++++++++++++ src/entities/player.js | 51 ++++++++++++++------- src/game.js | 28 ++++++++---- src/levels/level.js | 65 ++++++++++++++++++-------- 8 files changed, 223 insertions(+), 85 deletions(-) create mode 100644 res/mage.png create mode 100644 src/entities/mage.js diff --git a/res/aseprite/tilemap.aseprite b/res/aseprite/tilemap.aseprite index 532b1237c593cb3d1510a19fad32fbd8fe8ac98e..27ccf2b7cbb0ac7c6fba7f044eefe2b90cb0ebe6 100644 GIT binary patch delta 39 ucmdldy+WFM1up}`gQbiN3m6n8a?4IM^`7X!%c%hr{PmHAA!Xxyd0qhIu?tuL delta 65 zcmZ1>y-%8ZA1?#LgQbiN3m6zCa?3IcFbGUE^q=U!CT|Cn`1O&MA%%f~ffb0wfS6r@ M5lDi;#!h)&0O1!4!~g&Q diff --git a/res/mage.png b/res/mage.png new file mode 100644 index 0000000000000000000000000000000000000000..096382dc050f677b4bb1fa71d1614305f6002199 GIT binary patch literal 1087 zcmV-F1i<@=P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1Jp@GK~#8N?VHbv z6fqFSyBEADDEQ|A#G9*L^(guR9u&OmLwNB`^uC}6y^DC%v%6k>0RMo3UIfSaVhYmP zB$KM@ou2O052Q1LU+POzn@&1C{c5%9jCMKE1UPf<(xCERKfd(7xD}>~Kc{vV6F}1t zXfI#A?aH4&y%Tl9RPi-&iMhnz^Vefg1yl*Q0i**c$Bo*=l<_GR#g}>~b~%1B0kjPu zj^4j?|F|qAzLago&&~iq+JPX{Y3i6VehXw1K-+<M!Y=P*Wm4XIeW8b7%UIDC9zb^ZBw|LH#;AD!>6J^NO* z5X1cn0UsXSai0(N-*z`&>{T!1b|Jnm4&cTQ;l?NL1ln*C@skOl?Lg?UaDfg$3pn~Q ztpL zTHo+IM%yKD{BKMEZ6kno0K=nQE*k$Dt;RFZ_8F-0Uo``8&0wm*lmjr0aXTZ{Yms#3 z7z04wIny_RKGW!H{TI&y=srT3RC^Bw@tJz1|QoXdKzbgzf6(|K!Z=99M1;EGAOPAaEPKg5;b<8 zZ8y}^xcJ%-N002ovPDHLk FV1k@#^Be#G literal 0 HcmV?d00001 diff --git a/res/tilemap.min.js b/res/tilemap.min.js index a88b17a..73d63d8 100644 --- a/res/tilemap.min.js +++ b/res/tilemap.min.js @@ -2,45 +2,46 @@ * Tile map for caa-game * Index for tilemap file * - * 0. Corner top-left - * 1. normal top wall middle piece - * 2. Corner top -> left wall - * 3. Left wall - * 4. top wall before corner - * 5. corner top -> right wall - * 6. normal right wall piece - * 7. Corner right -> top - * 8. Corner right -> bottom - * 9. bottom wall piece before 8. - * 10. normal bottom wall piece - * 11. Corner bottom -> right - * 12. Corner right -> bottom - * 13. Corner bottom -> left - * 14. Bottom wall piece before 13. - * 15. Corner left -> bottom - * 32. Normal floor tile - * 17. +-shaped floor tile - * 18. Heavily cracked floor tile - * 19. Lightly cracked floor tile - * 20. Normal brick wall 1 - * 21. Normal brick wall 2 - * 22. Normal brick wall 3 - * 23. blood brick wall 1 - * 24. blood brick wall 2 - * 25. blood brick wall 3 - * 26. light vines brick wall 1 - * 27. light vines brick wall 2 - * 28. light vines brick wall 3 - * 29. heavy vines brick wall 1 - * 30. heavy vines brick wall 2 - * 31. heavy vines brick wall 3 - * 64. Chest closed - * 33. Chest opened - * 34. Rock 1 - * 35. Rock 2 - * 36. door - * 37. Ladder (should be over wall) - * 38. Torch - * 39. Staircase + * 0. Empty tile + * 1. Corner top-left + * 2. normal top wall middle piece + * 3. Corner top -> left wall + * 4. Left wall + * 5. top wall before corner + * 6. corner top -> right wall + * 7. normal right wall piece + * 8. Corner right -> top + * 9. Corner right -> bottom + * 10. bottom wall piece before 8. + * 12. normal bottom wall piece + * 12. Corner bottom -> right + * 13. Corner right -> bottom + * 14. Corner bottom -> left + * 16. Bottom wall piece before 13. + * 17. Corner left -> bottom + * 33. Normal floor tile + * 18. +-shaped floor tile + * 19. Heavily cracked floor tile + * 20. Lightly cracked floor tile + * 21. Normal brick wall 1 + * 22. Normal brick wall 2 + * 23. Normal brick wall 3 + * 24. blood brick wall 1 + * 25. blood brick wall 2 + * 26. blood brick wall 3 + * 27. light vines brick wall 1 + * 28. light vines brick wall 2 + * 29. light vines brick wall 3 + * 30. heavy vines brick wall 1 + * 31. heavy vines brick wall 2 + * 32. heavy vines brick wall 3 + * 65. Chest closed + * 34. Chest opened + * 35. Rock 1 + * 36. Rock 2 + * 37. door + * 38. Ladder (should be over wall) + * 39. Torch + * 40. Staircase ------------------------------------------------------------------- */ -module.exports=[{x:0,y:0,walkable:!1},{x:32,y:0,walkable:!1},{x:64,y:0,walkable:!1},{x:96,y:0,walkable:!1},{x:128,y:0,walkable:!1},{x:0,y:32,walkable:!1},{x:32,y:32,walkable:!1},{x:64,y:32,walkable:!1},{x:96,y:32,walkable:!1},{x:128,y:32,walkable:!1},{x:0,y:64,walkable:!1},{x:32,y:64,walkable:!1},{x:64,y:64,walkable:!1},{x:96,y:64,walkable:!1},{x:128,y:64,walkable:!1},{x:0,y:96,walkable:!1},{x:32,y:96,walkable:!0},{x:64,y:96,walkable:!0},{x:96,y:96,walkable:!0},{x:128,y:96,walkable:!0},{x:0,y:128,walkable:!1},{x:32,y:128,walkable:!1},{x:64,y:128,walkable:!1},{x:96,y:128,walkable:!1},{x:128,y:128,walkable:!1},{x:0,y:80,walkable:!1},{x:32,y:80,walkable:!1},{x:64,y:80,walkable:!1},{x:96,y:80,walkable:!1},{x:128,y:80,walkable:!1},{x:0,y:96,walkable:!1},{x:32,y:96,walkable:!1},{x:64,y:96,walkable:!1},{x:96,y:96,walkable:!1},{x:128,y:96,walkable:!1},{x:0,y:224,walkable:!1},{x:32,y:224,walkable:!1},{x:64,y:224,walkable:!1},{x:96,y:224,walkable:!1},{x:128,y:224,walkable:!1}]; \ No newline at end of file +module.exports=[{x:0,y:256,walkable:!1},{x:0,y:0,walkable:!1},{x:32,y:0,walkable:!1},{x:64,y:0,walkable:!1},{x:96,y:0,walkable:!1},{x:128,y:0,walkable:!1},{x:0,y:32,walkable:!1},{x:32,y:32,walkable:!1},{x:64,y:32,walkable:!1},{x:96,y:32,walkable:!1},{x:128,y:32,walkable:!1},{x:0,y:64,walkable:!1},{x:32,y:64,walkable:!1},{x:64,y:64,walkable:!1},{x:96,y:64,walkable:!1},{x:128,y:64,walkable:!1},{x:0,y:96,walkable:!1},{x:32,y:96,walkable:!0},{x:64,y:96,walkable:!0},{x:96,y:96,walkable:!0},{x:128,y:96,walkable:!0},{x:0,y:128,walkable:!1},{x:32,y:128,walkable:!1},{x:64,y:128,walkable:!1},{x:96,y:128,walkable:!1},{x:128,y:128,walkable:!1},{x:0,y:80,walkable:!1},{x:32,y:80,walkable:!1},{x:64,y:80,walkable:!1},{x:96,y:80,walkable:!1},{x:128,y:80,walkable:!1},{x:0,y:96,walkable:!1},{x:32,y:96,walkable:!1},{x:64,y:96,walkable:!1},{x:96,y:96,walkable:!1},{x:128,y:96,walkable:!1},{x:0,y:224,walkable:!1},{x:32,y:224,walkable:!1},{x:64,y:224,walkable:!1},{x:96,y:224,walkable:!1},{x:128,y:224,walkable:!1}]; \ No newline at end of file diff --git a/res/tilemap.png b/res/tilemap.png index fa12395886de3b83a5bd944a4c84c88333bf702c..2511fe0cc6151fc24bb492610bf13bc48b628961 100644 GIT binary patch literal 3689 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 literal 3660 zcma)9c|278_b1^|$(|UZ$x|f#TwL5-fAIlNTE*dL;Km(bX>QDgBg-ssaqZ_jZ*s;uIPY8jol0>#srJHG2@2vD zD-VveIcZf{^g>cyawAf+&Z$)K#hdUR^STvpasH?4VJ!)tztps2q9V$;z3ojyYLyPU zitp_c_jTPjk}Z7P?C?9a`?=G1iq)JGadPhDvF^`?7;=uD$9Ap$&SX~4GPzq5oxQb^ zM{DX%O+ET^4sAX%4v(B!3K0#%1M8J(QeW&tnkWtS_PtrLYhFruoK z{C#5{v*`&8yq~$M?>>GE3T;o3gUoN>dZTvl@iW>Lqa%O+z065b73!y}sD?8sj6H(q zih85cjHpw+D~?!h0deV*qVq7B-@e{MQjMkngOmJ;y9xUrCI4^MCKPU#0ZCH_VKXaV z@zlN3#wWw@@3PgCvO-Bn+3ygcD(?jA$gS<*MGDlINAzUhzOrX2))yTw`8?!PxN?nO z2DlVHa5r#URB1y(kz|&x8|$?!ezJ_su9mpu%^i40SA+u#TFm+}Q+Oz<@`a>6vE06h z`q{M=PuO3^Fy|3H`dvoY5pUe?2LtffrBhVpBr$qre#7Ds;QtGs53H1ZeQ5|!56M1i z&p*I=0VLhP-M4Djw_>5^ZZlV#Z@#qUWweXe*CQ)|Qe)#d zNjM8cJY@S%uAUrn?BI=@o>;)Kv@^fLwck#)a8-9lo2WITIugLnQpSeL#^3xj&h!y- z8SA)}zS{OMe@C?NR^EX>;tB>_HgOANRPMjV41f-7&%+!XhiH3~?8kRr3E@A6A6ncz zirogYRD8vgZm{JI&nN6~J^_LLv`db#6mABH0Ui8*?4WFR$%%}suRb_0^E)hZDDw0# zc;#ulI*>p11~8#V{Yv5s-)+^`pMS$q$#eQoqdj<`vKfL?-pF#_AkxI->l+B^2o(CH zblh5nsJgSs!a$)v)`mRxwvw3ZH%v{we(jq~i2FDm0GCoE9-__2JzGE(xXrX1r(6c< zw!LdZGKiU2wPbBzyX~|hJl8gUht~1p9;tLKrax-;g()UC%7L1I>{Neq)Xyoz%A|tQ za|MX)g8RGPaNJUh;tBAF>JR}_kJ?F=LmW7Ad_faPwPXclWP@Iv{WJ`LLTkRAdWdBW?_3T1icbXtm%W2fRgEmZ-{n7m*W4^&+c z2BG!}lNC;yFt5NpD`y1u76D`qaU;#Hua*}is|D1@>gLab%rxyU3*FU8?hG)coat&~ z$)ZGIM1g+)SC9REV|#V(Vcak++Imp({GuRG1^dFckX>(by#v>Zi9wSxklptMsc_Sr z5}*CC$)E-*dDiui?UN!RX^yYM{-JXS?Jog#I@@^ILvK2VB$*ozVTXE$MiRrf9A^Ry z zoYM8i0A8wxxUW06h;rD^x@W!NF}|n65&bM6Esc|ghl>vqax|Q-LK@BP}J`4DyWYV9BDPP3ha>RLzf>tWGd9tUm_g$|I#5EoIfReNEnj{=ey zuoGmhUBlvxBAEjsX=fkpuQN4)-&@iX5y^omip;#x8MC}y_ttolQAI%wtRx`96{4niRG&9@r=5VyW|Ji#m@3=GDY z94SrruM>Ww^;K%nnwu@L_Bp9wfn7&hDfcv+Iaeq847OpUIDB=FNpxM!Yhl9bKK78= z1{Q){OkIC=D6-f(d?P1cT`wmSSXM*)lDy)elP>u-#Zp-_gQ0TX%hyAOazKyRkwL?e zl%deV0u61}MC^zYB3ZRwrdp*l_c9{6CmKZNlyn4sLH!FAz42jGbAz(;s#J_E1soGWw zi=<((UmuP6Dwp?fYy?xk4RTnNt(yLjrqxG0hBKQo#A85fN=%f{M@k%gDd9F`h^%o6i0LFwA;oTwK#Oo8HJ`uVal`S=tkm_$E~-6g>$CP~!uZU8C`~ zJIUdeS0p-*BmVMfh=|8SEON;8`GSCW7G#7POfYo={go&ks(&~t{_?%-#5p8P4D1nU zJh^6156<0gfb$z;7w_R#gTiMZ^u$d6m{OQazkr)A1SH`{#Df%Cfc)Aw{l$>`)B1jX zQi>0kHBDO){?pOYC8EeG`DA_t<}Fv$@ku?2Oqp&}f$!->UhzU?i_5Rch8GInR1u7e z1}lZMT|-f=zlm99G-nCXaLssI+Ku}cSx?`XVN)b?4Jiztgt$w&K~@gEd^^5Jk9Tkpfmo$HL5{7~jxecVUG1RQ@OvAX+ZExVaNfWi7UsSeeW=brH~ zn#@@R7Hrfk@{DtQpL&tQJVQR-mDS5r#|oBpqZdcZ1xRvj(QehVp-RAPZS{T^vsW@x zBdRC5jVVyaK&ugzp!sHcEc{m{PDmMl#7{YP4CPL+lM%xT+KL;ptmgDl0qjj?Xm)P~ zJqMhLFSwsJy7ur7o*G=RCZlz8c4y|0+eXqpWS8dk4#q)JvR;ked8^(#pMInxp>yl@ zb@pb~CyJ`Z%{~XpZh*tUgS`VIYOu>0(TBS>KRH~Hx;j*hSGUE$iH!vU0F52{=Iv>( zI(<}Fsv~=Bs%Au(3dO1&6_!T|bKOQt5Lf2<@4f4dCNnPq8hl*0zs&Z$%Bb{u75|Bm z1}hU2Yi-8Z#gweakzPybfSL@qGpP|MxflNBfqFL)U7UH*9d! zQy$7&aw!1KO12&RRjFQ3&BEzR-thK<)GGs}$_j3MbCdO^CPdV?dq0}bc62F|Nka!j zHrx9gW5_x|I1jLuChED^sNT-KwoUpFtirGF@!4rMf|^|1Sa^#(?AJut+&-KpP)q(> zZg10?r{P?#E}pjlJYtfozFY&AnUz%9FQKx#!)U%2dtS~an$n|+^-CQn=rKjGP6Q8P zVlKrL=sPsBYN6AUV)yKFR~Phd^}$>c3sOA_*iM-KOl4$Rtwd`Ey^&0_U9AJ<=V`PS zOnh#57#rUwCi*_Yjs65DUd2x!(@KFZ+8tFUp<(fla`B;!A!ZmTcV9jEVpJ(LWi8}g peSt6pI8P{9J5taHfW%G2X)&Q&Q}fgDz~4iz^QM2B;EY`!{0H9j2+jZi diff --git a/src/entities/mage.js b/src/entities/mage.js new file mode 100644 index 0000000..36e628d --- /dev/null +++ b/src/entities/mage.js @@ -0,0 +1,81 @@ +var asdf = require("asdf-games"); +// eslint-disable-next-line no-unused-vars +const { Texture, TileSprite, AnimManager, wallslide, entity } = asdf; + +var texture = new Texture("./res/mage.png"); + +const states = { + idle: 0, + attack: 1, + evade: 2 +}; + +class Mage extends TileSprite { + constructor(pos, player, level) { + super(texture, 16, 16); + this.pos = pos; + this.scale = { x: 3, y: 3 }; + + this.anims = new AnimManager(this); + // North + this.anims.add("move_n", [4, 5, 6, 7].map(x => ({ x, y: 0 })), 0.1); + // East + this.anims.add("move_e", [0, 1, 2, 3].map(x => ({ x, y: 1 })), 0.1); + // South + this.anims.add("move_s", [0, 1, 2, 3].map(x => ({ x, y: 0 })), 0.1); + // West + this.anims.add("move_w", [4, 5, 6, 7].map(x => ({ x, y: 1 })), 0.1); + // Inactive + this.anims.add("idle", [{ x: 0, y: 2 }], 0.1); + + this.anims.play("idle"); + + this.state = states.idle; + + this.level = level; + this.player = player; + + this.hitBox = { + x: 4, + y: 1, + w: 8, + h: 14 + }; + } + + update(dt) { + super.update(dt); + + if (this.state != states.idle) { + // Move + + const angle = entity.angle(this.player, this); + const xo = Math.cos(angle) * 100 * dt; + const yo = Math.sin(angle) * 100 * dt; + const r = wallslide.wallslide(this, this.level, xo, yo); + + this.pos.x += r.x; + this.pos.y += r.y; + + if (Math.abs(r.x) > Math.abs(r.y)) { + // Animation x axis + if (r.x >= 0) { + this.anims.play("move_e"); + } else { + this.anims.play("move_w"); + } + } else { + // Animation y axis + if (r.y >= 0) { + this.anims.play("move_s"); + } else { + this.anims.play("move_n"); + } + } + } else { + this.anims.play("idle"); + } + } +} + +module.exports = Mage; \ No newline at end of file diff --git a/src/entities/player.js b/src/entities/player.js index e906dca..7bc2a69 100644 --- a/src/entities/player.js +++ b/src/entities/player.js @@ -4,17 +4,22 @@ const { Texture, TileSprite, AnimManager, wallslide } = asdf; var texture = new Texture("./res/player.png"); class Player extends TileSprite { - constructor(keys, window, level) { + constructor(keys, window) { super(texture, 24, 24); this.scale = { x: 2, y: 2 }; - this.window = window; + this.keys = keys; this.rate = { walking: 0.2, running: 0.1 }; + this.speed = { + walking: 75, + running: 150 + }; + this.anims = new AnimManager(this); // North this.anims.add("walk_n", [0, 1, 2, 3].map(x => ({ x, y: 0 })), this.rate.walking); @@ -31,12 +36,11 @@ class Player extends TileSprite { this.anims.play("walk_s"); - this.pos.x = (level.w / 2) - (24 * this.scale.x / 2); - this.pos.y = (level.h / 2) - (24 * this.scale.y / 2); - - this.level = level; - - this.keys = keys; + this.lives = 5; + this.stamina = { + current: 5, + max: 5 + }; this.hitBox = { x: 4, @@ -52,30 +56,45 @@ class Player extends TileSprite { // Animate if (this.keys.x == -1) { // Left - (this.keys.action) ? + (this.keys.action && !(this.stamina.current <= 0)) ? this.anims.play("run_w") : this.anims.play("walk_w"); } else if (this.keys.x == 1) { // Right - (this.keys.action) ? + (this.keys.action && !(this.stamina.current <= 0)) ? this.anims.play("run_e") : this.anims.play("walk_e"); } else if (this.keys.y == -1) { // Up - (this.keys.action) ? + (this.keys.action && !(this.stamina.current <= 0)) ? this.anims.play("run_n") : this.anims.play("walk_n"); } else if (this.keys.y == 1) { // Down - (this.keys.action) ? + (this.keys.action && !(this.stamina.current <= 0)) ? this.anims.play("run_s") : this.anims.play("walk_s"); } else { // Idle this.anims.stop(); } + // Lose stamina + if (this.keys.action) { + if (!(this.stamina.current <= 0)) { + this.stamina.current -= dt; + } else { + this.stamina.current = 0; + } + } else { + if (!(this.stamina.current >= this.stamina.max)) { + this.stamina.current += dt; + } else { + this.stamina.current = this.stamina.max; + } + } + // Speed - const xo = this.keys.x * dt * (600 * (1 - (this.keys.action) ? - this.rate.running : this.rate.walking )); - const yo = this.keys.y * dt * (600 * (1 - (this.keys.action) ? - this.rate.running : this.rate.walking )); + const xo = this.keys.x * ((this.keys.action && !(this.stamina.current <= 0)) ? + this.speed.running : this.speed.walking) * dt; + const yo = this.keys.y * ((this.keys.action && !(this.stamina.current <= 0)) ? + this.speed.running : this.speed.walking) * dt; // Move const r = wallslide.wallslide(this, this.level, xo, yo); diff --git a/src/game.js b/src/game.js index 9c6c107..ca0d4d1 100644 --- a/src/game.js +++ b/src/game.js @@ -1,6 +1,7 @@ const { ipcRenderer, remote } = require("electron"); var asdf = require("asdf-games"); +// eslint-disable-next-line no-unused-vars const { Game, KeyControls, MouseControls, Camera, Lighting } = asdf; const window = { w: 640, h: 320 }; @@ -16,21 +17,28 @@ var Level = require("./src/levels/level.js"); const mouseAim = new MouseControls(document.getElementById("board")); const keys = new KeyControls(); -var level = new Level(); -var player = new Player(keys, window, level); -var lightsources = [ - { x: 100, y: 100 }, - { x: 300, y: 100 }, - { x: 500, y: 100 }, - { x: 500, y: 300 } -]; -var lighting = new Lighting(level.x, level.y, level.w, level.h, lightsources); +// var lightsources = [ +// { x: 100, y: 50 }, +// { x: 100, y: 300 }, +// { x: 300, y: 50 }, +// { x: 300, y: 300 }, +// { x: 100, y: 500 }, +// { x: 500, y: 100 } +// ]; +// var lighting = new Lighting(level.x, level.y, level.w, level.h, lightsources); + + +var player = new Player(keys, window); +var level = new Level(player); +player.pos = level.startPos; +player.level = level; + const camera = new Camera(player, window, { w: level.w * 2, h: level.h * 2 }); scene.add(camera); camera.add(level); camera.add(player); -camera.add(lighting); +// camera.add(lighting); game.run(() => { if (mouseAim.isDown) { diff --git a/src/levels/level.js b/src/levels/level.js index 167d2e7..7a21b7f 100644 --- a/src/levels/level.js +++ b/src/levels/level.js @@ -1,28 +1,30 @@ var asdf = require("asdf-games"); -const { Texture, TileMap } = asdf; +// eslint-disable-next-line no-unused-vars +const { Texture, TileMap, entity } = asdf; const texture = new Texture("./res/tilemap.png"); const tiles = require("../../res/tilemap.min.js"); - const tileSize = 32; +const Mage = require("../entities/mage.js"); + const levelSize = { w: 960, h: 480 }; var levelData = [ - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 5, - 3, 20, 21, 22, 20, 21, 22, 20, 21, 22, 20, 21, 22, 20, 21, 22, 20, 21, 22, 20, 21, 22, 20, 21, 22, 20, 21, 22, 20, 6, - 3, 16, 16, 16, 16, 20, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 20, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 20, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 3, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 6, - 13, 14, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 9, 8 + 1, 2, 2, 2, 2, 6, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 6, + 4, 21, 22, 23, 21, 7, 0, 4, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 22, 23, 21, 7, + 4, 17, 17, 17, 17, 7, 0, 4, 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, 7, 0, 4, 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, 8, 2, 3, 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, 22, 22, 22, 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, + 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, + 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, 15, 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, 9 ]; var levelTiles = levelData.map(function(e) { @@ -30,12 +32,39 @@ var levelTiles = levelData.map(function(e) { }); class Level extends TileMap { - constructor () { + constructor (player) { super(levelTiles, levelSize.w / tileSize, levelSize.h / tileSize, tileSize, tileSize, texture); this.pos = { x: 0, y: 0 }; + this.startPos = { x: 48, y: 64 }; this.scale = { x: 1, y: 1 }; this.w = levelSize.w; this.h = levelSize.h; + + this.player = player; + + this.mages = [ + new Mage({ x: 8 * tileSize, y: 2 * tileSize }, this.player, this), + new Mage({ x: 1 * tileSize, y: 8 * tileSize }, this.player, this) + ]; + + for (let index = 0; index < this.mages.length; index++) { + this.children.push(this.mages[index]); + } + + } + + update(dt) { + super.update(dt); + if (this.player) { + for (let index = 0; index < this.mages.length; index++) { + const mage = this.mages[index]; + if (entity.distance(this.player, mage) < 100) { + mage.state = 1; + } else { + mage.state = 0; + } + } + } } }