/* 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; } }