// Ryzom - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include "stdpch.h" #include "combat_attacker.h" #include "phrase_utilities_functions.h" using namespace std; using namespace NLMISC; bool UseWeaponDamageFactorModifier = true; NLMISC_COMMAND(UseWeaponDamageFactorModifier,"toggle the use of the item damage factor (temporary patch item damage )","") { UseWeaponDamageFactorModifier = !UseWeaponDamageFactorModifier; log.displayNL("UseWeaponDamageFactorModifier is %s",UseWeaponDamageFactorModifier?"used":"unused"); return true; } //-------------------------------------------------------------- // CCombatWeapon constructor //-------------------------------------------------------------- CCombatWeapon::CCombatWeapon(CGameItemPtr itemPtr) { if (itemPtr == NULL || itemPtr->getStaticForm() == NULL ) return; Family = itemPtr->getStaticForm()->Family; switch(Family) { case ITEMFAMILY::MELEE_WEAPON: if (!itemPtr->getStaticForm()->MeleeWeapon) return; DmgType = itemPtr->getStaticForm()->MeleeWeapon->DamageType; Skill = itemPtr->getStaticForm()->Skill; break; case ITEMFAMILY::RANGE_WEAPON: if (!itemPtr->getStaticForm()->RangeWeapon) return; DmgType = itemPtr->getStaticForm()->RangeWeapon->DamageType; Skill = itemPtr->getStaticForm()->Skill; Range = itemPtr->getRange(); break; case ITEMFAMILY::AMMO: if (!itemPtr->getStaticForm()->Ammo) return; DmgType = itemPtr->getStaticForm()->Ammo->DamageType; Range = itemPtr->getRange(); break; default: break; }; if (Skill == SKILLS::unknown) { nlwarning(" Error : item %s skill is Unknown", itemPtr->getStaticForm()->Name.c_str()); } SpeedInTicks = uint16(itemPtr->getSpeed() / CTickEventHandler::getGameTimeStep()); Quality = itemPtr->quality(); if ( UseWeaponDamageFactorModifier ) Damage = itemPtr->getDamage() * 260 / (10 + Quality*10); else Damage = itemPtr->getDamage(); // SkillValue must be init in the calling class SkillValue = 0; } // CCombatWeapon // //-------------------------------------------------------------- // CCombatAttackerPlayer::getItem //-------------------------------------------------------------- bool CCombatAttackerPlayer::getItem( TAttackerItem item, CCombatWeapon &weaponItem) const { switch(item) { case RightHandItem: if ( _RightHandItem != NULL) { weaponItem = CCombatWeapon(_RightHandItem); return true; } else return false; break; case LeftHandItem: if ( _LeftHandItem != NULL ) { weaponItem = CCombatWeapon(_LeftHandItem); return true; } else return false; break; case Ammo: if ( _Ammos != NULL) { weaponItem = CCombatWeapon( _Ammos ); return true; } else return false; break; default: return false; }; } // CCombatAttackerPlayer::getItem // //-------------------------------------------------------------- // CCombatAttackerPlayer::getItem //-------------------------------------------------------------- bool CCombatAttackerPlayer::checkAmmoAmount( uint8 qty ) const { static const CSheetId StackItem("stack.sitem"); if (_Ammos != NULL) { uint16 nbAmmo = 0; if (_Ammos->getSheetId() == StackItem) { nbAmmo = _Ammos->getChildren().size(); //- _Ammos->getLockState(); } else { nbAmmo = 1 ;//- _Ammos->getLockState(); } return (nbAmmo >= (uint16)qty); } else return false; } // CCombatAttackerPlayer::checkAmmoAmount // //-------------------------------------------------------------- // CCombatAttackerAI::CCombatAttackerAI //-------------------------------------------------------------- CCombatAttackerAI::CCombatAttackerAI( const TDataSetRow &rowId ) : CCombatAttacker(rowId) { CEntityBase *entity = CEntityBaseManager::getEntityBasePtr(rowId); if (!entity) return; const CStaticCreatures * form = CSheets::getCreaturesForm( entity->_SheetId ); if ( !form ) { nlwarning( " invalid creature form %s in entity %s", entity->_SheetId.toString().c_str(), entity->getId().toString().c_str() ); return; } _RightHandWeapon.Quality = form->Level; _RightHandWeapon.Damage = form->CreatureDamagePerHit * 260/(10+10*form->Level); _RightHandWeapon.DmgType = DMGTYPE::SLASHING; _RightHandWeapon.SpeedInTicks = 30; _RightHandWeapon.Family = ITEMFAMILY::MELEE_WEAPON; _RightHandWeapon.Skill = SKILLS::SFM1H; INFOLOG("AttackerAi :_RightHandWeapon.Quality = %u, _RightHandWeapon.Damage = %u", _RightHandWeapon.Quality, _RightHandWeapon.Damage); } // CCombatAttackerAI::CCombatAttackerAI // //-------------------------------------------------------------- // CCombatAttackerAI::getItem //-------------------------------------------------------------- bool CCombatAttackerAI::getItem( TAttackerItem item, CCombatWeapon &weaponItem) const { switch(item) { case RightHandItem: if ( _RightHandWeapon.Quality != 0) { weaponItem = _RightHandWeapon; return true; } else return false; break; case LeftHandItem: if ( _LeftHandWeapon.Quality != 0) { weaponItem = _LeftHandWeapon; return true; } else return false; break; case Ammo: if ( _Ammo.Quality != 0) { weaponItem = _Ammo; return true; } else return false; break; default: return false; }; } // CCombatAttackerAI::getItem //