From 54992b90438e4588f6fb63ec3f44be5a00422713 Mon Sep 17 00:00:00 2001 From: Cameron Reikes Date: Tue, 13 Dec 2022 11:05:04 -0800 Subject: [PATCH] Some new UI and orbs --- buildsettings.h | 2 +- flight.rdbg | Bin 2137 -> 2393 bytes gamestate.c | 115 ++++++++++++++++++++++++++++++++------ loaded/flag_available.png | Bin 7588 -> 342 bytes loaded/flag_ripped.png | Bin 7032 -> 254 bytes loaded/hullpiece.png | Bin 497 -> 448 bytes loaded/orb.png | Bin 0 -> 452 bytes loaded/orb_frozen.png | Bin 0 -> 524 bytes loaded/player.png | Bin 9413 -> 475 bytes loaded/rothelp.png | Bin 798 -> 572 bytes loaded/scanner_base.png | Bin 446 -> 329 bytes loaded/scanner_head.png | Bin 212 -> 330 bytes loaded/zoomeasyhelp.png | Bin 246 -> 618 bytes main.c | 71 +++++++++++++++-------- types.h | 27 ++++++--- 15 files changed, 166 insertions(+), 49 deletions(-) create mode 100644 loaded/orb.png create mode 100644 loaded/orb_frozen.png diff --git a/buildsettings.h b/buildsettings.h index 9274935..419f35c 100644 --- a/buildsettings.h +++ b/buildsettings.h @@ -23,7 +23,7 @@ #define DEBUG_TOOLS #define CHIPMUNK_INTEGRITY_CHECK // #define FAT_THRUSTERS -#define NO_GRAVITY +// #define NO_GRAVITY // #define NO_SUNS #else diff --git a/flight.rdbg b/flight.rdbg index 4f73ccc207840f093c6c8acbcf57e159113b41b9..bb1d2c568a8bd6070ec5337e2a3624caf7c252be 100644 GIT binary patch delta 256 zcmca9a8qbPA*1eOM<&(D1+3f~3%i&Y-GMxV$qyI>H|H@MGBJuxUch>#UW9>xAvduy zDK$PRzaqXQKRzY3xTGk*QUEBPTv`;LUX+=lYnNFZpI?;30~B-ek8ll+ck}cKaSf8e zp;y-~Eiu7{XE_LgM8zi{ry5*{X*h{ef$kVg1LdR$@zIH z@j!bs^U}qD-1y@30=?pr#FA9Kg3N-{oXosbz04FwpiJuK5;jRjpxZyPM@?S9F3SZH PWaI!6Fd^f~-W+@Y#=uMJ delta 74 zcmca9bW>nLA!Fp^hm6*fKd=aI{AkTIvCxpw9Vp=mDwd3flNn^ Y;K>Q>ENqM%3=9k)ZUTrq*`JdO0Jj+xcmMzZ diff --git a/gamestate.c b/gamestate.c index c482a4f..00d2a8b 100644 --- a/gamestate.c +++ b/gamestate.c @@ -352,7 +352,7 @@ LauncherTarget missile_launcher_target(GameState *gs, Entity *launcher) { cpShape *cur_shape = res->shape; Entity *other = cp_shape_entity(cur_shape); - flight_assert(other->is_box || other->is_player || other->is_missile); + flight_assert(other->is_box || other->is_player || other->is_missile || other->is_orb); cpVect to = cpvsub(entity_pos(other), entity_pos(launcher)); bool should_attack = true; @@ -360,6 +360,8 @@ LauncherTarget missile_launcher_target(GameState *gs, Entity *launcher) should_attack = false; if (other->owning_squad == launcher->owning_squad) should_attack = false; + if (other->is_orb) + should_attack = true; if (should_attack && cpvlength(to) < nearest_dist) { @@ -532,14 +534,18 @@ void entity_set_rotation(Entity *e, double rot) void entity_set_pos(Entity *e, cpVect pos) { - flight_assert(e->is_grid); flight_assert(e->body != NULL); cpBodySetPosition(e->body, (pos)); } +static const cpShapeFilter BOXES_FILTER = {CP_NO_GROUP, BOXES, CP_ALL_CATEGORIES}; +static const cpShapeFilter NOT_BOXES_FILTER = {CP_NO_GROUP, CP_ALL_CATEGORIES & (~BOXES), CP_ALL_CATEGORIES}; +#define PLAYER_SHAPE_FILTER cpShapeFilterNew(CP_NO_GROUP, PLAYERS, CP_ALL_CATEGORIES) + // size is (1/2 the width, 1/2 the height) void create_rectangle_shape(GameState *gs, Entity *e, Entity *parent, cpVect pos, cpVect size, double mass) { + // @Robust remove this garbage if (e->shape != NULL) { cpSpaceRemoveShape(gs->space, e->shape); @@ -561,9 +567,18 @@ void create_rectangle_shape(GameState *gs, Entity *e, Entity *parent, cpVect pos cpShapeSetUserData(e->shape, (void *)e); cpShapeSetMass(e->shape, mass); cpSpaceAddShape(gs->space, e->shape); + cpShapeSetFilter(e->shape, NOT_BOXES_FILTER); +} +void create_circle_shape(GameState *gs, Entity *e, double radius) +{ + e->shape = cpCircleShapeNew(e->body, ORB_RADIUS, cpv(0, 0)); + e->shape_parent_entity = get_id(gs, e); + e->shape_radius = radius; + cpShapeSetMass(e->shape, ORB_MASS); + cpShapeSetUserData(e->shape, (void *)e); + cpSpaceAddShape(gs->space, e->shape); + cpShapeSetFilter(e->shape, NOT_BOXES_FILTER); } - -#define PLAYER_SHAPE_FILTER cpShapeFilterNew(CP_NO_GROUP, PLAYERS, CP_ALL_CATEGORIES) void create_player(Player *player) { @@ -583,6 +598,14 @@ void create_player(Player *player) #endif } +void create_orb(GameState *gs, Entity *e) +{ + create_body(gs, e); + create_circle_shape(gs, e, ORB_RADIUS); + e->is_circle_shape = true; + e->is_orb = true; +} + void create_missile(GameState *gs, Entity *e) { create_body(gs, e); @@ -623,7 +646,7 @@ void box_create(GameState *gs, Entity *new_box, Entity *grid, cpVect pos) create_rectangle_shape(gs, new_box, grid, pos, (cpVect){halfbox, halfbox}, 1.0); - cpShapeSetFilter(new_box->shape, cpShapeFilterNew(CP_NO_GROUP, BOXES, CP_ALL_CATEGORIES)); + cpShapeSetFilter(new_box->shape, BOXES_FILTER); box_add_to_boxes(gs, grid, new_box); } @@ -970,9 +993,11 @@ Entity *box_grid(Entity *box) return (Entity *)cpBodyGetUserData(cpShapeGetBody(box->shape)); } // in local space -cpVect entity_shape_pos(Entity *box) +cpVect entity_shape_pos(Entity *e) { - return (cpShapeGetCenterOfGravity(box->shape)); + flight_assert(e != NULL); + flight_assert(e->shape != NULL); + return (cpShapeGetCenterOfGravity(e->shape)); } double entity_shape_mass(Entity *box) { @@ -1316,10 +1341,18 @@ SerMaybeFailure ser_entity(SerState *ser, GameState *gs, Entity *e) bool has_shape = ser->serializing && e->shape != NULL; SER_VAR(&has_shape); - if (has_shape) { - SER_MAYBE_RETURN(ser_fV2(ser, &e->shape_size)); + SER_VAR(&e->is_circle_shape); + if (e->is_circle_shape) + { + SER_MAYBE_RETURN(ser_f(ser, &e->shape_radius)); + } + else + { + SER_MAYBE_RETURN(ser_fV2(ser, &e->shape_size)); + } + SER_MAYBE_RETURN(ser_entityid(ser, &e->shape_parent_entity)); Entity *parent = get_entity(gs, e->shape_parent_entity); SER_ASSERT(parent != NULL); @@ -1345,8 +1378,15 @@ SerMaybeFailure ser_entity(SerState *ser, GameState *gs, Entity *e) SER_VAR(&filter.mask); if (!ser->serializing) { - create_rectangle_shape(gs, e, parent, shape_pos, e->shape_size, shape_mass); - cpShapeSetFilter(e->shape, filter); + if (e->is_circle_shape) + { + create_circle_shape(gs, e, e->shape_radius); + } + else + { + create_rectangle_shape(gs, e, parent, shape_pos, e->shape_size, shape_mass); + cpShapeSetFilter(e->shape, filter); + } } } @@ -1393,12 +1433,17 @@ SerMaybeFailure ser_entity(SerState *ser, GameState *gs, Entity *e) SER_MAYBE_RETURN(ser_entityid(ser, &e->boxes)); } - SER_VAR(&e->is_missile) + SER_VAR(&e->is_missile); if (e->is_missile) { SER_MAYBE_RETURN(ser_f(ser, &e->time_burned_for)); } + SER_VAR(&e->is_orb); + if (e->is_orb) + { + } + SER_VAR(&e->is_box); if (e->is_box) { @@ -1920,7 +1965,6 @@ static bool scanner_filter(Entity *e) static void do_explosion(GameState *gs, Entity *explosion, double dt) { - double cur_explosion_damage = dt * EXPLOSION_DAMAGE_PER_SEC; cpVect explosion_origin = explosion->explosion_pos; double explosion_push_strength = explosion->explosion_push_strength; @@ -2255,6 +2299,16 @@ void create_initial_world(GameState *gs) } #ifndef DEBUG_WORLD Log("Creating release world\n"); + +#define ORB_AT(pos) \ + { \ + Entity *orb = new_entity(gs); \ + create_orb(gs, orb); \ + entity_set_pos(orb, pos); \ + } + ORB_AT(cpv(-5.0, 0.0)); + ORB_AT(cpv(-50.0, 100.0)); + ORB_AT(cpv(-50.0, -100.0)); create_bomb_station(gs, (cpVect){800.0, 800.0}, BoxExplosive); // create_hard_shell_station(gs, (cpVect){800.0, 400.0}, BoxGyroscope); create_bomb_station(gs, (cpVect){800.0, -800.0}, BoxCloaking); @@ -2464,7 +2518,7 @@ void process(struct GameState *gs, double dt) if (seat_maybe_in == NULL) // not in any seat { cpPointQueryInfo query_info = {0}; - cpShape *result = cpSpacePointQueryNearest(gs->space, (world_hand_pos), 0.1, cpShapeFilterNew(CP_NO_GROUP, CP_ALL_CATEGORIES, BOXES), &query_info); + cpShape *result = cpSpacePointQueryNearest(gs->space, (world_hand_pos), 0.1, BOXES_FILTER, &query_info); if (result != NULL) { Entity *potential_seat = cp_shape_entity(result); @@ -2594,7 +2648,7 @@ void process(struct GameState *gs, double dt) cpVect world_build = world_hand_pos; Entity *target_grid = grid_to_build_on(gs, world_hand_pos); - cpShape *maybe_box_to_destroy = cpSpacePointQueryNearest(gs->space, (world_build), 0.01, cpShapeFilterNew(CP_NO_GROUP, CP_ALL_CATEGORIES, BOXES), &info); + cpShape *maybe_box_to_destroy = cpSpacePointQueryNearest(gs->space, (world_build), 0.01, cpShapeFilterNew(CP_NO_GROUP, BOXES, BOXES), &info); if (maybe_box_to_destroy != NULL) { Entity *cur_box = cp_shape_entity(maybe_box_to_destroy); @@ -2684,6 +2738,7 @@ void process(struct GameState *gs, double dt) else { entity_destroy(gs, e); + continue; } continue; } @@ -2734,7 +2789,34 @@ void process(struct GameState *gs, double dt) if (e->explosion_progress >= EXPLOSION_TIME) { entity_destroy(gs, e); + continue; + } + } + } + + if (e->is_orb) + { + PROFILE_SCOPE("Orb") + { + circle_query(gs->space, entity_pos(e), ORB_HEAT_MAX_DETECTION_DIST); + cpVect final_force = cpv(0, 0); + QUEUE_ITER(&query_result, QueryResult, res) + { + Entity *potential_aggravation = cp_shape_entity(res->shape); + if (potential_aggravation->is_box && potential_aggravation->box_type == BoxThruster && fabs(potential_aggravation->thrust) > 0.1) + { + final_force = cpvadd(final_force, cpvmult(cpvsub(entity_pos(potential_aggravation), entity_pos(e)), ORB_HEAT_FORCE_MULTIPLIER)); + } + } + if (cpvlength(final_force) > ORB_MAX_FORCE) + { + final_force = cpvmult(cpvnormalize(final_force), ORB_MAX_FORCE); } + // add drag + final_force = cpvadd(final_force, cpvmult(entity_vel(gs, e), -1.0 * lerp(ORB_DRAG_CONSTANT, ORB_FROZEN_DRAG_CONSTANT, e->damage))); + cpBodyApplyForceAtWorldPoint(e->body, final_force, entity_pos(e)); + e->damage -= dt * ORB_HEAL_RATE; + e->damage = clamp01(e->damage); } } @@ -2752,10 +2834,11 @@ void process(struct GameState *gs, double dt) Entity *explosion = new_entity(gs); explosion->is_explosion = true; explosion->explosion_pos = entity_pos(e); - explosion->explosion_vel = (cpBodyGetVelocity(e->body)); + explosion->explosion_vel = cpBodyGetVelocity(e->body); explosion->explosion_push_strength = MISSILE_EXPLOSION_PUSH; explosion->explosion_radius = MISSILE_EXPLOSION_RADIUS; entity_destroy(gs, e); + continue; } } } diff --git a/loaded/flag_available.png b/loaded/flag_available.png index 62d70ff8ebb44da5e5e3a361f45bd99dbe013366..f193c39472a252e1b60258c47e9b5acd184f588b 100644 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^${@_a1|;QfZjJ;}jKx9jP7LeL$-D%z1w36GLn2y} zzx+6#aDss~UrlSi_1yaQMj$v?vWTnM<6o@uj5~a8ZJ&8e*nCdNO#HKZ>x~=CY$~a| z|GiI1{gda|J(ELwp?rdi_yyhP?wnIsOZQ0ryL+d7VV;A`;R6Q_e3%v7r*Sy$%#ULS zK0MO9$tNFj(d3mxOhfCewwK5DCnh8u@F|`y-X$<~8e8ZI90`vd8cgZyu8&nh){+ZtyFL&-LpM|&dagR-(3=M$5M%~GHt4!l%LzhPJ za>@UDcbsm}eSYD-VL-vo&&m^B|GO^=;aznHWNpF~!yN}!Bo{OW9)G~JxbGmVn`|?8 lj}@D^L@AG+!3r5>1`8(Zyax+UwgLl+!PC{xWt~$(6963#j4c2F literal 7588 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 Du4lqS delta 458 zcmV;*0X6=>1MvfpF@LK`L_t(YiM3Y2YQjJeeJg%Ijxp#5SWsd?5IlKmLBV6M^*?&^ zL;Qw71U*PkLP4mZh57*&%`tzF9^#~v(cMiBzFT%@-ZKHAr|V-n9-_uQzXz1eJ)vq8lIP|14FIwT zh>(-&gl*)KrzVZ7ib!&~eT9oILC@B-1Lw5~gRIY0!dBp`BK)vZ?{Jg=!2kRp!j zr-$7_0mZ)2d4K-&Jju$G_kckJL~P5s#LYX9AkTs9UXnN}teId;5l0e7plBV}$N9K7 z+OJn3zQ3Y!5w!cW{6hI!nX^^_nRA|+GJRr9k**XEy9FPTS0xN&Rb&*f)w!)tj1f@i zw$V)@bcWkfqtyU__d?Y=x6Q7)ZnMg`J|Fk_*q1zc6+>OdL1l935b=0kGZVPiYesK& zVR+fVe+uLpf&Y1Ig1IVOkZtglaexFi!CV2r9|uSDZBW*>nE(I)07*qoM6N<$f(zW) A{{R30 diff --git a/loaded/orb.png b/loaded/orb.png new file mode 100644 index 0000000000000000000000000000000000000000..867391a906465ac799bb9051a1d4e2dcf7ba81c9 GIT binary patch literal 452 zcmV;#0XzPQP)1^@s6$I7^K00001b5ch_0Itp) z=>Px$en~_@RCt{2o6T**FbqbSPNY+(@ESUK9-h2LrpQSfsfU69QM8R@Qxs)<@0>uN zo=77^~c z^Fj12#dYCmRndxh?o~wyt@)R36L(gx3ZZ2ms0;;Uv~rgg5#H?wm7#!)7Vg#}!hich zWhfv+0T~L&P(X$PG8B-ZfD8p>C?KPiyL}|bx7H3Iqlde+3Vs9a1TuPAy;blh(nwaV zj$yf16EgftLe6;!Auc(YxkeX~bN0Iq8Ci&{2qB`7DI$bOLM%j>-1aY}5E0RF9PYRM ziDflt%meEx5iG>$XOm?$Xj~?d&Wia> u0MWQfB=;FLE#@5_0yLOj1ONa4O!)!}^9OW14=qdp0000k44ofy`glX(ebAM||sEl;1ZkIV$?%^<_GQc4~FF;0UrMrg5#mR0{&EwwN zt-pS;=0w8(FPYbhHsv!awg@Oq-+f8g?DbjIZEs(_-u&WMm(MY#ee>h)C;!$x*M4oD zcZXzdQwXD?S4W}z6_pAOj>M!rOLy>HTVp=mQ1wrGq1~2wPBCm+6WavlX`Yl@P$K12 zu|#Ecv93~2jN(bzY~jQw9GstT%qY>2Y)KIaPcGJuKJwzW zmKU3%q>F*k_HC{`+0m{i6;zrh@HiQ9pfE114|4(uT&Q2rGRe_{ZK1OYkY94m>&z~d zh5Z-3h5T+Gd-|h3C+OPDke!=v%YXc{ag~|k^4!b&bmQ5kJF8tUxvHfS$}%DHZTRd7 zGJ*}xvKhKgMXn5fqK9_>6=YDGn52IyMzEpyZNV;^OTl$y%b_N^Fl31T+y(0iok&v-xditaXdUFUwB3T@3ZSpg23oy@O1Ta JS?83{1OO7P+X(;w literal 0 HcmV?d00001 diff --git a/loaded/player.png b/loaded/player.png index f437715421048c79d14890e34412a930e441b163..15493652dd4151500bd03973b6b324a9ebe8070a 100644 GIT binary patch delta 450 zcmV;z0X_c3N!tUEBYyw^b5ch_0Itp)=>Px$l}SWFR7i>CR544#KotH`O6xBW99{bp zDhL%?g*Ij{#X)E%2dR@&$)uBuTSW&eEhrgmG86(WSlZRuMR0fOWJ2^g$X%1>u8Fms z{NUh@d++=1y?gHg{|2t(k?VLguq|2%d8L@4N-;z19M?Coh=1Vdskew*7_Q?{@A5d5 zmVs?ia$}updOI?bWR$_l@C_JV!!MFQIE?*BMRuW@8Ues-YnsKE;V5A9x%mzNpz)WK zNB9Sf8~~nM4?;)#_GbFZY(knUp)wON3I>3mPrdlK;`jBnD&Oxk_5sMF2t}Zp8W{zH zlLNrk_MYs4sDJL>p|5wPQG`@kji=H{#b58~T#DQD^)5Q&2>_tkC@TZoqRx1NW}_V9 z3q;^2pEWFRlU|8Dh5rK_q*YT*PxB1A9JGK{^rb~rtYNVPPu{%ccN3;}ySwbb7ASN2eKXxB5 s^z|;^n|S=Yz|r}A;LN%`}@-xiV8TZ+#}ng9R*07*qoM6N<$f{Q)dzyJUM literal 9413 zcmeHtcTiJX*EdL&B1M`=2?3-?NJ3}{z4zV`kdTBBDS;4>4x)l0O?s7HL;+Edc0myY z1f&ZnAX20$9RyV13*PeFJKsC=%`@}8|J^<3BAn)LbUy3zp|+4=P#OIxBj@;bnqfOo}tU;xBGZwvqvfO91y3;0ly zh4mM@%&L9zEXM8(^TcQ8flS`M?ImjTn>wfF@oQoRsdhrQ4jIIr9q-S09=E^9xCRwi zOuD9@7G4mwdJ!Dca`NGD#Y0|Y16=L9zVl;o?bZ@#R&;+n>A{z)8_o6P>jhilVO-_0 zOPVJkg;Cg_+ZaGNQz2}4eCI;BGR55&B2zHc=H90gD&Y?5SN9J>j-zhii&WGP71#K~ z1~l>7>w+J_J}!r1a~qVJFIw(*o(&Ht2ykxM%gdhK&N@qeC~1s85r=(1yxUyU%6q!~ ztta%P^)RdQQ=Y+sLE^~d*5rQNy{pFElc7Jm6r#6(+s>PrA&j8DrZ0cl|M=|dGgs>& zb>QfV-Ke|R68pHHS3$jG)I;Iy!+3`K12&%@nZCOjY^30^VdZc~IZj;5&IO8h-uqR3JifFTSmo z=lG!a=L*fYF>CMsw0c`8ctd8wPy<$`(iqFra6~Edfb2zU>+#5MbQfZ|F`oDJoqzBa z>g>l;5?DbFT=0*4#6V>VW}p{uW^BRbJYKPb`DLsBo z)@;tqp|q4)!!A<7LRXmOI0Q%#AVa z2P{#H4pb>sSs4$VSf1gB^!Y3z@A^Gfb<^~}meP?1cXY6l{aiO?Y?YR*NA-;{AYJ)U zf|U-1DuEgh(jfv&_^tLg_AVb(EWG ziG8!49?iFSQPgK`JUBfC+hhGu8c^TqW0Qv+qg`77vJ48De!G<4w*3?}nZmu*&uXwH z*u7o#Jd;DXahNALM%OQ{MyXP-`eh58dK@?WU2vbldR!~pSSt5D*yi*|>DI>#AOdW=xab%(8WOrJx%&l8ruVm&1M z_4N^_Y6>TIFNel*K*n7@C@%2+nYGyGgYPjZjt<|Ko*%Uo9qP?+UhtCRoRriu-M_1D zTM*e&Ue$I&Rw}5OwF`7bn^a28vs!pnuzW-7WmzwOVvC6OzDyP=RUsX~#!2yIgF4< zZuK({%4r<2Os!$=dbY-o&fb#g;g$*7=EDjj`$I&>EI@Q(WtMg3*$R76eYQdEGM-|d z*Cg9=$1(yPFO;LFqm~)?QH!;)zC%@dvkYNmv!QV#l3P83erX3417!&E`ZDD>|6z9_ z)#KO_UTc%r4YFgJ4=1uN_?B9_7cU7sIitl%Gt|w~Y=V_OHgdbN8j^%walE0^+i#GG zov>Trsh4tfc%;MnWG!=u?)}z%Pid3Jyn4~M??eug2|55gCG>Xo^%zs@!mG3&nI~#% z`m0o@sR%s6g$xY(iUsrj{_ZrRjjo}wl)srthIEhQWE6b{i9#+ipHq%-Du@xsr24a$ zi?~y`f%}@;a&F6Otsy0J9upT zvD+@LvqPxR^gG5f;~IYj{X5 zY>P1xmDH=DOhvu^(eO^EM-PBSM5k#-$!66!C%C6cp^kGJup=LWu+)3iB`sR<)Z)G? zc`(uX>SkVtSlPO7r#h{1-RE58?I0t+Fe$HT{pNZJo&EKKt*6;H zxwI9fN)g^s-MdFFHqMmV42CtsA1}3;79CU-m}ffvMD)7ri|d@nd4z|BG4niK}LP#?|7 z$Mdh$r*&xqG#vt|dBckj=SF$T{@I{lr zu?tt3y|C_#@6Yqv!>p#x09|GR0e9*IXviI3kHm(c8F7MUyxHp=pZ0Wj>dc$$RR&qA zI_vVCr?uZ*yYgzWP}q2U@8<1LN2pcC-HQT^x3Mz^F`%i4&31q;_$U_<2AYXQo zDSysMOn_c8+b+1mR_2C(po(Lakd}X=A9p~c?fqd)iBp`2=cg5}qK!sXmRlD`1+2)g zb{eaDc$5^t%zQ6D^j2!483Z?aZToKC2~%9LWEX)n_?433vrdNgL)B2eBWnjnh1X~feNsDm)I-&)4hao9`KCU^w>ND?lcm6)@miOeD96Khy!XXRdX2rvppX`dsn zBFkRzbX`C4_FCdQA87h;ro`xNs6a?JcXFu$wWtd1ODng;yGX$r4b{l?kA7_j-lV1FC2wfU^7jEw7rmu+6%o0t z6-u|rVofEySi>e5GB4d{0;25!K1kobu?aD_Qyg_iy)XWTd7G~-DmdN;6|7gcaL&$o zJmPBQ-Y0O@d31eOhPO!}Gwt23@U(t@fFHj8cw3 z_cS^4Z3Sr^i;Pe%i%?RjZ*Cy`CJTtLU!(sXn(#ob&RUpHeuf+!gs&DucMDxbY56%{qo zU*^Kua;q)-hOl`Ya=g=W+@2x&8JWeXZJq@Bu}%FJLf5ZRx>TKO?pm?fDoa`n+I-kw z`)NBsOU%)VC$x+^-fh_l%kc6N6@1K(>2353Rj~X|-dTaMWNO$wJk6ZK8Ag|cE4K4K z(DC-=&sUWU5vd&MyKxz}F4@Q(9O|-)e0p%j(lc7Ncmn!aL#RIy;NRUmPf_mO$IE;} z`GPC3N#M;Ow(>UmVpVrg z_t0&T!Kt%^dU56#+x;a5dtjx-WSSPt#Ld{sE;Zuha=b;~G$`tnE zkW@DEg*;CvG=|GLn%R#aWVFQL-7rI;+B>sj#vMT>i{#<9w@SEgXNP`u9#=1*VY>9L z?wL!H0E06}R&`P3C~{VqC-T7ZUy;V@eW(HKrUm}=N_MNZP+x;+p^D@n(rmnW%ln1bw=BDzmTaoPbE(kF?|KJQ zt7&bg;}w4>KFl|I5}!{U$v!e=WUWQ{IDtT!KxZ}W(B2gQYRvb8JBB9P!j)L*5sj?$ z`<-QEvg+1WsN75B?{M`VxTlkXw4iGOWK0&5^N%5+P6h2;9y`23KN*1;G_1ArN#l;% zKk3eu8FDNZP(Jd{P{5|BjC8v5xIg}OVYywvsd6$d#_?T>_q50e5Imrm11%)yZBF>s4$~9Gg8f*D z+D*5WIPjOt<<&f}pk+Kb%RK|XGDvpC(L0dNQ0J~(^P*fTKFsR7%EOOYeZM9;>0@aab8lWEz2Xh!=-#rEIm#7nbx zM#>K}D>cCEwjwQ*jGtJBc2t*#V2=9<+SH2i`7CrSUmiwMk3RlP#it?{-Lw+Hd3S2< zz29J5bl%`(GbWIMo^79tv88>paBM650<$<*Lcp!a zbQ9AS;gzc5_4%$^(45;956-srXJMnAMjvZ^B7xEUcf!JIN4nwzzofsr{XuqMg7(`7 zG0`Wg(fyz5L|ZtQK8=(#FTu|W7R6p(V+kQN>3w^y=K9KvmhR}YcrYbRKE0>&(i@@G zkj|nFHGj|OTBO@kZf*US`rW%aa6e1>!S-#(turpBMjE+A>*_ppxjHu4bo!1=Wg=k< z4m-w8>Aui(`Wkrr6~OxE4hO%*frQ1qR{}Ep|WjTN%UZx7SS?-jM zfRZBK6>>6SCxGn^+w{kwEwpED_M5FbjJc`bjqrNHC!J{>$v|PS^3hD>t8xgj?^6&6T_9 zXYomJ$mG!zZq}`;9J^>rcV_Fzwqud`@2C@VJnWOUO%wYB`;*bmxr-|jLvh<9LeEW8s^j>5YreO4njD4A)4Z6p zY^|1{;cTjXB0l;Xwy3#fg@Vh{&qm`yH$~`ZGsOKu@=aiF>KtudK&s-M#->PqTAdL3 z^{$m?tUYCYs%jMmB~9RjZu#UAxg0ORAYjzpd^_8Xd~f2h-)0or;kiFq1$&DvqsP!L zoT)WFi60hRoM*3{bQ@#%%`=^uRx%^!zUqd98J9>JG$zO!J1E9)usgOC>{pm_hn;ft zd#Zkb9OWyAqO(1}r9r*|R{J50YqFYU%9Ev)i!-Uu4>4=axl5t&k8J(w^R?LMy8&M) zB#IIYFAEr|v!*wy9+s%Sr>- zZpm_*Wz~1pI75~BW#!KoR^p2&gV`p#%+|REXlsRdfb^C7z0tdySq+ElqWlVPFbTP% zsax+t2D>C|uD>sGl&iWaA-a&eC>0ZU=%0 z{YTwRexTA9;i3_>$))jWF<+MiJmj;d2@<$*8hh-szKS=>8I_;+70p}F_Xy`&R{4xt zS3;{=I9ny>If)Vu7Grxy6^uu;Mkh%ca?vl9v)O9cSEyd*Eg>sL#D{bq&JLS!b~rwfx#~RQu}DJ5@!D1X5Z>ivoumH3YwGV`Ca=W3VYYgN;6_JNj|xzj#xa`s+h|x6g9^@nP~= z1NrTSdkLN=OtT!cIb-RsoXN<@Z{svHO!YK0{yh03o%iL0-dECXSLKSDDb?2!kMw6Y z>o(1m&}H{Y5$9-A$6c;nbtbIvOXGCS9eAk5BX6qQv!da|I`TSDscq794874C($fDa zDOP)DD}J8u7GH1)PFvW9FX!aF$ifYR?LyPb+ovC;uV}<$Z5g+H`*APb5~%-LNvHk(0+?a3E>(IQ7YB$J7D~KD zdqF0}?8a@{HEyv>=0v`oO(un7p++^U!E{H;5@_Y$os;Qobc|mg8AVW8ydXaxB0vqDHxPik_6yMd1$FigEk1<5o3Poap6KIBvCi-Q-{iowfAE!s&*N3~?AN?S22_?L?3a~0C z9nt#ZNJp`@MurF!-cu5Z#=Br713bM+N3~>RiYfu#NR&H<2ynq*ab8Nmjpi3X01mAL zw2?7_7Ykpa67Y0< z1R9URp%K3x<>lq2WS|%{2;%CB0!hn3r9kph(r6G&ULJ;qO36XdQ0U*F^t^nDNG}xT z6p92ci6h}aU0smUG7vcs#04n}l7>NCKyW!16bL1aA=$&^ATrW2e}ga~;7C=8^!U41 zr%-4T6b$7m1H(XFKu{@|97x&)Dg%;7OF=;>h?Fb@f^tQxbR`*(<^awMjlb^upDs(BC&q$^JmnKAD+iI6 zg~K7zaxyS^Y1n_1tT6;%QZ1gMLLrhcsb4*(i9wLUAyJDwtyB`gFF7e1ga!eFB;pB{ zc)W)a@YE^5spVhYMx+UaMiP;lNFs&=3XzgRKu<4ACqnoLP5|ja{om4 z#k&%(BMBHaEQv=FSEK^{#T7vGk5q~MQ~$af<}?o^%1Bj0y8faJ2>v5j@ac;2XS9mo z|BDaBUkZO)Vn}ws%ScNXX(a^zwG{rr*Xg43zu5lB!~fz4Bm#%;5`mY%H zuay6-u7BzJuNe5Rl>e=+|8I2B{bw_U@gn^Kx=z|EDQFKck+xaXE(SW9zcyTChZ@b{ zq^Gmqx^})~Wc24xZ*sD%oYOzh&=B>Ev}hI?7+CowPy_6rNtRqn|tBC+naSoJ&A#{n!Z?zVZa34E>(bUAMVhz&q;GxZ!$oqHu}RnX>nI`pWS$ z-Iyb}N77wi&U3g(h$;U}yfM4!K#ewVm`}Px00#VxoF{3tJQky^$2 z0wggv=83SHy8=^W6tb5;AoOKt|EoJ57bI;In!ZEkdO~6w90pEB>lZh$$_x_{H*YKT zu`V)6i41AIuFeZTUTS^YEnG>{@K=V4OJ6O6Jt$CJc)Pjg_-Z61oVC815)Qg6x0N@=R` Tdeu5%rzz0WGS;k8caHo&&d>^1 diff --git a/loaded/rothelp.png b/loaded/rothelp.png index f0d165804deea0b5b89b37fc4ab6e693f6f3f3a9..40c1b8aa50c73c3a51462433543096231f9b815f 100644 GIT binary patch literal 572 zcmV-C0>k}@P)002t}1^@s6I8J)%00001b5ch_0Itp) z=>Px$_DMuRRCt{2**k8+KoEf8A&LZ|Kr#{y9EF2Wak^AFNRE;;k&NU5LFE+DBD~)B zt{n&duZ->W%w(TN1ONa4000000000GY!-9#e6eg->&kmyQ=jB|IY+f!(ok^*-5C1v z++cDI9jEt()Bs`w$u<&Wo-9^u}ZEEp4ngtru*K`Wj4qF4dTEzLX3=MC5uo&zkyV z{JZP9RHk-w;#{pOnJ<>D=^10Oa(jjz$oJRhpmWxJ`#Etcwqe?9)YPj|htPbnY{y;= zQ{xQDx!3S!yX$npzuq&A#Z)kTL>PzRy=N$tNLZeoV(Al`X*@qNJzu>Zudatvde#1L zG_EAd$NO86p6Yu~%KLuvt*q^Ohhb@sh%3b*|Th$vq$C2w^J;A zj>HR#Trk6<)0?X==IcjMb)f=p#(1l+{xoeKasJ&RMq8 zc#1KX_7bAMXNf##!F(SLoU38Ut;2o6rn-ywd)YUBXJ^K5UlzadH0000000000K=}b#g=;xk=$qgG0000< KMNUMnLSTZ0%MUXE literal 798 zcmV+(1L6FMP)Px%*hxe|RCt{2nNO0VAQZ+QQ6Lwzt7REgq9wGG+y1V2zmEn} z*R`>|swxlD=MWjAB*z-yRpVR%6-B`&2g_9y1+xWvHvc3>DJ4k@LJ0Zw^+iI6%{UBv3V%)01m&s6V4QJfS$b_K%d%9Ts624RaL8ZVwn2I7 zZPr(H?;B_S|Lt~Dn>VkD$905ge{?AZ|K+*m&tW45i@ z=IAE$6*Zyx3+i_$Pn)Cpqp>Io8plyqRkeJDkK;&0-%o7{NZ+EE?iZg*BJ%I8|K!uh zDfc$?ev7}5JXZ$yf)qj!=bZY!mz;Cf_x;9@LAd2_!;>}&oJcsUk-Z1yljq8wPoV0S z#bnGToF1I^3OoC{a0%zKv)6AgPn9IcvA)8E_Vw|%H{(>hv8BO8j-A6MffS2CfNzy- z=k(dOTn3yqC=vO84VuUy9HU7jDW&?VEbSS5emg(mmo%b$Gj1iGsXdclYgtGwXma6{ zVm*tr=|cI$vlY|izOu|XO*~^4N-y4N^^GWlZ~-f5%1@zW{d_rm9!In~+lo4=2t6A+ z+n4#ezZRmNrZbopY(VBSQD~7EfC(}{q_m7e zi$nn(15m^z8+@9W7zct4q~jzc1owA;w(JMq@cf88KcceY6vPR^5J8-fc*=^8^-PF6 zZis=m0Dx!TFjE6r2LK-T8?G0ZS*rM62%R*`QC6Io=SN@5v41Clco#{mHR2X=;FH7# zrX35S=SQTQL>8B8954Vp(zoiQo4hP{+J!{aE?4n1nB_4_tz($ANxX>;$*<>ei_aiIdnSRL~utoo1<8&kN20#wU|6z zi%fczE`z9x=UF21ED`=-TH%=+EpNmu(6DLXmhG}br<%ERPF+}_r>T~7HgUXw6(>{% zMUBJJ~|X!GGzzPre(j|v=TQ>0N`|7u$#V$rhztrP0=m!Z}9g9jge}b z7B2r+4RrB3fi|39H@4;W%(teCxXCfEG>WCV;|guXbuMX`T5O8Ch&S~NM-%i4nU=rL zEm8hxd6tMJ&xDXcu(oMQPyN(wqeWTR>15#@5o)CvbjXD4T002ovPDHLkV1i;R B!0`Y8 diff --git a/loaded/scanner_head.png b/loaded/scanner_head.png index daa50e21f38696a0173fc50ec1a9eef8fb07c82b..c14f9fdb8c7517b10b8eb645a4568b0c2dfc672d 100644 GIT binary patch delta 291 zcmV+;0o?x70m=f9Fn<9ANkl_741KMd?`H2c4|(Tr^V{u3`ygKScm(|=^};m)T2AMR`-oB#j+|NoQ1oc=Q~ zKqEQ5CV-fbAPJzD`Sa4G|I`LQFHQQ-zyK|aX0~i#&@Bq1st+#rZD3$vKuSga!L=ln pl7zs-; zF?~pzI<`4L%CxDTRlpP>uq;;dbu&C3%z!cGf9j^!q{>rOc^W*|O|MzGcbR?-U8$if zgJ((dE)&28;B+}e|H!O!Y`tO|TQ7hu!1G?PJG-bCd>#b=$tASdAFoPx%BuPX;RA_A86f&Bp^(9RKXIIB!t7n|i0w@r%!U`ANr?ezr!&^bL@sDqn}bN^k{ z#v(c*UBHh-pPWRWYd)fZN_7NIDfcJ)Lu3wWVZJ;g)TzpvRvKuWZX9zV8e(Qm4&E(1 zTwn2a_XM|>y*c6P-hNc)QEQtAenm2IdxFx280la*wgF)O=oszp2>_seaLAtS?`FQg zK0b&{F_FFR8Dp}6ipHTc+gc%7u5J78mBubc&T#Hg9i*sj8Kk-f|065!plp*#g++5} zQeEJ8986OFB`zJa9-`9Ha_KWD%9mlh)FVJCe|ApKB6sDbJ1EMR9$WPtG@31~JSfPY zv4@1EhiFv3963WYnk{X60f&`NKABvDIz>Vz9n^sw%sRhP$s{2Ql}r+pDjDyfEkY|q zgNEXaCXtJi7jb*pgVVPoziZ8))3^P~By@UDO)l7`LaAC~5eIDmv-hHW;<_wvMEmTH z$Cys00DxRR2cu9(UCwLcd@6AbU@SLhf8x5x8wR&c3nOR9d`~uPvP?Hc@l;`FQ{B zU%nJs-IwcMvCX}Y4C4Jf@FB|tJx^2BYq4t;fx0V0ah27e$KmAxdamage; - } - - set_color_values(0.5, 0.5, 0.5, cur_opacity); - double margin = width * 0.2; - double bar_width = width - margin * 2.0; - double y = height - 150.0; - draw_filled_rect(margin, y, bar_width, 30.0); - set_color_values(1.0, 1.0, 1.0, cur_opacity); - draw_filled_rect(margin, y, bar_width * (1.0 - damage), 30.0); - } - // draw muted static double toggle_mute_opacity = 0.2; const double size = 150.0; @@ -1289,18 +1273,19 @@ static void ui(bool draw, double dt, double width, double height) } // draw item toolbar + double itembar_width = 0.0; { double itemframe_width = (float)sg_query_image_info(image_itemframe).width * 2.0; double itemframe_height = (float)sg_query_image_info(image_itemframe).height * 2.0; - double total_width = itemframe_width * (float)TOOLBAR_SLOTS; + itembar_width = itemframe_width * (float)TOOLBAR_SLOTS; double item_width = itemframe_width * 0.75; double item_height = itemframe_height * 0.75; double item_offset_x = (itemframe_width - item_width) / 2.0; double item_offset_y = (itemframe_height - item_height) / 2.0; - double x = width / 2.0 - total_width / 2.0; + double x = width / 2.0 - itembar_width / 2.0; double y = height - itemframe_height * 1.5; for (int i = 0; i < TOOLBAR_SLOTS; i++) { @@ -1394,6 +1379,24 @@ static void ui(bool draw, double dt, double width, double height) x += itemframe_width; } } + // draw spice bar + if (draw) + { + static double damage = 0.5; + + if (myentity() != NULL) + { + damage = myentity()->damage; + } + + set_color_values(0.5, 0.5, 0.5, cur_opacity); + double bar_width = itembar_width * 1.1; + double margin = (width - bar_width)/2.0; + double y = height - 150.0; + draw_filled_rect(margin, y, bar_width, 30.0); + set_color_values(1.0, 1.0, 1.0, cur_opacity); + draw_filled_rect(margin, y, bar_width * (1.0 - damage), 30.0); + } if (draw) sgp_pop_transform(); @@ -1671,7 +1674,9 @@ static void frame(void) PROFILE_SCOPE("gameplay and prediction") { // interpolate zoom - zoom = lerp(zoom, zoom_target, dt * 12.0); + zoom = lerp(zoom, zoom_target, dt * 16.0); + // zoom = lerp(log(zoom), log(zoom_target), dt * 20.0); + // zoom = exp(zoom); // calculate build preview stuff cpVect local_hand_pos = {0}; @@ -2250,13 +2255,31 @@ static void frame(void) } } + // draw orb + if (e->is_orb) + { + set_color(WHITE); + double effective_radius = ORB_RADIUS * 2.2; + set_color_values(1.0, 1.0, 1.0, 1.0 - e->damage); + sgp_set_image(0, image_orb); + pipeline_scope(goodpixel_pipeline) + draw_texture_centered(entity_pos(e), effective_radius); + sgp_reset_image(0); + + set_color_values(1.0, 1.0, 1.0, e->damage); + sgp_set_image(0, image_orb_frozen); + pipeline_scope(goodpixel_pipeline) + draw_texture_centered(entity_pos(e), effective_radius); + sgp_reset_image(0); + } + // draw missile if (e->is_missile) { transform_scope { rotate_at(entity_rotation(e), entity_pos(e).x, entity_pos(e).y); - set_color_values(1.0, 1.0, 1.0, 1.0); + set_color(WHITE); if (is_burning(e)) { diff --git a/types.h b/types.h index 03c0fd3..831668b 100644 --- a/types.h +++ b/types.h @@ -33,6 +33,16 @@ #define PLAYER_JETPACK_ROTATION_ENERGY_PER_SECOND 0.2f #define PLAYER_JETPACK_SPICE_PER_SECOND 0.08f #define PLAYER_BIG_SCALING 300.0 + +#define ORB_MASS 4.0 +#define ORB_RADIUS 1.0 +#define ORB_HEAT_FORCE_MULTIPLIER 5.0 +#define ORB_DRAG_CONSTANT 1.0 +#define ORB_FROZEN_DRAG_CONSTANT 10.0 +#define ORB_HEAT_MAX_DETECTION_DIST 80.0 +#define ORB_HEAL_RATE 0.2 +#define ORB_MAX_FORCE 160.0 + #define SCANNER_ENERGY_USE 0.05f #define MAX_HAND_REACH 1.0f #define SCANNER_SCAN_RATE 0.5f @@ -62,6 +72,7 @@ #define EXPLOSION_DAMAGE_PER_SEC 10.0f #define EXPLOSION_DAMAGE_THRESHOLD 0.2f // how much damage until it explodes #define GOLD_UNLOCK_RADIUS 1.0f + #ifndef TIME_BETWEEN_WORLD_SAVE #define TIME_BETWEEN_WORLD_SAVE 30.0f #endif @@ -115,12 +126,7 @@ #define flight_assert(condition) __flight_assert(condition, __FILE__, __LINE__, #condition) // including headers from headers bad - -#ifndef CHIPMUNK_H -typedef void cpSpace; -typedef void cpBody; -typedef void cpShape; -#endif +#include // unfortunate but needs cpSpace, cpBody, cpShape etc #include "queue.h" #include @@ -247,7 +253,7 @@ typedef struct Entity bool no_save_to_disk; // stuff generated later on, like player's bodies or space stations that respawn. - double damage; // used by box and player + double damage; // used by box, player, and orb cpBody *body; // used by grid, player, and box cpShape *shape; // must be a box so shape_size can be set appropriately, and serialized @@ -259,8 +265,10 @@ typedef struct Entity // for serializing the shape // @Robust remove shape_parent_entity from this struct, use the shape's body to figure out // what the shape's parent entity is + bool is_circle_shape; EntityID shape_parent_entity; // can't be zero if shape is nonzero - cpVect shape_size; + double shape_radius; // only when circle shape + cpVect shape_size; // only when rect shape // player bool is_player; @@ -288,6 +296,9 @@ typedef struct Entity bool is_missile; double time_burned_for; // until MISSILE_BURN_TIME. Before MISSILE_ARM_TIME cannot explode + // orb + bool is_orb; + // grids bool is_grid; double total_energy_capacity;