project_files/Android-build/SDL-android-project/assets/Data/Scripts/Multiplayer/Space_Invasion.lua
changeset 7568 75ba91f14ed5
equal deleted inserted replaced
7566:57d343ee382f 7568:75ba91f14ed5
       
     1 
       
     2 loadfile(GetDataPath() .. "Scripts/Locale.lua")()
       
     3 loadfile(GetDataPath() .. "Scripts/Tracker.lua")()
       
     4 
       
     5 ---------------------------------------------------
       
     6 ---------------------------------------------------
       
     7 ---------------------------------------------------
       
     8 --- Space Invasion Code Follows (1.1)
       
     9 ---------------------------------------------------
       
    10 ---------------------------------------------------
       
    11 -- VERSION HISTORY
       
    12 ----------------
       
    13 -- version 0.1
       
    14 ----------------
       
    15 -- conversion of tumbler into space invasion
       
    16 -- a million and one changes
       
    17 -- bells and whistles
       
    18 
       
    19 ----------------
       
    20 -- version 0.2
       
    21 ----------------
       
    22 -- code slowly getting cleaner, it still looks like a spaghetti monster tho
       
    23 -- lots of console tracking :/
       
    24 -- all visual gears are now compulsary (will probably revert this)
       
    25 -- implemented fMod to try combat desyncs and bring this in line with dev
       
    26 
       
    27 ----------------
       
    28 -- version 0.3
       
    29 ----------------
       
    30 -- values of scoring changed to 3:10, and now based on vCircScore
       
    31 -- time gained from killing a red circ increased from 3 to 4
       
    32 -- circles now spawn at a distance of at least 800 or until sanity limit
       
    33 -- roundsLimit now based off MinesTime (kinda, its an experiment)
       
    34 
       
    35 -----------------
       
    36 --0.4
       
    37 -----------------
       
    38 -- commented out a lot of WriteLnToConsoles (dont need them at this point)
       
    39 -- added some different WriteLnToConsoles
       
    40 -- changed some of the collision detect for explosives in checkvarious()
       
    41 
       
    42 -----------------
       
    43 --0.5
       
    44 -----------------
       
    45 -- added implementation for a projectile shield
       
    46 -- added a "bonus" orange invader that partially recharges player shield
       
    47 -- added a tough "blueboss" blue invader
       
    48 -- expanded user feedback
       
    49 -- circles now have health and are capable of being merely "damaged"
       
    50 -- redid a lot of the collision code and added CircleDamaged
       
    51 -- added more sounds to events
       
    52 -- added more visual gears
       
    53 
       
    54 -----------------
       
    55 --0.6
       
    56 -----------------
       
    57 -- removed a few WriteLns
       
    58 -- added randomized grunts on circ damage
       
    59 -- added (mostly) graceful fading out of circles :D:
       
    60 -- changed odds for circles
       
    61 -- changed user feedback
       
    62 -- fixed the location of the explosion where player bashes into circ
       
    63 
       
    64 -----------------
       
    65 --0.7
       
    66 -----------------
       
    67 -- added PlaySound(sndSuddenDeath) when ammo gets depleted
       
    68 -- added an extra "Ammo Depleted" note if user presses fire while empty
       
    69 -- specified how much shield power is gained on shield powerup collection
       
    70 -- changed odds for circles AGAIN, ammo is now sliiightly more common
       
    71 -- switched most of the explosions/smoke effects back to non-critical vgears (with a few exceptions)
       
    72 -- tumbletime is now based off turntime and is variable
       
    73 -- delete explosives in DeleteFarFlungBarrel rather than explode them on map boundaries to save on performance
       
    74 -- utilized the improved AddCaption to tint / prevent overrides
       
    75 -- temporarily disabled bugged sort that displays teams according to their score
       
    76 -- reluctantly changed the colour of the bonus circ to purple
       
    77 -- standarized point notation
       
    78 -- added some missing locs
       
    79 -- commented out remaining WriteLnToConsoles for the meanwhile with the prefix "nw"
       
    80 
       
    81 -- ACHIEIVEMENTS added
       
    82 -- (during one turn) aka repeatable
       
    83 -- Ammo Manic (Destroy 3 green circles for + 5 points)
       
    84 -- Drone Hunter (Destroy 5 red circles for + 10 points)
       
    85 -- Shield Seeker (Destroy 3 purple circles for +10 points)
       
    86 -- Boss Slayer (Destroy 2 blue circles for +25 points)
       
    87 
       
    88 -- Shield Master (disolve 5 shells for +10 points)
       
    89 -- Shield Miser (don't use your shield at all (3.5*roundkills)+2 points)
       
    90 
       
    91 -- Depleted Kamikaze! (kamikaze into a blue/red circ when you are out of ammo) 5pts
       
    92 -- Timed Kamikaze! (kamikaze into a blue/red circ when you only have 5s left) 10pts
       
    93 -- Kamikaze Expert (combination of the above two) 15pts
       
    94 
       
    95 -- Multi-shot (destroy more than 1 invader with a single bullet) 15pts
       
    96 -- X-Hit Combo (destroy another invader in less than 3 seconds) chainLength*2 points
       
    97 
       
    98 -- Accuracy Bonus (80% accuracy at the end of your turn with more than 5 shots fired) 15pts
       
    99 
       
   100 --(during the length of the game) aka non-repeatable
       
   101 -- 10/25/50 kills (+25/+50/+100 points)
       
   102 
       
   103 -----------------
       
   104 --0.8
       
   105 -----------------
       
   106 -- added a HUD for turntimeleft, ammo, shield
       
   107 -- shieldhealth hits 0 properly
       
   108 
       
   109 ------------------------
       
   110 -- version 0.8.1
       
   111 ------------------------
       
   112 
       
   113 -- stop hiding non-existant 4th Tag
       
   114 -- redraw HUD on screen resolution change
       
   115 
       
   116 ------------------------
       
   117 -- version 0.9
       
   118 ------------------------
       
   119 -- time for more 'EXPERIMENTS' mwahahahahahaha D:
       
   120 -- (hopefully) balanced Shield Miser
       
   121 -- bosses are no longer a redunkulous 50 points, but toned down to 30
       
   122 -- experimental radar (it's INTERACTIVE and math-heavy :D) (visual gears are safe... right? D:)
       
   123 -- bugfix and balance for multishot
       
   124 
       
   125 ------------------------
       
   126 -- version 1.0
       
   127 ------------------------
       
   128 -- if only version numbers actually worked like this, wouldn't that be awful :D
       
   129 -- added surfer achievement
       
   130 -- increased value of shield miser by 1 point per kill (OP?)
       
   131 
       
   132 ------------------------
       
   133 -- version 1.1
       
   134 ------------------------
       
   135 -- fixed radar so that blips dont go past circs when you get very close
       
   136 -- added a missing loc for shield depletion
       
   137 -- increased delay to 1000 to try stop noobies missing their turn
       
   138 -- added sniper achievement for hits from over a 1000000 away
       
   139 -- added achievement for 3 "sniper" shots in a round
       
   140 -- added achievement for 3 "point blank" shots in a round
       
   141 -- added "fierce Competition" achievement for shooting an enemy hog (once per round)
       
   142 -- some support for more weapons later
       
   143 
       
   144 --------------------------
       
   145 --notes for later
       
   146 --------------------------
       
   147 -- maybe add a check for a tie, IMPOSSIBRU THERE ARE NO TIES
       
   148 -- more achievements? (3 kamikazes in a row, supreme shield expert/miser etc?)
       
   149 
       
   150 -- if more weps are added, replace primshotsfired all over the place
       
   151 
       
   152 -- look for derp and let invaders shoot again
       
   153 
       
   154 -- more weps? flamer/machineballgun,
       
   155 -- some kind of bomb that just drops straight down
       
   156 -- "fire and forget" missile
       
   157 -- shockwave
       
   158 
       
   159 -- some kind of ability-meter that lets you do something awesome when you are
       
   160 -- doing really well in a given round.
       
   161 -- probably new kind of shield that pops any invaders who come near
       
   162 
       
   163 -- fix game never ending bug
       
   164 -- fix radar
       
   165 -- new invader: golden snitch, doesn't show up on your radar
       
   166 
       
   167 -- maybe replace (48/100*vCircRadius[i])/2 with something better
       
   168 
       
   169 
       
   170 --[[CAPTION CATEGORIES
       
   171 -----------------
       
   172 capgrpGameState
       
   173 -----------------
       
   174 AddCaption(LOC_NOT("Sniper!") .. " +10 " .. LOC_NOT("points") .. "!",0xffba00ff,capgrpAmmostate)
       
   175 --they call me bullsye
       
   176 --point blank combo
       
   177 --fierce Competition
       
   178 -----------------
       
   179 capgrpAmmostate
       
   180 -----------------
       
   181 AddCaption( chainLength .. LOC_NOT("-chain! +") .. chainLength*2 .. LOC_NOT(" points!"),0xffba00ff,capgrpAmmostate)
       
   182 AddCaption(LOC_NOT("Multi-shot! +15 points!"),0xffba00ff,capgrpAmmostate)
       
   183 
       
   184 -----------------
       
   185 capgrpAmmoinfo
       
   186 -----------------
       
   187 AddCaption(LOC_NOT("Shield Miser! +20 points!"),0xffba00ff,capgrpAmmoinfo)
       
   188 AddCaption(LOC_NOT("Shield Master! +10 points!"),0xffba00ff,capgrpAmmoinfo)
       
   189 
       
   190 -----------------
       
   191 capgrpVolume
       
   192 -----------------
       
   193 AddCaption(LOC_NOT("Boom! +25 points!"),0xffba00ff,capgrpVolume)
       
   194 AddCaption(LOC_NOT("BOOM! +50 points!"),0xffba00ff,capgrpVolume)
       
   195 AddCaption(LOC_NOT("BOOM! BOOM! BOOM! +100 points!"),0xffba00ff,capgrpVolume)
       
   196 AddCaption(LOC_NOT("Accuracy Bonus! +15 points!"),0xffba00ff,capgrpVolume)
       
   197 AddCaption(LOC_NOT("Surfer! +15 points!"),0xffba00ff,capgrpVolume)
       
   198 
       
   199 -----------------
       
   200 capgrpMessage
       
   201 -----------------
       
   202 AddCaption(LOC_NOT("Ammo Depleted!"),0xff0000ff,capgrpMessage)
       
   203 AddCaption(LOC_NOT("Ammo: ") .. primShotsLeft)
       
   204 AddCaption(LOC_NOT("Shield Depleted"),0xff0000ff,capgrpMessage)
       
   205 AddCaption( LOC_NOT("Shield ON:") .. " " .. shieldHealth - 80 .. " " .. LOC_NOT("Power Remaining") )
       
   206 AddCaption(LOC_NOT("Shield OFF:") .. " " .. shieldHealth - 80 .. " " .. LOC_NOT("Power Remaining") )
       
   207 
       
   208 AddCaption(LOC_NOT("Time Extended!") .. "+" .. 4 .. LOC_NOT("s"), 0xff0000ff,capgrpMessage )
       
   209 AddCaption("+" .. 3 .. " " .. LOC_NOT("Ammo"), 0x00ff00ff,capgrpMessage)
       
   210 AddCaption(LOC_NOT("Shield boosted! +30 power"), 0xff00ffff,capgrpMessage)
       
   211 AddCaption(LOC_NOT("Shield is fully recharged!"), 0xffae00ff,capgrpMessage)
       
   212 AddCaption(LOC_NOT("Boss defeated! +50 points!"), 0x0050ffff,capgrpMessage)
       
   213 
       
   214 AddCaption(LOC_NOT("GOTCHA!"))
       
   215 AddCaption(LOC_NOT("Kamikaze Expert! +15 points!"),0xffba00ff,capgrpMessage)
       
   216 AddCaption(LOC_NOT("Depleted Kamikaze! +5 points!"),0xffba00ff,capgrpMessage)
       
   217 AddCaption(LOC_NOT("Timed Kamikaze! +10 points!"),0xffba00ff,capgrpMessage)
       
   218 
       
   219 -----------------
       
   220 capgrpMessage2
       
   221 -----------------
       
   222 AddCaption(LOC_NOT("Drone Hunter! +10 points!"),0xffba00ff,capgrpMessage2)
       
   223 AddCaption(LOC_NOT("Ammo Maniac! +5 points!"),0xffba00ff,capgrpMessage2)
       
   224 AddCaption(LOC_NOT("Shield Seeker! +10 points!"),0xffba00ff,capgrpMessage2)
       
   225 AddCaption(LOC_NOT("Boss Slayer! +25 points!"),0xffba00ff,capgrpMessage2)
       
   226 ]]
       
   227 
       
   228 ----------------------------------
       
   229 -- so I herd u liek wariables
       
   230 ----------------------------------
       
   231 
       
   232 --local fMod = 1	-- for use in .15 single player only, otherwise desync
       
   233 local fMod = 1000000 -- use this for dev and .16+ games
       
   234 
       
   235 -- some console stuff
       
   236 local shellID = 0
       
   237 local explosivesID = 0
       
   238 
       
   239 -- gaudyRacer
       
   240 local boosterOn = false
       
   241 local roundLimit = 3	-- no longer set here (see version history)
       
   242 local roundNumber = 0
       
   243 local firstClan = 10
       
   244 local gameOver = false
       
   245 local gameBegun = false
       
   246 
       
   247 local bestClan = 10
       
   248 local bestScore = 0
       
   249 local sdScore = {}
       
   250 local sdName = {}
       
   251 local sdKills = {}
       
   252 
       
   253 local roundN = 0
       
   254 local lastRound
       
   255 local RoundHasChanged = true
       
   256 
       
   257 --------------------------
       
   258 -- hog and team tracking variales
       
   259 --------------------------
       
   260 
       
   261 local numhhs = 0
       
   262 local hhs = {}
       
   263 
       
   264 local numTeams
       
   265 local teamNameArr = {}
       
   266 local teamClan = {}
       
   267 local teamSize = {}
       
   268 local teamIndex = {}
       
   269 
       
   270 local teamComment = {}
       
   271 local teamScore = {}
       
   272 local teamCircsKilled = {}
       
   273 local teamSurfer = {}
       
   274 
       
   275 -- stats variables
       
   276 --local teamRed = {}
       
   277 --local teamBlue = {}
       
   278 --local teamOrange = {}
       
   279 --local teamGreen = {}
       
   280 local roundKills = 0
       
   281 local RK = 0
       
   282 local GK = 0
       
   283 local BK = 0
       
   284 local OK = 0
       
   285 local SK = 0
       
   286 local shieldMiser = true
       
   287 local fierceComp = false
       
   288 local chainCounter = 0
       
   289 local chainLength = 0
       
   290 local shotsFired = 0
       
   291 local shotsHit = 0
       
   292 local SurfTime = 0
       
   293 local sniperHits = 0
       
   294 local pointBlankHits = 0
       
   295 ---------------------
       
   296 -- tumbler goods
       
   297 ---------------------
       
   298 
       
   299 local leftOn = false
       
   300 local rightOn = false
       
   301 local upOn = false
       
   302 local downOn = false
       
   303 
       
   304 ----------------
       
   305 -- TUMBLER
       
   306 local wep = {}
       
   307 local wepAmmo = {}
       
   308 local wepCol = {}
       
   309 local wepIndex = 0
       
   310 local wepCount = 0
       
   311 local fireTimer = 0
       
   312 ----------------
       
   313 
       
   314 
       
   315 
       
   316 local primShotsMax = 5
       
   317 local primShotsLeft = 0
       
   318 
       
   319 local TimeLeft = 0
       
   320 local stopMovement = false
       
   321 local tumbleStarted = false
       
   322 
       
   323 local beam = false
       
   324 local pShield
       
   325 local shieldHealth
       
   326 
       
   327 local shockwave
       
   328 local shockwaveHealth = 0
       
   329 local shockwaveRad = 300
       
   330 
       
   331 local vTag = {}
       
   332 
       
   333 -----------------------------------------------
       
   334 -- CIRCLY GOODIES
       
   335 -----------------------------------------------
       
   336 
       
   337 local CirclesAreGo = false
       
   338 local playerIsFine = true
       
   339 local targetHit = false
       
   340 
       
   341 local FadeAlpha = 0 -- used to fade the circles out gracefully when player dies
       
   342 local pTimer = 0 -- tracking projectiles following player
       
   343 
       
   344 --local m2Count = 0		-- handle speed of circs
       
   345 
       
   346 local vCirc = {}
       
   347 local vCCount = 0
       
   348 
       
   349 local rCirc = {}
       
   350 local rCircX = {}
       
   351 local rCircY = {}
       
   352 local rAlpha = 255
       
   353 local radShotsLeft = 0
       
   354 
       
   355 local vCircActive = {}
       
   356 local vCircHealth = {}
       
   357 local vType = {}
       
   358 local vCounter = {}		-- how often this circ gets to "fire" etc
       
   359 local vCounterLim = {} -- when vCounter == vCounterLim circle performs its special
       
   360 local vCircScore = {} -- how many points killing this invader gives
       
   361 
       
   362 local vCircRadMax = {}
       
   363 local vCircRadMin = {}
       
   364 local vCircRadDir = {}
       
   365 local vCircRadCounter = {}
       
   366 
       
   367 local vCircDX = {}
       
   368 local vCircDY = {}
       
   369 
       
   370 local vCircX = {}
       
   371 local vCircY = {}
       
   372 local vCircMinA = {}
       
   373 local vCircMaxA = {}
       
   374 local vCircType = {}
       
   375 local vCircPulse = {}
       
   376 local vCircFuckAll = {}
       
   377 local vCircRadius = {}
       
   378 local vCircWidth = {}
       
   379 local vCircCol = {}
       
   380 
       
   381 -------------------------------------------
       
   382 -- some lazy copypasta/modified methods
       
   383 -------------------------------------------
       
   384 
       
   385 
       
   386 
       
   387 function HideTags()
       
   388 
       
   389 	for i = 0, 2 do
       
   390 		SetVisualGearValues(vTag[i],0,0,0,0,0,1,0, 0, 240000, 0xffffff00)
       
   391 	end
       
   392 
       
   393 end
       
   394 
       
   395 function DrawTag(i)
       
   396 
       
   397 	zoomL = 1.3
       
   398 
       
   399 	xOffset = 40
       
   400 
       
   401 	if i == 0 then
       
   402 		yOffset = 40
       
   403 		tCol = 0xffba00ff
       
   404 		tValue = TimeLeft
       
   405 	elseif i == 1 then
       
   406 		zoomL = 1.1
       
   407 		yOffset = 70
       
   408 		tCol = 0x00ff00ff
       
   409 		tValue = wepAmmo[wepIndex] --primShotsLeft
       
   410 	elseif i == 2 then
       
   411 		zoomL = 1.1
       
   412 		xOffset = 40 + 35
       
   413 		yOffset = 70
       
   414 		tCol = 0xa800ffff
       
   415 		tValue = shieldHealth - 80
       
   416 	end
       
   417 
       
   418 	DeleteVisualGear(vTag[i])
       
   419 	vTag[i] = AddVisualGear(0, 0, vgtHealthTag, 0, false)
       
   420 	g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vTag[i])
       
   421 	SetVisualGearValues	(
       
   422 				vTag[i], 		--id
       
   423 				-(ScreenWidth/2) + xOffset,	--xoffset
       
   424 				ScreenHeight - yOffset, --yoffset
       
   425 				0, 			--dx
       
   426 				0, 			--dy
       
   427 				zoomL, 			--zoom
       
   428 				1, 			--~= 0 means align to screen
       
   429 				g7, 			--frameticks
       
   430 				tValue, 		--value
       
   431 				240000, 		--timer
       
   432 				tCol		--GetClanColor( GetHogClan(CurrentHedgehog) )
       
   433 				)
       
   434 
       
   435 end
       
   436 
       
   437 function RebuildTeamInfo()
       
   438 
       
   439 	-- make a list of individual team names
       
   440 	for i = 0, (TeamsCount-1) do
       
   441 		teamNameArr[i] = " " -- = i
       
   442 		teamSize[i] = 0
       
   443 		teamIndex[i] = 0
       
   444 		teamScore[i] = 0
       
   445 		teamCircsKilled[i] = 0
       
   446 		teamSurfer[i] = false
       
   447 	end
       
   448 	numTeams = 0
       
   449 
       
   450 	for i = 0, (numhhs-1) do
       
   451 
       
   452 		z = 0
       
   453 		unfinished = true
       
   454 		while(unfinished == true) do
       
   455 
       
   456 			newTeam = true
       
   457 			tempHogTeamName = GetHogTeamName(hhs[i]) -- this is the new name
       
   458 
       
   459 			if tempHogTeamName == teamNameArr[z] then
       
   460 				newTeam = false
       
   461 				unfinished = false
       
   462 			end
       
   463 
       
   464 			z = z + 1
       
   465 
       
   466 			if z == (TeamsCount-1) then
       
   467 				unfinished = false
       
   468 				if newTeam == true then
       
   469 					teamNameArr[numTeams] = tempHogTeamName
       
   470 					numTeams = numTeams + 1
       
   471 				end
       
   472 			end
       
   473 
       
   474 		end
       
   475 
       
   476 	end
       
   477 
       
   478 	-- find out how many hogs per team, and the index of the first hog in hhs
       
   479 	for i = 0, (TeamsCount-1) do
       
   480 
       
   481 		for z = 0, (numhhs-1) do
       
   482 			if GetHogTeamName(hhs[z]) == teamNameArr[i] then
       
   483 				teamClan[i] = GetHogClan(hhs[z])
       
   484 				if teamSize[i] == 0 then
       
   485 					teamIndex[i] = z -- should give starting index
       
   486 				end
       
   487 				teamSize[i] = teamSize[i] + 1
       
   488 				--add a pointer so this hog appears at i in hhs
       
   489 			end
       
   490 		end
       
   491 
       
   492 	end
       
   493 
       
   494 end
       
   495 
       
   496 -- control
       
   497 function AwardPoints(p)
       
   498 
       
   499 	for i = 0,(TeamsCount-1) do
       
   500 		if teamClan[i] == GetHogClan(CurrentHedgehog) then
       
   501 			teamScore[i] = teamScore[i] + p
       
   502 		end
       
   503 	end
       
   504 
       
   505 end
       
   506 
       
   507 function AwardKills(t)
       
   508 
       
   509 	roundKills = roundKills + 1
       
   510 
       
   511 	for i = 0,(TeamsCount-1) do
       
   512 		if teamClan[i] == GetHogClan(CurrentHedgehog) then
       
   513 			teamCircsKilled[i] = teamCircsKilled[i] + 1
       
   514 
       
   515 			if teamCircsKilled[i] == 10 then
       
   516 				AddCaption(loc("Boom!") .. " +25 " .. loc("points").."!",0xffba00ff,capgrpVolume)
       
   517 				AwardPoints(25)
       
   518 			elseif teamCircsKilled[i] == 25 then
       
   519 				AddCaption(loc("BOOM!") .. " +50 " .. loc("points") .. "!",0xffba00ff,capgrpVolume)
       
   520 				AwardPoints(50)
       
   521 			elseif teamCircsKilled[i] == 50 then
       
   522 				AddCaption(loc("BOOM!") .. loc("BOOM!") .. loc("BOOM!") .. " +100 " .. loc("points") .. "!",0xffba00ff,capgrpVolume)
       
   523 				AwardPoints(100)
       
   524 			end
       
   525 
       
   526 			--[[
       
   527 			if t == "R" then
       
   528 				redCircsKilled[i] = redCircsKilled[i] + 1
       
   529 			end
       
   530 			--etc
       
   531 			--etc
       
   532 			]]
       
   533 		end
       
   534 	end
       
   535 
       
   536 end
       
   537 
       
   538 -----------------
       
   539 
       
   540 function bubbleSort(table)
       
   541 
       
   542 	for i = 1, #table do
       
   543         for j = 2, #table do
       
   544             if table[j] < table[j-1] then
       
   545 
       
   546 				temp = table[j-1]
       
   547 				t2 = sdName[j-1]
       
   548 				t3 = sdKills[j-1]
       
   549 
       
   550 				table[j-1] = table[j]
       
   551                 sdName[j-1] = sdName[j]
       
   552 				sdKills[j-1] = sdKills[j]
       
   553 
       
   554 				table[j] = temp
       
   555 				sdName[j] = t2
       
   556 				sdKills[j] = t3
       
   557 
       
   558             end
       
   559         end
       
   560     end
       
   561 
       
   562     return
       
   563 
       
   564 end
       
   565 
       
   566 -----------------
       
   567 
       
   568 function CommentOnScore()
       
   569 
       
   570 	for i = 0,(TeamsCount-1) do
       
   571 		sdScore[i] = teamScore[i]
       
   572 		sdKills[i] = teamCircsKilled[i]
       
   573 		sdName[i] = teamNameArr[i]
       
   574 	end
       
   575 
       
   576 	--bubbleSort(sdScore)
       
   577 
       
   578 	for i = 0,(TeamsCount-1) do
       
   579 		if sdName[i] ~= " " then
       
   580 			teamComment[i] = sdName[i] .. " |" ..
       
   581 			loc("SCORE") .. ": " .. sdScore[i] .. " " .. loc("points") .. "|" ..
       
   582 			loc("KILLS") .. ": " .. sdKills[i] .. " " .. loc("invaders destroyed") .. "|" ..
       
   583 			" " .. "|"
       
   584 		elseif sdName[i] == " " then
       
   585 			teamComment[i] = "|"
       
   586 		end
       
   587 	end
       
   588 
       
   589 	entireC = ""
       
   590 	for i = (TeamsCount-1),0,-1 do
       
   591 		entireC = entireC .. teamComment[i]
       
   592 	end
       
   593 
       
   594 	ShowMission("SPACE INVASION", loc("STATUS UPDATE"), loc("Rounds Complete") .. ": " .. roundNumber .. "/" .. roundLimit .. "| " .. "|" .. loc("Team Scores") .. ": |" ..entireC, 4, 1)
       
   595 
       
   596 end
       
   597 
       
   598 function onNewRound()
       
   599 	roundNumber = roundNumber + 1
       
   600 
       
   601 	CommentOnScore()
       
   602 
       
   603 	-- end game if its at round limit
       
   604 	if roundNumber == roundLimit then
       
   605 
       
   606 		for i = 0, (TeamsCount-1) do
       
   607 			if teamScore[i] > bestScore then
       
   608 				bestScore = teamScore[i]
       
   609 				bestClan = teamClan[i]
       
   610 			end
       
   611 		end
       
   612 
       
   613 		for i = 0, (numhhs-1) do
       
   614 			if GetHogClan(hhs[i]) ~= bestClan then
       
   615 				SetEffect(hhs[i], heResurrectable, false)
       
   616 				SetHealth(hhs[i],0)
       
   617 			end
       
   618 		end
       
   619 		gameOver = true
       
   620 		TurnTimeLeft = 0	--1
       
   621 		TimeLeft = 0
       
   622 	end
       
   623 end
       
   624 
       
   625 -- gaudy racer
       
   626 function CheckForNewRound()
       
   627 
       
   628 	----------
       
   629 	-- new
       
   630 	----------
       
   631 
       
   632 	--[[if gameBegun == true then
       
   633 
       
   634 		if RoundHasChanged == true then
       
   635 			roundN = roundN + 1
       
   636 			RoundHasChanged = false
       
   637 			onNewRound()
       
   638 		end
       
   639 
       
   640 		if lastRound ~= TotalRounds then -- new round, but not really
       
   641 
       
   642 			if RoundHasChanged == false then
       
   643 				RoundHasChanged = true
       
   644 			end
       
   645 
       
   646 		end
       
   647 
       
   648 		--AddCaption("RoundN:" .. roundN .. "; " .. "TR: " .. TotalRounds)
       
   649 		lastRound = TotalRounds
       
   650 
       
   651 	end]]
       
   652 
       
   653 	----------
       
   654 	-- old
       
   655 	----------
       
   656 	if GetHogClan(CurrentHedgehog) == firstClan then
       
   657 		onNewRound()
       
   658 	end
       
   659 
       
   660 end
       
   661 
       
   662 
       
   663 ----------------------------------------
       
   664 -- some tumbler/space invaders methods
       
   665 ----------------------------------------
       
   666 
       
   667 function isATrackedGear(gear)
       
   668 	if 	(GetGearType(gear) == gtExplosives) or
       
   669 		(GetGearType(gear) == gtShell) or
       
   670 		(GetGearType(gear) == gtFlame) or-- new -- gtBall
       
   671 		(GetGearType(gear) == gtBall)
       
   672 	then
       
   673 		return(true)
       
   674 	else
       
   675 		return(false)
       
   676 	end
       
   677 end
       
   678 
       
   679 function setNewGearValues(gear)
       
   680 
       
   681 	if GetGearType(gear) == gtShell then
       
   682 		lfs = 50	-- roughly 5 seconds
       
   683 		shellID = shellID + 1
       
   684 		setGearValue(gear,"ID",shellID)
       
   685 		--nw WriteLnToConsole("Just assigned ID " .. getGearValue(gear,"ID") .. " to this shell")
       
   686 	elseif GetGearType(gear) == gtBall then
       
   687 		lfs = 5 --70	-- 7s
       
   688 	elseif GetGearType(gear) == gtExplosives then
       
   689 		lfs = 15	-- 1.5s
       
   690 		explosivesID = explosivesID + 1
       
   691 		setGearValue(gear,"ID",explosivesID)
       
   692 		setGearValue(gear,"XP", GetX(gear))
       
   693 		setGearValue(gear,"YP", GetY(gear))
       
   694 		--nw WriteLnToConsole("Just assigned ID " .. getGearValue(gear,"ID") .. " to this explosives")
       
   695 	elseif GetGearType(gear) == gtFlame then
       
   696 		lfs = 5	-- 0.5s
       
   697 	else
       
   698 		lfs = 100
       
   699 	end
       
   700 
       
   701 	setGearValue(gear,"lifespan",lfs)
       
   702 	--WriteLnToConsole("I also set its lifespan to " .. lfs)
       
   703 
       
   704 
       
   705 end
       
   706 
       
   707 function HandleLifeSpan(gear)
       
   708 
       
   709 	decreaseGearValue(gear,"lifespan")
       
   710 
       
   711 	--WriteLnToConsole("Just decreased the lifespan of a gear to " .. getGearValue(gear,"lifespan"))
       
   712 	--WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
       
   713 
       
   714 
       
   715 	if getGearValue(gear,"lifespan") == 0 then
       
   716 
       
   717 		if GetGearType(gear) == gtShell then
       
   718 			AddVisualGear(GetX(gear), GetY(gear), vgtExplosion, 0, false)
       
   719 			WriteLnToConsole("about to delete a shell due to lifespan == 0")
       
   720 		--elseif GetGearType(gear) == gtBall then
       
   721 		--	AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, true)
       
   722 		elseif GetGearType(gear) == gtExplosives then
       
   723 			AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
       
   724 			--nw WriteLnToConsole("about to delete a explosive due to lifespan == 0")
       
   725 		elseif GetGearType(gear) == gtFlame then
       
   726 			AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, false)
       
   727 			--WriteLnToConsole("about to delete flame due to lifespan == 0")
       
   728 		end
       
   729 
       
   730 		DeleteGear(gear)
       
   731 
       
   732 	end
       
   733 
       
   734 end
       
   735 
       
   736 -- this prevents ugly barrel clipping sounds when a barrel flies off map limits
       
   737 function DeleteFarFlungBarrel(gear)
       
   738 
       
   739 	if GetGearType(gear) == gtExplosives then
       
   740 		if 	(GetX(gear) < -1900) or
       
   741 			(GetX(gear) > 6200) or
       
   742 			(GetY(gear) < -3400)
       
   743 		then
       
   744 			AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
       
   745 			DeleteGear(gear)
       
   746 			--SetHealth(gear, 0)
       
   747 			--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)
       
   748 		end
       
   749 
       
   750 	end
       
   751 
       
   752 end
       
   753 
       
   754 -----------------------
       
   755 --EVENT HANDLERS
       
   756 -- action keys
       
   757 -----------------------
       
   758 
       
   759 function HandleFlameThrower()
       
   760 
       
   761 	--
       
   762 	--flamer
       
   763 
       
   764 	fireTimer = fireTimer + 1
       
   765 	if fireTimer == 6 then	-- 6
       
   766 		fireTimer = 0
       
   767 
       
   768 		if (wep[wepIndex] == loc("Flamer") ) and (preciseOn == true) and (wepAmmo[wepIndex] > 0) and (stopMovement == false) and (tumbleStarted == true) then
       
   769 
       
   770 			wepAmmo[wepIndex] = wepAmmo[wepIndex] - 1
       
   771 			AddCaption(
       
   772 			loc("Flamer") .. ": " ..
       
   773 			(wepAmmo[wepIndex]/800*100) - (wepAmmo[wepIndex]/800*100)%2 .. "%",
       
   774 			wepCol[2],
       
   775 			capgrpMessage2
       
   776 			)
       
   777 			DrawTag(3)
       
   778 
       
   779 			dx, dy = GetGearVelocity(CurrentHedgehog)					--gtFlame -- gtSnowball -- gtAirBomb
       
   780 			shell = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtFlame, 0, 0, 0, 0)
       
   781 
       
   782 			xdev = 1 + GetRandom(35)	--25
       
   783 			xdev = xdev / 100
       
   784 
       
   785 			r = GetRandom(2)
       
   786 			if r == 1 then
       
   787 				xdev = xdev*-1
       
   788 			end
       
   789 
       
   790 			ydev = 1 + GetRandom(35)	--25
       
   791 			ydev = ydev / 100
       
   792 
       
   793 			r = GetRandom(2)
       
   794 			if r == 1 then
       
   795 				ydev = ydev*-1
       
   796 			end
       
   797 
       
   798 								--4.5	or 2.5 nonflames				--4.5
       
   799 			SetGearVelocity(shell, (dx*4.5)+(xdev*fMod), (dy*4.5)+(ydev*fMod))	--10
       
   800 
       
   801 		end
       
   802 
       
   803 	end
       
   804 
       
   805 
       
   806 end
       
   807 
       
   808 function ChangeWeapon()
       
   809 
       
   810 	wepIndex = wepIndex + 1
       
   811 	if wepIndex == wepCount then
       
   812 		wepIndex = 0
       
   813 	end
       
   814 
       
   815 	AddCaption(wep[wepIndex] .. " " .. loc("selected!"), wepCol[wepIndex],capgrpAmmoinfo )
       
   816 	AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), wepCol[wepIndex],capgrpMessage2)
       
   817 
       
   818 end
       
   819 
       
   820 --function onTimer()
       
   821 
       
   822 	-- experimental wep
       
   823 	--[[SetVisualGearValues(shockwave, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 40, 255, 1, 10, 0, 300, 1, 0xff33ffff)
       
   824 	AddCaption("boom")
       
   825 	PlaySound(sndWarp)
       
   826 	shockwaveHealth = 100
       
   827 	shockwaveRad = 100]]
       
   828 
       
   829 
       
   830 	--change wep
       
   831 	--ChangeWeapon()
       
   832 
       
   833 	-- booster
       
   834 	--[[if boosterOn == false then
       
   835 		boosterOn = true
       
   836 	else
       
   837 		boosterOn = false
       
   838 	end]]
       
   839 
       
   840 --end
       
   841 
       
   842 -- o rite dis wan iz liek synched n stuff hope full lee
       
   843 -- old method
       
   844 --[[function onPrecise()
       
   845 
       
   846 
       
   847 	-- Fire Barrel
       
   848 	if (primShotsLeft > 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then
       
   849 
       
   850 		shotsFired = shotsFired +1
       
   851 
       
   852 		morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtExplosives, 0, 0, 0, 1)
       
   853 
       
   854 		primShotsLeft = primShotsLeft - 1
       
   855 
       
   856 		if primShotsLeft == 0 then
       
   857 			PlaySound(sndSuddenDeath)
       
   858 			AddCaption(loc("Ammo Depleted!"),0xff0000ff,capgrpMessage)
       
   859 		else
       
   860 			AddCaption(loc("Ammo") .. ": " .. primShotsLeft)
       
   861 		end
       
   862 		DrawTag(1)
       
   863 
       
   864 		CopyPV(CurrentHedgehog, morte) -- new addition
       
   865 		x,y = GetGearVelocity(morte)
       
   866 
       
   867 		x = x*2
       
   868 		y = y*2
       
   869 		SetGearVelocity(morte, x, y)
       
   870 
       
   871 
       
   872 	elseif (primShotsLeft == 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then
       
   873 		AddCaption(loc("Ammo Depleted!"),0xff0000ff,capgrpMessage)
       
   874 	end
       
   875 
       
   876 
       
   877 end]]
       
   878 
       
   879 -- derp tumbler
       
   880 function onPrecise()
       
   881 
       
   882 	if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) and (wepAmmo[wepIndex] > 0) then
       
   883 
       
   884 		wepAmmo[wepIndex] = wepAmmo[wepIndex] - 1
       
   885 		--AddCaption(wepAmmo[wepIndex] .. " " .. loc("shots remaining."), wepCol[wepIndex],capgrpMessage2)
       
   886 
       
   887 		if wep[wepIndex] == loc("Barrel Launcher") then
       
   888 			shotsFired = shotsFired +1
       
   889 
       
   890 			morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtExplosives, 0, 0, 0, 1)
       
   891 			CopyPV(CurrentHedgehog, morte) -- new addition
       
   892 			x,y = GetGearVelocity(morte)
       
   893 			x = x*2
       
   894 			y = y*2
       
   895 			SetGearVelocity(morte, x, y)
       
   896 
       
   897 			if wepAmmo[wepIndex] == 0 then
       
   898 			PlaySound(sndSuddenDeath)
       
   899 			AddCaption(loc("Ammo Depleted!"),0xff0000ff,capgrpMessage)
       
   900 			else
       
   901 				--AddCaption(loc("Ammo") .. ": " .. wepAmmo[wepIndex])
       
   902 			end
       
   903 			DrawTag(1)
       
   904 
       
   905 		elseif wep[wepIndex] == loc("Mine Deployer") then
       
   906 			morte = AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtAirBomb, 0, 0, 0, 0)
       
   907 			SetTimer(morte, 1000)
       
   908 			DrawTag(1)
       
   909 		end
       
   910 
       
   911 	elseif (wepAmmo[wepIndex] == 0) and (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then
       
   912 		AddCaption(loc("Ammo Depleted!"),0xff0000ff,capgrpMessage)
       
   913 	end
       
   914 
       
   915 	preciseOn = true
       
   916 
       
   917 end
       
   918 
       
   919 function onPreciseUp()
       
   920 	preciseOn = false
       
   921 end
       
   922 
       
   923 function onLJump()
       
   924 
       
   925 	if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) then
       
   926 		shieldMiser = false
       
   927 		if shieldHealth == 80 then
       
   928 			AddCaption(loc("Shield Depleted"),0xff0000ff,capgrpMessage)
       
   929 			PlaySound(sndMineTick)
       
   930 			PlaySound(sndSwitchHog)
       
   931 		elseif (beam == false) and (shieldHealth > 80) then
       
   932 			beam = true
       
   933 			SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 40, 255, 1, 10, 0, 300, 1, 0xa800ffff)
       
   934 			AddCaption( loc("Shield ON:") .. " " .. shieldHealth - 80 .. " " .. loc("Power Remaining") )
       
   935 			PlaySound(sndWarp)
       
   936 		else
       
   937 			beam = false
       
   938 			SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 0, 0, 1, 10, 0, 0, 0, 0xa800ffff)
       
   939 			AddCaption(loc("Shield OFF:") .. " " .. shieldHealth - 80 .. " " .. loc("Power Remaining") )
       
   940 		end
       
   941 	end
       
   942 end
       
   943 
       
   944 function onHJump()
       
   945 
       
   946 	if (CurrentHedgehog ~= nil) and (stopMovement == false) and (tumbleStarted == true) and
       
   947 	(rAlpha == 255) and (radShotsLeft > 0) then
       
   948 		rPingTimer = 0
       
   949 		rAlpha = 0
       
   950 		radShotsLeft = radShotsLeft -1
       
   951 		AddCaption(loc("Pings left:") .. " " .. radShotsLeft,GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage)
       
   952 	end
       
   953 
       
   954 end
       
   955 
       
   956 -----------------
       
   957 -- movement keys
       
   958 -----------------
       
   959 
       
   960 function onLeft()
       
   961 	leftOn = true
       
   962 end
       
   963 
       
   964 function onRight()
       
   965 	rightOn = true
       
   966 end
       
   967 
       
   968 function onUp()
       
   969 	upOn = true
       
   970 end
       
   971 
       
   972 function onDown()
       
   973 	downOn = true
       
   974 end
       
   975 
       
   976 function onDownUp()
       
   977 	downOn = false
       
   978 end
       
   979 
       
   980 function onUpUp()
       
   981 	upOn = false
       
   982 end
       
   983 
       
   984 function onLeftUp()
       
   985 	leftOn = false
       
   986 end
       
   987 
       
   988 function onRightUp()
       
   989 	rightOn = false
       
   990 end
       
   991 
       
   992 --------------------------
       
   993 -- other event handlers
       
   994 --------------------------
       
   995 
       
   996 function onGameInit()
       
   997 	GameFlags = 0 + gfRandomOrder
       
   998 	Theme = "EarthRise"
       
   999 	CaseFreq = 0
       
  1000 	HealthCaseProb = 0
       
  1001 	MinesNum = 0
       
  1002 	Explosives = 0
       
  1003 	Delay = 1000
       
  1004 
       
  1005 	for i = 0, 3 do
       
  1006 		vTag[0] = AddVisualGear(0, 0, vgtHealthTag, 0, false)
       
  1007 	end
       
  1008 
       
  1009 	HideTags()
       
  1010 
       
  1011 	wep[0] = loc("Barrel Launcher")
       
  1012 	wep[1] = loc("Mine Deployer")
       
  1013 	wep[2] = loc("Flamer")
       
  1014 
       
  1015 	wepCol[0] = 0x78818eff
       
  1016 	wepCol[1] = 0xa12a77ff
       
  1017 	wepCol[2] = 0xf49318ff
       
  1018 
       
  1019 	wepCount = 3
       
  1020 
       
  1021 end
       
  1022 
       
  1023 function onGameStart()
       
  1024 
       
  1025 	if (MinesTime == -1000) or (MinesTime == 0) then
       
  1026 		roundLimit = 3
       
  1027 	else
       
  1028 		roundLimit = (MinesTime / 1000)
       
  1029 	end
       
  1030 
       
  1031 	ShowMission	(
       
  1032 				"SPACE INVASION",
       
  1033 				loc("a Hedgewars mini-game"),
       
  1034 
       
  1035 				loc("Destroy invaders to score points.") .. "|" ..
       
  1036 				" " .. "|" ..
       
  1037 
       
  1038 				loc("Round Limit") .. ": " .. roundLimit .. "|" ..
       
  1039 				loc("Turn Time") .. ": " .. (TurnTime/1000) .. loc("sec") .. "|" ..
       
  1040 				" " .. "|" ..
       
  1041 
       
  1042 				loc("Movement: [Up], [Down], [Left], [Right]") .. "|" ..
       
  1043 				loc("Fire") .. ": " .. loc("[Left Shift]") .. "|" ..
       
  1044 				loc("Toggle Shield") .. ": " .. loc("[Enter]") .. "|" ..
       
  1045 				loc("Radar Ping") .. ": " .. loc("[Backspace]") .. "|" ..
       
  1046 
       
  1047 				--" " .. "|" ..
       
  1048 				--LOC_NOT("Invaders List: ") .. "|" ..
       
  1049 				--LOC_NOT("Blue Jabberwock: (50 points)") .. "|" ..
       
  1050 				--LOC_NOT("Red Warbler: (10 points)") .. "|" ..
       
  1051 				--LOC_NOT("Orange Gob: (5 points)") .. "|" ..
       
  1052 				--LOC_NOT("Green Wrangler: (3 points)") .. "|" ..
       
  1053 
       
  1054 
       
  1055 				"", 4, 4000
       
  1056 				)
       
  1057 
       
  1058 	CreateMeSomeCircles()
       
  1059 	RebuildTeamInfo() -- control
       
  1060 	lastRound = TotalRounds
       
  1061 
       
  1062 end
       
  1063 
       
  1064 function onScreenResize()
       
  1065 
       
  1066 	-- redraw Tags so that their screen locations are updated
       
  1067 	if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then
       
  1068 			DrawTag(0)
       
  1069 			DrawTag(1)
       
  1070 			DrawTag(2)
       
  1071 	end
       
  1072 
       
  1073 end
       
  1074 
       
  1075 function onNewTurn()
       
  1076 
       
  1077 	--primShotsLeft = primShotsMax
       
  1078 	radShotsLeft = 2
       
  1079 	stopMovement = false
       
  1080 	tumbleStarted = false
       
  1081 	boosterOn = false
       
  1082 	beam = false
       
  1083 	shieldHealth = 30 + 80 -- 50 = 5 secs, roughly
       
  1084 	shockwaveHealth = 0
       
  1085 
       
  1086 	RK = 0
       
  1087 	GK = 0
       
  1088 	BK = 0
       
  1089 	OK = 0
       
  1090 	SK = 0
       
  1091 	roundKills = 0
       
  1092 	shieldMiser = true
       
  1093 	fierceComp = false
       
  1094 	shotsFired = 0
       
  1095 	shotsHit = 0
       
  1096 	sniperHits = 0
       
  1097 	pointBlankHits = 0
       
  1098 	chainLength = 0
       
  1099 	chainCounter = 0
       
  1100 	SurfTime = 12
       
  1101 
       
  1102 	-------------------------
       
  1103 	-- gaudy racer
       
  1104 	-------------------------
       
  1105 	CheckForNewRound()
       
  1106 
       
  1107 	-- Handle Starting Stage of Game
       
  1108 	if (gameOver == false) and (gameBegun == false) then
       
  1109 		gameBegun = true
       
  1110 		roundNumber = 0 -- 0
       
  1111 		firstClan = GetHogClan(CurrentHedgehog)
       
  1112 	end
       
  1113 
       
  1114 	if gameOver == true then
       
  1115 		gameBegun = false
       
  1116 		stopMovement = true
       
  1117 		tumbleStarted = false
       
  1118 		SetMyCircles(false)
       
  1119 	end
       
  1120 
       
  1121 
       
  1122 	-------
       
  1123 	-- tumbler
       
  1124 	----
       
  1125 
       
  1126 	wepAmmo[0] = 5
       
  1127 	wepAmmo[1] = 2
       
  1128 	wepAmmo[2] = 5000
       
  1129 	wepIndex = 2
       
  1130 	ChangeWeapon()
       
  1131 
       
  1132 
       
  1133 	HideTags()
       
  1134 
       
  1135 	---------------
       
  1136 	---------------
       
  1137 	--AddCaption("num g: " .. numGears() )
       
  1138 	--WriteLnToConsole("onNewTurn, I just set a bunch of variables to their necessary states. This was done at:")
       
  1139 	--WriteLnToConsole("The above occured at Game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
       
  1140 
       
  1141 end
       
  1142 
       
  1143 function ThingsToBeRunOnGears(gear)
       
  1144 
       
  1145 	HandleLifeSpan(gear)
       
  1146 	DeleteFarFlungBarrel(gear)
       
  1147 
       
  1148 	if CirclesAreGo == true then
       
  1149 		CheckVarious(gear)
       
  1150 		ProjectileTrack(gear)
       
  1151 	end
       
  1152 
       
  1153 end
       
  1154 
       
  1155 
       
  1156 function onGameTick20()
       
  1157 
       
  1158 
       
  1159 	--WriteLnToConsole("Start of GameTick")
       
  1160 
       
  1161 	HandleCircles()
       
  1162 
       
  1163 	-- derp
       
  1164 	--if shockwaveHealth > 0 then
       
  1165 	--	shockwaveHealth = shockwaveHealth - 1
       
  1166 	--	shockwaveRad = shockwaveRad + 5
       
  1167 	--end
       
  1168 
       
  1169 
       
  1170 	if GameTime%100 == 0 then
       
  1171 
       
  1172 		if beam == true then
       
  1173 			shieldHealth = shieldHealth - 1
       
  1174 			if shieldHealth < 80 then -- <= 80
       
  1175 				shieldHealth = 80
       
  1176 				beam = false
       
  1177 				AddCaption(loc("Shield Depleted"),0xff0000ff,capgrpMessage)
       
  1178 				PlaySound(sndMineTick)
       
  1179 				PlaySound(sndSwitchHog)
       
  1180 			end
       
  1181 		end
       
  1182 
       
  1183 
       
  1184 
       
  1185 		--nw WriteLnToConsole("Starting ThingsToBeRunOnGears()")
       
  1186 
       
  1187 		runOnGears(ThingsToBeRunOnGears)
       
  1188 
       
  1189 		--nw WriteLnToConsole("Finished ThingsToBeRunOnGears()")
       
  1190 
       
  1191 		--runOnGears(HandleLifeSpan)
       
  1192 		--runOnGears(DeleteFarFlungBarrel)
       
  1193 
       
  1194 		if CirclesAreGo == true and CurrentHedgehog ~= nil then
       
  1195 			CheckDistances()
       
  1196 			--runOnGears(CheckVarious)	-- used to be in handletracking for some bizarre reason
       
  1197 			--runOnGears(ProjectileTrack)
       
  1198 		end
       
  1199 
       
  1200 		-- white smoke trail as player falls from the sky
       
  1201 		if (TimeLeft <= 0) and (stopMovement == true) and (CurrentHedgehog ~= nil) then
       
  1202 			j,k = GetGearVelocity(CurrentHedgehog)
       
  1203 			if (j ~= 0) and (k ~= 0) then
       
  1204 				AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtSmoke, 0, true)
       
  1205 			end
       
  1206 		end
       
  1207 
       
  1208 		--nw WriteLnToConsole("Finished 100Timer")
       
  1209 
       
  1210 	end
       
  1211 
       
  1212 
       
  1213 	-- start the player tumbling with a boom once their turn has actually begun
       
  1214 	if (tumbleStarted == false) and (gameOver == false) then
       
  1215 		if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) then
       
  1216 			--AddCaption(LOC_NOT("Good to go!"))
       
  1217 			tumbleStarted = true
       
  1218 			TimeLeft = div(TurnTime, 1000)	--45
       
  1219 			FadeAlpha = 0
       
  1220 			rAlpha = 255
       
  1221 			AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1)
       
  1222 			DrawTag(0)
       
  1223 			DrawTag(1)
       
  1224 			DrawTag(2)
       
  1225 			SetMyCircles(true)
       
  1226 		end
       
  1227 	end
       
  1228 
       
  1229 	--WriteLnToConsole("Finished initial check")
       
  1230 
       
  1231 	if (CurrentHedgehog ~= nil) and (tumbleStarted == true) then
       
  1232 
       
  1233 		--AddCaption(GetX(CurrentHedgehog) .. ";" .. GetY(CurrentHedgehog) )
       
  1234 
       
  1235 		-- Calculate and display turn time
       
  1236 		if GameTime%1000 == 0 then
       
  1237 			TimeLeft = TimeLeft - 1
       
  1238 
       
  1239 			if TimeLeft >= 0 then
       
  1240 				--AddCaption(LOC_NOT("Time Left: ") .. TimeLeft)
       
  1241 				DrawTag(0)
       
  1242 			end
       
  1243 
       
  1244 		end
       
  1245 
       
  1246 		--WriteLnToConsole("Finished timeleft calculations")
       
  1247 
       
  1248 		-------------------------------
       
  1249 		-- Player has run out of luck (out of time or hit by gtShell)
       
  1250 		-------------------------------
       
  1251 		-- checks in FloatyThings
       
  1252 		if PlayerIsFine() == false then
       
  1253 			TimeLeft = 0
       
  1254 		end
       
  1255 
       
  1256 		--WriteLnToConsole("successfully checked playerIsFine")
       
  1257 
       
  1258 		if (TimeLeft == 0) then
       
  1259 			if (stopMovement == false) then	--time to stop the player
       
  1260 				stopMovement = true
       
  1261 				boosterOn = false
       
  1262 				beam = false
       
  1263 				upOn = false
       
  1264 				down = false
       
  1265 				leftOn = false
       
  1266 				rightOn = false
       
  1267 				SetMyCircles(false)
       
  1268 				HideTags()
       
  1269 				rAlpha = 255
       
  1270 				--nw WriteLnToConsole("Player is out of luck")
       
  1271 
       
  1272 				if shieldMiser == true then
       
  1273 
       
  1274 					p = (roundKills*3.5) - ((roundKills*3.5)%1) + 2
       
  1275 
       
  1276 					AddCaption(loc("Shield Miser!") .." +" .. p .." ".. loc("points") .. "!",0xffba00ff,capgrpAmmoinfo)
       
  1277 					AwardPoints(p)
       
  1278 				end
       
  1279 
       
  1280 				if ((shotsHit / shotsFired * 100) >= 80) and (shotsFired > 4) then
       
  1281 					AddCaption(loc("Accuracy Bonus!") .. " +15 " .. loc("points") .. "!",0xffba00ff,capgrpVolume)
       
  1282 					AwardPoints(15)
       
  1283 				end
       
  1284 
       
  1285 			end
       
  1286 		else -- remove this if you want tumbler to fall slowly on death
       
  1287 		-------------------------------
       
  1288 		-- Player is still in luck
       
  1289 		-------------------------------
       
  1290 
       
  1291 
       
  1292 			--WriteLnToConsole("about to do chainCounter checks")
       
  1293 			if chainCounter > 0 then
       
  1294 				chainCounter = chainCounter -1
       
  1295 				if chainCounter == 0 then
       
  1296 					chainLength = 0
       
  1297 				end
       
  1298 			end
       
  1299 
       
  1300 			-- handle movement based on IO
       
  1301 			if GameTime%100 == 0 then -- 100
       
  1302 				--nw WriteLnToConsole("Start of Player MoveTimer")
       
  1303 
       
  1304 				---------------
       
  1305 				-- new trail code
       
  1306 				---------------
       
  1307 				-- the trail lets you know you have 5s left to pilot, akin to birdy feathers
       
  1308 				if (TimeLeft <= 5) and (TimeLeft > 0) then							--vgtSmoke
       
  1309 					tempE = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtSmoke, 0, true)
       
  1310 					g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)
       
  1311 					SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, GetClanColor(GetHogClan(CurrentHedgehog)) )
       
  1312 				end
       
  1313 				--------------
       
  1314 				--------------
       
  1315 
       
  1316 				------------------------
       
  1317 				-- surfer achievement
       
  1318 				------------------------
       
  1319 
       
  1320 				if (WaterLine - GetY(CurrentHedgehog)) < 15 then
       
  1321 					SurfTime = SurfTime -1
       
  1322 				end
       
  1323 
       
  1324 				if SurfTime ~= 12 then
       
  1325 
       
  1326 					SurfTime = SurfTime - 1
       
  1327 					if SurfTime <= 0 then
       
  1328 						for i = 0,(TeamsCount-1) do
       
  1329 							if teamClan[i] == GetHogClan(CurrentHedgehog) and (teamSurfer[i] == false) then
       
  1330 								teamSurfer[i] = true
       
  1331 								SurfTime = 12
       
  1332 								AddCaption(loc("Surfer! +15 points!"),0xffba00ff,capgrpVolume)
       
  1333 								AwardPoints(15)
       
  1334 							end
       
  1335 						end
       
  1336 					end
       
  1337 				end
       
  1338 
       
  1339 
       
  1340 				dx, dy = GetGearVelocity(CurrentHedgehog)
       
  1341 
       
  1342 				--WriteLnToConsole("I just got the velocity of currenthedgehog. It is dx: " .. dx .. "; dy: " .. dy)
       
  1343 				--WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
       
  1344 
       
  1345 				if boosterOn == true then
       
  1346 					tempE = AddVisualGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), vgtDust, 0, false)
       
  1347 					g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)
       
  1348 					SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, 1, g9, GetClanColor(GetHogClan(CurrentHedgehog)) )
       
  1349 					dxlimit = 0.8*fMod
       
  1350 					dylimit = 0.8*fMod
       
  1351 				else
       
  1352 					dxlimit = 0.4*fMod
       
  1353 					dylimit = 0.4*fMod
       
  1354 				end
       
  1355 
       
  1356 				if dx > dxlimit then
       
  1357 					dx = dxlimit
       
  1358 				end
       
  1359 				if dy > dylimit then
       
  1360 					dy = dylimit
       
  1361 				end
       
  1362 				if dx < -dxlimit then
       
  1363 					dx = -dxlimit
       
  1364 				end
       
  1365 				if dy < -dylimit then
       
  1366 					dy = -dylimit
       
  1367 				end
       
  1368 
       
  1369 
       
  1370 				if leftOn == true then
       
  1371 					dx = dx - 0.1*fMod
       
  1372 				end
       
  1373 				if rightOn == true then
       
  1374 					dx = dx + 0.1*fMod
       
  1375 				end
       
  1376 
       
  1377 				if upOn == true then
       
  1378 					dy = dy - 0.1*fMod
       
  1379 				end
       
  1380 				if downOn == true then
       
  1381 					dy = dy + 0.1*fMod
       
  1382 				end
       
  1383 
       
  1384 				SetGearVelocity(CurrentHedgehog, dx, dy)
       
  1385 
       
  1386 				--WriteLnToConsole("I just SET the velocity of currenthedgehog. It is now dx: " .. dx .. "; dy: " .. dy)
       
  1387 				--WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
       
  1388 				--nw WriteLnToConsole("End of Player MoveTimer")
       
  1389 
       
  1390 			end
       
  1391 
       
  1392 
       
  1393 			HandleFlameThrower()
       
  1394 
       
  1395 
       
  1396 		end -- new end I put here to check if he's still alive or not
       
  1397 
       
  1398 	end
       
  1399 
       
  1400 	--WriteLnToConsole("End of GameTick")
       
  1401 
       
  1402 end
       
  1403 
       
  1404 function onGearDamage(gear, damage)
       
  1405 	if GetGearType(gear) == gtHedgehog then
       
  1406 		if (fierceComp == false) and (damage >= 60) and (GetHogClan(gear) ~= GetHogClan(CurrentHedgehog)) then
       
  1407 			fierceComp = true
       
  1408 			AddCaption(loc("Fierce Competition!") .. " +8 " .. loc("points") .. "!",0xffba00ff,capgrpGameState)
       
  1409 			AwardPoints(8)
       
  1410 		end
       
  1411 	end
       
  1412 end
       
  1413 
       
  1414 function onGearResurrect(gear)
       
  1415 
       
  1416 	-- did I fall into the water? well, that was a stupid thing to do
       
  1417 	if gear == CurrentHedgehog then
       
  1418 		TimeLeft = 0
       
  1419 		--WriteLnToConsole("Current hedgehog just drowned himself")
       
  1420 		--WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
       
  1421 	end
       
  1422 
       
  1423 end
       
  1424 
       
  1425 function onGearAdd(gear)
       
  1426 
       
  1427 	if isATrackedGear(gear) then
       
  1428 		trackGear(gear)
       
  1429 		setNewGearValues(gear)
       
  1430 	end
       
  1431 
       
  1432 	--if GetGearType(gear) == gtBall then
       
  1433 	--	SetTimer(gear, 5000)
       
  1434 	--end
       
  1435 
       
  1436 	if GetGearType(gear) == gtHedgehog then
       
  1437 		SetEffect(gear, heResurrectable, true)
       
  1438 
       
  1439 		-----------
       
  1440 		-- control
       
  1441 		hhs[numhhs] = gear
       
  1442 		numhhs = numhhs + 1
       
  1443 		-----------
       
  1444 	end
       
  1445 
       
  1446 end
       
  1447 
       
  1448 function onGearDelete(gear)
       
  1449 
       
  1450 
       
  1451 	--[[if GetGearType(gear) == gtShell then
       
  1452 		--nw WriteLnToConsole("on GearDelete call. Shell ID: " .. getGearValue(gear,"ID"))
       
  1453 		--WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
       
  1454 
       
  1455 		--if CurrentHedgehog ~= nil then
       
  1456 		--	WriteLnToConsole("As it happens, player is at: " .. GetX(CurrentHedgehog) .. "; " .. GetY(CurrentHedgehog))
       
  1457 		--end
       
  1458 	elseif GetGearType(gear) == gtExplosives then
       
  1459 		--nw WriteLnToConsole("on GearDelete call. Explosives ID: " .. getGearValue(gear,"ID"))
       
  1460 		--WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
       
  1461 
       
  1462 		--if CurrentHedgehog ~= nil then
       
  1463 		--	WriteLnToConsole("As it happens, player is at: " .. GetX(CurrentHedgehog) .. "; " .. GetY(CurrentHedgehog))
       
  1464 		--end
       
  1465 	elseif GetGearType(gear) == gtFlame then
       
  1466 		--WriteLnToConsole("on GearDelete flame")
       
  1467 	end]]
       
  1468 
       
  1469 	if isATrackedGear(gear) then
       
  1470 		trackDeletion(gear)
       
  1471 	end
       
  1472 
       
  1473 	if CurrentHedgehog ~= nil then
       
  1474 		FollowGear(CurrentHedgehog)
       
  1475 	end
       
  1476 
       
  1477 end
       
  1478 
       
  1479 
       
  1480 
       
  1481 ------------------------------------------------------------
       
  1482 ------------------------------------------------------------
       
  1483 ------------------------------------------------------------
       
  1484 ------------------------------------------------------------
       
  1485 -- FLOATY THINGS
       
  1486 -- "I'll make this into a generic library and code properly
       
  1487 -- when I have more time and feel less lazy"
       
  1488 ------------------------------------------------------------
       
  1489 ------------------------------------------------------------
       
  1490 ------------------------------------------------------------
       
  1491 ------------------------------------------------------------
       
  1492 
       
  1493 function DoHorribleThings(cUID)
       
  1494 
       
  1495 	-- work out the distance to the target
       
  1496 	g1X, g1Y = GetGearPosition(CurrentHedgehog)
       
  1497 	g2X, g2Y = vCircX[cUID], vCircY[cUID]
       
  1498 	q = g1X - g2X
       
  1499 	w = g1Y - g2Y
       
  1500 	r = math.sqrt( (q*q) + (w*w) )	--alternate
       
  1501 
       
  1502 	opp = w
       
  1503 	if opp < 0 then
       
  1504 		opp = opp*-1
       
  1505 	end
       
  1506 
       
  1507 	-- work out the angle (theta) to the target
       
  1508 	t = math.deg ( math.asin(opp / r) )
       
  1509 
       
  1510 	-- based on the radius of the radar, calculate what x/y displacement should be
       
  1511 	NR = 150 -- radius at which to draw circs
       
  1512 	NX = math.cos( math.rad(t) ) * NR
       
  1513 	NY = math.sin( math.rad(t) ) * NR
       
  1514 
       
  1515 	-- displace xy based on where this thing actually is
       
  1516 
       
  1517 	if r < NR then
       
  1518 		rCircX[cUID] = g2X
       
  1519 	elseif q > 0 then
       
  1520 		rCircX[cUID] = g1X - NX
       
  1521 	else
       
  1522 		rCircX[cUID] = g1X + NX
       
  1523 	end
       
  1524 
       
  1525 	if r < NR then
       
  1526 		rCircY[cUID] = g2Y
       
  1527 	elseif w > 0 then
       
  1528 		rCircY[cUID] = g1Y - NY
       
  1529 	else
       
  1530 		rCircY[cUID] = g1Y + NY
       
  1531 	end
       
  1532 
       
  1533 end
       
  1534 
       
  1535 function PlayerIsFine()
       
  1536 	return (playerIsFine)
       
  1537 end
       
  1538 
       
  1539 function GetDistFromXYtoXY(a, b, c, d)
       
  1540 	q = a - c
       
  1541 	w = b - d
       
  1542 	return ( (q*q) + (w*w) )
       
  1543 end
       
  1544 
       
  1545 function GetDistFromGearToGear(gear, gear2)
       
  1546 
       
  1547 	g1X, g1Y = GetGearPosition(gear)
       
  1548 	g2X, g2Y = GetGearPosition(gear2)
       
  1549 	q = g1X - g2X
       
  1550 	w = g1Y - g2Y
       
  1551 
       
  1552 
       
  1553 	--[[
       
  1554 	WriteLnToConsole("I just got the position of two gears and calculated the distance betwen them")
       
  1555 	if gear == CurrentHedgehog then
       
  1556 		WriteLnToConsole("Gear 1 is CurrentHedgehog.")
       
  1557 	end
       
  1558 	if gear2 == CurrentHedgehog then
       
  1559 		WriteLnToConsole("Gear 2 is CurrentHedgehog.")
       
  1560 	end
       
  1561 	WriteLnToConsole("G1X: " .. g1X .. "; G1Y: " .. g1Y)
       
  1562 	WriteLnToConsole("G2X: " .. g2X .. "; G2Y: " .. g2Y)
       
  1563 	WriteLnToConsole("Their distance is " .. (q*q) + (w*w) )
       
  1564 	WriteLnToConsole("The above events occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
       
  1565 ]]
       
  1566 
       
  1567 
       
  1568 	return ( (q*q) + (w*w) )
       
  1569 
       
  1570 end
       
  1571 
       
  1572 function GetDistFromGearToXY(gear, g2X, g2Y)
       
  1573 
       
  1574 	g1X, g1Y = GetGearPosition(gear)
       
  1575 	q = g1X - g2X
       
  1576 	w = g1Y - g2Y
       
  1577 
       
  1578 
       
  1579 	--[[WriteLnToConsole("I just got the position of a gear and calculated the distance betwen it and another xy")
       
  1580 	if gear == CurrentHedgehog then
       
  1581 		WriteLnToConsole("Gear 1 is CurrentHedgehog.")
       
  1582 	end
       
  1583 
       
  1584 	WriteLnToConsole("G1X: " .. g1X .. "; G1Y: " .. g1Y)
       
  1585 	WriteLnToConsole("Other X: " .. g2X .. "; Other Y: " .. g2Y)
       
  1586 	WriteLnToConsole("Their distance is " .. (q*q) + (w*w) )
       
  1587 	WriteLnToConsole("The above events occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
       
  1588 ]]
       
  1589 
       
  1590 
       
  1591 	return ( (q*q) + (w*w) )
       
  1592 
       
  1593 
       
  1594 end
       
  1595 
       
  1596 function CreateMeSomeCircles()
       
  1597 
       
  1598 	for i = 0, 7 do
       
  1599 		vCCount = vCCount +1
       
  1600 		vCirc[i] = AddVisualGear(0,0,vgtCircle,0,true)
       
  1601 
       
  1602 		rCirc[i] = AddVisualGear(0,0,vgtCircle,0,true)
       
  1603 		rCircX[i] = 0
       
  1604 		rCircY[i] = 0
       
  1605 
       
  1606 		vCircDX[i] = 0
       
  1607 		vCircDY[i] = 0
       
  1608 
       
  1609 		vType[i] = "generic"
       
  1610 		vCounter[i] = 0
       
  1611 		vCounterLim[i] = 150
       
  1612 		vCircScore[i] = 0
       
  1613 		vCircHealth[i] = 1
       
  1614 
       
  1615 		vCircMinA[i] = 80	--80 --20
       
  1616 		vCircMaxA[i] = 255
       
  1617 		vCircType[i] = 1	--1
       
  1618 		vCircPulse[i] = 10
       
  1619 		vCircFuckAll[i] = 0
       
  1620 		vCircRadius[i] = 0
       
  1621 		vCircWidth[i] = 3 --5
       
  1622 
       
  1623 		vCircRadMax[i] = 0
       
  1624 		vCircRadMin[i] = 0
       
  1625 		vCircRadDir[i] = -1
       
  1626 		vCircRadCounter[i] = 0
       
  1627 
       
  1628 		vCircX[i], vCircY[i] = 0,0
       
  1629 
       
  1630 		vCircCol[i] = 0xff00ffff
       
  1631 
       
  1632 		SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], vCircMinA[i], vCircMaxA[i], vCircType[i], vCircPulse[i], vCircFuckAll[i], vCircRadius[i], vCircWidth[i], vCircCol[i])
       
  1633 
       
  1634 		SetVisualGearValues(rCirc[i], 0, 0, 100, 255, 1, 10, 0, 40, 3, vCircCol[i])
       
  1635 
       
  1636 	end
       
  1637 
       
  1638 	pShield = AddVisualGear(0,0,vgtCircle,0,true)
       
  1639 	--SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), 80, 200, 1, 10, 0, 200, 5, 0xff00ffff)
       
  1640 
       
  1641 
       
  1642 	shockwave = AddVisualGear(0,0,vgtCircle,0,true)
       
  1643 
       
  1644 end
       
  1645 
       
  1646 function IGotMeASafeXYValue(i)
       
  1647 
       
  1648 	acceptibleDistance = 800
       
  1649 
       
  1650 	-- put this in here to thwart attempts at repositioning and test sanity limit
       
  1651 	--vCircX[i] = GetX(CurrentHedgehog)+250
       
  1652 	--vCircY[i] = GetY(CurrentHedgehog)+250
       
  1653 
       
  1654 	vCircX[i] = GetRandom(5000)
       
  1655 	vCircY[i] = GetRandom(2000)
       
  1656 	dist = GetDistFromGearToXY(CurrentHedgehog, vCircX[i], vCircY[i])
       
  1657 	if dist > acceptibleDistance*acceptibleDistance then
       
  1658 		return(true)
       
  1659 	else
       
  1660 		return(false)
       
  1661 	end
       
  1662 
       
  1663 end
       
  1664 
       
  1665 function CircleDamaged(i)
       
  1666 
       
  1667 	res = ""
       
  1668 	vCircHealth[i] = vCircHealth[i] -1
       
  1669 
       
  1670 	if vCircHealth[i] <= 0 then
       
  1671 	-- circle is dead, do death effects/consequences
       
  1672 
       
  1673 		vCircActive[i] = false
       
  1674 
       
  1675 		if (vType[i] == "drone") then
       
  1676 			PlaySound(sndHellishImpact4)
       
  1677 			TimeLeft = TimeLeft + 4
       
  1678 			AddCaption(loc("Time Extended!") .. "+" .. 4 .. loc("sec"), 0xff0000ff,capgrpMessage )
       
  1679 			DrawTag(0)
       
  1680 
       
  1681 			morte = AddGear(vCircX[i], vCircY[i], gtExplosives, 0, 0, 0, 1)
       
  1682 			SetHealth(morte, 0)
       
  1683 
       
  1684 			RK = RK + 1
       
  1685 			if RK == 5 then
       
  1686 				RK = 0
       
  1687 				AddCaption(loc("Drone Hunter!") .. " +10 " .. loc("points") .. "!",0xffba00ff,capgrpMessage2)
       
  1688 				AwardPoints(10)
       
  1689 			end
       
  1690 
       
  1691 		elseif (vType[i] == "ammo") then
       
  1692 			AddVisualGear(vCircX[i], vCircY[i], vgtExplosion, 0, false)
       
  1693 			PlaySound(sndExplosion)
       
  1694 			PlaySound(sndShotgunReload)
       
  1695 			wepAmmo[0] = wepAmmo[0] +3
       
  1696 			--primShotsLeft = primShotsLeft + 3
       
  1697 			AddCaption("+" .. 3 .. " " .. loc("Ammo"), 0x00ff00ff,capgrpMessage)
       
  1698 			DrawTag(1)
       
  1699 
       
  1700 			GK = GK + 1
       
  1701 			if GK == 3 then
       
  1702 				GK = 0
       
  1703 				AddCaption(loc("Ammo Maniac!") .. " +5 " .. loc("points") .. "!",0xffba00ff,capgrpMessage2)
       
  1704 				AwardPoints(5)
       
  1705 			end
       
  1706 
       
  1707 		elseif (vType[i] == "bonus") then
       
  1708 
       
  1709 			AddVisualGear(vCircX[i], vCircY[i], vgtExplosion, 0, false)
       
  1710 			PlaySound(sndExplosion)
       
  1711 
       
  1712 			AddVisualGear(vCircX[i], vCircY[i], vgtFire, 0, false)
       
  1713 			AddVisualGear(vCircX[i], vCircY[i], vgtFire, 0, false)
       
  1714 			AddVisualGear(vCircX[i], vCircY[i], vgtFire, 0, false)
       
  1715 			AddVisualGear(vCircX[i], vCircY[i], vgtFire, 0, false)
       
  1716 			AddVisualGear(vCircX[i], vCircY[i], vgtFire, 0, false)
       
  1717 			AddVisualGear(vCircX[i], vCircY[i], vgtSmoke, 0, false)
       
  1718 
       
  1719 			PlaySound(sndVaporize)
       
  1720 			--sndWarp sndMineTick --sndSwitchHog --sndSuddenDeath
       
  1721 
       
  1722 			shieldHealth = shieldHealth + 30
       
  1723 			AddCaption(loc("Shield boosted! +30 power"), 0xa800ffff,capgrpMessage)
       
  1724 			if shieldHealth >= 250 then
       
  1725 				shieldHealth = 250
       
  1726 				AddCaption(loc("Shield is fully recharged!"),0xa800ffff,capgrpMessage)
       
  1727 			end
       
  1728 			DrawTag(2)
       
  1729 
       
  1730 			OK = OK + 1
       
  1731 			if OK == 3 then
       
  1732 				OK = 0
       
  1733 				AddCaption(loc("Shield Seeker!") .. " + 10 " .. loc("points") .. "!",0xffba00ff,capgrpMessage2)
       
  1734 				AwardPoints(10)
       
  1735 			end
       
  1736 
       
  1737 		elseif (vType[i] == "blueboss") then
       
  1738 			PlaySound(sndHellishImpact3)
       
  1739 			AddCaption(loc("Boss defeated!") .. " +30 " .. loc("points") .. "!", 0x0050ffff,capgrpMessage)
       
  1740 
       
  1741 			morte = AddGear(vCircX[i], vCircY[i], gtExplosives, 0, 0, 0, 1)
       
  1742 			SetHealth(morte, 0)
       
  1743 
       
  1744 			BK = BK + 1
       
  1745 			if BK == 2 then
       
  1746 				BK = 0
       
  1747 				AddCaption(loc("Boss Slayer!") .. " +25 " .. loc("points") .. "!",0xffba00ff,capgrpMessage2)
       
  1748 				AwardPoints(25)
       
  1749 			end
       
  1750 
       
  1751 		end
       
  1752 
       
  1753 		AwardPoints(vCircScore[i])
       
  1754 		AwardKills()
       
  1755 		SetUpCircle(i)
       
  1756 		res = "fatal"
       
  1757 
       
  1758 		chainCounter = 3000
       
  1759 		chainLength = chainLength + 1
       
  1760 		if chainLength > 1 then
       
  1761 			AddCaption( chainLength .. "-" .. loc("Hit Combo!") .. " +" .. chainLength*2 .. " " .. loc("points") .. "!",0xffba00ff,capgrpAmmostate)
       
  1762 			AwardPoints(chainLength*2)
       
  1763 		end
       
  1764 
       
  1765 	else
       
  1766 	-- circle is merely damaged
       
  1767 	-- do damage effects/sounds
       
  1768 		AddVisualGear(vCircX[i], vCircY[i], vgtSteam, 0, false)
       
  1769 		r = GetRandom(4)
       
  1770 		if r == 0 then
       
  1771 			PlaySound(sndHellishImpact1)
       
  1772 		elseif r == 1 then
       
  1773 			PlaySound(sndHellishImpact2)
       
  1774 		elseif r == 2 then
       
  1775 			PlaySound(sndHellishImpact3)
       
  1776 		elseif r == 3 then
       
  1777 			PlaySound(sndHellishImpact4)
       
  1778 		end
       
  1779 		res = "non-fatal"
       
  1780 
       
  1781 	end
       
  1782 
       
  1783 	return(res)
       
  1784 
       
  1785 end
       
  1786 
       
  1787 function SetUpCircle(i)
       
  1788 
       
  1789 
       
  1790 	r = GetRandom(10)
       
  1791 	--r = 8
       
  1792 	-- 80% of spawning either red/green
       
  1793 	if r <= 7 then
       
  1794 
       
  1795 		--r = GetRandom(5)
       
  1796 		r = GetRandom(2)
       
  1797 		--r = 1
       
  1798 		if r == 0 then
       
  1799 		--if r <= 2 then
       
  1800 			vCircCol[i] = 0xff0000ff -- red
       
  1801 			vType[i] = "drone"
       
  1802 			vCircRadMin[i] = 50	*5
       
  1803 			vCircRadMax[i] = 90	*5
       
  1804 			vCounterLim[i] = 150
       
  1805 			vCircScore[i] = 10
       
  1806 			vCircHealth[i] = 1
       
  1807 		--else
       
  1808 		elseif r == 1 then
       
  1809 			vCircCol[i] = 0x00ff00ff -- green
       
  1810 			vType[i] = "ammo"
       
  1811 			vCircRadMin[i] = 25	*7
       
  1812 			vCircRadMax[i] = 30	*7
       
  1813 			vCircScore[i] = 3
       
  1814 			vCircHealth[i] = 1
       
  1815 		end
       
  1816 
       
  1817 	-- 20% chance of spawning boss or bonus
       
  1818 	else
       
  1819 		r = GetRandom(5)
       
  1820 		--r = GetRandom(2)
       
  1821 		--r = 0
       
  1822 		if r <= 1 then
       
  1823 		--if r == 0 then
       
  1824 			vCircCol[i] = 0x0050ffff -- sexy blue
       
  1825 			vType[i] = "blueboss"
       
  1826 			vCircRadMin[i] = 100*5
       
  1827 			vCircRadMax[i] = 180*5
       
  1828 			vCircWidth[i] = 1
       
  1829 			vCounterLim[i] = 100
       
  1830 			vCircScore[i] = 30
       
  1831 			vCircHealth[i] = 3
       
  1832 		else
       
  1833 		--elseif r == 1 then
       
  1834 			--vCircCol[i] = 0xffae00ff -- orange
       
  1835 			vCircCol[i] = 0xa800ffff -- purp
       
  1836 			vType[i] = "bonus"
       
  1837 			vCircRadMin[i] = 20 *7
       
  1838 			vCircRadMax[i] = 40 *7
       
  1839 			vCircScore[i] = 5
       
  1840 			vCircHealth[i] = 1
       
  1841 		end
       
  1842 
       
  1843 	end
       
  1844 
       
  1845 	-- regenerate circle xy if too close to player or until sanity limit kicks in
       
  1846 	reN = 0
       
  1847 	--zzz = 0
       
  1848 	while (reN < 10) do
       
  1849 		if IGotMeASafeXYValue(i) == false then
       
  1850 			reN = reN + 1
       
  1851 			--zzz = zzz + 1
       
  1852 		else
       
  1853 			reN = 15
       
  1854 		end
       
  1855 	end
       
  1856 	--AddCaption("Took me this many retries: " .. zzz) -- number of times it took to work
       
  1857 
       
  1858 	vCircRadius[i] = vCircRadMax[i] - GetRandom(vCircRadMin[i])
       
  1859 
       
  1860 	g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i])
       
  1861 	SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], g3, g4, g5, g6, g7, vCircRadius[i], vCircWidth[i], vCircCol[i]-0x000000ff)
       
  1862 	-- - -0x000000ff
       
  1863 
       
  1864 	g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(rCirc[i])
       
  1865 	SetVisualGearValues(rCirc[i], 0, 0, g3, g4, g5, g6, g7, g8, g9, vCircCol[i]-0x000000ff)
       
  1866 
       
  1867 
       
  1868 	vCircActive[i] = true -- new
       
  1869 
       
  1870 	--nw WriteLnToConsole("CIRC " .. i .. ": X: " .. vCircX[i] .. "; Y: " .. vCircY[i])
       
  1871 	--nw WriteLnToConsole("CIRC " .. i .. ": dX: " .. vCircDX[i] .. "; dY: " .. vCircDY[i])
       
  1872 	--nw WriteLnToConsole("CIRC " .. i .. ": RAD:" .. vCircRadius[i])
       
  1873 
       
  1874 end
       
  1875 
       
  1876 function SetMyCircles(s)
       
  1877 
       
  1878 	CirclesAreGo = s
       
  1879 	playerIsFine = s
       
  1880 
       
  1881 	if s == true then
       
  1882 		--nw WriteLnToConsole("About to set up all circles, old values are here:")
       
  1883 		for i = 0,(vCCount-1) do
       
  1884 			--nw WriteLnToConsole("CIRC " .. i .. ": X: " .. vCircX[i] .. "; Y: " .. vCircY[i])
       
  1885 			--nw WriteLnToConsole("CIRC " .. i .. ": dX: " .. vCircDX[i] .. "; dY: " .. vCircDY[i])
       
  1886 			--nw WriteLnToConsole("CIRC " .. i .. ": RAD:" .. vCircRadius[i])
       
  1887 		end
       
  1888 		--nw WriteLnToConsole("Old values given, new values to follow...")
       
  1889 	end
       
  1890 
       
  1891 	for i = 0,(vCCount-1) do
       
  1892 
       
  1893 		if s == false then
       
  1894 			--vCircCol[i] = 0xffffffff
       
  1895 			vCircActive[i] = false
       
  1896 		elseif s == true then
       
  1897 			SetUpCircle(i)
       
  1898 		end
       
  1899 
       
  1900 	end
       
  1901 
       
  1902 end
       
  1903 
       
  1904 function WellHeAintGonnaJumpNoMore(x,y)
       
  1905 
       
  1906 	AddVisualGear(x, y, vgtBigExplosion, 0, false)
       
  1907 	playerIsFine = false
       
  1908 	AddCaption(loc("GOTCHA!"))
       
  1909 	PlaySound(sndExplosion)
       
  1910 	PlaySound(sndHellish)
       
  1911 
       
  1912 	targetHit = true
       
  1913 
       
  1914 end
       
  1915 
       
  1916 --- collision detection for weapons fire
       
  1917 function CheckVarious(gear)
       
  1918 
       
  1919 	--if (GetGearType(gear) == gtExplosives) then
       
  1920 		--nw WriteLnToConsole("Start of CheckVarious(): Exp ID: " .. getGearValue(gear,"ID"))
       
  1921 	--elseif (GetGearType(gear) == gtShell) then
       
  1922 		--nw WriteLnToConsole("Start of CheckVarious(): Shell ID: " .. getGearValue(gear,"ID"))
       
  1923 	--end
       
  1924 
       
  1925 	targetHit = false
       
  1926 
       
  1927 	-- if circle is hit by player fire
       
  1928 	if (GetGearType(gear) == gtExplosives) then
       
  1929 		circsHit = 0
       
  1930 
       
  1931 		for i = 0,(vCCount-1) do
       
  1932 
       
  1933 			--nw WriteLnToConsole("Is it neccessary to check for collision with circ " .. i)
       
  1934 
       
  1935 			--if (vCircActive[i] == true) and ( (vType[i] == "drone") ) then
       
  1936 
       
  1937 				--nw WriteLnToConsole("YES. about to calc distance between gtExplosives and circ " .. i)
       
  1938 
       
  1939 				dist = GetDistFromGearToXY(gear, vCircX[i], vCircY[i])
       
  1940 
       
  1941 				-- calculate my real radius if I am an aura
       
  1942 				if vCircType[i] == 0 then
       
  1943 					NR = vCircRadius[i]
       
  1944 				else
       
  1945 					NR = (48/100*vCircRadius[i])/2
       
  1946 				end
       
  1947 
       
  1948 				if dist <= NR*NR then
       
  1949 
       
  1950 
       
  1951 					--nw WriteLnToConsole("Collision confirmed. The gtExplosives is within the circ radius!")
       
  1952 
       
  1953 					dist = (GetDistFromXYtoXY(vCircX[i], vCircY[i], getGearValue(gear,"XP"), getGearValue(gear,"YP")) - (NR*NR))
       
  1954 					--AddCaption(loc("Dist: ") .. dist .. "!",0xffba00ff,capgrpGameState)
       
  1955 					if dist >= 1000000 then
       
  1956 						sniperHits = sniperHits +1
       
  1957 						AddCaption(loc("Sniper!") .. " +8 " .. loc("points") .. "!",0xffba00ff,capgrpGameState)
       
  1958 						AwardPoints(8)
       
  1959 						if sniperHits == 3 then
       
  1960 							sniperHits = 0
       
  1961 							AddCaption(loc("They Call Me Bullseye!") .. " +16 " .. loc("points") .. "!",0xffba00ff,capgrpGameState)
       
  1962 							AwardPoints(15)
       
  1963 						end
       
  1964 					elseif dist <= 6000 then
       
  1965 						pointBlankHits = pointBlankHits +1
       
  1966 						if pointBlankHits == 3 then
       
  1967 							pointBlankHits = 0
       
  1968 							AddCaption(loc("Point Blank Combo!") .. " +5 " .. loc("points") .. "!",0xffba00ff,capgrpGameState)
       
  1969 							AwardPoints(5)
       
  1970 						end
       
  1971 					end
       
  1972 
       
  1973 					AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
       
  1974 
       
  1975 					targetHit = true
       
  1976 					--DeleteGear(gear)
       
  1977 					--SetHealth(gear,0)
       
  1978 						--WriteLnToConsole("set " .. "Exp ID: " .. getGearValue(gear,"ID") .. " health to 0")
       
  1979 						--WriteLnToConsole("targetHit set to true, explosive is at distance " .. dist .. "(within range " .. NR*NR.. ") of circ" )
       
  1980 
       
  1981 					CircleDamaged(i)
       
  1982 
       
  1983 					circsHit = circsHit + 1
       
  1984 					if circsHit > 1 then
       
  1985 						AddCaption(loc("Multi-shot!") .. " +15 " .. loc("points") .. "!",0xffba00ff,capgrpAmmostate)
       
  1986 						AwardPoints(15)
       
  1987 						circsHit = 0
       
  1988 					end
       
  1989 
       
  1990 					shotsHit = shotsHit + 1
       
  1991 
       
  1992 
       
  1993 
       
  1994 				end
       
  1995 
       
  1996 			--end
       
  1997 
       
  1998 		end
       
  1999 
       
  2000 	-- if player is hit by circle bazooka
       
  2001 	elseif (GetGearType(gear) == gtShell) and (CurrentHedgehog ~= nil) then --or (GetGearType(gear) == gtBall) then
       
  2002 
       
  2003 		dist = GetDistFromGearToGear(gear, CurrentHedgehog)
       
  2004 
       
  2005 		if beam == true then
       
  2006 
       
  2007 			if dist < 3000 then
       
  2008 				tempE = AddVisualGear(GetX(gear), GetY(gear), vgtSmoke, 0, true)
       
  2009 				g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)
       
  2010 				SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, 0xff00ffff )
       
  2011 				PlaySound(sndVaporize)
       
  2012 				DeleteGear(gear)
       
  2013 
       
  2014 				SK = SK + 1
       
  2015 				if SK == 5 then
       
  2016 					SK = 0
       
  2017 					AddCaption(loc("Shield Master!") .. " +10 " .. loc("points") .. "!",0xffba00ff,capgrpAmmoinfo)
       
  2018 					AwardPoints(10)
       
  2019 				end
       
  2020 			end
       
  2021 
       
  2022 		elseif dist < 1600 then
       
  2023 			WellHeAintGonnaJumpNoMore(GetX(gear), GetY(gear))
       
  2024 		end
       
  2025 
       
  2026 		--[[if targetHit == true then
       
  2027 			WriteLnToConsole("about to delete shell due to targetHit being set to true earlier")
       
  2028 			DeleteGear(gear)
       
  2029 			WriteLnToConsole("there, I deleted it")
       
  2030 		end]]
       
  2031 
       
  2032 
       
  2033 	end
       
  2034 
       
  2035 	if targetHit == true then
       
  2036 			--nw WriteLnToConsole("about to delete something due to targetHit being set to true earlier")
       
  2037 			DeleteGear(gear)
       
  2038 			--nw WriteLnToConsole("there, I deleted it")
       
  2039 	end
       
  2040 
       
  2041 	--nw WriteLnToConsole("End of CheckVarious()")
       
  2042 
       
  2043 end
       
  2044 
       
  2045 -- collision detection for player entering a circle
       
  2046 function CheckDistances()
       
  2047 
       
  2048 	--nw WriteLnToConsole("Start of CheckDistances()")
       
  2049 
       
  2050 	for i = 0,(vCCount-1) do
       
  2051 
       
  2052 
       
  2053 		--nw WriteLnToConsole("Attempting to calculate dist of circ " .. i)
       
  2054 
       
  2055 		g1X, g1Y = GetGearPosition(CurrentHedgehog)
       
  2056 		g2X, g2Y = vCircX[i], vCircY[i]
       
  2057 
       
  2058 		g1X = g1X - g2X
       
  2059 		g1Y = g1Y - g2Y
       
  2060 		dist = (g1X*g1X) + (g1Y*g1Y)
       
  2061 
       
  2062 		--DoHorribleThings(i, g1X, g1Y, g2X, g2Y, dist)
       
  2063 
       
  2064 		--nw WriteLnToConsole("Calcs done. Dist to CurrentHedgehog is " .. dist)
       
  2065 
       
  2066 		-- calculate my real radius if I am an aura
       
  2067 		if vCircType[i] == 0 then
       
  2068 			NR = vCircRadius[i]
       
  2069 		else
       
  2070 			NR = (48/100*vCircRadius[i])/2
       
  2071 		end
       
  2072 
       
  2073 		if dist <= NR*NR then
       
  2074 
       
  2075 			if 	(vCircActive[i] == true) and
       
  2076 				((vType[i] == "ammo") or (vType[i] == "bonus") )
       
  2077 			then
       
  2078 
       
  2079 				CircleDamaged(i)
       
  2080 
       
  2081 			elseif (vCircActive[i] == true) and
       
  2082 					( (vType[i] == "drone") or (vType[i] == "blueboss") )
       
  2083 			then
       
  2084 
       
  2085 				ss = CircleDamaged(i)
       
  2086 				WellHeAintGonnaJumpNoMore(GetX(CurrentHedgehog),GetY(CurrentHedgehog))
       
  2087 
       
  2088 				if ss == "fatal" then
       
  2089 
       
  2090 					if (wepAmmo[0] == 0) and (TimeLeft <= 9) then
       
  2091 					--if (primShotsLeft == 0) and (TimeLeft <= 9) then
       
  2092 						AddCaption(loc("Kamikaze Expert!") .. " +15 " .. loc("points") .. "!",0xffba00ff,capgrpMessage)
       
  2093 						AwardPoints(15)
       
  2094 					elseif (wepAmmo[0] == 0) then
       
  2095 						AddCaption(loc("Depleted Kamikaze!") .. " +5 " .. loc("points") .. "!",0xffba00ff,capgrpMessage)
       
  2096 						AwardPoints(5)
       
  2097 					elseif TimeLeft <= 9 then
       
  2098 						AddCaption(loc("Timed Kamikaze!") .. " +10 " .. loc("points") .. "!",0xffba00ff,capgrpMessage)
       
  2099 						AwardPoints(10)
       
  2100 					end
       
  2101 				end
       
  2102 
       
  2103 			end
       
  2104 
       
  2105 
       
  2106 		end
       
  2107 
       
  2108 	end
       
  2109 
       
  2110 	--nw WriteLnToConsole("End of CheckDistances()")
       
  2111 
       
  2112 end
       
  2113 
       
  2114 function HandleCircles()
       
  2115 
       
  2116 	--[[if CirclesAreGo == true then
       
  2117 
       
  2118 		--CheckDistances()
       
  2119 		--runOnGears(CheckVarious)	-- used to be in handletracking for some bizarre reason
       
  2120 
       
  2121 		--pTimer = pTimer + 1
       
  2122 		--if pTimer == 100 then
       
  2123 		--	pTimer = 0
       
  2124 		--	runOnGears(ProjectileTrack)
       
  2125 		--end
       
  2126 
       
  2127 	end]]
       
  2128 
       
  2129 
       
  2130 	if rAlpha ~= 255 then
       
  2131 
       
  2132 		if GameTime%100 == 0 then
       
  2133 
       
  2134 			rAlpha = rAlpha + 5
       
  2135 			if rAlpha >= 255 then
       
  2136 				rAlpha = 255
       
  2137 			end
       
  2138 		end
       
  2139 
       
  2140 	end
       
  2141 
       
  2142 	for i = 0,(vCCount-1) do
       
  2143 
       
  2144 		--if (vCircActive[i] == true) then
       
  2145 			SetVisualGearValues(rCirc[i], rCircX[i], rCircY[i], 100, 255, 1, 10, 0, 40, 3, vCircCol[i]-rAlpha)
       
  2146 		--end
       
  2147 
       
  2148 
       
  2149 
       
  2150 		vCounter[i] = vCounter[i] + 1
       
  2151 		if vCounter[i] >= vCounterLim[i] then
       
  2152 
       
  2153 			vCounter[i] = 0
       
  2154 
       
  2155 			if 	((vType[i] == "drone") or (vType[i] == "blueboss") ) and
       
  2156 				(vCircActive[i] == true) then
       
  2157 				AddGear(vCircX[i], vCircY[i], gtShell, 0, 0, 0, 1)
       
  2158 
       
  2159 				--WriteLnToConsole("Circle " .. i .. " just fired/added a gtShell")
       
  2160 				--WriteLnToConsole("The above event occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
       
  2161 
       
  2162 			--elseif (vType[i] == "bluebottle") and (vCircActive[i] == true) then
       
  2163 			--	AddGear(vCircX[i], vCircY[i]-vCircRadius[i], gtBall, 0, 0, 0, 1)
       
  2164 			--	AddGear(vCircX[i], vCircY[i]+vCircRadius[i], gtBall, 0, 0, 0, 1)
       
  2165 			--	AddGear(vCircX[i]-vCircRadius[i], vCircY[i], gtBall, 0, 0, 0, 1)
       
  2166 			--	AddGear(vCircX[i]+vCircRadius[i], vCircY[i], gtBall, 0, 0, 0, 1)
       
  2167 			end
       
  2168 
       
  2169 		end
       
  2170 
       
  2171 		if (vCircActive[i] == true) then
       
  2172 
       
  2173 			vCircRadCounter[i] = vCircRadCounter[i] + 1
       
  2174 			if vCircRadCounter[i] == 100 then
       
  2175 
       
  2176 				vCircRadCounter[i] = 0
       
  2177 
       
  2178 				-- make my radius increase/decrease faster if I am an aura
       
  2179 				if vCircType[i] == 0 then
       
  2180 					M = 1
       
  2181 				else
       
  2182 					M = 10
       
  2183 				end
       
  2184 
       
  2185 				vCircRadius[i] = vCircRadius[i] + vCircRadDir[i]
       
  2186 				if vCircRadius[i] > vCircRadMax[i] then
       
  2187 					vCircRadDir[i] = -M
       
  2188 				elseif vCircRadius[i] < vCircRadMin[i] then
       
  2189 					vCircRadDir[i] = M
       
  2190 				end
       
  2191 
       
  2192 
       
  2193 				-- random effect test
       
  2194 				-- maybe use this to tell the difference between circs
       
  2195 				-- you can kill by shooting or not
       
  2196 				--vgtSmoke vgtSmokeWhite
       
  2197 				--vgtSteam -- nice long trail
       
  2198 				--vgtDust -- short trail on earthrise
       
  2199 				--vgtSmokeTrace
       
  2200 				if vType[i] == "ammo" then
       
  2201 
       
  2202 					tempE = AddVisualGear(vCircX[i], vCircY[i], vgtSmoke, 0, true)
       
  2203 					g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)	--0xff00ffff	--0x00ff00ff
       
  2204 					SetVisualGearValues(tempE, vCircX[i], vCircY[i], g3, g4, g5, g6, g7, g8, g9, vCircCol[i] )
       
  2205 
       
  2206 					--AddVisualGear(vCircX[i], vCircY[i], vgtDust, 0, true)
       
  2207 
       
  2208 				elseif vType[i] == "bonus" then
       
  2209 
       
  2210 					tempE = AddVisualGear(vCircX[i], vCircY[i], vgtDust, 0, true)
       
  2211 					g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)	--0xff00ffff	--0x00ff00ff --vCircCol[i]
       
  2212 					SetVisualGearValues(tempE, vCircX[i], vCircY[i], g3, g4, g5, g6, g7, 1, g9, 0xff00ffff )
       
  2213 
       
  2214 
       
  2215 				elseif vType[i] == "blueboss" then
       
  2216 
       
  2217 					k = 25
       
  2218 					g = vgtSteam
       
  2219 					trailColour = 0xae00ffff
       
  2220 
       
  2221 					-- 0xffae00ff -- orange
       
  2222 					-- 0xae00ffff -- purp
       
  2223 
       
  2224 					tempE = AddVisualGear(vCircX[i], vCircY[i], g, 0, true)
       
  2225 					g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)	--0xff00ffff	--0x00ff00ff
       
  2226 					SetVisualGearValues(tempE, vCircX[i], vCircY[i]+k, g3, g4, g5, g6, g7, g8, g9, trailColour-75 )
       
  2227 
       
  2228 					tempE = AddVisualGear(vCircX[i], vCircY[i], g, 0, true)
       
  2229 					g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)	--0xff00ffff	--0x00ff00ff
       
  2230 					SetVisualGearValues(tempE, vCircX[i]+k, vCircY[i]-k, g3, g4, g5, g6, g7, g8, g9, trailColour-75 )
       
  2231 
       
  2232 					tempE = AddVisualGear(vCircX[i], vCircY[i], g, 0, true)
       
  2233 					g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)	--0xff00ffff	--0x00ff00ff
       
  2234 					SetVisualGearValues(tempE, vCircX[i]-k, vCircY[i]-k, g3, g4, g5, g6, g7, g8, g9, trailColour-75 )
       
  2235 
       
  2236 
       
  2237 				end
       
  2238 
       
  2239 
       
  2240 			end
       
  2241 
       
  2242 		end
       
  2243 
       
  2244 
       
  2245 	end
       
  2246 
       
  2247 	-- alter the circles velocities
       
  2248 	if GameTime%2000 == 0 then
       
  2249 
       
  2250 		for i = 0,(vCCount-1) do
       
  2251 
       
  2252 			-- bounce the circles off the edges if they go too far
       
  2253 			-- or make them move in random directions
       
  2254 
       
  2255 			if vCircX[i] > 5500 then
       
  2256 				vCircDX[i] = -4	--5 circmovchange
       
  2257 			elseif vCircX[i] < -1500 then
       
  2258 				vCircDX[i] = 4	--5 circmovchange
       
  2259 			else
       
  2260 
       
  2261 				z = GetRandom(2)
       
  2262 				if z == 1 then
       
  2263 					z = 1
       
  2264 				else
       
  2265 					z = -1
       
  2266 				end
       
  2267 				vCircDX[i] = vCircDX[i] + GetRandom(3)*z	--3 circmovchange
       
  2268 			end
       
  2269 
       
  2270 			if vCircY[i] > 1500 then
       
  2271 				vCircDY[i] = -4	--5 circmovchange
       
  2272 			elseif vCircY[i] < -2900 then
       
  2273 				vCircDY[i] = 4	--5 circmovchange
       
  2274 			else
       
  2275 				z = GetRandom(2)
       
  2276 				if z == 1 then
       
  2277 					z = 1
       
  2278 				else
       
  2279 					z = -1
       
  2280 				end
       
  2281 				vCircDY[i] = vCircDY[i] + GetRandom(3)*z	--3 circmovchange
       
  2282 			end
       
  2283 
       
  2284 		end
       
  2285 
       
  2286 	end
       
  2287 
       
  2288 	-- move the circles according to their current velocities
       
  2289 	--m2Count = m2Count + 1
       
  2290 	--if m2Count == 25 then	--25 circmovchange
       
  2291 
       
  2292 	--	m2Count = 0
       
  2293 		for i = 0,(vCCount-1) do
       
  2294 			vCircX[i] = vCircX[i] + vCircDX[i]
       
  2295 			vCircY[i] = vCircY[i] + vCircDY[i]
       
  2296 
       
  2297 			if (CurrentHedgehog ~= nil) and (rAlpha ~= 255) then
       
  2298 				DoHorribleThings(i)--(i, g1X, g1Y, g2X, g2Y, dist)
       
  2299 			end
       
  2300 
       
  2301 		end
       
  2302 
       
  2303 		if (TimeLeft == 0) and (tumbleStarted == true) then
       
  2304 
       
  2305 			FadeAlpha = FadeAlpha + 1
       
  2306 			if FadeAlpha >= 255 then
       
  2307 				FadeAlpha = 255
       
  2308 			end
       
  2309 
       
  2310 			--new
       
  2311 			--if FadeAlpha == 1 then
       
  2312 			--	AddCaption("GOT IT")
       
  2313 			--	for i = 0,(vCCount-1) do
       
  2314 			--		g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i])
       
  2315 			--		vCircCol[i] = g10
       
  2316 			--	end
       
  2317 			--end
       
  2318 
       
  2319 		end
       
  2320 
       
  2321 
       
  2322 		-- derp
       
  2323 		if shockwaveHealth > 0 then
       
  2324 			shockwaveHealth = shockwaveHealth - 1
       
  2325 			shockwaveRad = shockwaveRad + 80
       
  2326 
       
  2327 			--mrm = ((48/100*shockwaveRad)/2)
       
  2328 			--AddVisualGear(GetX(CurrentHedgehog)-mrm+GetRandom(mrm*2),GetY(CurrentHedgehog)-mrm+GetRandom(mrm*2), vgtSmoke, 0, false)
       
  2329 		end
       
  2330 
       
  2331 
       
  2332 
       
  2333 	--end
       
  2334 
       
  2335 	for i = 0,(vCCount-1) do
       
  2336 		g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i])		-- vCircCol[i] g10
       
  2337 		SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], g3, g4, g5, g6, g7, vCircRadius[i], g9, g10)
       
  2338 	end
       
  2339 
       
  2340 	if 	(TimeLeft == 0) or
       
  2341 		((tumbleStarted == false)) then
       
  2342 		for i = 0,(vCCount-1) do
       
  2343 			g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(vCirc[i])		-- vCircCol[i] g10
       
  2344 			SetVisualGearValues(vCirc[i], vCircX[i], vCircY[i], g3, g4, g5, g6, g7, vCircRadius[i], g9, (vCircCol[i]-FadeAlpha))
       
  2345 		end
       
  2346 	end
       
  2347 
       
  2348 
       
  2349 	if (CurrentHedgehog ~= nil) then
       
  2350 		if beam == true then
       
  2351 			g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(pShield)
       
  2352 			--SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 200, g9, g10 )
       
  2353 			SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 200, g9, 0xa800ffff-0x000000ff - -shieldHealth )
       
  2354 			DrawTag(2)
       
  2355 		else
       
  2356 			SetVisualGearValues(pShield, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 0, g9, g10 )
       
  2357 		end
       
  2358 
       
  2359 		if shockwaveHealth > 0 then
       
  2360 			g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(shockwave)
       
  2361 			SetVisualGearValues(shockwave, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, shockwaveRad, g9, 0xff3300ff-0x000000ff - -shockwaveHealth )
       
  2362 		else
       
  2363 			SetVisualGearValues(shockwave, GetX(CurrentHedgehog), GetY(CurrentHedgehog), g3, g4, g5, g6, g7, 0, g9, g10 )
       
  2364 		end
       
  2365 
       
  2366 	end
       
  2367 
       
  2368 
       
  2369 end
       
  2370 
       
  2371 function ProjectileTrack(gear)
       
  2372 
       
  2373 	if (GetGearType(gear) == gtShell) then
       
  2374 
       
  2375 		--nw WriteLnToConsole("ProjectileTrack() for Shell ID: " .. getGearValue(gear,"ID"))
       
  2376 
       
  2377 		-- newnew
       
  2378 		if (GetGearType(gear) == gtShell) then
       
  2379 			turningSpeed = 0.1*fMod
       
  2380 		--elseif (GetGearType(gear) == gtBall) then
       
  2381 		--	turningSpeed = 0.2*fMod
       
  2382 		end
       
  2383 
       
  2384 		dx, dy = GetGearVelocity(gear)
       
  2385 
       
  2386 		--WriteLnToConsole("I'm trying to track currenthedge with shell ID: " .. getGearValue(gear,"ID"))
       
  2387 		--WriteLnToConsole("I just got the velocity of the shell. It is dx: " .. dx .. "; dy: " .. dy)
       
  2388 		--WriteLnToConsole("CurrentHedgehog is at X: " .. GetX(CurrentHedgehog) .. "; Y: " .. GetY(CurrentHedgehog) )
       
  2389 
       
  2390         if CurrentHedgehog ~= nil then
       
  2391             if GetX(gear) > GetX(CurrentHedgehog) then
       
  2392                 dx = dx - turningSpeed--0.1
       
  2393             else
       
  2394                 dx = dx + turningSpeed--0.1
       
  2395             end
       
  2396 
       
  2397             if GetY(gear) > GetY(CurrentHedgehog) then
       
  2398                 dy = dy - turningSpeed--0.1
       
  2399             else
       
  2400                 dy = dy + turningSpeed--0.1
       
  2401             end
       
  2402         end
       
  2403 
       
  2404 
       
  2405 		if (GetGearType(gear) == gtShell) then
       
  2406 			dxlimit = 0.4*fMod
       
  2407 			dylimit = 0.4*fMod
       
  2408 		--elseif (GetGearType(gear) == gtBall) then
       
  2409 		--	dxlimit = 0.5	--  0.5 is about the same
       
  2410 		--	dylimit = 0.5 -- 0.6 is faster than player
       
  2411 		end
       
  2412 
       
  2413 		if dx > dxlimit then
       
  2414 			dx = dxlimit
       
  2415 		end
       
  2416 		if dy > dylimit then
       
  2417 			dy = dylimit
       
  2418 		end
       
  2419 		if dx < -dxlimit then
       
  2420 			dx = -dxlimit
       
  2421 		end
       
  2422 		if dy < -dylimit then
       
  2423 			dy = -dylimit
       
  2424 		end
       
  2425 
       
  2426 		SetGearVelocity(gear, dx, dy)
       
  2427 
       
  2428 		--WriteLnToConsole("I just SET the velocity of shell towards currenthegdge. It is now dx: " .. dx .. "; dy: " .. dy)
       
  2429 		--WriteLnToConsole("The above events occured game Time: " .. GameTime .. "; luaTicks: " .. luaGameTicks)
       
  2430 		--nw WriteLnToConsole("ProjectileTrack() finished successfully")
       
  2431 
       
  2432 	end
       
  2433 
       
  2434 end
       
  2435