--- a/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Wed May 29 17:47:54 2013 -0400
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Thu May 30 19:34:39 2013 +0900
@@ -1,625 +1,615 @@
-local MUTANT_VERSION = "v0.9.4"
-
---[[ ___ ___
- ( ) ( )
-___ .-. .-. ___ ___ | |_ .---. ___ .-. | |_
-( ) ' ( )( ( __) / .-, ( ) ( __)
-| .-. .-. | | | | | | (__) ; || .-. .| |
-| | | | | | | | | | | ___ .'` || | | || | ___
-| | | | | | | | | | |( / .'| || | | || |( )
-| | | | | | | | | | | | | / | || | | || | | |
-| | | | | | | ; ' | ' | ; | ; || | | || ' | |
-| | | | | ' `-' / ' `-' ' `-' || | | |' `-' ;
-(___)(___)(___'.__.' `.__.`.__.'_(___)(___)`.__.
-
-
----- IMPORTANT!
-----
----- You should save (press Ctrl+S) this script to:
----- Program Files\Hedgewars\share\hedgewars\Data\Scripts\Multiplayer\Mutant.lua
----- or (on Linux):
----- ~/.hedgewars/Data/Scripts/Multiplayer/Mutant.lua
-----
----- (or wherever scripts like Highlander.lua, Racer.lua are on your system)
-----
----- Also, if you didn't have Mutant script yet, you need to restart Hedgewars for it to find the script file.
-----
-
-
----- GAME RULES
-----
----- Recommended settings:
----- * one hedgehog per team
----- * 'Small' one-island map
-----
----- First one to kill anyone becomes Mutant. Mutant has super-weapons
----- and a lot of health, which however depletes if he doesn't frag fast.
----- Goal of Mutant is to use his weapons to hold his status for as long
----- as he can.
----- Goal of others is to hunt the Mutant down. The one who kills Mutant,
----- becomes Mutant himself.
----- The player with least points (or most deaths) is Bottom Feeder. He
----- can gain points by killing anyone. Other normal players only get points
----- for killing Mutant.
-----
----- Points:
----- +2 for becoming a Mutant
----- +1 to a Mutant for killing anyone
----- +1 to a Bottom Feeder for killing anyone
----- -1 to anyone for a suicide
----- other kills don't give you points.
-----
-
---]]
-
-HedgewarsScriptLoad("/Scripts/Locale.lua")
-HedgewarsScriptLoad("/Scripts/Tracker.lua")
-
---[[
- MUTANT SCRIPT
-
- To Do: -Clean-up this fucking piece of code
- -Debug
- -Find a girlfriend
- -Fix Sheepluva's hat +[p]
- -Cookies
-
------------------------]]
-
-local hhs = {}
-local numhhs = 0
-
-local gameOver=false
-
-local mutant = nil
-local mutant_base_health = 200
-local mutant_base_disease = 25
-local disease_timer = 2000
-
-local kill_reward = nil
-local mt_hurt=false
-
-local killsCounter = 0
-
-local team_fire_punishment = 3
-local mutant_kill_reward = 2
-
-local hh_weapons = { amBazooka, amGrenade, amShotgun, amMine}
-
-local mt_weapons = {amWatermelon, amHellishBomb, amBallgun, amRCPlane, amTeleport}
-
-local disease=0
-local timer=0
-
-local winScore = 15
-local hogsLimit = 1
-
-local teams = {}
-
-local circles = {}
-local circleFrame = -1
-
-function onGameInit()
- TurnTime = 20000
- WaterRise = 0
- GameFlags = GameFlags + gfResetWeps + gfPerHogAmmo
- HealthCaseProb=0
- HealthCaseAmount=0
- MinesTime=1000
- CaseFreq = 2
-
-end
-
-
-function limitHogs(gear)
- cnthhs = cnthhs + 1
- if cnthhs > 1 then
- hogLimitHit = true
- SetEffect(gear, heResurrectable, false)
- --SetHealth(gear, 0)
- SetGearPosition(gear, -100,LAND_HEIGHT)
- end
-end
-
-function onGameStart()
- trackTeams()
- teamScan()
- runOnHogs(saveStuff)
- --local str = "/say " .. MUTANT_VERSION
- --ParseCommand(str)
-
- hogLimitHit = false
- for i=0 , TeamsCount - 1 do
- cnthhs = 0
- runOnHogsInTeam(limitHogs, teams[i])
- end
- if hogLimitHit then
- AddCaption(loc("ONE HOG PER TEAM! KILLING EXCESS HEDGES"))
- end
-end
-
-
-
-function giveWeapons(gear)
-
- if gear == mutant then
- AddAmmo(gear, amRope)
- for i=1, #mt_weapons do
- AddAmmo(gear, mt_weapons[i])
- end
-
- else
- for i=1, #hh_weapons do
- AddAmmo(gear,hh_weapons[i])
- end
- end
-end
-
-function onAmmoStoreInit()
-
- SetAmmo(amSkip, 9, 0, 0, 0)
- SetAmmo(amRope,0,1,0,5)
- SetAmmo(amSnowball,0,1,0,1)
-
- for i=1, #hh_weapons do
- SetAmmo(hh_weapons[i], 0, 0, 0, 1)
- end
-
- for i=1, #mt_weapons do
- SetAmmo(mt_weapons[i], 0, 3, 0, 1)
- end
-
-end
-
-function drawCircles()
- for i = 0, #hhs do
- if circles[hhs[i]] ~= nil then
- DeleteVisualGear(circles[hhs[i]])
- circles[hhs[i]] = nil
- end
-
- if hhs[i] ~= CurrentHedgehog then
- if mutant == nil then
- circles[hhs[i]] = AddVisualGear(0, 0, vgtCircle, 0, false)
- SetVisualGearValues(circles[hhs[i]], 0, 0, 0, 0, 0, 0, 0, 22, 5, 0xff000080)
- elseif CurrentHedgehog == mutant then
- circles[hhs[i]] = AddVisualGear(0, 0, vgtCircle, 0, false)
- SetVisualGearValues(circles[hhs[i]], 0, 0, 0, 0, 0, 0, 0, 22, 3, 0xaa000070)
- elseif getGearValue(CurrentHedgehog, "Feeder") and hhs[i] ~= mutant then
- circles[hhs[i]] = AddVisualGear(0, 0, vgtCircle, 0, false)
- SetVisualGearValues(circles[hhs[i]], 0, 0, 0, 0, 0, 0, 0, 22, 3, 0xaa000070)
- elseif hhs[i] == mutant then
- circles[hhs[i]] = AddVisualGear(0, 0, vgtCircle, 0, false)
- SetVisualGearValues(circles[hhs[i]], 0, 0, 0, 0, 0, 0, 0, 22, 5, 0xff000080)
- end
- end
- end
- circleFrame = 0
-end
-
-function onNewTurn()
-
- trackTeams()
- killsCounter = 0
-
- if mutant == nil then
- AddCaption( loc("FIRST BLOOD MUTATES") )
- end
-
- checkScore()
- giveWeapons(CurrentHedgehog)
- drawCircles()
- setAIHints()
- kill_reward= numhhs*10
-
- if CurrentHedgehog == mutant then
- mt_hurt=true
- disease= mutant_base_disease - numhhs
- else
- mt_hurt=false
- end
-
- setGearValue(CurrentHedgehog, "Alive", true)
-
-end
-
-function countBodies()
- if killsCounter == 2 then
- AddCaption(loc("DOUBLE KILL"))
- elseif killsCounter == 3 then
- AddCaption(loc("MEGA KILL"))
- PlaySound(sndRegret)
- elseif killsCounter == 4 then
- AddCaption(loc("ULTRA KILL"))
- elseif killsCounter == 5 then
- AddCaption(loc("MONSTER KILL"))
- PlaySound(sndIllGetYou)
- elseif killsCounter == 6 then
- AddCaption(loc("LUDICROUS KILL"))
- PlaySound(sndNutter)
- elseif killsCounter == 7 then
- AddCaption(loc("HOLY SHYTE!"))
- PlaySound(sndLaugh)
- elseif killsCounter > 8 then
- AddCaption(loc("INSANITY"))
- end
-
-end
-
-function onGameTick()
-
- if circleFrame > -1 then
- for i = 0, #hhs do
- if circles[hhs[i]] ~= nil and hhs[i]~= nil then
- hhx, hhy = GetGearPosition(hhs[i])
- X, Y, dX, dY, Angle, Frame, FrameTicks, State, Timer, Tint = GetVisualGearValues(circles[hhs[i]])
- SetVisualGearValues(circles[hhs[i]], hhx + 1, hhy - 3, 0, 0, 0, 0, 0, 40 - (circleFrame % 25), Timer, Tint)
- end
- end
-
- circleFrame = circleFrame + 0.06
-
- if circleFrame >= 25 then
- for i = 0, #hhs do
- if circles[hhs[i]] ~= nil then
- DeleteVisualGear(circles[hhs[i]])
- circles[hhs[i]] = nil
- end
- end
- end
- end
-
- if TurnTimeLeft==0 and mt_hurt then
- mt_hurt = false
- end
-
- if mt_hurt and mutant~=nil then
- timer = timer + 1
- if timer > disease_timer then
- timer = 0
- SetHealth(mutant, GetHealth(mutant)-disease )
- AddVisualGear(GetX(mutant), GetY(mutant)-5, vgtHealthTag, disease, true)
- if GetHealth(mutant)<=0 then
- SetHealth(mutant,0)
- mt_hurt= false
- setGearValue(mutant,"SelfDestruct",true)
- TurnTimeLeft = 0
- end
- end
- end
-end
-
-function saveStuff(gear)
- setGearValue(gear,"Name",GetHogName(gear))
- setGearValue(gear,"Hat",GetHogHat(gear))
-end
-
-function armageddon(gear)
- SetState(gear, gstLoser)
- SetEffect(gear, heResurrectable, false)
- SetHealth(gear, 0)
-end
-
-function updateScore()
-local showScore = ""
-
- for i=0, TeamsCount-1 do
- if teams[i]~= nil then
-
- local curr_score = getTeamValue(teams[i], "Score")
- showScore = showScore .. teams[i] .. ": " .. curr_score .. " (deaths: " .. getTeamValue(teams[i], "DeadHogs") .. ") " .. "|"
-
- end
- end
-
- ShowMission(loc("Score"),
- "-------",
- showScore, 0, 200)
-
- HideMission()
-
-end
-
-function checkScore()
-local showScore = ""
-local lowest_score_team = nil
-local min_score=nil
-local winTeam = nil
-
-local only_low_score = true
-
- for i=0, TeamsCount-1 do
- if teams[i]~=nil then
- local curr_score = getTeamValue(teams[i], "Score")
-
- runOnHogsInTeam(removeFeeder, teams[i])
-
- showScore = showScore .. teams[i] ..": " .. curr_score .. " (deaths: " .. getTeamValue(teams[i], "DeadHogs") .. ") " .. "|"
-
- if curr_score >= winScore then
- gameOver = true
- winTeam = teams[i]
- end
-
- if min_score==nil then
- min_score= curr_score
- lowest_score_team = teams[i]
- else
- if curr_score <= min_score then
- if curr_score == min_score then
- if getTeamValue(teams[i], "DeadHogs") == getTeamValue(lowest_score_team, "DeadHogs") then
- only_low_score = false
- else
- if getTeamValue(teams[i], "DeadHogs") > getTeamValue(lowest_score_team, "DeadHogs") then
- lowest_score_team = teams[i]
- end
- only_low_score = true
- end
-
- else
- min_score= curr_score
- lowest_score_team = teams[i]
- only_low_score = true
- end
- end
- end
- end
- end
-
- if gameOver then
- TurnTimeLeft = 0
- for i=0, #teams do
- if teams[i]~=winTeam then
- runOnHogsInTeam(armageddon, teams[i])
- end
- end
-
- ShowMission( loc("WINNER IS ") .. winTeam,
- "~~~~~~~~~~~~~~~~~~~~~~~~~",
- showScore, 0, 200)
- else
-
- if only_low_score then
- runOnHogsInTeam(setFeeder, lowest_score_team)
- end
-
- ShowMission( loc("Score"),
- loc("-------"),
- showScore, 0, 200)
-
- end
-end
-
-function backToNormal(gear)
-
- SetHogName(gear, getGearValue(gear,"Name"))
- SetHogHat(gear, 'NoHat')
- SetHogHat(gear, getGearValue(gear,"Hat"))
- setGearValue(mutant,"SelfDestruct",false)
- mt_hurt=false
- mutant=nil
-end
-
-function setAIHints()
- for i = 0, #hhs do
- if mutant == nil or hhs[i] == mutant or CurrentHedgehog == mutant then
- SetGearAIHints(hhs[i], aihUsual)
- else
- SetGearAIHints(hhs[i], aihDoesntMatter)
- end
- end
-end
-
-function removeFeeder(gear)
-
- if gear~=nil then
- setGearValue(gear,"Feeder",false)
- if gear~= mutant then
- SetHogName(gear, getGearValue(gear,"Name") )
- SetHogHat(gear, 'NoHat')
- SetHogHat(gear, getGearValue(gear,"Hat"))
- end
- end
-end
-
-function setFeeder(gear)
-
- if gear~= mutant and gear~= nil then
- SetHogName(gear,"BOTTOM FEEDER")
- SetHogHat(gear, 'poke_slowpoke')
- setGearValue(gear,"Feeder", true)
- end
-end
-
-function setMutantStuff(gear)
- mutant = gear
-
- SetHogName(gear,"MUTANT")
- SetHogHat(gear,'WhySoSerious')
- SetHealth(gear, ( mutant_base_health + numhhs*25) )
- SetEffect(gear, hePoisoned, 1)
- setGearValue(mutant,"SelfDestruct",false)
- setGearValue(gear, "Feeder", false)
-
- AddCaption(getGearValue(gear, "Name") .. loc(" HAS MUTATED"))
-
- TurnTimeLeft=0
-
- AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
- AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
- AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
- AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
- AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
- PlaySound(sndSuddenDeath)
-end
-
-function teamScan()
-
- for i=0, TeamsCount-1 do --nil filling
- teams[i]=nil
- end
-
- for i=0, #hhs do
- for j=0, TeamsCount-1 do
- if teams[j] ==nil and hhs[i]~=nil then
- teams[j] = GetHogTeamName(hhs[i])
- setTeamValue(teams[j],"Score",0)
- setTeamValue(teams[j], "DeadHogs",0)
- break
- end
-
- if teams[j] == GetHogTeamName(hhs[i]) then
- break
- end
- end
- end
-
- ---***---
-end
-
-
-function onGearDamage(gear, dmg)
-
-end
-
-function set_Mutant_and_Score(gear)
-
-local curr_team = GetHogTeamName(CurrentHedgehog)
-
- if gear == CurrentHedgehog then
- if CurrentHedgehog == mutant then
- PlaySound(sndHomerun)
- if getGearValue(gear, "SelfDestruct")==false then
- decreaseTeamValue(curr_team,"Score")
- end
- backToNormal(gear)
- else
- decreaseTeamValue(curr_team,"Score")
- end
-
- else
- if gear == mutant then
- backToNormal(mutant)
- if curr_team ~=GetHogTeamName(gear) then
- if getGearValue(CurrentHedgehog, "Alive") then
- setMutantStuff(CurrentHedgehog)
- setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") + mutant_kill_reward))
- end
- else
- setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") - team_fire_punishment))
- end
- else
- if mutant==nil then
- if curr_team ~=GetHogTeamName(gear) then
- if getGearValue(CurrentHedgehog, "Alive") then
- setMutantStuff(CurrentHedgehog)
- setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") + mutant_kill_reward))
- else
- increaseTeamValue(curr_team,"Score")
- end
- else
- setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") - team_fire_punishment))
- end
- else
- if curr_team ~=GetHogTeamName(gear) then
- if CurrentHedgehog==mutant and getGearValue(mutant,"SelfDestruct")==false then
- SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog)+kill_reward)
- AddCaption("+" .. kill_reward .. loc(" HP") )
- increaseTeamValue(curr_team,"Score")
- end
- if getGearValue(CurrentHedgehog,"Feeder") then
- increaseTeamValue(curr_team,"Score")
- end
- else
- setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") - team_fire_punishment))
- end
- end
- end
- end
-end
-
-function onGearResurrect(gear)
-if not gameOver then
- if GetGearType(gear) == gtHedgehog then
-
- increaseTeamValue(GetHogTeamName(gear), "DeadHogs")
-
- if gear==CurrentHedgehog then
- setGearValue(CurrentHedgehog, "Alive", false)
- end
- set_Mutant_and_Score(gear)
- if gear~=CurrentHedgehog then
- killsCounter = killsCounter + 1
- countBodies()
- end
- AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
- PlaySound(sndWhack)
- updateScore()
- end
-end
-end
-
-function onGearAdd(gear)
-
- -- Catch hedgehogs for the tracker
- if GetGearType(gear) == gtHedgehog then
- trackGear(gear)
- hhs[numhhs] = gear
- numhhs = numhhs + 1
- SetEffect(gear, heResurrectable, 1)
- end
-end
-
-function checkEmptyTeam (teamName)
- for i=0 , #hhs do
- if hhs[i]~=nil then
- if teamName == GetHogTeamName(hhs[i]) then
- return false
- end
- end
- end
- return true
-end
-
-function onGearDelete(gear)
- -- Remove hogs that are gone
- if GetGearType(gear) == gtHedgehog then
- numhhs = numhhs - 1
-
- local found
- for i=0, #hhs do
- if hhs[i] == gear then
- found = i
- break
- end
- end
- for i = found, #hhs - 1 do
- hhs[i] = hhs[i + 1]
- end
- hhs[#hhs] = nil
-
- local t_name = GetHogTeamName(gear)
- if checkEmptyTeam(t_name) then
- for i = 0, TeamsCount - 1 do
- if teams[i] == t_name then
- found = i
- break
- end
- end
- for i = found, TeamsCount - 2 do
- teams[i] = teams[i + 1]
- end
- teams[TeamsCount - 1] = nil
- TeamsCount = TeamsCount - 1
- end
- AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
- trackDeletion(gear)
- end
-end
-
---[[
-S T A R R I N G
-
- prof - Coding, implementing and evangelism
- vos - Initial idea and script improvements
---]]
+local MUTANT_VERSION = "v0.9.5"
+
+--[[ ___ ___
+ ( ) ( )
+___ .-. .-. ___ ___ | |_ .---. ___ .-. | |_
+( ) ' ( )( ( __) / .-, ( ) ( __)
+| .-. .-. | | | | | | (__) ; || .-. .| |
+| | | | | | | | | | | ___ .'` || | | || | ___
+| | | | | | | | | | |( / .'| || | | || |( )
+| | | | | | | | | | | | | / | || | | || | | |
+| | | | | | | ; ' | ' | ; | ; || | | || ' | |
+| | | | | ' `-' / ' `-' ' `-' || | | |' `-' ;
+(___)(___)(___'.__.' `.__.`.__.'_(___)(___)`.__.
+
+
+---- Recommended settings:
+---- * one hedgehog per team
+---- * 'Small' one-island map
+
+--]]
+
+HedgewarsScriptLoad("/Scripts/Locale.lua")
+HedgewarsScriptLoad("/Scripts/Tracker.lua")
+
+--[[
+ MUTANT SCRIPT
+
+ To Do: -Clean-up this fucking piece of code
+ -Debug
+ -Find a girlfriend
+ -Fix Sheepluva's hat +[p]
+ -Cookies
+-----------------------]]
+
+local hhs = {}
+local numhhs = 0
+local meh = false
+
+local gameOver=false
+
+local mutant = nil
+local mutant_base_health = 200
+local mutant_base_disease = 25
+local disease_timer = 2000
+
+local kill_reward = nil
+local mt_hurt=false
+
+local killsCounter = 0
+
+local team_fire_punishment = 3
+local mutant_kill_reward = 2
+
+local hh_weapons = { amBazooka, amGrenade, amShotgun, amMine}
+
+local mt_weapons = {amWatermelon, amHellishBomb, amBallgun, amRCPlane, amTeleport}
+
+local disease=0
+local timer=0
+
+local winScore = 15
+local hogsLimit = 1
+
+local teams = {}
+
+local circles = {}
+local circleFrame = -1
+
+function showStartingInfo()
+
+ ruleSet = loc("RULES") .. ": " ..
+ " |" .. --" |" ..
+ loc("The first player to kill someone becomes the Mutant.") .. "|" ..
+ loc("The Mutant has super-weapons and a lot of health.") .. "|" ..
+ loc("The Mutant loses health quickly if he doesn't keep scoring kills.") .. "|" ..
+ " |" ..
+ loc("Normal players can only score points by killing the mutant.") .. "|" ..
+ " |" .. "" ..
+ loc("The player with least points (or most deaths) becomes the Bottom Feeder.") .. "|" ..
+ loc("The Bottom Feeder can score points by killing anyone.") .. "|" ..
+ " |" ..
+ loc("POINTS") .. ": " ..
+ " |" ..
+ loc("+2 for becoming a Mutant") .. "|" ..
+ loc("+1 to a Mutant for killing anyone") .. "|" ..
+ loc("+1 to a Bottom Feeder for killing anyone") .. "|" ..
+ loc("-1 to anyone for a suicide") .. "|" ..
+ loc("Other kills don't give you points.")
+
+ ShowMission(loc("Mutant"),
+ loc("a Hedgewars tag game"),
+ ruleSet, 0, 5000)
+
+end
+
+function onGameInit()
+ TurnTime = 20000
+ WaterRise = 0
+ GameFlags = GameFlags + gfResetWeps + gfPerHogAmmo
+ HealthCaseProb=0
+ HealthCaseAmount=0
+ MinesTime=1000
+ CaseFreq = 2
+end
+
+
+function limitHogs(gear)
+ cnthhs = cnthhs + 1
+ if cnthhs > 1 then
+ hogLimitHit = true
+ SetEffect(gear, heResurrectable, false)
+ --SetHealth(gear, 0)
+ SetGearPosition(gear, -100,LAND_HEIGHT)
+ end
+end
+
+function onGameStart()
+ trackTeams()
+ teamScan()
+ runOnHogs(saveStuff)
+ --local str = "/say " .. MUTANT_VERSION
+ --ParseCommand(str)
+
+ hogLimitHit = false
+ for i=0 , TeamsCount - 1 do
+ cnthhs = 0
+ runOnHogsInTeam(limitHogs, teams[i])
+ end
+ if hogLimitHit then
+ AddCaption(loc("ONE HOG PER TEAM! KILLING EXCESS HEDGES"))
+ end
+ showStartingInfo()
+end
+
+
+
+function giveWeapons(gear)
+ if gear == mutant then
+ AddAmmo(gear, amRope)
+ for i=1, #mt_weapons do
+ AddAmmo(gear, mt_weapons[i])
+ end
+
+ else
+ for i=1, #hh_weapons do
+ AddAmmo(gear,hh_weapons[i])
+ end
+ end
+end
+
+function onAmmoStoreInit()
+
+ SetAmmo(amSkip, 9, 0, 0, 0)
+ SetAmmo(amRope,0,1,0,5)
+ SetAmmo(amSnowball,0,1,0,1)
+
+ for i=1, #hh_weapons do
+ SetAmmo(hh_weapons[i], 0, 0, 0, 1)
+ end
+
+ for i=1, #mt_weapons do
+ SetAmmo(mt_weapons[i], 0, 3, 0, 1)
+ end
+
+end
+
+function drawCircles()
+ for i = 0, #hhs do
+ if circles[hhs[i]] ~= nil then
+ DeleteVisualGear(circles[hhs[i]])
+ circles[hhs[i]] = nil
+ end
+
+ if hhs[i] ~= CurrentHedgehog then
+ if mutant == nil then
+ circles[hhs[i]] = AddVisualGear(0, 0, vgtCircle, 0, false)
+ SetVisualGearValues(circles[hhs[i]], 0, 0, 0, 0, 0, 0, 0, 22, 5, 0xff000080)
+ elseif CurrentHedgehog == mutant then
+ circles[hhs[i]] = AddVisualGear(0, 0, vgtCircle, 0, false)
+ SetVisualGearValues(circles[hhs[i]], 0, 0, 0, 0, 0, 0, 0, 22, 3, 0xaa000070)
+ elseif getGearValue(CurrentHedgehog, "Feeder") and hhs[i] ~= mutant then
+ circles[hhs[i]] = AddVisualGear(0, 0, vgtCircle, 0, false)
+ SetVisualGearValues(circles[hhs[i]], 0, 0, 0, 0, 0, 0, 0, 22, 3, 0xaa000070)
+ elseif hhs[i] == mutant then
+ circles[hhs[i]] = AddVisualGear(0, 0, vgtCircle, 0, false)
+ SetVisualGearValues(circles[hhs[i]], 0, 0, 0, 0, 0, 0, 0, 22, 5, 0xff000080)
+ end
+ end
+ end
+ circleFrame = 0
+end
+
+function onNewTurn()
+
+ trackTeams()
+ killsCounter = 0
+
+ if mutant == nil then
+ AddCaption( loc("FIRST BLOOD MUTATES") )
+ end
+
+ checkScore()
+ giveWeapons(CurrentHedgehog)
+ drawCircles()
+ setAIHints()
+ kill_reward= numhhs*10
+
+ if CurrentHedgehog == mutant then
+ mt_hurt=true
+ disease= mutant_base_disease - numhhs
+ else
+ mt_hurt=false
+ end
+
+ setGearValue(CurrentHedgehog, "Alive", true)
+
+end
+
+function countBodies()
+ if killsCounter == 2 then
+ AddCaption(loc("DOUBLE KILL"))
+ elseif killsCounter == 3 then
+ AddCaption(loc("MEGA KILL"))
+ PlaySound(sndRegret)
+ elseif killsCounter == 4 then
+ AddCaption(loc("ULTRA KILL"))
+ elseif killsCounter == 5 then
+ AddCaption(loc("MONSTER KILL"))
+ PlaySound(sndIllGetYou)
+ elseif killsCounter == 6 then
+ AddCaption(loc("LUDICROUS KILL"))
+ PlaySound(sndNutter)
+ elseif killsCounter == 7 then
+ AddCaption(loc("HOLY SHYTE!"))
+ PlaySound(sndLaugh)
+ elseif killsCounter > 8 then
+ AddCaption(loc("INSANITY"))
+ end
+end
+
+function onGameTick()
+
+ if circleFrame > -1 then
+ for i = 0, #hhs do
+ if circles[hhs[i]] ~= nil and hhs[i]~= nil then
+ hhx, hhy = GetGearPosition(hhs[i])
+ X, Y, dX, dY, Angle, Frame, FrameTicks, State, Timer, Tint = GetVisualGearValues(circles[hhs[i]])
+ SetVisualGearValues(circles[hhs[i]], hhx + 1, hhy - 3, 0, 0, 0, 0, 0, 40 - (circleFrame % 25), Timer, Tint)
+ end
+ end
+
+ circleFrame = circleFrame + 0.06
+
+ if circleFrame >= 25 then
+ for i = 0, #hhs do
+ if circles[hhs[i]] ~= nil then
+ DeleteVisualGear(circles[hhs[i]])
+ circles[hhs[i]] = nil
+ end
+ end
+ end
+ end
+
+ if TurnTimeLeft==0 and mt_hurt then
+ mt_hurt = false
+ end
+
+ if mt_hurt and mutant~=nil then
+ timer = timer + 1
+ if timer > disease_timer then
+ timer = 0
+ SetHealth(mutant, GetHealth(mutant)-disease )
+ AddVisualGear(GetX(mutant), GetY(mutant)-5, vgtHealthTag, disease, true)
+ if GetHealth(mutant)<=0 then
+ SetHealth(mutant,0)
+ mt_hurt= false
+ setGearValue(mutant,"SelfDestruct",true)
+ TurnTimeLeft = 0
+ end
+ end
+ end
+
+end
+
+function saveStuff(gear)
+ setGearValue(gear,"Name",GetHogName(gear))
+ setGearValue(gear,"Hat",GetHogHat(gear))
+end
+
+function armageddon(gear)
+ SetState(gear, gstLoser)
+ SetEffect(gear, heResurrectable, false)
+ SetHealth(gear, 0)
+end
+
+function updateScore()
+
+ local showScore = ""
+
+ for i=0, TeamsCount-1 do
+ if teams[i]~= nil then
+
+ local curr_score = getTeamValue(teams[i], "Score")
+ showScore = showScore .. teams[i] .. ": " .. curr_score .. " (deaths: " .. getTeamValue(teams[i], "DeadHogs") .. ") " .. "|"
+
+ end
+ end
+
+ ShowMission(loc("Score"),
+ "-------",
+ showScore, 0, 200)
+
+ HideMission()
+
+end
+
+function checkScore()
+local showScore = ""
+local lowest_score_team = nil
+local min_score=nil
+local winTeam = nil
+
+local only_low_score = true
+
+ for i=0, TeamsCount-1 do
+ if teams[i]~=nil then
+ local curr_score = getTeamValue(teams[i], "Score")
+
+ runOnHogsInTeam(removeFeeder, teams[i])
+
+ showScore = showScore .. teams[i] ..": " .. curr_score .. " (deaths: " .. getTeamValue(teams[i], "DeadHogs") .. ") " .. "|"
+
+ if curr_score >= winScore then
+ gameOver = true
+ winTeam = teams[i]
+ end
+
+ if min_score==nil then
+ min_score= curr_score
+ lowest_score_team = teams[i]
+ else
+ if curr_score <= min_score then
+ if curr_score == min_score then
+ if getTeamValue(teams[i], "DeadHogs") == getTeamValue(lowest_score_team, "DeadHogs") then
+ only_low_score = false
+ else
+ if getTeamValue(teams[i], "DeadHogs") > getTeamValue(lowest_score_team, "DeadHogs") then
+ lowest_score_team = teams[i]
+ end
+ only_low_score = true
+ end
+
+ else
+ min_score= curr_score
+ lowest_score_team = teams[i]
+ only_low_score = true
+ end
+ end
+ end
+ end
+ end
+
+ if gameOver then
+ TurnTimeLeft = 0
+ for i=0, #teams do
+ if teams[i]~=winTeam then
+ runOnHogsInTeam(armageddon, teams[i])
+ end
+ end
+
+ ShowMission( loc("WINNER IS ") .. winTeam,
+ "~~~~~~~~~~~~~~~~~~~~~~~~~",
+ showScore, 0, 200)
+ else
+
+ if only_low_score then
+ runOnHogsInTeam(setFeeder, lowest_score_team)
+ end
+
+ if meh == false then
+ meh = true
+ else
+ ShowMission( loc("Score"),
+ loc("-------"),
+ showScore, 0, 200)
+ end
+
+ end
+end
+
+function backToNormal(gear)
+ SetHogName(gear, getGearValue(gear,"Name"))
+ SetHogHat(gear, 'NoHat')
+ SetHogHat(gear, getGearValue(gear,"Hat"))
+ setGearValue(mutant,"SelfDestruct",false)
+ mt_hurt=false
+ mutant=nil
+end
+
+function setAIHints()
+ for i = 0, #hhs do
+ if mutant == nil or hhs[i] == mutant or CurrentHedgehog == mutant then
+ SetGearAIHints(hhs[i], aihUsual)
+ else
+ SetGearAIHints(hhs[i], aihDoesntMatter)
+ end
+ end
+end
+
+function removeFeeder(gear)
+ if gear~=nil then
+ setGearValue(gear,"Feeder",false)
+ if gear~= mutant then
+ SetHogName(gear, getGearValue(gear,"Name") )
+ SetHogHat(gear, 'NoHat')
+ SetHogHat(gear, getGearValue(gear,"Hat"))
+ end
+ end
+end
+
+function setFeeder(gear)
+ if gear~= mutant and gear~= nil then
+ SetHogName(gear,"BOTTOM FEEDER")
+ SetHogHat(gear, 'poke_slowpoke')
+ setGearValue(gear,"Feeder", true)
+ end
+end
+
+function setMutantStuff(gear)
+ mutant = gear
+
+ SetHogName(gear,"MUTANT")
+ SetHogHat(gear,'WhySoSerious')
+ SetHealth(gear, ( mutant_base_health + numhhs*25) )
+ SetEffect(gear, hePoisoned, 1)
+ setGearValue(mutant,"SelfDestruct",false)
+ setGearValue(gear, "Feeder", false)
+
+ AddCaption(getGearValue(gear, "Name") .. loc(" HAS MUTATED"))
+
+ TurnTimeLeft=0
+
+ AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
+ AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
+ AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
+ AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
+ AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
+ PlaySound(sndSuddenDeath)
+end
+
+function teamScan()
+
+ for i=0, TeamsCount-1 do --nil filling
+ teams[i]=nil
+ end
+
+ for i=0, #hhs do
+ for j=0, TeamsCount-1 do
+ if teams[j] ==nil and hhs[i]~=nil then
+ teams[j] = GetHogTeamName(hhs[i])
+ setTeamValue(teams[j],"Score",0)
+ setTeamValue(teams[j], "DeadHogs",0)
+ break
+ end
+
+ if teams[j] == GetHogTeamName(hhs[i]) then
+ break
+ end
+ end
+ end
+
+ ---***---
+end
+
+function set_Mutant_and_Score(gear)
+
+local curr_team = GetHogTeamName(CurrentHedgehog)
+
+ if gear == CurrentHedgehog then
+ if CurrentHedgehog == mutant then
+ PlaySound(sndHomerun)
+ if getGearValue(gear, "SelfDestruct")==false then
+ decreaseTeamValue(curr_team,"Score")
+ end
+ backToNormal(gear)
+ else
+ decreaseTeamValue(curr_team,"Score")
+ end
+
+ else
+ if gear == mutant then
+ backToNormal(mutant)
+ if curr_team ~=GetHogTeamName(gear) then
+ if getGearValue(CurrentHedgehog, "Alive") then
+ setMutantStuff(CurrentHedgehog)
+ setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") + mutant_kill_reward))
+ end
+ else
+ setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") - team_fire_punishment))
+ end
+ else
+ if mutant==nil then
+ if curr_team ~=GetHogTeamName(gear) then
+ if getGearValue(CurrentHedgehog, "Alive") then
+ setMutantStuff(CurrentHedgehog)
+ setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") + mutant_kill_reward))
+ else
+ increaseTeamValue(curr_team,"Score")
+ end
+ else
+ setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") - team_fire_punishment))
+ end
+ else
+ if curr_team ~=GetHogTeamName(gear) then
+ if CurrentHedgehog==mutant and getGearValue(mutant,"SelfDestruct")==false then
+ SetHealth(CurrentHedgehog, GetHealth(CurrentHedgehog)+kill_reward)
+ AddCaption("+" .. kill_reward .. loc(" HP") )
+ increaseTeamValue(curr_team,"Score")
+ end
+ if getGearValue(CurrentHedgehog,"Feeder") then
+ increaseTeamValue(curr_team,"Score")
+ end
+ else
+ setTeamValue(curr_team,"Score",(getTeamValue(curr_team,"Score") - team_fire_punishment))
+ end
+ end
+ end
+ end
+end
+
+function onGearResurrect(gear)
+if not gameOver then
+ if GetGearType(gear) == gtHedgehog then
+
+ increaseTeamValue(GetHogTeamName(gear), "DeadHogs")
+
+ if gear==CurrentHedgehog then
+ setGearValue(CurrentHedgehog, "Alive", false)
+ end
+ set_Mutant_and_Score(gear)
+ if gear~=CurrentHedgehog then
+ killsCounter = killsCounter + 1
+ countBodies()
+ end
+ AddVisualGear(GetX(gear), GetY(gear), vgtSmokeRing, 0, false)
+ PlaySound(sndWhack)
+ updateScore()
+ end
+end
+end
+
+function onGearAdd(gear)
+
+ -- Catch hedgehogs for the tracker
+ if GetGearType(gear) == gtHedgehog then
+ trackGear(gear)
+ hhs[numhhs] = gear
+ numhhs = numhhs + 1
+ SetEffect(gear, heResurrectable, 1)
+ end
+end
+
+function checkEmptyTeam (teamName)
+ for i=0 , #hhs do
+ if hhs[i]~=nil then
+ if teamName == GetHogTeamName(hhs[i]) then
+ return false
+ end
+ end
+ end
+ return true
+end
+
+function onGearDelete(gear)
+ -- Remove hogs that are gone
+ if GetGearType(gear) == gtHedgehog then
+ numhhs = numhhs - 1
+
+ local found
+ for i=0, #hhs do
+ if hhs[i] == gear then
+ found = i
+ break
+ end
+ end
+ for i = found, #hhs - 1 do
+ hhs[i] = hhs[i + 1]
+ end
+ hhs[#hhs] = nil
+
+ local t_name = GetHogTeamName(gear)
+ if checkEmptyTeam(t_name) then
+ for i = 0, TeamsCount - 1 do
+ if teams[i] == t_name then
+ found = i
+ break
+ end
+ end
+ for i = found, TeamsCount - 2 do
+ teams[i] = teams[i + 1]
+ end
+ teams[TeamsCount - 1] = nil
+ TeamsCount = TeamsCount - 1
+ end
+ AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
+ trackDeletion(gear)
+ end
+end
+
+--[[
+S T A R R I N G
+ prof - Coding, implementing and evangelism
+ vos - Initial idea and script improvements
+ mikade - Moving the `how to play` into the game so that people know `how to play`, and whitespace :D
+--]]
--- a/share/hedgewars/Data/Scripts/Multiplayer/Racer.lua Wed May 29 17:47:54 2013 -0400
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Racer.lua Thu May 30 19:34:39 2013 +0900
@@ -1,700 +1,706 @@
-
-------------------------------------------
--- RACER 0.5
--- map-independant racing script
--- by mikade
------------------------------------------
-
------------------------------------
---0.1: took all the code from crazy racer and scrapped most of it
------------------------------------
-
--- Removed tumbler system
--- Removed extra adds like boosters etc
--- Added experimental waypoint placement system
--- More user feedback
--- Reduced race complexity limit to 5 waypoints
--- stop placement at complexity limit reached and end turn
--- guys dont keep racing after dying
--- invulnerable feasibility
--- reverted time keeping method
--- reduced feedback display time
--- colour-coded addcaptions
--- cleaned up code
--- support for more players properly added
--- tardis fix
--- remove airstrikes
-
--- i think the remainder 0 .456 sec of the tracktime isnt getting reset on newturn
-
--- update feedback
-
--------
--- 0.2
--------
-
--- allow gameflags
--- extend time to 90s
--- remove other air-attack based weps
--- turn off water rise for sd
-
--------
--- 0.3
--------
-
--- prevent WP being placed in land
--- prevent waypoints being placed outside border
-
--------
--- 0.4
--------
-
--- update user feedback
--- add more sounds
-
--------
--- 0.5
--------
-
--- fix ghost disappearing if hog falls in water or somehow dies
--- lengthen ghost tracking interval to improve performance on slower machines
--- increase waypoint limit to 8
--- allow for persistent showmission information
-
------------------------------
--- SCRIPT BEGINS
------------------------------
-
-HedgewarsScriptLoad("/Scripts/Locale.lua")
-
-------------------
--- Got Variables?
-------------------
-
-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
-
---------------------------
--- 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 roundN
-local lastRound
-local RoundHasChanged
-
--------------------
--- general methods
--------------------
-
-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
-
-----------------------------------
--- GAME METHODS / EVENT HANDLERS
-----------------------------------
-
-function onGameInit()
- GameFlags = GameFlags + gfInfAttack + gfInvulnerable
- CaseFreq = 0
- TurnTime = 90000
- WaterRise = 0
-end
-
-
-function onGameStart()
-
- roundN = 0
- lastRound = TotalRounds
- RoundHasChanged = false -- true
-
- RebuildTeamInfo()
-
- ShowMission (
- loc("RACER"),
- loc("a Hedgewars mini-game"),
-
- loc("Build a track and race.") .. "|" ..
- loc("Round Limit:") .. " " .. roundLimit .. "|" ..
-
- "", 4, 4000
- )
-end
-
-function PlaceWayPoint(x,y)
-
- if (wpCount < wpLimit) then -- seems to not work with a hedgehog nil chek
-
- wpX[wpCount] = x
- wpY[wpCount] = y
- wpCol[wpCount] = 0xffffffff
- wpCirc[wpCount] = AddVisualGear(wpX[wpCount],wpY[wpCount],vgtCircle,0,true)
- --100
- 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
-
-function onNewTurn()
-
- CheckForNewRound()
-
- racerActive = false
-
- 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
- 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)
- ParseCommand("setweap " .. string.char(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()
-
- -- 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
-
-
- -- 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 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)
- FollowGear(CurrentHedgehog)
-
- HideMission()
-
- else
- -- still in placement mode
- end
-
- end
- 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 (gameBegun == true) 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()
- racerActive = false
- 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
-
- -- if the player stops and "dies" or flies into water, stop him racing
- --[[if gear == CurrentHedgehog then
- DisableTumbler()
- ShowMission(loc("RACER"),
- loc("TRACK FAILED!"),
- loc("WINNING TIME: ") .. bestTimeComment, -amSkip, 4000)
- end]]
-
-end
-
-function onGearAdd(gear)
-
- if GetGearType(gear) == gtHedgehog then
- hhs[numhhs] = gear
- numhhs = numhhs + 1
- SetEffect(gear, heResurrectable, 1)
- end
-
- if GetGearType(gear) == gtAirAttack then
- cGear = gear
- end
-
-end
-
-function onGearDelete(gear)
-
- if GetGearType(gear) == gtAirAttack then
- cGear = nil
- end
-
-end
-
---[[function onAmmoStoreInit()
- SetAmmo(amRope, 9, 0, 0, 0)
- SetAmmo(amJetpack, 9, 0, 0, 0)
- SetAmmo(amSkip, 9, 0, 0, 0)
-end]]
-
-
+
+------------------------------------------
+-- RACER 0.6
+-- map-independant racing script
+-- by mikade
+-----------------------------------------
+
+-----------------------------------
+--0.1: took all the code from crazy racer and scrapped most of it
+-----------------------------------
+
+-- Removed tumbler system
+-- Removed extra adds like boosters etc
+-- Added experimental waypoint placement system
+-- More user feedback
+-- Reduced race complexity limit to 5 waypoints
+-- stop placement at complexity limit reached and end turn
+-- guys dont keep racing after dying
+-- invulnerable feasibility
+-- reverted time keeping method
+-- reduced feedback display time
+-- colour-coded addcaptions
+-- cleaned up code
+-- support for more players properly added
+-- tardis fix
+-- remove airstrikes
+
+-- i think the remainder 0 .456 sec of the tracktime isnt getting reset on newturn
+
+-- update feedback
+
+-------
+-- 0.2
+-------
+
+-- allow gameflags
+-- extend time to 90s
+-- remove other air-attack based weps
+-- turn off water rise for sd
+
+-------
+-- 0.3
+-------
+
+-- prevent WP being placed in land
+-- prevent waypoints being placed outside border
+
+-------
+-- 0.4
+-------
+
+-- update user feedback
+-- add more sounds
+
+-------
+-- 0.5
+-------
+
+-- fix ghost disappearing if hog falls in water or somehow dies
+-- lengthen ghost tracking interval to improve performance on slower machines
+-- increase waypoint limit to 8
+-- allow for persistent showmission information
+
+-------
+-- 0.6
+-------
+
+-- remove hogs from racing area as per request
+
+-----------------------------
+-- SCRIPT BEGINS
+-----------------------------
+
+HedgewarsScriptLoad("/Scripts/Locale.lua")
+
+------------------
+-- Got Variables?
+------------------
+
+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
+
+--------------------------
+-- 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 roundN
+local lastRound
+local RoundHasChanged
+
+-------------------
+-- general methods
+-------------------
+
+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 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 onGameInit()
+ GameFlags = bor(GameFlags,gfInfAttack + gfInvulnerable)
+ CaseFreq = 0
+ TurnTime = 90000
+ WaterRise = 0
+end
+
+
+function onGameStart()
+
+ roundN = 0
+ lastRound = TotalRounds
+ RoundHasChanged = false -- true
+
+ RebuildTeamInfo()
+
+ 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 (wpCount < wpLimit) then -- seems to not work with a hedgehog nil chek
+
+ wpX[wpCount] = x
+ wpY[wpCount] = y
+ wpCol[wpCount] = 0xffffffff
+ wpCirc[wpCount] = AddVisualGear(wpX[wpCount],wpY[wpCount],vgtCircle,0,true)
+ --100
+ 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
+
+function onNewTurn()
+
+ CheckForNewRound()
+ TryRepositionHogs()
+
+ racerActive = false
+
+ 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
+ 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)
+ ParseCommand("setweap " .. string.char(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()
+
+ -- 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
+
+
+ -- 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 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)
+ FollowGear(CurrentHedgehog)
+
+ HideMission()
+
+ else
+ -- still in placement mode
+ end
+
+ end
+ 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 (gameBegun == true) 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()
+ racerActive = false
+ 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 onGearAdd(gear)
+
+ if GetGearType(gear) == gtHedgehog then
+ hhs[numhhs] = gear
+ numhhs = numhhs + 1
+ SetEffect(gear, heResurrectable, 1)
+ end
+
+ if GetGearType(gear) == gtAirAttack then
+ cGear = gear
+ end
+
+end
+
+function onGearDelete(gear)
+
+ if GetGearType(gear) == gtAirAttack then
+ cGear = nil
+ end
+
+end