share/hedgewars/Data/Missions/Campaign/A Classic Fairytale/united.lua
changeset 7222 4a17a921ec93
child 7225 e3f2280d9000
equal deleted inserted replaced
7219:6c7739c6446f 7222:4a17a921ec93
       
     1 
       
     2 loadfile(GetDataPath() .. "Scripts/Animate.lua")()
       
     3 
       
     4 -----------------------------Constants---------------------------------
       
     5 choiceAccept = 1
       
     6 choiceRefuse = 2
       
     7 choiceAttack = 3
       
     8 
       
     9 leaksPos = {2067, 509}
       
    10 densePos = {1882, 503}
       
    11 waterPos = {3100, 930}
       
    12 buffaloPos = {2609, 494}
       
    13 chiefPos = {2538, 617}
       
    14 cannibalPos = {{2219, 1339}, {2322, 1357}, {805, 784}, {3876, 1048},
       
    15               {1101, 916}, {2854, 1408}, {1974, 486}, {1103, 961}}
       
    16 
       
    17 HogNames = {"Olive", "Brain Stu", "Brainila", "Salivaslurper",
       
    18             "Spleenlover", "Tighlicker", "NomNom", "Mindy"}
       
    19 
       
    20 natives = {}
       
    21 -----------------------------Variables---------------------------------
       
    22 cannibals = {}
       
    23 cannibalDead = {}
       
    24 cannibalHidden = {}
       
    25 cratesSpawned = {}
       
    26 healthCratesSpawned = {}
       
    27 
       
    28 denseDead = false
       
    29 leaksDead = false
       
    30 waterDead = false
       
    31 buffaloDead = false
       
    32 chiefDead = false
       
    33 nativesDead = {}
       
    34 
       
    35 m2Choice = 0
       
    36 m2DenseDead = 0
       
    37 
       
    38 startAnim = {}
       
    39 wave2Anim = {}
       
    40 finalAnim = {}
       
    41 --------------------------Anim skip functions--------------------------
       
    42 function AfterStartAnim()
       
    43   local goal = "Defeat the cannibals!|"
       
    44   local chiefgoal = "Try to protect the chief! Unlike your other hogs, he won't return on future missions if he dies."
       
    45   TurnTimeLeft = TurnTime
       
    46   ShowMission("United We Stand", "Invasion", goal .. chiefgoal, 1, 6000)
       
    47 end
       
    48 
       
    49 function SkipStartAnim()
       
    50   SetGearPosition(water, 2467, 754)
       
    51   if cratesSpawned[1] ~= true then
       
    52     SpawnCrates(1)
       
    53   end
       
    54   if healthCratesSpawned[1] ~= true then
       
    55     SpawnHealthCrates(1)
       
    56   end
       
    57   if cannibalHidden[1] == true then
       
    58     RestoreWave(1)
       
    59   end
       
    60   AnimSwitchHog(leaks)
       
    61 end
       
    62 
       
    63 function SkipWave2Anim()
       
    64   if cratesSpawned[2] ~= true then
       
    65     SpawnCrates(2)
       
    66   end
       
    67   if healthCratesSpawned[2] ~= true then
       
    68     SpawnHealthCrates(2)
       
    69   end
       
    70   if cannibalHidden[5] == true then
       
    71     RestoreWave(2)
       
    72   end
       
    73   AnimSwitchHog(cannibals[5])
       
    74 end
       
    75 
       
    76 function AfterWave2Anim()
       
    77   TurnTimeLeft = 0
       
    78 end
       
    79 
       
    80 function AfterFinalAnim()
       
    81   if chiefDead == true then
       
    82     SaveCampaignVar("M4ChiefDead", "1")
       
    83   else
       
    84     SaveCampaignVar("M4ChiefDead", "0")
       
    85   end
       
    86   SaveCampaignVar("Progress", "4")
       
    87   ParseCommand("teamgone 011101001")
       
    88   TurnTimeLeft = 0
       
    89 end
       
    90 -----------------------------Animations--------------------------------
       
    91 
       
    92 function EmitDenseClouds(anim, dir)
       
    93   local dif
       
    94   if dir == "left" then
       
    95     dif = 10
       
    96   else
       
    97     dif = -10
       
    98   end
       
    99   AnimInsertStepNext({func = AnimVisualGear, args = {dense, GetX(dense) + dif, GetY(dense) + dif, vgtSteam, 0, true}, swh = false})
       
   100   AnimInsertStepNext({func = AnimVisualGear, args = {dense, GetX(dense) + dif, GetY(dense) + dif, vgtSteam, 0, true}, swh = false})
       
   101   AnimInsertStepNext({func = AnimVisualGear, args = {dense, GetX(dense) + dif, GetY(dense) + dif, vgtSteam, 0, true}, swh = false})
       
   102   AnimInsertStepNext({func = AnimWait, args = {dense, 800}})
       
   103   AnimInsertStepNext({func = AnimVisualGear, args = {dense, GetX(dense) + dif, GetY(dense) + dif, vgtSteam, 0, true}, swh = false})
       
   104   AnimInsertStepNext({func = AnimVisualGear, args = {dense, GetX(dense) + dif, GetY(dense) + dif, vgtSteam, 0, true}, swh = false})
       
   105   AnimInsertStepNext({func = AnimWait, args = {dense, 800}})
       
   106   AnimInsertStepNext({func = AnimVisualGear, args = {dense, GetX(dense) + dif, GetY(dense) + dif, vgtSteam, 0, true}, swh = false})
       
   107 end
       
   108 
       
   109 function AnimationSetup()
       
   110   table.insert(startAnim, {func = AnimWait, args = {leaks, 4000}})
       
   111   table.insert(startAnim, {func = AnimCaption, args = {leaks, "Back in the village, after telling the villagers about the threat...", 5000}})
       
   112   table.insert(startAnim, {func = AnimCaption, args = {leaks, "Their buildings were very primitive back then, even for an uncivilised island.", 7000}})
       
   113   table.insert(startAnim, {func = AnimSay, args = {chief, "Young one, you are telling us that they can instantly change location without a shaman?", SAY_SAY, 8000}})
       
   114   table.insert(startAnim, {func = AnimSay, args = {chief, "That is, indeed, very weird...", SAY_SAY, 3500}})
       
   115   table.insert(startAnim, {func = AnimSay, args = {buffalo, "If they try coming here, they can have a taste of my delicious knuckles!", SAY_SHOUT, 8000}})
       
   116   table.insert(startAnim, {func = AnimSay, args = {buffalo, "Haha!", SAY_SHOUT, 2000}})
       
   117   if denseDead == false then
       
   118     table.insert(startAnim, {func = AnimSay, args = {dense, "I'm not sure about that!", SAY_SAY, 3400}})
       
   119     table.insert(startAnim, {func = AnimSay, args = {dense, "They have weapons we've never seen before!", SAY_SAY, 5000}})
       
   120     table.insert(startAnim, {func = AnimSay, args = {dense, "Luckily, I've managed to snatch some of them.", SAY_SAY, 5000}})
       
   121     table.insert(startAnim, {func = AnimCustomFunction, args = {dense, SpawnCrates, {1}}})
       
   122     table.insert(startAnim, {func = AnimSay, args = {dense, "Oops...I dropped them.", SAY_SAY, 3000}})
       
   123   else
       
   124     table.insert(startAnim, {func = AnimSay, args = {leaks, "I'm not sure about that!", SAY_SAY, 3400}})
       
   125     table.insert(startAnim, {func = AnimSay, args = {leaks, "They have weapons we've never seen before!", SAY_SAY, 5000}})
       
   126     table.insert(startAnim, {func = AnimCustomFunction, args = {leaks, SpawnCrates, {1}}})
       
   127     table.insert(startAnim, {func = AnimWait, args = {leaks, 1000}})
       
   128     table.insert(startAnim, {func = AnimSay, args = {leaks, "They keep appearing like this. It's weird!", SAY_SAY, 5000}})
       
   129   end
       
   130   table.insert(startAnim, {func = AnimSay, args = {chief, "Did anyone follow you?", SAY_SAY, 3000}})
       
   131   table.insert(startAnim, {func = AnimSay, args = {leaks, "No, we made sure of that!", SAY_SAY, 3500}})
       
   132   table.insert(startAnim, {func = AnimCustomFunction, args = {leaks, SpawnHealthCrates, {1}}})
       
   133   table.insert(startAnim, {func = AnimWait, args = {leaks, 1000}})
       
   134   table.insert(startAnim, {func = AnimSay, args = {chief, "First aid kits?!", SAY_SAY, 3000}})
       
   135   table.insert(startAnim, {func = AnimSay, args = {leaks, "I've seen this before. They just appear out of thin air.", SAY_SAY, 7000}})
       
   136   table.insert(startAnim, {func = AnimMove, args = {water, "left", 3000, 0}})
       
   137   table.insert(startAnim, {func = AnimJump, args = {water, "long"}})
       
   138   table.insert(startAnim, {func = AnimMove, args = {water, "left", 2655, 0}})
       
   139   table.insert(startAnim, {func = AnimTurn, args = {water, "Right"}})
       
   140   table.insert(startAnim, {func = AnimJump, args = {water, "back"}})
       
   141   table.insert(startAnim, {func = AnimJump, args = {water, "back"}})
       
   142   table.insert(startAnim, {func = AnimTurn, args = {water, "Left"}})
       
   143   table.insert(startAnim, {func = AnimMove, args = {water, "left", 2467, 754}})
       
   144   table.insert(startAnim, {func = AnimSay, args = {water, "Hey guys!", SAY_SAY, 2500}})
       
   145   table.insert(startAnim, {func = AnimTurn, args = {chief, "Right"}})
       
   146   table.insert(startAnim, {func = AnimSay, args = {chief, "...", SAY_THINK, 1500}})
       
   147   table.insert(startAnim, {func = AnimSay, args = {chief, "Where have you been?", SAY_SAY, 4000}})
       
   148   table.insert(startAnim, {func = AnimSay, args = {water, "Just on a walk.", SAY_SAY, 3000}})
       
   149   table.insert(startAnim, {func = AnimSay, args = {chief, "You have chosen the perfect moment to leave.", SAY_SAY, 6000}})
       
   150   table.insert(startAnim, {func = AnimCustomFunction, args = {chief, RestoreWave, {1}}})
       
   151   for i = 1, 4 do
       
   152     table.insert(startAnim, {func = AnimOutOfNowhere, args = {cannibals[i], unpack(cannibalPos[i])}})
       
   153   end
       
   154   table.insert(startAnim, {func = AnimWait, args = {chief, 1500}})
       
   155   table.insert(startAnim, {func = AnimSay, args = {leaks, "HOW DO THEY KNOW WHERE WE ARE???", SAY_SHOUT, 5000}})
       
   156   table.insert(startAnim, {func = AnimSay, args = {chief, "We have to protect the village!", SAY_SAY, 5000}})
       
   157   table.insert(startAnim, {func = AnimSwitchHog, args = {leaks}})
       
   158   AddSkipFunction(startAnim, SkipStartAnim, {})
       
   159 
       
   160   table.insert(wave2Anim, {func = AnimCustomFunction, args = {leaks, RestoreWave, {2}}, swh = false})
       
   161   for i = 5, 8 do
       
   162     table.insert(wave2Anim, {func = AnimOutOfNowhere, args = {cannibals[i], unpack(cannibalPos[i])}})
       
   163   end
       
   164   table.insert(wave2Anim, {func = AnimCustomFunction, args = {leaks, SpawnCrates, {2}}, swh = false})
       
   165   table.insert(wave2Anim, {func = AnimCustomFunction, args = {leaks, SpawnHealthCrates, {2}}, swh = false})
       
   166   AddSkipFunction(wave2Anim, SkipWave2Anim, {})
       
   167 end
       
   168 
       
   169 function SetupFinalAnim()
       
   170   local found = 0
       
   171   local hogs = {}
       
   172   local i = 1
       
   173   if nativesNum >= 2 then
       
   174     while found < 2 do
       
   175       if  nativesDead[i] ~= true then
       
   176         found = found + 1
       
   177         hogs[found] = natives[i]
       
   178       end
       
   179       i = i + 1
       
   180     end
       
   181     if chiefDead ~= true then
       
   182       hogs[2] = chief
       
   183     end
       
   184     table.insert(finalAnim, {func = AnimCustomFunction, args = {hogs[1], CondNeedToTurn, {hogs[1], hogs[2]}}})
       
   185     table.insert(finalAnim, {func = AnimSay, args = {hogs[1], "We can't hold them up much longer!", SAY_SAY, 5000}})
       
   186     table.insert(finalAnim, {func = AnimSay, args = {hogs[1], "We need to move!", SAY_SAY, 3000}})
       
   187     table.insert(finalAnim, {func = AnimSay, args = {hogs[2], "But where can we go?", SAY_SAY, 3000}})
       
   188     table.insert(finalAnim, {func = AnimSay, args = {hogs[1], "To the caves...", SAY_SAY, 2500}})
       
   189     table.insert(finalAnim, {func = AnimSay, args = {hogs[2], "Good idea, they'll never find us there!", SAY_SAY, 5000}})
       
   190   else
       
   191     for i = 1, 5 do
       
   192       if nativesDead[i] ~= true then
       
   193         hogs[1] = natives[i]
       
   194       end
       
   195     end
       
   196     table.insert(finalAnim, {func = AnimSay, args = {hogs[1], "I need to move the tribe!", SAY_THINK, 4000}})
       
   197     table.insert(finalAnim, {func = AnimSay, args = {hogs[1], "The caves are well hidden, they won't find us there!", SAY_THINK, 7000}})
       
   198   end
       
   199 end
       
   200 -----------------------------Misc--------------------------------------
       
   201 function RestoreWave(index)
       
   202   for i = (index - 1) * 4 + 1, index * 4 do
       
   203     RestoreHog(cannibals[i])
       
   204     cannibalHidden[i] = false
       
   205   end
       
   206 end
       
   207 
       
   208 function GetVariables()
       
   209   m2DenseDead = tonumber(GetCampaignVar("M2DenseDead"))
       
   210   if m2DenseDead == 1 then
       
   211     denseDead = true
       
   212   end
       
   213   m2Choice = tonumber(GetCampaignVar("M2Choice"))
       
   214 end
       
   215 
       
   216 function SetupPlace()
       
   217   if m2DenseDead == true then
       
   218     DeleteGear(dense)
       
   219   end
       
   220   for i = 1, 8 do
       
   221     HideHog(cannibals[i])
       
   222     cannibalHidden[i] = true
       
   223   end
       
   224   HideHog(cyborg)
       
   225 end
       
   226 
       
   227 function SetupEvents()
       
   228   AddEvent(CheckWaveDead, {1}, DoWaveDead, {1}, 0)
       
   229   AddEvent(CheckWaveDead, {2}, DoWaveDead, {2}, 0)
       
   230 end
       
   231 
       
   232 function SetupAmmo()
       
   233   AddAmmo(cannibals[1], amGrenade, 4)
       
   234   AddAmmo(cannibals[1], amBazooka, 4)
       
   235   AddAmmo(cannibals[1], amShotgun, 4)
       
   236   AddAmmo(cannibals[1], amMine, 2)
       
   237   AddAmmo(cannibals[2], amGrenade, 4)
       
   238   AddAmmo(cannibals[2], amBazooka, 4)
       
   239   AddAmmo(cannibals[2], amShotgun, 4)
       
   240   AddAmmo(cannibals[2], amMine, 2)
       
   241   AddAmmo(cannibals[2], amMolotov, 2)
       
   242   AddAmmo(cannibals[2], amFlamethrower, 3)
       
   243 end
       
   244 
       
   245 function AddHogs()
       
   246 	AddTeam("Natives", 2567585, "Bone", "Island", "HillBilly", "cm_birdy")
       
   247 	leaks = AddHog("Leaks A Lot", 0, 100, "Rambo")
       
   248   dense = AddHog("Dense Cloud", 0, 100, "RobinHood")
       
   249   water = AddHog("Fiery Water", 0, 100, "pirate_jack")
       
   250   buffalo = AddHog("Raging Buffalo", 0, 100, "zoo_Bunny")
       
   251   chief = AddHog("Righteous Beard", 0, 100, "IndianChief")
       
   252   natives = {leaks, dense, water, buffalo, chief}
       
   253   nativesNum = 5
       
   254 
       
   255   AddTeam("Light Cannfantry", 14483456, "Skull", "Island", "Pirate", "cm_vampire")
       
   256   for i = 1, 4 do
       
   257     cannibals[i] = AddHog(HogNames[i], 3, 70, "Zombi")
       
   258   end
       
   259 
       
   260   AddTeam("Heavy Cannfantry", 14483456, "Skull", "Island", "Pirate", "cm_vampire")
       
   261   for i = 5, 8 do
       
   262     cannibals[i] = AddHog(HogNames[i], 2, 100, "vampirichog")
       
   263   end
       
   264 
       
   265   AddTeam("011101001", 14483456, "ring", "UFO", "Robot", "cm_star")
       
   266   cyborg = AddHog("Unit 334a$7%;.*", 0, 200, "cyborg1")
       
   267 
       
   268   SetGearPosition(leaks,   unpack(leaksPos))
       
   269   SetGearPosition(dense,   unpack(densePos))
       
   270   SetGearPosition(water,   unpack(waterPos))
       
   271   HogTurnLeft(water, true)
       
   272   SetGearPosition(buffalo, unpack(buffaloPos))
       
   273   HogTurnLeft(buffalo, true)
       
   274   SetGearPosition(chief,   unpack(chiefPos))
       
   275   HogTurnLeft(chief, true)
       
   276   SetGearPosition(cyborg, 0, 0)
       
   277   for i = 1, 8 do
       
   278     SetGearPosition(cannibals[i], unpack(cannibalPos[i]))
       
   279   end
       
   280 end
       
   281 
       
   282 function CondNeedToTurn(hog1, hog2)
       
   283   xl, xd = GetX(hog1), GetX(hog2)
       
   284   if xl > xd then
       
   285     AnimInsertStepNext({func = AnimTurn, args = {hog1, "Left"}})
       
   286     AnimInsertStepNext({func = AnimTurn, args = {hog2, "Right"}})
       
   287   elseif xl < xd then
       
   288     AnimInsertStepNext({func = AnimTurn, args = {hog2, "Left"}})
       
   289     AnimInsertStepNext({func = AnimTurn, args = {hog1, "Right"}})
       
   290   end
       
   291 end
       
   292 
       
   293 function SpawnHealthCrates(index)
       
   294   SetHealth(SpawnHealthCrate(0, 0), 25)
       
   295   SetHealth(SpawnHealthCrate(0, 0), 25)
       
   296   SetHealth(SpawnHealthCrate(0, 0), 25)
       
   297   healthCratesSpawned[index] = true
       
   298 end
       
   299 
       
   300 function SpawnCrates(index)
       
   301   if index == 1 then
       
   302     SpawnAmmoCrate(1943, 408, amBazooka)
       
   303     SpawnAmmoCrate(1981, 464, amGrenade)
       
   304     SpawnAmmoCrate(1957, 459, amShotgun)
       
   305     SpawnAmmoCrate(1902, 450, amDynamite)
       
   306     SpawnUtilityCrate(1982, 405, amPickHammer)
       
   307     SpawnUtilityCrate(2028, 455, amRope)
       
   308     SpawnUtilityCrate(2025, 464, amTeleport)
       
   309   else
       
   310     SpawnUtilityCrate(1982, 405, amBlowTorch)
       
   311     SpawnAmmoCrate(2171, 428, amMolotov)
       
   312     SpawnAmmoCrate(2364, 346, amFlamethrower)
       
   313     SpawnAmmoCrate(2521, 303, amBazooka)
       
   314     SpawnAmmoCrate(2223, 967, amGrenade)
       
   315     SpawnAmmoCrate(1437, 371, amShotgun)
       
   316  end
       
   317   cratesSpawned[index] = true
       
   318 end
       
   319 
       
   320 -----------------------------Events------------------------------------
       
   321 
       
   322 function CheckWaveDead(index)
       
   323   for i = (index - 1) * 4 + 1, index * 4 do
       
   324     if cannibalDead[i] ~= true then
       
   325       return false
       
   326     end
       
   327   end
       
   328   return true
       
   329 end
       
   330 
       
   331 function DoWaveDead(index)
       
   332   if index == 1 then
       
   333     AddAnim(wave2Anim)
       
   334     AddFunction({func = AfterWave2Anim, args = {}})
       
   335   elseif index == 2 then
       
   336     SetupFinalAnim()
       
   337     AddAnim(finalAnim)
       
   338     AddFunction({func = AfterFinalAnim, args = {}})
       
   339   end
       
   340 end
       
   341 
       
   342 
       
   343 -----------------------------Main Functions----------------------------
       
   344 
       
   345 function onGameInit()
       
   346 	Seed = 0 
       
   347 	GameFlags = 0
       
   348 	TurnTime = 60000 
       
   349 	CaseFreq = 0
       
   350 	MinesNum = 0
       
   351 	MinesTime = 3000
       
   352 	Explosives = 2
       
   353 	Delay = 10 
       
   354   Map = "Hogville"
       
   355 	Theme = "Nature"
       
   356   SuddenDeathTurns = 3000
       
   357 
       
   358   AddHogs()
       
   359   AnimInit()
       
   360 end
       
   361 
       
   362 function onGameStart()
       
   363   GetVariables()
       
   364   SetupAmmo()
       
   365   SetupPlace()
       
   366   AnimationSetup()
       
   367   SetupEvents()
       
   368   AddAnim(startAnim)
       
   369   AddFunction({func = AfterStartAnim, args = {}})
       
   370 end
       
   371 
       
   372 function onGameTick()
       
   373   AnimUnWait()
       
   374   if ShowAnimation() == false then
       
   375     return
       
   376   end
       
   377   ExecuteAfterAnimations()
       
   378   CheckEvents()
       
   379 end
       
   380 
       
   381 function onGearDelete(gear)
       
   382   if gear == dense then
       
   383     denseDead = true
       
   384     nativesNum = nativesNum - 1
       
   385     nativesDead[2] = true
       
   386   elseif gear == leaks then
       
   387     leaksDead = true
       
   388     nativesNum = nativesNum - 1
       
   389     nativesDead[1] = true
       
   390   elseif gear == chief then
       
   391     chiefDead = true
       
   392     nativesNum = nativesNum - 1
       
   393     nativesDead[5] = true
       
   394   elseif gear == water then
       
   395     waterDead = true
       
   396     nativesNum = nativesNum - 1
       
   397     nativesDead[3] = true
       
   398   elseif gear == buffalo then
       
   399     buffaloDead = true
       
   400     nativesNum = nativesNum - 1
       
   401     nativesDead[4] = true
       
   402   else
       
   403     for i = 1, 8 do
       
   404       if gear == cannibals[i] then
       
   405         cannibalDead[i] = true
       
   406       end
       
   407     end
       
   408   end
       
   409 end
       
   410 
       
   411 function onGearAdd(gear)
       
   412 end
       
   413 
       
   414 function onAmmoStoreInit()
       
   415   SetAmmo(amDEagle, 9, 0, 0, 0)
       
   416   SetAmmo(amSniperRifle, 9, 0, 0, 0)
       
   417   SetAmmo(amFirePunch, 9, 0, 0, 0)
       
   418   SetAmmo(amWhip, 9, 0, 0, 0)
       
   419   SetAmmo(amBaseballBat, 9, 0, 0, 0)
       
   420   SetAmmo(amHammer, 9, 0, 0, 0)
       
   421   SetAmmo(amLandGun, 9, 0, 0, 0)
       
   422   SetAmmo(amSnowball, 9, 0, 0, 0)
       
   423   SetAmmo(amGirder, 4, 0, 0, 2)
       
   424   SetAmmo(amParachute, 4, 0, 0, 2)
       
   425   SetAmmo(amSwitch, 8, 0, 0, 2)
       
   426   SetAmmo(amSkip, 9, 0, 0, 0)
       
   427   SetAmmo(amRope, 5, 0, 0, 3)
       
   428   SetAmmo(amBlowTorch, 3, 0, 0, 3)
       
   429   SetAmmo(amPickHammer, 0, 0, 0, 3)
       
   430   SetAmmo(amLowGravity, 0, 0, 0, 2)
       
   431   SetAmmo(amDynamite, 0, 0, 0, 3)
       
   432   SetAmmo(amBazooka, 0, 0, 0, 4)
       
   433   SetAmmo(amGrenade, 0, 0, 0, 5)
       
   434   SetAmmo(amMine, 0, 0, 0, 2)
       
   435   SetAmmo(amMolotov, 0, 0, 0, 3)
       
   436   SetAmmo(amFlamethrower, 0, 0, 0, 3)
       
   437 end
       
   438 
       
   439 function onNewTurn()
       
   440   if AnimInProgress() then
       
   441     TurnTimeLeft = -1
       
   442   end
       
   443 end
       
   444 
       
   445 function onGearDamage(gear, damage)
       
   446 end
       
   447 
       
   448 function onPrecise()
       
   449   if GameTime > 2500 then
       
   450     SetAnimSkip(true)
       
   451   end
       
   452 end
       
   453