Skate Park Mod
This script allows you to convert your level into a skate park. To complete the level, you must collect points by performing tricks.
The more tricks you string together, the higher the points. Try to keep a manual going as long as you can while doing flips.
If you would like to change the values, use the constants defined at the top of the script.
The original Script by Jacky J has been altered a bit, to make it compatible to actual xmoto versions (it won't produce huge replays anymore, but therefore the scoring display had to be changed).
Copy the code directly into your level to add this functionality. Note that if you edit your level in any editor, you'll have to recopy the entities because the editor doesn't retain them correctly.
Level examples: Skate Park mod (old code), Half Pipe (current code)
<script> -- Level Parameters SCORE_WIN = 6000 MANUAL_MINTIME = 1.0 MANUAL_MAXTIME = 180.0 MANUAL_UPDATEINTERVAL = 3.0 MANUAL_BASESCORE = 30 MANUAL_FLIPDIVISOR = 4 AIR_MINDURATION = 2.0 AIR_MULTIPLIER = 3 AIR_MAXBONUSFLIPCOUNT = 5 FLIP_BASESCORE = 80 -- States ManualAirTime = 0.0 InAir = false AirStart = 0.0 AirFlips = 0 WheelTouching = {0, 0} Manualing = 0 ManualingStart = 0.0 -- Scores FlipCount = 0 CurrentStar = 0 FlipScore = 0 ManualScore = 0 BonusScore = 0 LastScore = 0 TotalScore = 0 HighTrickScore = 0 function Tick() ManualScore = GetManualScore() if ManualScore ~= LastScore then PlayerX, PlayerY, PlayerDirection = Game.GetPlayerPosition() addStar(PlayerDirection) LastScore = ManualScore end return true end function OnLoad() Game.SetKeyHook("H", "ShowHelp") Game.Message(" Skate Park\nPress H for help") return true end function ShowHelp() Game.Message("Get points by performing tricks!") Game.Message("Get " .. SCORE_WIN .. " points to win.") Game.Message("Scripting by Jacky J") Game.Message("Level design by Gaivota") end function addStar(direction) CurrentStar = CurrentStar + 1 if CurrentStar <= 7 then PlayerX, PlayerY, PlayerDirection = Game.GetPlayerPosition() Game.SetDynamicEntityNone("som"..CurrentStar) Game.SetEntityPos("som"..CurrentStar, PlayerX, PlayerY) if direction == 0 then Game.SetDynamicEntityRotation("som"..CurrentStar, 0, 0.5, 100, 0, 0) else Game.SetDynamicEntityRotation("som"..CurrentStar, 0, 0.5, -100, 0, 0) end end end function resetStars() for i = 1, CurrentStar do if i <= 7 then Game.SetDynamicEntityNone("som"..i) Game.SetDynamicEntityTranslation("som"..i, 0, 50, 2500, 0, 1250) end end CurrentStar = 0 end function OnSomersault(TDirection) local AirTime = 0 local FlipMultiplier = 0 local FlipDecayCount = 0 -- Get air time if InAir == true then AirTime = Game.GetTime() - AirStart end -- Get manual time local ManualTime = GetManualTime() -- Increment flip counter FlipCount = FlipCount + 1 AirFlips = AirFlips + 1 FlipDecayCount = AirFlips if FlipDecayCount > AIR_MAXBONUSFLIPCOUNT then FlipDecayCount = AIR_MAXBONUSFLIPCOUNT end FlipValue = (FLIP_BASESCORE - 5 * FlipDecayCount) * AirFlips -- Calculate flip score FlipScore = FlipScore + math.floor(FlipValue + AIR_MULTIPLIER * AirTime + math.floor(ManualTime / MANUAL_FLIPDIVISOR)) addStar(TDirection) end function OnWheel1Touchs(TStatus) WheelTouching[1] = TStatus if TStatus == 1 then CancelInAir() StartLandManual(1) else StartLiftManual(1) StartInAir(2) end end function OnWheel2Touchs(TStatus) WheelTouching[2] = TStatus if TStatus == 1 then CancelInAir() StartLandManual(2) else StartLiftManual(2) StartInAir(1) end end function StartInAir(TWheel) if WheelTouching[TWheel] == 0 then InAir = true AirStart = Game.GetTime() end end function CancelInAir() if InAir == true then AirTime = Game.GetTime() - AirStart if AirTime > AIR_MINDURATION then --Game.Message("Air Time: " .. AirTime) end -- Subtract air time from manualing time if Manualing ~= 0 and AirTime > 0.5 then ManualAirTime = ManualAirTime + AirTime end end AirFlips = 0 InAir = false end -- Called when a wheel touches function StartLandManual(TWheel) local OtherWheel = 3 - TWheel -- Check for both wheels touching if WheelTouching[OtherWheel] == 1 and Manualing ~= 0 then UpdateScore() Manualing = 0 ManualAirTime = 0 return true end -- Swapping manual wheels without both wheels touching if Manualing == OtherWheel then Manualing = TWheel --DisplayManualTime() return true end -- Check for an existing manual if Manualing == 0 then -- Start the manual Manualing = TWheel ManualingStart = Game.GetTime() + MANUAL_MINTIME end end -- Called when a wheel lifts off the ground function StartLiftManual(TWheel) local OtherWheel = 3 - TWheel StartLandManual(OtherWheel) end -- Returns the current manualing time function GetManualTime() -- Check for a manual if Manualing == 0 then return 0.0 end -- Discount current air time if InAir == true then CurrentAirTime = Game.GetTime() - AirStart else CurrentAirTime = 0 end -- Calculate the time ManualTime = Game.GetTime() - ManualingStart - ManualAirTime - CurrentAirTime -- Cap time if ManualTime < 0 then ManualTime = 0 elseif ManualTime > MANUAL_MAXTIME then ManualTime = MANUAL_MAXTIME end return ManualTime end -- Calculates the manual score function GetManualScore() local ManualTime = GetManualTime() local Score = math.floor(ManualTime / MANUAL_UPDATEINTERVAL) * MANUAL_BASESCORE; return Score end -- Awards the player points function UpdateScore() ManualScore = GetManualScore() -- Score formulas TrickScore = FlipScore + ManualScore + BonusScore TotalScore = TotalScore + TrickScore -- Display score if TrickScore > 0 then Game.Message("Trick Score: " .. TrickScore) Game.Message("Total Score: " .. TotalScore) end if TotalScore >= SCORE_WIN then Game.WinPlayer() end resetStars() -- Reset stats FlipCount = 0 FlipScore = 0 ManualScore = 0 BonusScore = 0 TrickScore = 0 end </script> <theme_replacements> <sprite_replacement old_name="Strawberry" new_name="Star"/> <sprite_replacement old_name="Flower" new_name="Star"/> <sprite_replacement old_name="Wrecker" new_name="Star"/> </theme_replacements>
Level code here!
<entity id="som1" typeid="Sprite"> <size r="0.400000" width="0.5" height="0.5"/> <position x="100" y="100"/> <param name="z" value="-1"/> <param name="name" value="Star"/> </entity> <entity id="som2" typeid="Sprite"> <size r="0.400000" width="0.8" height="0.8"/> <position x="100" y="100"/> <param name="z" value="-1"/> <param name="name" value="Star"/> </entity> <entity id="som3" typeid="Sprite"> <size r="0.400000" width="1.1" height="1.1"/> <position x="100" y="100"/> <param name="z" value="-1"/> <param name="name" value="Star"/> </entity> <entity id="som4" typeid="Sprite"> <size r="0.400000" width="1.4" height="1.4"/> <position x="100" y="100"/> <param name="z" value="-1"/> <param name="name" value="Star"/> </entity> <entity id="som5" typeid="Sprite"> <size r="0.400000" width="1.7" height="1.7"/> <position x="100" y="100"/> <param name="z" value="-1"/> <param name="name" value="Star"/> </entity> <entity id="som6" typeid="Sprite"> <size r="0.400000" width="2.0" height="2.0"/> <position x="100" y="100"/> <param name="z" value="-1"/> <param name="name" value="Star"/> </entity> <entity id="som7" typeid="Sprite"> <size r="0.400000" width="2.3" height="2.3"/> <position x="100" y="100"/> <param name="z" value="-1"/> <param name="name" value="Star"/> </entity>