202 newDy:= yy*Power/cPowerDivisor; |
232 newDy:= yy*Power/cPowerDivisor; |
203 altUse:= false |
233 altUse:= false |
204 end; |
234 end; |
205 |
235 |
206 case CurAmmoType of |
236 case CurAmmoType of |
207 amGrenade: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtGrenade, 0, newDx, newDy, CurWeapon^.Timer); |
237 amGrenade: newGear:= AddGear(hwRound(lx), hwRound(ly), gtGrenade, 0, newDx, newDy, CurWeapon^.Timer); |
208 amMolotov: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtMolotov, 0, newDx, newDy, 0); |
238 amMolotov: newGear:= AddGear(hwRound(lx), hwRound(ly), gtMolotov, 0, newDx, newDy, 0); |
209 amClusterBomb: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtClusterBomb, 0, newDx, newDy, CurWeapon^.Timer); |
239 amClusterBomb: newGear:= AddGear(hwRound(lx), hwRound(ly), gtClusterBomb, 0, newDx, newDy, CurWeapon^.Timer); |
210 amGasBomb: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtGasBomb, 0, newDx, newDy, CurWeapon^.Timer); |
240 amGasBomb: newGear:= AddGear(hwRound(lx), hwRound(ly), gtGasBomb, 0, newDx, newDy, CurWeapon^.Timer); |
211 amBazooka: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtShell, 0, newDx, newDy, 0); |
241 amBazooka: newGear:= AddGear(hwRound(lx), hwRound(ly), gtShell, 0, newDx, newDy, 0); |
212 amSnowball: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtSnowball, 0, newDx, newDy, 0); |
242 amSnowball: newGear:= AddGear(hwRound(lx), hwRound(ly), gtSnowball, 0, newDx, newDy, 0); |
213 amBee: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtBee, 0, newDx, newDy, 0); |
243 amBee: newGear:= AddGear(hwRound(lx), hwRound(ly), gtBee, 0, newDx, newDy, 0); |
214 amShotgun: begin |
244 amShotgun: begin |
215 PlaySound(sndShotgunReload); |
245 PlaySound(sndShotgunReload); |
216 CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtShotgunShot, 0, xx * _0_5, yy * _0_5, 0); |
246 newGear:= AddGear(hwRound(lx), hwRound(ly), gtShotgunShot, 0, xx * _0_5, yy * _0_5, 0); |
217 end; |
247 end; |
218 amPickHammer: CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly) + cHHRadius, gtPickHammer, 0, _0, _0, 0); |
248 amPickHammer: newGear:= AddGear(hwRound(lx), hwRound(ly) + cHHRadius, gtPickHammer, 0, _0, _0, 0); |
219 amSkip: ParseCommand('/skip', true); |
249 amSkip: ParseCommand('/skip', true); |
220 amRope: CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtRope, 0, xx, yy, 0); |
250 amRope: newGear:= AddGear(hwRound(lx), hwRound(ly), gtRope, 0, xx, yy, 0); |
221 amMine: if altUse then |
251 amMine: if altUse then |
222 AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtMine, gstWait, newDx, newDy, 3000) |
252 newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtMine, gstWait, newDx, newDy, 3000) |
223 else |
253 else |
224 AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtMine, gstWait, SignAs(_0_02, dX), _0, 3000); |
254 newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtMine, gstWait, SignAs(_0_02, dX), _0, 3000); |
225 amSMine: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtSMine, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, 0); |
255 amSMine: newGear:= AddGear(hwRound(lx), hwRound(ly), gtSMine, 0, xx*Power/cPowerDivisor, yy*Power/cPowerDivisor, 0); |
226 amDEagle: CurAmmoGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtDEagleShot, 0, xx * _0_5, yy * _0_5, 0); |
256 amDEagle: newGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtDEagleShot, 0, xx * _0_5, yy * _0_5, 0); |
227 amSineGun: CurAmmoGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtSineGunShot, 0, xx * _0_5, yy * _0_5, 0); |
257 amSineGun: newGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtSineGunShot, 0, xx * _0_5, yy * _0_5, 0); |
228 amPortalGun: begin |
258 amPortalGun: begin |
229 AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtPortal, 0, xx * _0_6, yy * _0_6, |
259 newGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtPortal, 0, xx * _0_6, yy * _0_6, |
230 // set selected color |
260 // set selected color |
231 CurWeapon^.Pos); |
261 CurWeapon^.Pos); |
232 end; |
262 end; |
233 amSniperRifle: begin |
263 amSniperRifle: begin |
234 PlaySound(sndSniperReload); |
264 PlaySound(sndSniperReload); |
235 CurAmmoGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtSniperRifleShot, 0, xx * _0_5, yy * _0_5, 0); |
265 newGear:= AddGear(hwRound(lx + xx * cHHRadius), hwRound(ly + yy * cHHRadius), gtSniperRifleShot, 0, xx * _0_5, yy * _0_5, 0); |
236 end; |
266 end; |
237 amDynamite: AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtDynamite, 0, SignAs(_0_03, dX), _0, 5000); |
267 amDynamite: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtDynamite, 0, SignAs(_0_03, dX), _0, 5000); |
238 amFirePunch: CurAmmoGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtFirePunch, 0, xx, _0, 0); |
268 amFirePunch: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtFirePunch, 0, xx, _0, 0); |
239 amWhip: begin |
269 amWhip: begin |
240 CurAmmoGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtWhip, 0, SignAs(_1, dX), - _0_8, 0); |
270 newGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtWhip, 0, SignAs(_1, dX), - _0_8, 0); |
241 PlaySound(sndWhipCrack) |
271 PlaySound(sndWhipCrack) |
242 end; |
272 end; |
243 amHammer: begin |
273 amHammer: begin |
244 CurAmmoGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtHammer, 0, SignAs(_1, dX), - _0_8, 0); |
274 newGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtHammer, 0, SignAs(_1, dX), - _0_8, 0); |
245 PlaySound(sndWhack) |
275 PlaySound(sndWhack) |
246 end; |
276 end; |
247 amBaseballBat: begin |
277 amBaseballBat: begin |
248 CurAmmoGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtShover, gsttmpFlag, xx * _0_5, yy * _0_5, 0); |
278 newGear:= AddGear(hwRound(lx) + hwSign(dX) * 10, hwRound(ly), gtShover, gsttmpFlag, xx * _0_5, yy * _0_5, 0); |
249 PlaySound(sndBaseballBat) // TODO: Only play if something is hit? |
279 PlaySound(sndBaseballBat) // TODO: Only play if something is hit? |
250 end; |
280 end; |
251 amParachute: begin |
281 amParachute: begin |
252 CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtParachute, 0, _0, _0, 0); |
282 newGear:= AddGear(hwRound(lx), hwRound(ly), gtParachute, 0, _0, _0, 0); |
253 PlaySound(sndParachute) |
283 PlaySound(sndParachute) |
254 end; |
284 end; |
255 // we save CurWeapon^.Pos (in this case: cursor direction) by using it as (otherwise irrelevant) X value of the new gear. |
285 // we save CurWeapon^.Pos (in this case: cursor direction) by using it as (otherwise irrelevant) X value of the new gear. |
256 amAirAttack: AddGear(CurWeapon^.Pos, 0, gtAirAttack, 0, _0, _0, 0); |
286 amAirAttack: newGear:= AddGear(CurWeapon^.Pos, 0, gtAirAttack, 0, _0, _0, 0); |
257 amMineStrike: AddGear(CurWeapon^.Pos, 0, gtAirAttack, 1, _0, _0, 0); |
287 amMineStrike: newGear:= AddGear(CurWeapon^.Pos, 0, gtAirAttack, 1, _0, _0, 0); |
258 amBlowTorch: CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtBlowTorch, 0, SignAs(_0_5, dX), _0, 0); |
288 amBlowTorch: newGear:= AddGear(hwRound(lx), hwRound(ly), gtBlowTorch, 0, SignAs(_0_5, dX), _0, 0); |
259 amGirder: CurAmmoGear:= AddGear(0, 0, gtGirder, CurWeapon^.Pos, _0, _0, 0); |
289 amGirder: newGear:= AddGear(0, 0, gtGirder, CurWeapon^.Pos, _0, _0, 0); |
260 amTeleport: CurAmmoGear:= AddGear(CurWeapon^.Pos, 0, gtTeleport, 0, _0, _0, 0); |
290 amTeleport: newGear:= AddGear(CurWeapon^.Pos, 0, gtTeleport, 0, _0, _0, 0); |
261 amSwitch: CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtSwitcher, 0, _0, _0, 0); |
291 amSwitch: newGear:= AddGear(hwRound(lx), hwRound(ly), gtSwitcher, 0, _0, _0, 0); |
262 amMortar: begin |
292 amMortar: begin |
263 playSound(sndMortar); |
293 playSound(sndMortar); |
264 FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtMortar, 0, xx*cMaxPower/cPowerDivisor, yy*cMaxPower/cPowerDivisor, 0); |
294 newGear:= AddGear(hwRound(lx), hwRound(ly), gtMortar, 0, xx*cMaxPower/cPowerDivisor, yy*cMaxPower/cPowerDivisor, 0); |
265 end; |
295 end; |
266 amRCPlane: begin |
296 amRCPlane: begin |
267 CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtRCPlane, 0, xx * cMaxPower / cPowerDivisor / 4, yy * cMaxPower / cPowerDivisor / 4, 0); |
297 newGear:= AddGear(hwRound(lx), hwRound(ly), gtRCPlane, 0, xx * cMaxPower / cPowerDivisor / 4, yy * cMaxPower / cPowerDivisor / 4, 0); |
268 CurAmmoGear^.SoundChannel:= LoopSound(sndRCPlane, nil) |
298 newGear^.SoundChannel:= LoopSound(sndRCPlane, nil) |
269 end; |
299 end; |
270 amKamikaze: CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtKamikaze, 0, xx * _0_5, yy * _0_5, 0); |
300 amKamikaze: newGear:= AddGear(hwRound(lx), hwRound(ly), gtKamikaze, 0, xx * _0_5, yy * _0_5, 0); |
271 amCake: CurAmmoGear:= AddGear(hwRound(lx) + hwSign(dX) * 3, hwRound(ly), gtCake, 0, xx, _0, 0); |
301 amCake: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 3, hwRound(ly), gtCake, 0, xx, _0, 0); |
272 amSeduction: CurAmmoGear:= AddGear(hwRound(lx + xx * cHHRadius * 2), hwRound(ly + yy * cHHRadius * 2), gtSeduction, 0, xx * _0_4, yy * _0_4, 0); |
302 amSeduction: newGear:= AddGear(hwRound(lx + xx * cHHRadius * 2), hwRound(ly + yy * cHHRadius * 2), gtSeduction, 0, xx * _0_4, yy * _0_4, 0); |
273 amWatermelon: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtWatermelon, 0, newDx, newDy, CurWeapon^.Timer); |
303 amWatermelon: newGear:= AddGear(hwRound(lx), hwRound(ly), gtWatermelon, 0, newDx, newDy, CurWeapon^.Timer); |
274 amHellishBomb: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtHellishBomb, 0, newDx, newDy, 0); |
304 amHellishBomb: newGear:= AddGear(hwRound(lx), hwRound(ly), gtHellishBomb, 0, newDx, newDy, 0); |
275 amNapalm: AddGear(CurWeapon^.Pos, 0, gtAirAttack, 2, _0, _0, 0); |
305 amNapalm: newGear:= AddGear(CurWeapon^.Pos, 0, gtAirAttack, 2, _0, _0, 0); |
276 amDrill: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtDrill, 0, newDx, newDy, 0); |
306 amDrill: newGear:= AddGear(hwRound(lx), hwRound(ly), gtDrill, 0, newDx, newDy, 0); |
277 amBallgun: CurAmmoGear:= AddGear(hwRound(X), hwRound(Y), gtBallgun, 0, xx * _0_5, yy * _0_5, 0); |
307 amBallgun: newGear:= AddGear(hwRound(X), hwRound(Y), gtBallgun, 0, xx * _0_5, yy * _0_5, 0); |
278 amJetpack: CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), gtJetpack, 0, _0, _0, 0); |
308 amJetpack: newGear:= AddGear(hwRound(lx), hwRound(ly), gtJetpack, 0, _0, _0, 0); |
279 amBirdy: begin |
309 amBirdy: begin |
280 PlaySound(sndWhistle); |
310 PlaySound(sndWhistle); |
281 CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly) - 32, gtBirdy, 0, _0, _0, 0); |
311 newGear:= AddGear(hwRound(lx), hwRound(ly) - 32, gtBirdy, 0, _0, _0, 0); |
282 end; |
312 end; |
283 amLowGravity: begin |
313 amLowGravity: begin |
284 PlaySound(sndLowGravity); |
314 PlaySound(sndLowGravity); |
285 cGravity:= cMaxWindSpeed; |
315 cGravity:= cMaxWindSpeed; |
286 cGravityf:= 0.00025 |
316 cGravityf:= 0.00025 |
302 amPiano: begin |
332 amPiano: begin |
303 // Tuck the hedgehog away until the piano attack is completed |
333 // Tuck the hedgehog away until the piano attack is completed |
304 Unplaced:= true; |
334 Unplaced:= true; |
305 X:= _0; |
335 X:= _0; |
306 Y:= _0; |
336 Y:= _0; |
307 FollowGear:= AddGear(TargetPoint.X, 0, gtPiano, 0, _0, _0, 0); |
337 newGear:= AddGear(TargetPoint.X, 0, gtPiano, 0, _0, _0, 0); |
308 PauseMusic |
338 PauseMusic |
309 end; |
339 end; |
310 amFlamethrower: CurAmmoGear:= AddGear(hwRound(X), hwRound(Y), gtFlamethrower, 0, xx * _0_5, yy * _0_5, 0); |
340 amFlamethrower: newGear:= AddGear(hwRound(X), hwRound(Y), gtFlamethrower, 0, xx * _0_5, yy * _0_5, 0); |
311 amLandGun: CurAmmoGear:= AddGear(hwRound(X), hwRound(Y), gtLandGun, 0, xx * _0_5, yy * _0_5, 0); |
341 amLandGun: newGear:= AddGear(hwRound(X), hwRound(Y), gtLandGun, 0, xx * _0_5, yy * _0_5, 0); |
312 amResurrector: begin |
342 amResurrector: begin |
313 CurAmmoGear:= AddGear(hwRound(lx), hwRound(ly), |
343 newGear:= AddGear(hwRound(lx), hwRound(ly), |
314 gtResurrector, 0, _0, _0, 0); |
344 gtResurrector, 0, _0, _0, 0); |
315 CurAmmoGear^.SoundChannel := LoopSound(sndResurrector); |
345 newGear^.SoundChannel := LoopSound(sndResurrector); |
316 end; |
346 end; |
317 amDrillStrike: AddGear(CurWeapon^.Pos, 0, gtAirAttack, 3, _0, _0, CurWeapon^.Timer); |
347 amDrillStrike: newGear:= AddGear(CurWeapon^.Pos, 0, gtAirAttack, 3, _0, _0, CurWeapon^.Timer); |
318 //amMelonStrike: AddGear(CurWeapon^.Pos, 0, gtAirAttack, 4, _0, _0, 0); |
348 //amMelonStrike: AddGear(CurWeapon^.Pos, 0, gtAirAttack, 4, _0, _0, 0); |
319 amStructure: CurAmmoGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtStructure, gstWait, SignAs(_0_02, dX), _0, 3000); |
349 amStructure: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtStructure, gstWait, SignAs(_0_02, dX), _0, 3000); |
320 amTardis: CurAmmoGear:= AddGear(hwRound(X), hwRound(Y), gtTardis, 0, _0, _0, 5000); |
350 amTardis: newGear:= AddGear(hwRound(X), hwRound(Y), gtTardis, 0, _0, _0, 5000); |
|
351 end; |
|
352 case CurAmmoType of |
|
353 amGrenade, amMolotov, |
|
354 amClusterBomb, amGasBomb, |
|
355 amBazooka, amSnowball, |
|
356 amBee, amSMine, |
|
357 amMortar, amWatermelon, |
|
358 amHellishBomb, amDrill, |
|
359 amPiano: FollowGear:= newGear; |
|
360 |
|
361 amShotgun, amPickHammer, |
|
362 amRope, amDEagle, |
|
363 amSineGun, amSniperRifle, |
|
364 amFirePunch, amWhip, |
|
365 amHammer, amBaseballBat, |
|
366 amParachute, amBlowTorch, |
|
367 amGirder, amTeleport, |
|
368 amSwitch, amRCPlane, |
|
369 amKamikaze, amCake, |
|
370 amSeduction, amBallgun, |
|
371 amJetpack, amBirdy, |
|
372 amFlamethrower, amLandGun, |
|
373 amResurrector, amStructure, |
|
374 amTardis: CurAmmoGear:= newGear; |
321 end; |
375 end; |
322 |
376 |
323 // Clear FollowGear if using on a rope/parachute/saucer etc so focus stays with the hog's movement |
377 // Clear FollowGear if using on a rope/parachute/saucer etc so focus stays with the hog's movement |
324 if altUse then FollowGear:= nil; |
378 if altUse then FollowGear:= nil; |
325 |
379 |
|
380 if (newGear <> nil) and ((Ammoz[newGear^.AmmoType].Ammo.Propz and ammoprop_SetBounce) <> 0) then |
|
381 begin |
|
382 elastic:= int2hwfloat(CurWeapon^.Bounciness) / _1000; |
|
383 |
|
384 if elastic < _1 then newGear^.Elasticity:= newGear^.Elasticity * elastic |
|
385 else if elastic > _1 then newGear^.Elasticity:= _1 - ((_1-newGear^.Elasticity) / elastic); |
|
386 (* Experimented with friction modifier. Didn't seem helpful |
|
387 fric:= int2hwfloat(CurWeapon^.Bounciness) / _250; |
|
388 if fric < _1 then newGear^.Friction:= newGear^.Friction * fric |
|
389 else if fric > _1 then newGear^.Friction:= _1 - ((_1-newGear^.Friction) / fric)*) |
|
390 end; |
|
391 |
|
392 |
326 uStats.AmmoUsed(CurAmmoType); |
393 uStats.AmmoUsed(CurAmmoType); |
327 |
394 |
328 if not (SpeechText = '') then |
395 if not (SpeechText = '') then |
329 begin |
396 begin |
330 tmpGear:= AddVisualGear(0, 0, vgtSpeechBubble); |
397 speech:= AddVisualGear(0, 0, vgtSpeechBubble); |
331 if tmpGear <> nil then |
398 if speech <> nil then |
332 begin |
399 begin |
333 tmpGear^.Text:= SpeechText; |
400 speech^.Text:= SpeechText; |
334 tmpGear^.Hedgehog:= Gear^.Hedgehog; |
401 speech^.Hedgehog:= Gear^.Hedgehog; |
335 tmpGear^.FrameTicks:= SpeechType; |
402 speech^.FrameTicks:= SpeechType; |
336 end; |
403 end; |
337 SpeechText:= '' |
404 SpeechText:= '' |
338 end; |
405 end; |
339 |
406 |
340 Power:= 0; |
407 Power:= 0; |
341 if (CurAmmoGear <> nil) |
408 if (CurAmmoGear <> nil) |
342 and ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AltUse) = 0){check for dropping ammo from rope} then |
409 and ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_AltUse) = 0){check for dropping ammo from rope} then |
343 begin |
410 begin |
344 CurAmmoGear^.AmmoType:= CurAmmoType; |
|
345 Message:= Message or gmAttack; |
411 Message:= Message or gmAttack; |
346 CurAmmoGear^.Message:= Message |
412 CurAmmoGear^.Message:= Message |
347 end else begin |
413 end else begin |
348 if not CurrentTeam^.ExtDriven and |
414 if not CurrentTeam^.ExtDriven and |
349 ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_Power) <> 0) then SendIPC('a'); |
415 ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_Power) <> 0) then SendIPC('a'); |