diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7c64376..8667f98 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -233,6 +233,7 @@ add_executable(My3D
include/components/game_display.h
src/components/game_display.c
src/systems/game_display_system.c
+ src/teams/absent.c
)
add_compile_options(-W -Wall -Wextra -Wshadow)
diff --git a/assets/ui/clown.png b/assets/ui/clown.png
new file mode 100644
index 0000000..d4670e7
Binary files /dev/null and b/assets/ui/clown.png differ
diff --git a/include/components/game_display.h b/include/components/game_display.h
index 9f1bb27..c4a6017 100644
--- a/include/components/game_display.h
+++ b/include/components/game_display.h
@@ -9,7 +9,8 @@
typedef enum display_type
{
- HAPPINESS_DISPLAY
+ HAPPINESS_DISPLAY,
+ STUPIDITY_DISPLAY
} display_type;
struct game_display
diff --git a/include/components/game_manager.h b/include/components/game_manager.h
index dc7824a..189e21c 100644
--- a/include/components/game_manager.h
+++ b/include/components/game_manager.h
@@ -11,6 +11,7 @@ struct game_manager
{
gc_component base;
int happiness;
+ int stupidity;
};
const struct game_manager game_manager;
diff --git a/include/components/teams_component.h b/include/components/teams_component.h
index 6db17f3..d2234b1 100644
--- a/include/components/teams_component.h
+++ b/include/components/teams_component.h
@@ -19,4 +19,6 @@ struct teams_component
const struct teams_component teams_component;
+bool teams_move_up(gc_scene *scene, float amount, float y_level);
+
#endif //_TEAMS_COMPONENT_C_
diff --git a/include/setup.h b/include/setup.h
index d9400fa..abc171c 100644
--- a/include/setup.h
+++ b/include/setup.h
@@ -22,4 +22,7 @@ void resolution_set_text(gc_entity *entity, gc_engine *engine);
bool fullscreen(gc_engine *engine, int entity_id);
bool resolution_down(gc_engine *engine, int entity_id);
-bool resolution_up(gc_engine *engine, int entity_id);
\ No newline at end of file
+bool resolution_up(gc_engine *engine, int entity_id);
+
+
+bool absent_check(gc_engine *engine, int entity_id);
\ No newline at end of file
diff --git a/lib/gamacon b/lib/gamacon
index 3e0ba65..da2f00a 160000
--- a/lib/gamacon
+++ b/lib/gamacon
@@ -1 +1 @@
-Subproject commit 3e0ba651102bb2f0dba0bd9554c77efaaf82c8de
+Subproject commit da2f00aea405d2e0a5763ee07e709c82a07ea8ba
diff --git a/prefabs/game.gcprefab b/prefabs/game.gcprefab
index 390779a..872730a 100644
--- a/prefabs/game.gcprefab
+++ b/prefabs/game.gcprefab
@@ -6,6 +6,7 @@
+
@@ -28,7 +29,7 @@
-
+
@@ -43,5 +44,9 @@
+
+
+
+
\ No newline at end of file
diff --git a/prefabs/teams/absent.gcprefab b/prefabs/teams/absent.gcprefab
index 52cc769..fd7aec4 100644
--- a/prefabs/teams/absent.gcprefab
+++ b/prefabs/teams/absent.gcprefab
@@ -1,6 +1,6 @@
-
-
+
+
\ No newline at end of file
diff --git a/src/components/game_display.c b/src/components/game_display.c
index 78acd75..d0792ad 100644
--- a/src/components/game_display.c
+++ b/src/components/game_display.c
@@ -25,8 +25,12 @@ 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);
+ char *display_type = xml_gettempprop(n, "stats");
- cmp->type = HAPPINESS_DISPLAY;
+ if (!my_strcmp(display_type, "happiness"))
+ cmp->type = HAPPINESS_DISPLAY;
+ else
+ cmp->type = STUPIDITY_DISPLAY;
if (!rend || rend->type != GC_TXTREND) {
my_printf("Using a game display without a text renderer.\n");
return;
diff --git a/src/components/game_manager.c b/src/components/game_manager.c
index a28d875..e604542 100644
--- a/src/components/game_manager.c
+++ b/src/components/game_manager.c
@@ -16,6 +16,7 @@ static void ctr(void *component, va_list args)
struct game_manager *cmp = (struct game_manager *)component;
cmp->happiness = va_arg(args, int);
+ cmp->stupidity = va_arg(args, int);
}
static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n)
@@ -23,6 +24,7 @@ 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");
+ cmp->stupidity = xml_getintprop(n, "stupidity");
if (scene->get_entity_by_cmp(scene, "game_manager"))
my_printf(MULTIPLE_GAME_MGR_ERROR);
}
diff --git a/src/game_loader.c b/src/game_loader.c
index 8da730b..01f52bd 100644
--- a/src/game_loader.c
+++ b/src/game_loader.c
@@ -30,6 +30,7 @@ int register_customcmps(gc_engine *engine)
engine->add_callback(engine, "fullscreen", &fullscreen);
engine->add_callback(engine, "resolution_down", &resolution_down);
engine->add_callback(engine, "resolution_up", &resolution_up);
+ engine->add_callback(engine, "absent_check", &absent_check);
return (0);
}
diff --git a/src/systems/game_display_system.c b/src/systems/game_display_system.c
index 9adf5be..7199f17 100644
--- a/src/systems/game_display_system.c
+++ b/src/systems/game_display_system.c
@@ -30,6 +30,8 @@ float dtime)
return;
if (disp->type == HAPPINESS_DISPLAY)
sprintf(((gc_text *)rend->data)->text, "%d%%", manager->happiness);
+ else
+ sprintf(((gc_text *)rend->data)->text, "%d%%", manager->stupidity);
}
static void destroy(void *system)
diff --git a/src/systems/teams_system.c b/src/systems/teams_system.c
index 6f9a4fb..e987359 100644
--- a/src/systems/teams_system.c
+++ b/src/systems/teams_system.c
@@ -16,7 +16,7 @@
#include
#include "my.h"
-static bool move_teams_up(gc_scene *scene, float amount)
+bool teams_move_up(gc_scene *scene, float amount, float y_level)
{
gc_list *list = scene->get_entity_by_cmp(scene, "tag_component");
struct fixed_to_cam *fc;
@@ -28,7 +28,7 @@ static bool move_teams_up(gc_scene *scene, float amount)
if (my_strcmp(tc->tag, "teams"))
continue;
fc = GETCMP(list->data, fixed_to_cam);
- if (!fc)
+ if (!fc || fc->pos.y < y_level)
continue;
fc->pos.y -= amount;
if (fc->pos.y < 15) {
@@ -43,19 +43,19 @@ 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;
+ struct game_manager *manager = GETCMP(entity, game_manager);
int index;
+ if (!manager) {
+ my_printf("No game manager found. Teams is disabled.\n");
+ return;
+ }
team->next_teams -= dtime;
if (team->next_teams < 0 && team->prefab_count) {
index = random() % team->prefab_count;
team->next_teams = team->delay;
- if (move_teams_up(engine->scene, team->prefabs_size[index]) && m) {
- manager = GETCMP(m->data, game_manager);
+ if (teams_move_up(engine->scene, team->prefabs_size[index], 0))
manager->happiness -= 10;
- }
prefab_load(engine, team->prefabs[index]);
}
}
diff --git a/src/teams/absent.c b/src/teams/absent.c
new file mode 100644
index 0000000..3c91855
--- /dev/null
+++ b/src/teams/absent.c
@@ -0,0 +1,29 @@
+//
+// Created by anonymus-raccoon on 3/6/20.
+//
+
+#include
+#include "components/game_manager.h"
+#include
+#include
+#include "components/teams_component.h"
+#include "engine.h"
+
+bool absent_check(gc_engine *engine, int id)
+{
+ gc_scene *scene = engine->scene;
+ gc_list *li = scene->get_entity_by_cmp(scene, "game_manager");
+ gc_entity *entity = scene->get_entity(scene, id);
+ float y_pos = GETCMP(entity, transform_component)->position.y;
+ int prefab_id = entity->prefab_id;
+
+ if (!li)
+ return (false);
+ GETCMP(li->data, game_manager)->happiness += 3;
+ GETCMP(li->data, game_manager)->stupidity += random() % 5;
+ for (gc_list *ent = scene->entities; ent; ent = ent->next)
+ if (((gc_entity *)ent->data)->prefab_id == prefab_id)
+ ((gc_entity *)ent->data)->destroy(ent->data, scene);
+ teams_move_up(scene, 15, y_pos);
+ return (true);
+}
\ No newline at end of file