diff -r 136aa9c8c593 -r 07e8de67c3c2 share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua Sun Mar 25 14:51:13 2012 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua Sun Mar 25 17:34:40 2012 +0200 @@ -5,7 +5,7 @@ --------------------------------------------------- --------------------------------------------------- --------------------------------------------------- ---- Space Invasion Code Follows (1.0) +--- Space Invasion Code Follows (1.1) --------------------------------------------------- --------------------------------------------------- -- VERSION HISTORY @@ -125,24 +125,56 @@ ------------------------ -- version 1.0 ------------------------ - -- if only version numbers actually worked like this, wouldn't that be awful :D - -- added surfer achievement -- increased value of shield miser by 1 point per kill (OP?) +------------------------ +-- version 1.1 +------------------------ +-- fixed radar so that blips dont go past circs when you get very close +-- added a missing loc for shield depletion +-- increased delay to 1000 to try stop noobies missing their turn +-- added sniper achievement for hits from over a 1000000 away +-- added achievement for 3 "sniper" shots in a round +-- added achievement for 3 "point blank" shots in a round +-- added "fierce Competition" achievement for shooting an enemy hog (once per round) +-- some support for more weapons later -------------------------- --notes for later -------------------------- --- maybe add a check for a tie, NAH --- more achievements? (3 kamikazes in a row, long distance shooter, supreme shield expert/miser etc?) +-- maybe add a check for a tie, IMPOSSIBRU THERE ARE NO TIES +-- more achievements? (3 kamikazes in a row, supreme shield expert/miser etc?) + +-- if more weps are added, replace primshotsfired all over the place + +-- look for derp and let invaders shoot again + +-- more weps? flamer/machineballgun, +-- some kind of bomb that just drops straight down +-- "fire and forget" missile +-- shockwave + +-- some kind of ability-meter that lets you do something awesome when you are +-- doing really well in a given round. +-- probably new kind of shield that pops any invaders who come near + +-- fix game never ending bug +-- fix radar +-- new invader: golden snitch, doesn't show up on your radar + +-- maybe replace (48/100*vCircRadius[i])/2 with something better + --[[CAPTION CATEGORIES ----------------- capgrpGameState ----------------- - +AddCaption(LOC_NOT("Sniper!") .. " +10 " .. LOC_NOT("points") .. "!",0xffba00ff,capgrpAmmostate) +--they call me bullsye +--point blank combo +--fierce Competition ----------------- capgrpAmmostate ----------------- @@ -162,14 +194,14 @@ AddCaption(LOC_NOT("BOOM! +50 points!"),0xffba00ff,capgrpVolume) AddCaption(LOC_NOT("BOOM! BOOM! BOOM! +100 points!"),0xffba00ff,capgrpVolume) AddCaption(LOC_NOT("Accuracy Bonus! +15 points!"),0xffba00ff,capgrpVolume) -AddCaption(loc("Surfer! +15 points!"),0xffba00ff,capgrpVolume) +AddCaption(LOC_NOT("Surfer! +15 points!"),0xffba00ff,capgrpVolume) ----------------- capgrpMessage ----------------- AddCaption(LOC_NOT("Ammo Depleted!"),0xff0000ff,capgrpMessage) AddCaption(LOC_NOT("Ammo: ") .. primShotsLeft) -AddCaption("Shield Depleted",0xff0000ff,capgrpMessage) +AddCaption(LOC_NOT("Shield Depleted"),0xff0000ff,capgrpMessage) AddCaption( LOC_NOT("Shield ON:") .. " " .. shieldHealth - 80 .. " " .. LOC_NOT("Power Remaining") ) AddCaption(LOC_NOT("Shield OFF:") .. " " .. shieldHealth - 80 .. " " .. LOC_NOT("Power Remaining") ) @@ -206,6 +238,7 @@ local luaGameTicks = 0 -- gaudyRacer +local boosterOn = false local roundLimit = 3 -- no longer set here (see version history) local roundNumber = 0 local firstClan = 10 @@ -252,12 +285,14 @@ local OK = 0 local SK = 0 local shieldMiser = true +local fierceComp = false local chainCounter = 0 local chainLength = 0 local shotsFired = 0 local shotsHit = 0 local SurfTime = 0 - +local sniperHits = 0 +local pointBlankHits = 0 --------------------- -- tumbler goods --------------------- @@ -268,6 +303,18 @@ local upOn = false local downOn = false +---------------- +-- TUMBLER +local wep = {} +local wepAmmo = {} +local wepCol = {} +local wepIndex = 0 +local wepCount = 0 +local fireTimer = 0 +---------------- + + + local primShotsMax = 5 local primShotsLeft = 0 @@ -280,6 +327,10 @@ local pShield local shieldHealth +local shockwave +local shockwaveHealth = 0 +local shockwaveRad = 300 + local Timer100 = 0 local vTag = {} @@ -362,7 +413,7 @@ zoomL = 1.1 yOffset = 70 tCol = 0x00ff00ff - tValue = primShotsLeft + tValue = wepAmmo[wepIndex] --primShotsLeft elseif i == 2 then zoomL = 1.1 xOffset = 40 + 35 @@ -640,11 +691,13 @@ setGearValue(gear,"ID",shellID) --nw WriteLnToConsole("Just assigned ID " .. getGearValue(gear,"ID") .. " to this shell") elseif GetGearType(gear) == gtBall then - lfs = 70 -- 7s + lfs = 5 --70 -- 7s elseif GetGearType(gear) == gtExplosives then lfs = 15 -- 1.5s explosivesID = explosivesID + 1 setGearValue(gear,"ID",explosivesID) + setGearValue(gear,"XP", GetX(gear)) + setGearValue(gear,"YP", GetY(gear)) --nw WriteLnToConsole("Just assigned ID " .. getGearValue(gear,"ID") .. " to this explosives") elseif GetGearType(gear) == gtFlame then lfs = 5 -- 0.5s @@ -710,10 +763,93 @@ -- action keys ----------------------- +function HandleFlameThrower() + + -- + --flamer + + fireTimer = fireTimer + 1 + if fireTimer == 6 then -- 6 + fireTimer = 0 + + if (wep[wepIndex] == loc("Flamer") ) and (preciseOn == true) and (wepAmmo[wepIndex] > 0) and (stopMovement == false) and (tumbleStarted == true) then + + wepAmmo[wepIndex] = wepAmmo[wepIndex] - 1 + AddCaption( + loc("Flamer") .. ": " .. + (wepAmmo[wepIndex]/800*100) - (wepAmmo[wepIndex]/800*100)%2 .. "%", + wepCol[2], + capgrpMessage2 + ) + DrawTag(3) + + dx, dy = GetGearVelocity(CurrentHedgehog) --gtFlame -- gtSnowball -- gtAirBomb + shell = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtFlame, 0, 0, 0, 0) + + xdev = 1 + GetRandom(35) --25 + xdev = xdev / 100 + + r = GetRandom(2) + if r == 1 then + xdev = xdev*-1 + end + + ydev = 1 + GetRandom(35) --25 + ydev = ydev / 100 + + r = GetRandom(2) + if r == 1 then + ydev = ydev*-1 + end + + --4.5 or 2.5 nonflames --4.5 + SetGearVelocity(shell, (dx*4.5)+(xdev*fMod), (dy*4.5)+(ydev*fMod)) --10 + + end + + end + + +end + +function ChangeWeapon() + + wepIndex = wepIndex + 1 + if wepIndex == wepCount then + wepIndex = 0 + end + + AddCaption(wep[wepIndex] .. " " .. loc("selected!"), wepCol[wepIndex],capgrpAmmoinfo ) + AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), wepCol[wepIndex],capgrpMessage2) + +end + +--function onTimer() + + -- experimental wep + --[[SetVisualGearValues(shockwave, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 40, 255, 1, 10, 0, 300, 1, 0xff33ffff) + AddCaption("boom") + PlaySound(sndWarp) + shockwaveHealth = 100 + shockwaveRad = 100]] + + + --change wep + --ChangeWeapon() + + -- booster + --[[if boosterOn == false then + boosterOn = true + else + boosterOn = false + end]] + +--end + -- o rite dis wan iz liek synched n stuff hope full lee -function onPrecise() - - --WriteLnToConsole("onPrecise event handler at Game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) +-- old method +--[[function onPrecise() + -- Fire Barrel if (primShotsLeft > 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then @@ -734,25 +870,61 @@ CopyPV(CurrentHedgehog, morte) -- new addition x,y = GetGearVelocity(morte) - --WriteLnToConsole("I'm going to shoot a barrel so I just got the velocity of currenthedgehog. It is dx: " .. x .. "; dy: " .. y) - --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) - - x = x*2 y = y*2 SetGearVelocity(morte, x, y) - --WriteLnToConsole("I just SET the velocity of a barrel I created. It is now dx: " .. x .. "; dy: " .. y) - --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) - - elseif (primShotsLeft == 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then AddCaption(loc("Ammo Depleted!"),0xff0000ff,capgrpMessage) end +end]] + +-- derp tumbler +function onPrecise() + + if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) and (wepAmmo[wepIndex] > 0) then + + wepAmmo[wepIndex] = wepAmmo[wepIndex] - 1 + --AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), wepCol[wepIndex],capgrpMessage2) + + if wep[wepIndex] == loc("Barrel Launcher") then + shotsFired = shotsFired +1 + + morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtExplosives, 0, 0, 0, 1) + CopyPV(CurrentHedgehog, morte) -- new addition + x,y = GetGearVelocity(morte) + x = x*2 + y = y*2 + SetGearVelocity(morte, x, y) + + if wepAmmo[wepIndex] == 0 then + PlaySound(sndSuddenDeath) + AddCaption(loc("Ammo Depleted!"),0xff0000ff,capgrpMessage) + else + --AddCaption(loc("Ammo") .. ": " .. wepAmmo[wepIndex]) + end + DrawTag(1) + + elseif wep[wepIndex] == loc("Mine Deployer") then + morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtAirBomb, 0, 0, 0, 0) + SetTimer(morte, 1000) + DrawTag(1) + end + + elseif (wepAmmo[wepIndex] == 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then + AddCaption(loc("Ammo Depleted!"),0xff0000ff,capgrpMessage) + end + + preciseOn = true + +end + +function onPreciseUp() + preciseOn = false end function onLJump() @@ -760,7 +932,7 @@ if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then shieldMiser = false if shieldHealth == 80 then - AddCaption("Shield Depleted",0xff0000ff,capgrpMessage) + AddCaption(loc("Shield Depleted"),0xff0000ff,capgrpMessage) PlaySound(sndMineTick) PlaySound(sndSwitchHog) elseif (beam == false) and (shieldHealth > 80) then @@ -835,6 +1007,7 @@ HealthCaseProb = 0 MinesNum = 0 Explosives = 0 + Delay = 1000 for i = 0, 3 do vTag[0] = AddVisualGear(0, 0, vgtHealthTag, 0, false) @@ -842,6 +1015,16 @@ HideTags() + wep[0] = loc("Barrel Launcher") + wep[1] = loc("Mine Deployer") + wep[2] = loc("Flamer") + + wepCol[0] = 0x78818eff + wepCol[1] = 0xa12a77ff + wepCol[2] = 0xf49318ff + + wepCount = 3 + end function onGameStart() @@ -898,12 +1081,14 @@ function onNewTurn() - primShotsLeft = primShotsMax + --primShotsLeft = primShotsMax radShotsLeft = 2 stopMovement = false tumbleStarted = false + boosterOn = false beam = false shieldHealth = 30 + 80 -- 50 = 5 secs, roughly + shockwaveHealth = 0 RK = 0 GK = 0 @@ -912,8 +1097,11 @@ SK = 0 roundKills = 0 shieldMiser = true + fierceComp = false shotsFired = 0 shotsHit = 0 + sniperHits = 0 + pointBlankHits = 0 chainLength = 0 chainCounter = 0 SurfTime = 12 @@ -937,12 +1125,23 @@ SetMyCircles(false) end + + ------- + -- tumbler + ---- + + wepAmmo[0] = 5 + wepAmmo[1] = 2 + wepAmmo[2] = 5000 + wepIndex = 2 + ChangeWeapon() + + HideTags() --------------- --------------- --AddCaption("num g: " .. numGears() ) - --WriteLnToConsole("onNewTurn, I just set a bunch of variables to their necessary states. This was done at:") --WriteLnToConsole("The above occured at Game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) @@ -969,6 +1168,13 @@ HandleCircles() + -- derp + --if shockwaveHealth > 0 then + -- shockwaveHealth = shockwaveHealth - 1 + -- shockwaveRad = shockwaveRad + 5 + --end + + Timer100 = Timer100 + 1 if Timer100 >= 100 then Timer100 = 0 @@ -985,6 +1191,7 @@ end + --nw WriteLnToConsole("Starting ThingsToBeRunOnGears()") runOnGears(ThingsToBeRunOnGears) @@ -1063,6 +1270,7 @@ if (TimeLeft == 0) then if (stopMovement == false) then --time to stop the player stopMovement = true + boosterOn = false beam = false upOn = false down = false @@ -1148,9 +1356,16 @@ --WriteLnToConsole("I just got the velocity of currenthedgehog. It is dx: " .. dx .. "; dy: " .. dy) --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) - - dxlimit = 0.4*fMod - dylimit = 0.4*fMod + if boosterOn == true then + tempE = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtDust, 0, false) + g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) + SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, 1, g9, GetClanColor(GetHogClan(CurrentHedgehog)) ) + dxlimit = 0.8*fMod + dylimit = 0.8*fMod + else + dxlimit = 0.4*fMod + dylimit = 0.4*fMod + end if dx > dxlimit then dx = dxlimit @@ -1188,6 +1403,10 @@ end + + HandleFlameThrower() + + end -- new end I put here to check if he's still alive or not end @@ -1196,6 +1415,16 @@ end +function onGearDamage(gear, damage) + if GetGearType(gear) == gtHedgehog then + if (fierceComp == false) and (damage >= 60) and (GetHogClan(gear) ~= GetHogClan(CurrentHedgehog)) then + fierceComp = true + AddCaption(loc("Fierce Competition!") .. " +8 " .. loc("points") .. "!",0xffba00ff,capgrpGameState) + AwardPoints(8) + end + end +end + function onGearResurrect(gear) -- did I fall into the water? well, that was a stupid thing to do @@ -1203,7 +1432,6 @@ TimeLeft = 0 --WriteLnToConsole("Current hedgehog just drowned himself") --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) - end end @@ -1233,7 +1461,8 @@ function onGearDelete(gear) - if GetGearType(gear) == gtShell then + + --[[if GetGearType(gear) == gtShell then --nw WriteLnToConsole("on GearDelete call. Shell ID: " .. getGearValue(gear,"ID")) --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks) @@ -1249,11 +1478,7 @@ --end elseif GetGearType(gear) == gtFlame then --WriteLnToConsole("on GearDelete flame") - end - - - - + end]] if isATrackedGear(gear) then trackDeletion(gear) @@ -1281,10 +1506,6 @@ function DoHorribleThings(cUID) - -- maybe - -- add a check to draw it inside the circ and not past it if - -- it is closer than 150 or w/e - -- work out the distance to the target g1X, g1Y = GetGearPosition(CurrentHedgehog) g2X, g2Y = vCircX[cUID], vCircY[cUID] @@ -1292,7 +1513,6 @@ w = g1Y - g2Y r = math.sqrt( (q*q) + (w*w) ) --alternate - opp = w if opp < 0 then opp = opp*-1 @@ -1307,13 +1527,18 @@ NY = math.sin( math.rad(t) ) * NR -- displace xy based on where this thing actually is - if q > 0 then + + if r < NR then + rCircX[cUID] = g2X + elseif q > 0 then rCircX[cUID] = g1X - NX else rCircX[cUID] = g1X + NX end - if w > 0 then + if r < NR then + rCircY[cUID] = g2Y + elseif w > 0 then rCircY[cUID] = g1Y - NY else rCircY[cUID] = g1Y + NY @@ -1325,6 +1550,12 @@ return (playerIsFine) end +function GetDistFromXYtoXY(a, b, c, d) + q = a - c + w = b - d + return ( (q*q) + (w*w) ) +end + function GetDistFromGearToGear(gear, gear2) g1X, g1Y = GetGearPosition(gear) @@ -1422,6 +1653,8 @@ --SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 80, 200, 1, 10, 0, 200, 5, 0xff00ffff) + shockwave = AddVisualGear(0,0,vgtCircle,0,true) + end function IGotMeASafeXYValue(i) @@ -1473,7 +1706,8 @@ AddVisualGear(vCircX[i], vCircY[i], vgtExplosion, 0, false) PlaySound(sndExplosion) PlaySound(sndShotgunReload) - primShotsLeft = primShotsLeft + 3 + wepAmmo[0] = wepAmmo[0] +3 + --primShotsLeft = primShotsLeft + 3 AddCaption("+" .. 3 .. " " .. loc("Ammo"), 0x00ff00ff,capgrpMessage) DrawTag(1) @@ -1702,9 +1936,6 @@ --nw WriteLnToConsole("Start of CheckVarious(): Shell ID: " .. getGearValue(gear,"ID")) --end - - - targetHit = false -- if circle is hit by player fire @@ -1730,10 +1961,29 @@ if dist <= NR*NR then - --nw WriteLnToConsole("Collision confirmed. The gtExplosives is within the circ radius!") - - --SetGearPosition(gear, vCircX[i], vCircY[i]) - --WriteLnToConsole("set the gtExplosives to be in the center of circ") + + --nw WriteLnToConsole("Collision confirmed. The gtExplosives is within the circ radius!") + + dist = (GetDistFromXYtoXY(vCircX[i], vCircY[i], getGearValue(gear,"XP"), getGearValue(gear,"YP")) - (NR*NR)) + --AddCaption(loc("Dist: ") .. dist .. "!",0xffba00ff,capgrpGameState) + if dist >= 1000000 then + sniperHits = sniperHits +1 + AddCaption(loc("Sniper!") .. " +8 " .. loc("points") .. "!",0xffba00ff,capgrpGameState) + AwardPoints(8) + if sniperHits == 3 then + sniperHits = 0 + AddCaption(loc("They Call Me Bullseye!") .. " +16 " .. loc("points") .. "!",0xffba00ff,capgrpGameState) + AwardPoints(15) + end + elseif dist <= 6000 then + pointBlankHits = pointBlankHits +1 + if pointBlankHits == 3 then + pointBlankHits = 0 + AddCaption(loc("Point Blank Combo!") .. " +5 " .. loc("points") .. "!",0xffba00ff,capgrpGameState) + AwardPoints(5) + end + end + AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false) targetHit = true @@ -1753,6 +2003,8 @@ shotsHit = shotsHit + 1 + + end --end @@ -1760,7 +2012,7 @@ end -- if player is hit by circle bazooka - elseif (GetGearType(gear) == gtShell) or (GetGearType(gear) == gtBall) then + elseif (GetGearType(gear) == gtShell) then --or (GetGearType(gear) == gtBall) then dist = GetDistFromGearToGear(gear, CurrentHedgehog) @@ -1848,10 +2100,12 @@ WellHeAintGonnaJumpNoMore(GetX(CurrentHedgehog),GetY(CurrentHedgehog)) if ss == "fatal" then - if (primShotsLeft == 0) and (TimeLeft <= 9) then + + if (wepAmmo[0] == 0) and (TimeLeft <= 9) then + --if (primShotsLeft == 0) and (TimeLeft <= 9) then AddCaption(loc("Kamikaze Expert!") .. " +15 " .. loc("points") .. "!",0xffba00ff,capgrpMessage) AwardPoints(15) - elseif (primShotsLeft == 0) then + elseif (wepAmmo[0] == 0) then AddCaption(loc("Depleted Kamikaze!") .. " +5 " .. loc("points") .. "!",0xffba00ff,capgrpMessage) AwardPoints(5) elseif TimeLeft <= 9 then @@ -1907,6 +2161,8 @@ SetVisualGearValues(rCirc[i], rCircX[i], rCircY[i], 100, 255, 1, 10, 0, 40, 3, vCircCol[i]-rAlpha) --end + + vCounter[i] = vCounter[i] + 1 if vCounter[i] >= vCounterLim[i] then @@ -2081,6 +2337,18 @@ end + + -- derp + if shockwaveHealth > 0 then + shockwaveHealth = shockwaveHealth - 1 + shockwaveRad = shockwaveRad + 80 + + --mrm = ((48/100*shockwaveRad)/2) + --AddVisualGear(GetX(CurrentHedgehog)-mrm+GetRandom(mrm*2),GetY(CurrentHedgehog)-mrm+GetRandom(mrm*2), vgtSmoke, 0, false) + end + + + end for i = 0,(vCCount-1) do @@ -2097,15 +2365,26 @@ end - if (CurrentHedgehog ~= nil) and (beam == true) then - g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(pShield) - --SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 200, g9, g10 ) - SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 200, g9, 0xa800ffff-0x000000ff - -shieldHealth ) - DrawTag(2) - else - SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 0, g9, g10 ) + if (CurrentHedgehog ~= nil) then + if beam == true then + g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(pShield) + --SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 200, g9, g10 ) + SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 200, g9, 0xa800ffff-0x000000ff - -shieldHealth ) + DrawTag(2) + else + SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 0, g9, g10 ) + end + + if shockwaveHealth > 0 then + g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(shockwave) + SetVisualGearValues(shockwave, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, shockwaveRad, g9, 0xff3300ff-0x000000ff - -shockwaveHealth ) + else + SetVisualGearValues(shockwave, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 0, g9, g10 ) + end + end + end function ProjectileTrack(gear)