Add FastForward/StopFastForward (/ff hh:mm:ss, /sff) chat commands to fast forward to a specific timestamp in a demo
-- Hedgewars - Roperace for 2+ Players
-- DEVELOPER WARNING - FOR OFFICIAL DEVELOPMENT --
-- Be careful when editig this script, do not introduce changes lightly!
-- This script is used for time records on the official Hedgewars server.
-- Introducing breaking changes means we have to invalidate past time records!
HedgewarsScriptLoad("/Scripts/Locale.lua")
-- store number of hedgehogs
local numhhs = 0
-- store hedgehog gears
local hhs = {}
-- count how many hogs each clan has
local hogsByClan = {}
-- store best time per team
local clantimes = {}
-- store best times
local times = {}
-- in milisseconds
local maxtime = 99000
-- define start area (left, top, width, height)
local start_area = {1606, 498, 356, 80}
-- define goal area (left, top, width, height)
local goal_area = {2030, 300, 56, 280}
-- last active hog
local lasthog = nil
-- active hog reached the goal?
local reached = false
-- hog with worst time (per round)
local worsthog = nil
local besthog = nil
local besthogname = ''
-- best time
local besttime = maxtime + 1
-- best time per team
local bestTimes = {}
-- worst time (per round)
local worsttime = 0
local startTime = 0;
function onGameInit()
GameFlags = gfSolidLand + gfInvulnerable
TurnTime = maxtime
CaseFreq = 0
MinesNum = 0
Explosives = 0
Delay = 500
Theme = 'Olympics'
-- Disable Sudden Death
WaterRise = 0
HealthDecrease = 0
end
function onGameStart()
ShowMission(loc("TrophyRace"), loc("Race"),
loc("Use your rope to get from start to finish as fast as you can!") .. "|" ..
loc("In each round, the worst hedgehog of the round is eliminated.") .. "|" ..
loc("The last surviving clan wins."),
-amRope, 0)
started = true
p=1820
for i = 0, numhhs - 1 do
p = p + 50
SetGearPosition(hhs[i], p, 0)
end
for i=0, ClansCount-1 do
clantimes[i] = 0
end
if ClansCount >= 2 then
SendAchievementsStatsOff()
end
end
function onAmmoStoreInit()
SetAmmo(amRope, 9, 1, 0)
SetAmmo(amSkip, 9, 1, 0)
end
function killHog()
SetHealth(CurrentHedgehog, 0)
SetEffect(CurrentHedgehog, heInvulnerable, 0)
x, y = GetGearPosition(CurrentHedgehog)
AddGear(x, y-2, gtGrenade, 0, 0, 0, 2)
SetGearVelocity(CurrentHedgehog, 0, 0)
worsttime = 99999
worsthog = nil
lasthog = nil
end
function onHogAttack(ammoType)
if TurnTimeLeft == 0 then
killHog()
elseif ammoType == amRope then
HideMission()
end
end
function onNewTurn()
if lasthog ~= nil then
SetGearPosition(lasthog, p , 0)
if not reached then
end
end
startTime = 0
reached = false
if CurrentHedgehog ~= nil then
SetGearVelocity(CurrentHedgehog, 1, 0)
SetGearPosition(CurrentHedgehog, start_area[1] + start_area[3] / 2, start_area[2] + start_area[4] / 2)
SetWeapon(amRope)
lasthog = CurrentHedgehog
end
end
function onGameTick()
if startTime == 0 and TurnTimeLeft < maxtime then
startTime = GameTime
end
if CurrentHedgehog ~= nil and TurnTimeLeft == 1 then
killHog()
AddCaption(loc("Time's up!"), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpMessage2)
elseif CurrentHedgehog ~= nil then
x, y = GetGearPosition(CurrentHedgehog)
if not reached and x > goal_area[1] and x < goal_area[1] + goal_area[3] and y > goal_area[2] and y < goal_area[2] + goal_area[4] then -- hog is within goal rectangle
reached = true
local ttime = GameTime-startTime
local icon
-- give it a sound ;)
if ttime < besttime then
PlaySound (sndHomerun)
icon = 0
elseif ttime > worsttime then
PlaySound (sndHellish)
icon = -amSkip
else
icon = 2
end
for i = 0, numhhs - 1 do
if hhs[i] == CurrentHedgehog then
times[numhhs] = ttime
end
end
local hscore = "| |"
local clan = GetHogClan(CurrentHedgehog)
if ttime < clantimes[clan] or clantimes[clan] == 0 then
clantimes[clan] = ttime
end
local teamname = GetHogTeamName(CurrentHedgehog)
if bestTimes[teamname] == nil or bestTimes[teamname] > ttime then
bestTimes[teamname] = ttime
end
local fastestStr
if ttime < besttime then
besttime = ttime
besthog = CurrentHedgehog
besthogname = GetHogName(besthog)
else
end
fastestStr = loc("Fastest lap: %.3fs by %s")
if ttime > worsttime then
worsttime = ttime
worsthog = CurrentHedgehog
end
if worsthog then
hscore = hscore .. string.format(loc("Round's slowest lap: %.3fs by %s"), (worsttime / 1000), GetHogName(worsthog))
end
hscore = hscore .. " |" .. string.format(fastestStr, (besttime / 1000), besthogname)
if clan == ClansCount -1 then
-- Time for elimination - worst hog is out and the worst hog vars are reset.
if worsthog ~= nil then
SetHealth(worsthog, 0)
-- Drop a bazooka to make inactive slowest hog active.
x, y = GetGearPosition(worsthog)
AddGear(x, y, gtShell, 0, 0, 0, 0)
end
worsttime = 0
worsthog = nil
end
ShowMission(loc("TrophyRace"), loc("Status update"),
string.format(loc("Time: %.3fs by %s"), (ttime/1000), GetHogName(CurrentHedgehog))
.. hscore,
icon, 0)
AddCaption(string.format(loc("Time: %.3fs"), (ttime/1000)), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpMessage2)
AddCaption(loc("Track completed!"), capcolDefault, capgrpGameState)
EndTurn(true)
else
if (TurnTimeLeft > 0) and (TurnTimeLeft ~= TurnTime) and CurrentHedgehog ~= nil and GetHealth(CurrentHedgehog) > 0 and (not reached) and GameTime%100 == 0 then
local ttime = GameTime-startTime
AddCaption(string.format(loc("Time: %.1fs"), (ttime/1000)), GetClanColor(GetHogClan(CurrentHedgehog)), capgrpMessage2)
end
end
end
end
function WriteStats()
if besthog then
SendStat(siCustomAchievement, string.format(loc("The fastest hedgehog was %s from %s with a time of %.3fs."), besthogname, GetHogTeamName(besthog), besttime/1000))
else
SendStat(siCustomAchievement, loc("Nobody managed to finish the race. What a shame!"))
end
-- Write most skips
local mostSkips = 2 -- a minimum skip threshold is required
local mostSkipsTeam = nil
for i=0, TeamsCount-1 do
local teamName = GetTeamName(i)
local stats = GetTeamStats(teamName)
if stats.TurnSkips > mostSkips then
mostSkips = stats.TurnSkips
mostSkipsTeam = teamName
end
end
if mostSkipsTeam then
SendStat(siMaxTurnSkips, tostring(mostSkips) .. " " .. mostSkipsTeam)
end
end
function onGearAdd(gear)
if GetGearType(gear) == gtHedgehog then
hhs[numhhs] = gear
times[numhhs] = 0
numhhs = numhhs + 1
local clan = GetHogClan(gear)
if not hogsByClan[clan] then
hogsByClan[clan] = 0
end
hogsByClan[clan] = hogsByClan[clan] + 1
end
end
function areTwoOrMoreClansLeft()
local clans = 0
for i=0, ClansCount-1 do
if hogsByClan[i] >= 1 then
clans = clans + 1
end
if clans >= 2 then
return true
end
end
return false
end
function onGearDelete(gear)
if GetGearType(gear) == gtHedgehog then
local clan = GetHogClan(gear)
hogsByClan[clan] = hogsByClan[clan] - 1
if not areTwoOrMoreClansLeft() then
WriteStats()
end
end
end
function onAchievementsDeclaration()
for team,time in pairs(bestTimes) do
DeclareAchievement("rope race", team, "TrophyRace", time)
end
end