From 1a5a550512e4e3994a2ad37c766dba8638fe6335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Madar=C3=A1sz?= Date: Tue, 2 Nov 2021 18:09:54 +0100 Subject: [PATCH] improve worldgen + conveyor belts --- art/belt.aseprite | Bin 0 -> 722 bytes art/gen/belt_down.png | Bin 0 -> 474 bytes art/gen/belt_left.png | Bin 0 -> 444 bytes art/gen/belt_right.png | Bin 0 -> 431 bytes art/gen/belt_up.png | Bin 0 -> 485 bytes art/gen/tree.png | Bin 0 -> 846 bytes art/gen/wood.png | Bin 0 -> 254 bytes art/tree.aseprite | Bin 0 -> 1041 bytes art/wood.aseprite | Bin 0 -> 646 bytes code/game/src/asset_setup.h | 5 +- code/game/src/assets.h | 7 ++ code/game/src/assets_list.c | 6 ++ code/game/src/gen/texgen.c | 6 ++ code/game/src/items.c | 1 + code/game/src/items.h | 1 + code/game/src/items_list.c | 14 +++ code/game/src/world/blocks.c | 11 +++ code/game/src/world/blocks.h | 2 + code/game/src/world/blocks_list.c | 7 ++ code/game/src/world/world.c | 7 +- code/game/src/world/world.h | 1 + code/game/src/world/worldgen/worldgen_test.c | 89 ++++++++++++------- code/modules/modules/systems.c | 6 +- 23 files changed, 128 insertions(+), 35 deletions(-) create mode 100644 art/belt.aseprite create mode 100644 art/gen/belt_down.png create mode 100644 art/gen/belt_left.png create mode 100644 art/gen/belt_right.png create mode 100644 art/gen/belt_up.png create mode 100644 art/gen/tree.png create mode 100644 art/gen/wood.png create mode 100644 art/tree.aseprite create mode 100644 art/wood.aseprite diff --git a/art/belt.aseprite b/art/belt.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..1ca8c1221f8b2f41513a3b8fbb4086bd02419cb2 GIT binary patch literal 722 zcmcJNO-PhM9EV3=7b#fqB$$LlsRTl;t0khjB7T61#vV2!Fu%cQLCX~cJ*@aq zq%L^KTd~KmSR*<`2vMl0qz1K8p`t7(tM2%`Yl|Mb`XA=uKQo8lGxNS*qlH+XjuQC{ zDWZfB4b0PG&)5`kjPocv`N17iIMqZzJTq2?BhSPw(pbuI6T+qh#4j&Z^z*kl)T)JBi7rWj<_w!OX;It^6 z3&a@jE@`*~H$WeE#IZ&hUt}>w6GsHGLk%yaFha+0Q3?wb$S0g+V#y?sG@_D>B&oqj zp&(*Kd2MH7n@s=2!X!_Q6d&cJjNhVTa&!Kj`H3a2@PlLM>P4A6t%j$xyyD%`jSJV; zI-h=jw)s%ouG(8koJnb|4E-^$?x$sS{Pixc55BK+c|*GS@!{B|K=9_5e9fHsU(^)$ zI9&mMyDLx~n)D6#`1hQC<@QACwlC6oJV#!eFXwlqvm*GdYa|p{cxm%xuq+RjY|n_g H1nu%MEjQy{ literal 0 HcmV?d00001 diff --git a/art/gen/belt_down.png b/art/gen/belt_down.png new file mode 100644 index 0000000000000000000000000000000000000000..ee7371deb859b5e0fb4335cabc8a753b4e8d4521 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zr+B(JhE&XX zJIg!oumO+DayKzMw+nHK-}igIdl#Pgid(Ak)-h^3zW8`6lqJ03!t0II;wN|#kKDdsHbd~xiscXO z6ogwO^>3fCo6mTtr~P-~pEV7kif7uU*ZpN$?YMzM-}Y)ls6s^R^f-}&Zv=D>d)L2V zid2kfpMEc=`KCfe%XGhA4LSmQ4tewT3h*8@-gD&!XOO_2!``xM3rt!%J_J3FRN!(7 zsmOd_@Pt>v-6C)%>hm z@RU|cy6?<7J=NDmzjF&2Gb(ju zo#34~Q6cbl)(z2_^BgAHy1tNII4$8~>{I512dgLjYkOG;j4TFES3j3^P6Px$c1c7*RCt`_*}Dw_K@3IF%SKxUf)?n%6Z#;70EGDLe`dV)^P~iDkHj+Ahtu(L z$MBr{e)9F}?Pl~zo~N^Xv$^;^jv0W*crXI+8V?2lp5vi0fcJQ42oND28UaL!hXw#8 z@z!?$s0P%akQL$U8ITd-?;)5C zVenTV6T;}vU>1bQdq4(+*^7`m!lIj?GQ#4kuqwi;{{o5#rUMa=2<9U(ZwR{#MLi)D zjl>iXif4k+5vmMDBO_Fs3P(k#Iu?(JP<<~D4WY?mB+~Y%*=8sTLete)1cc_hLGK7A m%Tdn=X4_$}2&U_Cj|dO;C!qC0gZSY90000Px$X-PyuRCt`-+c8eVKoEw}2UU)N;0oOTCfvgv6!Z|;yEFfI+7!w6WN)OE=H>nE z^IPG3JRX03{&gHhzvOpbOTX=j`44FI!~sx?5D7pXLM#9^2+;uSM~DYtFTw}__92u5 zT=}2hfza{U;A%XBpMVwd3H_z3k;I>TP~y@U`qM-&TSqm=Y+rScq^A#H?Tjclv(%vUkArJhPa=b z*BeW2J1fYbTK_$Qty_~JD(=&rj4-v*293(Irs116tYmUI9lfr0?zBJ|1@C*GXW8+t z)^ONn^Jr_(vqXkzHjm_lzTIZXsXVgRjc+<*+C=v|pU*utIgs^ftgp`g5Fwfd$8iS&P^x$F5;nkw2mE`&{WH?aA3_g`TJ+fO_GZp{NepK3wY zOFsRrle3D!`1JQo$)k*66W(9m(8aVy<-U5V99u--KL11i_H9~_qP+jgf5BOWq7A$U s;#d=yH-t0ZV0aVCV8&2QywE*<6X!Xa_qqH6f$_%R>FVdQ&MBb@0L?tcV*mgE literal 0 HcmV?d00001 diff --git a/art/gen/tree.png b/art/gen/tree.png new file mode 100644 index 0000000000000000000000000000000000000000..c91a082ced2fc55d2c28adc1021d8e312829b173 GIT binary patch literal 846 zcmV-U1F`&xP)Px&2uVaiRCt{2Tgy>HF$`2Pw2%r?0W;x{hM)lIpa5uy1DTbwQLCq$NB;r6B2sCDPAN4=NikuOIBUY%$V| zQN*=`N1z1B5+ZD*l6a2_Awrp3@*2{c?M`L)bUX~xv|>a=aAoXUT_Ud~%|Q~Q_Xv*= z<_wxvkCNuVi4pMzQ{oZ%D&jpTA-p1}6E1~3B1;5SB8mK^iTCJ*u!=BDuw?RxhzR1x zZ1S4vEz7o61olG~c`a!Uk+L)*tVc$@;74;-`nBxYSU@*a(4P|a7Sm6;i;G=Pn%}5 z-N9zNQY7J zzG-YnkuE?FieOK?{XG&P8|4Bl9sdGcy8_onxd2q3?!)8u_b497M!Eo_(Yq%oebd;E zA~g=s#_bh>ju&fO7q@%pkwArmrQ#J4C$}e%z7~*Tc4>~+ES_#+F$ADnxL7w;ss==M z5R7(%tj!DydCwwl4e+}^CS6bS07dW!VcinbB4tm|vsb5?->Wu7C7kUF1JvvcYwT6n zq(*-L!UNvkKUdbX0gsDjyR@g}O(#RwKKhD4Q}?su;#)c&jGhYu2p(XW5xgV47uND5 zE@uL8S4kr0@|lR-Q=qsF?+8V%$YjD>u5>#DKrsmR?qi9{vLeAKc?tj5Uy$^ZZW literal 0 HcmV?d00001 diff --git a/art/gen/wood.png b/art/gen/wood.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc833e4d44084130b1d5fd82193f1d503ef4828 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|c6hothE&XX zd*LAGVF!Vu0qSp;2#Y`36?C+0QuFFUs~e}2TGvBSg z^Y{PWlD`aG3s_B9FEGtw%3$>gV+TT2ks1-N&jJ7_J}iXS;(eu QKtC{ey85}Sb4q9e01x0-ZU6uP literal 0 HcmV?d00001 diff --git a/art/tree.aseprite b/art/tree.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..d77365da074feb134363561dc6d2da936a93d837 GIT binary patch literal 1041 zcmcJN`%9Bi7{||=x-fZ{g-uQ8i$(N<R2lCY?jrDl06!z^!^BfAN!bs1)5 zYN=qBUBsnD&X{5;6)sE@-LhJm)4;iPA-rX8-&s`uK+oZPcsS>W@8>xjcPB#LSFlJZ z7EM@$kT~qWg)_$?nThp3DvwRb_-E&-RA&Ut!RF9Yk^jWKM(;(_zfb)BxtVGiLj36^ z;F^VEFhLjuYPPNf%?B5Nrm_Uk_M`}$__7Qvw1k664FYia#r@#=y@BAS_4C1Cu@IC< z(m_GY32?{$UNE+p0e8OW2U~l-gA9t0;;M&WZjK7vo0J4bY~2KAu2O?{gM&enA{Ojc z)`OY?IjBw%Fi9A|$?@(q8VrF6pbvM5!y3x)g)B^=2}cOR4r=g%6pWzbaA6o&Kmqv( zM>1lOi9n0>yAPHs~q1V>*{b}Q*yJw&8fOV z{OYC0B}Mi+kM7mm*G99ZJ-JcWxoBO_tg^PIIl_7J#8!6x#-K3Zd9>EYWxhMKn2+CJ%MqS5r`tj|o2EW>;}q-aJB z<)2pC5|W>FG~9TV}q)H z_N~E>p6y4%gGLPcyy4Inb{*x*J0100V@=s}_Efj~(XKa2Q`I)LcTAgJWzJtN%HieY zwvH#?a1njBzm<5K)w)q0(1yRZFEy{W=1u>xwk(cGxdc%LHB?hV zTj9`RTUgK%+E77{De19P2Dk58QENm0!}-p+|1Io=k8e}2zS6r5Tg_K_%)31}lRuRH1>tIWb6Nci3^>F2;9fl7quwf|z-MzKYryVvm4M9uSEc8dNU@)%0&h#}rI)8@> zB}6>22j`|1U~f1KJG>q^+#H2FHXF?Ng79oS31iExFxqEP!dyV7zIVxnOK=19aYr0$ zl<`FtQ#5fz5IfZHLJA{vR2N0T0tNC3Cz)6>2_%gulbR%p;CG=Q45BSC)-xcjlRW6< z=aIrk`7HIf7+t$hTT6sA>a2kmmv(q}CgDpt_M?lX{@mtqvMf7zc$zmiuAkgJzfSyd MnSQ9;j@*uX0F+quantity <= 0) return; switch (item_get_usage(item_id)) { + case UKIND_HOLD: /* NOOP */ break; case UKIND_PLACE:{ world_block_lookup l = world_block_from_realpos(p.x, p.y); if (world_chunk_place_block(l.chunk_id, l.id, blocks_find(desc->place.kind)) ) diff --git a/code/game/src/items.h b/code/game/src/items.h index a9d3845..44d3157 100644 --- a/code/game/src/items.h +++ b/code/game/src/items.h @@ -6,6 +6,7 @@ #include "modules/components.h" typedef enum { + UKIND_HOLD, UKIND_PLACE, UKIND_PLACE_ITEM, UKIND_END_PLACE, diff --git a/code/game/src/items_list.c b/code/game/src/items_list.c index f03cd70..16edde4 100644 --- a/code/game/src/items_list.c +++ b/code/game/src/items_list.c @@ -1,5 +1,12 @@ #include "items.h" +#define ITEM_HOLD(asset, qty)\ +{\ +.kind = asset,\ +.usage = UKIND_HOLD,\ +.max_quantity = qty,\ +} + #define ITEM_BLOCK(asset, qty, build_asset)\ {\ .kind = asset,\ @@ -19,4 +26,11 @@ static item_desc items[] = { }, ITEM_BLOCK(ASSET_DEMO_ICEMAKER, 64, ASSET_WATER), ITEM_SELF(ASSET_FENCE, 64), + ITEM_SELF(ASSET_WOOD, 64), + ITEM_HOLD(ASSET_TREE, 64), + + ITEM_SELF(ASSET_BELT_LEFT, 999), + ITEM_SELF(ASSET_BELT_RIGHT, 999), + ITEM_SELF(ASSET_BELT_UP, 999), + ITEM_SELF(ASSET_BELT_DOWN, 999), }; diff --git a/code/game/src/world/blocks.c b/code/game/src/world/blocks.c index 0a928ec..08288f6 100644 --- a/code/game/src/world/blocks.c +++ b/code/game/src/world/blocks.c @@ -27,6 +27,9 @@ typedef struct { float friction; float bounce; + float velx; + float vely; + // NOTE(zaklaus): viewer data uint16_t slot; } block; @@ -74,6 +77,14 @@ float blocks_get_bounce(uint8_t id) { return blocks[id].bounce; } +float blocks_get_velx(uint8_t id) { + return blocks[id].velx; +} + +float blocks_get_vely(uint8_t id) { + return blocks[id].vely; +} + void *blocks_get_img(uint8_t id) { return assets_get_tex(blocks[id].slot); } diff --git a/code/game/src/world/blocks.h b/code/game/src/world/blocks.h index 403356d..622f076 100644 --- a/code/game/src/world/blocks.h +++ b/code/game/src/world/blocks.h @@ -18,6 +18,8 @@ uint32_t blocks_get_flags(uint8_t id); float blocks_get_drag(uint8_t id); float blocks_get_friction(uint8_t id); float blocks_get_bounce(uint8_t id); +float blocks_get_velx(uint8_t id); +float blocks_get_vely(uint8_t id); // NOTE(zaklaus): viewer-related functions void *blocks_get_img(uint8_t id); diff --git a/code/game/src/world/blocks_list.c b/code/game/src/world/blocks_list.c index d4e8dd4..fbb7fed 100644 --- a/code/game/src/world/blocks_list.c +++ b/code/game/src/world/blocks_list.c @@ -15,4 +15,11 @@ static block blocks[] = { BLOCK(ASSET_WATER, 0, '~', .drag = 0.11f , .friction = 1.0f), BLOCK(ASSET_LAVA, BLOCK_FLAG_HAZARD, '!', .drag = 6.2f , .friction = 4.0f), BLOCK(ASSET_FENCE, BLOCK_FLAG_COLLISION, '#', .drag = 1.0f , .friction = 1.0f, .bounce = 1.0f), + BLOCK(ASSET_WOOD, BLOCK_FLAG_COLLISION, '#', .drag = 1.0f , .friction = 1.0f, .bounce = 0.0f), + BLOCK(ASSET_TREE, BLOCK_FLAG_COLLISION, '@', .drag = 1.0f , .friction = 1.0f, .bounce = 0.0f), + + BLOCK(ASSET_BELT_LEFT, 0, '@', .drag = 1.0f , .friction = 1.0f, .velx = -90.0f), + BLOCK(ASSET_BELT_RIGHT, 0, '@', .drag = 1.0f , .friction = 1.0f, .velx = 90.0f), + BLOCK(ASSET_BELT_UP, 0, '@', .drag = 1.0f , .friction = 1.0f, .vely = -90.0f), + BLOCK(ASSET_BELT_DOWN, 0, '@', .drag = 1.0f , .friction = 1.0f, .vely = 90.0f), }; diff --git a/code/game/src/world/world.c b/code/game/src/world/world.c index f900737..ee69597 100644 --- a/code/game/src/world/world.c +++ b/code/game/src/world/world.c @@ -174,8 +174,9 @@ int32_t world_init(int32_t seed, uint16_t chunk_size, uint16_t chunk_amount) { librg_event_set(world.tracker, LIBRG_WRITE_UPDATE, tracker_write_update); world.data = zpl_malloc(sizeof(uint8_t)*world.size); + world.outer_data = zpl_malloc(sizeof(uint8_t)*world.size); - if (!world.data) { + if (!world.data || !world.outer_data) { return WORLD_ERROR_OUTOFMEM; } @@ -214,13 +215,15 @@ int32_t world_init(int32_t seed, uint16_t chunk_size, uint16_t chunk_amount) { *c = world.data[(chk_y+y)*world.dim + (chk_x+x)]; c = &world.outer_block_mapping[i][(y*chunk_size)+x]; - *c = 0; + *c = world.outer_data[(chk_y+y)*world.dim + (chk_x+x)]; } } } zpl_mfree(world.data); + zpl_mfree(world.outer_data); world.data = NULL; + world.outer_data = NULL; zpl_printf("[INFO] Created a new server world\n"); diff --git a/code/game/src/world/world.h b/code/game/src/world/world.h index 78605fb..d8cea7b 100644 --- a/code/game/src/world/world.h +++ b/code/game/src/world/world.h @@ -32,6 +32,7 @@ typedef WORLD_PKT_WRITER(world_pkt_writer_proc); typedef struct { bool is_paused; uint8_t *data; + uint8_t *outer_data; uint32_t seed; uint32_t size; uint16_t chunk_size; diff --git a/code/game/src/world/worldgen/worldgen_test.c b/code/game/src/world/worldgen/worldgen_test.c index ebfb711..fa0c9f5 100644 --- a/code/game/src/world/worldgen/worldgen_test.c +++ b/code/game/src/world/worldgen/worldgen_test.c @@ -12,7 +12,7 @@ #include "items.h" #include "world/blocks_info.h" -#define WORLD_BLOCK_OBSERVER(name) uint8_t name(uint8_t id, uint32_t block_idx) +#define WORLD_BLOCK_OBSERVER(name) uint8_t name(uint8_t *data, uint8_t id, uint32_t block_idx) typedef WORLD_BLOCK_OBSERVER(world_block_observer_proc); #define WORLD_PERLIN_FREQ 100 @@ -41,7 +41,7 @@ uint8_t worldgen_biome_find(uint32_t biome, uint32_t kind) { static world_data *world; -static void world_fill_rect(uint8_t id, uint32_t x, uint32_t y, uint32_t w, uint32_t h, world_block_observer_proc *proc) { +static void world_fill_rect(uint8_t *data, uint8_t id, uint32_t x, uint32_t y, uint32_t w, uint32_t h, world_block_observer_proc *proc) { for (uint32_t cy=y; cy= world->dim) continue; @@ -49,19 +49,19 @@ static void world_fill_rect(uint8_t id, uint32_t x, uint32_t y, uint32_t w, uint uint32_t i = (cy*world->dim) + cx; if (proc) { - uint8_t new_id = (*proc)(id, i); + uint8_t new_id = (*proc)(data, id, i); if (new_id != BLOCK_INVALID) { id = new_id; } else continue; } - world->data[i] = id; + data[i] = id; } } } -static void world_fill_circle(uint8_t id, uint32_t x, uint32_t y, uint32_t w, uint32_t h, world_block_observer_proc *proc) { +static void world_fill_circle(uint8_t *data, uint8_t id, uint32_t x, uint32_t y, uint32_t w, uint32_t h, world_block_observer_proc *proc) { for (uint32_t cy=y; cy= world->dim) continue; @@ -69,27 +69,27 @@ static void world_fill_circle(uint8_t id, uint32_t x, uint32_t y, uint32_t w, ui uint32_t i = (cy*world->dim) + cx; if (proc) { - uint8_t new_id = (*proc)(id, i); + uint8_t new_id = (*proc)(data, id, i); if (new_id != BLOCK_INVALID) { id = new_id; } else continue; } - world->data[i] = id; + data[i] = id; } } } -static void world_fill_rect_anchor(uint8_t id, uint32_t x, uint32_t y, uint32_t w, uint32_t h, float ax, float ay, world_block_observer_proc *proc) { +static void world_fill_rect_anchor(uint8_t *data, uint8_t id, uint32_t x, uint32_t y, uint32_t w, uint32_t h, float ax, float ay, world_block_observer_proc *proc) { uint32_t w2 = (uint32_t)floorf(w*ax); uint32_t h2 = (uint32_t)floorf(h*ay); - world_fill_rect(id, x-w2, y-h2, w, h, proc); + world_fill_rect(data, id, x-w2, y-h2, w, h, proc); } static WORLD_BLOCK_OBSERVER(shaper) { uint32_t kind = id; - uint32_t old_kind = world->data[block_idx]; + uint32_t old_kind = data[block_idx]; if (kind == BLOCK_KIND_WALL && kind == old_kind) { return worldgen_biome_find(BLOCK_BIOME_DEV, BLOCK_KIND_HILL); @@ -101,29 +101,38 @@ static WORLD_BLOCK_OBSERVER(shaper) { return id; } -static uint8_t world_perlin_cond(uint32_t block_idx, double chance) { - uint32_t x = block_idx % world->dim; - uint32_t y = block_idx / world->dim; +static uint8_t world_perlin_cond_offset(uint32_t block_idx, double chance, uint32_t ofx, uint32_t ofy) { + uint32_t x = block_idx % world->dim + ofx; + uint32_t y = block_idx / world->dim + ofy; return perlin_fbm(world->seed, x, y, WORLD_PERLIN_FREQ, WORLD_PERLIN_OCTAVES) < chance; } +static uint8_t world_perlin_cond(uint32_t block_idx, double chance) { + return world_perlin_cond_offset(block_idx, chance, 0, 0); +} + #if 1 static WORLD_BLOCK_OBSERVER(shaper_noise80) { - return world_perlin_cond(block_idx, 0.80) ? shaper(id, block_idx) : BLOCK_INVALID; + return world_perlin_cond(block_idx, 0.80) ? shaper(data, id, block_idx) : BLOCK_INVALID; } static WORLD_BLOCK_OBSERVER(shaper_noise50) { - return world_perlin_cond(block_idx, 0.50) ? shaper(id, block_idx) : BLOCK_INVALID; + return world_perlin_cond(block_idx, 0.50) ? shaper(data, id, block_idx) : BLOCK_INVALID; } static WORLD_BLOCK_OBSERVER(shaper_noise33) { - return world_perlin_cond(block_idx, 0.33) ? shaper(id, block_idx) : BLOCK_INVALID; + return world_perlin_cond(block_idx, 0.33) ? shaper(data, id, block_idx) : BLOCK_INVALID; } static WORLD_BLOCK_OBSERVER(shaper_noise05) { - return world_perlin_cond(block_idx, 0.05) ? shaper(id, block_idx) : BLOCK_INVALID; + return world_perlin_cond(block_idx, 0.05) ? shaper(data, id, block_idx) : BLOCK_INVALID; } + +static WORLD_BLOCK_OBSERVER(shaper_noise05b) { + return world_perlin_cond_offset(block_idx, 0.05, 32, 0) ? shaper(data, id, block_idx) : BLOCK_INVALID; +} + #else static WORLD_BLOCK_OBSERVER(shaper_noise80) { return rand()%10 < 8 ? shaper(id, block_idx) : BLOCK_INVALID; @@ -145,6 +154,7 @@ static void world_fill_mountain(uint32_t x, uint32_t y) { #endif #define RAND_RANGE(x,y) (x + (int)rand()%(y-(x))) +#define RAND_RANGEF(x,y) ((float)RAND_RANGE(x,y)) int32_t worldgen_test(world_data *wld) { // TODO(zaklaus): pass world as an arg instead @@ -157,32 +167,34 @@ int32_t worldgen_test(world_data *wld) { uint8_t dirt_id = worldgen_biome_find(BLOCK_BIOME_DEV, BLOCK_KIND_DIRT); uint8_t watr_id = worldgen_biome_find(BLOCK_BIOME_DEV, BLOCK_KIND_WATER); uint8_t lava_id = worldgen_biome_find(BLOCK_BIOME_DEV, BLOCK_KIND_LAVA); + uint8_t tree_id = blocks_find(ASSET_TREE); srand(world->seed); // walls - world_fill_rect(wall_id, 0, 0, world->dim, world->dim, NULL); + world_fill_rect(world->data, wall_id, 0, 0, world->dim, world->dim, NULL); // ground - world_fill_rect(grnd_id, 1, 1, world->dim-2, world->dim-2, NULL); - world_fill_rect(dirt_id, 1, 1, world->dim-2, world->dim-2, shaper_noise05); + world_fill_rect(world->data, grnd_id, 1, 1, world->dim-2, world->dim-2, NULL); + world_fill_rect(world->data, dirt_id, 1, 1, world->dim-2, world->dim-2, shaper_noise05); + world_fill_rect(world->outer_data, tree_id, 1, 1, world->dim-2, world->dim-2, shaper_noise05b); // water #if 1 for (int i=0; idim), RAND_RANGE(0, world->dim), 4+RAND_RANGE(0,3), 4+RAND_RANGE(0,3), 0.5f, 0.5f, shaper_noise80); + world_fill_rect_anchor(world->data, watr_id, RAND_RANGE(0, world->dim), RAND_RANGE(0, world->dim), 4+RAND_RANGE(0,3), 4+RAND_RANGE(0,3), 0.5f, 0.5f, shaper_noise80); } #endif // ice rink #if 0 - world_fill_rect_anchor(watr_id, 450, 125, 10, 10, 0.0f, 0.0f, NULL); + world_fill_rect_anchor(world->data, watr_id, 450, 125, 10, 10, 0.0f, 0.0f, NULL); #endif // lava #if 1 for (int i=0; idim), RAND_RANGE(0, world->dim), 4+RAND_RANGE(0,3), 4+RAND_RANGE(0,3), 0.5f, 0.5f, shaper_noise80); + world_fill_rect_anchor(world->data, lava_id, RAND_RANGE(0, world->dim), RAND_RANGE(0, world->dim), 4+RAND_RANGE(0,3), 4+RAND_RANGE(0,3), 0.5f, 0.5f, shaper_noise80); } #endif @@ -191,7 +203,7 @@ int32_t worldgen_test(world_data *wld) { #if 1 const uint32_t HILLS_SIZE = 21; for (int i=0; idim), RAND_RANGE(0, world->dim), RAND_RANGE(0,HILLS_SIZE), RAND_RANGE(0,HILLS_SIZE), 0.5f, 0.5f, shaper_noise50); + world_fill_rect_anchor(world->data, wall_id, RAND_RANGE(0, world->dim), RAND_RANGE(0, world->dim), RAND_RANGE(0,HILLS_SIZE), RAND_RANGE(0,HILLS_SIZE), 0.5f, 0.5f, shaper_noise50); } #endif @@ -201,8 +213,8 @@ int32_t worldgen_test(world_data *wld) { uint64_t e = vehicle_spawn(); Position *dest = ecs_get_mut(world_ecs(), e, Position, NULL); - dest->x = RAND_RANGE(0, world->dim*WORLD_BLOCK_SIZE); - dest->y = RAND_RANGE(0, world->dim*WORLD_BLOCK_SIZE); + dest->x = RAND_RANGEF(0, world->dim*WORLD_BLOCK_SIZE); + dest->y = RAND_RANGEF(0, world->dim*WORLD_BLOCK_SIZE); } #endif @@ -212,17 +224,34 @@ int32_t worldgen_test(world_data *wld) { uint64_t e = item_spawn(ASSET_DEMO_ICEMAKER, 32); Position *dest = ecs_get_mut(world_ecs(), e, Position, NULL); - dest->x = RAND_RANGE(0, world->dim*WORLD_BLOCK_SIZE); - dest->y = RAND_RANGE(0, world->dim*WORLD_BLOCK_SIZE); + dest->x = RAND_RANGEF(0, world->dim*WORLD_BLOCK_SIZE); + dest->y = RAND_RANGEF(0, world->dim*WORLD_BLOCK_SIZE); } for (int i=0; ix = RAND_RANGE(0, world->dim*WORLD_BLOCK_SIZE); - dest->y = RAND_RANGE(0, world->dim*WORLD_BLOCK_SIZE); + dest->x = RAND_RANGEF(0, world->dim*WORLD_BLOCK_SIZE); + dest->y = RAND_RANGEF(0, world->dim*WORLD_BLOCK_SIZE); } + + for (int i=0; ix = RAND_RANGEF(0, world->dim*WORLD_BLOCK_SIZE); + dest->y = RAND_RANGEF(0, world->dim*WORLD_BLOCK_SIZE); + } + + for (int i=0; ix = RAND_RANGEF(0, world->dim*WORLD_BLOCK_SIZE); + dest->y = RAND_RANGEF(0, world->dim*WORLD_BLOCK_SIZE); + } + #endif return WORLD_ERROR_NONE; diff --git a/code/modules/modules/systems.c b/code/modules/modules/systems.c index 527b595..899d58d 100644 --- a/code/modules/modules/systems.c +++ b/code/modules/modules/systems.c @@ -142,8 +142,10 @@ void ApplyWorldDragOnVelocity(ecs_iter_t *it) { world_block_lookup lookup = world_block_from_realpos(p[i].x, p[i].y); float drag = zpl_clamp(blocks_get_drag(lookup.block_id), 0.0f, 1.0f); float friction = blocks_get_friction(lookup.block_id); - v[i].x = zpl_lerp(v[i].x, 0.0f, PHY_WALK_DRAG*drag*friction*safe_dt(it)); - v[i].y = zpl_lerp(v[i].y, 0.0f, PHY_WALK_DRAG*drag*friction*safe_dt(it)); + float velx = blocks_get_velx(lookup.block_id); + float vely = blocks_get_vely(lookup.block_id); + v[i].x = zpl_lerp(v[i].x, zpl_max(0.0f, zpl_abs(velx))*zpl_sign(velx), PHY_WALK_DRAG*drag*friction*safe_dt(it)); + v[i].y = zpl_lerp(v[i].y, zpl_max(0.0f, zpl_abs(vely))*zpl_sign(vely), PHY_WALK_DRAG*drag*friction*safe_dt(it)); } }