-#include "mspell/mspell-damage-calculator.h"
+#include "mspell/mspell-damage-calculator.h"
#include "game-option/birth-options.h"
#include "inventory/inventory-slot-types.h"
#include "monster-race/monster-race.h"
#include "monster/monster-status.h"
#include "player-info/equipment-info.h"
#include "system/floor-type-definition.h"
-#include "system/monster-race-definition.h"
-#include "system/monster-type-definition.h"
-#include "system/object-type-definition.h"
+#include "system/item-entity.h"
+#include "system/monster-entity.h"
+#include "system/monster-race-info.h"
#include "system/player-type-definition.h"
#include "util/bit-flags-calculator.h"
* @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
* @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
*/
-static HIT_POINT monspell_damage_roll(HIT_POINT dam, int dice_num, int dice_side, int mult, int div, int TYPE)
+static int monspell_damage_roll(int dam, int dice_num, int dice_side, int mult, int div, int TYPE)
{
switch (TYPE) {
case DAM_MAX:
return dam;
}
- if (dam < 1)
+ if (dam < 1) {
dam = 1;
+ }
return dam;
}
* @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
* @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
*/
-static HIT_POINT monspell_damage_base(
+static int monspell_damage_base(
PlayerType *player_ptr, MonsterAbilityType ms_type, int hp, int rlev, bool powerful, int shoot_dd, int shoot_ds, int shoot_base, int TYPE)
{
- HIT_POINT dam = 0, dice_num = 0, dice_side = 0, mult = 1, div = 1;
+ int dam = 0, dice_num = 0, dice_side = 0, mult = 1, div = 1;
switch (ms_type) {
case MonsterAbilityType::SHRIEK:
dice_num = 10;
dice_side = 10;
break;
+ case MonsterAbilityType::BA_METEOR:
+ dam = 50 + rlev / 2;
+ dice_num = rlev * 5 / 2;
+ dice_side = 2;
+ break;
case MonsterAbilityType::DRAIN_MANA:
dam = rlev;
div = 1;
dice_num = 13;
dice_side = 14;
break;
+ case MonsterAbilityType::BO_METEOR:
+ dam = 30 + rlev * 2;
+ dice_num = 1;
+ dice_side = rlev;
+ break;
+ case MonsterAbilityType::BO_LITE:
+ dam = powerful ? 60 : 40;
+ dice_num = 1;
+ dice_side = powerful ? rlev * 4 : rlev * 2;
+ break;
case MonsterAbilityType::MISSILE:
dam = (rlev / 3);
dice_num = 2;
return -1;
case MonsterAbilityType::S_UNIQUE:
return -1;
+ case MonsterAbilityType::S_DEAD_UNIQUE:
+ return -1;
case MonsterAbilityType::MAX:
return -1;
}
* @param dd ダイス数への参照ポインタ
* @param ds ダイス面への参照ポインタ
*/
-void monspell_shoot_dice(monster_race *r_ptr, int *dd, int *ds)
+void monspell_shoot_dice(MonsterRaceInfo *r_ptr, int *dd, int *ds)
{
int p = -1; /* Position of SHOOT */
int n = 0; /* Number of blows */
const int max_blows = 4;
for (int m = 0; m < max_blows; m++) {
- if (r_ptr->blow[m].method != RaceBlowMethodType::NONE)
- n++; /* Count blows */
+ if (r_ptr->blows[m].method != RaceBlowMethodType::NONE) {
+ n++;
+ } /* Count blows */
- if (r_ptr->blow[m].method == RaceBlowMethodType::SHOOT) {
+ if (r_ptr->blows[m].method == RaceBlowMethodType::SHOOT) {
p = m; /* Remember position */
break;
}
}
/* When full blows, use a first damage */
- if (n == max_blows)
+ if (n == max_blows) {
p = 0;
+ }
if (p < 0) {
(*dd) = 0;
(*ds) = 0;
} else {
- (*dd) = r_ptr->blow[p].d_dice;
- (*ds) = r_ptr->blow[p].d_side;
+ (*dd) = r_ptr->blows[p].d_dice;
+ (*ds) = r_ptr->blows[p].d_side;
}
}
* @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
* @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
*/
-HIT_POINT monspell_damage(PlayerType *player_ptr, MonsterAbilityType ms_type, MONSTER_IDX m_idx, int TYPE)
+int monspell_damage(PlayerType *player_ptr, MonsterAbilityType ms_type, MONSTER_IDX m_idx, int TYPE)
{
auto *floor_ptr = player_ptr->current_floor_ptr;
auto *m_ptr = &floor_ptr->m_list[m_idx];
- auto *r_ptr = &r_info[m_ptr->r_idx];
+ auto *r_ptr = &m_ptr->get_monrace();
DEPTH rlev = monster_level_idx(floor_ptr, m_idx);
- HIT_POINT hp = (TYPE == DAM_ROLL) ? m_ptr->hp : m_ptr->max_maxhp;
+ int hp = (TYPE == DAM_ROLL) ? m_ptr->hp : m_ptr->max_maxhp;
int shoot_dd, shoot_ds;
monspell_shoot_dice(r_ptr, &shoot_dd, &shoot_ds);
* @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
* @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
*/
-HIT_POINT monspell_race_damage(PlayerType *player_ptr, MonsterAbilityType ms_type, MONRACE_IDX r_idx, int TYPE)
+int monspell_race_damage(PlayerType *player_ptr, MonsterAbilityType ms_type, MonsterRaceId r_idx, int TYPE)
{
- auto *r_ptr = &r_info[r_idx];
+ auto *r_ptr = &monraces_info[r_idx];
DEPTH rlev = ((r_ptr->level >= 1) ? r_ptr->level : 1);
bool powerful = any_bits(r_ptr->flags2, RF2_POWERFUL);
- HIT_POINT hp = r_ptr->hdice * (ironman_nightmare ? 2 : 1) * r_ptr->hside;
+ int hp = r_ptr->hdice * (ironman_nightmare ? 2 : 1) * r_ptr->hside;
int shoot_dd, shoot_ds;
monspell_shoot_dice(r_ptr, &shoot_dd, &shoot_ds);
* @param TYPE DAM_MAXで最大値を返し、DAM_MINで最小値を返す。DAM_ROLLはダイスを振って値を決定する。
* @return 攻撃呪文のダメージを返す。攻撃呪文以外は-1を返す。
*/
-HIT_POINT monspell_bluemage_damage(PlayerType *player_ptr, MonsterAbilityType ms_type, PLAYER_LEVEL plev, int TYPE)
+int monspell_bluemage_damage(PlayerType *player_ptr, MonsterAbilityType ms_type, PLAYER_LEVEL plev, int TYPE)
{
int hp = player_ptr->chp;
int shoot_dd = 1, shoot_ds = 1, shoot_base = 0;
- ObjectType *o_ptr = nullptr;
+ ItemEntity *o_ptr = nullptr;
- if (has_melee_weapon(player_ptr, INVEN_MAIN_HAND))
+ if (has_melee_weapon(player_ptr, INVEN_MAIN_HAND)) {
o_ptr = &player_ptr->inventory_list[INVEN_MAIN_HAND];
- else if (has_melee_weapon(player_ptr, INVEN_SUB_HAND))
+ } else if (has_melee_weapon(player_ptr, INVEN_SUB_HAND)) {
o_ptr = &player_ptr->inventory_list[INVEN_SUB_HAND];
+ }
if (o_ptr) {
shoot_dd = o_ptr->dd;