Adding a boss

This commit is contained in:
Anonymus Raccoon
2020-05-02 17:26:36 +02:00
parent c0d11413e5
commit 18297a2e4c
17 changed files with 117 additions and 9 deletions
+1 -1
View File
@@ -298,7 +298,7 @@ add_executable(my_rpg
include/components/attack_component.h
src/systems/combat_methods.c
src/combat/attacks.c
src/player_utilities.c include/player_utilities.h src/systems/inventory.c include/systems/inventory.h src/systems/game_over.c include/systems/game_over.h src/npc/mia.c lib/gamacon/src/scene/scene_constructor.c src/npc/fisherman.c src/npc/lumberjack.c src/npc/smith.c src/npc/mage.c)
src/player_utilities.c include/player_utilities.h src/systems/inventory.c include/systems/inventory.h src/systems/game_over.c include/systems/game_over.h src/npc/mia.c lib/gamacon/src/scene/scene_constructor.c src/npc/fisherman.c src/npc/lumberjack.c src/npc/smith.c src/npc/mage.c src/combat/boss.c)
add_compile_options(-W -Wall -Wextra -Wshadow)
+2 -1
View File
@@ -46,7 +46,8 @@ SRC = src/main.c \
src/npc/fisherman.c \
src/npc/lumberjack.c \
src/npc/smith.c \
src/npc/mage.c
src/npc/mage.c \
src/combat/boss.c
OBJ = $(SRC:%.c=%.o)
Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

+1
View File
@@ -29,6 +29,7 @@ struct dialog_holder {
bool single_usage;
bool has_seen;
struct tile *tile;
void (*close_callback)(gc_engine *engine);
};
const struct dialog_holder dialog_holder;
+4 -1
View File
@@ -87,4 +87,7 @@ gc_vector2 pos, enum gc_mousekeys key);
void mage_give(gc_engine *engine);
void load_data(gc_scene *scene, const gc_data *datas);
extern const struct gc_data game_data[];
extern const struct gc_data game_data[];
void check_for_boss(gc_engine *engine);
void boss_start(gc_engine *engine);
+15
View File
@@ -0,0 +1,15 @@
<gc_entities>
<gc_entity>
<transform_component>
<Position x="0" y="0" />
<Size x="500" y="500" />
</transform_component>
<renderer src="t-rex">
<Rect height="77" width="94" top="0" left="0" />
</renderer>
<map_linker x="36" y="27" solid="false" centered="true"/>
<dialog_holder x="37" y="26" tile_texture="npc_interact" close_callback="boss_start">
<T-Rex line="The time has come 'HERO'." />
</dialog_holder>
</gc_entity>
</gc_entities>
+1
View File
@@ -22,6 +22,7 @@
<sprite name="shrump" src="assets/sprites/Shrump.png" />
<sprite name="evil_seed" src="assets/sprites/Evil_seed.png" />
<sprite name="flower_ennemy" src="assets/sprites/Flower_ennemy.png" />
<sprite name="t-rex" src="assets/sprites/t-rex.png" />
</data>
<gc_entities>
<gc_entity>
+17
View File
@@ -0,0 +1,17 @@
<gc_entities>
<gc_entity>
<transform_component>
<Position x="0" y="0" />
<Size x="100" y="100" />
</transform_component>
<renderer src="t-rex">
<Rect height="77" width="94" top="0" left="0" />
</renderer>
<fixed_to_cam x="75%" y="20%" />
<combat_holder name="T-Rex" />
<attack_component>
<attack name="Charge"/>
</attack_component>
<health_component max_health="50"/>
</gc_entity>
</gc_entities>
+2
View File
@@ -156,8 +156,10 @@
<sprite name="smith" src="assets/sprites/npc/smith.png" />
<sprite name="lumberjack" src="assets/sprites/npc/lumberjack.png" />
<sprite name="mage" src="assets/sprites/npc/mage.png" />
<sprite name="t-rex" src="assets/sprites/t-rex.png" />
<enemies>
<enemy name="t-rex" src="prefabs/enemies/t-rex.gcprefab" spawn_rate="0%"/>
<enemy name="bee" src="prefabs/enemies/bee.gcprefab" spawn_rate="17%" />
<enemy name="mushroom" src="prefabs/enemies/mushroom.gcprefab" spawn_rate="17%" />
<enemy name="turnipor" src="prefabs/enemies/turnipor.gcprefab" spawn_rate="17%"/>
+55
View File
@@ -0,0 +1,55 @@
/*
** EPITECH PROJECT, 2020
** my_rpg
** File description:
** boss.c
*/
#include <components/player_component.h>
#include <systems/combat_manager.h>
#include "engine.h"
#include "prefab.h"
#include "components/dialog_holder.h"
#include "my.h"
void spawn_boss(gc_engine *engine)
{
struct dialog_holder *dialog = dialog_get_current(engine);
if (prefab_load(engine, "prefabs/boss.gcprefab") < 0) {
my_printf("Couldn't load the boss prefab.\n");
return;
}
if (!dialog)
return;
dialog_add_line(dialog, NULL, "...", NULL);
dialog_add_line(dialog, NULL, "Wait...", NULL);
dialog_add_line(dialog, NULL, "...", NULL);
dialog_add_line(dialog, NULL, "HELP US!!", NULL);
dialog_add_line(dialog, NULL, "A T-REX APPEARED IN THE\n\
CENTER OF THE VILLAGE", NULL);
dialog_add_line(dialog, NULL, "AHHHHHHHHHHHHHhh", NULL);
dialog_add_line(dialog, NULL, "AHHHHHHHHhhhh", NULL);
dialog_add_line(dialog, NULL, "HELPPPP", NULL);
}
void check_for_boss(gc_engine *engine)
{
gc_entity *player = engine->scene->get_entity(engine->scene, 50);
struct player_component *inv;
if (!player)
return;
inv = GETCMP(player, player_component);
if (!inv->inventory_upgrades[0]
|| !inv->inventory_upgrades[1]
|| !inv->inventory_upgrades[2]
|| !inv->inventory_upgrades[3])
return;
spawn_boss(engine);
}
void boss_start(gc_engine *engine)
{
combat_start(engine, "t-rex");
}
+5
View File
@@ -107,6 +107,7 @@ static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n)
int x = xml_getintprop(n, "x");
int y = xml_getintprop(n, "y");
char *texture = xml_gettmpstring(n, "tile_texture", NULL);
char *cbk = xml_gettempprop(n, "close_callback");
cmp->single_usage = xml_getbool(n, "single_usage", false);
cmp->text = malloc(sizeof(struct dialog_line *) * (count + 1));
@@ -116,6 +117,10 @@ static void fdctr(gc_entity *entity, gc_scene *scene, void *component, node *n)
for (int i = 0; n; n = n->next, i++)
cmp->text[i] = dialog_parse_text(scene, n);
cmp->text[count] = NULL;
if (cbk)
cmp->close_callback = scene->get_data(scene, "close_callback", cbk);
else
cmp->close_callback = NULL;
setup_tile_interactions(cmp, scene, (gc_vector2i){x, y}, texture);
}
+2 -1
View File
@@ -64,6 +64,7 @@ const struct gc_data game_data[] = {
{"input", "lumberjack_yes", &lumberjack_yes, NULL},
{"dialog_callback", "smith_chest", &smith_chest, NULL},
{"dialog_callback", "mage_give", &mage_give, NULL},
{"close_callback", "boss_start", &boss_start, NULL},
{NULL, NULL, NULL, NULL}
};
@@ -91,7 +92,7 @@ const struct gc_data attacks[] = {
{"attack", "Spinning roots", &enemy_attack, NULL},
{"attack", "Hypnosis", &enemy_attack, NULL},
{"attack", "Water gun", &enemy_attack, NULL},
{NULL, NULL, NULL, NULL}
{NULL, NULL, NULL, NULL}
};
void load_data(gc_scene *scene, const gc_data *datas)
+2 -1
View File
@@ -9,7 +9,7 @@
#include "systems/game_manager_system.h"
#include "components/player_component.h"
#include "engine.h"
#include "setup.h"
void fisherman_setup(gc_engine *engine)
{
@@ -58,5 +58,6 @@ gc_vector2 pos, enum gc_mousekeys key)
else
dialog_add_line(dialog, "", "You found the water jet upgrade!", NULL);
inv->inventory_upgrades[1] = true;
check_for_boss(engine);
return (true);
}
+2
View File
@@ -8,6 +8,7 @@
#include <components/player_component.h>
#include <components/dialog_holder.h>
#include "engine.h"
#include "setup.h"
void lumberjack_delete(gc_engine *engine)
{
@@ -30,5 +31,6 @@ gc_vector2 pos, enum gc_mousekeys key)
inv->inventory_upgrades[2] = true;
di = dialog_add_line(dialog, "", "You gained the uppercut upgrade!", NULL);
di->callback = &lumberjack_delete;
check_for_boss(engine);
return (true);
}
+3 -1
View File
@@ -8,6 +8,7 @@
#include "components/dialog_holder.h"
#include "components/player_component.h"
#include "engine.h"
#include "setup.h"
void mage_give(gc_engine *engine)
{
@@ -22,6 +23,7 @@ void mage_give(gc_engine *engine)
return;
if (!inv->inventory_upgrades[1])
dialog_add_line(dialog, "", "You got the fireball upgrade!", NULL);
inv->inventory_upgrades[0] = true;
check_for_boss(engine);
dialog->text[4] = NULL;
inv->inventory_upgrades[1] = true;
}
+2
View File
@@ -8,6 +8,7 @@
#include "components/player_component.h"
#include "components/dialog_holder.h"
#include "engine.h"
#include "setup.h"
bool smith_chest(gc_engine *engine, gc_entity *entity, \
gc_vector2 pos, enum gc_mousekeys key)
@@ -27,5 +28,6 @@ gc_vector2 pos, enum gc_mousekeys key)
else
dialog_add_line(dialog, NULL, "You found the shield upgrade!", NULL);
inv->inventory_upgrades[3] = true;
check_for_boss(engine);
return (true);
}
+3 -3
View File
@@ -108,9 +108,7 @@ void dialog_next(gc_engine *engine)
gc_entity *entity = scene->get_entity(scene, 50);
gc_entity *holder_name;
if (!entity)
return;
if (this->dialog_id == -1 && !load_dialog(this, engine, entity))
if (!entity || this->dialog_id == -1 && !load_dialog(this, engine, entity))
return;
if (this->input_id >= 0)
run_input_func(this, engine);
@@ -124,4 +122,6 @@ holder_name, engine) && handle_input(engine, this)))
this->dialog_id = -1;
controllable_set_can_move(scene, true);
engine->trigger_event(engine, "dialog_ended");
if (this->current_dialog->close_callback)
this->current_dialog->close_callback(engine);
}