--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Space_Invasion.lua Sat Aug 18 18:11:04 2012 +0200
@@ -0,0 +1,2435 @@
+
+loadfile(GetDataPath() .. "Scripts/Locale.lua")()
+loadfile(GetDataPath() .. "Scripts/Tracker.lua")()
+
+---------------------------------------------------
+---------------------------------------------------
+---------------------------------------------------
+--- Space Invasion Code Follows (1.1)
+---------------------------------------------------
+---------------------------------------------------
+-- VERSION HISTORY
+----------------
+-- version 0.1
+----------------
+-- conversion of tumbler into space invasion
+-- a million and one changes
+-- bells and whistles
+
+----------------
+-- version 0.2
+----------------
+-- code slowly getting cleaner, it still looks like a spaghetti monster tho
+-- lots of console tracking :/
+-- all visual gears are now compulsary (will probably revert this)
+-- implemented fMod to try combat desyncs and bring this in line with dev
+
+----------------
+-- version 0.3
+----------------
+-- values of scoring changed to 3:10, and now based on vCircScore
+-- time gained from killing a red circ increased from 3 to 4
+-- circles now spawn at a distance of at least 800 or until sanity limit
+-- roundsLimit now based off MinesTime (kinda, its an experiment)
+
+-----------------
+--0.4
+-----------------
+-- commented out a lot of WriteLnToConsoles (dont need them at this point)
+-- added some different WriteLnToConsoles
+-- changed some of the collision detect for explosives in checkvarious()
+
+-----------------
+--0.5
+-----------------
+-- added implementation for a projectile shield
+-- added a "bonus" orange invader that partially recharges player shield
+-- added a tough "blueboss" blue invader
+-- expanded user feedback
+-- circles now have health and are capable of being merely "damaged"
+-- redid a lot of the collision code and added CircleDamaged
+-- added more sounds to events
+-- added more visual gears
+
+-----------------
+--0.6
+-----------------
+-- removed a few WriteLns
+-- added randomized grunts on circ damage
+-- added (mostly) graceful fading out of circles :D:
+-- changed odds for circles
+-- changed user feedback
+-- fixed the location of the explosion where player bashes into circ
+
+-----------------
+--0.7
+-----------------
+-- added PlaySound(sndSuddenDeath) when ammo gets depleted
+-- added an extra "Ammo Depleted" note if user presses fire while empty
+-- specified how much shield power is gained on shield powerup collection
+-- changed odds for circles AGAIN, ammo is now sliiightly more common
+-- switched most of the explosions/smoke effects back to non-critical vgears (with a few exceptions)
+-- tumbletime is now based off turntime and is variable
+-- delete explosives in DeleteFarFlungBarrel rather than explode them on map boundaries to save on performance
+-- utilized the improved AddCaption to tint / prevent overrides
+-- temporarily disabled bugged sort that displays teams according to their score
+-- reluctantly changed the colour of the bonus circ to purple
+-- standarized point notation
+-- added some missing locs
+-- commented out remaining WriteLnToConsoles for the meanwhile with the prefix "nw"
+
+-- ACHIEIVEMENTS added
+-- (during one turn) aka repeatable
+-- Ammo Manic (Destroy 3 green circles for + 5 points)
+-- Drone Hunter (Destroy 5 red circles for + 10 points)
+-- Shield Seeker (Destroy 3 purple circles for +10 points)
+-- Boss Slayer (Destroy 2 blue circles for +25 points)
+
+-- Shield Master (disolve 5 shells for +10 points)
+-- Shield Miser (don't use your shield at all (3.5*roundkills)+2 points)
+
+-- Depleted Kamikaze! (kamikaze into a blue/red circ when you are out of ammo) 5pts
+-- Timed Kamikaze! (kamikaze into a blue/red circ when you only have 5s left) 10pts
+-- Kamikaze Expert (combination of the above two) 15pts
+
+-- Multi-shot (destroy more than 1 invader with a single bullet) 15pts
+-- X-Hit Combo (destroy another invader in less than 3 seconds) chainLength*2 points
+
+-- Accuracy Bonus (80% accuracy at the end of your turn with more than 5 shots fired) 15pts
+
+--(during the length of the game) aka non-repeatable
+-- 10/25/50 kills (+25/+50/+100 points)
+
+-----------------
+--0.8
+-----------------
+-- added a HUD for turntimeleft, ammo, shield
+-- shieldhealth hits 0 properly
+
+------------------------
+-- version 0.8.1
+------------------------
+
+-- stop hiding non-existant 4th Tag
+-- redraw HUD on screen resolution change
+
+------------------------
+-- version 0.9
+------------------------
+-- time for more 'EXPERIMENTS' mwahahahahahaha D:
+-- (hopefully) balanced Shield Miser
+-- bosses are no longer a redunkulous 50 points, but toned down to 30
+-- experimental radar (it's INTERACTIVE and math-heavy :D) (visual gears are safe... right? D:)
+-- bugfix and balance for multishot
+
+------------------------
+-- 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, 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
+-----------------
+AddCaption( chainLength .. LOC_NOT("-chain! +") .. chainLength*2 .. LOC_NOT(" points!"),0xffba00ff,capgrpAmmostate)
+AddCaption(LOC_NOT("Multi-shot! +15 points!"),0xffba00ff,capgrpAmmostate)
+
+-----------------
+capgrpAmmoinfo
+-----------------
+AddCaption(LOC_NOT("Shield Miser! +20 points!"),0xffba00ff,capgrpAmmoinfo)
+AddCaption(LOC_NOT("Shield Master! +10 points!"),0xffba00ff,capgrpAmmoinfo)
+
+-----------------
+capgrpVolume
+-----------------
+AddCaption(LOC_NOT("Boom! +25 points!"),0xffba00ff,capgrpVolume)
+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_NOT("Surfer! +15 points!"),0xffba00ff,capgrpVolume)
+
+-----------------
+capgrpMessage
+-----------------
+AddCaption(LOC_NOT("Ammo Depleted!"),0xff0000ff,capgrpMessage)
+AddCaption(LOC_NOT("Ammo: ") .. primShotsLeft)
+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") )
+
+AddCaption(LOC_NOT("Time Extended!") .. "+" .. 4 .. LOC_NOT("s"), 0xff0000ff,capgrpMessage )
+AddCaption("+" .. 3 .. " " .. LOC_NOT("Ammo"), 0x00ff00ff,capgrpMessage)
+AddCaption(LOC_NOT("Shield boosted! +30 power"), 0xff00ffff,capgrpMessage)
+AddCaption(LOC_NOT("Shield is fully recharged!"), 0xffae00ff,capgrpMessage)
+AddCaption(LOC_NOT("Boss defeated! +50 points!"), 0x0050ffff,capgrpMessage)
+
+AddCaption(LOC_NOT("GOTCHA!"))
+AddCaption(LOC_NOT("Kamikaze Expert! +15 points!"),0xffba00ff,capgrpMessage)
+AddCaption(LOC_NOT("Depleted Kamikaze! +5 points!"),0xffba00ff,capgrpMessage)
+AddCaption(LOC_NOT("Timed Kamikaze! +10 points!"),0xffba00ff,capgrpMessage)
+
+-----------------
+capgrpMessage2
+-----------------
+AddCaption(LOC_NOT("Drone Hunter! +10 points!"),0xffba00ff,capgrpMessage2)
+AddCaption(LOC_NOT("Ammo Maniac! +5 points!"),0xffba00ff,capgrpMessage2)
+AddCaption(LOC_NOT("Shield Seeker! +10 points!"),0xffba00ff,capgrpMessage2)
+AddCaption(LOC_NOT("Boss Slayer! +25 points!"),0xffba00ff,capgrpMessage2)
+]]
+
+----------------------------------
+-- so I herd u liek wariables
+----------------------------------
+
+--local fMod = 1 -- for use in .15 single player only, otherwise desync
+local fMod = 1000000 -- use this for dev and .16+ games
+
+-- some console stuff
+local shellID = 0
+local explosivesID = 0
+
+-- gaudyRacer
+local boosterOn = false
+local roundLimit = 3 -- no longer set here (see version history)
+local roundNumber = 0
+local firstClan = 10
+local gameOver = false
+local gameBegun = false
+
+local bestClan = 10
+local bestScore = 0
+local sdScore = {}
+local sdName = {}
+local sdKills = {}
+
+local roundN = 0
+local lastRound
+local RoundHasChanged = true
+
+--------------------------
+-- hog and team tracking variales
+--------------------------
+
+local numhhs = 0
+local hhs = {}
+
+local numTeams
+local teamNameArr = {}
+local teamClan = {}
+local teamSize = {}
+local teamIndex = {}
+
+local teamComment = {}
+local teamScore = {}
+local teamCircsKilled = {}
+local teamSurfer = {}
+
+-- stats variables
+--local teamRed = {}
+--local teamBlue = {}
+--local teamOrange = {}
+--local teamGreen = {}
+local roundKills = 0
+local RK = 0
+local GK = 0
+local BK = 0
+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
+---------------------
+
+local leftOn = false
+local rightOn = false
+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
+
+local TimeLeft = 0
+local stopMovement = false
+local tumbleStarted = false
+
+local beam = false
+local pShield
+local shieldHealth
+
+local shockwave
+local shockwaveHealth = 0
+local shockwaveRad = 300
+
+local vTag = {}
+
+-----------------------------------------------
+-- CIRCLY GOODIES
+-----------------------------------------------
+
+local CirclesAreGo = false
+local playerIsFine = true
+local targetHit = false
+
+local FadeAlpha = 0 -- used to fade the circles out gracefully when player dies
+local pTimer = 0 -- tracking projectiles following player
+
+--local m2Count = 0 -- handle speed of circs
+
+local vCirc = {}
+local vCCount = 0
+
+local rCirc = {}
+local rCircX = {}
+local rCircY = {}
+local rAlpha = 255
+local radShotsLeft = 0
+
+local vCircActive = {}
+local vCircHealth = {}
+local vType = {}
+local vCounter = {} -- how often this circ gets to "fire" etc
+local vCounterLim = {} -- when vCounter == vCounterLim circle performs its special
+local vCircScore = {} -- how many points killing this invader gives
+
+local vCircRadMax = {}
+local vCircRadMin = {}
+local vCircRadDir = {}
+local vCircRadCounter = {}
+
+local vCircDX = {}
+local vCircDY = {}
+
+local vCircX = {}
+local vCircY = {}
+local vCircMinA = {}
+local vCircMaxA = {}
+local vCircType = {}
+local vCircPulse = {}
+local vCircFuckAll = {}
+local vCircRadius = {}
+local vCircWidth = {}
+local vCircCol = {}
+
+-------------------------------------------
+-- some lazy copypasta/modified methods
+-------------------------------------------
+
+
+
+function HideTags()
+
+ for i = 0, 2 do
+ SetVisualGearValues(vTag[i],0,0,0,0,0,1,0, 0, 240000, 0xffffff00)
+ end
+
+end
+
+function DrawTag(i)
+
+ zoomL = 1.3
+
+ xOffset = 40
+
+ if i == 0 then
+ yOffset = 40
+ tCol = 0xffba00ff
+ tValue = TimeLeft
+ elseif i == 1 then
+ zoomL = 1.1
+ yOffset = 70
+ tCol = 0x00ff00ff
+ tValue = wepAmmo[wepIndex] --primShotsLeft
+ elseif i == 2 then
+ zoomL = 1.1
+ xOffset = 40 + 35
+ yOffset = 70
+ tCol = 0xa800ffff
+ tValue = shieldHealth - 80
+ end
+
+ DeleteVisualGear(vTag[i])
+ vTag[i] = AddVisualGear(0, 0, vgtHealthTag, 0, false)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vTag[i])
+ SetVisualGearValues (
+ vTag[i], --id
+ -(ScreenWidth/2) + xOffset, --xoffset
+ ScreenHeight - yOffset, --yoffset
+ 0, --dx
+ 0, --dy
+ zoomL, --zoom
+ 1, --~= 0 means align to screen
+ g7, --frameticks
+ tValue, --value
+ 240000, --timer
+ tCol --GetClanColor( GetHogClan(CurrentHedgehog) )
+ )
+
+end
+
+function RebuildTeamInfo()
+
+ -- make a list of individual team names
+ for i = 0, (TeamsCount-1) do
+ teamNameArr[i] = " " -- = i
+ teamSize[i] = 0
+ teamIndex[i] = 0
+ teamScore[i] = 0
+ teamCircsKilled[i] = 0
+ teamSurfer[i] = false
+ end
+ numTeams = 0
+
+ for i = 0, (numhhs-1) do
+
+ z = 0
+ unfinished = true
+ while(unfinished == true) do
+
+ newTeam = true
+ tempHogTeamName = GetHogTeamName(hhs[i]) -- this is the new name
+
+ if tempHogTeamName == teamNameArr[z] then
+ newTeam = false
+ unfinished = false
+ end
+
+ z = z + 1
+
+ if z == (TeamsCount-1) then
+ unfinished = false
+ if newTeam == true then
+ teamNameArr[numTeams] = tempHogTeamName
+ numTeams = numTeams + 1
+ end
+ end
+
+ end
+
+ end
+
+ -- find out how many hogs per team, and the index of the first hog in hhs
+ for i = 0, (TeamsCount-1) do
+
+ for z = 0, (numhhs-1) do
+ if GetHogTeamName(hhs[z]) == teamNameArr[i] then
+ teamClan[i] = GetHogClan(hhs[z])
+ if teamSize[i] == 0 then
+ teamIndex[i] = z -- should give starting index
+ end
+ teamSize[i] = teamSize[i] + 1
+ --add a pointer so this hog appears at i in hhs
+ end
+ end
+
+ end
+
+end
+
+-- control
+function AwardPoints(p)
+
+ for i = 0,(TeamsCount-1) do
+ if teamClan[i] == GetHogClan(CurrentHedgehog) then
+ teamScore[i] = teamScore[i] + p
+ end
+ end
+
+end
+
+function AwardKills(t)
+
+ roundKills = roundKills + 1
+
+ for i = 0,(TeamsCount-1) do
+ if teamClan[i] == GetHogClan(CurrentHedgehog) then
+ teamCircsKilled[i] = teamCircsKilled[i] + 1
+
+ if teamCircsKilled[i] == 10 then
+ AddCaption(loc("Boom!") .. " +25 " .. loc("points").."!",0xffba00ff,capgrpVolume)
+ AwardPoints(25)
+ elseif teamCircsKilled[i] == 25 then
+ AddCaption(loc("BOOM!") .. " +50 " .. loc("points") .. "!",0xffba00ff,capgrpVolume)
+ AwardPoints(50)
+ elseif teamCircsKilled[i] == 50 then
+ AddCaption(loc("BOOM!") .. loc("BOOM!") .. loc("BOOM!") .. " +100 " .. loc("points") .. "!",0xffba00ff,capgrpVolume)
+ AwardPoints(100)
+ end
+
+ --[[
+ if t == "R" then
+ redCircsKilled[i] = redCircsKilled[i] + 1
+ end
+ --etc
+ --etc
+ ]]
+ end
+ end
+
+end
+
+-----------------
+
+function bubbleSort(table)
+
+ for i = 1, #table do
+ for j = 2, #table do
+ if table[j] < table[j-1] then
+
+ temp = table[j-1]
+ t2 = sdName[j-1]
+ t3 = sdKills[j-1]
+
+ table[j-1] = table[j]
+ sdName[j-1] = sdName[j]
+ sdKills[j-1] = sdKills[j]
+
+ table[j] = temp
+ sdName[j] = t2
+ sdKills[j] = t3
+
+ end
+ end
+ end
+
+ return
+
+end
+
+-----------------
+
+function CommentOnScore()
+
+ for i = 0,(TeamsCount-1) do
+ sdScore[i] = teamScore[i]
+ sdKills[i] = teamCircsKilled[i]
+ sdName[i] = teamNameArr[i]
+ end
+
+ --bubbleSort(sdScore)
+
+ for i = 0,(TeamsCount-1) do
+ if sdName[i] ~= " " then
+ teamComment[i] = sdName[i] .. " |" ..
+ loc("SCORE") .. ": " .. sdScore[i] .. " " .. loc("points") .. "|" ..
+ loc("KILLS") .. ": " .. sdKills[i] .. " " .. loc("invaders destroyed") .. "|" ..
+ " " .. "|"
+ elseif sdName[i] == " " then
+ teamComment[i] = "|"
+ end
+ end
+
+ entireC = ""
+ for i = (TeamsCount-1),0,-1 do
+ entireC = entireC .. teamComment[i]
+ end
+
+ ShowMission("SPACE INVASION", loc("STATUS UPDATE"), loc("Rounds Complete") .. ": " .. roundNumber .. "/" .. roundLimit .. "| " .. "|" .. loc("Team Scores") .. ": |" ..entireC, 4, 1)
+
+end
+
+function onNewRound()
+ roundNumber = roundNumber + 1
+
+ CommentOnScore()
+
+ -- end game if its at round limit
+ if roundNumber == roundLimit then
+
+ for i = 0, (TeamsCount-1) do
+ if teamScore[i] > bestScore then
+ bestScore = teamScore[i]
+ bestClan = teamClan[i]
+ end
+ end
+
+ for i = 0, (numhhs-1) do
+ if GetHogClan(hhs[i]) ~= bestClan then
+ SetEffect(hhs[i], heResurrectable, false)
+ SetHealth(hhs[i],0)
+ end
+ end
+ gameOver = true
+ TurnTimeLeft = 0 --1
+ TimeLeft = 0
+ end
+end
+
+-- gaudy racer
+function CheckForNewRound()
+
+ ----------
+ -- new
+ ----------
+
+ --[[if gameBegun == true then
+
+ if RoundHasChanged == true then
+ roundN = roundN + 1
+ RoundHasChanged = false
+ onNewRound()
+ end
+
+ if lastRound ~= TotalRounds then -- new round, but not really
+
+ if RoundHasChanged == false then
+ RoundHasChanged = true
+ end
+
+ end
+
+ --AddCaption("RoundN:" .. roundN .. "; " .. "TR: " .. TotalRounds)
+ lastRound = TotalRounds
+
+ end]]
+
+ ----------
+ -- old
+ ----------
+ if GetHogClan(CurrentHedgehog) == firstClan then
+ onNewRound()
+ end
+
+end
+
+
+----------------------------------------
+-- some tumbler/space invaders methods
+----------------------------------------
+
+function isATrackedGear(gear)
+ if (GetGearType(gear) == gtExplosives) or
+ (GetGearType(gear) == gtShell) or
+ (GetGearType(gear) == gtFlame) or-- new -- gtBall
+ (GetGearType(gear) == gtBall)
+ then
+ return(true)
+ else
+ return(false)
+ end
+end
+
+function setNewGearValues(gear)
+
+ if GetGearType(gear) == gtShell then
+ lfs = 50 -- roughly 5 seconds
+ shellID = shellID + 1
+ setGearValue(gear,"ID",shellID)
+ --nw WriteLnToConsole("Just assigned ID " .. getGearValue(gear,"ID") .. " to this shell")
+ elseif GetGearType(gear) == gtBall then
+ 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
+ else
+ lfs = 100
+ end
+
+ setGearValue(gear,"lifespan",lfs)
+ --WriteLnToConsole("I also set its lifespan to " .. lfs)
+
+
+end
+
+function HandleLifeSpan(gear)
+
+ decreaseGearValue(gear,"lifespan")
+
+ --WriteLnToConsole("Just decreased the lifespan of a gear to " .. getGearValue(gear,"lifespan"))
+ --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
+
+
+ if getGearValue(gear,"lifespan") == 0 then
+
+ if GetGearType(gear) == gtShell then
+ AddVisualGear(GetX(gear), GetY(gear), vgtExplosion, 0, false)
+ WriteLnToConsole("about to delete a shell due to lifespan == 0")
+ --elseif GetGearType(gear) == gtBall then
+ -- AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, true)
+ elseif GetGearType(gear) == gtExplosives then
+ AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
+ --nw WriteLnToConsole("about to delete a explosive due to lifespan == 0")
+ elseif GetGearType(gear) == gtFlame then
+ AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, false)
+ --WriteLnToConsole("about to delete flame due to lifespan == 0")
+ end
+
+ DeleteGear(gear)
+
+ end
+
+end
+
+-- this prevents ugly barrel clipping sounds when a barrel flies off map limits
+function DeleteFarFlungBarrel(gear)
+
+ if GetGearType(gear) == gtExplosives then
+ if (GetX(gear) < -1900) or
+ (GetX(gear) > 6200) or
+ (GetY(gear) < -3400)
+ then
+ AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
+ DeleteGear(gear)
+ --SetHealth(gear, 0)
+ --WriteLnToConsole("I'm setting barrel ID " .. getGearValue(gear,"ID") .. " to 0 health because it's been flung too close to the map edges. at Game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
+ end
+
+ end
+
+end
+
+-----------------------
+--EVENT HANDLERS
+-- 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
+-- old method
+--[[function onPrecise()
+
+
+ -- Fire Barrel
+ if (primShotsLeft > 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then
+
+ shotsFired = shotsFired +1
+
+ morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtExplosives, 0, 0, 0, 1)
+
+ primShotsLeft = primShotsLeft - 1
+
+ if primShotsLeft == 0 then
+ PlaySound(sndSuddenDeath)
+ AddCaption(loc("Ammo Depleted!"),0xff0000ff,capgrpMessage)
+ else
+ AddCaption(loc("Ammo") .. ": " .. primShotsLeft)
+ end
+ DrawTag(1)
+
+ CopyPV(CurrentHedgehog, morte) -- new addition
+ x,y = GetGearVelocity(morte)
+
+ x = x*2
+ y = y*2
+ SetGearVelocity(morte, x, y)
+
+
+ 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()
+
+ if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then
+ shieldMiser = false
+ if shieldHealth == 80 then
+ AddCaption(loc("Shield Depleted"),0xff0000ff,capgrpMessage)
+ PlaySound(sndMineTick)
+ PlaySound(sndSwitchHog)
+ elseif (beam == false) and (shieldHealth > 80) then
+ beam = true
+ SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 40, 255, 1, 10, 0, 300, 1, 0xa800ffff)
+ AddCaption( loc("Shield ON:") .. " " .. shieldHealth - 80 .. " " .. loc("Power Remaining") )
+ PlaySound(sndWarp)
+ else
+ beam = false
+ SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 0, 0, 1, 10, 0, 0, 0, 0xa800ffff)
+ AddCaption(loc("Shield OFF:") .. " " .. shieldHealth - 80 .. " " .. loc("Power Remaining") )
+ end
+ end
+end
+
+function onHJump()
+
+ if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) and
+ (rAlpha == 255) and (radShotsLeft > 0) then
+ rPingTimer = 0
+ rAlpha = 0
+ radShotsLeft = radShotsLeft -1
+ AddCaption(loc("Pings left:") .. " " .. radShotsLeft,GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage)
+ end
+
+end
+
+-----------------
+-- movement keys
+-----------------
+
+function onLeft()
+ leftOn = true
+end
+
+function onRight()
+ rightOn = true
+end
+
+function onUp()
+ upOn = true
+end
+
+function onDown()
+ downOn = true
+end
+
+function onDownUp()
+ downOn = false
+end
+
+function onUpUp()
+ upOn = false
+end
+
+function onLeftUp()
+ leftOn = false
+end
+
+function onRightUp()
+ rightOn = false
+end
+
+--------------------------
+-- other event handlers
+--------------------------
+
+function onGameInit()
+ GameFlags = 0 + gfRandomOrder
+ Theme = "EarthRise"
+ CaseFreq = 0
+ HealthCaseProb = 0
+ MinesNum = 0
+ Explosives = 0
+ Delay = 1000
+
+ for i = 0, 3 do
+ vTag[0] = AddVisualGear(0, 0, vgtHealthTag, 0, false)
+ end
+
+ 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()
+
+ if (MinesTime == -1000) or (MinesTime == 0) then
+ roundLimit = 3
+ else
+ roundLimit = (MinesTime / 1000)
+ end
+
+ ShowMission (
+ "SPACE INVASION",
+ loc("a Hedgewars mini-game"),
+
+ loc("Destroy invaders to score points.") .. "|" ..
+ " " .. "|" ..
+
+ loc("Round Limit") .. ": " .. roundLimit .. "|" ..
+ loc("Turn Time") .. ": " .. (TurnTime/1000) .. loc("sec") .. "|" ..
+ " " .. "|" ..
+
+ loc("Movement: [Up], [Down], [Left], [Right]") .. "|" ..
+ loc("Fire") .. ": " .. loc("[Left Shift]") .. "|" ..
+ loc("Toggle Shield") .. ": " .. loc("[Enter]") .. "|" ..
+ loc("Radar Ping") .. ": " .. loc("[Backspace]") .. "|" ..
+
+ --" " .. "|" ..
+ --LOC_NOT("Invaders List: ") .. "|" ..
+ --LOC_NOT("Blue Jabberwock: (50 points)") .. "|" ..
+ --LOC_NOT("Red Warbler: (10 points)") .. "|" ..
+ --LOC_NOT("Orange Gob: (5 points)") .. "|" ..
+ --LOC_NOT("Green Wrangler: (3 points)") .. "|" ..
+
+
+ "", 4, 4000
+ )
+
+ CreateMeSomeCircles()
+ RebuildTeamInfo() -- control
+ lastRound = TotalRounds
+
+end
+
+function onScreenResize()
+
+ -- redraw Tags so that their screen locations are updated
+ if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then
+ DrawTag(0)
+ DrawTag(1)
+ DrawTag(2)
+ end
+
+end
+
+function onNewTurn()
+
+ --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
+ BK = 0
+ OK = 0
+ SK = 0
+ roundKills = 0
+ shieldMiser = true
+ fierceComp = false
+ shotsFired = 0
+ shotsHit = 0
+ sniperHits = 0
+ pointBlankHits = 0
+ chainLength = 0
+ chainCounter = 0
+ SurfTime = 12
+
+ -------------------------
+ -- gaudy racer
+ -------------------------
+ CheckForNewRound()
+
+ -- Handle Starting Stage of Game
+ if (gameOver == false) and (gameBegun == false) then
+ gameBegun = true
+ roundNumber = 0 -- 0
+ firstClan = GetHogClan(CurrentHedgehog)
+ end
+
+ if gameOver == true then
+ gameBegun = false
+ stopMovement = true
+ tumbleStarted = false
+ 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)
+
+end
+
+function ThingsToBeRunOnGears(gear)
+
+ HandleLifeSpan(gear)
+ DeleteFarFlungBarrel(gear)
+
+ if CirclesAreGo == true then
+ CheckVarious(gear)
+ ProjectileTrack(gear)
+ end
+
+end
+
+
+function onGameTick20()
+
+
+ --WriteLnToConsole("Start of GameTick")
+
+ HandleCircles()
+
+ -- derp
+ --if shockwaveHealth > 0 then
+ -- shockwaveHealth = shockwaveHealth - 1
+ -- shockwaveRad = shockwaveRad + 5
+ --end
+
+
+ if GameTime%100 == 0 then
+
+ if beam == true then
+ shieldHealth = shieldHealth - 1
+ if shieldHealth < 80 then -- <= 80
+ shieldHealth = 80
+ beam = false
+ AddCaption(loc("Shield Depleted"),0xff0000ff,capgrpMessage)
+ PlaySound(sndMineTick)
+ PlaySound(sndSwitchHog)
+ end
+ end
+
+
+
+ --nw WriteLnToConsole("Starting ThingsToBeRunOnGears()")
+
+ runOnGears(ThingsToBeRunOnGears)
+
+ --nw WriteLnToConsole("Finished ThingsToBeRunOnGears()")
+
+ --runOnGears(HandleLifeSpan)
+ --runOnGears(DeleteFarFlungBarrel)
+
+ if CirclesAreGo == true and CurrentHedgehog ~= nil then
+ CheckDistances()
+ --runOnGears(CheckVarious) -- used to be in handletracking for some bizarre reason
+ --runOnGears(ProjectileTrack)
+ end
+
+ -- white smoke trail as player falls from the sky
+ if (TimeLeft <= 0) and (stopMovement == true) and (CurrentHedgehog ~= nil) then
+ j,k = GetGearVelocity(CurrentHedgehog)
+ if (j ~= 0) and (k ~= 0) then
+ AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtSmoke, 0, true)
+ end
+ end
+
+ --nw WriteLnToConsole("Finished 100Timer")
+
+ end
+
+
+ -- start the player tumbling with a boom once their turn has actually begun
+ if (tumbleStarted == false) and (gameOver == false) then
+ if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) then
+ --AddCaption(LOC_NOT("Good to go!"))
+ tumbleStarted = true
+ TimeLeft = div(TurnTime, 1000) --45
+ FadeAlpha = 0
+ rAlpha = 255
+ AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1)
+ DrawTag(0)
+ DrawTag(1)
+ DrawTag(2)
+ SetMyCircles(true)
+ end
+ end
+
+ --WriteLnToConsole("Finished initial check")
+
+ if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then
+
+ --AddCaption(GetX(CurrentHedgehog) .. ";" .. GetY(CurrentHedgehog) )
+
+ -- Calculate and display turn time
+ if GameTime%1000 == 0 then
+ TimeLeft = TimeLeft - 1
+
+ if TimeLeft >= 0 then
+ --AddCaption(LOC_NOT("Time Left: ") .. TimeLeft)
+ DrawTag(0)
+ end
+
+ end
+
+ --WriteLnToConsole("Finished timeleft calculations")
+
+ -------------------------------
+ -- Player has run out of luck (out of time or hit by gtShell)
+ -------------------------------
+ -- checks in FloatyThings
+ if PlayerIsFine() == false then
+ TimeLeft = 0
+ end
+
+ --WriteLnToConsole("successfully checked playerIsFine")
+
+ if (TimeLeft == 0) then
+ if (stopMovement == false) then --time to stop the player
+ stopMovement = true
+ boosterOn = false
+ beam = false
+ upOn = false
+ down = false
+ leftOn = false
+ rightOn = false
+ SetMyCircles(false)
+ HideTags()
+ rAlpha = 255
+ --nw WriteLnToConsole("Player is out of luck")
+
+ if shieldMiser == true then
+
+ p = (roundKills*3.5) - ((roundKills*3.5)%1) + 2
+
+ AddCaption(loc("Shield Miser!") .." +" .. p .." ".. loc("points") .. "!",0xffba00ff,capgrpAmmoinfo)
+ AwardPoints(p)
+ end
+
+ if ((shotsHit / shotsFired * 100) >= 80) and (shotsFired > 4) then
+ AddCaption(loc("Accuracy Bonus!") .. " +15 " .. loc("points") .. "!",0xffba00ff,capgrpVolume)
+ AwardPoints(15)
+ end
+
+ end
+ else -- remove this if you want tumbler to fall slowly on death
+ -------------------------------
+ -- Player is still in luck
+ -------------------------------
+
+
+ --WriteLnToConsole("about to do chainCounter checks")
+ if chainCounter > 0 then
+ chainCounter = chainCounter -1
+ if chainCounter == 0 then
+ chainLength = 0
+ end
+ end
+
+ -- handle movement based on IO
+ if GameTime%100 == 0 then -- 100
+ --nw WriteLnToConsole("Start of Player MoveTimer")
+
+ ---------------
+ -- new trail code
+ ---------------
+ -- the trail lets you know you have 5s left to pilot, akin to birdy feathers
+ if (TimeLeft <= 5) and (TimeLeft > 0) then --vgtSmoke
+ tempE = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtSmoke, 0, true)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)
+ SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, GetClanColor(GetHogClan(CurrentHedgehog)) )
+ end
+ --------------
+ --------------
+
+ ------------------------
+ -- surfer achievement
+ ------------------------
+
+ if (WaterLine - GetY(CurrentHedgehog)) < 15 then
+ SurfTime = SurfTime -1
+ end
+
+ if SurfTime ~= 12 then
+
+ SurfTime = SurfTime - 1
+ if SurfTime <= 0 then
+ for i = 0,(TeamsCount-1) do
+ if teamClan[i] == GetHogClan(CurrentHedgehog) and (teamSurfer[i] == false) then
+ teamSurfer[i] = true
+ SurfTime = 12
+ AddCaption(loc("Surfer! +15 points!"),0xffba00ff,capgrpVolume)
+ AwardPoints(15)
+ end
+ end
+ end
+ end
+
+
+ dx, dy = GetGearVelocity(CurrentHedgehog)
+
+ --WriteLnToConsole("I just got the velocity of currenthedgehog. It is dx: " .. dx .. "; dy: " .. dy)
+ --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
+
+ 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
+ end
+ if dy > dylimit then
+ dy = dylimit
+ end
+ if dx < -dxlimit then
+ dx = -dxlimit
+ end
+ if dy < -dylimit then
+ dy = -dylimit
+ end
+
+
+ if leftOn == true then
+ dx = dx - 0.1*fMod
+ end
+ if rightOn == true then
+ dx = dx + 0.1*fMod
+ end
+
+ if upOn == true then
+ dy = dy - 0.1*fMod
+ end
+ if downOn == true then
+ dy = dy + 0.1*fMod
+ end
+
+ SetGearVelocity(CurrentHedgehog, dx, dy)
+
+ --WriteLnToConsole("I just SET the velocity of currenthedgehog. It is now dx: " .. dx .. "; dy: " .. dy)
+ --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
+ --nw WriteLnToConsole("End of Player MoveTimer")
+
+ end
+
+
+ HandleFlameThrower()
+
+
+ end -- new end I put here to check if he's still alive or not
+
+ end
+
+ --WriteLnToConsole("End of GameTick")
+
+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
+ if gear == CurrentHedgehog then
+ TimeLeft = 0
+ --WriteLnToConsole("Current hedgehog just drowned himself")
+ --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
+ end
+
+end
+
+function onGearAdd(gear)
+
+ if isATrackedGear(gear) then
+ trackGear(gear)
+ setNewGearValues(gear)
+ end
+
+ --if GetGearType(gear) == gtBall then
+ -- SetTimer(gear, 5000)
+ --end
+
+ if GetGearType(gear) == gtHedgehog then
+ SetEffect(gear, heResurrectable, true)
+
+ -----------
+ -- control
+ hhs[numhhs] = gear
+ numhhs = numhhs + 1
+ -----------
+ end
+
+end
+
+function onGearDelete(gear)
+
+
+ --[[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)
+
+ --if CurrentHedgehog ~= nil then
+ -- WriteLnToConsole("As it happens, player is at: " .. GetX(CurrentHedgehog) .. "; " .. GetY(CurrentHedgehog))
+ --end
+ elseif GetGearType(gear) == gtExplosives then
+ --nw WriteLnToConsole("on GearDelete call. Explosives ID: " .. getGearValue(gear,"ID"))
+ --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
+
+ --if CurrentHedgehog ~= nil then
+ -- WriteLnToConsole("As it happens, player is at: " .. GetX(CurrentHedgehog) .. "; " .. GetY(CurrentHedgehog))
+ --end
+ elseif GetGearType(gear) == gtFlame then
+ --WriteLnToConsole("on GearDelete flame")
+ end]]
+
+ if isATrackedGear(gear) then
+ trackDeletion(gear)
+ end
+
+ if CurrentHedgehog ~= nil then
+ FollowGear(CurrentHedgehog)
+ end
+
+end
+
+
+
+------------------------------------------------------------
+------------------------------------------------------------
+------------------------------------------------------------
+------------------------------------------------------------
+-- FLOATY THINGS
+-- "I'll make this into a generic library and code properly
+-- when I have more time and feel less lazy"
+------------------------------------------------------------
+------------------------------------------------------------
+------------------------------------------------------------
+------------------------------------------------------------
+
+function DoHorribleThings(cUID)
+
+ -- work out the distance to the target
+ g1X, g1Y = GetGearPosition(CurrentHedgehog)
+ g2X, g2Y = vCircX[cUID], vCircY[cUID]
+ q = g1X - g2X
+ w = g1Y - g2Y
+ r = math.sqrt( (q*q) + (w*w) ) --alternate
+
+ opp = w
+ if opp < 0 then
+ opp = opp*-1
+ end
+
+ -- work out the angle (theta) to the target
+ t = math.deg ( math.asin(opp / r) )
+
+ -- based on the radius of the radar, calculate what x/y displacement should be
+ NR = 150 -- radius at which to draw circs
+ NX = math.cos( math.rad(t) ) * NR
+ NY = math.sin( math.rad(t) ) * NR
+
+ -- displace xy based on where this thing actually is
+
+ if r < NR then
+ rCircX[cUID] = g2X
+ elseif q > 0 then
+ rCircX[cUID] = g1X - NX
+ else
+ rCircX[cUID] = g1X + NX
+ end
+
+ if r < NR then
+ rCircY[cUID] = g2Y
+ elseif w > 0 then
+ rCircY[cUID] = g1Y - NY
+ else
+ rCircY[cUID] = g1Y + NY
+ end
+
+end
+
+function PlayerIsFine()
+ 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)
+ g2X, g2Y = GetGearPosition(gear2)
+ q = g1X - g2X
+ w = g1Y - g2Y
+
+
+ --[[
+ WriteLnToConsole("I just got the position of two gears and calculated the distance betwen them")
+ if gear == CurrentHedgehog then
+ WriteLnToConsole("Gear 1 is CurrentHedgehog.")
+ end
+ if gear2 == CurrentHedgehog then
+ WriteLnToConsole("Gear 2 is CurrentHedgehog.")
+ end
+ WriteLnToConsole("G1X: " .. g1X .. "; G1Y: " .. g1Y)
+ WriteLnToConsole("G2X: " .. g2X .. "; G2Y: " .. g2Y)
+ WriteLnToConsole("Their distance is " .. (q*q) + (w*w) )
+ WriteLnToConsole("The above events occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
+]]
+
+
+ return ( (q*q) + (w*w) )
+
+end
+
+function GetDistFromGearToXY(gear, g2X, g2Y)
+
+ g1X, g1Y = GetGearPosition(gear)
+ q = g1X - g2X
+ w = g1Y - g2Y
+
+
+ --[[WriteLnToConsole("I just got the position of a gear and calculated the distance betwen it and another xy")
+ if gear == CurrentHedgehog then
+ WriteLnToConsole("Gear 1 is CurrentHedgehog.")
+ end
+
+ WriteLnToConsole("G1X: " .. g1X .. "; G1Y: " .. g1Y)
+ WriteLnToConsole("Other X: " .. g2X .. "; Other Y: " .. g2Y)
+ WriteLnToConsole("Their distance is " .. (q*q) + (w*w) )
+ WriteLnToConsole("The above events occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
+]]
+
+
+ return ( (q*q) + (w*w) )
+
+
+end
+
+function CreateMeSomeCircles()
+
+ for i = 0, 7 do
+ vCCount = vCCount +1
+ vCirc[i] = AddVisualGear(0,0,vgtCircle,0,true)
+
+ rCirc[i] = AddVisualGear(0,0,vgtCircle,0,true)
+ rCircX[i] = 0
+ rCircY[i] = 0
+
+ vCircDX[i] = 0
+ vCircDY[i] = 0
+
+ vType[i] = "generic"
+ vCounter[i] = 0
+ vCounterLim[i] = 150
+ vCircScore[i] = 0
+ vCircHealth[i] = 1
+
+ vCircMinA[i] = 80 --80 --20
+ vCircMaxA[i] = 255
+ vCircType[i] = 1 --1
+ vCircPulse[i] = 10
+ vCircFuckAll[i] = 0
+ vCircRadius[i] = 0
+ vCircWidth[i] = 3 --5
+
+ vCircRadMax[i] = 0
+ vCircRadMin[i] = 0
+ vCircRadDir[i] = -1
+ vCircRadCounter[i] = 0
+
+ vCircX[i], vCircY[i] = 0,0
+
+ vCircCol[i] = 0xff00ffff
+
+ SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], vCircCol[i])
+
+ SetVisualGearValues(rCirc[i], 0, 0, 100, 255, 1, 10, 0, 40, 3, vCircCol[i])
+
+ end
+
+ pShield = AddVisualGear(0,0,vgtCircle,0,true)
+ --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)
+
+ acceptibleDistance = 800
+
+ -- put this in here to thwart attempts at repositioning and test sanity limit
+ --vCircX[i] = GetX(CurrentHedgehog)+250
+ --vCircY[i] = GetY(CurrentHedgehog)+250
+
+ vCircX[i] = GetRandom(5000)
+ vCircY[i] = GetRandom(2000)
+ dist = GetDistFromGearToXY(CurrentHedgehog, vCircX[i], vCircY[i])
+ if dist > acceptibleDistance*acceptibleDistance then
+ return(true)
+ else
+ return(false)
+ end
+
+end
+
+function CircleDamaged(i)
+
+ res = ""
+ vCircHealth[i] = vCircHealth[i] -1
+
+ if vCircHealth[i] <= 0 then
+ -- circle is dead, do death effects/consequences
+
+ vCircActive[i] = false
+
+ if (vType[i] == "drone") then
+ PlaySound(sndHellishImpact4)
+ TimeLeft = TimeLeft + 4
+ AddCaption(loc("Time Extended!") .. "+" .. 4 .. loc("sec"), 0xff0000ff,capgrpMessage )
+ DrawTag(0)
+
+ morte = AddGear(vCircX[i], vCircY[i], gtExplosives, 0, 0, 0, 1)
+ SetHealth(morte, 0)
+
+ RK = RK + 1
+ if RK == 5 then
+ RK = 0
+ AddCaption(loc("Drone Hunter!") .. " +10 " .. loc("points") .. "!",0xffba00ff,capgrpMessage2)
+ AwardPoints(10)
+ end
+
+ elseif (vType[i] == "ammo") then
+ AddVisualGear(vCircX[i], vCircY[i], vgtExplosion, 0, false)
+ PlaySound(sndExplosion)
+ PlaySound(sndShotgunReload)
+ wepAmmo[0] = wepAmmo[0] +3
+ --primShotsLeft = primShotsLeft + 3
+ AddCaption("+" .. 3 .. " " .. loc("Ammo"), 0x00ff00ff,capgrpMessage)
+ DrawTag(1)
+
+ GK = GK + 1
+ if GK == 3 then
+ GK = 0
+ AddCaption(loc("Ammo Maniac!") .. " +5 " .. loc("points") .. "!",0xffba00ff,capgrpMessage2)
+ AwardPoints(5)
+ end
+
+ elseif (vType[i] == "bonus") then
+
+ AddVisualGear(vCircX[i], vCircY[i], vgtExplosion, 0, false)
+ PlaySound(sndExplosion)
+
+ AddVisualGear(vCircX[i], vCircY[i], vgtFire, 0, false)
+ AddVisualGear(vCircX[i], vCircY[i], vgtFire, 0, false)
+ AddVisualGear(vCircX[i], vCircY[i], vgtFire, 0, false)
+ AddVisualGear(vCircX[i], vCircY[i], vgtFire, 0, false)
+ AddVisualGear(vCircX[i], vCircY[i], vgtFire, 0, false)
+ AddVisualGear(vCircX[i], vCircY[i], vgtSmoke, 0, false)
+
+ PlaySound(sndVaporize)
+ --sndWarp sndMineTick --sndSwitchHog --sndSuddenDeath
+
+ shieldHealth = shieldHealth + 30
+ AddCaption(loc("Shield boosted! +30 power"), 0xa800ffff,capgrpMessage)
+ if shieldHealth >= 250 then
+ shieldHealth = 250
+ AddCaption(loc("Shield is fully recharged!"),0xa800ffff,capgrpMessage)
+ end
+ DrawTag(2)
+
+ OK = OK + 1
+ if OK == 3 then
+ OK = 0
+ AddCaption(loc("Shield Seeker!") .. " + 10 " .. loc("points") .. "!",0xffba00ff,capgrpMessage2)
+ AwardPoints(10)
+ end
+
+ elseif (vType[i] == "blueboss") then
+ PlaySound(sndHellishImpact3)
+ AddCaption(loc("Boss defeated!") .. " +30 " .. loc("points") .. "!", 0x0050ffff,capgrpMessage)
+
+ morte = AddGear(vCircX[i], vCircY[i], gtExplosives, 0, 0, 0, 1)
+ SetHealth(morte, 0)
+
+ BK = BK + 1
+ if BK == 2 then
+ BK = 0
+ AddCaption(loc("Boss Slayer!") .. " +25 " .. loc("points") .. "!",0xffba00ff,capgrpMessage2)
+ AwardPoints(25)
+ end
+
+ end
+
+ AwardPoints(vCircScore[i])
+ AwardKills()
+ SetUpCircle(i)
+ res = "fatal"
+
+ chainCounter = 3000
+ chainLength = chainLength + 1
+ if chainLength > 1 then
+ AddCaption( chainLength .. "-" .. loc("Hit Combo!") .. " +" .. chainLength*2 .. " " .. loc("points") .. "!",0xffba00ff,capgrpAmmostate)
+ AwardPoints(chainLength*2)
+ end
+
+ else
+ -- circle is merely damaged
+ -- do damage effects/sounds
+ AddVisualGear(vCircX[i], vCircY[i], vgtSteam, 0, false)
+ r = GetRandom(4)
+ if r == 0 then
+ PlaySound(sndHellishImpact1)
+ elseif r == 1 then
+ PlaySound(sndHellishImpact2)
+ elseif r == 2 then
+ PlaySound(sndHellishImpact3)
+ elseif r == 3 then
+ PlaySound(sndHellishImpact4)
+ end
+ res = "non-fatal"
+
+ end
+
+ return(res)
+
+end
+
+function SetUpCircle(i)
+
+
+ r = GetRandom(10)
+ --r = 8
+ -- 80% of spawning either red/green
+ if r <= 7 then
+
+ --r = GetRandom(5)
+ r = GetRandom(2)
+ --r = 1
+ if r == 0 then
+ --if r <= 2 then
+ vCircCol[i] = 0xff0000ff -- red
+ vType[i] = "drone"
+ vCircRadMin[i] = 50 *5
+ vCircRadMax[i] = 90 *5
+ vCounterLim[i] = 150
+ vCircScore[i] = 10
+ vCircHealth[i] = 1
+ --else
+ elseif r == 1 then
+ vCircCol[i] = 0x00ff00ff -- green
+ vType[i] = "ammo"
+ vCircRadMin[i] = 25 *7
+ vCircRadMax[i] = 30 *7
+ vCircScore[i] = 3
+ vCircHealth[i] = 1
+ end
+
+ -- 20% chance of spawning boss or bonus
+ else
+ r = GetRandom(5)
+ --r = GetRandom(2)
+ --r = 0
+ if r <= 1 then
+ --if r == 0 then
+ vCircCol[i] = 0x0050ffff -- sexy blue
+ vType[i] = "blueboss"
+ vCircRadMin[i] = 100*5
+ vCircRadMax[i] = 180*5
+ vCircWidth[i] = 1
+ vCounterLim[i] = 100
+ vCircScore[i] = 30
+ vCircHealth[i] = 3
+ else
+ --elseif r == 1 then
+ --vCircCol[i] = 0xffae00ff -- orange
+ vCircCol[i] = 0xa800ffff -- purp
+ vType[i] = "bonus"
+ vCircRadMin[i] = 20 *7
+ vCircRadMax[i] = 40 *7
+ vCircScore[i] = 5
+ vCircHealth[i] = 1
+ end
+
+ end
+
+ -- regenerate circle xy if too close to player or until sanity limit kicks in
+ reN = 0
+ --zzz = 0
+ while (reN < 10) do
+ if IGotMeASafeXYValue(i) == false then
+ reN = reN + 1
+ --zzz = zzz + 1
+ else
+ reN = 15
+ end
+ end
+ --AddCaption("Took me this many retries: " .. zzz) -- number of times it took to work
+
+ vCircRadius[i] = vCircRadMax[i] - GetRandom(vCircRadMin[i])
+
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i])
+ SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], g3, g4, g5, g6, g7, vCircRadius[i], vCircWidth[i], vCircCol[i]-0x000000ff)
+ -- - -0x000000ff
+
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(rCirc[i])
+ SetVisualGearValues(rCirc[i], 0, 0, g3, g4, g5, g6, g7, g8, g9, vCircCol[i]-0x000000ff)
+
+
+ vCircActive[i] = true -- new
+
+ --nw WriteLnToConsole("CIRC " .. i .. ": X: " .. vCircX[i] .. "; Y: " .. vCircY[i])
+ --nw WriteLnToConsole("CIRC " .. i .. ": dX: " .. vCircDX[i] .. "; dY: " .. vCircDY[i])
+ --nw WriteLnToConsole("CIRC " .. i .. ": RAD:" .. vCircRadius[i])
+
+end
+
+function SetMyCircles(s)
+
+ CirclesAreGo = s
+ playerIsFine = s
+
+ if s == true then
+ --nw WriteLnToConsole("About to set up all circles, old values are here:")
+ for i = 0,(vCCount-1) do
+ --nw WriteLnToConsole("CIRC " .. i .. ": X: " .. vCircX[i] .. "; Y: " .. vCircY[i])
+ --nw WriteLnToConsole("CIRC " .. i .. ": dX: " .. vCircDX[i] .. "; dY: " .. vCircDY[i])
+ --nw WriteLnToConsole("CIRC " .. i .. ": RAD:" .. vCircRadius[i])
+ end
+ --nw WriteLnToConsole("Old values given, new values to follow...")
+ end
+
+ for i = 0,(vCCount-1) do
+
+ if s == false then
+ --vCircCol[i] = 0xffffffff
+ vCircActive[i] = false
+ elseif s == true then
+ SetUpCircle(i)
+ end
+
+ end
+
+end
+
+function WellHeAintGonnaJumpNoMore(x,y)
+
+ AddVisualGear(x, y, vgtBigExplosion, 0, false)
+ playerIsFine = false
+ AddCaption(loc("GOTCHA!"))
+ PlaySound(sndExplosion)
+ PlaySound(sndHellish)
+
+ targetHit = true
+
+end
+
+--- collision detection for weapons fire
+function CheckVarious(gear)
+
+ --if (GetGearType(gear) == gtExplosives) then
+ --nw WriteLnToConsole("Start of CheckVarious(): Exp ID: " .. getGearValue(gear,"ID"))
+ --elseif (GetGearType(gear) == gtShell) then
+ --nw WriteLnToConsole("Start of CheckVarious(): Shell ID: " .. getGearValue(gear,"ID"))
+ --end
+
+ targetHit = false
+
+ -- if circle is hit by player fire
+ if (GetGearType(gear) == gtExplosives) then
+ circsHit = 0
+
+ for i = 0,(vCCount-1) do
+
+ --nw WriteLnToConsole("Is it neccessary to check for collision with circ " .. i)
+
+ --if (vCircActive[i] == true) and ( (vType[i] == "drone") ) then
+
+ --nw WriteLnToConsole("YES. about to calc distance between gtExplosives and circ " .. i)
+
+ dist = GetDistFromGearToXY(gear, vCircX[i], vCircY[i])
+
+ -- calculate my real radius if I am an aura
+ if vCircType[i] == 0 then
+ NR = vCircRadius[i]
+ else
+ NR = (48/100*vCircRadius[i])/2
+ end
+
+ if dist <= NR*NR then
+
+
+ --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
+ --DeleteGear(gear)
+ --SetHealth(gear,0)
+ --WriteLnToConsole("set " .. "Exp ID: " .. getGearValue(gear,"ID") .. " health to 0")
+ --WriteLnToConsole("targetHit set to true, explosive is at distance " .. dist .. "(within range " .. NR*NR.. ") of circ" )
+
+ CircleDamaged(i)
+
+ circsHit = circsHit + 1
+ if circsHit > 1 then
+ AddCaption(loc("Multi-shot!") .. " +15 " .. loc("points") .. "!",0xffba00ff,capgrpAmmostate)
+ AwardPoints(15)
+ circsHit = 0
+ end
+
+ shotsHit = shotsHit + 1
+
+
+
+ end
+
+ --end
+
+ end
+
+ -- if player is hit by circle bazooka
+ elseif (GetGearType(gear) == gtShell) and (CurrentHedgehog ~= nil) then --or (GetGearType(gear) == gtBall) then
+
+ dist = GetDistFromGearToGear(gear, CurrentHedgehog)
+
+ if beam == true then
+
+ if dist < 3000 then
+ tempE = AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, true)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)
+ SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, 0xff00ffff )
+ PlaySound(sndVaporize)
+ DeleteGear(gear)
+
+ SK = SK + 1
+ if SK == 5 then
+ SK = 0
+ AddCaption(loc("Shield Master!") .. " +10 " .. loc("points") .. "!",0xffba00ff,capgrpAmmoinfo)
+ AwardPoints(10)
+ end
+ end
+
+ elseif dist < 1600 then
+ WellHeAintGonnaJumpNoMore(GetX(gear), GetY(gear))
+ end
+
+ --[[if targetHit == true then
+ WriteLnToConsole("about to delete shell due to targetHit being set to true earlier")
+ DeleteGear(gear)
+ WriteLnToConsole("there, I deleted it")
+ end]]
+
+
+ end
+
+ if targetHit == true then
+ --nw WriteLnToConsole("about to delete something due to targetHit being set to true earlier")
+ DeleteGear(gear)
+ --nw WriteLnToConsole("there, I deleted it")
+ end
+
+ --nw WriteLnToConsole("End of CheckVarious()")
+
+end
+
+-- collision detection for player entering a circle
+function CheckDistances()
+
+ --nw WriteLnToConsole("Start of CheckDistances()")
+
+ for i = 0,(vCCount-1) do
+
+
+ --nw WriteLnToConsole("Attempting to calculate dist of circ " .. i)
+
+ g1X, g1Y = GetGearPosition(CurrentHedgehog)
+ g2X, g2Y = vCircX[i], vCircY[i]
+
+ g1X = g1X - g2X
+ g1Y = g1Y - g2Y
+ dist = (g1X*g1X) + (g1Y*g1Y)
+
+ --DoHorribleThings(i, g1X, g1Y, g2X, g2Y, dist)
+
+ --nw WriteLnToConsole("Calcs done. Dist to CurrentHedgehog is " .. dist)
+
+ -- calculate my real radius if I am an aura
+ if vCircType[i] == 0 then
+ NR = vCircRadius[i]
+ else
+ NR = (48/100*vCircRadius[i])/2
+ end
+
+ if dist <= NR*NR then
+
+ if (vCircActive[i] == true) and
+ ((vType[i] == "ammo") or (vType[i] == "bonus") )
+ then
+
+ CircleDamaged(i)
+
+ elseif (vCircActive[i] == true) and
+ ( (vType[i] == "drone") or (vType[i] == "blueboss") )
+ then
+
+ ss = CircleDamaged(i)
+ WellHeAintGonnaJumpNoMore(GetX(CurrentHedgehog),GetY(CurrentHedgehog))
+
+ if ss == "fatal" 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 (wepAmmo[0] == 0) then
+ AddCaption(loc("Depleted Kamikaze!") .. " +5 " .. loc("points") .. "!",0xffba00ff,capgrpMessage)
+ AwardPoints(5)
+ elseif TimeLeft <= 9 then
+ AddCaption(loc("Timed Kamikaze!") .. " +10 " .. loc("points") .. "!",0xffba00ff,capgrpMessage)
+ AwardPoints(10)
+ end
+ end
+
+ end
+
+
+ end
+
+ end
+
+ --nw WriteLnToConsole("End of CheckDistances()")
+
+end
+
+function HandleCircles()
+
+ --[[if CirclesAreGo == true then
+
+ --CheckDistances()
+ --runOnGears(CheckVarious) -- used to be in handletracking for some bizarre reason
+
+ --pTimer = pTimer + 1
+ --if pTimer == 100 then
+ -- pTimer = 0
+ -- runOnGears(ProjectileTrack)
+ --end
+
+ end]]
+
+
+ if rAlpha ~= 255 then
+
+ if GameTime%100 == 0 then
+
+ rAlpha = rAlpha + 5
+ if rAlpha >= 255 then
+ rAlpha = 255
+ end
+ end
+
+ end
+
+ for i = 0,(vCCount-1) do
+
+ --if (vCircActive[i] == true) then
+ 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
+
+ vCounter[i] = 0
+
+ if ((vType[i] == "drone") or (vType[i] == "blueboss") ) and
+ (vCircActive[i] == true) then
+ AddGear(vCircX[i], vCircY[i], gtShell, 0, 0, 0, 1)
+
+ --WriteLnToConsole("Circle " .. i .. " just fired/added a gtShell")
+ --WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
+
+ --elseif (vType[i] == "bluebottle") and (vCircActive[i] == true) then
+ -- AddGear(vCircX[i], vCircY[i]-vCircRadius[i], gtBall, 0, 0, 0, 1)
+ -- AddGear(vCircX[i], vCircY[i]+vCircRadius[i], gtBall, 0, 0, 0, 1)
+ -- AddGear(vCircX[i]-vCircRadius[i], vCircY[i], gtBall, 0, 0, 0, 1)
+ -- AddGear(vCircX[i]+vCircRadius[i], vCircY[i], gtBall, 0, 0, 0, 1)
+ end
+
+ end
+
+ if (vCircActive[i] == true) then
+
+ vCircRadCounter[i] = vCircRadCounter[i] + 1
+ if vCircRadCounter[i] == 100 then
+
+ vCircRadCounter[i] = 0
+
+ -- make my radius increase/decrease faster if I am an aura
+ if vCircType[i] == 0 then
+ M = 1
+ else
+ M = 10
+ end
+
+ vCircRadius[i] = vCircRadius[i] + vCircRadDir[i]
+ if vCircRadius[i] > vCircRadMax[i] then
+ vCircRadDir[i] = -M
+ elseif vCircRadius[i] < vCircRadMin[i] then
+ vCircRadDir[i] = M
+ end
+
+
+ -- random effect test
+ -- maybe use this to tell the difference between circs
+ -- you can kill by shooting or not
+ --vgtSmoke vgtSmokeWhite
+ --vgtSteam -- nice long trail
+ --vgtDust -- short trail on earthrise
+ --vgtSmokeTrace
+ if vType[i] == "ammo" then
+
+ tempE = AddVisualGear(vCircX[i], vCircY[i], vgtSmoke, 0, true)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) --0xff00ffff --0x00ff00ff
+ SetVisualGearValues(tempE, vCircX[i], vCircY[i], g3, g4, g5, g6, g7, g8, g9, vCircCol[i] )
+
+ --AddVisualGear(vCircX[i], vCircY[i], vgtDust, 0, true)
+
+ elseif vType[i] == "bonus" then
+
+ tempE = AddVisualGear(vCircX[i], vCircY[i], vgtDust, 0, true)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) --0xff00ffff --0x00ff00ff --vCircCol[i]
+ SetVisualGearValues(tempE, vCircX[i], vCircY[i], g3, g4, g5, g6, g7, 1, g9, 0xff00ffff )
+
+
+ elseif vType[i] == "blueboss" then
+
+ k = 25
+ g = vgtSteam
+ trailColour = 0xae00ffff
+
+ -- 0xffae00ff -- orange
+ -- 0xae00ffff -- purp
+
+ tempE = AddVisualGear(vCircX[i], vCircY[i], g, 0, true)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) --0xff00ffff --0x00ff00ff
+ SetVisualGearValues(tempE, vCircX[i], vCircY[i]+k, g3, g4, g5, g6, g7, g8, g9, trailColour-75 )
+
+ tempE = AddVisualGear(vCircX[i], vCircY[i], g, 0, true)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) --0xff00ffff --0x00ff00ff
+ SetVisualGearValues(tempE, vCircX[i]+k, vCircY[i]-k, g3, g4, g5, g6, g7, g8, g9, trailColour-75 )
+
+ tempE = AddVisualGear(vCircX[i], vCircY[i], g, 0, true)
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE) --0xff00ffff --0x00ff00ff
+ SetVisualGearValues(tempE, vCircX[i]-k, vCircY[i]-k, g3, g4, g5, g6, g7, g8, g9, trailColour-75 )
+
+
+ end
+
+
+ end
+
+ end
+
+
+ end
+
+ -- alter the circles velocities
+ if GameTime%2000 == 0 then
+
+ for i = 0,(vCCount-1) do
+
+ -- bounce the circles off the edges if they go too far
+ -- or make them move in random directions
+
+ if vCircX[i] > 5500 then
+ vCircDX[i] = -4 --5 circmovchange
+ elseif vCircX[i] < -1500 then
+ vCircDX[i] = 4 --5 circmovchange
+ else
+
+ z = GetRandom(2)
+ if z == 1 then
+ z = 1
+ else
+ z = -1
+ end
+ vCircDX[i] = vCircDX[i] + GetRandom(3)*z --3 circmovchange
+ end
+
+ if vCircY[i] > 1500 then
+ vCircDY[i] = -4 --5 circmovchange
+ elseif vCircY[i] < -2900 then
+ vCircDY[i] = 4 --5 circmovchange
+ else
+ z = GetRandom(2)
+ if z == 1 then
+ z = 1
+ else
+ z = -1
+ end
+ vCircDY[i] = vCircDY[i] + GetRandom(3)*z --3 circmovchange
+ end
+
+ end
+
+ end
+
+ -- move the circles according to their current velocities
+ --m2Count = m2Count + 1
+ --if m2Count == 25 then --25 circmovchange
+
+ -- m2Count = 0
+ for i = 0,(vCCount-1) do
+ vCircX[i] = vCircX[i] + vCircDX[i]
+ vCircY[i] = vCircY[i] + vCircDY[i]
+
+ if (CurrentHedgehog ~= nil) and (rAlpha ~= 255) then
+ DoHorribleThings(i)--(i, g1X, g1Y, g2X, g2Y, dist)
+ end
+
+ end
+
+ if (TimeLeft == 0) and (tumbleStarted == true) then
+
+ FadeAlpha = FadeAlpha + 1
+ if FadeAlpha >= 255 then
+ FadeAlpha = 255
+ end
+
+ --new
+ --if FadeAlpha == 1 then
+ -- AddCaption("GOT IT")
+ -- for i = 0,(vCCount-1) do
+ -- g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i])
+ -- vCircCol[i] = g10
+ -- end
+ --end
+
+ 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
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i]) -- vCircCol[i] g10
+ SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], g3, g4, g5, g6, g7, vCircRadius[i], g9, g10)
+ end
+
+ if (TimeLeft == 0) or
+ ((tumbleStarted == false)) then
+ for i = 0,(vCCount-1) do
+ g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i]) -- vCircCol[i] g10
+ SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], g3, g4, g5, g6, g7, vCircRadius[i], g9, (vCircCol[i]-FadeAlpha))
+ end
+ end
+
+
+ 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)
+
+ if (GetGearType(gear) == gtShell) then
+
+ --nw WriteLnToConsole("ProjectileTrack() for Shell ID: " .. getGearValue(gear,"ID"))
+
+ -- newnew
+ if (GetGearType(gear) == gtShell) then
+ turningSpeed = 0.1*fMod
+ --elseif (GetGearType(gear) == gtBall) then
+ -- turningSpeed = 0.2*fMod
+ end
+
+ dx, dy = GetGearVelocity(gear)
+
+ --WriteLnToConsole("I'm trying to track currenthedge with shell ID: " .. getGearValue(gear,"ID"))
+ --WriteLnToConsole("I just got the velocity of the shell. It is dx: " .. dx .. "; dy: " .. dy)
+ --WriteLnToConsole("CurrentHedgehog is at X: " .. GetX(CurrentHedgehog) .. "; Y: " .. GetY(CurrentHedgehog) )
+
+ if CurrentHedgehog ~= nil then
+ if GetX(gear) > GetX(CurrentHedgehog) then
+ dx = dx - turningSpeed--0.1
+ else
+ dx = dx + turningSpeed--0.1
+ end
+
+ if GetY(gear) > GetY(CurrentHedgehog) then
+ dy = dy - turningSpeed--0.1
+ else
+ dy = dy + turningSpeed--0.1
+ end
+ end
+
+
+ if (GetGearType(gear) == gtShell) then
+ dxlimit = 0.4*fMod
+ dylimit = 0.4*fMod
+ --elseif (GetGearType(gear) == gtBall) then
+ -- dxlimit = 0.5 -- 0.5 is about the same
+ -- dylimit = 0.5 -- 0.6 is faster than player
+ end
+
+ if dx > dxlimit then
+ dx = dxlimit
+ end
+ if dy > dylimit then
+ dy = dylimit
+ end
+ if dx < -dxlimit then
+ dx = -dxlimit
+ end
+ if dy < -dylimit then
+ dy = -dylimit
+ end
+
+ SetGearVelocity(gear, dx, dy)
+
+ --WriteLnToConsole("I just SET the velocity of shell towards currenthegdge. It is now dx: " .. dx .. "; dy: " .. dy)
+ --WriteLnToConsole("The above events occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
+ --nw WriteLnToConsole("ProjectileTrack() finished successfully")
+
+ end
+
+end
+