From bf0182f94550b904d0df14289da16b51736aa6e8 Mon Sep 17 00:00:00 2001 From: Anonymus Raccoon
t|jv*);3;D z?RQ*E{cb=|xxUj904Wy&01FG&6`lo1o;VUn zrCK=J#*MZ@o1y(7z{#(LQ{_*xsdsD-RlL8OEja-F0|5C`+uGSqWgga5Vcit~&2b`GVP4@~- z O |sa80kPZeJ1r3a ziaw0xxw4Gn9Nw}CfHBe;&NFmgV2U(_UeMEpk7C#f$8&No0f1!zwBIc?rwD)E0?@8U zZa6m4o`E7XbJza<4|2BACYz!rOsu5C#?k^L&uM;eIiX?f{>w+XroEh-ra`0N@$o zSwh(1KM;$m`28dnff)B@iW}UbEyNvEekq6cew;^LW0jT<2BFFw$Ng2*(UmIp#Og%> z_(Ma_@jNlSPQ?tZRf&2%eqe*z`Nk#_A&k7iSe4_BR#_LeG0NY_Ql+nFSl(ZR;{2L@ z^n-hj;`=vgvPMshBIXh!0Jg`TU&~%=*A<7JTcY#iFbY44V#gfjl0y0hJu)?ZQAC{> zsmJrI@L1az;@#e6cRp{E?IJF)G9VrR=Dl`{K}J8!ftx0>t@E%=>MpQ5)kF})WAE*_ z6Ctvkc;1dZkaQx~x}MZk>SaIH!x<=!M%(dnzSP%Vj(sWXxUM)MVM)O+B2fVE>v;>E zSOj)wr&wI}>);vUSr%N6)Pj)5=Qijm6rMSree{L(dY``jM{$;@iilvFqd%C|wm!=d z2cYzg3|01{Ox@>psS3T!xERDh+BV+bNVyoQQeU6yuSxw8D&g#Qm3AgZrJjyfX{UEE zQcuS+g6e%GD{~gCo&(=>?%epZ6ac{CUO%G% _#nD`I@=^#9hyyNr`fF@1SqyJn(?#C^3 z?(0@^|E`^md|5?Zn46+A+d91nfSAHq7Jn40;m`sUJxu_nmWC5dNNE=kJIO3FdBT`( zfaEf2f%mCyX#fBZ-$_J4R0#GkAl944bBw6My+V&DgEdm?>s8%Kw#tPdvDnzkv_}_Y zUFwDNh1A}oxxEd%?*n89@nHd#d=$?xA`t~M3V@Ip0)Rv(xo_MTi{0cD*fP=25K|I7 zUnv968KFu;7-FgN=V>0~$8zs@4hul( wnN$GZa T?k$`oBc?qPWomC_atylW=cyi}oXj%~Q{4!KdCxn= znFSLc9TLk|H2H_0cF^GCHX3-;O2>XxYZ1!Z0 vnTbO+x6;haJ!9L;|CqsL$bHB)1lZ5lx@SyZs&A)hQQXa9 zC(|CRqs%?O*lpDfzi}-q?5K~ayqUu110t9*WkOjf7r*V(C^<%^0OAV~lU~-_?&R?_ zPTCXg4bpe&^ZR~PMI#T}=)&U;8h+G9C%&xJ+npRPl Pi8c0-t3|Ps3XX0#>+WA_fN
)H;i0eym;!*g9~?mP zAYlp2WQq#$?EBcno`EzVTIYBHb=@iCW%opphqKRH0AxfG(#y!|EdVGRBm=QPT8NDh z4P=)HK>w3A4sD%#+-iw{)a&fiHa;Fe-BDiECn;PWfNj_(Vu5Wq#x4Noe%HZE5Jv=o z>wx3TI-*{<7Ro`HRku?4xYxdJqqDzlXW)D|OhpuM47Sz$Je_~P{Anidhsez2R}ev9 z-^WD0hX7bYfNkTsbn44GLj<07(#Yd>EebU(0+!&6<#GE>JKyx(h@jY?5&DV@91sA6 zBx44GIadK0jOb_RbLe|%uWhHugMOT$2n*C(05&$Rpnw)%N<9&$cAZYp*uh9U70Fl> z0Iw-P-1z_%Gwi33FWxp$L4J)dP{vS{Lgp8+{qQ<=;^CoiB8oY0gx4PV@iD_2DDJ$U zMR-wjU^Yh+TLk7vDTLw>)fd_%)SU-mE`;3L?zyb+8#4Zy$EVK0C?i>WMu#&+ LPUldL~?azLbmmvR?zg8*gXvOHOEm9^I~PSXEEj^|Yyw+r|oe+S=6q zTPzYW-CMqJa&!e^CYFa`W#pMr8BZ}6!h4I)RDVh4kR-~$luh?Z&P#}M`*ZjgJ_Ps| zT<;}P86rno6t?uOV`~6;1G@(!m4DMx>iA_XZERgeX{X~=>M4gNeKaHWbR=U@0K9zw zBmOJ^tJ{CTnRVU2&<)tIgy&z$=e9BVll!-D_F2oM%QEF8+=KW%l6dTMXPDmhIrU5; zU>5)Y0>C4YCVzwOaL5S|H0e$%FX`Z%b6>a9z}Fo-LSuAB2bIh_5T6rLG%zxulLP&F z3W1IevVagmAdn3N76GsmlLg{wx3$hoO++EPoFjzAQr6|SkQeJ%dK1%5WUR~aat*9Y zS-6(eNrcI}3=uY2%6 fHpu|NV`A)uta+a*}Lz%xE-Z^0r&4Zx$WVs1Np7+-(-O` zeZjij*I<9XQ(?;KQ4K>hjC=%{wxGXZ&_Uio?Z=r`w4>)vB~@HWrKG`aECQ)#!YSgw zMgsYJKYdw? ?fX|6yR3{V_v9jMzZ~yR=!9uIENCb$nk7K#64z zB6$YNi+p&b#3Jjf^jeZf0t&;7GuusbJZQV;+zxRL!RaTCKP<709fRhGkM!HlJH`t% z82! MrNXcDXkxU#@}Q!@ud~HW~R!-|M3TR=Y@@J0?mvkxE1h zLNxH3R_fRDemtvQy${>*EMU#ZGc=N{rp)@T2^T* zzUr~+k5pc_ISr9%4%X#)iFE^O0@f6s9RRBgL=}?bIpO)a^)rK*OT=QD@5Xczx82WY zf*Ya6T#xC4AuPFiYOsS-z5$1O6S+P}w;ZYPEdcvI$)w` J|Cj>6j#o_S?iCszJ3*-LcFMHmrRm7E0RMnY9mPVmhbct> z@Pe4@qeSjwrB_oq>oob?cJgapPX3L)RQzU^MgG`BTfU ??uF(HE>o{iU?^m5t;$7fK24&HO?KOndS2B4xCGB9F818cc6J_8|t3c>KXHE2#4e z=ZqeHkE9bb`9&N{a55pLj#qN=YA(z|%nhfAB=}~6coS?ccoT3gT>Q$wY{D`p<`S4W zt`Daj9DKm}uY11r{ZEHcj@{Wg^mwi||DQw3#pvHQmQOF=Os74cq*2|CWKQgod;`f5 zktl+|!~EBPllRcCs_Fcb4m$o%HCDfp2n4_2#1^d4FC|KaK90VQK99a1b7ZrMIvlDT zN5T|7`sz5mg&`ld`OXOd$PdWpp_BTzQ^MJ82KfiVD1OMFO0FhaM3)z5K>m6-ZpQQI z@ULq*A!kUNbFV#VrdR&C$}_pgi~Lyb`9(Uv;9(a40CRqRH~-^wo+Ex+0q}O%Ep!0@ zX(UnsEOY@txUud=D#Hjpwla`d)X7OrJ2^|V5!R$l1ndF;2P66*@*yAq$UivxFMEve zuk9S;9TLN`z*~*{8MlEj?(69D==<_5MhE~9-?x b{{P5#)U zo0NZ(4~6yla-Ma MMFhZYMg?Z`$^)o}c(*0Q z)-&d`LU^N(4U$Maex|UV2h4dqmO$^A5s9!n?mX+==~13{`Bui98P4PoohFWCL)vo? zBwT3EO_*ky%QejUS&qerUDW+~F*`)zfMl^WBO2c%s@NyTc|=>h&as}|!~LGn+j_=a zH1c#mJM8w}&Zd6T$%wv#!2!Uu0U=6R!jd@l>pgTqx5>$0)mT%|8LdwifCT>5qGLFO zKZ%CS!uXNR{5iO-hu3o0&~ZG3MIh#tP%QvenmZK>UjU$F6;)N%oPVPp`FEbtqy9iB z#k)h8{P<=Z=18u~$^4}oji768m&yT)C5N>R)Lz$E|NWp!3>fb1X*$NUjj*LA`+B-x;jh%5~Ld#gnr z9E1HJ8J6Azv^(<-=z8GV2gXZ1!gqEEAq7&t)B&R%L*B0+%Vz>W0APio?snMgE^TZV zH1^o*{ZsWcBNmT)n27twOAHZs)H7owV@474BD{nvJwl+f2!KQ{@Z9#^$j}yH4@Vsk zNwD`H5We=~6rMVW007-%dDJs*WF>Y?&Jt;wFuu)*w;=K5DCZS?D o!U~ z7tTp 426*6{N|}I!5}N_ZmBim zOquV6mJ`qeX2(Rs;*(Ms-2p2JMt88`uiBYF0M@y~nc<|V<7OUNya_*>lgj&eg#M5N zfcP~!6GjvMAc)?EeG;Y;*mDoi(L~^|?Eh^C4gR*1M_wes7|u`g?LTX->IsCe@HU~5 z#b#tPa)OJwlpOo1*Kl)Ygv7zUM=~p8&U{T-o|n9yD~UTu){*2W%X-kiaSYOP;f!Nz z0^w9WwSZuY^@eGgOgRv0l`P2FU?oMF#{)=ClFUj2GdnGZ^z`cdqh7LyCM7h>mWU}3 z629E`vvkg&L{? 0`H!#I=B@oI>wg8*nN;5#D#cuf~?>4E$}+{h+P{!kWx=)tM4+H!j5c;2i6ARS4F z(*JcAoqb}&lT@8z(xHwRM00000NkvXXu0mjfar(=^ literal 0 HcmV?d00001 diff --git a/include/enemy.h b/include/enemy.h new file mode 100644 index 0000000..50b8d4c --- /dev/null +++ b/include/enemy.h @@ -0,0 +1,18 @@ +/* +** EPITECH PROJECT, 2020 +** my_rpg +** File description: +** enemy.h +*/ + + +#ifndef MY_RPG_ENEMY_H +#define MY_RPG_ENEMY_H + +struct enemy { + char *name; + char *prefab_src; + int spawn_rate; +}; + +#endif //MY_RPG_ENEMY_H diff --git a/include/setup.h b/include/setup.h index c13d581..3fac625 100644 --- a/include/setup.h +++ b/include/setup.h @@ -50,3 +50,5 @@ bool dialog_input2(gc_engine *engine, gc_entity *entity, gc_vector2 pos, \ enum gc_mousekeys key); bool dialog_input3(gc_engine *engine, gc_entity *entity, gc_vector2 pos, \ enum gc_mousekeys key); + +gc_data *enemies_dataloader(gc_engine *engine, gc_scene *scene, node *n); \ No newline at end of file diff --git a/lib/gamacon b/lib/gamacon index 077ce25..88fe62a 160000 --- a/lib/gamacon +++ b/lib/gamacon @@ -1 +1 @@ -Subproject commit 077ce25971e4fd7101f24bd5d5fe535bff2c43b1 +Subproject commit 88fe62af36bd665427f61d8c2ea24e45e472e88b diff --git a/prefabs/combat.gcprefab b/prefabs/combat.gcprefab index 81e5dfe..378e4ad 100644 --- a/prefabs/combat.gcprefab +++ b/prefabs/combat.gcprefab @@ -3,6 +3,10 @@ + + + + \ No newline at end of file diff --git a/prefabs/enemies/bee.gcprefab b/prefabs/enemies/bee.gcprefab new file mode 100644 index 0000000..568bfcc --- /dev/null +++ b/prefabs/enemies/bee.gcprefab @@ -0,0 +1,12 @@ + @@ -32,5 +36,8 @@ + ++ + \ No newline at end of file diff --git a/prefabs/game.gcprefab b/prefabs/game.gcprefab index ef11cd1..9b80bf9 100644 --- a/prefabs/game.gcprefab +++ b/prefabs/game.gcprefab @@ -122,6 +122,10 @@+ ++ ++ + + ++ + + + + + diff --git a/src/enemy_dataloader.c b/src/enemy_dataloader.c new file mode 100644 index 0000000..d40e2e1 --- /dev/null +++ b/src/enemy_dataloader.c @@ -0,0 +1,51 @@ +/* +** EPITECH PROJECT, 2020 +** my_rpg +** File description: +** enemies_dataloader.c +*/ + +#include "engine.h" +#include +#include +#include "enemy.h" + +static void free_enemy(gc_list *list) +{ + struct enemy *data; + + if (!list) + return; + free_enemy(list->next); + data = (struct enemy *)list->data; + free(data->name); + free(data->prefab_src); +} + +static void free_enemies(gc_data *data) +{ + free_enemy(data->custom); +} + +gc_data *enemies_dataloader(gc_engine *engine, gc_scene *scene, node *n) +{ + gc_data *data = malloc(sizeof(*data)); + struct enemy *enemy; + + if (!data) + return (NULL); + data->type = my_strdup("enemies"); + data->name = NULL; + data->destroy = &free_enemies; + data->custom = NULL; + for (n = n->child; n; n = n->next) { + enemy = malloc(sizeof(*enemy)); + if (!enemy) + return (NULL); + enemy->name = xml_getproperty(n, "name"); + enemy->prefab_src = xml_getproperty(n, "src"); + enemy->spawn_rate = xml_getintprop(n, "spawn_rate"); + LISTADD(data->custom, enemy); + } + return (data); +} \ No newline at end of file diff --git a/src/game_loader.c b/src/game_loader.c index 117afbb..8639bb1 100644 --- a/src/game_loader.c +++ b/src/game_loader.c @@ -77,6 +77,8 @@ int register_customcmps(gc_engine *engine, bool map_editor) engine->add_component(engine, &player_component); engine->add_system(engine, new_system(&combat_manager, engine)); engine->finish_physics(engine); + engine->add_dataloader(engine, "enemies", &enemies_dataloader); + for (int i = 0; callbacks[i].func; i++) engine->add_callback(engine, my_strdup(callbacks[i].name), \ callbacks[i].func); diff --git a/src/systems/combat_manager.c b/src/systems/combat_manager.c index f5793db..09dd8ce 100644 --- a/src/systems/combat_manager.c +++ b/src/systems/combat_manager.c @@ -9,22 +9,35 @@ #include #include #include +#include #include "engine.h" #include "my.h" #include "components/dialog_holder.h" +#include "enemy.h" -void combat_start(gc_engine *engine) +void combat_start(gc_engine *engine, char *enemy_name) { struct combat_manager *this = GETSYS(engine, combat_manager); + gc_list *li = engine->scene->get_data(engine->scene, "enemies", NULL); gc_scene *scene = scene_create(engine, "prefabs/combat.gcprefab"); + struct enemy *enemy = NULL; if (!scene) { my_printf("The combat scene couldn't be found.\n"); return; } this->game_scene = engine->scene; + engine->scene = NULL; engine->change_scene(engine, scene); dialog_next(engine); + for (; li; li = li->next) { + enemy = li->data; + if ((!enemy_name && random() % 100 < enemy->spawn_rate) + || (enemy_name && !my_strcmp(enemy_name, enemy->name))) + break; + } + if (enemy) + prefab_load(engine, enemy->prefab_src); } void entity_moved(gc_engine *engine, va_list args) @@ -36,9 +49,9 @@ void entity_moved(gc_engine *engine, va_list args) if (!cmp) return; if (tile->type && my_strcmp(tile->type, "combat")) - combat_start(engine); + combat_start(engine, NULL); if (random() % 100 < cmp->fight_rate) - combat_start(engine); + combat_start(engine, NULL); } @@ -58,6 +71,9 @@ static void ctr(void *system, va_list list) static void dtr(void *system, gc_engine *engine) { + struct combat_manager *sys = system; + if (sys->game_scene) + scene_destroy(sys->game_scene); } const struct combat_manager combat_manager = {