share/hedgewars/Data/Maps/TrophyRace/map.lua
author Wuzzy <Wuzzy2@mail.ru>
Thu, 15 Feb 2018 18:32:28 +0100
changeset 13009 67cc3cac4c8e
parent 13008 99ff8f4810f4
child 13010 d92c364f004d
permissions -rw-r--r--
TrophyRace: Show fastest team times (instead of clan times)

-- 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 = {}

-- 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
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()
    if TurnTimeLeft == 0 then
        killHog()
    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
            --give it a sound;)
            if ttime < besttime then
                PlaySound (sndHomerun)
            else
                PlaySound (sndHellish)
            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)
                fastestStr = loc("NEW fastest lap: %.3fs by %s")
            else
                fastestStr = loc("Fastest lap: %.3fs by %s")
            end
            if ttime > worsttime then
                worsttime = ttime
                worsthog = CurrentHedgehog
            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

            -- print list of best team times
            hscore = hscore .. "| |" .. loc("Best laps per team: ") .. "|"
            for teamName, teamTime in pairs(bestTimes) do
                if teamTime ~= 0 and teamTime ~= nil then
                    -- <Team name>: <best team time in seconds>
                    hscore = hscore .. "|" .. string.format(loc("%s: %.3fs"), teamName, (teamTime / 1000))
                end
            end

            local strtime = string.format(loc("Time: %.3fs"), (ttime/1000))
            ShowMission(loc("TrophyRace"), loc("Status update"), strtime .. hscore, 0, 0)
            AddCaption(strtime, GetClanColor(GetHogClan(CurrentHedgehog)), capgrpMessage2)
            AddCaption(loc("Track completed!"), 0xFFFFFFFF, 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 onGearAdd(gear)
    if GetGearType(gear) == gtHedgehog then
        hhs[numhhs] = gear
        times[numhhs] = 0
        numhhs = numhhs + 1
    end
--    elseif GetGearType(gear) == gtRope then -- rope is shot
end

--function onGearDelete(gear)
--    if GetGearType(gear) == gtRope then -- rope deletion - hog didn't manage to rerope
--        --TurnTimeLeft = 0 -- end turn or not? hm...
--        lasthog = CurrentHedgehog
--        
--    end
--end

function onAchievementsDeclaration()
    for team,time in pairs(bestTimes) do
        DeclareAchievement("rope race", team, "TrophyRace", time)
    end
end