#pragma once

#include "system/angband.h"
#include "spell/spells-util.h"

bool teleport_away(player_type* caster_ptr, MONSTER_IDX m_idx, POSITION dis, teleport_flags mode);
void teleport_monster_to(player_type* caster_ptr, MONSTER_IDX m_idx, POSITION ty, POSITION tx, int power, teleport_flags mode);
bool teleport_player_aux(player_type* creature_ptr, POSITION dis, bool is_quantum_effect, teleport_flags mode);
void teleport_player(player_type* creature_ptr, POSITION dis, BIT_FLAGS mode);
void teleport_player_away(MONSTER_IDX m_idx, player_type* target_ptr, POSITION dis, bool is_quantum_effect);
void teleport_player_to(player_type* creature_ptr, POSITION ny, POSITION nx, teleport_flags mode);
void teleport_away_followable(player_type* creature_ptr, MONSTER_IDX m_idx);
bool teleport_level_other(player_type* caster_ptr);
void teleport_level(player_type* creature_ptr, MONSTER_IDX m_idx);
bool recall_player(player_type* creature_ptr, TIME_EFFECT turns);
bool free_level_recall(player_type* creature_ptr);
bool reset_recall(player_type* caster_ptr);
bool apply_disenchant(player_type* target_ptr, BIT_FLAGS mode);
void call_the_void(player_type* caster_ptr);
void fetch(player_type* caster_ptr, DIRECTION dir, WEIGHT wgt, bool require_los);
void reserve_alter_reality(player_type* caster_ptr);
void identify_pack(player_type* target_ptr);
int remove_curse(player_type* caster_ptr);
int remove_all_curse(player_type* caster_ptr);
bool alchemy(player_type* caster_ptr);

bool artifact_scroll(player_type* caster_ptr);
bool ident_spell(player_type* caster_ptr, bool only_equip, tval_type item_tester_tval);
bool mundane_spell(player_type* ownner_ptr, bool only_equip);
bool identify_item(player_type* owner_ptr, object_type* o_ptr);
bool identify_fully(player_type* caster_ptr, bool only_equip, tval_type item_tester_tval);
bool recharge(player_type* caster_ptr, int power);
void display_spell_list(player_type* caster_ptr);
EXP experience_of_spell(player_type* caster_ptr, SPELL_IDX spell, REALM_IDX use_realm);
MANA_POINT mod_need_mana(player_type* caster_ptr, MANA_POINT need_mana, SPELL_IDX spell, REALM_IDX realm);
PERCENTAGE mod_spell_chance_1(player_type* caster_ptr, PERCENTAGE chance);
PERCENTAGE mod_spell_chance_2(player_type* caster_ptr, PERCENTAGE chance);
PERCENTAGE spell_chance(player_type* caster_ptr, SPELL_IDX spell, REALM_IDX realm);
void print_spells(player_type* caster_ptr, SPELL_IDX target_spell, SPELL_IDX* spells, int num, TERM_LEN y, TERM_LEN x, REALM_IDX realm);
bool polymorph_monster(player_type* caster_ptr, POSITION y, POSITION x);
bool dimension_door(player_type* caster_ptr);
bool mirror_tunnel(player_type* caster_ptr);
void massacre(player_type* caster_ptr);
bool eat_rock(player_type* caster_ptr);
bool shock_power(player_type* caster_ptr);
bool fetch_monster(player_type* caster_ptr);
bool booze(player_type* creature_ptr);
bool detonation(player_type* creature_ptr);
void blood_curse_to_enemy(player_type* caster_ptr, MONSTER_IDX m_idx);
bool fire_crimson(player_type* shooter_ptr);
bool tele_town(player_type* caster_ptr);
bool is_teleport_level_ineffective(player_type* caster_ptr, MONSTER_IDX idx);
