share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua
author sheepluva
Tue, 02 Dec 2014 23:33:28 +0100
changeset 10611 58cad46782ff
parent 10596 75b5b674387a
child 10630 08d0cacf2aec
permissions -rw-r--r--
move functionality of Draw.lua into engine

------------------------------------------
-- TECH RACER v0.2
-----------------------------------------

--------------
--0.2
--------------
-- should work better "out the box"
-- changed map generation
-- put a hog limiter in place
-- removed parsecommand
-- fix one of the test maps
-- hopefully added some support for future official challenges etc
-- changed theme
-- minor cleanups?

-----------------------------
-- SCRIPT BEGINS
-----------------------------

HedgewarsScriptLoad("/Scripts/Locale.lua")
HedgewarsScriptLoad("/Scripts/OfficialChallenges.lua")
HedgewarsScriptLoad("/Scripts/Tracker.lua")
HedgewarsScriptLoad("/Scripts/Params.lua")

------------------
-- Got Variables?
------------------

local activationStage = 0
local jet = nil

local fMod = 1000000 -- 1
local roundLimit = 3
local roundNumber = 0
local firstClan = 10

local fastX = {}
local fastY = {}
local fastCount = 0
local fastIndex = 0
local fastColour

local currX = {}
local currY = {}
local currCount = 0

local specialPointsX = {}
local specialPointsY = {}
local specialPointsCount = 0

mapID = 22

--------------------------
-- hog and team tracking variales
--------------------------

local numhhs = 0 -- store number of hedgehogs
local hhs = {} -- store hedgehog gears

local numTeams --  store the number of teams in the game
local teamNameArr = {}  -- store the list of teams
local teamClan = {}
local teamSize = {}     -- store how many hogs per team
local teamIndex = {} -- at what point in the hhs{} does each team begin

local teamComment = {}
local teamScore = {}

-------
-- racer vars
--------

local cGear = nil

local bestClan = nil
local bestTime = nil

local gameBegun = false
local gameOver = false
local racerActive = false
local trackTime = 0

local wpCirc = {}
local wpX = {}
local wpY = {}
local wpCol = {}
local wpActive = {}
local wpRad = 450 --75
local wpCount = 0
local wpLimit = 8

local usedWeapons = {}

local roundN
local lastRound
local RoundHasChanged

-------------------
-- general methods
-------------------

--function onPrecise()
--end

function RebuildTeamInfo()


        -- make a list of individual team names
        for i = 0, (TeamsCount-1) do
                teamNameArr[i] = " " -- = i
                teamSize[i] = 0
                teamIndex[i] = 0
                teamScore[i] = 100000
        end
        numTeams = 0

        for i = 0, (numhhs-1) do

                z = 0
                unfinished = true
                while(unfinished == true) do

                        newTeam = true
                        tempHogTeamName = GetHogTeamName(hhs[i]) -- this is the new name

                        if tempHogTeamName == teamNameArr[z] then
                                newTeam = false
                                unfinished = false
                        end

                        z = z + 1

                        if z == TeamsCount then
                                unfinished = false
                                if newTeam == true then
                                        teamNameArr[numTeams] = tempHogTeamName
                                        numTeams = numTeams + 1
                                end
                        end

                end

        end

        -- find out how many hogs per team, and the index of the first hog in hhs
        for i = 0, (numTeams-1) do
                for z = 0, (numhhs-1) do
                        if GetHogTeamName(hhs[z]) == teamNameArr[i] then
                                teamClan[i] = GetHogClan(hhs[z])
                                if teamSize[i] == 0 then
                                        teamIndex[i] = z -- should give starting index
                                end
                                teamSize[i] = teamSize[i] + 1
                                --add a pointer so this hog appears at i in hhs
                        end
                end

        end

end


-----------------
-- RACER METHODS
-----------------

function CheckWaypoints()

        trackFinished = true

        for i = 0, (wpCount-1) do

                g1X, g1Y = GetGearPosition(CurrentHedgehog)
                g2X, g2Y = wpX[i], wpY[i]

                g1X = g1X - g2X
                g1Y = g1Y - g2Y
                dist = (g1X*g1X) + (g1Y*g1Y)

                --if i == 0 then
                --      AddCaption(dist .. "/" .. (wpRad*wpRad) )
                --end

                NR = (48/100*wpRad)/2

                if dist < (NR*NR) then
                --if dist < (wpRad*wpRad) then
                        --AddCaption("howdy")
                        wpActive[i] = true
                        wpCol[i] = GetClanColor(GetHogClan(CurrentHedgehog)) -- new                             --GetClanColor(1)
                        SetVisualGearValues(wpCirc[i], wpX[i], wpY[i], 20, 100, 1, 10, 0, wpRad, 5, wpCol[i])

                        wpRem = 0
                        for k = 0, (wpCount-1) do
                                if wpActive[k] == false then
                                        wpRem = wpRem + 1
                                end
                        end

                        AddCaption(loc("Way-Points Remaining") .. ": " .. wpRem,0xffba00ff,capgrpAmmoinfo)

                end

                if wpActive[i] == false then
                        trackFinished = false
                end

        end

        return(trackFinished)

end

function AdjustScores()

        if bestTime == nil then
                bestTime = 100000
                bestClan = 10
                bestTimeComment = "N/A"
        end

        newScore = false

        -- update this clan's time if the new track is better
        for i = 0, (numTeams-1) do
                if teamClan[i] == GetHogClan(CurrentHedgehog) then
                        if trackTime < teamScore[i] then
                                teamScore[i] = trackTime
                                newScore = true
                        else
                                newScore = false
                        end
                end
        end

        --bestTime = 100000
        --bestClan = 10

        -- find the best time out of those so far
        for i = 0, (numTeams-1) do
                if teamScore[i] < bestTime then
                        bestTime = teamScore[i]
                        bestClan = teamClan[i]
                end
        end

        if bestTime ~= 100000 then
                bestTimeComment = (bestTime/1000) ..loc("s")
        end

        if newScore == true then
                if trackTime == bestTime then -- best time of the race
                        ShowMission(loc("RACER"),
                        loc("TRACK COMPLETED"),
                        loc("NEW RACE RECORD: ") .. (trackTime/1000) ..loc("s") .. "|" ..
                        loc("WINNING TIME: ") .. bestTimeComment, 0, 4000)
                        PlaySound(sndHomerun)
                else    -- best time for the clan
                        ShowMission(loc("RACER"),
                        loc("TRACK COMPLETED"),
                        loc("NEW CLAN RECORD: ") .. (trackTime/1000) ..loc("s") .. "|" ..
                        loc("WINNING TIME: ") .. bestTimeComment, 4, 4000)
                end
        else -- not any kind of new score
                ShowMission(loc("RACER"),
                loc("TRACK COMPLETED"),
                loc("TIME: ") .. (trackTime/1000) ..loc("s") .. "|" ..
                loc("WINNING TIME: ") .. bestTimeComment, -amSkip, 4000)
                PlaySound(sndHellish)
        end


        --------
        --new
        --------

        if bestTime == trackTime then
                --AddCaption("wooooooooooooooooooooooooooooo")

                fastColour = GetClanColor(GetHogClan(CurrentHedgehog))

                for i = 0, (currCount-1) do
                        fastX[i] = currX[i]
                        fastY[i] = currY[i]
                end

                fastCount = currCount
                fastIndex = 0

                --currCount = 0 -- is this needed?

        else
                currCount = 0
                fastIndex = 0
        end


end

function onNewRound()

        roundNumber = roundNumber + 1

        totalComment = ""
        for i = 0, (TeamsCount-1) do
                        if teamNameArr[i] ~= " " then                           -- teamScore[teamClan[i]]
                                teamComment[i] = teamNameArr[i] .. ": " .. (teamScore[i]/1000) .. loc("s|")
                                totalComment = totalComment .. teamComment[i]
                        elseif teamNameArr[i] == " " then
                                teamComment[i] = "|"
                        end
        end

        ShowMission(    loc("RACER"),
                                        loc("STATUS UPDATE"),
                                        loc("Rounds Complete: ") .. roundNumber .. "/" .. roundLimit .. "|" .. " " .. "|" ..
                                        loc("Best Team Times: ") .. "|" .. totalComment, 0, 4000)

        -- end game if its at round limit
        if roundNumber >= roundLimit then
                for i = 0, (numhhs-1) do
                        if GetHogClan(hhs[i]) ~= bestClan then
                                SetEffect(hhs[i], heResurrectable, 0)
                                SetHealth(hhs[i],0)
                        end
                end
                gameOver = true
                TurnTimeLeft = 1
        end

end

function CheckForNewRound()

        -------------
        ------ new
        -------------

        --[[turnN = turnN + 1
        if gameBegun == false then
                if turnN == 2 then
                        for i = 0, (numhhs-1) do
                                if hhs[i] ~= nil then
                                        SetEffect(hhs[i], heResurrectable, 0)
                                        SetHealth(hhs[i],0)
                                end
                        end
                        gameOver = true
                        TurnTimeLeft = 1
                end
        else


        end]]

        --[[if roundBegun == true then

                if RoundHasChanged == true then
                        roundN = roundN + 1
                        RoundHasChanged = false
                        onNewRound()
                end

                if lastRound ~= TotalRounds then -- new round, but not really

                        if RoundHasChanged == false then
                                RoundHasChanged = true
                        end

                end

                AddCaption("RoundN:" .. roundN .. "; " .. "TR: " .. TotalRounds)

                lastRound = TotalRounds

        end]]

        ------------
        ----- old
        ------------

        if GetHogClan(CurrentHedgehog) == firstClan then
                onNewRound()
        end

end

function DisableTumbler()
        currCount = 0
        fastIndex = 0
        TurnTimeLeft = 0
        racerActive = false -- newadd
end

function HandleGhost()

        -- get the current xy of the racer at this point
        currX[currCount] = GetX(CurrentHedgehog)
        currY[currCount] = GetY(CurrentHedgehog)
        currCount = currCount + 1

        -- draw a ping of smoke where the fastest player was at this point
        if (fastCount ~= 0) and (fastIndex < fastCount) then

                fastIndex = fastIndex + 1

                tempE = AddVisualGear(fastX[fastIndex], fastY[fastIndex], vgtSmoke, 0, false)
                g1, g2, g3, g4, g5, g6, g7, g8, g9, g10 = GetVisualGearValues(tempE)
                SetVisualGearValues(tempE, g1, g2, g3, g4, g5, g6, g7, g8, g9, fastColour )

                --AddCaption("fC: " .. fastIndex .. " / " .. fastCount)

        else

                --AddCaption("excep fC: " .. fastIndex .. " / " .. fastCount)

        end



end

function BoomGirder(x,y,rot)
	girTime = 1
	if rot < 4 then
				AddGear(x, y, gtGrenade, 0, 0, 0, girTime)
	elseif rot == 4 then
				g = AddGear(x-45, y, gtGrenade, 0, 0, 0, girTime) -- needed?
				g = AddGear(x-30, y, gtGrenade, 0, 0, 0, girTime)
				g = AddGear(x, y, gtGrenade, 0, 0, 0, girTime) -- needed?
				g = AddGear(x+30, y, gtGrenade, 0, 0, 0, girTime)
				g = AddGear(x+45, y, gtGrenade, 0, 0, 0, girTime) -- needed?
	elseif rot == 5 then ------- diag
				g = AddGear(x+45, y+45, gtGrenade, 0, 0, 0, girTime) --n
				g = AddGear(x+30, y+30, gtGrenade, 0, 0, 0, girTime)
				g = AddGear(x, y, gtGrenade, 0, 0, 0, girTime) -- needed?
				g = AddGear(x-30, y-30, gtGrenade, 0, 0, 0, girTime)
				g = AddGear(x-45, y-45, gtGrenade, 0, 0, 0, girTime) --n
	elseif rot == 6 then
				g = AddGear(x, y-45, gtGrenade, 0, 0, 0, girTime) -- needed?
				g = AddGear(x, y+30, gtGrenade, 0, 0, 0, girTime)
				g = AddGear(x, y, gtGrenade, 0, 0, 0, girTime) -- needed?
				g = AddGear(x, y-30, gtGrenade, 0, 0, 0, girTime)
				g = AddGear(x, y+45, gtGrenade, 0, 0, 0, girTime) -- needed?
	elseif rot == 7 then -------
				g = AddGear(x+45, y-45, gtGrenade, 0, 0, 0, girTime) --n
				g = AddGear(x+30, y-30, gtGrenade, 0, 0, 0, girTime)
				g = AddGear(x, y, gtGrenade, 0, 0, 0, girTime) -- needed?
				g = AddGear(x-30, y+30, gtGrenade, 0, 0, 0, girTime)
				g = AddGear(x-45, y+45, gtGrenade, 0, 0, 0, girTime) --n
	end
end

function RemoveGear(gear)
	if (isATrackedGear(gear) == true) and (GetGearType(gear) ~= gtHedgehog) then
		DeleteGear(gear)
	end
end

function ClearMap()

	runOnGears(RemoveGear)

end

function HandleFreshMapCreation()

	-- the boom stage, boom girders, reset ammo, and delete other map objects
	if activationStage == 1 then


		ClearMap()
		activationStage = activationStage + 1

	-- the creation stage, place girders and needed gears, grant ammo
	elseif activationStage == 2 then

		-- these are from onParameters()
		if mapID == "0" then
			--AddCaption("don't load any map")
		elseif mapID == "1" then

			--testmap1
			------ GIRDER LIST ------
			PlaceSprite(306, 530, sprAmGirder, 7, lfNormal)
			PlaceSprite(451, 474, sprAmGirder, 4, lfNormal)
			PlaceSprite(595, 531, sprAmGirder, 5, lfNormal)
			PlaceSprite(245, 679, sprAmGirder, 6, lfNormal)
			PlaceSprite(305, 822, sprAmGirder, 5, lfNormal)
			PlaceSprite(449, 887, sprAmGirder, 4, lfNormal)
			PlaceSprite(593, 825, sprAmGirder, 7, lfNormal)
			PlaceSprite(657, 681, sprAmGirder, 6, lfNormal)
			PlaceSprite(1063, 682, sprAmGirder, 6, lfNormal)
			PlaceSprite(1121, 532, sprAmGirder, 7, lfNormal)
			PlaceSprite(1266, 476, sprAmGirder, 4, lfNormal)
			PlaceSprite(1411, 535, sprAmGirder, 5, lfNormal)
			PlaceSprite(1472, 684, sprAmGirder, 6, lfNormal)
			PlaceSprite(1415, 828, sprAmGirder, 7, lfNormal)
			PlaceSprite(1271, 892, sprAmGirder, 4, lfNormal)
			PlaceSprite(1126, 827, sprAmGirder, 5, lfNormal)
			PlaceSprite(841, 1079, sprAmGirder, 4, lfNormal)
			PlaceSprite(709, 1153, sprAmGirder, 7, lfNormal)
			PlaceSprite(975, 1154, sprAmGirder, 5, lfNormal)
			PlaceSprite(653, 1265, sprAmGirder, 2, lfNormal)
			PlaceSprite(1021, 1266, sprAmGirder, 2, lfNormal)
			PlaceSprite(713, 1369, sprAmGirder, 5, lfNormal)
			PlaceSprite(960, 1371, sprAmGirder, 7, lfNormal)
			PlaceSprite(835, 1454, sprAmGirder, 4, lfNormal)
			PlaceSprite(185, 1617, sprAmGirder, 2, lfNormal)
			PlaceSprite(1317, 1399, sprAmGirder, 2, lfNormal)
			PlaceSprite(1711, 1811, sprAmGirder, 2, lfNormal)
			PlaceSprite(2087, 1424, sprAmGirder, 2, lfNormal)
			PlaceSprite(2373, 1804, sprAmGirder, 2, lfNormal)
			PlaceSprite(2646, 1434, sprAmGirder, 2, lfNormal)
			PlaceSprite(1876, 667, sprAmGirder, 6, lfNormal)
			PlaceSprite(1934, 517, sprAmGirder, 7, lfNormal)
			PlaceSprite(2079, 461, sprAmGirder, 4, lfNormal)
			PlaceSprite(2224, 519, sprAmGirder, 5, lfNormal)
			PlaceSprite(1935, 810, sprAmGirder, 5, lfNormal)
			PlaceSprite(2080, 875, sprAmGirder, 4, lfNormal)
			PlaceSprite(2224, 811, sprAmGirder, 7, lfNormal)
			PlaceSprite(2370, 582, sprAmGirder, 4, lfNormal)
			PlaceSprite(2370, 759, sprAmGirder, 4, lfNormal)
			PlaceSprite(2530, 582, sprAmGirder, 4, lfNormal)
			PlaceSprite(2690, 582, sprAmGirder, 4, lfNormal)
			PlaceSprite(2530, 759, sprAmGirder, 4, lfNormal)
			PlaceSprite(2690, 759, sprAmGirder, 4, lfNormal)
			PlaceSprite(2836, 634, sprAmGirder, 5, lfNormal)
			PlaceSprite(2835, 822, sprAmGirder, 5, lfNormal)
			PlaceSprite(2951, 751, sprAmGirder, 5, lfNormal)
			PlaceSprite(2950, 939, sprAmGirder, 5, lfNormal)
			PlaceSprite(2964, 1054, sprAmGirder, 7, lfNormal)
			PlaceSprite(2978, 1172, sprAmGirder, 5, lfNormal)
			PlaceSprite(3095, 1185, sprAmGirder, 7, lfNormal)
			PlaceSprite(3211, 1069, sprAmGirder, 7, lfNormal)
			PlaceSprite(3038, 843, sprAmGirder, 1, lfNormal)
			PlaceSprite(3126, 825, sprAmGirder, 7, lfNormal)
			PlaceSprite(3271, 768, sprAmGirder, 4, lfNormal)
			PlaceSprite(3357, 1014, sprAmGirder, 4, lfNormal)
			PlaceSprite(3416, 826, sprAmGirder, 5, lfNormal)
			PlaceSprite(3454, 969, sprAmGirder, 6, lfNormal)
			PlaceSprite(3439, 369, sprAmGirder, 6, lfNormal)
			PlaceSprite(3500, 220, sprAmGirder, 7, lfNormal)
			PlaceSprite(3502, 513, sprAmGirder, 5, lfNormal)
			PlaceSprite(3646, 162, sprAmGirder, 4, lfNormal)
			PlaceSprite(3791, 224, sprAmGirder, 5, lfNormal)
			PlaceSprite(3851, 374, sprAmGirder, 6, lfNormal)
			PlaceSprite(3792, 518, sprAmGirder, 7, lfNormal)
			PlaceSprite(3994, 1731, sprAmGirder, 7, lfNormal)
			PlaceSprite(3877, 1848, sprAmGirder, 7, lfNormal)
			PlaceSprite(3789, 1942, sprAmGirder, 3, lfNormal)
			PlaceSprite(3986, 1929, sprAmGirder, 2, lfNormal)
			PlaceSprite(2837, 1937, sprAmGirder, 4, lfNormal)
			PlaceSprite(2997, 1938, sprAmGirder, 4, lfNormal)
			PlaceSprite(3157, 1938, sprAmGirder, 4, lfNormal)
			PlaceSprite(1152, 1844, sprAmGirder, 4, lfNormal)
			PlaceSprite(1299, 1898, sprAmGirder, 5, lfNormal)
			PlaceSprite(1005, 1900, sprAmGirder, 7, lfNormal)
			PlaceSprite(3578, 575, sprAmGirder, 6, lfNormal)
			PlaceSprite(3714, 576, sprAmGirder, 6, lfNormal)
			PlaceSprite(3579, 740, sprAmGirder, 6, lfNormal)
			PlaceSprite(3714, 741, sprAmGirder, 6, lfNormal)
			PlaceSprite(3580, 903, sprAmGirder, 6, lfNormal)
			PlaceSprite(3715, 904, sprAmGirder, 6, lfNormal)
			PlaceSprite(3552, 452, sprAmGirder, 1, lfNormal)
			PlaceSprite(3528, 370, sprAmGirder, 2, lfNormal)
			PlaceSprite(3568, 297, sprAmGirder, 3, lfNormal)
			PlaceSprite(3736, 455, sprAmGirder, 3, lfNormal)
			PlaceSprite(3757, 378, sprAmGirder, 2, lfNormal)
			PlaceSprite(3725, 299, sprAmGirder, 1, lfNormal)
			PlaceSprite(3646, 261, sprAmGirder, 0, lfNormal)
			PlaceSprite(3648, 997, sprAmGirder, 4, lfNormal)
			PlaceSprite(3649, 1275, sprAmGirder, 2, lfNormal)
			PlaceSprite(3514, 1750, sprAmGirder, 0, lfNormal)

			------ RUBBER BAND LIST ------

			------ LAND SPRITE LIST ------

			------ HEALTH CRATE LIST ------

			------ AMMO CRATE LIST ------
			tempG = SpawnAmmoCrate(1707, 1755, amBazooka)
			tempG = SpawnAmmoCrate(3983, 1873, amBazooka)
			tempG = SpawnAmmoCrate(184, 1561, amBazooka)
			tempG = SpawnAmmoCrate(2644, 1378, amBazooka)
			tempG = SpawnAmmoCrate(2914, 865, amBazooka)

			------ MINE LIST ------
			SetTimer(AddGear(2340, 580, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2399, 580, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2448, 580, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2517, 579, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2575, 581, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2647, 582, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2720, 582, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2760, 581, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2331, 757, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2409, 758, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2477, 758, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2545, 759, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2613, 760, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2679, 758, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2744, 757, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2813, 610, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2855, 650, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2887, 686, gtMine, 0, 0, 0, 0), 1)

		elseif mapID == "2" then

			-- land flags test map
			------ GIRDER LIST ------
			PlaceSprite(335, 622, sprAmGirder, 16,16384)
			PlaceSprite(474, 569, sprAmGirder, 13,16384)
			PlaceSprite(343, 748, sprAmGirder, 14,16384)
			PlaceSprite(466, 756, sprAmGirder, 16,16384)
			PlaceSprite(609, 702, sprAmGirder, 13,16384)
			PlaceSprite(635, 570, sprAmGirder, 13,16384)
			PlaceSprite(770, 702, sprAmGirder, 13,16384)
			PlaceSprite(960, 730, sprAmGirder, 18,2048)
			PlaceSprite(1061, 608, sprAmGirder, 16,16384)
			PlaceSprite(1207, 552, sprAmGirder, 13,16384)
			PlaceSprite(1205, 409, sprAmGirder, 13,16384)
			PlaceSprite(2312, 637, sprAmGirder, 6,0)
			PlaceSprite(2312, 472, sprAmGirder, 6,0)
			PlaceSprite(2311, 308, sprAmGirder, 6,0)
			PlaceSprite(2292, 155, sprAmGirder, 6,0)
			PlaceSprite(727, 611, sprAmGirder, 6,0)
			PlaceSprite(1298, 480, sprAmGirder, 6,0)

			------ RUBBER BAND LIST ------
			PlaceSprite(1411, 625, sprAmRubber, 1, lfBouncy)
			PlaceSprite(1525, 739, sprAmRubber, 1, lfBouncy)
			PlaceSprite(1638, 852, sprAmRubber, 1, lfBouncy)
			PlaceSprite(1754, 963, sprAmRubber, 1, lfBouncy)
			PlaceSprite(1870, 1076, sprAmRubber, 1, lfBouncy)
			PlaceSprite(2013, 1131, sprAmRubber, 0, lfBouncy)
			PlaceSprite(2159, 1070, sprAmRubber, 3, lfBouncy)
			PlaceSprite(2268, 952, sprAmRubber, 3, lfBouncy)
			PlaceSprite(2315, 802, sprAmRubber, 2, lfBouncy)

			------ AMMO CRATE LIST ------
			tempG = SpawnAmmoCrate(472, 711, amBazooka)

			tempG = SpawnUtilityCrate(540, 660, amParachute)

			tempG = SpawnAmmoCrate(1155, 528, amBazooka)

			------ UTILITY CRATE LIST ------
			tempG = SpawnUtilityCrate(2006, 1102, amRope)

		else



			-- first test epic multi map
			------ GIRDER LIST ------
			PlaceSprite(430, 1871, sprAmGirder, 2, lfNormal)
			PlaceSprite(1249, 1914, sprAmGirder, 4, lfNormal)
			PlaceSprite(1394, 1849, sprAmGirder, 7, lfNormal)
			PlaceSprite(1522, 1848, sprAmGirder, 5, lfNormal)
			PlaceSprite(1578, 1959, sprAmGirder, 2, lfNormal)
			PlaceSprite(1545, 2011, sprAmGirder, 0, lfNormal)
			PlaceSprite(430, 1749, sprAmGirder, 6, lfNormal)
			PlaceSprite(430, 1589, sprAmGirder, 6, lfNormal)
			PlaceSprite(358, 1499, sprAmGirder, 4, lfNormal)
			PlaceSprite(198, 1499, sprAmGirder, 4, lfNormal)
			PlaceSprite(72, 1571, sprAmGirder, 7, lfNormal)
			PlaceSprite(339, 1618, sprAmGirder, 4, lfNormal)
			PlaceSprite(520, 1499, sprAmGirder, 4, lfNormal)
			PlaceSprite(680, 1499, sprAmGirder, 4, lfNormal)
			PlaceSprite(839, 1499, sprAmGirder, 4, lfNormal)
			PlaceSprite(1000, 1499, sprAmGirder, 4, lfNormal)
			PlaceSprite(1404, 1730, sprAmGirder, 5, lfNormal)
			PlaceSprite(1288, 1613, sprAmGirder, 5, lfNormal)
			PlaceSprite(1200, 1529, sprAmGirder, 1, lfNormal)
			PlaceSprite(1125, 1495, sprAmGirder, 0, lfNormal)
			PlaceSprite(1667, 2011, sprAmGirder, 4, lfNormal)
			PlaceSprite(1812, 1951, sprAmGirder, 7, lfNormal)
			PlaceSprite(1964, 2024, sprAmGirder, 0, lfNormal)
			PlaceSprite(1957, 1892, sprAmGirder, 4, lfNormal)
			PlaceSprite(2103, 1949, sprAmGirder, 5, lfNormal)
			PlaceSprite(2242, 2017, sprAmGirder, 4, lfNormal)
			PlaceSprite(2404, 2017, sprAmGirder, 4, lfNormal)
			PlaceSprite(2548, 1955, sprAmGirder, 7, lfNormal)
			PlaceSprite(2635, 1871, sprAmGirder, 3, lfNormal)
			PlaceSprite(2749, 1836, sprAmGirder, 4, lfNormal)
			PlaceSprite(2751, 1999, sprAmGirder, 2, lfNormal)
			PlaceSprite(2749, 1947, sprAmGirder, 0, lfNormal)
			PlaceSprite(2865, 1870, sprAmGirder, 1, lfNormal)
			PlaceSprite(2954, 1954, sprAmGirder, 5, lfNormal)
			PlaceSprite(3061, 2017, sprAmGirder, 0, lfNormal)
			PlaceSprite(3137, 1984, sprAmGirder, 3, lfNormal)
			PlaceSprite(3169, 1864, sprAmGirder, 6, lfNormal)
			PlaceSprite(3169, 1702, sprAmGirder, 6, lfNormal)
			PlaceSprite(3170, 1540, sprAmGirder, 6, lfNormal)
			PlaceSprite(3170, 1418, sprAmGirder, 2, lfNormal)
			PlaceSprite(3138, 1339, sprAmGirder, 1, lfNormal)
			PlaceSprite(3107, 1260, sprAmGirder, 2, lfNormal)
			PlaceSprite(3153, 1194, sprAmGirder, 3, lfNormal)
			PlaceSprite(3230, 1163, sprAmGirder, 0, lfNormal)
			PlaceSprite(3305, 1201, sprAmGirder, 1, lfNormal)
			PlaceSprite(3334, 1277, sprAmGirder, 2, lfNormal)
			PlaceSprite(3227, 1540, sprAmGirder, 6, lfNormal)
			PlaceSprite(3228, 1419, sprAmGirder, 2, lfNormal)
			PlaceSprite(3334, 1358, sprAmGirder, 2, lfNormal)
			PlaceSprite(3280, 1387, sprAmGirder, 0, lfNormal)
			PlaceSprite(3227, 1702, sprAmGirder, 6, lfNormal)
			PlaceSprite(3227, 1864, sprAmGirder, 6, lfNormal)
			PlaceSprite(3253, 1981, sprAmGirder, 1, lfNormal)
			PlaceSprite(3366, 2017, sprAmGirder, 4, lfNormal)
			PlaceSprite(3528, 2018, sprAmGirder, 4, lfNormal)
			PlaceSprite(3689, 2018, sprAmGirder, 4, lfNormal)
			PlaceSprite(246, 1262, sprAmGirder, 4, lfNormal)
			PlaceSprite(407, 1262, sprAmGirder, 4, lfNormal)
			PlaceSprite(568, 1262, sprAmGirder, 4, lfNormal)
			PlaceSprite(731, 1262, sprAmGirder, 4, lfNormal)
			PlaceSprite(894, 1261, sprAmGirder, 4, lfNormal)
			PlaceSprite(1056, 1261, sprAmGirder, 4, lfNormal)
			PlaceSprite(1179, 1262, sprAmGirder, 0, lfNormal)
			PlaceSprite(1288, 1314, sprAmGirder, 5, lfNormal)
			PlaceSprite(1406, 1433, sprAmGirder, 5, lfNormal)
			PlaceSprite(1525, 1549, sprAmGirder, 5, lfNormal)
			PlaceSprite(1642, 1666, sprAmGirder, 5, lfNormal)
			PlaceSprite(1749, 1728, sprAmGirder, 0, lfNormal)
			PlaceSprite(1956, 1802, sprAmGirder, 6, lfNormal)
			PlaceSprite(1956, 1640, sprAmGirder, 6, lfNormal)
			PlaceSprite(1782, 1638, sprAmGirder, 6, lfNormal)
			PlaceSprite(1835, 1487, sprAmGirder, 7, lfNormal)
			PlaceSprite(1942, 1430, sprAmGirder, 0, lfNormal)
			PlaceSprite(2051, 1486, sprAmGirder, 5, lfNormal)
			PlaceSprite(2109, 1639, sprAmGirder, 6, lfNormal)
			PlaceSprite(2177, 1778, sprAmGirder, 5, lfNormal)
			PlaceSprite(2323, 1840, sprAmGirder, 4, lfNormal)
			PlaceSprite(49, 1029, sprAmGirder, 0, lfNormal)
			PlaceSprite(499, 1172, sprAmGirder, 6, lfNormal)
			PlaceSprite(527, 1054, sprAmGirder, 3, lfNormal)
			PlaceSprite(604, 1026, sprAmGirder, 0, lfNormal)
			PlaceSprite(680, 1056, sprAmGirder, 1, lfNormal)
			PlaceSprite(719, 1168, sprAmGirder, 6, lfNormal)
			PlaceSprite(89, 728, sprAmGirder, 4, lfNormal)
			PlaceSprite(251, 728, sprAmGirder, 4, lfNormal)
			PlaceSprite(412, 728, sprAmGirder, 4, lfNormal)
			PlaceSprite(572, 728, sprAmGirder, 4, lfNormal)
			PlaceSprite(733, 728, sprAmGirder, 4, lfNormal)
			PlaceSprite(894, 728, sprAmGirder, 4, lfNormal)
			PlaceSprite(1016, 728, sprAmGirder, 0, lfNormal)
			PlaceSprite(1067, 799, sprAmGirder, 6, lfNormal)
			PlaceSprite(1139, 891, sprAmGirder, 4, lfNormal)
			PlaceSprite(1067, 1171, sprAmGirder, 6, lfNormal)
			PlaceSprite(1067, 1049, sprAmGirder, 2, lfNormal)
			PlaceSprite(1136, 999, sprAmGirder, 4, lfNormal)
			PlaceSprite(1005, 854, sprAmGirder, 2, lfNormal)
			PlaceSprite(972, 803, sprAmGirder, 0, lfNormal)
			PlaceSprite(920, 780, sprAmGirder, 2, lfNormal)
			PlaceSprite(891, 1206, sprAmGirder, 2, lfNormal)
			PlaceSprite(887, 1150, sprAmGirder, 0, lfNormal)
			PlaceSprite(3018, 1311, sprAmGirder, 4, lfNormal)
			PlaceSprite(2871, 1369, sprAmGirder, 7, lfNormal)
			PlaceSprite(2809, 1523, sprAmGirder, 6, lfNormal)
			PlaceSprite(2809, 1647, sprAmGirder, 2, lfNormal)
			PlaceSprite(2469, 1777, sprAmGirder, 7, lfNormal)
			PlaceSprite(2612, 1715, sprAmGirder, 4, lfNormal)
			PlaceSprite(2809, 1702, sprAmGirder, 0, lfNormal)
			PlaceSprite(2727, 1694, sprAmGirder, 0, lfNormal)

			PlaceSprite(3334, 1481, sprAmGirder, 6, lfNormal)
			PlaceSprite(3334, 1643, sprAmGirder, 6, lfNormal)
			PlaceSprite(3334, 1804, sprAmGirder, 6, lfNormal)
			PlaceSprite(3403, 1940, sprAmGirder, 5, lfNormal)
			PlaceSprite(1120, 944, sprAmGirder, 2, lfNormal)
			PlaceSprite(1163, 945, sprAmGirder, 2, lfNormal)
			PlaceSprite(1141, 781, sprAmGirder, 5, lfNormal)
			PlaceSprite(81, 629, sprAmGirder, 1, lfNormal)
			PlaceSprite(102, 498, sprAmGirder, 3, lfNormal)
			PlaceSprite(81, 373, sprAmGirder, 1, lfNormal)
			PlaceSprite(179, 453, sprAmGirder, 6, lfNormal)
			PlaceSprite(100, 260, sprAmGirder, 3, lfNormal)
			PlaceSprite(179, 330, sprAmGirder, 2, lfNormal)
			PlaceSprite(249, 544, sprAmGirder, 4, lfNormal)
			PlaceSprite(410, 545, sprAmGirder, 4, lfNormal)
			PlaceSprite(571, 543, sprAmGirder, 4, lfNormal)
			PlaceSprite(731, 543, sprAmGirder, 4, lfNormal)
			PlaceSprite(891, 544, sprAmGirder, 4, lfNormal)
			PlaceSprite(1014, 544, sprAmGirder, 0, lfNormal)
			PlaceSprite(1779, 1321, sprAmGirder, 6, lfNormal)
			PlaceSprite(1779, 1159, sprAmGirder, 6, lfNormal)
			PlaceSprite(1779, 997, sprAmGirder, 6, lfNormal)
			PlaceSprite(1779, 836, sprAmGirder, 6, lfNormal)
			PlaceSprite(1722, 684, sprAmGirder, 5, lfNormal)
			PlaceSprite(1137, 545, sprAmGirder, 4, lfNormal)
			PlaceSprite(1298, 545, sprAmGirder, 4, lfNormal)
			PlaceSprite(1460, 546, sprAmGirder, 4, lfNormal)
			PlaceSprite(1608, 600, sprAmGirder, 5, lfNormal)
			PlaceSprite(1508, 1005, sprAmGirder, 4, lfNormal)
			PlaceSprite(160, 246, sprAmGirder, 1, lfNormal)
			PlaceSprite(1821, 1356, sprAmGirder, 3, lfNormal)
			PlaceSprite(1938, 1323, sprAmGirder, 4, lfNormal)
			PlaceSprite(2086, 1381, sprAmGirder, 5, lfNormal)
			PlaceSprite(4004, 2018, sprAmGirder, 4, lfNormal)
			PlaceSprite(3934, 1926, sprAmGirder, 6, lfNormal)
			PlaceSprite(3965, 1835, sprAmGirder, 0, lfNormal)
			PlaceSprite(4015, 1763, sprAmGirder, 6, lfNormal)
			PlaceSprite(4015, 1603, sprAmGirder, 6, lfNormal)
			PlaceSprite(4015, 1442, sprAmGirder, 6, lfNormal)
			PlaceSprite(4015, 1280, sprAmGirder, 6, lfNormal)
			PlaceSprite(4014, 1118, sprAmGirder, 6, lfNormal)
			PlaceSprite(4014, 956, sprAmGirder, 6, lfNormal)
			PlaceSprite(4014, 793, sprAmGirder, 6, lfNormal)
			PlaceSprite(4014, 632, sprAmGirder, 6, lfNormal)
			PlaceSprite(4014, 469, sprAmGirder, 6, lfNormal)
			PlaceSprite(3981, 351, sprAmGirder, 1, lfNormal)
			PlaceSprite(3985, 204, sprAmGirder, 3, lfNormal)
			PlaceSprite(4045, 156, sprAmGirder, 0, lfNormal)
			PlaceSprite(3667, 344, sprAmGirder, 0, lfNormal)
			PlaceSprite(4016, 1925, sprAmGirder, 6, lfNormal)
			PlaceSprite(3998, 1926, sprAmGirder, 6, lfNormal)
			PlaceSprite(3980, 1925, sprAmGirder, 6, lfNormal)
			PlaceSprite(3957, 1926, sprAmGirder, 6, lfNormal)
			PlaceSprite(3843, 1832, sprAmGirder, 4, lfNormal)
			PlaceSprite(3682, 1832, sprAmGirder, 4, lfNormal)
			PlaceSprite(3561, 1833, sprAmGirder, 0, lfNormal)
			PlaceSprite(3484, 1796, sprAmGirder, 1, lfNormal)
			PlaceSprite(3455, 1675, sprAmGirder, 6, lfNormal)
			PlaceSprite(3455, 1513, sprAmGirder, 6, lfNormal)
			PlaceSprite(3455, 1351, sprAmGirder, 6, lfNormal)
			PlaceSprite(1601, 476, sprAmGirder, 7, lfNormal)
			PlaceSprite(1706, 421, sprAmGirder, 0, lfNormal)
			PlaceSprite(1888, 366, sprAmGirder, 6, lfNormal)

			PlaceSprite(3997, 1743, sprAmGirder, 6, lfNormal)
			PlaceSprite(3979, 1742, sprAmGirder, 6, lfNormal)
			PlaceSprite(3962, 1741, sprAmGirder, 6, lfNormal)
			PlaceSprite(3943, 1741, sprAmGirder, 6, lfNormal)
			PlaceSprite(2199, 393, sprAmGirder, 7, lfNormal)
			PlaceSprite(2304, 337, sprAmGirder, 0, lfNormal)
			PlaceSprite(2409, 392, sprAmGirder, 5, lfNormal)
			PlaceSprite(2470, 502, sprAmGirder, 2, lfNormal)
			PlaceSprite(2412, 606, sprAmGirder, 7, lfNormal)
			PlaceSprite(2308, 673, sprAmGirder, 0, lfNormal)
			PlaceSprite(2202, 612, sprAmGirder, 5, lfNormal)
			PlaceSprite(2138, 507, sprAmGirder, 2, lfNormal)
			PlaceSprite(2739, 378, sprAmGirder, 7, lfNormal)
			PlaceSprite(2847, 322, sprAmGirder, 0, lfNormal)
			PlaceSprite(2953, 378, sprAmGirder, 5, lfNormal)
			PlaceSprite(2680, 489, sprAmGirder, 2, lfNormal)
			PlaceSprite(3012, 489, sprAmGirder, 2, lfNormal)
			PlaceSprite(2736, 594, sprAmGirder, 5, lfNormal)
			PlaceSprite(2841, 657, sprAmGirder, 0, lfNormal)
			PlaceSprite(2949, 594, sprAmGirder, 7, lfNormal)
			PlaceSprite(2448, 837, sprAmGirder, 7, lfNormal)
			PlaceSprite(2594, 779, sprAmGirder, 4, lfNormal)
			PlaceSprite(2739, 836, sprAmGirder, 5, lfNormal)
			PlaceSprite(2390, 950, sprAmGirder, 2, lfNormal)
			PlaceSprite(2789, 950, sprAmGirder, 2, lfNormal)
			PlaceSprite(2593, 904, sprAmGirder, 4, lfNormal)
			PlaceSprite(2727, 1056, sprAmGirder, 7, lfNormal)
			PlaceSprite(2452, 1058, sprAmGirder, 5, lfNormal)
			PlaceSprite(2510, 1215, sprAmGirder, 6, lfNormal)
			PlaceSprite(2663, 1208, sprAmGirder, 6, lfNormal)
			PlaceSprite(2510, 1378, sprAmGirder, 6, lfNormal)
			PlaceSprite(2664, 1369, sprAmGirder, 6, lfNormal)
			PlaceSprite(300, 275, sprAmGirder, 0, lfNormal)
			PlaceSprite(439, 274, sprAmGirder, 0, lfNormal)
			PlaceSprite(628, 273, sprAmGirder, 4, lfNormal)
			PlaceSprite(811, 271, sprAmGirder, 0, lfNormal)
			PlaceSprite(737, 373, sprAmGirder, 4, lfNormal)
			PlaceSprite(934, 440, sprAmGirder, 0, lfNormal)
			PlaceSprite(1075, 439, sprAmGirder, 0, lfNormal)
			PlaceSprite(1209, 438, sprAmGirder, 0, lfNormal)
			PlaceSprite(1383, 439, sprAmGirder, 4, lfNormal)
			--PlaceSprite(2159, 1525, sprAmGirder, 6, lfNormal)
			PlaceSprite(3547, 344, sprAmGirder, 4, lfNormal)
			PlaceSprite(3584, 254, sprAmGirder, 6, lfNormal)
			PlaceSprite(3508, 132, sprAmGirder, 5, lfNormal)
			PlaceSprite(3335, 1117, sprAmGirder, 6, lfNormal)
			PlaceSprite(3335, 956, sprAmGirder, 6, lfNormal)
			PlaceSprite(3335, 795, sprAmGirder, 6, lfNormal)
			PlaceSprite(3335, 634, sprAmGirder, 6, lfNormal)
			PlaceSprite(3335, 513, sprAmGirder, 2, lfNormal)
			PlaceSprite(3401, 404, sprAmGirder, 7, lfNormal)
			PlaceSprite(3455, 1190, sprAmGirder, 6, lfNormal)
			PlaceSprite(3455, 1029, sprAmGirder, 6, lfNormal)
			PlaceSprite(3455, 868, sprAmGirder, 6, lfNormal)
			PlaceSprite(3455, 705, sprAmGirder, 6, lfNormal)
			PlaceSprite(3455, 582, sprAmGirder, 2, lfNormal)
			PlaceSprite(3485, 503, sprAmGirder, 3, lfNormal)
			PlaceSprite(3601, 475, sprAmGirder, 4, lfNormal)
			PlaceSprite(3719, 444, sprAmGirder, 3, lfNormal)
			PlaceSprite(3094, 828, sprAmGirder, 5, lfNormal)
			PlaceSprite(2064, 947, sprAmGirder, 7, lfNormal)
			PlaceSprite(1826, 512, sprAmGirder, 7, lfNormal)

			PlaceSprite(3420, 49, sprAmGirder, 1, lfNormal)
			PlaceSprite(410, 682, sprAmGirder, 3, lfNormal)
			PlaceSprite(528, 653, sprAmGirder, 4, lfNormal)
			PlaceSprite(688, 653, sprAmGirder, 4, lfNormal)
			PlaceSprite(805, 684, sprAmGirder, 1, lfNormal)
			PlaceSprite(528, 672, sprAmGirder, 4, lfNormal)
			PlaceSprite(688, 672, sprAmGirder, 4, lfNormal)
			PlaceSprite(500, 696, sprAmGirder, 4, lfNormal)
			PlaceSprite(701, 696, sprAmGirder, 4, lfNormal)

			------ AMMO CRATE LIST ------
			tempG = SpawnAmmoCrate(889, 1126, amBaseballBat)

			tempG = SpawnAmmoCrate(1211, 975, amSineGun)
			tempG = SpawnAmmoCrate(3619, 451, amFirePunch)

			------ UTILITY CRATE LIST ------
			tempG = SpawnUtilityCrate(304, 1594, amRope)
			tempG = SpawnUtilityCrate(1538, 1987, amJetpack)
			tempG = SpawnUtilityCrate(1958, 2000, amExtraTime)
			tempG = SpawnUtilityCrate(2744, 1923, amJetpack)
			tempG = SpawnUtilityCrate(3283, 1363, amParachute)
			tempG = SpawnUtilityCrate(2749, 1812, amRope)
			tempG = SpawnUtilityCrate(970, 779, amJetpack)

			tempG = SpawnUtilityCrate(3284, 1332, amExtraTime)
			tempG = SpawnUtilityCrate(1082, 975, amBlowTorch)
			tempG = SpawnUtilityCrate(1547, 981, amJetpack)
			tempG = SpawnUtilityCrate(1707, 397, amRope)
			tempG = SpawnUtilityCrate(2309, 649, amExtraTime)
			tempG = SpawnUtilityCrate(1116, 867, amExtraTime)

			------ AMMO CRATE LIST ------
			tempG = SpawnAmmoCrate(2559, 880, amBazooka)
			tempG = SpawnAmmoCrate(2630, 880, amBazooka)
			tempG = SpawnAmmoCrate(1951, 1406, amGrenade)

			------ UTILITY CRATE LIST ------
			tempG = SpawnUtilityCrate(3536, 320, amBlowTorch)
			tempG = SpawnUtilityCrate(3582, 1994, amJetpack)
			tempG = SpawnUtilityCrate(682, 349, amExtraTime)
			tempG = SpawnUtilityCrate(2842, 633, amExtraTime)

			------ BARREL LIST ------
			SetHealth(AddGear(506, 1034, gtExplosives, 0, 0, 0, 0), 1)
			SetHealth(AddGear(556, 1002, gtExplosives, 0, 0, 0, 0), 1)
			SetHealth(AddGear(615, 1002, gtExplosives, 0, 0, 0, 0), 1)
			SetHealth(AddGear(676, 1010, gtExplosives, 0, 0, 0, 0), 1)
			SetHealth(AddGear(716, 1050, gtExplosives, 0, 0, 0, 0), 1)
			SetHealth(AddGear(67, 1005, gtExplosives, 0, 0, 0, 0), 50)

			------ MINE LIST ------
			SetTimer(AddGear(1187, 1908, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1235, 1908, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1283, 1908, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1323, 1908, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1361, 1875, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1399, 1837, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1426, 1810, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(234, 1493, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(308, 1493, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(377, 1493, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(460, 1493, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(550, 1493, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(633, 1493, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(722, 1493, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(795, 1493, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(881, 1493, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(975, 1493, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1060, 1493, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1127, 1489, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1207, 1526, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1261, 1580, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1315, 1634, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1372, 1692, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1416, 1736, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1465, 1792, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1518, 1838, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1566, 1886, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1623, 2005, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1686, 2005, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1799, 1957, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1839, 1917, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1902, 1886, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1933, 1886, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2076, 1916, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2138, 1978, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2221, 2011, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2305, 2011, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2390, 2011, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2578, 1918, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(2494, 2002, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1758, 1728, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1683, 1707, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1635, 1657, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1572, 1596, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1517, 1542, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1447, 1477, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1401, 1432, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1338, 1365, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1290, 1310, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1230, 1266, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1149, 1260, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1054, 1257, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(978, 1257, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(895, 1258, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(819, 1257, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(753, 1258, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(671, 1260, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(599, 1260, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(526, 1259, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(466, 1259, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(408, 1261, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(336, 1260, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(290, 1259, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(218, 1260, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1777, 1263, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1776, 1198, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1778, 1141, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1781, 1078, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1778, 1027, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1778, 985, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1779, 925, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(1777, 882, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(4052, 2010, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(3965, 226, gtMine, 0, 0, 0, 0), 1)
			SetTimer(AddGear(3962, 326, gtMine, 0, 0, 0, 0), 1)

				------ STICKY MINE LIST ------
			tempG = AddGear(3170, 1907, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3170, 1860, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3169, 1809, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3170, 1761, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3170, 1711, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3172, 1668, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3170, 1624, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3169, 1579, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3171, 1526, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3168, 1469, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3171, 1418, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3227, 1416, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3226, 1465, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3225, 1523, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3224, 1576, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3225, 1624, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3228, 1667, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3228, 1707, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3230, 1757, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3228, 1803, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3229, 1856, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3228, 1910, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(258, 534, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(329, 534, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(410, 535, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(482, 535, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(565, 533, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(670, 533, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(763, 533, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(858, 534, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(917, 534, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(1012, 534, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(1147, 535, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(1102, 535, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(1220, 535, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(1293, 535, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(1368, 535, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(1440, 536, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(223, 534, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(814, 534, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3909, 1822, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3867, 1822, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3824, 1822, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3784, 1822, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3732, 1822, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3682, 1822, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3627, 1822, gtSMine, 0, 0, 0, 0)
			tempG = AddGear(3557, 1823, gtSMine, 0, 0, 0, 0)
		end


		activationStage = 200

		--runOnHogs(RestoreHog)

	end

end

function TryRepositionHogs()

        if MapHasBorder() == true then

                for i = 0, (numhhs-1) do
                        if hhs[i] ~= nil then
                                SetGearPosition(hhs[i],GetX(hhs[i]), TopY-10)
                        end
                end

        end

end

----------------------------------
-- GAME METHODS / EVENT HANDLERS
----------------------------------

function onParameters()
    parseParams()
	mapID = params["m"]
end

function onPreviewInit()
	onGameInit()
end

function onGameInit()

		Theme = "Cave"

		MapGen = mgDrawn
		TemplateFilter = 0

		EnableGameFlags(gfInfAttack, gfDisableWind)
		DisableGameFlags(gfSolidLand)
		CaseFreq = 0
        TurnTime = 90000
        WaterRise = 0

		for x = 1, 16 do
			AddPoint(x*100,100,5)
		end

		FlushPoints()

end

function limitHogs(gear)

	cnthhs = cnthhs + 1
	if cnthhs > 1 then
		DeleteGear(gear)
    end

end

function onGameStart()


		trackTeams()

		roundN = 0
        lastRound = TotalRounds
        RoundHasChanged = false -- true

        for i = 0, (specialPointsCount-1) do
                PlaceWayPoint(specialPointsX[i], specialPointsY[i])
        end

        RebuildTeamInfo()

		for i=0 , TeamsCount - 1 do
			cnthhs = 0
			runOnHogsInTeam(limitHogs, teamNameArr[i])
		end

        ShowMission     (
                                loc("RACER"),
                                loc("a Hedgewars mini-game"),

                                loc("Build a track and race.") .. "|" ..
                                loc("Round Limit:") .. " " .. roundLimit .. "|" ..

                                "", 4, 4000
                                )

        TryRepositionHogs()

end

function PlaceWayPoint(x,y)
    if not racerActive then
        if wpCount == 0 or wpX[wpCount - 1] ~= x or wpY[wpCount - 1] ~= y then

            wpX[wpCount] = x
            wpY[wpCount] = y
            wpCol[wpCount] = 0xffffffff
            wpCirc[wpCount] = AddVisualGear(wpX[wpCount],wpY[wpCount],vgtCircle,0,true)

            SetVisualGearValues(wpCirc[wpCount], wpX[wpCount], wpY[wpCount], 20, 100, 1, 10, 0, wpRad, 5, wpCol[wpCount])

            wpCount = wpCount + 1

            AddCaption(loc("Waypoint placed.") .. " " .. loc("Available points remaining: ") .. (wpLimit-wpCount))
        end
    end
end

function onSpecialPoint(x,y,flag)
    specialPointsX[specialPointsCount] = x
    specialPointsY[specialPointsCount] = y
    specialPointsCount = specialPointsCount + 1
end



function onNewTurn()

        CheckForNewRound()
        TryRepositionHogs()

        racerActive = false

		activationStage = 1

		--AddAmmo(CurrentHedgehog, amBazooka, 100)
		--AddAmmo(CurrentHedgehog, amJetpack, 100)

		--ClearMap()


        trackTime = 0

        currCount = 0 -- hopefully this solves problem
        AddAmmo(CurrentHedgehog, amAirAttack, 0)
        gTimer = 0

        -- Set the waypoints to unactive on new round
        for i = 0,(wpCount-1) do
                wpActive[i] = false
                wpCol[i] = 0xffffffff
                SetVisualGearValues(wpCirc[i], wpX[i], wpY[i], 20, 100, 1, 10, 0, wpRad, 5, wpCol[i])
        end

        -- Handle Starting Stage of Game
        if (gameOver == false) and (gameBegun == false) then
                if wpCount >= 3 then
                        gameBegun = true
						--activationStage = 200
                        roundNumber = 0
                        firstClan = GetHogClan(CurrentHedgehog)
                        ShowMission(loc("RACER"),
                        loc("GAME BEGUN!!!"),
                        loc("Complete the track as fast as you can!"), 2, 4000)
                else
                        ShowMission(loc("RACER"),
                        loc("NOT ENOUGH WAYPOINTS"),
                        loc("Place more waypoints using the 'Air Attack' weapon."), 2, 4000)
                        AddAmmo(CurrentHedgehog, amAirAttack, 4000)
						SetWeapon(amAirAttack)
                end
        end

        if gameOver == true then
                gameBegun = false
                racerActive = false -- newadd
        end

        AddAmmo(CurrentHedgehog, amTardis, 0)
        AddAmmo(CurrentHedgehog, amDrillStrike, 0)
        AddAmmo(CurrentHedgehog, amMineStrike, 0)
        AddAmmo(CurrentHedgehog, amNapalm, 0)
        AddAmmo(CurrentHedgehog, amPiano, 0)

end

function onGameTick20()


		if jet ~= nil then
			--SetHealth(jet, 2000)
		end

        -- airstrike detected, convert this into a potential waypoint spot
        if cGear ~= nil then
                x,y = GetGearPosition(cGear)
        if x > -9000 then
            x,y = GetGearTarget(cGear)


            if TestRectForObstacle(x-20, y-20, x+20, y+20, true) then
                AddCaption(loc("Please place the way-point in the open, within the map boundaries."))
                PlaySound(sndDenied)
            elseif (y > WaterLine-50) then
                AddCaption(loc("Please place the way-point further from the waterline."))
                PlaySound(sndDenied)
            else
                PlaceWayPoint(x, y)
                if wpCount == wpLimit then
                    AddCaption(loc("Race complexity limit reached."))
                    DisableTumbler()
                end
            end
        else
            DeleteGear(cGear)
        end
        SetGearPosition(cGear, -10000, 0)
        end


		if activationStage < 10 then
				HandleFreshMapCreation()
		end


        -- start the player tumbling with a boom once their turn has actually begun
        if racerActive == false then

                if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) then

                        -- if the gamehas started put the player in the middle of the first
                        --waypoint that was placed
                        --if activationStage == 200 then
						if gameBegun == true then
                                AddCaption(loc("Good to go!"))
                                racerActive = true
                                trackTime = 0


								SetGearPosition(CurrentHedgehog, wpX[0], wpY[0])
                                --AddGear(GetX(CurrentHedgehog), GetY(CurrentHedgehog), gtGrenade, 0, 0, 0, 1)
                                --SetGearVelocity(CurrentHedgehog,1000000,1000000)
								SetGearMessage(CurrentHedgehog,gmLeft)


								FollowGear(CurrentHedgehog)

                                HideMission()
								activationStage = 201

						else
                                -- still in placement mode
                        end

                end

        elseif (activationStage == 201) and (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) then
			SetGearMessage(CurrentHedgehog,0)
			activationStage = 202
		end



        -- has the player started his tumbling spree?
        if (CurrentHedgehog ~= nil) then

                --airstrike conversion used to be here

                -- if the RACE has started, show tracktimes and keep tabs on waypoints
                if (racerActive == true) and (activationStage == 202) then

                        --ghost
                        if GameTime%40 == 0 then
                                HandleGhost()
                        end

                        trackTime = trackTime + 20

                        if GameTime%100 == 0 then

                if trackTime%1000 == 0 then
                    AddCaption((trackTime/1000)..'.0',GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2)
                else
                    AddCaption(trackTime/1000,GetClanColor(GetHogClan(CurrentHedgehog)),capgrpMessage2)
                end

                                if (CheckWaypoints() == true) then
                                        AdjustScores()
                                        DisableTumbler()
                                end

                        end

                end

                -- if the player has expended his tunbling time, stop him tumbling
                if TurnTimeLeft <= 20 then
                        DisableTumbler()
                end

        end

end

function onGearResurrect(gear)

        AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)

        if gear == CurrentHedgehog then
                DisableTumbler()
        end

end

function isATrackedGear(gear)
	if 	(GetGearType(gear) == gtHedgehog) or
		(GetGearType(gear) == gtGrenade) or
		(GetGearType(gear) == gtTarget) or
		(GetGearType(gear) == gtFlame) or
		(GetGearType(gear) == gtExplosives) or
		(GetGearType(gear) == gtMine) or
		(GetGearType(gear) == gtSMine) or
		(GetGearType(gear) == gtCase)
	then
		return(true)
	else
		return(false)
	end
end

function onGearAdd(gear)

        if isATrackedGear(gear) then
			trackGear(gear)
		end

		if GetGearType(gear) == gtHedgehog then
                hhs[numhhs] = gear
                numhhs = numhhs + 1
                SetEffect(gear, heResurrectable, 1)
        end

        if GetGearType(gear) == gtAirAttack then
                cGear = gear
        elseif GetGearType(gear) == gtJetpack then
			jet = gear
		end

end

function onGearDelete(gear)

        if isATrackedGear(gear) then
			trackDeletion(gear)
		elseif GetGearType(gear) == gtAirAttack then
                cGear = nil
        elseif GetGearType(gear) == gtJetpack then
			jet = nil
		end

end

function onAttack()
    at = GetCurAmmoType()

    usedWeapons[at] = 0
end

function onAchievementsDeclaration()
    usedWeapons[amSkip] = nil

    usedRope = usedWeapons[amRope] ~= nil
    usedPortal = usedWeapons[amPortalGun] ~= nil
    usedSaucer = usedWeapons[amJetpack] ~= nil

    usedWeapons[amRope] = nil
    usedWeapons[amPortalGun] = nil
    usedWeapons[amJetpack] = nil

    usedOther = next(usedWeapons) ~= nil

    if usedOther then -- smth besides skip, rope, portal or saucer used
        raceType = "unknown race"
    elseif usedRope and not usedPortal and not usedSaucer then
        raceType = "rope race"
    elseif not usedRope and usedPortal and not usedSaucer then
        raceType = "portal race"
    elseif not usedRope and not usedPortal and usedSaucer then
        raceType = "saucer race"
    elseif (usedRope or usedPortal or usedSaucer or usedOther) == false then -- no weapons used at all?
        raceType = "no tools race"
    else -- at least two of rope, portal and saucer used
        raceType = "mixed race"
    end

    map = detectMap()

    for i = 0, (numTeams-1) do
        if teamScore[i] < 100000 then
            DeclareAchievement(raceType, teamNameArr[i], map, teamScore[i])
        end
    end
end