share/hedgewars/Data/Scripts/Animate.lua
changeset 7205 cdc38e49a276
child 7213 fce7de71742f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Scripts/Animate.lua	Mon Jun 25 11:17:19 2012 +0300
@@ -0,0 +1,354 @@
+local animPos, lastx, lasty, jumpTypes, jumpTimes, moveDirs, jumpStarted
+local backJumped, jTimer, awTime, globalWait, stageEvents, seNum
+local AnimList, AnimListNum
+local FunctionList, FunctionListNum
+local skipFuncList
+local skipping
+--------------------------------Animation---------------------------------
+--------------------------(In-game cinematics)----------------------------
+
+function AddSkipFunction(anim, func, args)
+  skipFuncList[anim] = {sfunc = func, sargs = args}
+end
+
+function RemoveSkipFunctin(anim)
+  skipFuncList[anim] = nil
+end
+
+function SetAnimSkip(bool)
+  skipping = bool
+end
+
+function AnimInProgress()
+  return AnimListNum ~= 0
+end
+
+function SkipAnimation(anim)
+  if skipFuncList[anim] == nil then
+    return
+  else 
+    skipFuncList[anim].sfunc(unpack(skipFuncList[anim].sargs))
+  end
+end
+
+function AddFunction(element)
+  table.insert(FunctionList, element)
+  FunctionListNum = FunctionListNum + 1
+end
+
+function RemoveFunction()
+  table.remove(FunctionList, 1)
+  FunctionListNum = FunctionListNum - 1
+end
+
+function ExecuteAfterAnimations()
+  if FunctionListNum == 0 then
+    return
+  end
+  FunctionList[1].func(unpack(FunctionList[1].args))
+  RemoveFunction()
+end
+
+function AnimInit()
+  animPos = 1
+  lastx = 0
+  lasty = 0
+  jumpTypes = {long = gmLJump, high = gmHJump, back = gmHJump}
+  jumpTimes = {long = 500, high = 500, back = 300, backback = 500} 
+  moveDirs = {right = gmRight, left = gmLeft}
+  jumpStarted = false
+  backJumped = false
+  jTimer = 0
+  awTime = 0
+  globalWait = 0
+  stageEvents = {}
+  seNum = 0
+  AnimList = {}
+  AnimListNum = 0
+  FunctionList = {}
+  FunctionListNum = 0
+  skipping = false
+  skipFuncList = {}
+end
+
+function AnimSwitchHog(gear)
+  SwitchHog(gear)
+  FollowGear(gear)
+  SetGearMessage(gear, 0)
+  return true
+end
+
+function AnimGiveState(gear, state)
+  SetState(gear, state)
+  return true
+end
+
+function AnimRemoveState(gear, state)
+  SetState(gear, band(GetState(gear), bnot(state)))
+  return true
+end
+
+function AnimGearWait(gear, time)
+  AnimWait(gear, time)
+  return true
+end
+
+function AnimUnWait()
+  if globalWait > 0 then
+    globalWait = globalWait - 1
+  end
+end
+
+function AnimWait(gear, time)   -- gear is for compatibility with Animate
+  globalWait = globalWait + time
+  return true
+end
+
+function AnimWaitLeft()
+  return globalWait
+end
+
+function AnimSay(gear, text, manner, time)
+  HogSay(gear, text, manner, 2)
+  if time ~= nil then
+    AnimWait(gear, time)
+  end
+  return true
+end
+
+function AnimSound(gear, sound, time)
+  PlaySound(sound, gear)
+  AnimWait(gear, time)
+  return true
+end
+
+function AnimTurn(gear, dir)
+  if dir == "Right" then
+    HogTurnLeft(gear, false)
+  else
+    HogTurnLeft(gear, true)
+  end
+  return true
+end
+
+function AnimFollowGear(gear)
+  FollowGear(gear)
+  return true
+end
+
+function AnimMove(gear, dir, posx, posy)
+  dirr = moveDirs[dir]
+  SetGearMessage(gear, dirr)
+  if GetX(gear) == posx or GetY(gear) == posy then
+    SetGearMessage(gear, 0)
+    lastx = GetX(gear)
+    lasty = GetY(gear)
+    return true
+  end
+  return false
+end
+
+function AnimJump(gear, jumpType)
+  if jumpStarted == false then
+    lastx = GetX(gear)
+    lasty = GetY(gear)
+    backJumped = false
+    jumpStarted = true
+    SetGearMessage(gear, jumpTypes[jumpType])
+    AnimGearWait(gear, jumpTimes[jumpType])
+  elseif jumpType == "back" and backJumped == false then
+    backJumped = true
+    SetGearMessage(gear, jumpTypes[jumpType])
+    AnimGearWait(gear, jumpTimes["backback"])
+  else
+    curx = GetX(gear)
+    cury = GetY(gear)
+    if curx == lastx and cury == lasty then
+      jumpStarted = false
+      backJumped = false
+      AnimGearWait(gear, 100)
+      return true
+    else
+      lastx = curx
+      lasty = cury
+      AnimGearWait(gear, 100)
+    end
+  end
+  return false
+end
+
+function AnimDisappear(gear, destX, destY)
+	AddVisualGear(GetX(gear)-5, GetY(gear)-5, vgtSmoke, 0, false)
+	AddVisualGear(GetX(gear)+5, GetY(gear)+5, vgtSmoke, 0, false)
+	AddVisualGear(GetX(gear)-5, GetY(gear)+5, vgtSmoke, 0, false)
+	AddVisualGear(GetX(gear)+5, GetY(gear)-5, vgtSmoke, 0, false)
+	SetGearPosition(gear, destX, destY)
+  return true
+end
+
+function AnimOutOfNowhere(gear, destX, destY)
+  SetGearPosition(gear, destX, destY)
+  AddVisualGear(destX, destY, vgtBigExplosion, 0, false)
+  AnimGearWait(gear, 50)
+  return true
+end
+
+function AnimTeleportGear(gear, destX, destY)
+	AddVisualGear(GetX(gear)-5, GetY(gear)-5, vgtSmoke, 0, false)
+	AddVisualGear(GetX(gear)+5, GetY(gear)+5, vgtSmoke, 0, false)
+	AddVisualGear(GetX(gear)-5, GetY(gear)+5, vgtSmoke, 0, false)
+	AddVisualGear(GetX(gear)+5, GetY(gear)-5, vgtSmoke, 0, false)
+	SetGearPosition(gear, destX, destY)
+	AddVisualGear(GetX(gear), GetY(gear), vgtBigExplosion, 0, false)
+  FollowGear(gear)
+  AnimGearWait(gear, 50)
+  return true
+end
+
+function AnimSetGearPosition(gear, x, y)
+  SetGearPosition(gear, x, y)
+  return true
+end
+
+function AnimVisualGear(gear, x, y, vgType, state, critical)
+  AddVisualGear(x, y, vgType, state, critical)
+  return true
+end
+
+function AnimCaption(gear, text, time)
+  AddCaption(text)
+  AnimWait(gear, time)
+  return true
+end
+
+function AnimCustomFunction(gear, func, args)
+  if args == nil then
+    args = {}
+  end
+  retval = func(unpack(args))
+  if retval == false then
+    return false
+  else
+    return true
+  end
+end
+
+function AnimInsertStepNext(step)
+  table.insert(AnimList[1], animPos + 1, step)
+  return true
+end
+
+function AnimShowMission(gear, caption, subcaption, text, icon, time)
+  ShowMission(caption, subcaption, text, icon, time)
+  return true
+end
+
+function RemoveAnim()
+  table.remove(AnimList, 1)
+  AnimListNum = AnimListNum - 1
+end
+
+function AddAnim(animation)
+  table.insert(AnimList, animation)
+  AnimListNum = AnimListNum + 1
+  if AnimListNum == 1 then
+    skipping = false
+  end
+end
+
+function ShowAnimation()
+  if AnimListNum == 0 then
+    skipping = false
+    return true
+  else
+    TurnTimeLeft = -1
+    if Animate(AnimList[1]) == true then
+      RemoveAnim()
+    end
+  end
+  return false
+end
+
+function Animate(steps)
+  if skipping == true then
+    animPos = 1
+    SetInputMask(0xFFFFFFFF)
+    SkipAnimation(steps)
+    return true
+  end
+    
+  if globalWait ~= 0 then
+    return false
+  end
+
+  if steps[animPos] == nil then
+      animPos = 1
+      SetInputMask(0xFFFFFFFF)
+      return true
+  end
+  
+  if steps[animPos].args[1] ~= CurrentHedgehog and steps[animPos].func ~= AnimWait 
+    and (steps[animPos].swh == nil or steps[animPos].swh == true) then
+      AnimSwitchHog(steps[animPos].args[1])
+  end
+
+  SetInputMask(band(0xFFFFFFFF, bnot(gmAnimate+gmAttack+gmDown+gmHJump+gmLeft+gmLJump+gmRight+gmSlot+gmSwitch+gmTimer+gmUp+gmWeapon)))
+  retVal = steps[animPos].func(unpack(steps[animPos].args))
+  if (retVal ~= false) then
+    animPos = animPos + 1
+  end
+
+  return false
+end
+
+------------------------------Event Handling------------------------------
+
+function AddEvent(condFunc, condArgs, doFunc, doArgs, evType)
+  seNum = seNum + 1
+  stageEvents[seNum] = {}
+  stageEvents[seNum].cFunc = condFunc
+  stageEvents[seNum].cArgs = condArgs
+  stageEvents[seNum].dFunc = doFunc
+  stageEvents[seNum].dArgs = doArgs
+  stageEvents[seNum].evType = evType
+end
+
+function RemoveEvent(evNum)
+  if stageEvents[evNum] ~= nil then
+    seNum = seNum - 1
+    table.remove(stageEvents, evNum)
+  end
+end
+
+function RemoveEventFunc(cFunc)
+  local i = 1
+  while i <= seNum do
+    if stageEvents[i].cFunc == cFunc then
+      RemoveEvent(i)
+      i = i - 1
+    end
+    i = i + 1
+  end
+end
+
+
+function CheckEvents()
+  local i = 1
+  while i <= seNum do
+    if stageEvents[i].cFunc(unpack(stageEvents[i].cArgs)) then
+      stageEvents[i].dFunc(unpack(stageEvents[i].dArgs))
+      if stageEvents[i].evType ~= 1 then 
+        RemoveEvent(i)
+        i = i - 1
+      end
+    end
+    i = i + 1
+  end
+end
+
+-------------------------------------Misc---------------------------------
+
+function StoppedGear(gear)
+  dx,dy = GetGearVelocity(gear)
+  return math.abs(dx) <= 1 and math.abs(dy) <= 1
+end