diff -r f3fcba306da9 -r 1225f42f61e2 share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua Mon May 25 14:31:06 2015 -0400 +++ b/share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua Mon May 25 15:48:07 2015 -0400 @@ -1,1194 +1,1190 @@ ------------------------------------------- --- TECH RACER v0.7 ------------------------------------------ - --------------- --- TO DO --------------- --- allow scrolling of maps --- place waypoints for the registered maps automatically. - --------------- ---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? - --------------- ---0.3 --------------- --- ehh, scrap everything? those old maps probably still desync so they can die for now --- hopefully fix map 3 --- add two new crappy map to test an idea. - --------------- ---0.4 --------------- --- updated version text (lol) --- some preliminary support for hand-drawn map loading --- some support for being really lazy --- an extra map or two --- param for infinite UFO fuel --- param for number of rounds - --------------- ---0.5 --------------- --- migrated maps to an external script - --------------- ---0.6 --------------- --- move 1 line of code :D (allows loading of HWMAP points to actually work) - --------------- ---0.7 --------------- --- allow waypoints to be loaded automatically via TechMaps or HWMAP --- (temporarily?) remove ability to place waypoints manually --- break stuff? - ------------------------------ --- SCRIPT BEGINS ------------------------------ - -HedgewarsScriptLoad("/Scripts/Locale.lua") -HedgewarsScriptLoad("/Scripts/OfficialChallenges.lua") -HedgewarsScriptLoad("/Scripts/Tracker.lua") -HedgewarsScriptLoad("/Scripts/Params.lua") -HedgewarsScriptLoad("/Scripts/TechMaps.lua") - ------------------- --- Got Variables? ------------------- - -local atkArray = - { - {amBazooka, "amBazooka", 0}, - {amBee, "amBee", 0}, - {amMortar, "amMortar", 0}, - {amDrill, "amDrill", 0}, - {amSnowball, "amSnowball", 0}, - - {amGrenade, "amGrenade", 0}, - {amClusterBomb, "amClusterBomb", 0}, - {amMolotov, "amMolotov", 0}, - {amWatermelon, "amWatermelon", 0}, - {amHellishBomb, "amHellishBomb", 0}, - {amGasBomb, "amGasBomb", 0}, - - {amShotgun, "amShotgun", 0}, - {amDEagle, "amDEagle", 0}, - {amFlamethrower,"amFlamethrower", 0}, - {amSniperRifle, "amSniperRifle", 0}, - {amSineGun, "amSineGun", 0}, - {amIceGun, "amIceGun", 0}, - {amLandGun, "amLandGun", 0}, - - {amFirePunch, "amFirePunch", 0}, - {amWhip, "amWhip", 0}, - {amBaseballBat, "amBaseballBat", 0}, - {amKamikaze, "amKamikaze", 0}, - {amSeduction, "amSeduction", 0}, - {amHammer, "amHammer", 0}, - - {amMine, "amMine", 0}, - {amDynamite, "amDynamite", 0}, - {amCake, "amCake", 0}, - {amBallgun, "amBallgun", 0}, - {amRCPlane, "amRCPlane", 0}, - {amSMine, "amSMine", 0}, - {amAirMine, "amAirMine", 0}, - - {amAirAttack, "amAirAttack", 0}, - {amMineStrike, "amMineStrike", 0}, - {amDrillStrike, "amDrillStrike", 0}, - {amAirMine, "amAirMine", 0}, - {amNapalm, "amNapalm", 0}, - {amPiano, "amPiano", 0}, - - {amKnife, "amKnife", 0}, - - {amBirdy, "amBirdy", 0} - - } - -local utilArray = - { - {amBlowTorch, "amBlowTorch", 0}, - {amPickHammer, "amPickHammer", 0}, - {amGirder, "amGirder", 0}, - {amRubber, "amRubber", 0}, - {amPortalGun, "amPortalGun", 0}, - - {amRope, "amRope", 0}, - {amParachute, "amParachute", 0}, - {amTeleport, "amTeleport", 0}, - {amJetpack, "amJetpack", 0}, - - {amInvulnerable, "amInvulnerable", 0}, - {amLaserSight, "amLaserSight", 0}, - {amVampiric, "amVampiric", 0}, - - {amLowGravity, "amLowGravity", 0}, - {amExtraDamage, "amExtraDamage", 0}, - {amExtraTime, "amExtraTime", 0}, - - {amResurrector, "amResurrector", 0}, - {amTardis, "amTardis", 0}, - - {amSwitch, "amSwitch", 0} - } - -local activationStage = 0 -local jet = nil -local infUFO = 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 specialPointsFlag = {} -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 = 20 - -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 CallBob(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 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 - - InterpretPoints() - - -- these are from onParameters() - if (mapID == nil) or (mapID == 0) then - LoadMap(2000) - else - LoadMap(mapID) - end - - for i = 0,(wpCount-1) do - DeleteVisualGear(wpCirc[i]) - end - wpCount = 0 - - for i = 1, techCount-1 do - CallBob(techX[i],techY[i]) - 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 = tonumber(params["m"]) - infUFO = params["ufo"] - - roundLimit = tonumber(params["rounds"]) - - if (roundLimit == 0) or (roundLimit == nil) then - roundLimit = 3 - end - -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 onSpecialPoint(x,y,flag) - specialPointsX[specialPointsCount] = x - specialPointsY[specialPointsCount] = y - specialPointsFlag[specialPointsCount] = flag - specialPointsCount = specialPointsCount + 1 -end - -function InterpretPoints() - - -- flags run from 0 to 127 - for i = 0, (specialPointsCount-1) do - - -- Mines - if specialPointsFlag[i] == 1 then - SetTimer(AddGear(specialPointsX[i], specialPointsY[i], gtMine, 0, 0, 0, 0), 1) - elseif specialPointsFlag[i] == 2 then - SetTimer(AddGear(specialPointsX[i], specialPointsY[i], gtMine, 0, 0, 0, 0), 1000) - elseif specialPointsFlag[i] == 3 then - SetTimer(AddGear(specialPointsX[i], specialPointsY[i], gtMine, 0, 0, 0, 0), 2000) - elseif specialPointsFlag[i] == 4 then - SetTimer(AddGear(specialPointsX[i], specialPointsY[i], gtMine, 0, 0, 0, 0), 3000) - elseif specialPointsFlag[i] == 5 then - SetTimer(AddGear(specialPointsX[i], specialPointsY[i], gtMine, 0, 0, 0, 0), 4000) - elseif specialPointsFlag[i] == 6 then - SetTimer(AddGear(specialPointsX[i], specialPointsY[i], gtMine, 0, 0, 0, 0), 5000) - - -- Sticky Mines - elseif specialPointsFlag[i] == 7 then - AddGear(specialPointsX[i], specialPointsY[i], gtSMine, 0, 0, 0, 0) - - -- Air Mines - elseif specialPointsFlag[i] == 8 then - AddGear(specialPointsX[i], specialPointsY[i], gtAirMine, 0, 0, 0, 0) - - -- Health Crates - elseif specialPointsFlag[i] == 9 then - SetHealth(SpawnHealthCrate(specialPointsX[i],specialPointsY[i]),25) - elseif specialPointsFlag[i] == 10 then - SetHealth(SpawnHealthCrate(specialPointsX[i],specialPointsY[i]),50) - elseif specialPointsFlag[i] == 11 then - SetHealth(SpawnHealthCrate(specialPointsX[i],specialPointsY[i]),75) - elseif specialPointsFlag[i] == 12 then - SetHealth(SpawnHealthCrate(specialPointsX[i],specialPointsY[i]),100) - - -- Cleaver - elseif specialPointsFlag[i] == 13 then - AddGear(specialPointsX[i], specialPointsY[i], gtKnife, 0, 0, 0, 0) - - -- Target - elseif specialPointsFlag[i] == 14 then - AddGear(specialPointsX[i], specialPointsY[i], gtTarget, 0, 0, 0, 0) - - --Barrels - elseif specialPointsFlag[i] == 15 then - SetHealth(AddGear(specialPointsX[i], specialPointsY[i], gtExplosives, 0, 0, 0, 0),1) - elseif specialPointsFlag[i] == 16 then - SetHealth(AddGear(specialPointsX[i], specialPointsY[i], gtExplosives, 0, 0, 0, 0),25) - elseif specialPointsFlag[i] == 17 then - SetHealth(AddGear(specialPointsX[i], specialPointsY[i], gtExplosives, 0, 0, 0, 0),50) - elseif specialPointsFlag[i] == 18 then - SetHealth(AddGear(specialPointsX[i], specialPointsY[i], gtExplosives, 0, 0, 0, 0),75) - elseif specialPointsFlag[i] == 19 then - SetHealth(AddGear(specialPointsX[i], specialPointsY[i], gtExplosives, 0, 0, 0, 0),100) - - -- There are about 58+- weps / utils - -- Weapon Crates - elseif (specialPointsFlag[i] >= 20) and (specialPointsFlag[i] < (#atkArray+20)) then - SpawnAmmoCrate(specialPointsX[i],specialPointsY[i],atkArray[specialPointsFlag[i]-19][1]) - - - -- Utility Crates - elseif (specialPointsFlag[i] >= (#atkArray+20)) and (specialPointsFlag[i] < (#atkArray+20+#utilArray)) then - SpawnUtilityCrate(specialPointsX[i],specialPointsY[i],utilArray[specialPointsFlag[i]-19-#atkArray][1]) - - --79-82 (reserved for future wep crates) - --89,88,87,86 and 85,84,83,82 (reserved for the 2 custom sprites and their landflags) - - --90-99 reserved for scripted structures - --[[elseif specialPointsFlag[i] == 90 then - --PlaceStruc("generator") - elseif specialPointsFlag[i] == 91 then - --PlaceStruc("healingstation") - elseif specialPointsFlag[i] == 92 then - --PlaceStruc("respawner") - elseif specialPointsFlag[i] == 93 then - --PlaceStruc("teleportationnode") - elseif specialPointsFlag[i] == 94 then - --PlaceStruc("biofilter") - elseif specialPointsFlag[i] == 95 then - --PlaceStruc("supportstation") - elseif specialPointsFlag[i] == 96 then - --PlaceStruc("constructionstation") - elseif specialPointsFlag[i] == 97 then - --PlaceStruc("reflectorshield") - elseif specialPointsFlag[i] == 98 then - --PlaceStruc("weaponfilter")]] - - -- Normal Girders - elseif specialPointsFlag[i] == 100 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 0, 4294967295, nil, nil, nil, lfNormal) - elseif specialPointsFlag[i] == 101 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 1, 4294967295, nil, nil, nil, lfNormal) - elseif specialPointsFlag[i] == 102 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 2, 4294967295, nil, nil, nil, lfNormal) - elseif specialPointsFlag[i] == 103 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 3, 4294967295, nil, nil, nil, lfNormal) - elseif specialPointsFlag[i] == 104 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 4, 4294967295, nil, nil, nil, lfNormal) - elseif specialPointsFlag[i] == 105 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 5, 4294967295, nil, nil, nil, lfNormal) - elseif specialPointsFlag[i] == 106 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 6, 4294967295, nil, nil, nil, lfNormal) - elseif specialPointsFlag[i] == 107 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 7, 4294967295, nil, nil, nil, lfNormal) - - -- Invulnerable Girders - elseif specialPointsFlag[i] == 108 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 0, 2516582650, nil, nil, nil, lfIndestructible) - elseif specialPointsFlag[i] == 109 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 1, 2516582650, nil, nil, nil, lfIndestructible) - elseif specialPointsFlag[i] == 110 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 2, 2516582650, nil, nil, nil, lfIndestructible) - elseif specialPointsFlag[i] == 111 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 3, 2516582650, nil, nil, nil, lfIndestructible) - elseif specialPointsFlag[i] == 112 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 4, 2516582650, nil, nil, nil, lfIndestructible) - elseif specialPointsFlag[i] == 113 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 5, 2516582650, nil, nil, nil, lfIndestructible) - elseif specialPointsFlag[i] == 114 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 6, 2516582650, nil, nil, nil, lfIndestructible) - elseif specialPointsFlag[i] == 115 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 7, 2516582650, nil, nil, nil, lfIndestructible) - - -- Icy Girders - elseif specialPointsFlag[i] == 116 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 0, 16448250, nil, nil, nil, lfIce) - elseif specialPointsFlag[i] == 117 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 1, 16448250, nil, nil, nil, lfIce) - elseif specialPointsFlag[i] == 118 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 2, 16448250, nil, nil, nil, lfIce) - elseif specialPointsFlag[i] == 119 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 3, 16448250, nil, nil, nil, lfIce) - elseif specialPointsFlag[i] == 120 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 4, 16448250, nil, nil, nil, lfIce) - elseif specialPointsFlag[i] == 121 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 5, 16448250, nil, nil, nil, lfIce) - elseif specialPointsFlag[i] == 121 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 6, 16448250, nil, nil, nil, lfIce) - elseif specialPointsFlag[i] == 123 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 7, 16448250, nil, nil, nil, lfIce) - - -- Rubber Bands - elseif specialPointsFlag[i] == 124 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmRubber, 0, 4294967295, nil, nil, nil, lfBouncy) - elseif specialPointsFlag[i] == 125 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmRubber, 1, 4294967295, nil, nil, nil, lfBouncy) - elseif specialPointsFlag[i] == 126 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmRubber, 2, 4294967295, nil, nil, nil, lfBouncy) - elseif specialPointsFlag[i] == 127 then - PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmRubber, 3, 4294967295, nil, nil, nil, lfBouncy) - - -- Waypoints - else -- 0 / no value - CallBob(specialPointsX[i], specialPointsY[i]) - end - - end - -end - -function onGameStart() - - trackTeams() - - roundN = 0 - lastRound = TotalRounds - RoundHasChanged = false -- true - - 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 .. "|" .. - loc("You can further customize the race by changing the scheme script paramater.") .. "|" .. - --loc("For example, the below line would play map 4, with infinite fuel for the flying saucer, and four rounds.") .. "|" .. - --"m=4, ufo=true, rounds=4" .. "|" .. - - "", 4, 4000 - ) - - TryRepositionHogs() - - activationStage = 2 - HandleFreshMapCreation() - -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) and (infUFO == "true") 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 - CallBob(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) == gtAirMine) 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 - - - +------------------------------------------ +-- TECH RACER v0.7 +----------------------------------------- + +-------------- +-- TO DO +-------------- +-- allow scrolling of maps +-- place waypoints for the registered maps automatically. + +-------------- +--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? + +-------------- +--0.3 +-------------- +-- ehh, scrap everything? those old maps probably still desync so they can die for now +-- hopefully fix map 3 +-- add two new crappy map to test an idea. + +-------------- +--0.4 +-------------- +-- updated version text (lol) +-- some preliminary support for hand-drawn map loading +-- some support for being really lazy +-- an extra map or two +-- param for infinite UFO fuel +-- param for number of rounds + +-------------- +--0.5 +-------------- +-- migrated maps to an external script + +-------------- +--0.6 +-------------- +-- move 1 line of code :D (allows loading of HWMAP points to actually work) + +-------------- +--0.7 +-------------- +-- allow waypoints to be loaded automatically via TechMaps or HWMAP +-- (temporarily?) remove ability to place waypoints manually +-- break stuff? + +----------------------------- +-- SCRIPT BEGINS +----------------------------- + +HedgewarsScriptLoad("/Scripts/Locale.lua") +HedgewarsScriptLoad("/Scripts/OfficialChallenges.lua") +HedgewarsScriptLoad("/Scripts/Tracker.lua") +HedgewarsScriptLoad("/Scripts/Params.lua") +HedgewarsScriptLoad("/Scripts/TechMapsDev.lua") + +------------------ +-- Got Variables? +------------------ + +local atkArray = + { + {amBazooka, "amBazooka", 0}, + {amBee, "amBee", 0}, + {amMortar, "amMortar", 0}, + {amDrill, "amDrill", 0}, + {amSnowball, "amSnowball", 0}, + + {amGrenade, "amGrenade", 0}, + {amClusterBomb, "amClusterBomb", 0}, + {amMolotov, "amMolotov", 0}, + {amWatermelon, "amWatermelon", 0}, + {amHellishBomb, "amHellishBomb", 0}, + {amGasBomb, "amGasBomb", 0}, + + {amShotgun, "amShotgun", 0}, + {amDEagle, "amDEagle", 0}, + {amFlamethrower,"amFlamethrower", 0}, + {amSniperRifle, "amSniperRifle", 0}, + {amSineGun, "amSineGun", 0}, + {amIceGun, "amIceGun", 0}, + {amLandGun, "amLandGun", 0}, + + {amFirePunch, "amFirePunch", 0}, + {amWhip, "amWhip", 0}, + {amBaseballBat, "amBaseballBat", 0}, + {amKamikaze, "amKamikaze", 0}, + {amSeduction, "amSeduction", 0}, + {amHammer, "amHammer", 0}, + + {amMine, "amMine", 0}, + {amDynamite, "amDynamite", 0}, + {amCake, "amCake", 0}, + {amBallgun, "amBallgun", 0}, + {amRCPlane, "amRCPlane", 0}, + {amSMine, "amSMine", 0}, + {amAirMine, "amAirMine", 0}, + + {amAirAttack, "amAirAttack", 0}, + {amMineStrike, "amMineStrike", 0}, + {amDrillStrike, "amDrillStrike", 0}, + {amAirMine, "amAirMine", 0}, + {amNapalm, "amNapalm", 0}, + {amPiano, "amPiano", 0}, + + {amKnife, "amKnife", 0}, + + {amBirdy, "amBirdy", 0} + + } + +local utilArray = + { + {amBlowTorch, "amBlowTorch", 0}, + {amPickHammer, "amPickHammer", 0}, + {amGirder, "amGirder", 0}, + {amRubber, "amRubber", 0}, + {amPortalGun, "amPortalGun", 0}, + + {amRope, "amRope", 0}, + {amParachute, "amParachute", 0}, + {amTeleport, "amTeleport", 0}, + {amJetpack, "amJetpack", 0}, + + {amInvulnerable, "amInvulnerable", 0}, + {amLaserSight, "amLaserSight", 0}, + {amVampiric, "amVampiric", 0}, + + {amLowGravity, "amLowGravity", 0}, + {amExtraDamage, "amExtraDamage", 0}, + {amExtraTime, "amExtraTime", 0}, + + {amResurrector, "amResurrector", 0}, + {amTardis, "amTardis", 0}, + + {amSwitch, "amSwitch", 0} + } + +local activationStage = 0 +local jet = nil +local infUFO = 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 specialPointsFlag = {} +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 = 20 + +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 CallBob(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 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 + + InterpretPoints() + + -- these are from onParameters() + if (mapID == nil) or (mapID == 0) then + LoadMap(2000) + else + LoadMap(mapID) + end + + for i = 0,(wpCount-1) do + DeleteVisualGear(wpCirc[i]) + end + wpCount = 0 + + for i = 1, techCount-1 do + CallBob(techX[i],techY[i]) + 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 = tonumber(params["m"]) + infUFO = params["ufo"] + + roundLimit = tonumber(params["rounds"]) + + if (roundLimit == 0) or (roundLimit == nil) then + roundLimit = 3 + end + +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 onSpecialPoint(x,y,flag) + specialPointsX[specialPointsCount] = x + specialPointsY[specialPointsCount] = y + specialPointsFlag[specialPointsCount] = flag + specialPointsCount = specialPointsCount + 1 +end + +function InterpretPoints() + + -- flags run from 0 to 127 + for i = 0, (specialPointsCount-1) do + + -- Mines + if specialPointsFlag[i] == 1 then + SetTimer(AddGear(specialPointsX[i], specialPointsY[i], gtMine, 0, 0, 0, 0), 1) + elseif specialPointsFlag[i] == 2 then + SetTimer(AddGear(specialPointsX[i], specialPointsY[i], gtMine, 0, 0, 0, 0), 1000) + elseif specialPointsFlag[i] == 3 then + SetTimer(AddGear(specialPointsX[i], specialPointsY[i], gtMine, 0, 0, 0, 0), 2000) + elseif specialPointsFlag[i] == 4 then + SetTimer(AddGear(specialPointsX[i], specialPointsY[i], gtMine, 0, 0, 0, 0), 3000) + elseif specialPointsFlag[i] == 5 then + SetTimer(AddGear(specialPointsX[i], specialPointsY[i], gtMine, 0, 0, 0, 0), 4000) + elseif specialPointsFlag[i] == 6 then + SetTimer(AddGear(specialPointsX[i], specialPointsY[i], gtMine, 0, 0, 0, 0), 5000) + + -- Sticky Mines + elseif specialPointsFlag[i] == 7 then + AddGear(specialPointsX[i], specialPointsY[i], gtSMine, 0, 0, 0, 0) + + -- Air Mines + elseif specialPointsFlag[i] == 8 then + AddGear(specialPointsX[i], specialPointsY[i], gtAirMine, 0, 0, 0, 0) + + -- Health Crates + elseif specialPointsFlag[i] == 9 then + SetHealth(SpawnHealthCrate(specialPointsX[i],specialPointsY[i]),25) + elseif specialPointsFlag[i] == 10 then + SetHealth(SpawnHealthCrate(specialPointsX[i],specialPointsY[i]),50) + elseif specialPointsFlag[i] == 11 then + SetHealth(SpawnHealthCrate(specialPointsX[i],specialPointsY[i]),75) + elseif specialPointsFlag[i] == 12 then + SetHealth(SpawnHealthCrate(specialPointsX[i],specialPointsY[i]),100) + + -- Cleaver + elseif specialPointsFlag[i] == 13 then + AddGear(specialPointsX[i], specialPointsY[i], gtKnife, 0, 0, 0, 0) + + -- Target + elseif specialPointsFlag[i] == 14 then + AddGear(specialPointsX[i], specialPointsY[i], gtTarget, 0, 0, 0, 0) + + --Barrels + elseif specialPointsFlag[i] == 15 then + SetHealth(AddGear(specialPointsX[i], specialPointsY[i], gtExplosives, 0, 0, 0, 0),1) + elseif specialPointsFlag[i] == 16 then + SetHealth(AddGear(specialPointsX[i], specialPointsY[i], gtExplosives, 0, 0, 0, 0),25) + elseif specialPointsFlag[i] == 17 then + SetHealth(AddGear(specialPointsX[i], specialPointsY[i], gtExplosives, 0, 0, 0, 0),50) + elseif specialPointsFlag[i] == 18 then + SetHealth(AddGear(specialPointsX[i], specialPointsY[i], gtExplosives, 0, 0, 0, 0),75) + elseif specialPointsFlag[i] == 19 then + SetHealth(AddGear(specialPointsX[i], specialPointsY[i], gtExplosives, 0, 0, 0, 0),100) + + -- There are about 58+- weps / utils + -- Weapon Crates + elseif (specialPointsFlag[i] >= 20) and (specialPointsFlag[i] < (#atkArray+20)) then + SpawnAmmoCrate(specialPointsX[i],specialPointsY[i],atkArray[specialPointsFlag[i]-19][1]) + + + -- Utility Crates + elseif (specialPointsFlag[i] >= (#atkArray+20)) and (specialPointsFlag[i] < (#atkArray+20+#utilArray)) then + SpawnUtilityCrate(specialPointsX[i],specialPointsY[i],utilArray[specialPointsFlag[i]-19-#atkArray][1]) + + --79-82 (reserved for future wep crates) + --89,88,87,86 and 85,84,83,82 (reserved for the 2 custom sprites and their landflags) + + --90-99 reserved for scripted structures + --[[elseif specialPointsFlag[i] == 90 then + --PlaceStruc("generator") + elseif specialPointsFlag[i] == 91 then + --PlaceStruc("healingstation") + elseif specialPointsFlag[i] == 92 then + --PlaceStruc("respawner") + elseif specialPointsFlag[i] == 93 then + --PlaceStruc("teleportationnode") + elseif specialPointsFlag[i] == 94 then + --PlaceStruc("biofilter") + elseif specialPointsFlag[i] == 95 then + --PlaceStruc("supportstation") + elseif specialPointsFlag[i] == 96 then + --PlaceStruc("constructionstation") + elseif specialPointsFlag[i] == 97 then + --PlaceStruc("reflectorshield") + elseif specialPointsFlag[i] == 98 then + --PlaceStruc("weaponfilter")]] + + -- Normal Girders + elseif specialPointsFlag[i] == 100 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 0, 4294967295, nil, nil, nil, lfNormal) + elseif specialPointsFlag[i] == 101 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 1, 4294967295, nil, nil, nil, lfNormal) + elseif specialPointsFlag[i] == 102 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 2, 4294967295, nil, nil, nil, lfNormal) + elseif specialPointsFlag[i] == 103 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 3, 4294967295, nil, nil, nil, lfNormal) + elseif specialPointsFlag[i] == 104 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 4, 4294967295, nil, nil, nil, lfNormal) + elseif specialPointsFlag[i] == 105 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 5, 4294967295, nil, nil, nil, lfNormal) + elseif specialPointsFlag[i] == 106 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 6, 4294967295, nil, nil, nil, lfNormal) + elseif specialPointsFlag[i] == 107 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 7, 4294967295, nil, nil, nil, lfNormal) + + -- Invulnerable Girders + elseif specialPointsFlag[i] == 108 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 0, 2516582650, nil, nil, nil, lfIndestructible) + elseif specialPointsFlag[i] == 109 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 1, 2516582650, nil, nil, nil, lfIndestructible) + elseif specialPointsFlag[i] == 110 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 2, 2516582650, nil, nil, nil, lfIndestructible) + elseif specialPointsFlag[i] == 111 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 3, 2516582650, nil, nil, nil, lfIndestructible) + elseif specialPointsFlag[i] == 112 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 4, 2516582650, nil, nil, nil, lfIndestructible) + elseif specialPointsFlag[i] == 113 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 5, 2516582650, nil, nil, nil, lfIndestructible) + elseif specialPointsFlag[i] == 114 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 6, 2516582650, nil, nil, nil, lfIndestructible) + elseif specialPointsFlag[i] == 115 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 7, 2516582650, nil, nil, nil, lfIndestructible) + + -- Icy Girders + elseif specialPointsFlag[i] == 116 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 0, 16448250, nil, nil, nil, lfIce) + elseif specialPointsFlag[i] == 117 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 1, 16448250, nil, nil, nil, lfIce) + elseif specialPointsFlag[i] == 118 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 2, 16448250, nil, nil, nil, lfIce) + elseif specialPointsFlag[i] == 119 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 3, 16448250, nil, nil, nil, lfIce) + elseif specialPointsFlag[i] == 120 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 4, 16448250, nil, nil, nil, lfIce) + elseif specialPointsFlag[i] == 121 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 5, 16448250, nil, nil, nil, lfIce) + elseif specialPointsFlag[i] == 121 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 6, 16448250, nil, nil, nil, lfIce) + elseif specialPointsFlag[i] == 123 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmGirder, 7, 16448250, nil, nil, nil, lfIce) + + -- Rubber Bands + elseif specialPointsFlag[i] == 124 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmRubber, 0, 4294967295, nil, nil, nil, lfBouncy) + elseif specialPointsFlag[i] == 125 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmRubber, 1, 4294967295, nil, nil, nil, lfBouncy) + elseif specialPointsFlag[i] == 126 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmRubber, 2, 4294967295, nil, nil, nil, lfBouncy) + elseif specialPointsFlag[i] == 127 then + PlaceSprite(specialPointsX[i], specialPointsY[i], sprAmRubber, 3, 4294967295, nil, nil, nil, lfBouncy) + + -- Waypoints + else -- 0 / no value + CallBob(specialPointsX[i], specialPointsY[i]) + end + + end + +end + +function onGameStart() + + trackTeams() + + roundN = 0 + lastRound = TotalRounds + RoundHasChanged = false -- true + + 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 .. "|" .. + loc("You can further customize the race by changing the scheme script paramater.") .. "|" .. + --loc("For example, the below line would play map 4, with infinite fuel for the flying saucer, and four rounds.") .. "|" .. + --"m=4, ufo=true, rounds=4" .. "|" .. + + "", 4, 4000 + ) + + TryRepositionHogs() + + activationStage = 2 + HandleFreshMapCreation() + +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) and (infUFO == "true") 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 + CallBob(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) == gtAirMine) 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 + + +