Difference between revisions of "Skate Park Mod"
(more info) |
Wiki.xmoto (talk | contribs) m (Reverted edits by Opofefemucu (Talk) to last revision by Gaivota) |
||
(7 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
+ | [[Ca:Skate Park Mod|Català]] - [[Es:Skate Park Mod|Español]] | ||
+ | |||
+ | [[Image:Skatepark.jpg]] | ||
+ | |||
This script allows you to convert your level into a skate park. To complete the level, you must collect points by performing tricks. | 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 | + | 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. | If you would like to change the values, use the constants defined at the top of the script. | ||
− | Copy the code directly into your level to add this functionality. Note that if you edit your level | + | 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> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Latest revision as of 11:20, 26 November 2010
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>