@@ -178,18 +178,24 @@ void PedestrianStatesManager::ProcessMotionActions()
178178
179179bool PedestrianStatesManager::TryToShoot ()
180180{
181+ debug_assert (mPedestrian ->mCurrentWeapon < eWeaponType_COUNT);
182+
181183 float currGameTime = gTimeManager .mGameTime ;
182- if (mPedestrian ->mWeaponRechargeTime > currGameTime ||
184+ if (mPedestrian ->mWeaponRechargeTime >= currGameTime ||
183185 mPedestrian ->mWeaponsAmmo [mPedestrian ->mCurrentWeapon ] == 0 )
184186 {
185187 return false ;
186188 }
187189
188190 glm::vec3 currPosition = mPedestrian ->mPhysicsBody ->GetPosition ();
189- if (mPedestrian ->mCurrentWeapon == eWeaponType_Fists)
191+
192+ // get weapon params
193+ WeaponStyle& weaponParams = gGameMap .mStyleData .mWeapons [mPedestrian ->mCurrentWeapon ];
194+
195+ if (weaponParams.mFireTypeID == eWeaponFireType_Melee)
190196 {
191197 glm::vec2 posA { currPosition.x , currPosition.z };
192- glm::vec2 posB = posA + (mPedestrian ->mPhysicsBody ->GetSignVector () * gGameParams . mPedestrianFistsHitDistance );
198+ glm::vec2 posB = posA + (mPedestrian ->mPhysicsBody ->GetSignVector () * weaponParams. mBaseMeleeHitDistance );
193199 // find candidates
194200 PhysicsLinecastResult linecastResult;
195201 gPhysics .QueryObjectsLinecast (posA, posB, linecastResult);
@@ -204,7 +210,7 @@ bool PedestrianStatesManager::TryToShoot()
204210 pedBody->mReferencePed ->ReceiveDamage (mPedestrian ->mCurrentWeapon , mPedestrian );
205211 }
206212 }
207- else // create projectile
213+ else if (weaponParams. mFireTypeID == eWeaponFireType_Projectile)
208214 {
209215 glm::vec2 signVector = mPedestrian ->mPhysicsBody ->GetSignVector ();
210216 glm::vec2 offset = (signVector * 1 .0f ); // todo: magic numbers
@@ -213,20 +219,17 @@ bool PedestrianStatesManager::TryToShoot()
213219 currPosition.y ,
214220 currPosition.z + offset.y
215221 };
216- eProjectileType projectileTypeID = eProjectileType_Bullet; // todo: add weapon desc with projectile type
217- switch (mPedestrian ->mCurrentWeapon )
218- {
219- case eWeaponType_Flamethrower: projectileTypeID = eProjectileType_Flame;
220- break ;
221- case eWeaponType_RocketLauncher: projectileTypeID = eProjectileType_Rocket;
222- break ;
223- }
224- gGameObjectsManager .CreateProjectile (projectilePos, mPedestrian ->mPhysicsBody ->GetRotationAngle (), projectileTypeID);
225- }
222+ debug_assert (weaponParams.mProjectileID < eProjectileType_COUNT);
223+ gGameObjectsManager .CreateProjectile (projectilePos, mPedestrian ->mPhysicsBody ->GetRotationAngle (), weaponParams.mProjectileID );
224+ }
225+ else
226+ {
227+ debug_assert (false );
228+ }
226229
227230 // setup cooldown time for weapons
228- float rechargeTime = gGameParams . mWeaponsRechargeTime [ mPedestrian -> mCurrentWeapon ] ;
229- mPedestrian ->mWeaponRechargeTime = currGameTime + rechargeTime;
231+ float rechargeTime = ( 1 . 0f / weaponParams. mBaseFireRate ) ;
232+ mPedestrian ->mWeaponRechargeTime = ( currGameTime + rechargeTime) ;
230233 return true ;
231234}
232235
0 commit comments