- Add instant help message - Prevent from ending town combat if one member is in a forcecage or if everyone's in a different forcecage (you can still end it if everyone's in the same cage) - If entering town combat while caged, everyone remains in the cage - Penalties to melee combat if the target or attacker is in a forcecage (higher penalties if the attacker is caged, unless they're using a pole weapon) - Instead of placing a forcecage at every location where someone gains forcecage status, the game now syncs forcecages (placing them on locations where someone has forcecage status) at the end of the move. - The Flash Step and Word of Recall spells and any specials that move the party also clear their forcecage status, so that a new forcecage won't appear on their new location. If they're moved into a forcecage, the syncing process will give them the status at the end of the move. - Forcecage status now supported for the Occasional Status item ability - Forcecages now eventually expire on their own even if you can't break out. Unoccupied ones also have a slight (0.1%) chance each turn to expire. - Affect Status node now allows forcecage status. (It also works as documented, using Extra 1c rather than 2a as the status type.) - Preset monsters placed in preset force cages gain the status at town initialization; it's a lot more than they'd gain through the syncing process, so unless they break free, it'll last a very long time. - Monsters/PCs with spells (and PCs with Mage Lore) now have an increased chance of resisting entrapment in a forcecage - If the full party is subject to a forcecage, the PC with the best chance of breaking free (assuming they don't resist) is chosen to determine whether they resist. Note that this may not be the PC with the best chance of resisting in the first place. - Protection from Forcecage now implemented as an item ability Other stuff (though related): - Reset party's combat pos to the null location (-1,-1) after a cutscene ends; to not do so would mess up get_loc() calls
73 lines
3.4 KiB
C++
73 lines
3.4 KiB
C++
|
|
#ifndef BOE_GAME_COMBAT_H
|
|
#define BOE_GAME_COMBAT_H
|
|
|
|
#include "location.hpp"
|
|
#include "monster.hpp"
|
|
#include "outdoors.hpp"
|
|
#include "boe.global.hpp"
|
|
#include "spell.hpp"
|
|
|
|
void start_outdoor_combat(cOutdoors::cCreature encounter,ter_num_t in_which_terrain,short num_walls);
|
|
bool pc_combat_move(location destination);
|
|
void char_parry();
|
|
void char_stand_ready();
|
|
void pc_attack(short who_att,iLiving* target);
|
|
void pc_attack_weapon(short who_att,iLiving& target,short hit_adj,short dam_adj,cItem& weap,short primary,bool do_poison);
|
|
short calc_spec_dam(eItemAbil abil,short abil_str,short abil_dat,iLiving& monst,eDamageType& dmg_type);
|
|
void place_target(location target);
|
|
void do_combat_cast(location target);
|
|
void handle_marked_damage();
|
|
void load_missile();
|
|
void fire_missile(location target);
|
|
bool combat_next_step();
|
|
bool pick_next_pc();
|
|
void combat_run_monst();
|
|
void do_monster_turn();
|
|
void monster_attack(short who_att,iLiving* target);
|
|
void monst_fire_missile(short m_num,short bless,std::pair<eMonstAbil,uAbility> abil,location source,iLiving* target);
|
|
void monst_basic_abil(short m_num, std::pair<eMonstAbil,uAbility> abil, iLiving* target);
|
|
bool monst_breathe(cCreature *caster,location targ_space,uAbility dam_type);
|
|
bool monst_cast_mage(cCreature *caster,short targ);
|
|
bool monst_cast_priest(cCreature *caster,short targ);
|
|
void damage_target(short target,short dam,eDamageType type,short sound_type = 0);
|
|
location find_fireball_loc(location where,short radius,short mode,short *m);
|
|
location closest_pc_loc(location where);
|
|
short count_levels(location where,short radius);
|
|
bool pc_near(short pc_num,location where,short radius);
|
|
bool monst_near(short m_num,location where,short radius,short active);
|
|
void fireball_space(location loc,short dam);
|
|
void place_spell_pattern(effect_pat_type pat,location center,short who_hit);
|
|
void place_spell_pattern(effect_pat_type pat,location center,eFieldType type,short who_hit);
|
|
void place_spell_pattern(effect_pat_type pat,location center,eDamageType type, short dice,short who_hit);
|
|
void modify_pattern(effect_pat_type *pat,unsigned short type);
|
|
void do_shockwave(location target);
|
|
void radius_damage(location target,short radius, short dam, eDamageType type);
|
|
void hit_pcs_in_space(location target,short dam,eDamageType type,short report,short hit_all);
|
|
void hit_space(location target,short dam,eDamageType type,short report,short hit_all);
|
|
void do_poison();
|
|
void handle_disease();
|
|
void handle_acid();
|
|
bool no_pcs_left();
|
|
bool hit_end_c_button();
|
|
bool out_monst_all_dead();
|
|
void end_combat();
|
|
bool combat_cast_mage_spell();
|
|
bool combat_cast_priest_spell();
|
|
void combat_immed_mage_cast(short current_pc, eSpell spell_num, bool freebie = false);
|
|
void combat_immed_priest_cast(short current_pc, eSpell spell_num, bool freebie = false);
|
|
void start_spell_targeting(eSpell num, bool freebie = false, int spell_range = 4, eSpellPat pat = PAT_SINGLE);
|
|
void start_fancy_spell_targeting(eSpell num, bool freebie = false, int spell_range = 4, eSpellPat pat = PAT_SINGLE, int targets = 1);
|
|
void spell_cast_hit_return();
|
|
void process_fields();
|
|
void process_force_cage(location loc, short i, short bonus = 0);
|
|
void break_force_cage(location loc);
|
|
void scloud_space(short m,short n);
|
|
void web_space(short m,short n);
|
|
void sleep_cloud_space(short m,short n);
|
|
void take_m_ap(short num,cCreature *monst);
|
|
void add_new_action(short pc_num);
|
|
short get_monst_sound(cCreature *attacker,short which_att);
|
|
|
|
#endif
|