From 2fbdf974338bde8576efdae40a819a76b2391033 Mon Sep 17 00:00:00 2001 From: "Juan J. Martinez" Date: Sun, 5 Nov 2023 11:22:55 +0000 Subject: Initial import of the open source release --- src/et_demon.c | 156 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 src/et_demon.c (limited to 'src/et_demon.c') diff --git a/src/et_demon.c b/src/et_demon.c new file mode 100644 index 0000000..fd54f8e --- /dev/null +++ b/src/et_demon.c @@ -0,0 +1,156 @@ +/* + Kitsune's Curse + Copyright (C) 2020-2023 Juan J. Martinez + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ +#include + +#include "splib.h" +#include "plw.h" +#include "sound.h" +#include "main.h" + +#include "maps.h" + +// generated +#include "demon.h" +#include "fireball.h" + +#include "entities.h" +#include "et_demon.h" +#include "et_player.h" + +static const struct st_entity base = { + ET_EXPLO, + 0, 0, 0, 0, 0, 0, 0, + 0, // param + 0, // extra + update_fireball, + draw_fireball, + 0 +}; + +void draw_fireball() +{ + put_sprite4(fireball[player_frames[*it_frame]], *it_x, *it_y, 1, 0); + erase_sprite(*it_ox, *it_oy, 1); +} + +void update_fireball() +{ + if ((*it_delay)++ == 1) + { + *it_delay = 0; + if (++(*it_frame) > WALK_CYCLE) + *it_frame = WALK; + } + + if (*it_param) + { + if (is_map_blocked(*it_x + 11, *it_y + 8) + || *it_x > TW * TMW - 8 - 4) + goto fireball_done; + else + *it_x += 2; + } + else + { + if (is_map_blocked(*it_x - 4, *it_y + 8) + || *it_x < 4) + goto fireball_done; + else + *it_x -= 2; + } + + if (check_for_player(8)) + { + player_hit(2); +fireball_done: + erase_sprite(*it_ox, *it_oy, 1); + destroy_entity(); + } +} + +void new_fireball() +{ + if (!new_entity()) + return; + + memcpy(sp_new, &base, sizeof(base) - 2); + if (*it_param) + sp_new->x = *it_x + 8; + else + sp_new->x = *it_x - 8; + sp_new->param = *it_param; + sp_new->y = *it_y + 8; + + PLW_PlaySoundEffectP(EFX_MAGIC); +} + +void draw_demon() +{ + put_sprite4(demon[player_frames[*it_frame]], *it_x, *it_y, 3, *it_param & 128); + erase_sprite(*it_ox, *it_oy, 3); +} + +void update_demon() +{ + if ((*it_delay)++ == 2 || *it_delay == 11) + { + *it_delay = 0; + if (++(*it_frame) > WALK_CYCLE) + *it_frame = WALK; + } + + if (*it_extra < 72) + *it_extra += 1; + else if (abs_sub(py, *it_y) < 8 && + (*it_param && px > *it_x || !*it_param && px < *it_x)) + { + new_fireball(); + *it_extra = 0; + + *it_frame = WALK_CYCLE; + *it_delay = 3; + } + + if (*it_param) + { + if (is_map_blocked(*it_x + 11, *it_y + 8) + || !is_map_blocked(*it_x + 11, *it_y + 24) + || *it_x > TW * TMW - 8 - 4) + goto demon_change_dir; + else + *it_x += 1; + } + else + { + if (is_map_blocked(*it_x - 4, *it_y + 8) + || !is_map_blocked(*it_x - 4, *it_y + 24) + || *it_x < 4) + goto demon_change_dir; + else + *it_x -= 1; + } + + if (check_for_player(24)) + { + player_hit(1); +demon_change_dir: + *it_param ^= 128; + *it_delay = 0; + *it_frame = WALK; + } +} -- cgit v1.2.3