示例#1
0
文件: pc.C 项目: Methuselas/btbuilder
void BTPc::useAutoCombatSkill(bool melee, BitField &special)
{
 BTGame *game = BTGame::getGame();
 BTSkillList &skillList = game->getSkillList();
 for (int i = 0; i < skillList.size(); ++i)
 {
  if ((skillList[i]->use == BTSKILLUSE_AUTOCOMBAT) ||
   ((melee) && (skillList[i]->use == BTSKILLUSE_AUTOCOMBATMELEE)) ||
   ((!melee) && (skillList[i]->use == BTSKILLUSE_AUTOCOMBATRANGED)))
  {
   if (((-1 == skillList[i]->after) || (combat.skillUsed == skillList[i]->after)) && (useSkill(i)))
   {
    special.set(skillList[i]->effect);
   }
  }
 }
}
示例#2
0
文件: pc.C 项目: Methuselas/btbuilder
std::string BTPc::attack(BTCombatant *defender, int weapon, int &numAttacksLeft, int &activeNum)
{
 BTGame *game = BTGame::getGame();
 BTFactory<BTItem> &itemList = game->getItemList();
 BTFactory<BTMonster> &monList = game->getMonsterList();
 BTDice damageDice(1, 2);
 IShort chanceXSpecial(0);
 IShort xSpecial(BTEXTRADAMAGE_NONE);
 bool melee = true;
 if (-1 == weapon)
 {
  if (BTMONSTER_NONE != monster)
  {
   damageDice = monList[monster].getMeleeDamage();
   chanceXSpecial = 100;
   xSpecial = monList[monster].getMeleeExtra();
  }
  else
  {
   XMLVector<BTSkill*> &skill = game->getSkillList();
   for (int i = 0; i < skill.size(); ++i)
   {
    if ((skill[i]->special == BTSKILLSPECIAL_BAREHANDS) && (hasSkillUse(i)))
    {
     BTDice *skillDice = skill[i]->getRoll(getSkill(i));
     if (skillDice)
      damageDice = *skillDice;
     break;
    }
   }
  }
 }
 else
 {
  BTItem &itemWeapon = itemList[weapon];
  damageDice = itemWeapon.getDamage();
  chanceXSpecial = itemWeapon.getChanceXSpecial();
  xSpecial = itemWeapon.getXSpecial();
  if ((BTITEM_ARROW == itemWeapon.getType()) || (BTITEM_THROWNWEAPON == itemWeapon.getType()))
   melee = false;
 }
 if (stat[BTSTAT_ST] > 14)
  damageDice.setModifier(damageDice.getModifier() + stat[BTSTAT_ST] - 14);
 std::string cause;
 std::string effect;
 if (-1 == weapon)
 {
  if (BTMONSTER_NONE == monster)
  {
   cause = "punches at";
   effect = "and strikes";
  }
  else
  {
   cause = monList[monster].getMeleeMessage();
   effect = "and hits";
  }
 }
 else
 {
  BTItem &itemWeapon = itemList[weapon];
  cause = itemWeapon.getCause();
  effect = itemWeapon.getEffect();
  if ((effect.length() >= 4) && (0 == strcmp(effect.c_str() + effect.length() - 4, " for")))
   effect.resize(effect.length() - 4);
 }
 return BTCombatant::attack(defender, melee, cause, effect, damageDice, chanceXSpecial, xSpecial, numAttacksLeft, activeNum);
}