Add infos into target window
[ryzomcore.git] / ryzom / server / src / sabrina / combat_attacker.cpp
blob1b674ee29467ea8250d2c569edbca7e04a7c8511
1 // Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
2 // Copyright (C) 2010 Winch Gate Property Limited
3 //
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU Affero General Public License as
6 // published by the Free Software Foundation, either version 3 of the
7 // License, or (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU Affero General Public License for more details.
14 // You should have received a copy of the GNU Affero General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include "stdpch.h"
21 #include "combat_attacker.h"
22 #include "phrase_utilities_functions.h"
24 using namespace std;
25 using namespace NLMISC;
27 bool UseWeaponDamageFactorModifier = true;
29 NLMISC_COMMAND(UseWeaponDamageFactorModifier,"toggle the use of the item damage factor (temporary patch item damage )","")
31 UseWeaponDamageFactorModifier = !UseWeaponDamageFactorModifier;
33 log.displayNL("UseWeaponDamageFactorModifier is %s",UseWeaponDamageFactorModifier?"used":"unused");
34 return true;
37 //--------------------------------------------------------------
38 // CCombatWeapon constructor
39 //--------------------------------------------------------------
40 CCombatWeapon::CCombatWeapon(CGameItemPtr itemPtr)
42 if (itemPtr == NULL || itemPtr->getStaticForm() == NULL )
43 return;
45 Family = itemPtr->getStaticForm()->Family;
47 switch(Family)
49 case ITEMFAMILY::MELEE_WEAPON:
50 if (!itemPtr->getStaticForm()->MeleeWeapon)
51 return;
52 DmgType = itemPtr->getStaticForm()->MeleeWeapon->DamageType;
53 Skill = itemPtr->getStaticForm()->Skill;
54 break;
56 case ITEMFAMILY::RANGE_WEAPON:
57 if (!itemPtr->getStaticForm()->RangeWeapon)
58 return;
59 DmgType = itemPtr->getStaticForm()->RangeWeapon->DamageType;
60 Skill = itemPtr->getStaticForm()->Skill;
61 Range = itemPtr->getRange();
62 break;
64 case ITEMFAMILY::AMMO:
65 if (!itemPtr->getStaticForm()->Ammo)
66 return;
67 DmgType = itemPtr->getStaticForm()->Ammo->DamageType;
68 Range = itemPtr->getRange();
69 break;
71 default:
72 break;
75 if (Skill == SKILLS::unknown)
77 nlwarning("<CCombatWeapon::CCombatWeapon> Error : item %s skill is Unknown", itemPtr->getStaticForm()->Name.c_str());
80 SpeedInTicks = uint16(itemPtr->getSpeed() / CTickEventHandler::getGameTimeStep());
81 Quality = itemPtr->quality();
83 if ( UseWeaponDamageFactorModifier )
84 Damage = itemPtr->getDamage() * 260 / (10 + Quality*10);
85 else
86 Damage = itemPtr->getDamage();
89 // SkillValue must be init in the calling class
90 SkillValue = 0;
91 } // CCombatWeapon //
94 //--------------------------------------------------------------
95 // CCombatAttackerPlayer::getItem
96 //--------------------------------------------------------------
97 bool CCombatAttackerPlayer::getItem( TAttackerItem item, CCombatWeapon &weaponItem) const
99 switch(item)
101 case RightHandItem:
102 if ( _RightHandItem != NULL)
104 weaponItem = CCombatWeapon(_RightHandItem);
105 return true;
107 else
108 return false;
109 break;
111 case LeftHandItem:
112 if ( _LeftHandItem != NULL )
114 weaponItem = CCombatWeapon(_LeftHandItem);
115 return true;
117 else
118 return false;
119 break;
121 case Ammo:
122 if ( _Ammos != NULL)
124 weaponItem = CCombatWeapon( _Ammos );
125 return true;
127 else
128 return false;
129 break;
131 default:
132 return false;
134 } // CCombatAttackerPlayer::getItem //
137 //--------------------------------------------------------------
138 // CCombatAttackerPlayer::getItem
139 //--------------------------------------------------------------
140 bool CCombatAttackerPlayer::checkAmmoAmount( uint8 qty ) const
142 static const CSheetId StackItem("stack.sitem");
144 if (_Ammos != NULL)
146 uint16 nbAmmo = 0;
147 if (_Ammos->getSheetId() == StackItem)
149 nbAmmo = _Ammos->getChildren().size(); //- _Ammos->getLockState();
151 else
153 nbAmmo = 1 ;//- _Ammos->getLockState();
156 return (nbAmmo >= (uint16)qty);
158 else
159 return false;
160 } // CCombatAttackerPlayer::checkAmmoAmount //
164 //--------------------------------------------------------------
165 // CCombatAttackerAI::CCombatAttackerAI
166 //--------------------------------------------------------------
167 CCombatAttackerAI::CCombatAttackerAI( const TDataSetRow &rowId ) : CCombatAttacker(rowId)
169 CEntityBase *entity = CEntityBaseManager::getEntityBasePtr(rowId);
170 if (!entity)
171 return;
173 const CStaticCreatures * form = CSheets::getCreaturesForm( entity->_SheetId );
174 if ( !form )
176 nlwarning( "<CCombatAttackerAI::CCombatAttackerAI> invalid creature form %s in entity %s", entity->_SheetId.toString().c_str(), entity->getId().toString().c_str() );
177 return;
180 _RightHandWeapon.Quality = form->Level;
181 _RightHandWeapon.Damage = form->CreatureDamagePerHit * 260/(10+10*form->Level);
183 _RightHandWeapon.DmgType = DMGTYPE::SLASHING;
184 _RightHandWeapon.SpeedInTicks = 30;
185 _RightHandWeapon.Family = ITEMFAMILY::MELEE_WEAPON;
186 _RightHandWeapon.Skill = SKILLS::SFM1H;
188 INFOLOG("AttackerAi :_RightHandWeapon.Quality = %u, _RightHandWeapon.Damage = %u", _RightHandWeapon.Quality, _RightHandWeapon.Damage);
189 } // CCombatAttackerAI::CCombatAttackerAI //
192 //--------------------------------------------------------------
193 // CCombatAttackerAI::getItem
194 //--------------------------------------------------------------
195 bool CCombatAttackerAI::getItem( TAttackerItem item, CCombatWeapon &weaponItem) const
197 switch(item)
199 case RightHandItem:
200 if ( _RightHandWeapon.Quality != 0)
202 weaponItem = _RightHandWeapon;
203 return true;
205 else
206 return false;
207 break;
209 case LeftHandItem:
210 if ( _LeftHandWeapon.Quality != 0)
212 weaponItem = _LeftHandWeapon;
213 return true;
215 else
216 return false;
217 break;
219 case Ammo:
220 if ( _Ammo.Quality != 0)
222 weaponItem = _Ammo;
223 return true;
225 else
226 return false;
227 break;
229 default:
230 return false;
232 } // CCombatAttackerAI::getItem //