share/hedgewars/Data/Missions/Training/Basic_Training_-_Grenade.lua
author Wuzzy <Wuzzy2@mail.ru>
Sat, 08 Dec 2018 21:43:13 +0100
changeset 14393 cf49fac6e88a
parent 14387 f9d4b8222903
child 14469 ead8928a59f8
permissions -rw-r--r--
Make better re-use of some mission strings

--[[
	Basic Grenade Training

	This training mission teaches players how to use the grenade.
	Lesson plan:
	- Selecting grenade
	- Aiming and shooting
	- Timer
	- No wind
	- Bounciness
]]

HedgewarsScriptLoad("/Scripts/Locale.lua")

local hog			-- Hog gear
local weaponSelected = false	-- Player has selected the weapon
local gamePhase = 0		-- Used to track progress
local targetsLeft = 0		-- # of targets left in this round
local targetGears = {}		-- list of target gears
local gameOver = false		-- If true, game has ended
local shotsFired = 0		-- Total # of grenades fired
local maxTargets = 0		-- Target counter, used together with flawless
local flawless = true		-- track flawless victory (100% accuracy, no hurt, no death)
local missedTauntTimer = -1	-- Wait timer for playing sndMissed. -1 = no-op

function onGameInit()

	ClearGameFlags()
	EnableGameFlags(gfDisableWind, gfOneClanMode, gfInfAttack, gfSolidLand, gfArtillery)
	Map = "Mushrooms"
	Seed = 0
	Theme = "Nature"
	TurnTime = MAX_TURN_TIME
	Explosives = 0
	MinesNum = 0
	CaseFreq = 0
	WaterRise = 0
	HealthDecrease = 0

	------ TEAM LIST ------

	AddTeam(loc("Grenade Team"), -1, "Flower", "Earth", "Default", "cm_grenade")
	hog = AddHog(loc("Greenhorn"), 0, 1, "NoHat")
	SetGearPosition(hog, 570, 157)
	SetEffect(hog, heResurrectable, 1)

	SendHealthStatsOff()
end

function onGearResurrect(gear, vGear)
	if gear == hog then
		flawless = false
		SetGearPosition(hog, 570, 157)
		if vGear then
			SetVisualGearValues(vGear, GetX(hog), GetY(hog))
		end
		AddCaption(loc("Your hedgehog has been revived!"))
	end
end

local function placeGirders()
	PlaceGirder(918, 248, 1)
	PlaceGirder(888, 129, 6)
	PlaceGirder(844, 35, 1)
	PlaceGirder(932, 37, 3)
	PlaceGirder(926, 148, 6)
	PlaceGirder(73, 812, 5)
	PlaceGirder(189, 930, 5)
	PlaceGirder(15, 669, 6)
	PlaceGirder(15, 507, 6)
	PlaceGirder(15, 344, 6)
	PlaceGirder(62, 27, 0)
	PlaceGirder(229, 115, 0)
	PlaceGirder(1195, 250, 7)
	PlaceGirder(1285, 205, 1)
	PlaceGirder(1358, 201, 3)
	PlaceGirder(1756, 415, 6)
	PlaceGirder(1893, 95, 6)
	PlaceGirder(1005, 333, 5)
	PlaceGirder(1860, 187, 0)
end

local function spawnTargets()
	-- Warm-up
	if gamePhase == 0 then
		AddGear(882, 39, gtTarget, 0, 0, 0, 0)
	-- Timer
	elseif gamePhase == 2 then
		AddGear(233, 97, gtTarget, 0, 0, 0, 0)
		AddGear(333, 255, gtTarget, 0, 0, 0, 0)
		AddGear(753, 225, gtTarget, 0, 0, 0, 0)
	-- No Wind
	elseif gamePhase == 3 then
		AddGear(15, 240, gtTarget, 0, 0, 0, 0)
		AddGear(61, 9, gtTarget, 0, 0, 0, 0)
		AddGear(945, 498, gtTarget, 0, 0, 0, 0)
	-- Bounciness
	elseif gamePhase == 4 then
		AddGear(1318, 208, gtTarget, 0, 0, 0, 0)
		AddGear(1697, 250, gtTarget, 0, 0, 0, 0)
		if INTERFACE ~= "touch" then
			-- These targets may be too hard in touch interface because you cannot set bounciness yet
			-- FIXME: Allow these targets in touch when bounciness can be set
			AddGear(323, 960, gtTarget, 0, 0, 0, 0)
			AddGear(1852, 100, gtTarget, 0, 0, 0, 0)
		end
	-- Grand Final
	elseif gamePhase == 5 then
		AddGear(186, 473, gtTarget, 0, 0, 0, 0)
		AddGear(950, 250, gtTarget, 0, 0, 0, 0)
		AddGear(1102, 345, gtTarget, 0, 0, 0, 0)
		AddGear(1556, 297, gtTarget, 0, 0, 0, 0)
	end
end

function onGameStart()
	placeGirders()
	spawnTargets()
	ShowMission(loc("Basic Grenade Training"), loc("Basic Training"), loc("Destroy all the targets!"), -amGrenade, 0)
end

function newGamePhase()
	-- Spawn targets, update wind and ammo, show instructions
	local ctrl = ""
	if gamePhase == 0 then
		if INTERFACE == "desktop" then
			ctrl = loc("Open ammo menu: [Right click]").."|"..
			loc("Select weapon: [Left click]")
		else
			ctrl = loc("Open ammo menu: Tap the [Suitcase]")
		end
		ShowMission(loc("Basic Grenade Training"), loc("Select Weapon"), loc("To begin with the training, select the grenade from the ammo menu!").."|"..
		ctrl, 2, 5000)
	elseif gamePhase == 1 then
		if INTERFACE == "desktop" then
			ctrl = loc("Attack: [Space]").."|"..
			loc("Aim: [Up]/[Down]").."|"..
			loc("Change direction: [Left]/[Right]")
		elseif INTERFACE == "touch" then
			ctrl = loc("Attack: Tap the [Bomb]").."|"..
			loc("Aim: [Up]/[Down]").."|"..
			loc("Change direction: [Left]/[Right]")
		end
		ShowMission(loc("Basic Grenade Training"), loc("Warming Up"),
		loc("Throw a grenade to destroy the target!").."|"..
		loc("Hold the Attack key pressed for more power.").."|"..
		ctrl.."|"..
		loc("Note: Walking is disabled in this mission."), 2, 20000)
		spawnTargets()
	elseif gamePhase == 2 then
		if INTERFACE == "desktop" then
			ctrl = loc("Set detonation timer: [1]-[5]")
		elseif INTERFACE == "touch" then
			ctrl = loc("Change detonation timer: Tap the [Clock]")
		end
		ShowMission(loc("Basic Grenade Training"), loc("Timer"),
		loc("You can change the detonation timer of grenades.").."|"..
		loc("Grenades explode after 1 to 5 seconds (you decide).").."|"..
		ctrl, 2, 15000)
		spawnTargets()
	elseif gamePhase == 3 then
		ShowMission(loc("Basic Grenade Training"), loc("No Wind Influence"), loc("Unlike bazookas, grenades are not influenced by wind.").."|"..
		loc("Destroy the targets!"), 2, 6000)
		SetWind(50)
		spawnTargets()
	elseif gamePhase == 4 then
		local caption = loc("Bounciness")
		if INTERFACE == "desktop" then
			ctrl = loc("You can set the bounciness of grenades (and grenade-like weapons).").."|"..
			loc("Grenades with high bounciness bounce a lot and behave chaotic.").."|"..
			loc("With low bounciness, it barely bounces at all, but it is much more predictable.").."|"..
			loc("Try out different bounciness levels to reach difficult targets.").."|"..
			loc("Set bounciness: [Left Shift] + [1]-[5]")
		elseif INTERFACE == "touch" then
			-- FIXME: Bounciness can't be set in touch yet. :(
			caption = loc("Well done.")
			ctrl = loc("You're doing well! Here are more targets for you.")
		end

		ShowMission(loc("Basic Grenade Training"), caption, ctrl, 2, 20000)
		spawnTargets()
	elseif gamePhase == 5 then
		if INTERFACE == "desktop" then
			ctrl = loc("Precise Aim: [Left Shift] + [Up]/[Down]")
			-- FIXME: No precise aim in touch interface yet :(
		end
		ShowMission(loc("Basic Grenade Training"), loc("Final Targets"), loc("Good job! Now destroy the final targets to finish the training.").."|"..
		ctrl,
		2, 7000)
		spawnTargets()
	elseif gamePhase == 6 then
		ShowMission(loc("Basic Grenade Training"), loc("Training complete!"), loc("Congratulations!"), 0, 0)
		SetInputMask(0)
		AddAmmo(CurrentHedgehog, amGrenade, 0)
		if shotsFired > maxTargets then
			flawless = false
		end
		if flawless then
			PlaySound(sndFlawless, hog)
		else
			PlaySound(sndVictory, hog)
		end
		SendStat(siCustomAchievement, loc("Good job!"))
		SendStat(siGameResult, loc("You have completed the Basic Grenade Training!"))
		SendStat(siPlayerKills, "0", loc("Grenade Team"))
		EndGame()
		gameOver = true
	end
	gamePhase = gamePhase + 1
end

function onNewTurn()
	if gamePhase == 0 then
		newGamePhase()
	end
end

function onGameTick20()
	if not weaponSelected and gamePhase == 1 and GetCurAmmoType() == amGrenade then
		newGamePhase()
		weaponSelected = true
	end
end

function onHogAttack(ammoType)
	if ammoType == amGrenade then
		HideMission()
	end
end

function onAttack()
	if GetCurAmmoType() == amGrenade then
		HideMission()
	end
end

function onGearAdd(gear)
	if GetGearType(gear) == gtTarget then
		targetsLeft = targetsLeft + 1
		maxTargets = maxTargets + 1
		targetGears[gear] = true
	elseif GetGearType(gear) == gtGrenade then
		shotsFired = shotsFired + 1
	end
end

function onGearDelete(gear)
	if GetGearType(gear) == gtTarget then
		targetsLeft = targetsLeft - 1
		targetGears[gear] = nil
		if targetsLeft <= 0 then
			newGamePhase()
		end
	end
end

function onGearDamage(gear)
	if gear == hog then
		flawless = false
	end
end

function onAmmoStoreInit()
	SetAmmo(amGrenade, 9, 0, 0, 0)
end