From bbbf85997302f1db74fd94593e916913f9b1ba26 Mon Sep 17 00:00:00 2001 From: AnonymusRaccoon Date: Tue, 3 Mar 2020 17:32:10 +0100 Subject: [PATCH 1/5] Adding a teams system --- CMakeLists.txt | 2 +- include/components/teams_component.h | 21 +++++++++ include/systems/teams_system.h | 12 +++++ lib/xmlparser | 2 +- prefabs/game.gcprefab | 14 +++--- prefabs/teams/forgot_register.gcprefab | 8 ++++ src/components/teams_component.c | 61 ++++++++++++++++++++++++++ src/game_loader.c | 4 ++ src/systems/teams_system.c | 45 +++++++++++++++++++ 9 files changed, 160 insertions(+), 9 deletions(-) create mode 100644 include/components/teams_component.h create mode 100644 include/systems/teams_system.h create mode 100644 prefabs/teams/forgot_register.gcprefab create mode 100644 src/components/teams_component.c create mode 100644 src/systems/teams_system.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 943eae8..9470331 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -211,7 +211,7 @@ add_executable(My3D lib/my/my/my_str_replace.c lib/gamacon/src/sfml_renderer/sfml_init.c lib/gamacon/src/sfml_renderer/sfml_events.c - lib/xmlparser/src/otherget.c src/options.c lib/gamacon/src/components/input_component.c lib/gamacon/include/components/input_component.h) + lib/xmlparser/src/otherget.c src/options.c lib/gamacon/src/components/input_component.c lib/gamacon/include/components/input_component.h src/systems/teams_system.c include/systems/teams_system.h include/components/teams_component.h src/components/teams_component.c) add_compile_options(-W -Wall -Wextra -Wshadow) diff --git a/include/components/teams_component.h b/include/components/teams_component.h new file mode 100644 index 0000000..23b749f --- /dev/null +++ b/include/components/teams_component.h @@ -0,0 +1,21 @@ +// +// Created by anonymus-raccoon on 3/3/20. +// + +#ifndef _TEAMS_COMPONENT_C_ +#define _TEAMS_COMPONENT_H_ + +#include "component.h" + +struct teams_component +{ + gc_component base; + float next_teams; + float delay; + char **prefabs; + int prefab_count; +}; + +const struct teams_component teams_component; + +#endif //_TEAMS_COMPONENT_C_ diff --git a/include/systems/teams_system.h b/include/systems/teams_system.h new file mode 100644 index 0000000..ee190c3 --- /dev/null +++ b/include/systems/teams_system.h @@ -0,0 +1,12 @@ +// +// Created by anonymus-raccoon on 3/3/20. +// + +#ifndef _TEAMS_SYSTEM_H_ +#define _TEAMS_SYSTEM_H_ + +#include "system.h" + +const gc_system teams_system; + +#endif //_TEAMS_SYSTEM_H_ diff --git a/lib/xmlparser b/lib/xmlparser index 959963b..5028a21 160000 --- a/lib/xmlparser +++ b/lib/xmlparser @@ -1 +1 @@ -Subproject commit 959963b7a830ce198f208b8cc43d24a5fa26ad13 +Subproject commit 5028a210a2b30afbea128f47e3030b4da84f0271 diff --git a/prefabs/game.gcprefab b/prefabs/game.gcprefab index fb7b8b4..debbca9 100644 --- a/prefabs/game.gcprefab +++ b/prefabs/game.gcprefab @@ -22,16 +22,16 @@ + + + + + + + - - - - - - - diff --git a/prefabs/teams/forgot_register.gcprefab b/prefabs/teams/forgot_register.gcprefab new file mode 100644 index 0000000..64fbf31 --- /dev/null +++ b/prefabs/teams/forgot_register.gcprefab @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/components/teams_component.c b/src/components/teams_component.c new file mode 100644 index 0000000..04555d2 --- /dev/null +++ b/src/components/teams_component.c @@ -0,0 +1,61 @@ +/* +** EPITECH PROJECT, 2020 +** Twac +** File description: +** camera_follow +*/ + +#include "xml.h" +#include "component.h" +#include "components/teams_component.h" +#include "utility.h" +#include + +static void ctr(void *component, va_list args) +{ + struct teams_component *cmp = (struct teams_component *)component; + + cmp->delay = va_arg(args, double); + cmp->next_teams = cmp->delay; +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + struct teams_component *cmp = (struct teams_component *)component; + + cmp->delay = xml_getfloatprop(n, "delay"); + cmp->next_teams = cmp->delay; + cmp->prefab_count = xml_getchildcount_filtered(n, "prefab"); + cmp->prefabs = malloc(sizeof(char *) * cmp->prefab_count); + n = n->child; + for (int i = 0; i < cmp->prefab_count; i++) { + cmp->prefabs[i] = xml_getproperty(n, "src"); + n = n->next; + } +} + +static void dtr(void *component) +{ + (void)component; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct teams_component teams_component = { + base: { + name: "teams_component", + size: sizeof(struct teams_component), + dependencies: (char *[]) { + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy + } +}; \ No newline at end of file diff --git a/src/game_loader.c b/src/game_loader.c index 4203767..4ebb9bb 100644 --- a/src/game_loader.c +++ b/src/game_loader.c @@ -7,10 +7,14 @@ #include "engine.h" #include "setup.h" +#include "components/teams_component.h" +#include "systems/teams_system.h" #include int register_customcmps(gc_engine *engine) { + engine->add_component(engine, &teams_component); + engine->add_system(engine, &teams_system); engine->finish_physics(engine); engine->add_callback(engine, "start_button", &start_button); engine->add_callback(engine, "options", &options); diff --git a/src/systems/teams_system.c b/src/systems/teams_system.c new file mode 100644 index 0000000..7a19344 --- /dev/null +++ b/src/systems/teams_system.c @@ -0,0 +1,45 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** teams_system +*/ + +#include "entity.h" +#include "system.h" +#include "sprite.h" +#include "vector2.h" +#include "prefab.h" +#include "components/teams_component.h" +#include "systems/teams_system.h" +#include +#include +#include + +static void update_entity(gc_engine *engine, void *system, gc_entity *entity, \ +float dtime) +{ + struct teams_component *team = GETCMP(entity, teams_component); + + team->next_teams -= dtime; + if (team->next_teams < 0 && team->prefab_count) { + team->next_teams = team->delay; + prefab_load(engine, team->prefabs[random() % team->prefab_count]); + } +} + +static void destroy(void *system) +{ + (void)system; +} + +const gc_system teams_system = { + name: "teams_system", + component_name: "teams_component", + size: sizeof(gc_system), + ctr: NULL, + dtr: NULL, + check_dependencies: &system_check_dependencies, + update_entity: &update_entity, + destroy: &destroy +}; \ No newline at end of file From 075d01b9ff73a4bab4a7a2b16a6922a1e8ae803f Mon Sep 17 00:00:00 2001 From: AnonymusRaccoon Date: Tue, 3 Mar 2020 17:35:22 +0100 Subject: [PATCH 2/5] Making teams pm at the right size --- lib/gamacon | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/gamacon b/lib/gamacon index 9a18233..424af2d 160000 --- a/lib/gamacon +++ b/lib/gamacon @@ -1 +1 @@ -Subproject commit 9a18233a812e7131fcc65384b759edda3645df17 +Subproject commit 424af2d6bedf9f2af266e2b701e32fe74354f438 From 27950654f0ef61238d5cb5a3560fd652a372d73b Mon Sep 17 00:00:00 2001 From: AnonymusRaccoon Date: Tue, 3 Mar 2020 18:22:13 +0100 Subject: [PATCH 3/5] Starting to make the team's ui scroll --- CMakeLists.txt | 2 +- lib/gamacon | 2 +- prefabs/teams/forgot_register.gcprefab | 12 ++++++------ src/systems/teams_system.c | 11 +++++++---- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9470331..85ac696 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -211,7 +211,7 @@ add_executable(My3D lib/my/my/my_str_replace.c lib/gamacon/src/sfml_renderer/sfml_init.c lib/gamacon/src/sfml_renderer/sfml_events.c - lib/xmlparser/src/otherget.c src/options.c lib/gamacon/src/components/input_component.c lib/gamacon/include/components/input_component.h src/systems/teams_system.c include/systems/teams_system.h include/components/teams_component.h src/components/teams_component.c) + lib/xmlparser/src/otherget.c src/options.c lib/gamacon/src/components/input_component.c lib/gamacon/include/components/input_component.h src/systems/teams_system.c include/systems/teams_system.h include/components/teams_component.h src/components/teams_component.c lib/gamacon/src/components/tag_component.c lib/gamacon/include/components/tag_component.h) add_compile_options(-W -Wall -Wextra -Wshadow) diff --git a/lib/gamacon b/lib/gamacon index 424af2d..42743e0 160000 --- a/lib/gamacon +++ b/lib/gamacon @@ -1 +1 @@ -Subproject commit 424af2d6bedf9f2af266e2b701e32fe74354f438 +Subproject commit 42743e0172e578c26c154c52851b7cadfdfda654 diff --git a/prefabs/teams/forgot_register.gcprefab b/prefabs/teams/forgot_register.gcprefab index 64fbf31..7c6dc71 100644 --- a/prefabs/teams/forgot_register.gcprefab +++ b/prefabs/teams/forgot_register.gcprefab @@ -1,8 +1,8 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/src/systems/teams_system.c b/src/systems/teams_system.c index 7a19344..f4a7197 100644 --- a/src/systems/teams_system.c +++ b/src/systems/teams_system.c @@ -7,15 +7,17 @@ #include "entity.h" #include "system.h" -#include "sprite.h" -#include "vector2.h" #include "prefab.h" #include "components/teams_component.h" -#include "systems/teams_system.h" #include -#include #include +static void move_teams_up(gc_scene *scene) +{ + gc_list *list = scene->get_entity_by_cmp(scene, "tag_component"); + //Should filter components by the tag teams and move them up. +} + static void update_entity(gc_engine *engine, void *system, gc_entity *entity, \ float dtime) { @@ -24,6 +26,7 @@ float dtime) team->next_teams -= dtime; if (team->next_teams < 0 && team->prefab_count) { team->next_teams = team->delay; + move_teams_up(engine->scene); prefab_load(engine, team->prefabs[random() % team->prefab_count]); } } From ac1b41df02d6cc9fb881f0a4ce7339e9812db3a4 Mon Sep 17 00:00:00 2001 From: AnonymusRaccoon Date: Fri, 6 Mar 2020 17:28:30 +0100 Subject: [PATCH 4/5] Making teams messages disapear --- CMakeLists.txt | 17 ++++- assets/ui/happiness.png | Bin 0 -> 19990 bytes include/components/game_display.h | 24 +++++++ include/components/game_manager.h | 18 +++++ include/components/teams_component.h | 1 + include/dpr_errors.h | 11 +++ lib/gamacon | 2 +- lib/my/my/my_getnbr.c | 4 +- lib/my/my/my_strdup.c | 2 + lib/my/my/tostr.c | 3 + lib/my/src/#printf.c# | 95 ------------------------- lib/my/src/printf.c | 29 ++++---- lib/xmlparser | 2 +- prefabs/game.gcprefab | 17 +++-- prefabs/teams/absent.gcprefab | 6 ++ prefabs/teams/forgot_register.gcprefab | 12 ++-- src/components/game_display.c | 63 ++++++++++++++++ src/components/game_manager.c | 54 ++++++++++++++ src/components/teams_component.c | 8 +++ src/game_loader.c | 5 ++ src/systems/game_display_system.c | 49 +++++++++++++ src/systems/teams_system.c | 26 +++++-- 22 files changed, 319 insertions(+), 129 deletions(-) create mode 100644 assets/ui/happiness.png create mode 100644 include/components/game_display.h create mode 100644 include/components/game_manager.h create mode 100644 include/dpr_errors.h delete mode 100644 lib/my/src/#printf.c# create mode 100644 prefabs/teams/absent.gcprefab create mode 100644 src/components/game_display.c create mode 100644 src/components/game_manager.c create mode 100644 src/systems/game_display_system.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 85ac696..5a74b1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -211,7 +211,22 @@ add_executable(My3D lib/my/my/my_str_replace.c lib/gamacon/src/sfml_renderer/sfml_init.c lib/gamacon/src/sfml_renderer/sfml_events.c - lib/xmlparser/src/otherget.c src/options.c lib/gamacon/src/components/input_component.c lib/gamacon/include/components/input_component.h src/systems/teams_system.c include/systems/teams_system.h include/components/teams_component.h src/components/teams_component.c lib/gamacon/src/components/tag_component.c lib/gamacon/include/components/tag_component.h) + lib/xmlparser/src/otherget.c + src/options.c + lib/gamacon/src/components/input_component.c + lib/gamacon/include/components/input_component.h + src/systems/teams_system.c + include/systems/teams_system.h + include/components/teams_component.h + src/components/teams_component.c + lib/gamacon/src/components/tag_component.c + lib/gamacon/include/components/tag_component.h + src/components/game_manager.c + include/components/game_manager.h + include/dpr_errors.h + include/components/game_display.h + src/components/game_display.c + src/systems/game_display_system.c src/components/teams_pm_component.cpp) add_compile_options(-W -Wall -Wextra -Wshadow) diff --git a/assets/ui/happiness.png b/assets/ui/happiness.png new file mode 100644 index 0000000000000000000000000000000000000000..35fece035d9711b845ef92d0dc369038abb21fa1 GIT binary patch literal 19990 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 b1A}g$RjuDT7Y0&4NPvZ8d+OLTYijI2_y&7) literal 0 HcmV?d00001 diff --git a/include/components/game_display.h b/include/components/game_display.h new file mode 100644 index 0000000..9f1bb27 --- /dev/null +++ b/include/components/game_display.h @@ -0,0 +1,24 @@ +// +// Created by anonymus-raccoon on 3/3/20. +// + +#ifndef _TEAMS_COMPONENT_C_ +#define _TEAMS_COMPONENT_H_ + +#include "component.h" + +typedef enum display_type +{ + HAPPINESS_DISPLAY +} display_type; + +struct game_display +{ + gc_component base; + display_type type; +}; + +const struct game_display game_display; +const struct gc_system game_display_system; + +#endif //_TEAMS_COMPONENT_C_ diff --git a/include/components/game_manager.h b/include/components/game_manager.h new file mode 100644 index 0000000..dc7824a --- /dev/null +++ b/include/components/game_manager.h @@ -0,0 +1,18 @@ +// +// Created by anonymus-raccoon on 3/3/20. +// + +#ifndef _TEAMS_COMPONENT_C_ +#define _TEAMS_COMPONENT_H_ + +#include "component.h" + +struct game_manager +{ + gc_component base; + int happiness; +}; + +const struct game_manager game_manager; + +#endif //_TEAMS_COMPONENT_C_ diff --git a/include/components/teams_component.h b/include/components/teams_component.h index 23b749f..6db17f3 100644 --- a/include/components/teams_component.h +++ b/include/components/teams_component.h @@ -13,6 +13,7 @@ struct teams_component float next_teams; float delay; char **prefabs; + int *prefabs_size; int prefab_count; }; diff --git a/include/dpr_errors.h b/include/dpr_errors.h new file mode 100644 index 0000000..58ad02b --- /dev/null +++ b/include/dpr_errors.h @@ -0,0 +1,11 @@ +// +// Created by anonymus-raccoon on 3/6/20. +// + +#ifndef _DPR_ERRORS_H_ +#define _DPR_ERRORS_H_ + +#define MULTIPLE_GAME_MGR_ERROR "Warning: two game manager exists, \ +behaviors are undefined.\n" + +#endif //_DPR_ERRORS_H_ diff --git a/lib/gamacon b/lib/gamacon index 42743e0..76101c2 160000 --- a/lib/gamacon +++ b/lib/gamacon @@ -1 +1 @@ -Subproject commit 42743e0172e578c26c154c52851b7cadfdfda654 +Subproject commit 76101c299286c32f13c0917e01049b33848ff94b diff --git a/lib/my/my/my_getnbr.c b/lib/my/my/my_getnbr.c index e5832e0..6a837c1 100755 --- a/lib/my/my/my_getnbr.c +++ b/lib/my/my/my_getnbr.c @@ -55,7 +55,7 @@ int my_getnbr(const char *str) int start_index = -1; char c; - for (int i = 0; 1; i++) { + for (int i = 0; str[i]; i++) { c = str[i]; if ((c >= '0' && c <= '9') || c == '-' || c == '+') { if (start_index == -1) @@ -65,5 +65,7 @@ int my_getnbr(const char *str) else if (count > 0 || c == '\0') break; } + if (count <= 0) + return (0); return init_print(str, count, start_index); } diff --git a/lib/my/my/my_strdup.c b/lib/my/my/my_strdup.c index 1ae14cc..e95701b 100644 --- a/lib/my/my/my_strdup.c +++ b/lib/my/my/my_strdup.c @@ -14,6 +14,8 @@ char *my_strdup(const char *src) int length = my_strlen(src); char *ret = malloc(sizeof(char) * (length + 1)); + if (!ret) + return (NULL); for (int i = 0; i < length; i++) ret[i] = src[i]; ret[length] = '\0'; diff --git a/lib/my/my/tostr.c b/lib/my/my/tostr.c index ce3e977..025415c 100644 --- a/lib/my/my/tostr.c +++ b/lib/my/my/tostr.c @@ -54,6 +54,9 @@ char *tostr(int n) int count = get_new_size(n); char *ret = malloc(sizeof(char) * (count + 1)); + if (!ret) + return (NULL); + putnbr_in(n, base, ret, count); ret[count] = '\0'; return (ret); diff --git a/lib/my/src/#printf.c# b/lib/my/src/#printf.c# deleted file mode 100644 index c8715a9..0000000 --- a/lib/my/src/#printf.c# +++ /dev/null @@ -1,95 +0,0 @@ -/* -** EPITECH PROJECT, 2019 -** Sum stdarg -** File description: -** sum_stdarg -*/ - -#include "formaters.h" -#include "my.h" -#include -#include - -formater_t formaters[] = {{string_formater, 's'}, - {string_nonprintable_formater, 'S'}, - {char_formater, 'c'}, - {int_formater, 'i'}, - {int_formater, 'd'}, - {octal_formater, 'o'}, - {hexa_formater, 'x'}, - {big_hexa_formater, 'X'}, - {uint_formater, 'u'}, - {ptr_formater, 'p'}, - {ubinary_formater, 'b'}, - {float_formater, 'f'}, - {float_formater, 'F'}, - {no_format, '%'}, - {0, 0}}; - -const char modifiersCst[] = "#0-+ hl"; - -int format(va_list ap, char flag, char modifiers[MODIFIERS_SIZE]) -{ - for (int i = 0; formaters[i].flag; i++) { - if (formaters[i].flag == flag) { - return (formaters[i].func(ap, modifiers)); - } - } - return (0); -} - -int is_flag(char c) -{ - for (int i = 0; formaters[i].flag; i++) { - if (formaters[i].flag == c) { - return (1); - } - } - return (0); -} - -int is_modifier(char c) -{ - for (int i = 0; modifiersCst[i]; i++) { - if (modifiersCst[i] == c) - return (1); - } - return (0); -} - -int get_modifiers(const char *str, char flags[MODIFIERS_SIZE]) -{ - int i; - - for (i = 0; !is_flag(str[i]); i++) { - if (!is_modifier(str[i]) && !is_num(str[i])) - return (-1); - flags[i] = str[i]; - } - flags[i] = '\0'; - return (i); -} - -int my_printf(const char *str, ...) -{ - int count = 0; - va_list ap; - char modifiers[MODIFIERS_SIZE]; - int next_is_flag; - - va_start(ap, str); - for (int i = 0; str[i]; i++) { - if (str[i] == '%') { - next_is_flag = 1; - i++; - i += get_modifiers(&str[i], modifiers); - } else - next_is_flag = 0; - if (next_is_flag && is_flag(str[i])) - count += format(ap, str[i], modifiers); - else - count += write(1, &str[i], 1); - } - va_end(ap); - return (count); -} \ No newline at end of file diff --git a/lib/my/src/printf.c b/lib/my/src/printf.c index 451fc28..3fa08e7 100644 --- a/lib/my/src/printf.c +++ b/lib/my/src/printf.c @@ -11,20 +11,21 @@ #include formater_t formaters[] = {{string_formater, 's'}, - {string_nonprintable_formater, 'S'}, - {char_formater, 'c'}, - {int_formater, 'i'}, - {int_formater, 'd'}, - {octal_formater, 'o'}, - {hexa_formater, 'x'}, - {big_hexa_formater, 'X'}, - {uint_formater, 'u'}, - {ptr_formater, 'p'}, - {ubinary_formater, 'b'}, - {float_formater, 'f'}, - {float_formater, 'F'}, - {no_format, '%'}, - {0, 0}}; + {string_nonprintable_formater, 'S'}, + {char_formater, 'c'}, + {int_formater, 'i'}, + {int_formater, 'd'}, + {octal_formater, 'o'}, + {hexa_formater, 'x'}, + {big_hexa_formater, 'X'}, + {uint_formater, 'u'}, + {ptr_formater, 'p'}, + {ubinary_formater, 'b'}, + {float_formater, 'f'}, + {float_formater, 'F'}, + {no_format, '%'}, + {0, 0} +}; const char modifiersCst[] = "#0-+ hl"; diff --git a/lib/xmlparser b/lib/xmlparser index 5028a21..91f3604 160000 --- a/lib/xmlparser +++ b/lib/xmlparser @@ -1 +1 @@ -Subproject commit 5028a210a2b30afbea128f47e3030b4da84f0271 +Subproject commit 91f3604772158a2ff8c17fb74459088004e4fe15 diff --git a/prefabs/game.gcprefab b/prefabs/game.gcprefab index debbca9..a68df99 100644 --- a/prefabs/game.gcprefab +++ b/prefabs/game.gcprefab @@ -5,10 +5,12 @@ + + @@ -24,17 +26,20 @@ - - + + + + - - - - + + + + + \ No newline at end of file diff --git a/prefabs/teams/absent.gcprefab b/prefabs/teams/absent.gcprefab new file mode 100644 index 0000000..52cc769 --- /dev/null +++ b/prefabs/teams/absent.gcprefab @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/prefabs/teams/forgot_register.gcprefab b/prefabs/teams/forgot_register.gcprefab index 7c6dc71..206b462 100644 --- a/prefabs/teams/forgot_register.gcprefab +++ b/prefabs/teams/forgot_register.gcprefab @@ -1,8 +1,8 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/src/components/game_display.c b/src/components/game_display.c new file mode 100644 index 0000000..78acd75 --- /dev/null +++ b/src/components/game_display.c @@ -0,0 +1,63 @@ +/* +** EPITECH PROJECT, 2020 +** DPR +** File description: +** game_stats +*/ + +#include +#include +#include "dpr_errors.h" +#include "xml.h" +#include "component.h" +#include "utility.h" +#include "components/game_display.h" +#include + +static void ctr(void *component, va_list args) +{ + struct game_display *cmp = (struct game_display *)component; + + cmp->type = va_arg(args, display_type); +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + struct game_display *cmp = (struct game_display *)component; + struct renderer *rend = GETCMP(entity, renderer); + + cmp->type = HAPPINESS_DISPLAY; + if (!rend || rend->type != GC_TXTREND) { + my_printf("Using a game display without a text renderer.\n"); + return; + } + ((gc_text *)rend->data)->text = malloc(sizeof(char) * 10); + if (((gc_text *)rend->data)->text) + ((gc_text *)rend->data)->text[0] = '\0'; +} + +static void dtr(void *component) +{ + (void)component; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct game_display game_display = { + base: { + name: "game_display", + size: sizeof(struct game_display), + dependencies: (char *[]) { + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy + } +}; \ No newline at end of file diff --git a/src/components/game_manager.c b/src/components/game_manager.c new file mode 100644 index 0000000..a28d875 --- /dev/null +++ b/src/components/game_manager.c @@ -0,0 +1,54 @@ +/* +** EPITECH PROJECT, 2020 +** DPR +** File description: +** game_stats +*/ + +#include "dpr_errors.h" +#include "xml.h" +#include "component.h" +#include "utility.h" +#include "components/game_manager.h" + +static void ctr(void *component, va_list args) +{ + struct game_manager *cmp = (struct game_manager *)component; + + cmp->happiness = va_arg(args, int); +} + +static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) +{ + struct game_manager *cmp = (struct game_manager *)component; + + cmp->happiness = xml_getintprop(n, "happiness"); + if (scene->get_entity_by_cmp(scene, "game_manager")) + my_printf(MULTIPLE_GAME_MGR_ERROR); +} + +static void dtr(void *component) +{ + (void)component; +} + +static char *serialize(void *component) +{ + (void)component; + return (NULL); +} + +const struct game_manager game_manager = { + base: { + name: "game_manager", + size: sizeof(struct game_manager), + dependencies: (char *[]) { + NULL + }, + ctr: &ctr, + fdctr: &fdctr, + dtr: &dtr, + serialize: &serialize, + destroy: &component_destroy + } +}; \ No newline at end of file diff --git a/src/components/teams_component.c b/src/components/teams_component.c index 04555d2..3f414cc 100644 --- a/src/components/teams_component.c +++ b/src/components/teams_component.c @@ -27,9 +27,17 @@ static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n) cmp->next_teams = cmp->delay; cmp->prefab_count = xml_getchildcount_filtered(n, "prefab"); cmp->prefabs = malloc(sizeof(char *) * cmp->prefab_count); + cmp->prefabs_size = malloc(sizeof(int) * cmp->prefab_count); n = n->child; + if (!cmp->prefabs || !cmp->prefab_count) { + cmp->prefabs = NULL; + cmp->prefabs_size = NULL; + cmp->prefab_count = 0; + return; + } for (int i = 0; i < cmp->prefab_count; i++) { cmp->prefabs[i] = xml_getproperty(n, "src"); + cmp->prefabs_size[i] = xml_getintprop(n, "height"); n = n->next; } } diff --git a/src/game_loader.c b/src/game_loader.c index 4ebb9bb..b63a758 100644 --- a/src/game_loader.c +++ b/src/game_loader.c @@ -10,9 +10,14 @@ #include "components/teams_component.h" #include "systems/teams_system.h" #include +#include "components/game_display.h" +#include "components/game_manager.h" int register_customcmps(gc_engine *engine) { + engine->add_component(engine, &game_manager); + engine->add_component(engine, &game_display); + engine->add_system(engine, &game_display_system); engine->add_component(engine, &teams_component); engine->add_system(engine, &teams_system); engine->finish_physics(engine); diff --git a/src/systems/game_display_system.c b/src/systems/game_display_system.c new file mode 100644 index 0000000..9adf5be --- /dev/null +++ b/src/systems/game_display_system.c @@ -0,0 +1,49 @@ +/* +** EPITECH PROJECT, 2019 +** MUL_my_runner_2019 +** File description: +** teams_system +*/ + +#include "entity.h" +#include "system.h" +#include +#include "components/game_display.h" +#include "components/game_manager.h" +#include "text.h" +#include "components/renderer.h" +#include + +static void update_entity(gc_engine *engine, void *system, gc_entity *entity, \ +float dtime) +{ + struct game_display *disp = GETCMP(entity, game_display); + struct renderer *rend = GETCMP(entity, renderer); + struct game_manager *manager; + gc_scene *scene = engine->scene; + gc_list *entities = scene->get_entity_by_cmp(scene, "game_manager"); + + if (!entities) + return; + manager = GETCMP(entities->data, game_manager); + if (rend->type != GC_TXTREND) + return; + if (disp->type == HAPPINESS_DISPLAY) + sprintf(((gc_text *)rend->data)->text, "%d%%", manager->happiness); +} + +static void destroy(void *system) +{ + (void)system; +} + +const gc_system game_display_system = { + name: "game_display_system", + component_name: "game_display", + size: sizeof(gc_system), + ctr: NULL, + dtr: NULL, + check_dependencies: &system_check_dependencies, + update_entity: &update_entity, + destroy: &destroy +}; \ No newline at end of file diff --git a/src/systems/teams_system.c b/src/systems/teams_system.c index f4a7197..eef7412 100644 --- a/src/systems/teams_system.c +++ b/src/systems/teams_system.c @@ -11,23 +11,41 @@ #include "components/teams_component.h" #include #include +#include +#include +#include "my.h" -static void move_teams_up(gc_scene *scene) +static void move_teams_up(gc_scene *scene, float amount) { gc_list *list = scene->get_entity_by_cmp(scene, "tag_component"); - //Should filter components by the tag teams and move them up. + struct fixed_to_cam *fc; + struct tag_component *tc; + + for (; list; list = list->next) { + tc = GETCMP(list->data, tag_component); + if (my_strcmp(tc->tag, "teams")) + continue; + fc = GETCMP(list->data, fixed_to_cam); + if (!fc) + continue; + fc->pos.y -= amount; + if (fc->pos.y < 15) + ((gc_entity *)list->data)->destroy(list->data, scene); + } } static void update_entity(gc_engine *engine, void *system, gc_entity *entity, \ float dtime) { struct teams_component *team = GETCMP(entity, teams_component); + int index; team->next_teams -= dtime; if (team->next_teams < 0 && team->prefab_count) { + index = random() % team->prefab_count; team->next_teams = team->delay; - move_teams_up(engine->scene); - prefab_load(engine, team->prefabs[random() % team->prefab_count]); + move_teams_up(engine->scene, team->prefabs_size[index]); + prefab_load(engine, team->prefabs[index]); } } From 1156affb2ceae7319d38130d448241020092d80d Mon Sep 17 00:00:00 2001 From: AnonymusRaccoon Date: Fri, 6 Mar 2020 17:35:21 +0100 Subject: [PATCH 5/5] Teams PM take down happiness --- lib/gamacon | 2 +- src/systems/teams_system.c | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/gamacon b/lib/gamacon index 76101c2..da57b43 160000 --- a/lib/gamacon +++ b/lib/gamacon @@ -1 +1 @@ -Subproject commit 76101c299286c32f13c0917e01049b33848ff94b +Subproject commit da57b43f45546cefb28a4b485eb7d5ca0d4e1d42 diff --git a/src/systems/teams_system.c b/src/systems/teams_system.c index eef7412..6f9a4fb 100644 --- a/src/systems/teams_system.c +++ b/src/systems/teams_system.c @@ -13,13 +13,15 @@ #include #include #include +#include #include "my.h" -static void move_teams_up(gc_scene *scene, float amount) +static bool move_teams_up(gc_scene *scene, float amount) { gc_list *list = scene->get_entity_by_cmp(scene, "tag_component"); struct fixed_to_cam *fc; struct tag_component *tc; + bool pm_timeout = false; for (; list; list = list->next) { tc = GETCMP(list->data, tag_component); @@ -29,22 +31,31 @@ static void move_teams_up(gc_scene *scene, float amount) if (!fc) continue; fc->pos.y -= amount; - if (fc->pos.y < 15) - ((gc_entity *)list->data)->destroy(list->data, scene); + if (fc->pos.y < 15) { + ((gc_entity *) list->data)->destroy(list->data, scene); + pm_timeout = true; + } } + return (pm_timeout); } static void update_entity(gc_engine *engine, void *system, gc_entity *entity, \ float dtime) { struct teams_component *team = GETCMP(entity, teams_component); + gc_scene *scene = engine->scene; + struct gc_list *m = scene->get_entity_by_cmp(scene, "game_manager"); + struct game_manager *manager; int index; team->next_teams -= dtime; if (team->next_teams < 0 && team->prefab_count) { index = random() % team->prefab_count; team->next_teams = team->delay; - move_teams_up(engine->scene, team->prefabs_size[index]); + if (move_teams_up(engine->scene, team->prefabs_size[index]) && m) { + manager = GETCMP(m->data, game_manager); + manager->happiness -= 10; + } prefab_load(engine, team->prefabs[index]); } }