Ca:Skate Park Mod

From X-Moto
Jump to: navigation, search

English - Español

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>