Es:Skate Park Mod

From X-Moto
Jump to: navigation, search

English - Català

Este script te permite convertir tu nivel en un skate park. Para completar el nivel, se han de recoger puntos haciendo trucos.

"Nota de un desarrollador del X-Moto: este script es bonito. De todas maneras, tiene un problema por una limitacion del X-Moto. Produce unas repeticiones muy pesadas (unos cuantos centenares de K) por la llamada constante de la funcion Ticks." -Nicolas

Cuantos mas puntos hagas seguidos, mas recibiras. Intenta mantenerte en una rueda todo el tiempo que te sea posible mientras haces algunas volteras. Los iconos sobre tu cabeza representan tu puntuacion.

Si quieres cambiar las cuantidades, utiliza la definicion de constantes de la parte superior del script.

Copia el codigo directamente a tu nivel para agregar esta funcionalidad. Fijate que si editas el nivel despues con el xmoto-edit, tendras que volver a copiar las entidades porque el editor no las interpretara bien.

<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>