From 94e03b3f3c73199f81f5b6797665c332c968f648 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Wed, 14 Jun 2023 23:22:26 -0400 Subject: [PATCH] dots and new sprites --- client/css/main.css | 12 +- client/img/dot.png | Bin 0 -> 4363 bytes client/img/pac.png | Bin 0 -> 4583 bytes client/img/wall_cross.png | Bin 0 -> 4544 bytes client/img/wall_dot.png | Bin 0 -> 4530 bytes .../{static/empty.png => img/wall_empty.png} | Bin client/img/wall_end.png | Bin 0 -> 4413 bytes client/img/wall_straight.png | Bin 0 -> 4350 bytes client/img/wall_tee.png | Bin 0 -> 4440 bytes client/img/wall_turn.png | Bin 0 -> 4458 bytes client/index.html | 2 + client/js/gfx/graphics.js | 123 ++++++++++++------ client/js/gfx/map.js | 86 ++++++++---- client/js/gfx/sprite.js | 7 + client/js/input.js | 9 +- client/js/logic.js | 78 ++++++++--- client/static/cross.png | Bin 718 -> 0 bytes client/static/dot.png | Bin 699 -> 0 bytes client/static/tee.png | Bin 687 -> 0 bytes client/static/turn.png | Bin 687 -> 0 bytes client/static/tux.png | Bin 14000 -> 0 bytes client/static/wall.png | Bin 668 -> 0 bytes client/static/wall_end.png | Bin 658 -> 0 bytes 23 files changed, 236 insertions(+), 81 deletions(-) create mode 100644 client/img/dot.png create mode 100644 client/img/pac.png create mode 100644 client/img/wall_cross.png create mode 100644 client/img/wall_dot.png rename client/{static/empty.png => img/wall_empty.png} (100%) create mode 100644 client/img/wall_end.png create mode 100644 client/img/wall_straight.png create mode 100644 client/img/wall_tee.png create mode 100644 client/img/wall_turn.png delete mode 100644 client/static/cross.png delete mode 100644 client/static/dot.png delete mode 100644 client/static/tee.png delete mode 100644 client/static/turn.png delete mode 100644 client/static/tux.png delete mode 100644 client/static/wall.png delete mode 100644 client/static/wall_end.png diff --git a/client/css/main.css b/client/css/main.css index bfb7426..d1d97e8 100644 --- a/client/css/main.css +++ b/client/css/main.css @@ -39,7 +39,7 @@ body { .sprite { position: absolute; - transition: left .1s, top .1s; + /* transition: left .1s, top .1s; */ z-index: 2; } @@ -72,3 +72,13 @@ input { margin-bottom: .215rem; } +#fps { + position: absolute; + left: 0; + top: 0; + z-index: 99; + font-size: 20; + font-style: monospace; + background-color: black; + color: white; +} diff --git a/client/img/dot.png b/client/img/dot.png new file mode 100644 index 0000000000000000000000000000000000000000..b911cea429dfa1861d9dcce1ff2a8f1333d115d7 GIT binary patch literal 4363 zcmeHLYj6|S6_y_u5OxX)V3L@0D@>>%t9@wo+FG`SB(QJ<#t&pVV7k&?$%`eeEUhic z0b=utOTaG1jCnYuOz_~8SKLkmLu(o+9#d0~DRpsyCgb8Hja>+kw2D`rW>`7)a zo@xGBn$_-}d(L;x`R=)A?$u9omoH6{zaW>%WJ%U+a~`};5w9r;@b}{P&b9qYd)KFJ zYT6alU;U!;+2#JpLSbz`%RiPyROB4|L#|FrZsQEOw?WdA-ZrF~uguN8%p<96uSma~7gSW-%7?a2K>kNgC^uWplZ&-T>z_LY8A_f>0A zxxeh%U(Od!kI&3nv$kpG+9MaA%-=Sfcq!#!|A%cIAO5K7SmUg&!J3!@zJu?Y*IZ)l z+pa7+d*uz|y*Z6DFYkM%gRD()3$TZ@zc9KHxl|c zI*QYlExfP4ztx(Yx`{n|`~Hjln=hwa{dkIr(5$V^)2pJ%`XNTx#e)m}|u=Vkj; zxqfzTb;2M1z2))wyS@{TdX6;Ctc`mMtNoIYZ>^|a(p7e@Ztl^t*!Z`r7qxwIs;Bz; zimRn48i@ZFAD7&V+CGX?hN=!PFp=}^@~aVAP(T>dtSoivSw&`sJUvW9 z051?2B<%J0f^^uRkZ@`EEQ&D&BB=op-@N}QYra>8zc03J%*DQNup2#4Muzd6GnZ(c_KsAWM^^~kJv56y6I->)D<|DXcw1;z-l%bZ*Mw@wOxfq_+Y*2{)X_j|#EG<2%bSf3e z5E@jYA+;!_bup-(B-JQM0oLIFdXmD`qoAz5puqT?K!k$eN)F-x3g9@QB2Y%f0+iAa zYE;iK1gga;763w}(lVM+5Gw*4tV+f+Iw}#0g;0968UT{jp?ZoWP>Q7pR0q@|l$zD* zbSl!Rp(H5QNiX38UItDl=Vjag^ZVS=fJiuP%(WU6q!NEB$@MUT3mO;{uX4Wf@Y8_; z&I|GdMr4!F=rmd#rPJd&iqsKNM-tvD5D3Cb6fp^0sfvz>(?Y{!AhC>Crw~Abg}KnC z0AK_@P{8vZgF=KrM9Yz38(dB-BQR!001y->RWz=l395k5(oNsmr>HW!5cBa$e(qVhpm^ey`8;iRR6Akw0s8D}(wAX5QYDNcwL9ded1J~x2f zW2jt*<=i)v0_C8b4C&IKDy_o>tBFvdjLxA&82}t4!>V;^z>Gx?@-8971c1>Ed4ycS z@|3tjeke^;+F0#S2@q!i5{BX$^y`FSLkVMI<`)9s3$5>5{^zCIjuFGT6LeFT_Tg z;SgtH+xZSZLv!&RdVtUqPR7OW1YHw!jf;VCDNj__1YP4|U|h-*)%Aa)OaAmY1$=N9 z6oQAPlaJbPc+g64akFTzekK_zxvgen!JI#Dt7}c#nw1#e zVUN4M_ukaPD<7RU>Qn6({yF8ds>bcIrBxTR5AK{_s+IM~H&pH3GpS_8ebb3S`<=l< z0|N^O8*VMLAFbynf1db3QTQ->_|D(okI9L70gqdBulxAGkAK^hE<5#l-n23^eFnOe OSuM-WCl~)@^Zx+)h9#r` literal 0 HcmV?d00001 diff --git a/client/img/pac.png b/client/img/pac.png new file mode 100644 index 0000000000000000000000000000000000000000..7dc0989d85f3bfe59bb8116e86c2473634bfdbe6 GIT binary patch literal 4583 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 literal 0 HcmV?d00001 diff --git a/client/static/empty.png b/client/img/wall_empty.png similarity index 100% rename from client/static/empty.png rename to client/img/wall_empty.png diff --git a/client/img/wall_end.png b/client/img/wall_end.png new file mode 100644 index 0000000000000000000000000000000000000000..752f73b8253b0da4a46ec4439afcd51a476a0b23 GIT binary patch literal 4413 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 Q!Xyzx#&UgQT1oAH05`Kjr2qf` literal 0 HcmV?d00001 diff --git a/client/img/wall_straight.png b/client/img/wall_straight.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc5448913b6a57d0de97f4859d630b020b37ff1 GIT binary patch literal 4350 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 literal 0 HcmV?d00001 diff --git a/client/img/wall_turn.png b/client/img/wall_turn.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe5837306514b32f773005055966b569c655773 GIT binary patch literal 4458 zcmeHKdr%bj9bY6u!`lQ&M6H{Jv})Pgy}Lbb@8*u@@r;KQ5K+Ohx4U<2y}Lc`7Vbc- z5uAu2jYy~^4kW=SiA9l=(D)3Yh-k(%>ZCrH)ORcOfmZ2=HZlF}@(?DO=`hp$$Ia~R z?)UNeeZQaY_xGLOZqCd|3G@s1gCHm{E!B_(?yz|M#0UJl%FBnq?M``4o{&YkVTY49 zb5<4>${Z}rdN?x#dHR3*%N6!sIN+Nbq54X7*n&+_OK%2V{MV((hMl`}c1K)c1I#$L zetp-Ob6#9s)VbWlp)*c?u`8m8Xm8whB4cgBj*Z`Rf6xlQ7rHv-W=DHf%E_&3^Z)Gn z&PsR>R^Kle&=3Fp1a>;J|88<~T-n!4R?VwUUfg^<`P0{ST-_V<&Y$)U84mrP`(2&? z@+wvH%9;p!LazMFJ0Xu(_I{aM7BGaEV?OaCPPFZLruEl}yMFpgXU_|HxjpSylIy6B z`@`WCFGt25=u2v9qny!-@P^l|mSFYjM)cThig(JSG|Nuu=^K1By@EzcFp-zu2xy>Fl! zN@)0O&&en{qpog%{B-cjwOa-CmXer$MhS=f5? z#?fm(E2tgbdh7K*zR_RiuTxrEvL76!Odp*(mOi&*$L?86pHIm#eo*n!wU0h8tLeyX z`{O_KkNm4N>)5w%5h=BwA=}{ijg^bj7xpCA=Qf4-%va0q`;g=_ z$NcJ#T)gtPBX^E`ySC-RrC=!9d1+mR2lQc}hXak6XI!GCd7F%4coQr0*c?CuLAqFv zgQC~40&HR}oL!IHJ=BH39HU2;tBknOk;oQtspU>KyF4R@E?+}y7$i2vPv_AB02?b% zu*YV#yR;rXBH?Pmvna+8STYgT=#e~QCY;DSS(uO!G8|3vaHR?)#t+sx8M8LakURy|sSB(spR{C3nlW?SL!`jM*&LD=AbXOf zz?q+tH7PbxBc(Gj5a2$JJIQ)1cgYx78I4*4PnU?{r5W^yxW1O*X^zoKj}(oQ3QEnO zDutXu2})x^HLOO7DoB%@!cBOzf;CToO0&BJ%1*N)6abfT0EeJRjgnN7sG3%&Q36*f zP?EwaRBcw72qmu3kV@4Ah^0;rbR}h-7?lXc04OS2O{mN`i!vrgg%V1_jFKdwL2)&$ zCRxg4B4~{S#n9Sh-f5#iIXN3;VKIl@A}K_|wegv0dPE_^pGq>Vlwbx9dSnS_FY!E8 zsl}tUaw10#{#9C)9K{JOKEa-6 zICI(mvKBWFtQ#qLD(3?0mr0_L9hJ=%kGze%S~+Pe!LYO`v=lv(f{Q9;87WSHHKL-6 zD7%FP(_^$<$K>1(v;wXm2(yM(p>k!k1|>|i8r8^6psyHESB;V(NRpk5?&8gYn{u-8 z7QiFm3bd!h6}(U?)S}7O?jlyK0w4^r9)lkEgcVl!Edx z!nd*B^Ecel8Izfq=e?V}4sQDAAS9#&RD0LX?@ql-yc*Q-qR)%%72iE+l7$sJok3?p zh95onxe+b2SQcF8F86I&K*$@as_5$LmBH`EX8twKYxRcaWkGLf3%~MuKdA7fdVY67 zM(w;AJHw(PH$iQRxd+}1xjg&56{+~FRd1hK9NBRG!i71f
+
@@ -15,6 +16,7 @@
+ diff --git a/client/js/gfx/graphics.js b/client/js/gfx/graphics.js index e73927e..31565a8 100644 --- a/client/js/gfx/graphics.js +++ b/client/js/gfx/graphics.js @@ -1,56 +1,105 @@ import { Sprite } from './sprite.js' -import { Rotation } from '../logic.js' +import { ItemType, Rotation } from '../logic.js' +const draw_players = (data, players, sprites) => { + for (let id of players) { + let pos = data.players[id].pos + sprites[id].move(pos[0], pos[1]) + switch (data.players[id].move_rot) { + case Rotation.NORTH: + sprites[id].rotate(270) + break + case Rotation.EAST: + sprites[id].rotate(0) + break + case Rotation.SOUTH: + sprites[id].rotate(90) + break + case Rotation.WEST: + sprites[id].rotate(180) + break + } + } +} + +const update_player_sprites = (data, players, sprites) => { + for (const sprite of sprites) { + if (sprite !== undefined) { + sprite.destroy() + } + } + + let new_sprites = Array(players) + new_sprites.fill(undefined) + + for (let id of players) { + let sprite = new Sprite("/img/pac.png", data.map) + sprite.layer(3) + sprite.resize(1,1) + sprite.show() + new_sprites[id] = sprite + } + + return new_sprites +} + +const create_map_dot = (data, x, y) => { + let dot = new Sprite("/img/dot.png", data.map) + dot.move(x, y) + dot.resize(.2,.2) + dot.show() + return dot +} + +const update_item_sprites = (data) => { + + let item_sprites = {} + + for (let item_key in data.map.items) { + let item = data.map.items[item_key] + switch (item.type) { + case ItemType.DOT: + item_sprites[item_key] = create_map_dot(data, item.pos[0], item.pos[1]) + break; + } + } + + return item_sprites +} + export const startGraphicsUpdater = () => { - let sprites = [] + let player_sprites = [] + let item_sprites = {} /** * @type {(data: import("../logic.js").GameState) => void} */ return (data) => { - if (!data.started) return + if (!data.map || !data.map.visible) return let players = Object.keys(data.players).filter(k => data.players[k] !== undefined) - if (sprites.length !== players.length) { - - for (const sprite of sprites) { - if (sprite !== undefined) { - sprite.destroy() - } - } - - sprites = Array(players) - sprites.fill(undefined) - - for (let id of players) { - let sprite = new Sprite("/static/tux.png", data.map) - sprite.show() - sprite.resize(1.5,1.5) - sprites[id] = sprite - } + if (player_sprites.length !== players.length) { + player_sprites = update_player_sprites(data, players, player_sprites) + console.log("updating player sprites") } - for (let id of players) { - let pos = data.players[id].pos - sprites[id].move(pos[0], pos[1]) - switch (data.players[id].move_rot) { - case Rotation.NORTH: - sprites[id].rotate(270) - break - case Rotation.EAST: - sprites[id].rotate(0) - break - case Rotation.SOUTH: - sprites[id].rotate(90) - break - case Rotation.WEST: - sprites[id].rotate(180) - break - } + for (let item_key of data.items_eaten) { + if (!(item_sprites[item_key])) continue + item_sprites[item_key].destroy() + delete item_sprites[item_key] + delete data.items_eaten[item_key] } + + if (Object.keys(item_sprites).length !== Object.keys(data.map.items).length) { + item_sprites = update_item_sprites(data) + console.log("updating item sprites") + } + + draw_players(data, players, player_sprites) + } } diff --git a/client/js/gfx/map.js b/client/js/gfx/map.js index 0ba7f9c..e629b17 100644 --- a/client/js/gfx/map.js +++ b/client/js/gfx/map.js @@ -1,3 +1,5 @@ +import { ItemType, get_item_key } from "../logic.js"; + const gen_style = (map, style) => { const css = ` * { @@ -63,71 +65,71 @@ const place_tile = (container, type) => { let image_src, class_name; switch(type) { case Direction.EMPTY: - image_src = "/static/empty.png" + image_src = "/img/wall_empty.png" class_name = "" break case Direction.WALL_HZ: - image_src = "/static/wall.png" + image_src = "/img/wall_straight.png" class_name = "" break case Direction.WALL_VT: - image_src = "/static/wall.png" + image_src = "/img/wall_straight.png" class_name = "rotate90" break case Direction.TURN_Q1: - image_src = "/static/turn.png" + image_src = "/img/wall_turn.png" class_name = "" break case Direction.TURN_Q2: - image_src = "/static/turn.png" + image_src = "/img/wall_turn.png" class_name = "rotate270" break case Direction.TURN_Q3: - image_src = "/static/turn.png" + image_src = "/img/wall_turn.png" class_name = "rotate180" break case Direction.TURN_Q4: - image_src = "/static/turn.png" + image_src = "/img/wall_turn.png" class_name = "rotate90" break case Direction.TEE_NORTH: - image_src = "/static/tee.png" + image_src = "/img/wall_tee.png" class_name = "rotate180" break case Direction.TEE_EAST: - image_src = "/static/tee.png" + image_src = "/img/wall_tee.png" class_name = "rotate270" break case Direction.TEE_SOUTH: - image_src = "/static/tee.png" + image_src = "/img/wall_tee.png" class_name = "" break case Direction.TEE_WEST: - image_src = "/static/tee.png" + image_src = "/img/wall_tee.png" class_name = "rotate90" break case Direction.CROSS: - image_src = "/static/cross.png" + image_src = "/img/wall_cross.png" class_name = "" break case Direction.DOT: - image_src = "/static/dot.png" + image_src = "/img/wall_dot.png" class_name = "" break case Direction.WALL_END_NORTH: - image_src = "/static/wall_end.png" + image_src = "/img/wall_end.png" class_name = "" break; case Direction.WALL_END_EAST: - image_src = "/static/wall_end.png" + image_src = "/img/wall_end.png" class_name = "rotate90" break; case Direction.WALL_END_SOUTH: - image_src = "/static/wall_end.png" + image_src = "/img/wall_end.png" class_name = "rotate180" break; case Direction.WALL_END_WEST: - image_src = "/static/wall_end.png" + image_src = "/img/wall_end.png" class_name = "rotate270" break; } @@ -152,11 +154,11 @@ const gen_walls = (width, height, data) => { for (let y = 0; y < height; y++) { for (let x = 0; x < width; x++) { - let north = get_point(width, height, data, x, y-1) - let south = get_point(width, height, data, x, y+1) - let east = get_point(width, height, data, x+1, y) - let west = get_point(width, height, data, x-1, y) - let current = get_point(width, height, data, x, y) + let north = get_point(width, height, data, x, y-1) == 1 + let south = get_point(width, height, data, x, y+1) == 1 + let east = get_point(width, height, data, x+1, y) == 1 + let west = get_point(width, height, data, x-1, y) == 1 + let current = get_point(width, height, data, x, y) == 1 let point = Direction.EMPTY @@ -213,11 +215,45 @@ const gen_map = (map, container) => { place_tile(container, map.walls[y * map.width + x]) } } +} +const gen_items = (map) => { + + let width = map.width + let height = map.height + + let items = {} + + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + let tile = get_point(width, height, map.data, x, y) + if (tile != 0) continue + + let item_key = get_item_key(x, y, width) + items[item_key] = {type: ItemType.DOT, pos: [x, y]} + + let tile_south = get_point(width, height, map.data, x, y + 1) + if (tile_south == 0) { + item_key = get_item_key(x, y + .5, width) + items[item_key] = {type: ItemType.DOT, pos: [x, y + .5]} + } + + let tile_east = get_point(width, height, map.data, x + 1, y) + if (tile_east == 0) { + item_key = get_item_key(x + .5, y, width) + items[item_key] = {type: ItemType.DOT, pos: [x + .5, y]} + } + } + } + + return items } export class Map { + static data + static walls + constructor(width, height, data) { let last = document.getElementById("container") @@ -227,6 +263,8 @@ export class Map { this.height = height this.data = data this.walls = gen_walls(width, height, data) + this.items = gen_items(this) + this.visible = false } @@ -250,6 +288,8 @@ export class Map { } gen_style(this, style) + + this.visible = true } hide() { @@ -257,5 +297,7 @@ export class Map { if (container) container.remove() let style = document.getElementById("style") if (style) style.remove() + + this.visible = false } } diff --git a/client/js/gfx/sprite.js b/client/js/gfx/sprite.js index 1ed8136..b793d89 100644 --- a/client/js/gfx/sprite.js +++ b/client/js/gfx/sprite.js @@ -11,6 +11,7 @@ export class Sprite { this.y = 0 this.w = 1 this.h = 1 + this.z = 1 this.d = 0 this.hide() } @@ -26,6 +27,7 @@ export class Sprite { this.element.style.left = `${left}%` this.element.style.top = `${top}%` this.element.style.transform = `rotate(${this.d}deg)` + this.element.style.zIndex = `${this.z}` } move(x, y) { @@ -40,6 +42,11 @@ export class Sprite { this.#update_pos() } + layer(z) { + this.z = z + this.#update_pos() + } + rotate(d) { this.d = d this.#update_pos() diff --git a/client/js/input.js b/client/js/input.js index abe64bb..3928e91 100644 --- a/client/js/input.js +++ b/client/js/input.js @@ -31,7 +31,14 @@ export function startInputListener() { if (ev.code === "KeyB") { debug_enabled = !debug_enabled if (debug_enabled) { - debug_style.innerHTML = "* {box-shadow: 0 0 3px red inset;}" + debug_style.innerHTML = ` \ + #container img { \ + box-shadow: 0 0 1px red inset; \ + } \ + #container .sprite { \ + box-shadow: 0 0 1px white inset; \ + } \ + ` } else { debug_style.innerHTML = "" } diff --git a/client/js/logic.js b/client/js/logic.js index 405366c..e869c56 100644 --- a/client/js/logic.js +++ b/client/js/logic.js @@ -18,10 +18,14 @@ export const Rotation = { WEST: 4 } +export const ItemType = { + DOT: 1 +} + /** * @typedef {[number, number]} Vec2 * - * @typedef {{[key: number]: Key} InputMap + * @typedef {{[key: number]: Key}} InputMap * * @typedef {{pos: Vec2, move_rot: Rotation, input_rot: Rotation, name?: string}} Player * @typedef {{start: boolean, key: Key, name?: string}} PlayerInput @@ -31,11 +35,14 @@ export const Rotation = { * * @typedef {{width: number, height: number, data: number[]}} Map * + * @typedef {{type: ItemType, pos: Vec2}} Item + * * @typedef {{ * started: boolean, * input: InputMap, * players: Players, - * map: Map + * map: Map, + * items_eaten: Item[] * }} GameState */ @@ -44,15 +51,26 @@ export const initState = { started: false, input: {}, players: [], - map: {} + map: {}, + items_eaten: [] } +let last = Date.now() +let fps_div = document.getElementById("fps") + export function advance( pastData = initState, input = { players: {} }, frame ) { let data = processInput(pastData, input, frame); + + if (frame % 60 == 0) { + let now = Date.now() + let fps = (now-last)/1000*60 + fps_div.innerHTML = fps.toFixed(2); + last = now + } return data; } @@ -147,16 +165,6 @@ const init_map = (data) => { document.getElementById("lobby").style.display = "none" - // let width = 13 - // let height = 5 - // let m_data = [ - // 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - // 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, - // 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, - // 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, - // 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 - // ] - let width = 21 let height = 21 let m_data = [ @@ -169,10 +177,10 @@ const init_map = (data) => { 1,0,1,1,1,0,1,0,1,1,1,1,1,0,1,0,1,1,1,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,0,1,0,1,0,1,1,1,1,1,0,1,0,1,0,1,1,1, - 1,0,0,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,1, - 1,0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,1,1,1,0,1, - 1,0,0,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,1, - 1,1,1,0,1,0,1,0,1,1,0,1,1,0,1,0,1,0,1,1,1, + 1,0,0,0,0,0,1,0,1,2,2,2,1,0,1,0,0,0,0,0,1, + 1,0,1,1,1,0,1,0,1,2,2,2,1,0,1,0,1,1,1,0,1, + 1,0,0,0,0,0,1,0,1,2,2,2,1,0,1,0,0,0,0,0,1, + 1,1,1,0,1,0,1,0,1,1,2,1,1,0,1,0,1,0,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,1,1,1,0,1,0,1,1,1,1,1,0,1,0,1,1,1,0,1, 1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1, @@ -195,7 +203,7 @@ const round_pos = (pos) => { const is_stable_pos = (pos) => { let rpos = round_pos(pos) - return Math.abs(rpos[0] - pos[0]) < MOVE_SPEED && Math.abs(rpos[1] - pos[1]) < MOVE_SPEED + return Math.abs(rpos[0] - pos[0]) < .05 && Math.abs(rpos[1] - pos[1]) < .05 } const get_tile = (map, pos, ox, oy) => { @@ -251,6 +259,21 @@ const increment_pos = (pos, rot, speed) => { } } +export const get_item_key = (x, y, w) => { + let nx = Math.round(x * 2) + let ny = Math.round(y * 2) + let key = ny * w * 2 + nx + return key +} + +const ceil_half = (n) => { + return Math.ceil(n*2)/2 +} + +const floor_half = (n) => { + return Math.floor(n*2)/2 +} + /** * @param {GameState} data */ @@ -267,7 +290,8 @@ const update_players = (data) => { let move_dir = data.players[id].move_rot let current_pos = data.players[id].pos - if (get_tile_with_rot(data.map, current_pos, input_dir) == 1) { + let tile_in_front_with_turn = get_tile_with_rot(data.map, current_pos, input_dir) + if (tile_in_front_with_turn == 1 || tile_in_front_with_turn == 2) { input_dir = Rotation.NOTHING } @@ -284,12 +308,26 @@ const update_players = (data) => { let move_pos = structuredClone(current_pos) increment_pos(move_pos, move_dir, MOVE_SPEED) - if (get_tile_with_rot(data.map, current_pos, move_dir) != 1) { + let tile_in_front = get_tile_with_rot(data.map, current_pos, move_dir) + if (tile_in_front != 1 && tile_in_front != 2) { data.players[id].pos = move_pos } else { data.players[id].pos = round_pos(current_pos) } + // eat items + let pos = data.players[id].pos + for (let x = ceil_half(pos[0]-.5); x <= floor_half(pos[0]+.5); x += .5) { + for (let y = ceil_half(pos[1]-.5); y <= floor_half(pos[1]+.5); y += .5) { + let item_key = get_item_key(x, y, data.map.width) + let item = data.map.items[item_key] + if (item) { + data.items_eaten.push(item_key) + delete data.map.items[item_key] + } + } + } + } } diff --git a/client/static/cross.png b/client/static/cross.png deleted file mode 100644 index c8d1054d3a86bd08926ad0d80bd2434e4f0723a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 718 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 VAUu~GY8?Oo002ovPDHLkV1fh|AtnF- diff --git a/client/static/turn.png b/client/static/turn.png deleted file mode 100644 index c951f176386fd9183d1a3336505a90a3c4143759..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 687 zcmV;g0#N;lP)EX>4Tx04R}tkv&MmP!xqvTeTup2a8B?$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mgb#YR3krMAq3N2#1@OU5R-E(;FKEU6oFxBje1FB{j z>10C4=2nH^D|#>hABGW;n5oZ+VhW!1bx)mCcQKyj-S=npD|wRvK7lySbi*RvAfDN@ zbk6(4VOEk9;&b8&gDyz?$aUG}H_klWYY7*VPc`!!Ey()lA#h$6Gs(QqkMnX zWrgz=XSGset$XqphVt6VGS_L1B8f#TL4*JqHIz|-g&6G`DJIf%p78KT9KT2|nOtQs zax9<<6_Voz|AXJNH49UdZc-=#bidg4#~2XY1)6o+{yw(t<_QpZ2ClTWzuEw1KS{5* zwdfHrxD8xfw>5bWxZD9oo^;8O94SD{Unl_YXY@@uVCWX;TXW~uI>+e)kfB+nZh(VB zV7y4#>mKj!?VQ`cJ+1lu07r>(l~Py`9smFU24YJ`L;$M*N&vsuXS4GF000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>P30ud4m?u9=9000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0001nNklg zr7OsB=05HFN*nIlX(9-MAdKP8{d%+?-Hz3Lokb}{RXoPnHILSsnz;AAn}b@big*Y? z#6!OGuy|UMm^)ji03+@-eh<>!Y26Mam#di^^yXH(H_+2sf3&7~3TS`^Xn+RH4ZPe~ VAUv408SMZ7002ovPDHLkV1g2SC1n5r diff --git a/client/static/tux.png b/client/static/tux.png deleted file mode 100644 index a5951459c73394bf8db3a721cc5d7bfe2a455464..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14000 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 diff --git a/client/static/wall.png b/client/static/wall.png deleted file mode 100644 index 19d41688c8a23ff95dd358c4c42d50a3020e7774..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 668 zcmV;N0%QG&P)EX>4Tx04R}tkv&MmP!xqvTeTup2a8B?$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mgb#YR3krMAq3N2#1@OU5R-E(;FKEU6oFxBje1FB{j z>10C4=2nH^D|#>hABGW;n5oZ+VhW!1bx)mCcQKyj-S=npD|wRvK7lySbi*RvAfDN@ zbk6(4VOEk9;&b8&gDyz?$aUG}H_klWYY7*VPc`!!Ey()lA#h$6Gs(QqkMnX zWrgz=XSGset$XqphVt6VGS_L1B8f#TL4*JqHIz|-g&6G`DJIf%p78KT9KT2|nOtQs zax9<<6_Voz|AXJNH49UdZc-=#bidg4#~2XY1)6o+{yw(t<_QpZ2ClTWzuEw1KS{5* zwdfHrxD8xfw>5bWxZD9oo^;8O94SD{Unl_YXY@@uVCWX;TXW~uI>+e)kfB+nZh(VB zV7y4#>mKj!?VQ`cJ+1lu07r>(l~Py`9smFU24YJ`L;$M*N&vsuXS4GF000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>P30uUAzm~dwR000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0001UNkll}g39a@EDPVI>=mc!J@|l diff --git a/client/static/wall_end.png b/client/static/wall_end.png deleted file mode 100644 index 4f09e19903299b6fc084f9663629ab2387f9b507..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 658 zcmV;D0&V??P)EX>4Tx04R}tkv&MmP!xqvTeTup2a8B?$WWc^q9Ts93Pq?8YK2xEOkVm2O&XFE z7e~Rh;NZ_<)xpJCR|i)?5c~mgb#YR3krMAq3N2#1@OU5R-E(;FKEU6oFxBje1FB{j z>10C4=2nH^D|#>hABGW;n5oZ+VhW!1bx)mCcQKyj-S=npD|wRvK7lySbi*RvAfDN@ zbk6(4VOEk9;&b8&gDyz?$aUG}H_klWYY7*VPc`!!Ey()lA#h$6Gs(QqkMnX zWrgz=XSGset$XqphVt6VGS_L1B8f#TL4*JqHIz|-g&6G`DJIf%p78KT9KT2|nOtQs zax9<<6_Voz|AXJNH49UdZc-=#bidg4#~2XY1)6o+{yw(t<_QpZ2ClTWzuEw1KS{5* zwdfHrxD8xfw>5bWxZD9oo^;8O94SD{Unl_YXY@@uVCWX;TXW~uI>+e)kfB+nZh(VB zV7y4#>mKj!?VQ`cJ+1lu07r>(l~Py`9smFU24YJ`L;$M*N&vsuXS4GF000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>P30ueaSRZQss000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0001KNklzI(z?lJLT@omXoOV+{1(QECAIcy_2NL