Ca:Skate Park Mod
Aquest script et permet convertir el teu nivell en un skate park. Per completar el nivell, s'han de recollir punts fent trucs.
"Nota d'un desenvolupador de l'X-Moto: aquest script es bonic. De totes maneres, te un problema per una limitació de l'X-Moto. Produeix unes repeticions molt pesades (uns quants centenars de K) per l'anomenament constant de la funció Ticks." -Nicolas
Quants mes punts facis seguits, mes rebràs. Intenta mantenir-te en una nora tot el temps que et sigui possible mentre fas algunes tombarelles. Els icones sobre el teu cap representen la teva puntuació.
Si vols canviar les quantitats, utilitza la definició de constants a la part de dalt de l'script.
Copia el codi directament al teu nivell per afegir aquesta funcionalitat. Fixa't que si edites el nivell desprès amb l'xmoto-edit, hauràs de tornar a copiar les entitats per que el editor no les interpreta be.
<script> -- Level Parameters SCORE_WIN = 5000 MANUAL_MINTIME = 1.0 MANUAL_MAXTIME = 180.0 MANUAL_UPDATEINTERVAL = 3.0 MANUAL_BASESCORE = 15 MANUAL_FLIPDIVISOR = 4 AIR_MINDURATION = 2.0 AIR_MULTIPLIER = 4 AIR_MAXBONUSFLIPCOUNT = 5 FLIP_BASESCORE = 80 ICON_SCORE = 10 ICON_OFFSETX = -1.25 ICON_OFFSETY = 3.0 -- States ManualAirTime = 0.0 InAir = false AirStart = 0.0 AirFlips = 0 WheelTouching = {0, 0} Manualing = 0 ManualingStart = 0.0 -- Scores FlipCount = 0 FlipScore = 0 ManualScore = 0 BonusScore = 0 TotalScore = 0 HighTrickScore = 0 IconCount = { 0, 0, 0 } CurrentScore = 0 LastScore = 0 function OnLoad() Game.SetKeyHook("H", "ShowHelp") Game.Message("Press H for help") return true end function Tick() PlayerX, PlayerY, PlayerDirection = Game.GetPlayerPosition() -- Display icons ManualScore = GetManualScore() CurrentScore = math.floor((FlipScore + ManualScore + BonusScore) / ICON_SCORE) -- Calculate score icons if CurrentScore ~= LastScore then IconCount[1] = math.floor(CurrentScore / 100) CurrentScore = CurrentScore - IconCount[1] * 100 IconCount[2] = math.floor(CurrentScore / 10) CurrentScore = CurrentScore - IconCount[2] * 10 IconCount[3] = math.floor(CurrentScore) EraseIcons() end for i = 1, IconCount[1] do Game.SetEntityPos("High" .. (i-1), PlayerX + i / 5 + ICON_OFFSETX, PlayerY + ICON_OFFSETY) end for i = 1, IconCount[2] do Game.SetEntityPos("Mid" .. (i-1), PlayerX + i / 5 + ICON_OFFSETX, PlayerY + ICON_OFFSETY - 0.3) end for i = 1, IconCount[3] do Game.SetEntityPos("Low" .. (i-1), PlayerX + i / 5 + ICON_OFFSETX, PlayerY + ICON_OFFSETY - 0.6) end LastScore = CurrentScore if TotalScore >= SCORE_WIN then Game.WinPlayer() end return true end function ShowHelp() Game.Message("Welcome to the Skate Park mod. Gets points by performing huge tricks.") Game.Message("Get " .. SCORE_WIN .. " points to win.") Game.Message("Scripting by Jacky J") 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)) 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 -- Reset stats FlipCount = 0 FlipScore = 0 ManualScore = 0 BonusScore = 0 TrickScore = 0 IconCount = { 0, 0, 0 } EraseIcons() end -- Move icons offscreen function EraseIcons() for i = 1, 9 do Game.SetEntityPos("High" .. (i-1), 0, 10000) end for i = 1, 9 do Game.SetEntityPos("Mid" .. (i-1), 0, 10000) end for i = 1, 9 do Game.SetEntityPos("Low" .. (i-1), 0, 10000) end end </script> <entity id="Low0" typeid="Wrecker"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Low1" typeid="Wrecker"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Low2" typeid="Wrecker"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Low3" typeid="Wrecker"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Low4" typeid="Wrecker"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Low5" typeid="Wrecker"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Low6" typeid="Wrecker"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Low7" typeid="Wrecker"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Low8" typeid="Wrecker"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Low9" typeid="Wrecker"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Mid0" typeid="Strawberry"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Mid1" typeid="Strawberry"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Mid2" typeid="Strawberry"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Mid3" typeid="Strawberry"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Mid4" typeid="Strawberry"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Mid5" typeid="Strawberry"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Mid6" typeid="Strawberry"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Mid7" typeid="Strawberry"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Mid8" typeid="Strawberry"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="Mid9" typeid="Strawberry"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="High0" typeid="EndOfLevel"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="High1" typeid="EndOfLevel"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="High2" typeid="EndOfLevel"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="High3" typeid="EndOfLevel"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="High4" typeid="EndOfLevel"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="High5" typeid="EndOfLevel"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="High6" typeid="EndOfLevel"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="High7" typeid="EndOfLevel"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="High8" typeid="EndOfLevel"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity> <entity id="High9" typeid="EndOfLevel"><size r="0.5" width="0.5" height="0.5"/><position x="0.0" y="10000.0"/></entity>