--     ____                _       __               
--    / __ )____  _____   | |     / /___ ___________
--   / __  / __ \/ ___/   | | /| / / __ `/ ___/ ___/
--  / /_/ / /_/ (__  )    | |/ |/ / /_/ / /  (__  ) 
-- /_____/\____/____/     |__/|__/\__,_/_/  /____/  
--                                              
--       A futuristic real-time strategy game.
--          This file is part of Bos Wars.
--
--  level01.sms  -  Tutorial map 1.
--
--  (c) Copyright 2006-2007 by Francois Berteen and Jimmy Salmon
--
--      This program is free software; you can redistribute it and/or modify
--      it under the terms of the GNU General Public License as published by
--      the Free Software Foundation; either version 2 of the License, or
--      (at your option) any later version.
--  
--      This program is distributed in the hope that it will be useful,
--      but WITHOUT ANY WARRANTY; without even the implied warranty of
--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--      GNU General Public License for more details.
--  
--      You should have received a copy of the GNU General Public License
--      along with this program; if not, write to the Free Software
--      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
--
--=============================================================================
--  Define level 01 Map Presentation
--

Load("maps/campaigns/tutorial/tutorial.map/setup.sms")

CreateUnit("unit-engineer", 0, {5, 59})
CreateUnit("unit-vault", 1, {22, 38})

DisallowAllUnits()

local function Play(sound)
  StopAllChannels()
  PlaySoundFile("campaigns/tutorial/" .. sound, function() end)
end


local function GetOwnUnitsAmount(type)
  return ThisPlayer.UnitTypesCount[UnitTypeByIdent(type).Slot]
end

-- Vault rescued
AddTrigger(
  function() return Players[1].TotalNumUnits == 0 end,
  function()
    AddMessage("-- Incoming transmission from Central Command: --")
    AddMessage("It appears the entire base was destroyed except for this vault.")
    AddMessage("We need to rebuild this base as quickly as possible before it gets attacked again.")
    AddMessage("Your new orders are to build 2 power plants and a magma pump.")
    AddMessage("You'll need to gather some resources first. Use your engineer to harvest some energy from the trees or magma from the rocks.")
    AddMessage("-- End transmission --")
    Play("level01-01.wav")
    SetObjectives("Build 2 power plants and a magma pump")

    DefineAllow("unit-powerplant", AllowAll)
    DefineAllow("unit-magmapump", AllowAll)
    AddTrigger2()
    AddTrigger3()
    return false
  end)

-- Started gathering resources
function AddTrigger2()
  local function resname()
    if (ThisPlayer.EnergyStored ~= 0) then
      return "energy"
    else
      return "magma"
    end
  end

  AddTrigger(
    function() return ThisPlayer.EnergyStored ~= 0 or ThisPlayer.MagmaStored ~= 0 end,
    function()
      AddMessage("Good job. You are now gathering " .. resname() .. " and storing it in the vault to use later.")
      AddMessage("The numbers at the top of the screen indicate the rate you are collecting and using each resource followed by the amount you have in storage.")
      return false
    end)
end

-- Power plants and magma pump
function AddTrigger3()
  AddTrigger(
    function() return GetOwnUnitsAmount("unit-powerplant") >= 2 and
      GetOwnUnitsAmount("unit-magmapump") >= 1 end,
    function()
      AddMessage("-- Incoming transmission from Central Command: --")
      AddMessage("Nice work. Now that we've got some resources to work with we should concentrate on building some defenses.")
      AddMessage("Your next objective is to build a training camp then some assault units.")
      AddMessage("-- End transmission --")
      Play("level01-03.wav")
      SetObjectives("Build a training camp and 3 assault units")

      DefineAllow("unit-camp", AllowAll)
      DefineAllow("unit-assault", AllowAll)
      AddTrigger4()
      return false
    end)
end

-- Training camp
function AddTrigger4()
  AddTrigger(
    function() return GetOwnUnitsAmount("unit-camp") >= 1 end,
    function()
      AddMessage("-- Incoming transmission from Central Command: --")
      AddMessage("Now that you have a training camp you can start training assault units.")
      AddMessage("Click on the training camp then train 3 assault units.")
      AddMessage("-- End transmission --")
      Play("level01-04.wav")
      SetObjectives("Train 3 assault units")

      AddTrigger5()
      return false
    end)
end

-- Assault units
function AddTrigger5()
  AddTrigger(
    function() return GetOwnUnitsAmount("unit-assault") >= 3 end,
    function()
      AddMessage("-- Incoming transmission from Central Command: --")
      AddMessage("Excellent work. The base is now in good enough shape to be able to defend itself from future attacks.")
      AddMessage("-- End transmission --")
      Play("level01-05.wav")
      AddTrigger6(GameCycle)
      return false
    end)
end

-- Delay after last message
function AddTrigger6(cycle)
  AddTrigger(
    function() return GameCycle >= cycle + 400 end,
    function() return StopGame(GameVictory) end)
end


Players[0]:SetStartView(5, 59)
AddMessage("You must first locate the base.")
AddMessage("Start by clicking on your engineer then order it to move to the center of the map.")

