From dd93b44c8799234bff1396077f9bf96df27c6e7e Mon Sep 17 00:00:00 2001 From: Lephenixnoir Date: Tue, 22 Dec 2020 17:01:59 +0100 Subject: [PATCH] convert map and implement collisions --- MystNB.g1a | Bin 25648 -> 28004 bytes assets-fx/img/lv1.png | Bin 0 -> 580 bytes assets-fx/map/lv1.txt | 10 +++++ converters.py | 89 ++++++++++++++++++++++++++++++++++++++++++ src/engine.c | 5 ++- src/engine.h | 26 +++++++++++- src/main.c | 8 ++-- 7 files changed, 129 insertions(+), 9 deletions(-) create mode 100644 assets-fx/img/lv1.png create mode 100644 assets-fx/map/lv1.txt create mode 100644 converters.py diff --git a/MystNB.g1a b/MystNB.g1a index 369e357494c07d4489ed824f54298b3e3a738934..ef54aee6b7eb0278130bd7044f31681bf1d0d49c 100644 GIT binary patch delta 7320 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 HIj{T=AIjjd delta 5030 zcmY*74N#L;w)cMd@<)OuA%P%~gb@A|{XPN}sJKl4H7XhcXstTiFAx-!?TE5U-#8Oi zDH|5qpqJmp$M1HibZ)*!neO-3*&P_mV zGAG};=iYnnIp?0gFH`sMl~HVb_r3oN^#|VWQ^&r8@9+N=i~Zr#G&J?qS!02cFS8e| zEn4?d`Jc89W516_FMPOe?)c6(kyK|A^vzRpK9 z()W|tGZaNUn@?^^Ih;=xq+4|zEO(W=A?n@MyZU6WdQN63y7DxxNf1z zZS~Y=8G}qq{b1n)3P^B405b)4qqi==ND3?py9pN*mDPJH4ZG@!Dhy1}WKcT|!4TZ2xAi|v{)NbL-zkTRI~Q5Df0km?IFdZg zIKbwjx<%q6C*-y@dc^B&043lWEIh#yx@wWhsuYNnaDv*98C8JUhtFNKi)T9#YPr$V%UA^Jx&+CT93%r_(9B(EmWd|1g8mTi#*R zEkX2RS2h5E?dwd4r=FJtPHR4i_}wi)D?_|H0<=Eh-@fhdR;UZ-p zAU>lV+!dZ?xHXv#@OENMYQiiznN%tT=K48uE$L)UWO+#kSNRY%&w_iL_FEEOSE`64 zaYub1>q8X!3tWYQ&RP_~>#xpvWlwE`B2>` zb3^R82Z=2?&+kI~hEo6o5rrGv94STll)|a9sUk8u8jy%mo65P`ovVqPAinkpT@Ua! z^=;9>T^=*g#0-1&f^HNCB?nW)6gs}6yO&b-PA}`uUCMu+?kr;ucB&e>gma^~hqZft zlOQ0a=hPAwn(nYrd#eW^Wq{NQ5K?^|L{5nPIQf?=+=FxoQ~dKK8>n1w6W_9P{+~}T za-yonmr${9rE{0XbnfcmY@Jp#x~+olo)JXHEh+cX?xx)~jvL3)w}1+Or6;hl^clw% zRr4j$NL3R~jpANLOr?0lFoVVo4pqaSM1vOc!{Pd8`JRTWf)C)k@jQw69pDi=IuUQP zK>llmaETuOZ%Dgs=h`YF|se7L-x-qve3DM!kIs&O}& zyX>}ZQ5~uh)id~xdR*;NHE352_h1?iQ~?njd|ck3^`1`Lf^&7teB8J#lxyOI~bZG?5ey+2_!;(jayktF0YldnN_<&qZOsOZ5)qusRppT0TrUrNZjKX!#sF!jicbl7u ztae-dbK|Qah-SrA573vZyt;v{S(fu##tXKC?QZ3JC2b8>U7KE~J<=}bP9YsL8T0B$ zcUrdJ^bp@OJ&*~fyzh+SKAfj~fTz)9>?p3(1eJLmLHw=kTjhQI8?#?a#`S}RzUi!5 zZBeZ@5bOPi)?TZlPocik)Mc_LdVdN{wOLq%5}v`o_Lyn}_JRA}J_xp>IsqtL@YKK< zOzqks1f=8Zdqv;$jAgsZx4lWyC^=>nNTEF-?Ngj&sfYGR>TPGe#U@>e?%&_U>-&S# z0=dhLa|64#t7a_I$y=Z>ke|}Z4dzBkC4PX4RvFW%GErF+?|+B5jJx%74z&P23nx~< zKa z-9|5QDuoohrm^0Bp?ue_O@ud3`42VGQVI^T5M;PYF|$RN*U=|gHQe=`DQHi&8l-$E5v6)NUdxo!3L3C7?+1_$j0V=)xdG;aSa0#52!J@q;*K%^$S zR0^x)#&94z8%x2vl&$27jf41_uw`gnLk8rCU<8ps^BByja|CiECyZTTTkbEgY%8>0 z-~ugqnOH|_ooxb+90Y)@m1`sy^1pdb9->o}93Cim8>iCcIj}6g<=Gs$vL-FOcXcU~ zN#~xid^V5xJqSP_zOv@`OFRi*_qh#F7zvCVfoUtt*OHw>8507r3Ji)qz=hgK@*~MQqr& zPLA;qX)WdO5puC~wZFkPxn0#>0)?4rmJA-Ref(K%mCAPsx|kmtCC!q^4!~8JS-+BW z4S^H6>Z0|Rg>0sxvCuQMT~Yt-22*6yfzzD5IXg3JKY{G@S^fV$iXGr5V|g7-FXwfX zEpr+AZq`L>9|Ol!fq1^jwDU&qWShg2c0jW0p`!WYOo>zF3zNFCQhDG6`_{XmKa>8l zbQ~n_mSy1IkQ-%H2QprtK9IUU<@iWmd8RQGP4&~1oNzO6H3+bxn_PF)!JTh`H?V{C z+*OE(8;6h4#0gO`RkZL+%|2~ZzAm*dxi(gs+LI*acy&<2HJ()XO*VgIjyhEwLynXi z{F1D1vy5M^=*u`TE2i(CHM1v-&9{#0LB@}3=K@Th)bsZM4zj{z8+K-u8HGupv7ULL zF_cnn6qALpL*do!|MqI4!DO_?W%vm^-(}{B6bviT>?~iHSpds^L@MICc z3Biy3jj;aZ;}YGTeTZLQ0iIEU_?Msp?`b6$H~b{qQw?YXx%i8rn%aiwKe+Bj33vW$ zbAhsUXQj#G0YMZ7TV4I6IXm56@yKHTZBQnVq6;}XQF?Hm)>M(@%MQ-B0G`88Lnhj< zu;Z09tc1W)upmo65gglI7=7TVe_^C?US786WFnI$mWM~3r!g)1wDY7Lrx}FbM@t$g zL_5*FM*unj1^|XZ185BP6#_sW*asTzs|BEYV4d*((4%1&9EA2rvcnHj!~# zy*k>>#9J0*bM>MzEHX%ynpFvn6GXKFiI59m1i3&qOdeP5&{-iGX=D4!Bih(f(Ze;> z$7mrR*=UyDM|}0Q@YKfj7~dzB&6^l!2Wi=CrH?b4_a{|ZxZ_bZw|@eWk8WqVS%*^noTQvV;$9L7G_XUooI9kr2>KO9R03KdG0(i&ZL!AiJfi zRQXbbc~LRQ`kt|Ls&>NrB^=B`Yy3Su*w4~K08UcI66-BVap5Pd$W*PSH-yl#F49%k z`zx@(p7!`r{Q6P)gfx8>pdZRL_(#QVXc!j~^Hx`4URDd&R|DDgB)|oj2VXFBAwKnH zVqUQT_jm?q?*WYm-v}i3ztVa3tRb6!Z7MNL8CYE21IxiRQyc)`YIQ!+&`=caX&A*4 z2E9&dcb$ye0?XwXc0l3rT!h|z44xpo=NfsmtB}Pqy? zTB<<20M^;pAMQLP$5IS0OlorBu+^X2f%yDt;QjLtrSXNr&xtVN3+52NmVHL&^Wyf6 z)0c>J&C-V#z}CWrAq7GJod6?4^sgMu#9|8gON3Onx=3xSoSbP*Vm1tt3$2CZJ<}WO zGNvHhpY=(i{DHKn#<}K}%x5hzMgQ4VV@dC<>8crJdjF4>qi6lpb=W@Fx;H0&{HMSl VkS8=iOKNasiK%)=ym&1N_y4lqi%kFk diff --git a/assets-fx/img/lv1.png b/assets-fx/img/lv1.png new file mode 100644 index 0000000000000000000000000000000000000000..4bdd166d4a632a9e0e64b8fd64e17790d308ab4b GIT binary patch literal 580 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQk(@Ik;M!QddeWoSh3W;3@FH6 z;_2(k{)9)2%UJKq%HQ!oA;}Wgh!W@g+}zZ>5(ej@)Wnk16ovB4k_-iRPv3y>Mm}){ z2F87!E{-7;x8BYTTy@xhhvn&m-|>;}R|_yLEt{XUeyOC!vcDc8rJKV-W}B6lThF+5 zYg@7WJS$`4-8^2GcOK5NzG7OuVB*KGRp0B<&NLPM`?aF$?%&51;eTF#{@vOmm;OBV zv$lA^+4~!qd**#vx$k%D*%%iycA$Xh$_LA<_Veyr#r)<({O>OkE8>m_-2eaRbs+n# zP}}(iu^P|&?HmdP7?>JPl{|g0$(Hv4L%f*(#N?Fay3X#w_ZZXW*N2zh+VsWviLAn} z(;ct2q`u6En<}HQ>GHIrjBQqpr+RyYZ%p04!7pLzl8+(`91H>s3JeaQuw(?9d4@-y zTfWh>=K0a<%1yI)efDmR(X?B}kOfrXAh=_bM$rG2=H4}@%h}J18LmE_^|95L@uGHo z-A<luEt!)hk&ZoYc`S88Yf-GdNI7+9dTRw(VZ zoO1WzQPu_XcIY^zaV=m2N{KX{*=U+QMTBp`zBYbFodU+EqBa}}jm#SBA38HwG~~Ve zaeTt9kF9U{+KfND%P+9tU|@7eoi)?&WO#W)?A$Gvt&5gFKYRBrzwd|Nx6^0b=LbeN NgQu&X%Q~loCIHyn@Rk4o literal 0 HcmV?d00001 diff --git a/assets-fx/map/lv1.txt b/assets-fx/map/lv1.txt new file mode 100644 index 0000000..3de9215 --- /dev/null +++ b/assets-fx/map/lv1.txt @@ -0,0 +1,10 @@ +##### ##### +# ##### # +# a a # +##A### ###A## +# a a # +# ~ ##### @ # +##### ##### + +a: #. +A: #. diff --git a/converters.py b/converters.py new file mode 100644 index 0000000..b22244f --- /dev/null +++ b/converters.py @@ -0,0 +1,89 @@ +import fxconv +import re +import os.path + +def convert(input, output, params, target): + if params["type"] == "map": + convert_map(input, output, params, target) + else: + raise fxconv.FxconvError(f"unknown conversion {params['type']}") + sys.exit(1) + +def convert_map(input, output, params, target): + TILE_AIR = 0 + TILE_WALL = 1 + TILE_START = 2 + TILE_END = 3 + TILE_KEY = 16 + TILE_VDOOR = 24 + TILE_HDOOR = 32 + + # Read input file + + with open(input, "r") as fp: + tiles, cycles = fp.read().split("\n\n") + tiles = tiles.split("\n") + cycle_texts = [c for c in cycles.split("\n") if c] + + w = max(len(t) for t in tiles) + h = len(tiles) + fog = 0 + + filename = os.path.splitext(os.path.basename(input))[0] + + # Generate map contents + + encoded_tiles = bytearray(w * h) + for (y, t) in enumerate(tiles): + for (x, c) in enumerate(t): + if c == " ": + tile = TILE_AIR + elif c == "#": + tile = TILE_WALL + elif c == "~": + tile = TILE_START + elif c == "@": + tile = TILE_END + elif ord("0") <= ord(c) <= ord("9"): + tile = TILE_KEY + int(c) + elif ord("a") <= ord(c) <= ord("z"): + tile = TILE_VDOOR + (ord(c) - ord("a")) + elif ord("A") <= ord(c) <= ord("Z"): + tile = TILE_HDOOR + (ord(c) - ord("A")) + else: + raise fxconv.FxconvError(f"unknown tile character {c}") + + encoded_tiles[y*w + x] = tile + + # Parse door cycles + + RE_CYCLE = re.compile(r'^([a-zA-Z]):\s*([#.]+)$') + cycles = dict() + + for c in cycle_texts: + m = re.match(RE_CYCLE, c) + if not m: + raise fxconv.FxconvError(f"cannot parse door cycle '{c}'") + cycles[m[1]] = m[2].encode("utf-8") + + # Generate door cycle data + + door_cycle = b"" + door_cycle_index = bytearray(16) + + for index, letter in enumerate("abcdefghABCDEFGH"): + door_cycle_index[index] = len(door_cycle) + if letter in cycles: + door_cycle += cycles[letter] + b" " + + door_cycle = door_cycle + bytes(128 - len(door_cycle)) + + # Generate the structure + + o = fxconv.ObjectData() + o += fxconv.u32(w) + fxconv.u32(h) + fxconv.u32(fog) + o += door_cycle + door_cycle_index + o += fxconv.ref(f"img_{filename}") + o += fxconv.ref(encoded_tiles) + + fxconv.elf(o, output, "_" + params["name"], **target) diff --git a/src/engine.c b/src/engine.c index 0c79ea2..078dde3 100644 --- a/src/engine.c +++ b/src/engine.c @@ -40,6 +40,7 @@ static void engine_draw_player(struct player const *player) void engine_draw(struct game const *game) { dclear(C_WHITE); + dimage(0, 0, game->map->img); for(int p = 0; game->players[p]; p++) { @@ -54,8 +55,8 @@ void engine_draw(struct game const *game) /* Check whether a cell of the map is walkable */ static int map_walkable(struct map const *map, int x, int y) { - /* TODO: Read the map's data array */ - return (x >= 1) && (y >= 1) && (x < map->w - 1) && (y < map->h - 1); + int tile = map->tiles[y * map->w + x]; + return (tile != TILE_WALL); } int engine_move(struct game *game, struct player *player, int dir) diff --git a/src/engine.h b/src/engine.h index 6e0393c..da7d5dd 100644 --- a/src/engine.h +++ b/src/engine.h @@ -37,8 +37,30 @@ struct map int w, h; /* Whether fog is enabled */ int fog; - /* Raw data */ - uint8_t *data; + /* Door cycle string */ + char door_cycle[128]; + /* Mapping of door types to cycle string index */ + uint8_t door_cycle_index[16]; + /* Background image */ + bopti_image_t *img; + /* Array of tiles in row-major order */ + uint8_t *tiles; +}; + +/* enum map_tile: Single cell in the map */ +enum map_tile +{ + TILE_AIR = 0, + TILE_WALL = 1, + TILE_START = 2, + TILE_END = 3, + + /* 8 keys in interval 16..23 */ + TILE_KEY = 16, + /* 8 vertical doors in interval 24..31 */ + TILE_VDOOR = 24, + /* 8 horizontal doors in interval 32..39 */ + TILE_HDOOR = 32, }; /* struct game: A running game with a map and some players */ diff --git a/src/main.c b/src/main.c index c214b3c..2372d0b 100644 --- a/src/main.c +++ b/src/main.c @@ -97,12 +97,10 @@ int main(void) }; singleplayer.idle = !anim_player_idle(&singleplayer.anim, 1); - struct map map = { - .w = 13, - .h = 7 - }; + extern struct map map_lv1; + struct game game = { - .map = &map, + .map = &map_lv1, .players = { &singleplayer, NULL }, .time = 0, };