tests/lua/staticmines.lua
author Wuzzy <Wuzzy2@mail.ru>
Sat, 27 Oct 2018 15:55:19 +0200
changeset 14014 f09276eb0c27
parent 12652 31c4a81823eb
permissions -rw-r--r--
Add 7 new taunts New sounds: * Bugger, Drat: Hog damages self only * Thisoneismine: Crate drop * Whatthe: Something is going to blow up close to hog * Solong, Ohdear: Death * Gonnagetyou: Vow for revenge Fallback code is added for existing voicepacks Thisoneismine is not used in Robot because the text in this sound file is "Threat detected.", which does not make sense.

--[[ Static Mines Test

This test tests if mines are able to stand still on the ground for a very long time. 8 mines are spawned on a few girders.

The test passes if the mines don't move for a very long time.
The test failes if any mine moves even the tiniest bit or is destroyed.

This test case has been created as response to bug 96.
]]

-- Max. time to test
local TEST_TIME_LIMIT = 3600000 * 5 -- 5 hours

local hhs = {}

function onGameInit()

	ClearGameFlags()
	EnableGameFlags(gfDisableWind, gfOneClanMode)
	Map = ""
	Seed = 12
	Theme = "Desert"
	MapGen = mgDrawn
	TurnTime = -1
	Explosives = 0
	MinesNum = 0
	CaseFreq = 0
	Delay = 100
	WaterRise = 0
	HealthDecrease = 0
	AirMinesNum = 0


	AddTeam("Test Team", 0xFFFF00, "Statue", "Tank", "Default", "cm_test")
	hhs[1] = AddHog("Test Hog", 0, 100, "cm_test")
	SetGearPosition(hhs[1], 300, 1450)
end

local mines = {
	{ x = 231, y = 1708},
	{ x = 290, y = 1708},
	{ x = 342, y = 1708},
	{ x = 261, y = 1708},
	{ x = 319, y = 1708},
	{ x = 403, y = 1706},
	{ x = 428, y = 1706},
	{ x = 461, y = 1706},
	{ x = 498, y = 1706},
	{ x = 518, y = 1706},
}

function LoadGearData()
	------ GIRDER LIST ------
	PlaceGirder(290, 1718, 4)
	PlaceGirder(290, 1790, 4)
	PlaceGirder(452, 1716, 4)
	PlaceGirder(452, 1790, 4)
	
	PlaceGirder(300, 1500, 4)

	------ MINE LIST ------
	for m=1, #mines do
		mines[m].gear = AddGear(mines[m].x, mines[m].y, gtMine, 0, 0, 0, 0)
	end

end

function onGameStart()
	LoadGearData()
end

function onGearDelete(gear)
	for m=#mines, 1, -1 do
		if gear == mines[m] then
			WriteLnToConsole(string.format("Mine %d died!", m))
			table.remove(mines, m)
		end
	end
end

-- Give a short time for the mines to settle first.
local checkTimer = -5000
local initPosCheck = false
-- Count the total times the mines managed to stand still
local totalTime = 0
local fin = false
function onGameTick20()
	if fin then
		return
	end
	-- Infinite turn time
	if TurnTimeLeft < 6000 then
		TurnTimeLeft = -1
	end
	checkTimer = checkTimer + 20
	if initPosCheck then
		totalTime = totalTime + 20
	end
	if checkTimer >= 1000 then
		local failed = false
		for m=1, #mines do
			if not initPosCheck then
				-- Position initialization
				-- Save “real” x and y values after the mines have settled
				local x, y = GetGearPosition(mines[m].gear)
				mines[m].rx = x
				mines[m].ry = y
			else
				-- Position check
				local x, y = GetGearPosition(mines[m].gear)
				local rx, ry = mines[m].rx, mines[m].ry
				if not x or not y then
					WriteLnToConsole(string.format("Mine %d has died!", m))
					failed = true
				elseif x ~= rx or y ~= ry then
					WriteLnToConsole(string.format("Mine %d has moved! Expected: (%d, %d). Actual: (%d, %d)", m, rx, ry, x, y))
					failed = true
				end
			end
		end
		if not initPosCheck then
			initPosCheck = true
		end
		if failed then
			WriteLnToConsole(string.format("Test failed. The mines managed to stand still for %d ticks.", totalTime))
			EndLuaTest(TEST_FAILED)
			fin = true
			return
		end
	end
	if totalTime >= TEST_TIME_LIMIT then
		WriteLnToConsole(string.format("All mines have been static for over %d ticks! Success!", TEST_TIME_LIMIT))
		EndLuaTest(TEST_SUCCESSFUL)
		fin = true
		return
	end
end