|
1 ------------------------------------ |
|
2 -- TUMBLER |
|
3 -- v.0.7.1 |
|
4 ------------------------------------ |
|
5 |
|
6 loadfile(GetDataPath() .. "Scripts/Locale.lua")() |
|
7 loadfile(GetDataPath() .. "Scripts/Tracker.lua")() |
|
8 |
|
9 local fMod = 1000000 -- use this for dev and .16+ games |
|
10 |
|
11 local leftOn = false |
|
12 local rightOn = false |
|
13 local upOn = false |
|
14 local downOn = false |
|
15 local preciseOn = false |
|
16 |
|
17 local wep = {} |
|
18 local wepAmmo = {} |
|
19 local wepCol = {} |
|
20 local wepIndex = 0 |
|
21 local wepCount = 0 |
|
22 local fGears = 0 |
|
23 |
|
24 local mineSpawn |
|
25 local barrelSpawn |
|
26 |
|
27 local roundKills = 0 |
|
28 local barrelsEaten = 0 |
|
29 local minesEaten = 0 |
|
30 |
|
31 local moveTimer = 0 |
|
32 local fireTimer = 0 |
|
33 local TimeLeftCounter = 0 |
|
34 local TimeLeft = 0 |
|
35 local stopMovement = false |
|
36 local tumbleStarted = false |
|
37 |
|
38 local vTag = {} |
|
39 |
|
40 ------------------------ |
|
41 -- version 0.4 |
|
42 ------------------------ |
|
43 |
|
44 -- removed some old code/comments |
|
45 -- removed both shell and mortar as the primary and secondary weapons |
|
46 -- the primary weapon is now an explosive(barrel) |
|
47 |
|
48 -- added support for picking up barrels scattered about the map (backspace) |
|
49 -- added support for dragging around mines (enter toggles on/off) |
|
50 -- added support for primary fire being onAttackUp |
|
51 -- added a trail to indicate when the player has 5s or less left to tumble |
|
52 -- updated showmission to reflect changed controls and options |
|
53 |
|
54 ------------------------ |
|
55 -- version 0.5 |
|
56 ------------------------ |
|
57 |
|
58 -- changed some of the user feedback |
|
59 -- i can't remember?? |
|
60 -- substituted onAttackUp for onPrecise() |
|
61 -- brought in line with new velocity changes |
|
62 |
|
63 ------------------------ |
|
64 -- version 0.6 |
|
65 ------------------------ |
|
66 |
|
67 -- reduced starting "ammo" |
|
68 -- randomly spawn new barrels/mines on new turn |
|
69 -- updated user feedback |
|
70 -- better locs and coloured addcaptions |
|
71 -- added tag for turntime |
|
72 -- removed tractor beam |
|
73 -- added two new weapons and changed ammo handling |
|
74 -- health crates now give tumbler time, and wep/utility give flamer ammo |
|
75 -- explosives AND mines can be picked up to increase their relative ammo |
|
76 -- replaced "no weapon" selected message that hw serves |
|
77 -- modified crate frequencies a bit |
|
78 -- added some simple kill-based achievements, i think |
|
79 |
|
80 ------------------------ |
|
81 -- version 0.7 |
|
82 ------------------------ |
|
83 |
|
84 -- a few code optimisations/performance tweaks |
|
85 -- removed some deprecated code |
|
86 -- fix a potential spawn bug |
|
87 |
|
88 -- improved HUD (now shows ammo counts) |
|
89 -- improved user feedback (less generic messages) |
|
90 -- colour-coded addcaptions to match hud :) |
|
91 |
|
92 -- base tumbling time now equals scheme turntime |
|
93 -- tumbling time extension is now based on the amount of health contained in crate |
|
94 -- new mines per turn based on minesnum |
|
95 -- new barrels per turn based on explosives |
|
96 |
|
97 -- added 2 more achievements: barrel eater and mine eater (like kills, don't do anything atm) |
|
98 -- slightly increased grab distance for explosives/mines |
|
99 -- slightly increased flamer velocity |
|
100 -- slightly decreased flamer volume |
|
101 -- added a flame vaporiser (based on number of flame gears?) |
|
102 -- give tumblers an extra 47 health on the start of their tumble to counter the grenade (exp) |
|
103 -- refocus camera on tumbler on newturn (not on crates, barrels etc) |
|
104 -- increase delay: yes, yes, eat your hearts out |
|
105 |
|
106 -- commit log |
|
107 -- Better HUD |
|
108 -- Allow more user customization |
|
109 -- Bugfix for new gear spawns |
|
110 -- Performance tweaks |
|
111 -- Variety of small gameplay changes |
|
112 |
|
113 ------------------------ |
|
114 -- version 0.7.1 |
|
115 ------------------------ |
|
116 |
|
117 -- redraw HUD on screen resolution change |
|
118 |
|
119 --------------------------- |
|
120 -- some other ideas/things |
|
121 --------------------------- |
|
122 --[[ |
|
123 -- add better gameflag handling |
|
124 -- fix flamer "shots remaining" message on start or choose a standard versus % |
|
125 -- add more sounds |
|
126 -- better barrel/minespawn effects |
|
127 -- separate grab distance for mines/barrels |
|
128 -- [probably not] make barrels always explode? |
|
129 -- [probably not] persistent ammo? |
|
130 -- [probably not] dont hurt tumblers and restore their health at turn end? |
|
131 ]] |
|
132 |
|
133 |
|
134 ---------------------------------------------------------------- |
|
135 ---------------------------------------------------------------- |
|
136 |
|
137 local flames = {} |
|
138 local fGearValues = {} |
|
139 |
|
140 function runOnflames(func) |
|
141 for k, gear in ipairs(flames) do |
|
142 func(gear) |
|
143 end |
|
144 end |
|
145 |
|
146 function trackFGear(gear) |
|
147 table.insert(flames, gear) |
|
148 end |
|
149 |
|
150 function trackFGearDeletion(gear) |
|
151 fGearValues[gear] = nil |
|
152 for k, g in ipairs(flames) do |
|
153 if g == gear then |
|
154 table.remove(flames, k) |
|
155 break |
|
156 end |
|
157 end |
|
158 end |
|
159 |
|
160 function getFGearValue(gear, key) |
|
161 if fGearValues[gear] ~= nil then |
|
162 return fGearValues[gear][key] |
|
163 end |
|
164 return nil |
|
165 end |
|
166 |
|
167 function setFGearValue(gear, key, value) |
|
168 found = false |
|
169 for id, values in pairs(fGearValues) do |
|
170 if id == gear then |
|
171 values[key] = value |
|
172 found = true |
|
173 end |
|
174 end |
|
175 if not found then |
|
176 fGearValues[gear] = { [key] = value } |
|
177 end |
|
178 end |
|
179 |
|
180 function decreaseFGearValue(gear, key) |
|
181 for id, values in pairs(fGearValues) do |
|
182 if id == gear then |
|
183 values[key] = values[key] - 1 |
|
184 end |
|
185 end |
|
186 end |
|
187 |
|
188 function HandleLife(gear) |
|
189 |
|
190 decreaseFGearValue(gear, "L") |
|
191 if getFGearValue(gear, "L") == 0 then |
|
192 AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, false) |
|
193 DeleteGear(gear) |
|
194 end |
|
195 |
|
196 end |
|
197 |
|
198 ---------------------------------------------------------------- |
|
199 ---------------------------------------------------------------- |
|
200 |
|
201 function HideTags() |
|
202 |
|
203 for i = 0, 3 do |
|
204 SetVisualGearValues(vTag[i],0,0,0,0,0,1,0, 0, 240000, 0xffffff00) |
|
205 end |
|
206 |
|
207 end |
|
208 |
|
209 function DrawTag(i) |
|
210 |
|
211 zoomL = 1.3 |
|
212 |
|
213 xOffset = 40 |
|
214 |
|
215 if i == 0 then |
|
216 yOffset = 40 |
|
217 tCol = 0xffba00ff --0xffed09ff --0xffba00ff |
|
218 tValue = TimeLeft |
|
219 elseif i == 1 then |
|
220 zoomL = 1.1 |
|
221 yOffset = 70 |
|
222 tCol = wepCol[0] |
|
223 tValue = wepAmmo[0] |
|
224 elseif i == 2 then |
|
225 zoomL = 1.1 |
|
226 xOffset = 40 + 35 |
|
227 yOffset = 70 |
|
228 tCol = wepCol[1] |
|
229 tValue = wepAmmo[1] |
|
230 elseif i == 3 then |
|
231 zoomL = 1.1 |
|
232 xOffset = 40 + 70 |
|
233 yOffset = 70 |
|
234 tCol = wepCol[2] |
|
235 tValue = wepAmmo[2] |
|
236 end |
|
237 |
|
238 DeleteVisualGear(vTag[i]) |
|
239 vTag[i] = AddVisualGear(0, 0, vgtHealthTag, 0, false) |
|
240 g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vTag[i]) |
|
241 SetVisualGearValues ( |
|
242 vTag[i], --id |
|
243 -(ScreenWidth/2) + xOffset, --xoffset |
|
244 ScreenHeight - yOffset, --yoffset |
|
245 0, --dx |
|
246 0, --dy |
|
247 zoomL, --zoom |
|
248 1, --~= 0 means align to screen |
|
249 g7, --frameticks |
|
250 tValue, --value |
|
251 240000, --timer |
|
252 tCol --GetClanColor( GetHogClan(CurrentHedgehog) ) |
|
253 ) |
|
254 |
|
255 end |
|
256 |
|
257 function GetGearDistance(gear) |
|
258 |
|
259 g1X, g1Y = GetGearPosition(gear) |
|
260 g2X, g2Y = GetGearPosition(CurrentHedgehog) |
|
261 |
|
262 q = g1X - g2X |
|
263 w = g1Y - g2Y |
|
264 return( (q*q) + (w*w) ) |
|
265 |
|
266 end |
|
267 |
|
268 -- add to your ammo ***WHEN YOU PUSH A KEY*** near them |
|
269 -- yes that was my justification for a non generic method |
|
270 function CheckProximityToExplosives(gear) |
|
271 |
|
272 if (GetGearDistance(gear) < 1400) then |
|
273 |
|
274 if (GetGearType(gear) == gtExplosives) then |
|
275 |
|
276 wepAmmo[0] = wepAmmo[0] + 1 |
|
277 PlaySound(sndShotgunReload) |
|
278 DeleteGear(gear) |
|
279 AddCaption(wep[0] .. " " .. loc("ammo extended!"), wepCol[0], capgrpAmmoinfo ) |
|
280 DrawTag(1) |
|
281 |
|
282 barrelsEaten = barrelsEaten + 1 |
|
283 if barrelsEaten == 5 then |
|
284 AddCaption(loc("Achievement Unlocked") .. ": " .. loc("Barrel Eater!"),0xffba00ff,capgrpMessage2) |
|
285 end |
|
286 |
|
287 elseif (GetGearType(gear) == gtMine) then |
|
288 wepAmmo[1] = wepAmmo[1] + 1 |
|
289 PlaySound(sndShotgunReload) |
|
290 DeleteGear(gear) |
|
291 AddCaption(wep[1] .. " " .. loc("ammo extended!"), wepCol[1], capgrpAmmoinfo ) |
|
292 DrawTag(2) |
|
293 |
|
294 minesEaten = minesEaten + 1 |
|
295 if minesEaten == 5 then |
|
296 AddCaption(loc("Achievement Unlocked") .. ": " .. loc("Mine Eater!"),0xffba00ff,capgrpMessage2) |
|
297 end |
|
298 |
|
299 end |
|
300 |
|
301 else |
|
302 --AddCaption("There is nothing here...") |
|
303 end |
|
304 |
|
305 end |
|
306 |
|
307 -- check proximity on crates |
|
308 function CheckProximity(gear) |
|
309 |
|
310 dist = GetGearDistance(gear) |
|
311 |
|
312 if (dist < 1600) and (GetGearType(gear) == gtCase) then |
|
313 |
|
314 if GetHealth(gear) > 0 then |
|
315 |
|
316 AddCaption(loc("Tumbling Time Extended!"), 0xffba00ff, capgrpMessage2 ) |
|
317 |
|
318 TimeLeft = TimeLeft + HealthCaseAmount --5 --5s |
|
319 DrawTag(0) |
|
320 --PlaySound(sndShotgunReload) |
|
321 else |
|
322 wepAmmo[2] = wepAmmo[2] + 800 |
|
323 PlaySound(sndShotgunReload) |
|
324 AddCaption(wep[2] .. " " .. loc("fuel extended!"), wepCol[2], capgrpAmmoinfo ) |
|
325 DrawTag(3) |
|
326 end |
|
327 |
|
328 DeleteGear(gear) |
|
329 |
|
330 end |
|
331 |
|
332 end |
|
333 |
|
334 function ChangeWeapon() |
|
335 |
|
336 wepIndex = wepIndex + 1 |
|
337 if wepIndex == wepCount then |
|
338 wepIndex = 0 |
|
339 end |
|
340 |
|
341 AddCaption(wep[wepIndex] .. " " .. loc("selected!"), wepCol[wepIndex],capgrpAmmoinfo ) |
|
342 AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), wepCol[wepIndex],capgrpMessage2) |
|
343 |
|
344 end |
|
345 |
|
346 --------------- |
|
347 -- action keys |
|
348 --------------- |
|
349 |
|
350 function onPrecise() |
|
351 |
|
352 if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) and (wepAmmo[wepIndex] > 0) then |
|
353 |
|
354 wepAmmo[wepIndex] = wepAmmo[wepIndex] - 1 |
|
355 AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), wepCol[wepIndex],capgrpMessage2) |
|
356 |
|
357 if wep[wepIndex] == loc("Barrel Launcher") then |
|
358 morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtExplosives, 0, 0, 0, 1) |
|
359 CopyPV(CurrentHedgehog, morte) -- new addition |
|
360 x,y = GetGearVelocity(morte) |
|
361 x = x*2 |
|
362 y = y*2 |
|
363 SetGearVelocity(morte, x, y) |
|
364 DrawTag(1) |
|
365 |
|
366 elseif wep[wepIndex] == loc("Mine Deployer") then |
|
367 morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtMine, 0, 0, 0, 0) |
|
368 SetTimer(morte, 1000) |
|
369 DrawTag(2) |
|
370 end |
|
371 |
|
372 end |
|
373 |
|
374 preciseOn = true |
|
375 |
|
376 end |
|
377 |
|
378 function onPreciseUp() |
|
379 preciseOn = false |
|
380 end |
|
381 |
|
382 function onHJump() |
|
383 -- pick up explosives/mines if nearby them |
|
384 if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then |
|
385 runOnGears(CheckProximityToExplosives) |
|
386 end |
|
387 end |
|
388 |
|
389 function onLJump() |
|
390 ChangeWeapon() |
|
391 end |
|
392 |
|
393 ----------------- |
|
394 -- movement keys |
|
395 ----------------- |
|
396 |
|
397 function onLeft() |
|
398 if (CurrentHedgehog ~= nil) and (stopMovement == false) then |
|
399 leftOn = true |
|
400 end |
|
401 end |
|
402 |
|
403 function onRight() |
|
404 if (CurrentHedgehog ~= nil) and (stopMovement == false) then |
|
405 rightOn = true |
|
406 end |
|
407 end |
|
408 |
|
409 function onUp() |
|
410 if (CurrentHedgehog ~= nil) and (stopMovement == false) then |
|
411 upOn = true |
|
412 end |
|
413 end |
|
414 |
|
415 function onDown() |
|
416 if (CurrentHedgehog ~= nil) and (stopMovement == false) then |
|
417 downOn = true |
|
418 end |
|
419 end |
|
420 |
|
421 function onDownUp() |
|
422 downOn = false |
|
423 end |
|
424 function onUpUp() |
|
425 upOn = false |
|
426 end |
|
427 function onLeftUp() |
|
428 leftOn = false |
|
429 end |
|
430 function onRightUp() |
|
431 rightOn = false |
|
432 end |
|
433 |
|
434 -------------------------- |
|
435 -- other event handlers |
|
436 -------------------------- |
|
437 |
|
438 function onGameInit() |
|
439 CaseFreq = 0 |
|
440 HealthCaseProb = 0 |
|
441 Delay = 1000 |
|
442 |
|
443 mineSpawn = MinesNum |
|
444 if mineSpawn > 4 then |
|
445 mineSpawn = 4 |
|
446 end |
|
447 |
|
448 barrelSpawn = Explosives |
|
449 if barrelSpawn > 4 then |
|
450 barrelSpawn = 4 |
|
451 end |
|
452 |
|
453 --MinesNum = 0 |
|
454 --Explosives = 0 |
|
455 |
|
456 for i = 0, 3 do |
|
457 vTag[0] = AddVisualGear(0, 0, vgtHealthTag, 0, false) |
|
458 end |
|
459 |
|
460 HideTags() |
|
461 |
|
462 wep[0] = loc("Barrel Launcher") |
|
463 wep[1] = loc("Mine Deployer") |
|
464 wep[2] = loc("Flamer") |
|
465 |
|
466 wepCol[0] = 0x78818eff |
|
467 wepCol[1] = 0xa12a77ff |
|
468 wepCol[2] = 0xf49318ff |
|
469 |
|
470 wepCount = 3 |
|
471 |
|
472 end |
|
473 |
|
474 function onGameStart() |
|
475 |
|
476 ShowMission ( |
|
477 "TUMBLER", |
|
478 loc("a Hedgewars mini-game"), |
|
479 loc("Eliminate the enemy hogs to win.") .. "|" .. |
|
480 " " .. "|" .. |
|
481 |
|
482 loc("New Mines Per Turn") .. ": " .. (mineSpawn) .. "|" .. |
|
483 loc("New Barrels Per Turn") .. ": " .. (barrelSpawn) .. "|" .. |
|
484 loc("Time Extension") .. ": " .. (HealthCaseAmount) .. loc("sec") .. "|" .. |
|
485 " " .. "|" .. |
|
486 |
|
487 loc("Movement: [Up], [Down], [Left], [Right]") .. "|" .. |
|
488 loc("Fire") .. ": " .. loc("[Left Shift]") .. "|" .. |
|
489 loc("Change Weapon") .. ": " .. loc("[Enter]") .. "|" .. |
|
490 loc("Grab Mines/Explosives") .. ": " .. loc("[Backspace]") .. "|" .. |
|
491 |
|
492 " " .. "|" .. |
|
493 |
|
494 loc("Health crates extend your time.") .. "|" .. |
|
495 loc("Ammo is reset at the end of your turn.") .. "|" .. |
|
496 |
|
497 "", 4, 4000 |
|
498 ) |
|
499 |
|
500 end |
|
501 |
|
502 function onScreenResize() |
|
503 |
|
504 -- redraw Tags so that their screen locations are updated |
|
505 if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then |
|
506 for i = 0, 3 do |
|
507 DrawTag(i) |
|
508 end |
|
509 end |
|
510 |
|
511 end |
|
512 |
|
513 function onNewTurn() |
|
514 |
|
515 stopMovement = false |
|
516 tumbleStarted = false |
|
517 |
|
518 -- randomly create new barrels mines on the map every turn (can be disabled by setting mine/barrels to 0 in scheme) |
|
519 for i = 0, barrelSpawn-1 do |
|
520 gear = AddGear(100, 100, gtExplosives, 0, 0, 0, 0) |
|
521 SetHealth(gear, 100) |
|
522 if FindPlace(gear, false, 0, LAND_WIDTH, false) ~= nil then |
|
523 tempE = AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) |
|
524 end |
|
525 end |
|
526 for i = 0, mineSpawn-1 do |
|
527 gear = AddGear(100, 100, gtMine, 0, 0, 0, 0) |
|
528 if FindPlace(gear, false, 0, LAND_WIDTH, false) ~= nil then |
|
529 tempE = AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) |
|
530 end |
|
531 end |
|
532 |
|
533 -- randomly spawn time extension crates / flamer fuel on the map |
|
534 r = GetRandom(100) |
|
535 if r > 50 then |
|
536 gear = SpawnHealthCrate(0, 0) |
|
537 end |
|
538 r = GetRandom(100) |
|
539 if r > 70 then |
|
540 gear = SpawnAmmoCrate(0, 0, amSkip) |
|
541 end |
|
542 |
|
543 HideTags() |
|
544 |
|
545 --reset ammo counts |
|
546 wepAmmo[0] = 2 |
|
547 wepAmmo[1] = 1 |
|
548 wepAmmo[2] = 50 -- 50000 -- 50 |
|
549 wepIndex = 2 |
|
550 ChangeWeapon() |
|
551 |
|
552 roundKills = 0 |
|
553 barrelsEaten = 0 |
|
554 minesEaten = 0 |
|
555 |
|
556 FollowGear(CurrentHedgehog) |
|
557 |
|
558 end |
|
559 |
|
560 |
|
561 function DisableTumbler() |
|
562 stopMovement = true |
|
563 upOn = false |
|
564 down = false |
|
565 leftOn = false |
|
566 rightOn = false |
|
567 HideTags() |
|
568 end |
|
569 |
|
570 function onGameTick() |
|
571 |
|
572 -- start the player tumbling with a boom once their turn has actually begun |
|
573 if tumbleStarted == false then |
|
574 if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) then |
|
575 --AddCaption(loc("Good to go!")) |
|
576 tumbleStarted = true |
|
577 TimeLeft = (TurnTime/1000) |
|
578 AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1) |
|
579 SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog) + 47) -- new |
|
580 for i = 0, 3 do |
|
581 DrawTag(i) |
|
582 end |
|
583 end |
|
584 end |
|
585 |
|
586 if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then |
|
587 |
|
588 runOnGears(CheckProximity) -- crates |
|
589 |
|
590 -- Calculate and display turn time |
|
591 TimeLeftCounter = TimeLeftCounter + 1 |
|
592 if TimeLeftCounter == 1000 then |
|
593 TimeLeftCounter = 0 |
|
594 TimeLeft = TimeLeft - 1 |
|
595 |
|
596 if TimeLeft >= 0 then |
|
597 DrawTag(0) |
|
598 end |
|
599 |
|
600 end |
|
601 |
|
602 if TimeLeft == 0 then |
|
603 DisableTumbler() |
|
604 end |
|
605 |
|
606 -- handle movement based on IO |
|
607 moveTimer = moveTimer + 1 |
|
608 if moveTimer == 100 then -- 100 |
|
609 moveTimer = 0 |
|
610 |
|
611 runOnflames(HandleLife) |
|
612 |
|
613 --------------- |
|
614 -- new trail code |
|
615 --------------- |
|
616 -- the trail lets you know you have 5s left to pilot, akin to birdy feathers |
|
617 if (TimeLeft <= 5) and (TimeLeft > 0) then |
|
618 tempE = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtSmoke, 0, false) |
|
619 g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) |
|
620 SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, GetClanColor(GetHogClan(CurrentHedgehog)) ) |
|
621 end |
|
622 -------------- |
|
623 |
|
624 dx, dy = GetGearVelocity(CurrentHedgehog) |
|
625 |
|
626 dxlimit = 0.4*fMod |
|
627 dylimit = 0.4*fMod |
|
628 |
|
629 if dx > dxlimit then |
|
630 dx = dxlimit |
|
631 end |
|
632 if dy > dylimit then |
|
633 dy = dylimit |
|
634 end |
|
635 if dx < -dxlimit then |
|
636 dx = -dxlimit |
|
637 end |
|
638 if dy < -dylimit then |
|
639 dy = -dylimit |
|
640 end |
|
641 |
|
642 |
|
643 if leftOn == true then |
|
644 dx = dx - 0.1*fMod |
|
645 end |
|
646 if rightOn == true then |
|
647 dx = dx + 0.1*fMod |
|
648 end |
|
649 |
|
650 if upOn == true then |
|
651 dy = dy - 0.1*fMod |
|
652 end |
|
653 if downOn == true then |
|
654 dy = dy + 0.1*fMod |
|
655 end |
|
656 |
|
657 SetGearVelocity(CurrentHedgehog, dx, dy) |
|
658 |
|
659 end |
|
660 |
|
661 -- |
|
662 --flamer |
|
663 -- |
|
664 fireTimer = fireTimer + 1 |
|
665 if fireTimer == 6 then -- 5 --10 |
|
666 fireTimer = 0 |
|
667 |
|
668 if (wep[wepIndex] == loc("Flamer") ) and (preciseOn == true) and (wepAmmo[wepIndex] > 0) and (stopMovement == false) and (tumbleStarted == true) then |
|
669 |
|
670 wepAmmo[wepIndex] = wepAmmo[wepIndex] - 1 |
|
671 AddCaption( |
|
672 loc("Flamer") .. ": " .. |
|
673 (wepAmmo[wepIndex]/800*100) - (wepAmmo[wepIndex]/800*100)%2 .. "%", |
|
674 wepCol[2], |
|
675 capgrpMessage2 |
|
676 ) |
|
677 DrawTag(3) |
|
678 |
|
679 dx, dy = GetGearVelocity(CurrentHedgehog) |
|
680 shell = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtFlame, 0, 0, 0, 0) |
|
681 |
|
682 xdev = 1 + GetRandom(25) --15 |
|
683 xdev = xdev / 100 |
|
684 |
|
685 r = GetRandom(2) |
|
686 if r == 1 then |
|
687 xdev = xdev*-1 |
|
688 end |
|
689 |
|
690 ydev = 1 + GetRandom(25) --15 |
|
691 ydev = ydev / 100 |
|
692 |
|
693 r = GetRandom(2) |
|
694 if r == 1 then |
|
695 ydev = ydev*-1 |
|
696 end |
|
697 |
|
698 --*13 --8 *-4 |
|
699 SetGearVelocity(shell, (dx*4.5)+(xdev*fMod), (dy*4.5)+(ydev*fMod)) --10 |
|
700 |
|
701 end |
|
702 |
|
703 end |
|
704 -- |
|
705 |
|
706 end |
|
707 |
|
708 |
|
709 end |
|
710 |
|
711 function isATrackedGear(gear) |
|
712 if (GetGearType(gear) == gtExplosives) or |
|
713 (GetGearType(gear) == gtMine) or |
|
714 (GetGearType(gear) == gtCase) |
|
715 then |
|
716 return(true) |
|
717 else |
|
718 return(false) |
|
719 end |
|
720 end |
|
721 |
|
722 --[[function onGearDamage(gear, damage) |
|
723 if gear == CurrentHedgehog then |
|
724 -- You are now tumbling |
|
725 end |
|
726 end]] |
|
727 |
|
728 function onGearAdd(gear) |
|
729 |
|
730 if GetGearType(gear) == gtFlame then |
|
731 |
|
732 trackFGear(gear) |
|
733 |
|
734 fGears = fGears +1 |
|
735 |
|
736 if fGears < 80 then |
|
737 setFGearValue(gear,"L",30) |
|
738 else |
|
739 setFGearValue(gear,"L",5) --3 |
|
740 end |
|
741 |
|
742 elseif isATrackedGear(gear) then |
|
743 trackGear(gear) |
|
744 end |
|
745 |
|
746 end |
|
747 |
|
748 function onGearDelete(gear) |
|
749 |
|
750 if GetGearType(gear) == gtFlame then |
|
751 trackFGearDeletion(gear) |
|
752 fGears = fGears -1 |
|
753 |
|
754 elseif isATrackedGear(gear) then |
|
755 trackDeletion(gear) |
|
756 |
|
757 -- achievements? prototype |
|
758 elseif GetGearType(gear) == gtHedgehog then |
|
759 |
|
760 if GetHogTeamName(gear) ~= GetHogTeamName(CurrentHedgehog) then |
|
761 |
|
762 roundKills = roundKills + 1 |
|
763 if roundKills == 2 then |
|
764 AddCaption(loc("Double Kill!"),0xffba00ff,capgrpMessage2) |
|
765 elseif roundKills == 3 then |
|
766 AddCaption(loc("Killing spree!"),0xffba00ff,capgrpMessage2) |
|
767 elseif roundKills >= 4 then |
|
768 AddCaption(loc("Unstoppable!"),0xffba00ff,capgrpMessage2) |
|
769 end |
|
770 |
|
771 elseif gear == CurrentHedgehog then |
|
772 DisableTumbler() |
|
773 |
|
774 elseif gear ~= CurrentHedgehog then |
|
775 AddCaption(loc("Friendly Fire!"),0xffba00ff,capgrpMessage2) |
|
776 end |
|
777 |
|
778 end |
|
779 |
|
780 if CurrentHedgehog ~= nil then |
|
781 FollowGear(CurrentHedgehog) |
|
782 end |
|
783 |
|
784 end |
|
785 |
|
786 |