-- -- Autor: BenjamÃŒn de la Fuente Ranea -- Fecha: 28-11-2008 -- -- Script de configuración de controles -- perfectIA = false -- Si es true no aplica las pifias de la IA ni las nitros, ni espera al usuario alwaysGoForItemsIA = false -- Si es true la IA siempre toma las bifurcaciones para coger los items, sino lo elige a su manera MinIASplineForward = 0.9 -- M’nimo valor de adelantamiento de la IA al seguir el spline MaxBloquedTime = 2 -- Si el usuario est‡ bloqueado, se espera N segundos para hacer reset MaxNotVisibleTime = 0.2 -- Tiempo que est‡ el coche no visible antes de hacerle un reset iaDifficulty = { { easy = 0.42, medium = 0.6, hard = 0.95 }, { easy = 0.32, medium = 0.5, hard = 0.8 }, { easy = 0.2, medium = 0.4, hard = 0.55 } } cameraBehindCar = false -- Pone la cámara en el modo típido de las carreras de coches cameraRightCar = false -- Pone la cámara al lado derecho del coche cameraRightCircuit = false -- Pone la cámara al lado derecho del circuito (siguiendo el spline) cameraSpline = true -- Hace que la cámara siga un rail definido en el circuito (spline) cameraFree = false -- Pone una cámara libre cameraTutorialHeight= 300 -- Altura de la c‡mara en el tutorial SplineFollowPercent = 0.5 SplineForward = 0.1 EasySpeedLimiter = 0.7 CalcVelocityInScreenSpace = false if CalcVelocityInScreenSpace then HardControlDist = 250 EasyControlDist = 125 else HardControlDist = 45 --HardControlDist = 35 EasyControlDist = 40 --EasyControlDist = 80 end cameraRail = { 1, 0, 0 } -- Eje sobre el que se mueve la cámara cameraInitialPosition = { 0, 150, -250 } if cameraBehindCar then cameraInitialPosition = { 0, 15, -250 } cameraZoomFactor = 50 -- Factor de Zoom (a menor valor más zoom) elseif cameraRightCar then cameraInitialPosition = { 0, 5, -250 } cameraZoomFactor = 25 -- Factor de Zoom (a menor valor más zoom) elseif cameraRightCircuit then cameraInitialPosition = { 0, 150, -250 } cameraZoomFactor = 150 -- Factor de Zoom (a menor valor más zoom) else cameraZoomFactor = 5 -- Factor de Zoom 5 AccelZoomVel = 1 DeccelZoomVel = 1 if not Is_iPad then MAXZoom = 0.32 -- 0.32 else MAXZoom = -0.2 end end -- Par‡metros de la IA DISTANCE_PRESSION = 5 pressionCheckTime = 0.15 PIFIA_DURATION = 4 -- Indica la duraci—n de una pifia PIFIA_ACCEL_VEL_THRESHOLD = 230 -- Indica la velocidad umbral donde se aplicar‡ la pifia de aceleraci—n goodnessModifier = 0.15 -- Cuanto mayor sea el valor mas despacio irán los contrincantes cuando adelanten al player. Default 0.06 maxGoodnessModifier = 1.2 -- (>1)Indica el porcentaje que aumenta la velocidad máxima de la IA cuando va por detras del player. minGoodnessModifier = 0.1 -- (<0) Indica el porcentaje que disminuye la velocidad máxima de la IA cuando vas por detras. Default 0.4 NitroBaseValue = 0.05 -- Valor base que se usa en la equación para aumentar la probabilidad de que la IA lance una nitro al ir detras del player. Default 0.05 NitroModifier = 0.05 --Cuanto mayor sea mayor es la probabilidad de que la IA lance un nitro cuando va por detras del player.Default 0.05 PifiaModifier = 0.4 -- Cuanto mayor es el valor mas probabilidades hay de que la IA cometa una pifia al ir por delante del player. Default 0.05 PifiaBaseTime = 4 --Tiempo base para mirar si comete una pifia (en segundos) Default 7 PifiaTimeModifier = 3 -- Modificador en segundos que se aplica a la presión. Default 5 -- Funciones de IA temporales durante el desarrollo -- Devuelve la presi—n ejercida por el usuario a la IA en funci—n de la distancia. -- Si la distancia es menor a 0 es que la IA va delante del usuario. -- Se evalua cada cierto tiempo (pressionCheckTime) function calcIAPression(_averageDist) if _averageDist < 0 then return math.max(_averageDist + DISTANCE_PRESSION, 0) / DISTANCE_PRESSION else return 0 end end -- Vari’a la bondad de la IA en funci—n de su posici—n relativa con el usuario. Entre 0 y 1. function calcIAGoodness(_distToUserCar, _fCurGoodness, _carId) if _distToUserCar <= 0 then -- La IA va por delante del usuario local minGoodness = math.max(_fCurGoodness*minGoodnessModifier, 0.1) _fCurGoodness = _fCurGoodness + goodnessModifier * _distToUserCar return math.max(_fCurGoodness, minGoodness) else --return _fCurGoodness --if _carId == 1 then -- Este es el mejor de la IA --elseif _carID == 2 then --else -- Este es el más malo -- De momento la velocidad máxima a la que pude ir cada coche de la IA se calcula mediante un porcentaje de su velocidad máxima, el mismo para todos los coches. local maxGoodness = math.min(_fCurGoodness * maxGoodnessModifier, 1.0) _fCurGoodness = _fCurGoodness + goodnessModifier * _distToUserCar return math.min(_fCurGoodness, maxGoodness) end end -- Devuelve la probabilidad de que la IA lance una nitro en funci—n de lo buena que sea (entre 0 y 1) y -- la distancia actual al coche del usuario function calcIANitroProbability(_distToUserCar, _fCurGoodness) -- TODO: puede que haya que tener en cuenta las nitros que le quedan if _distToUserCar > 0 then -- La IA va por detr‡s del usuario return NitroBaseValue + _fCurGoodness * NitroModifier else return 0 end end -- Devuelve la probabilidad de que la IA la cague en funci—n de la distancia relativa al usuario, -- la bondad de la IA y la presi—n function calcIAPifiaProbability(_distToUserCar, _fCurGoodness, _fPression) local pifia = (1.0 - _fCurGoodness) * 0.1; if _distToUserCar <= 0 then -- La IA va por delante del usuario pifia = pifia + (1.0 - _fCurGoodness + _fPression) * PifiaModifier end return pifia end -- Devuelve la cantidad de tiempo (variable) que pasa entre que se decide si se hace una pifia o no function calcIAPifiaCheckTime(_fCurGoodness, _fPression) return PifiaBaseTime + _fCurGoodness - _fPression * PifiaTimeModifier end E_BREAK_CAR = 0 E_BOOST_NITRO = 1 E_ACCEL_CAR = 2 -- Devuelve el tipo de pifia que se va a aplicar en funci—n de la velocidad m‡xima del circuito y un valor aleatorio function calcIAPifiaType(_fMAXCircuitVel, _fRnd) if _fMAXCircuitVel == -1 then -- Para pifiar debemos relentizar el coche ya que en este punto el coche puede ir a m‡xima velocidad return E_BREAK_CAR else if _fRnd <= 0.5 then return E_BOOST_NITRO else return E_ACCEL_CAR end end end