feat: gameover with firsk attack
This commit is contained in:
parent
a492a9a411
commit
3ca6fb18b2
70 changed files with 14324 additions and 46 deletions
|
|
@ -6,7 +6,7 @@
|
|||
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/02/26 16:27:06 by mcolonna #+# #+# */
|
||||
/* Updated: 2024/04/11 16:21:00 by mcolonna ### ########.fr */
|
||||
/* Updated: 2024/04/17 17:50:28 by mcolonna ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -83,4 +83,34 @@ const t_assetmeta g_assetsmap[NB_ASSETS] = {
|
|||
{"object/firsk/walk_up_2", 40, 100, 30, 100, false},
|
||||
{"object/firsk/walk_up_3", 40, 100, 30, 100, false},
|
||||
{"object/firsk/walk_up_4", 40, 100, 30, 100, false},
|
||||
// ANIM
|
||||
// knife attack
|
||||
{"anim/knifeattack_1", 50, 100, 40, 110, false},
|
||||
{"anim/knifeattack_2", 50, 100, 40, 110, false},
|
||||
{"anim/knifeattack_3", 50, 100, 40, 110, false},
|
||||
{"anim/knifeattack_4", 50, 100, 40, 110, false},
|
||||
{"anim/knifeattack_5", 50, 100, 40, 110, false},
|
||||
{"anim/knifeattack_6", 50, 100, 40, 110, false},
|
||||
{"anim/knifeattack_7", 50, 100, 40, 110, false},
|
||||
// explosion
|
||||
{"anim/explosion_part1_1", 0, 100, 0, 141, false},
|
||||
{"anim/explosion_part1_2", 0, 100, 0, 141, false},
|
||||
{"anim/explosion_part1_3", 0, 100, 0, 141, false},
|
||||
{"anim/explosion_part1_4", 0, 100, 0, 141, false},
|
||||
{"anim/explosion_part1_5", 0, 100, 0, 141, false},
|
||||
{"anim/explosion_part1_6", 0, 100, 0, 141, false},
|
||||
{"anim/explosion_part1_7", 0, 100, 0, 141, false},
|
||||
{"anim/explosion_part1_8", 0, 100, 0, 141, false},
|
||||
{"anim/explosion_part2_1", 0, 100, 0, 141, false},
|
||||
{"anim/explosion_part2_2", 0, 100, 0, 141, false},
|
||||
{"anim/explosion_part2_3", 0, 100, 0, 141, false},
|
||||
{"anim/explosion_part2_4", 0, 100, 0, 141, false},
|
||||
{"anim/explosion_part2_5", 0, 100, 0, 141, false},
|
||||
{"anim/explosion_part2_6", 0, 100, 0, 141, false},
|
||||
{"anim/explosion_part2_7", 0, 100, 0, 141, false},
|
||||
{"anim/explosion_part2_8", 0, 100, 0, 141, false},
|
||||
{"anim/explosion_part2_9", 0, 100, 0, 141, false},
|
||||
// TEXT
|
||||
{"text/gameover", 100, 510, 120, 190, false},
|
||||
{"text/youded", 240, 360, 230, 280, false},
|
||||
};
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/03/11 16:02:29 by mcolonna #+# #+# */
|
||||
/* Updated: 2024/04/11 16:22:17 by mcolonna ### ########.fr */
|
||||
/* Updated: 2024/04/17 17:49:13 by mcolonna ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -33,4 +33,9 @@ const t_spritemeta g_spritesmap[NB_SPRITES] = {
|
|||
{OBJECT_FIRSK_WALK_UP_1, 50, 50, ANIMATION, 4, 3},
|
||||
{OBJECT_FIRSK_WALK_RIGHT_1, 50, 50, ANIMATION, 2, 3},
|
||||
{OBJECT_FIRSK_WALK_LEFT_1, 50, 50, ANIMATION, 2, 3},
|
||||
{ANIM_KNIFEATTACK_1, 50, 50, ANIMATION_ONCE, 7, 2},
|
||||
{ANIM_EXPLOSION_PART1_1, 23, 50, ANIMATION_ONCE, 8, 1},
|
||||
{ANIM_EXPLOSION_PART2_1, 23, 50, ANIMATION_ONCE, 9, 1},
|
||||
{TEXT_GAMEOVER, 0, 0, ANIMATION, 1, 1},
|
||||
{TEXT_YOUDED, 0, 0, ANIMATION, 1, 1},
|
||||
};
|
||||
|
|
|
|||
70
src/gameover/gameover.c
Normal file
70
src/gameover/gameover.c
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* gameover.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/04/16 20:02:29 by mcolonna #+# #+# */
|
||||
/* Updated: 2024/04/17 18:21:17 by mcolonna ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "includes.h"
|
||||
#include "gameover_utils.h"
|
||||
|
||||
static t_gameover_env g_gameover_env;
|
||||
|
||||
static void gameover_byfirskattack_loop(void)
|
||||
{
|
||||
}
|
||||
|
||||
static void gameover_byfirskattack_draw(void)
|
||||
{
|
||||
t_sprite *const allsprites[][4] = {
|
||||
{&g_gameover_env.spr_snas, &g_gameover_env.spr_attack, NULL, NULL},
|
||||
{&g_gameover_env.spr_snas, &g_gameover_env.spr_explosion1, NULL, NULL},
|
||||
{&g_gameover_env.spr_explosion2, NULL, &g_gameover_env.spr_gameover,
|
||||
&g_gameover_env.spr_youded},
|
||||
{NULL, NULL, &g_gameover_env.spr_gameover, &g_gameover_env.spr_youded}};
|
||||
t_sprite *const *sprites = allsprites[g_gameover_env.state];
|
||||
|
||||
if (sprites[0])
|
||||
if (!sprite_draw(g_gameover_env.snaspos, sprites[0]))
|
||||
g_gameover_env.state++;
|
||||
if (sprites[1])
|
||||
if (!sprite_draw(g_gameover_env.snaspos, sprites[1]))
|
||||
g_gameover_env.state++;
|
||||
if (sprites[2])
|
||||
if (!sprite_draw(point_init(0, 0), sprites[2]))
|
||||
g_gameover_env.state++;
|
||||
if (sprites[3])
|
||||
if (!sprite_draw(point_init(0, 0), sprites[3]))
|
||||
g_gameover_env.state++;
|
||||
}
|
||||
|
||||
void gameover_byfirskattack(t_character *character)
|
||||
{
|
||||
const t_point snas_p = room_find(snas_init);
|
||||
const t_spritesmap_id snas_sprite = character->sprites->still;
|
||||
|
||||
g_gameover_env.snaspos
|
||||
= point_subpoint(
|
||||
point_subpoint(
|
||||
point_multiply(snas_p, 50),
|
||||
g_env.camera.pos),
|
||||
point_multiply(
|
||||
point_fromdirection(character->direction),
|
||||
character->walk_remaining_steps * 50 / character->walk_steps_nb
|
||||
));
|
||||
g_gameover_env.spr_snas = sprite_init(snas_sprite);
|
||||
g_gameover_env.spr_snas.index = character->direction;
|
||||
g_gameover_env.spr_attack = sprite_init(SPR_KNIFEATTACK);
|
||||
g_gameover_env.spr_gameover = sprite_init(SPR_GAMEOVER);
|
||||
g_gameover_env.spr_youded = sprite_init(SPR_YOUDED);
|
||||
g_gameover_env.spr_explosion1 = sprite_init(SPR_EXPLOSION_1);
|
||||
g_gameover_env.spr_explosion2 = sprite_init(SPR_EXPLOSION_2);
|
||||
g_gameover_env.state = 0;
|
||||
g_loopfunctions.loop = gameover_byfirskattack_loop;
|
||||
g_loopfunctions.draw = gameover_byfirskattack_draw;
|
||||
}
|
||||
30
src/gameover/gameover_utils.h
Normal file
30
src/gameover/gameover_utils.h
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* gameover_utils.h :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/04/17 18:19:30 by mcolonna #+# #+# */
|
||||
/* Updated: 2024/04/17 18:20:07 by mcolonna ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#ifndef GAMEOVER_UTILS_H
|
||||
# define GAMEOVER_UTILS_H
|
||||
|
||||
# include "includes.h"
|
||||
|
||||
typedef struct s_gameover_env
|
||||
{
|
||||
t_point snaspos;
|
||||
t_sprite spr_snas;
|
||||
t_sprite spr_attack;
|
||||
t_sprite spr_gameover;
|
||||
t_sprite spr_youded;
|
||||
t_sprite spr_explosion1;
|
||||
t_sprite spr_explosion2;
|
||||
int state;
|
||||
} t_gameover_env;
|
||||
|
||||
#endif
|
||||
|
|
@ -6,12 +6,14 @@
|
|||
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/02/26 15:28:34 by mcolonna #+# #+# */
|
||||
/* Updated: 2024/04/11 17:57:05 by mcolonna ### ########.fr */
|
||||
/* Updated: 2024/04/17 13:26:57 by mcolonna ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
t_loopfunctions g_loopfunctions;
|
||||
|
||||
int expose_hook(void)
|
||||
{
|
||||
display_flush();
|
||||
|
|
@ -27,9 +29,9 @@ int close_hook(void)
|
|||
static void loop(void)
|
||||
{
|
||||
input_loop();
|
||||
room_loop(g_env.room);
|
||||
g_loopfunctions.loop();
|
||||
display_erase();
|
||||
room_draw(g_env.room);
|
||||
g_loopfunctions.draw();
|
||||
display_flush();
|
||||
}
|
||||
|
||||
|
|
@ -41,6 +43,8 @@ int loop_hook(void)
|
|||
|
||||
int main(int argc, t_const_string *argv)
|
||||
{
|
||||
g_loopfunctions.loop = room_loop;
|
||||
g_loopfunctions.draw = room_draw;
|
||||
if (argc != 2)
|
||||
error_str("so_long", "takes 1 argument");
|
||||
g_env.mc = mem_newclass(error_err);
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/04/11 13:55:04 by mcolonna #+# #+# */
|
||||
/* Updated: 2024/04/15 18:01:36 by mcolonna ### ########.fr */
|
||||
/* Updated: 2024/04/17 16:19:43 by mcolonna ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -50,7 +50,7 @@ t_object firsk_init(t_memclass mc)
|
|||
|
||||
r.type = type;
|
||||
data = mem_alloc(error_err, mc, sizeof(t_firsk_data));
|
||||
data->character = character_init((t_character_sprites *)&sprites, 5);
|
||||
data->character = character_init((t_character_sprites *)&sprites, 4);
|
||||
r.data = data;
|
||||
return (r);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,12 +6,22 @@
|
|||
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/03/15 15:27:03 by mcolonna #+# #+# */
|
||||
/* Updated: 2024/04/15 18:10:32 by mcolonna ### ########.fr */
|
||||
/* Updated: 2024/04/17 16:20:51 by mcolonna ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
static bool snas_walk_through(t_object *obj, t_character *character,
|
||||
t_point pos)
|
||||
{
|
||||
(void)obj;
|
||||
(void)character;
|
||||
(void)pos;
|
||||
gameover_byfirskattack(&((t_snas_data *)obj->data)->character);
|
||||
return (false);
|
||||
}
|
||||
|
||||
static t_direction snas_brain(t_point pos)
|
||||
{
|
||||
(void)pos;
|
||||
|
|
@ -45,7 +55,7 @@ t_object snas_init(t_memclass mc)
|
|||
{
|
||||
static const t_objecttype type
|
||||
= {solid: false, init: snas_init, loop: snas_loop, draw: snas_draw,
|
||||
walk_through: NULL};
|
||||
walk_through: snas_walk_through};
|
||||
static const t_character_sprites sprites = {
|
||||
still: SPR_SNAS,
|
||||
walk_left: SPR_SNAS_WALK_LEFT,
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/04/09 15:11:29 by mcolonna #+# #+# */
|
||||
/* Updated: 2024/04/15 18:50:31 by mcolonna ### ########.fr */
|
||||
/* Updated: 2024/04/17 14:14:45 by mcolonna ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -116,31 +116,31 @@ void room_init(t_const_string path)
|
|||
room_checkaccessibilities(path);
|
||||
}
|
||||
|
||||
void room_draw(t_room room)
|
||||
void room_draw(void)
|
||||
{
|
||||
t_point p;
|
||||
t_object *obj;
|
||||
t_point p;
|
||||
t_object *obj;
|
||||
|
||||
camera_sync();
|
||||
p.y = -1;
|
||||
while (++p.y < room.height)
|
||||
while (++p.y < g_env.room.height)
|
||||
{
|
||||
p.x = -1;
|
||||
while (++p.x < room.width)
|
||||
sprite_draw(
|
||||
to_camera_pos(p), room.surfaces + p.y * room.width + p.x);
|
||||
while (++p.x < g_env.room.width)
|
||||
sprite_draw(to_camera_pos(p),
|
||||
g_env.room.surfaces + p.y * g_env.room.width + p.x);
|
||||
}
|
||||
p.y = -1;
|
||||
while (++p.y < room.height)
|
||||
while (++p.y < g_env.room.height)
|
||||
{
|
||||
p.x = -1;
|
||||
while (++p.x < room.width)
|
||||
while (++p.x < g_env.room.width)
|
||||
{
|
||||
obj = room.objects[p.y * room.width + p.x];
|
||||
obj = g_env.room.objects[p.y * g_env.room.width + p.x];
|
||||
if (obj)
|
||||
obj->type.draw(obj, to_camera_pos(p));
|
||||
visual_loop(
|
||||
&room.visuals[p.y * room.width + p.x], to_camera_pos(p));
|
||||
visual_loop(&g_env.room.visuals[p.y * g_env.room.width + p.x],
|
||||
to_camera_pos(p));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: mcolonna <marvin@42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/04/09 15:14:49 by mcolonna #+# #+# */
|
||||
/* Updated: 2024/04/09 15:21:02 by mcolonna ### ########.fr */
|
||||
/* Updated: 2024/04/17 13:21:32 by mcolonna ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -39,7 +39,7 @@ static bool isinlist(void *addr, t_list list)
|
|||
return (false);
|
||||
}
|
||||
|
||||
void room_loop(t_room room)
|
||||
void room_loop(void)
|
||||
{
|
||||
t_point pos;
|
||||
t_object *object;
|
||||
|
|
@ -49,16 +49,16 @@ void room_loop(t_room room)
|
|||
|
||||
objects_done = list_createempty(mc);
|
||||
pos.x = 0;
|
||||
while (pos.x < room.width)
|
||||
while (pos.x < g_env.room.width)
|
||||
{
|
||||
pos.y = 0;
|
||||
while (pos.y < room.height)
|
||||
while (pos.y < g_env.room.height)
|
||||
{
|
||||
object = room.objects[pos.y * room.width + pos.x];
|
||||
object = g_env.room.objects[pos.y * g_env.room.width + pos.x];
|
||||
if (object && !isinlist(object, objects_done))
|
||||
{
|
||||
move = object->type.loop(object, pos);
|
||||
moveobject(room, pos, move);
|
||||
moveobject(g_env.room, pos, move);
|
||||
list_add(error_err, &objects_done, object);
|
||||
}
|
||||
pos.y++;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue