SACADO DE BURNING TEAM
Archivo rFm
Empezando por el mod, en la carpeta rFm encontramos el archivo .rfm de nuestro mod, ahi es donde configuramos el nombre del mod que queremos que se muestre en el juego, el filtro para que aparezcan los coches que queremos, ejemplo:
Si queremos que aparezcan los F1 2010, en Vehicle filter ponemos por ejemplo: F12010, ahora en el .veh del coche 2010 le pones en Classes="F12010" y aparecerá este coche en nuestro mod.
Mas parámetros importantes son el numero de pilotos que tiene, maximos oponentes, minimos, etc. Algo importante es el parámetro ConfigOverrides que le dice al mod donde estan los archivos para ese mod en concreto, los archivos del coche, sonidos, opciones, fisicas...
Luego tenemos los circuitos, ordenados segun calendario, para hacer temporadas singleplayer, seguido del sistema de puntuación que queremos que nuestro mod de al acabar una carrera. Lo siguiente son normas y parámetros, como las horas a las que se corre, límites de velocidad, etc.
Y por último y no menos importante, los PitGroups, que le van a decir al mod cuantos coches por pitbox hay y el orden, es decir:
PitGroup = 2, Group1
PitGroup = 2, Group2
PitGroup = 2, Group3
PitGroup = 2, Group4
PitGroup = 2, Group5
* Con pitgroup = 2 le decimos que queremos que por cada equipo (pitbox) hayan dos coches, esto hará que en el mismo pitbox paren a repostar dos coches, los del mismo equipo se entiende.
Ahora bien, para que paren los coches del mismo equipo, en el .veh de antes, hay que asignar un Group, luego si tenemos dos coches en un equipo, a esos dos coches hay que ponerles Group1.
////////////////////////////////////////////////////////////////////////////////////
Archivo .veh
Vamos con el .veh, el .veh es un archivo que contiene lo necesario para montar el coche, recoje las físicas, sonidos, texturas y datos del equipo.
¿Como funciona?
Si tenemos instalado el programa VehVwr (http://www.rfactorcentral.com/detail.cfm?ID=Vehicle%20Viewer) y hacemos doble click en eun .veh de un coche, se nos abrira el programa y visualizaremos el coche con todas las modicicaciones, pero si lo abrimos con el bloc de notas, nos salen datos. Estos datos hacen referencia a un coche, si tenemos un equipo y este equipo tiene 2 coches, tendremos 2 archivos .veh en la carpeta. Normalmente se le suele poner de nombre el nombredelequipo_numeropiloto:
RGP_01.veh y RGP_02.veh
Abrimos un archivo .veh y veremos lo siguiente:
DefaultLivery="RGP_01/RGP_01.DDS" (Esto busca la textura del coche en la carpeta RGP_01, dentro de esta carpeta se hayan las texturas del coche que son diferentes de las del .mas, ya que en estas texturas podemos hacer que cada coche tenga un color por ejemplo diferente al del .mas)
HDVehicle=RGP.hdv (Esto es el archivo de las físicas del coche)
Graphics=RGP.gen (Este archivo carga los archivos .gmt de modelado que componen el coche)
Spinner=RGP_Spinner.gen (Carga los archivos como el .gen pero para el showroom, cuando estamos en el menu del rFactor)
GenString= (no es necesario)// Used to generate GMT names in *.gen file
Cameras=RGP_cams.cam (Carga las camaras del coche)
Sounds=BRGTV10.sfx (Carga los sonidos del coche)
HeadPhysics=headphysics.ini (Carga las físicas del casco, las que simulan el giro de la cabeza al hacer una curva)
Cockpit=RGP_cockpitinfo.ini (Contiene las camaras on board y los leds del volante)
Upgrades=RGP_upgrades.ini (Si queremos poner mejoras al coche o cambios como tipo de alerones)
BaseVehiclePrice=0 (Si queremos que el coche cueste dinero para comprarlo)
UnlockExperience=0 (Si queremos que el usuario tenga experiencia para poder conducirlo)
Ahora la segunda parte del archivo .veh
//////////////////////////TEAM HISTORY AND INFORMATION///////////////////////////////////////////
Number=01 (Numero del piloto)
Team="Burning-Team"
PitGroup="Group1" (aqui estan los pitgroups explicados en el .rfm, le asignamos el pitbox 1 en este caso)
Driver="Tiago Monteiro"
Description="1:Tiago Monteiro"
Engine="BRGTV10"
Manufacturer="Burning-Team"
Classes="RGP" (Este es el filtro del .rfm, todos los coches que tengas en Classes RGP aparecerán en el mod RGP.)
FullTeamName="Burning-Team"
TeamFounded=2009
TeamHeadquarters="Spain"
TeamStarts=0
TeamPoles=0
TeamWins=0
TeamWorldChampionships=0
Category="Red Grand Prix 2010" (Esto nos permite crear subcategorias, por ejemplo, en el mod (Classes) RGP podemos tenter 2 categorias, una de 500 cc y otra de 250 cc por ejemplo, si ponemos Category ="Red Grand Prix 2010 250cc" en la selección de vehículos para el mod RGP aparecerán dos listas, una con los coches RGP 2010 y otra con los coches RGP 2010 250cc, ambos para el mod RGP.
////////////////////////////////////////////////////////////////////////////////////
Archivo .hdv
Este archivo es el más extenso y costoso de elaborar, no porque sea dificil si no por la cantidad de parámetros que hay que modificar, para hacerlo correctamente, la única manera que hay es modificar los valores y probar en el rFactor, lo mejor es cojer un .hdv de un mod libre que se parezca al que queremos hacer, y retocarlo, pero para resumir, los más importantes són:
[GENERAL]
GarageDisplayFlags=47 // lo que queremos que se pueda modificar al entrar al seleccionar el menu pitlane(add): 1=rear downforce value (vs. angle), 2=radiator (vs. grille tape), 4=more gear info, 8+16=front downforce/wing/splitter/air dam, 32+64=rear downforce/wing/spoiler, 128=flip ups (vs. fender flare)
Mass=650.0 // La masa del coche (sin contar gasolina)
Symmetric=1 //Si queremos que el lado izquierdo del coche se comporte igual que el derecho
DamageFile=RGP_Damage // IMPORTANTE ya que carga el archivo de los daños para el coche, es un archivo .ini
TireBrand=Michelin_M10 // Otro archivo .tbc que son las físicas de los neumáticos.
Lo siguiente muestra cuanta gasolina se puede almacenar y cuantos pitstops se pueden hacer con la gasolina max que se puede poner:
FuelRange=(1.0, 1.0, 100)
FuelSetting=49
NumPitstopsRange=(0, 1, 4)
NumPitstopsSetting=3
Pitstop1Range=(1.0, 1.0, 100)
Pitstop1Setting=49
Pitstop2Range=(1.0, 1.0, 100)
Pitstop2Setting=49
Pitstop3Range=(1.0, 1.0, 100)
Pitstop3Setting=49
[PITMENU]
Esto hay que cambiarlo manualmente, debido a la enorme cantidad de vaiables que hay.
[AIDPENALTIES]
Son las penalizaciones que sufre el coche en cuanto a físicas por llevar activadas las ayudas electrónicas.
[FRONTWING]
FWRange=(0.0, 1.0, 45) // Rango de posibles grados de alerón delantero, de 1 a 45 en este caso. Lo demás son valores de rendimiento que hay probar en el juego.
[REARWING]
RWRange=(0.0, 1.0, 45) // Lo mismo que para el Frontwing
[BODYAERO]
Es la aerodinámica el chasis, no queda otra que ir probando valores y probar en el rFactor.
[DIFFUSER]
Aerodinámica del difusor.
[SUSPENSION]
PhysicalModelFile=RGP_susp.pm //Importante, este cargo el archivo .susp de la suspensión del coche, simula los movimientos del triangulo de la suspensión, no afecta al rendimiento, solo el movimiento. Los demás valores hay que repetir los casos anteriores.
[CONTROLS]
Son las especificaciones técnicas del coche, cuanto gira el volante, si queremos tracción 4 ruedas, 2 ruedas, si queremos ABS...
[ENGINE]
Normal=BRGTV10 // IMPORTANTE Es el motor del coche, un archivo.ini
RestrictorPlate=BRGTV10 // Seleccionamos el mismo archivo
[DRIVELINE]
Simula la caja de cambios y tambien define que ruedas son las motrices, delanteras o traseras.
GearFile=RGP_Gear.ini //Archivo .ini que contiene la relación de la caja de cambios
[FRONTLEFT][FRONTRIGHT][REARLEFT][REARRIGHT]
Son las físicas de las suspensiones, divididas en 4 (1 por rueda). El frontleft y el frontright deben ser idénticos, si no el coche tenderá a irse para un lado. El rearleft y el rearright tienen que cumplir lo mismo que antes, si no el coche girará solo. Entre delante y detrás pueden haber pequeñas diferencias, como máximo de altura o caida de neumáticos.
Archivos externos usados por el .hdv
Archivo del motor (.ini)
Para hacer este archivo existe una aplicación en rfc muy sencilla de utilizar:
http://www.rfactorcentral.com/detail.cfm?ID=Easy%20Engine%20Physics%20Editor
Con el programa configuraremos la potencia pero hay que ajustar tambien otros valores:
FuelConsumption=3.61e-05 (es el consumo de combustible, la "e" significa elevado a X.
FuelEstimate=1.75 (Estimación de lo que se reduce la gasolina en el HUD por vuelta)
EngineInertia=0.05600 (Inercia que producen los compontentes del motor, a mayor potencia, mayor inercia, es un término físico)
IdleThrottle=0.40000 (Lo que el motor funciona sin pisar el acelerador, es el neutro vamos)
IdleRPMLogic=(4850, 5300) (Revoluciones del motor sin acelerar y en neutral, cuando el motor esta encendido claro.)
LaunchEfficiency=1 (Eficacia del control de lanzado, entre 0 y 1, 0 nada, 1 máxima eficacia)
LaunchRPMLogic=(10000, 14000) // Revoluciones donde actua el control de lanzado.
RevLimitRange=(19000, 300, 8 ) (RPM por defecto, incremento de RPM por mapa seleccionado, mapas disponibles)
RevLimitLogic=100 (Soft limiter, es un pequeño limitador para que al ir a tope en séptima no pasemos de rpm el motor, si ponemos 100 quiere decir que el motor irá 100 rpm por encima del límite y no dará mas)
RevLimitAvailable=1 (Si queremos el soft limiter, 0 = no, 1 = si)
EngineMapRange=(0, 1, 5) (Mapas motor: el 5 son el numero de mapas que hay y el 1 que se incremente de 1 en 1)
EngineBrakingMapRange=(0, 0.500e-04, 5) (Lo mismo para los frenos)
EngineBoostRange=(0.01000, 1, 5) (Rango de potencia por mapa)
BoostEffects=(50, 0.0050, 1.0150) (Efecto de potencia por mapa incrementado)
BoostTorque=-0.00410 (Incremento de torque por cambio de mapa)
BoostPower=1.600e-04 (Incremento de caballos por cambio de mapa)
OptimumOilTemp=105 (Temperatura optima del aceite)
CombustionHeat=40 (Grados de temperatura añadidos por litro de aceite quemado)
Lo siguiente es lo que aumentará la temperatura por los refrigerantes:
EngineSpeedHeat=9.062e-04
OilMinimumCooling=0.00750
OilWaterHeatTransfer=(0.49620, 7.925e-05)
WaterMinimumCooling=2.850e-04
RadiatorCooling=(4.850e-04, 1.000e-04) // lo que refrigerará el radiador, el primer valor es lo que enfria de normal, el segundo el incremente de frio por cambio de tamaño de radiador)
LifetimeEngineRPM=(20200, 350) (RPM donde el motor empieza a sufrir y a perder vidad, el siguente numero son las RPM donde sufre críticamente, 20200+350 = 20750)
LifetimeOilTemp=(110, 2.5000) // temperatura de vida del aceite, rango donde el aceite se deteriora)
LifetimeAvg=15000 (Vida media en segundos)
LifetimeVar=0 // varianza de vida del motor aleatoria
EngineEmission=(0, 0.5000, 0.5000) // Emision de las llamas, son coordenadas.
EngineSound=(0.20000, 0.6000, -2.5000) (Sonido del motor)
SpeedLimiter=1 Si queremos tener limitador de velocidad (0= no, 1 = si)
OnboardStarter=1 // (0= no, 1 = si, si queremos que se pueda encender el motor sin estar en el pitlane cuando se cale)
StarterTiming=(1.0, 1.0, 2.0) (Tiempo de puesta en marcha del motor)
Archivo neumáticos (.tbc)
Archivo gear (marchas).ini
Este archivo se tiene que modificar manualmente, probando en el juego que las marchas sean escalonadas y secuenciales.
Archivo suspensión (.pm)
Este archivo mejor cojerlo de un mod parecido al nuestro ya que si no sabemos para que sirve cada parámetro acabaremos haciendo un cohete de feria en lugar de un coche.
Archivo Damage (.ini)
Son los daños del coche.
/////////////////////////////////////////////////////////////////////////////////
Explicación del archivo .sfx:
El archivo de audio debe ir antecedido por la dirección de la carpeta donde esta dicho clip de audio, ejemplo:
VS_INSIDE_COAST_ENGINE_1=BRGTV10\IDLE_IN_D_mcl.wav
En GameData\Sonidos tendremos una carpeta llamada BRGTV10 con los sonidos.
/////////////////////////////////////////////////////////////////////////////////
Archivo .gen y spinner.gen
Antes de seguir, si surgen dudas, recomiendo leer el post sobre exportación:
http://burningtm.creatuforo.com/exportando-con-3dsmax-tema61.html
Y ahora muy importante es colocar bien en el archivo .gen donde esta el .mas que contiene el modelo del coche, ya que si no lo encuentra, o no encuentra algo nos tirará un error al entrar en el rfactor.
Al abrir el .gen en las primeras filas nos encontramos con:
SearchPath=
SearchPath=
MASFile=2010\TEAMS\rgp.mas
MASFile=cmaps.mas
Hay que colocar la ruta exacta de donde se encuentra el .mas, en este caso esta en GameData\Vehicles\RGP\2010\TEAMS\rgp.mas, pero como en el archivo .rfm ya le hemos indicado que los coches se encuentran en
VehiclesDir=GAMEDATA\VEHICLES\RGP\, no es necesario volver a poner RGP asi que ponemos solo 2010\TEAMS\rgp.mas
Ahora hay que rellenar cada instancia (Instance) con el .gmt de nuestro coche, esta parte esta explicada en el tutorial puesto arriba "Exportando con 3dsMax". Solo hay que seguir las lineas y cambiar los nombres.
Para no escribirlo todo desde 0, se coje un .gen de un mod parecido al nuestro, es decir, si el mod es monoplaza, cojemos un .gen de un monoplaza y lo modificamos. Esto es porque un turismo tiene instancias de luces, por ejemplo, y un monoplaza no, luego borramos la instancia de las luces y listo.
Para el archivo spinner.gen se sigue la misma estética, ya que este archivo cargará el coche en el showroom mientras que el .gen lo hace una vez cargado el circuito.
Extensión archivos .gen y spinner.gen
Vamos a extendernos sobre que hay que poner en cada instancia del .gen. Vamos a usar como ejemplo el .gen del mod rgp2010, si abrimos otro .gen de un mod distinto observaremos instancias diferentes, pero funciona igual, si nuestro coche tiene faros y el rgp no tiene esa instancia, abrimos un .gen de un turismo por ejemplo, copiamos la instancia y la pegamos en nuestro .gen, obviamente hay que cambiar el nombre del .gmt, si el nuestro se llama faros.gmt y el que hemos copiado farosb.gen hay que poner el nuestro si no no encontrará el .gmt y no lo podrá cargar.
La primera instancia que encuentra es Instance=SLOT:
Nos pedirá cual es el nombre de nuestro .gmt para un detalle maximo, alto, medio y bajo, tenemos que poner el chasis principal, esta instancia es la que se encarga de controlar los gráficos, si ponemos low, cargará un chasis con pocos polígonos por si tenemos un pc cortillo de potencia.
Hay que poner un form_shad.gmt que podemos cojer de algun mod que hará de sombra, ya que al ser simple, la sombra no comerá muchos gráficos.
//------------------------------------SHADOW AND COLLISION OBJECTS---------------------------------
Aqui ponemos el .gmt que hará la sombra directa, en este caso Form_col.gmt
Actor=VEHICLE
Instance=COCKPIT
Estas instancias mostrarán lo que vamos a ver desde la vista cockpit, ponemos los .gmt de las piezas que queremos que se vean desde esta cámara.
Por ejemplo, queremos que se vea el chasis y alerones, pues ponemos:
Moveable=True
MeshFile=chasisrgp.gmt CollTarget=False HATTarget=False LODIn=(0.0) LODOut=(1.5) ShadowReceiver=True
MeshFile=rwing.gmt CollTarget=False HATTarget=False LODIn=(0.0) LODOut=(5.0) ShadowReceiver=True
MeshFile=fwing.gmt CollTarget=False HATTarget=False LODIn=(0.0) LODOut=(5.0) ShadowReceiver=True
Ahora viene el volante, hay que indicar que .gmt hará de volante y actuará como tal:
////////////////////////////////////Steering Wheel/////////////////
Instance=wheel
{
Moveable=True
MeshFile=volante.gmt CollTarget=False HATTarget=False LODIn=(0.0) LODOut=(6.0) ShadowReceiver=True
}
Lo mismo para fwin y rwing (en el caso de que los haya, si no hay, se borran estas instancias.
Vamos con la suspensión, como vamos a tener cuatro, en el apartado Suspension, hay que poner 4 instancias, que podemos llamar Debris seguido de un numero para identificarlas o otro nombre, pero ojo hay que recordarlo, porque luego hay que poner esta instancia en el archivo damage, si el archivo damage tiene una instancia debris que en el .gen no esta nos dará error, si esta en el .gen y no en el damage no pasa nada, simplemente esa instancia no sufrirá daños al chocar.
Asi pues tenemos 4 suspensiones, que hay que dividir, como hay 4, asigno 4 números al debris y la suspension la divido en lf, rf, lr y rr:
Instance=DEBRIS5
{
Moveable=True
MeshFile=lfsusp.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(350.0) ShadowReceiver=True
}
Instance=DEBRIS6
{
Moveable=True
MeshFile=lrsusp.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(350.0) ShadowReceiver=True
}
Instance=DEBRIS7
{
Moveable=True
MeshFile=rfsusp.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(350.0) ShadowReceiver=True
}
Instance=DEBRIS8
{
Moveable=True
MeshFile=rrsusp.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(350.0) ShadowReceiver=True
}
Ahora un efecto muy bonito, las llamas al bajar de marcha, lo que sale por el tubo de escape, es la instancia BACKFIRE
//////////////////////////////////// EXHAUST BACKFIRES/////////////////////////////////////////////////////////
Instance=BACKFIRE
{
Moveable=True
MeshFile=fyre.gmt CollTarget=False HATTarget=False LODIn=(0.00) LODOut=(30.0) ShadowReceiver=False
}
/////////////////////////////// TV CAM////////////////////////////////////////////////////////////////////
Aqui hay que poner el chasis y los espejos, si no ponemos espejos no veremos el chasis en la cámara tv cockpit, es un error muy común que uno se vuelve loco porque el chasis no aparece y es por culpa de que no hemos puesto espejos. Los espejos basta que sean dos planos puestos en la posición del espejo y activando la casilla Render Target en el 3dsimed para este objeto.
En este caso, tenemos un espejo a cada lado, pues:
Instance=DEBRIS11
{
Moveable=True
MeshFile=chasisrgp.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(140.0) ShadowReceiver=True
}
Instance=DEBRIS1
{
Moveable=True
MeshFile=rmirror.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(140.0) ShadowReceiver=True
}
Instance=DEBRIS2
{
Moveable=True
MeshFile=lmirror.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(140.0) ShadowReceiver=True
}
Bien, hemos puesto los espejos para que se vean desde la tv cam y para que se vea el chasis, pero hay que decirle que son espejos y que serán los objetos que mostrarán al que viene dandonos la lata por detrás, pues hay que poner las instancias siguientes:
//////////////////////////////////// MIRRORS //////////////////////////////////////////////////////////////////
Instance=DSMirror
{
Moveable=True
MeshFile=lmirror.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(350.0) ShadowReceiver=True
}
Instance=PSMirror
{
Moveable=True
MeshFile=rmirror.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(350.0) ShadowReceiver=True
}
Ahora vamos a decirle que son el casco y el piloto, si los hay, lo hacemos con las instancias body para el piloto y helmet para el casco:
//////////////////////////////////// DRIVER ///////////////////////////////////////////////////////////////////
Instance=BODY
{
Moveable=True
MeshFile=driver.gmt CollTarget=False HATTarget=False LODIn=(0.0) LODOut=(350.0) ShadowReceiver=True
}
Instance=Helmet
{
Moveable=True
MeshFile=helmet.gmt CollTarget=False HATTarget=False LODIn=(0.0) LODOut=(8.0) ShadowReceiver=True
MeshFile=helmet.gmt CollTarget=False HATTarget=False LODIn=(8.0) LODOut=(20.0) ShadowReceiver=True
MeshFile=helmet.gmt CollTarget=False HATTarget=False LODIn=(20.0) LODOut=(110.0)
}
Vamos con los neumáticos, hay que repetir el paso de la suspensión ya que tenemos 4, los dividimos por ejemplo en lftire, rftire, lrtire y rrtire, además si tenemos llantas, hay que añadirlas tambien con otro (ejemplo):
MeshFile=RIM_LF.GMT CollTarget=False HATTarget=False LODIn=(0.00) LODOut=(4.0) ShadowReceiver=True
Asi pues introducimos los neumáticos seguido de su llanta, y si queremos zapata de freno hay que rellenar el lf_spindle, esto hará que la zapata gire y se mueva pero que no ruede. Asi pues de ejemplo para la delantera izquierda tenemos:
Instance=LFTIRE
{
Moveable=True
MeshFile=form_lf_dg.gmt CollTarget=False HATTarget=False LODIn=(0.00) LODOut=(20.0)
MeshFile= CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 128, 128) LODIn=(0.00) LODOut=(350.0) ShadowReceiver=True
MeshFile= CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 128, 128) LODIn=(0.00) LODOut=(3.0) ShadowReceiver=True
MeshFile= CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 128, 128) LODIn=(3.0) LODOut=(350.0) ShadowReceiver=True
MeshFile= CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 128, 128) LODIn=(0.00) LODOut=(350.0) ShadowReceiver=True
MeshFile= CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 128, 128) LODIn=(0.00) LODOut=(350.0) ShadowReceiver=True
}
MeshFile=RIM_LF.GMT CollTarget=False HATTarget=False LODIn=(0.00) LODOut=(4.0) ShadowReceiver=True
Instance=LFSpindle
{
Moveable=True
MeshFile=lfbrake.gmt CollTarget=False HATTarget=False LODIn=(0.00) LODOut=(20.0) ShadowReceiver=True
}
Y asi con las otras ruedas.
Ahora hay que abrir el archivo damage.ini y poner las instancias que queremos que sufran daños al colisionar y quitar las que no estén, si no hemos puesto debris20 o helmet hay que quitarlas del damage o nos dará error, pero recordad que si que puede haber en el .gen una instancia debris20 y que no queremos que sufra daños, pues no la ponemos en el damage.ini
Ahora para el spinner hay que repetir los mismos pasos, que son menos, pero no hay que copiar y pegar todo el archivo, puesto que en el spinner por ejemplo no queremos que se vea el casco además no hay clasificación de MAX, HIGH, MED y LOW gráficos, si copiamos el archivo directamente como spinner es muy probable que no funcione.
Con esto ya funciona seguro el coche en el rFactor, si se quiere algun efecto en específico como disco de freno o luz de lluvia preguntadme o buscad en algun mod parecido, las instancias que hay son un montón y llenaría medio foro explicándolas todas
Archivo rFm
Empezando por el mod, en la carpeta rFm encontramos el archivo .rfm de nuestro mod, ahi es donde configuramos el nombre del mod que queremos que se muestre en el juego, el filtro para que aparezcan los coches que queremos, ejemplo:
Si queremos que aparezcan los F1 2010, en Vehicle filter ponemos por ejemplo: F12010, ahora en el .veh del coche 2010 le pones en Classes="F12010" y aparecerá este coche en nuestro mod.
Mas parámetros importantes son el numero de pilotos que tiene, maximos oponentes, minimos, etc. Algo importante es el parámetro ConfigOverrides que le dice al mod donde estan los archivos para ese mod en concreto, los archivos del coche, sonidos, opciones, fisicas...
Luego tenemos los circuitos, ordenados segun calendario, para hacer temporadas singleplayer, seguido del sistema de puntuación que queremos que nuestro mod de al acabar una carrera. Lo siguiente son normas y parámetros, como las horas a las que se corre, límites de velocidad, etc.
Y por último y no menos importante, los PitGroups, que le van a decir al mod cuantos coches por pitbox hay y el orden, es decir:
PitGroup = 2, Group1
PitGroup = 2, Group2
PitGroup = 2, Group3
PitGroup = 2, Group4
PitGroup = 2, Group5
* Con pitgroup = 2 le decimos que queremos que por cada equipo (pitbox) hayan dos coches, esto hará que en el mismo pitbox paren a repostar dos coches, los del mismo equipo se entiende.
Ahora bien, para que paren los coches del mismo equipo, en el .veh de antes, hay que asignar un Group, luego si tenemos dos coches en un equipo, a esos dos coches hay que ponerles Group1.
////////////////////////////////////////////////////////////////////////////////////
Archivo .veh
Vamos con el .veh, el .veh es un archivo que contiene lo necesario para montar el coche, recoje las físicas, sonidos, texturas y datos del equipo.
¿Como funciona?
Si tenemos instalado el programa VehVwr (http://www.rfactorcentral.com/detail.cfm?ID=Vehicle%20Viewer) y hacemos doble click en eun .veh de un coche, se nos abrira el programa y visualizaremos el coche con todas las modicicaciones, pero si lo abrimos con el bloc de notas, nos salen datos. Estos datos hacen referencia a un coche, si tenemos un equipo y este equipo tiene 2 coches, tendremos 2 archivos .veh en la carpeta. Normalmente se le suele poner de nombre el nombredelequipo_numeropiloto:
RGP_01.veh y RGP_02.veh
Abrimos un archivo .veh y veremos lo siguiente:
DefaultLivery="RGP_01/RGP_01.DDS" (Esto busca la textura del coche en la carpeta RGP_01, dentro de esta carpeta se hayan las texturas del coche que son diferentes de las del .mas, ya que en estas texturas podemos hacer que cada coche tenga un color por ejemplo diferente al del .mas)
HDVehicle=RGP.hdv (Esto es el archivo de las físicas del coche)
Graphics=RGP.gen (Este archivo carga los archivos .gmt de modelado que componen el coche)
Spinner=RGP_Spinner.gen (Carga los archivos como el .gen pero para el showroom, cuando estamos en el menu del rFactor)
GenString= (no es necesario)// Used to generate GMT names in *.gen file
Cameras=RGP_cams.cam (Carga las camaras del coche)
Sounds=BRGTV10.sfx (Carga los sonidos del coche)
HeadPhysics=headphysics.ini (Carga las físicas del casco, las que simulan el giro de la cabeza al hacer una curva)
Cockpit=RGP_cockpitinfo.ini (Contiene las camaras on board y los leds del volante)
Upgrades=RGP_upgrades.ini (Si queremos poner mejoras al coche o cambios como tipo de alerones)
BaseVehiclePrice=0 (Si queremos que el coche cueste dinero para comprarlo)
UnlockExperience=0 (Si queremos que el usuario tenga experiencia para poder conducirlo)
Ahora la segunda parte del archivo .veh
//////////////////////////TEAM HISTORY AND INFORMATION///////////////////////////////////////////
Number=01 (Numero del piloto)
Team="Burning-Team"
PitGroup="Group1" (aqui estan los pitgroups explicados en el .rfm, le asignamos el pitbox 1 en este caso)
Driver="Tiago Monteiro"
Description="1:Tiago Monteiro"
Engine="BRGTV10"
Manufacturer="Burning-Team"
Classes="RGP" (Este es el filtro del .rfm, todos los coches que tengas en Classes RGP aparecerán en el mod RGP.)
FullTeamName="Burning-Team"
TeamFounded=2009
TeamHeadquarters="Spain"
TeamStarts=0
TeamPoles=0
TeamWins=0
TeamWorldChampionships=0
Category="Red Grand Prix 2010" (Esto nos permite crear subcategorias, por ejemplo, en el mod (Classes) RGP podemos tenter 2 categorias, una de 500 cc y otra de 250 cc por ejemplo, si ponemos Category ="Red Grand Prix 2010 250cc" en la selección de vehículos para el mod RGP aparecerán dos listas, una con los coches RGP 2010 y otra con los coches RGP 2010 250cc, ambos para el mod RGP.
////////////////////////////////////////////////////////////////////////////////////
Archivo .hdv
Este archivo es el más extenso y costoso de elaborar, no porque sea dificil si no por la cantidad de parámetros que hay que modificar, para hacerlo correctamente, la única manera que hay es modificar los valores y probar en el rFactor, lo mejor es cojer un .hdv de un mod libre que se parezca al que queremos hacer, y retocarlo, pero para resumir, los más importantes són:
[GENERAL]
GarageDisplayFlags=47 // lo que queremos que se pueda modificar al entrar al seleccionar el menu pitlane(add): 1=rear downforce value (vs. angle), 2=radiator (vs. grille tape), 4=more gear info, 8+16=front downforce/wing/splitter/air dam, 32+64=rear downforce/wing/spoiler, 128=flip ups (vs. fender flare)
Mass=650.0 // La masa del coche (sin contar gasolina)
Symmetric=1 //Si queremos que el lado izquierdo del coche se comporte igual que el derecho
DamageFile=RGP_Damage // IMPORTANTE ya que carga el archivo de los daños para el coche, es un archivo .ini
TireBrand=Michelin_M10 // Otro archivo .tbc que son las físicas de los neumáticos.
Lo siguiente muestra cuanta gasolina se puede almacenar y cuantos pitstops se pueden hacer con la gasolina max que se puede poner:
FuelRange=(1.0, 1.0, 100)
FuelSetting=49
NumPitstopsRange=(0, 1, 4)
NumPitstopsSetting=3
Pitstop1Range=(1.0, 1.0, 100)
Pitstop1Setting=49
Pitstop2Range=(1.0, 1.0, 100)
Pitstop2Setting=49
Pitstop3Range=(1.0, 1.0, 100)
Pitstop3Setting=49
[PITMENU]
Esto hay que cambiarlo manualmente, debido a la enorme cantidad de vaiables que hay.
[AIDPENALTIES]
Son las penalizaciones que sufre el coche en cuanto a físicas por llevar activadas las ayudas electrónicas.
[FRONTWING]
FWRange=(0.0, 1.0, 45) // Rango de posibles grados de alerón delantero, de 1 a 45 en este caso. Lo demás son valores de rendimiento que hay probar en el juego.
[REARWING]
RWRange=(0.0, 1.0, 45) // Lo mismo que para el Frontwing
[BODYAERO]
Es la aerodinámica el chasis, no queda otra que ir probando valores y probar en el rFactor.
[DIFFUSER]
Aerodinámica del difusor.
[SUSPENSION]
PhysicalModelFile=RGP_susp.pm //Importante, este cargo el archivo .susp de la suspensión del coche, simula los movimientos del triangulo de la suspensión, no afecta al rendimiento, solo el movimiento. Los demás valores hay que repetir los casos anteriores.
[CONTROLS]
Son las especificaciones técnicas del coche, cuanto gira el volante, si queremos tracción 4 ruedas, 2 ruedas, si queremos ABS...
[ENGINE]
Normal=BRGTV10 // IMPORTANTE Es el motor del coche, un archivo.ini
RestrictorPlate=BRGTV10 // Seleccionamos el mismo archivo
[DRIVELINE]
Simula la caja de cambios y tambien define que ruedas son las motrices, delanteras o traseras.
GearFile=RGP_Gear.ini //Archivo .ini que contiene la relación de la caja de cambios
[FRONTLEFT][FRONTRIGHT][REARLEFT][REARRIGHT]
Son las físicas de las suspensiones, divididas en 4 (1 por rueda). El frontleft y el frontright deben ser idénticos, si no el coche tenderá a irse para un lado. El rearleft y el rearright tienen que cumplir lo mismo que antes, si no el coche girará solo. Entre delante y detrás pueden haber pequeñas diferencias, como máximo de altura o caida de neumáticos.
Archivos externos usados por el .hdv
Archivo del motor (.ini)
Para hacer este archivo existe una aplicación en rfc muy sencilla de utilizar:
http://www.rfactorcentral.com/detail.cfm?ID=Easy%20Engine%20Physics%20Editor
Con el programa configuraremos la potencia pero hay que ajustar tambien otros valores:
FuelConsumption=3.61e-05 (es el consumo de combustible, la "e" significa elevado a X.
FuelEstimate=1.75 (Estimación de lo que se reduce la gasolina en el HUD por vuelta)
EngineInertia=0.05600 (Inercia que producen los compontentes del motor, a mayor potencia, mayor inercia, es un término físico)
IdleThrottle=0.40000 (Lo que el motor funciona sin pisar el acelerador, es el neutro vamos)
IdleRPMLogic=(4850, 5300) (Revoluciones del motor sin acelerar y en neutral, cuando el motor esta encendido claro.)
LaunchEfficiency=1 (Eficacia del control de lanzado, entre 0 y 1, 0 nada, 1 máxima eficacia)
LaunchRPMLogic=(10000, 14000) // Revoluciones donde actua el control de lanzado.
RevLimitRange=(19000, 300, 8 ) (RPM por defecto, incremento de RPM por mapa seleccionado, mapas disponibles)
RevLimitLogic=100 (Soft limiter, es un pequeño limitador para que al ir a tope en séptima no pasemos de rpm el motor, si ponemos 100 quiere decir que el motor irá 100 rpm por encima del límite y no dará mas)
RevLimitAvailable=1 (Si queremos el soft limiter, 0 = no, 1 = si)
EngineMapRange=(0, 1, 5) (Mapas motor: el 5 son el numero de mapas que hay y el 1 que se incremente de 1 en 1)
EngineBrakingMapRange=(0, 0.500e-04, 5) (Lo mismo para los frenos)
EngineBoostRange=(0.01000, 1, 5) (Rango de potencia por mapa)
BoostEffects=(50, 0.0050, 1.0150) (Efecto de potencia por mapa incrementado)
BoostTorque=-0.00410 (Incremento de torque por cambio de mapa)
BoostPower=1.600e-04 (Incremento de caballos por cambio de mapa)
OptimumOilTemp=105 (Temperatura optima del aceite)
CombustionHeat=40 (Grados de temperatura añadidos por litro de aceite quemado)
Lo siguiente es lo que aumentará la temperatura por los refrigerantes:
EngineSpeedHeat=9.062e-04
OilMinimumCooling=0.00750
OilWaterHeatTransfer=(0.49620, 7.925e-05)
WaterMinimumCooling=2.850e-04
RadiatorCooling=(4.850e-04, 1.000e-04) // lo que refrigerará el radiador, el primer valor es lo que enfria de normal, el segundo el incremente de frio por cambio de tamaño de radiador)
LifetimeEngineRPM=(20200, 350) (RPM donde el motor empieza a sufrir y a perder vidad, el siguente numero son las RPM donde sufre críticamente, 20200+350 = 20750)
LifetimeOilTemp=(110, 2.5000) // temperatura de vida del aceite, rango donde el aceite se deteriora)
LifetimeAvg=15000 (Vida media en segundos)
LifetimeVar=0 // varianza de vida del motor aleatoria
EngineEmission=(0, 0.5000, 0.5000) // Emision de las llamas, son coordenadas.
EngineSound=(0.20000, 0.6000, -2.5000) (Sonido del motor)
SpeedLimiter=1 Si queremos tener limitador de velocidad (0= no, 1 = si)
OnboardStarter=1 // (0= no, 1 = si, si queremos que se pueda encender el motor sin estar en el pitlane cuando se cale)
StarterTiming=(1.0, 1.0, 2.0) (Tiempo de puesta en marcha del motor)
Archivo neumáticos (.tbc)
Archivo gear (marchas).ini
Este archivo se tiene que modificar manualmente, probando en el juego que las marchas sean escalonadas y secuenciales.
Archivo suspensión (.pm)
Este archivo mejor cojerlo de un mod parecido al nuestro ya que si no sabemos para que sirve cada parámetro acabaremos haciendo un cohete de feria en lugar de un coche.
Archivo Damage (.ini)
Son los daños del coche.
/////////////////////////////////////////////////////////////////////////////////
Explicación del archivo .sfx:
El archivo de audio debe ir antecedido por la dirección de la carpeta donde esta dicho clip de audio, ejemplo:
VS_INSIDE_COAST_ENGINE_1=BRGTV10\IDLE_IN_D_mcl.wav
En GameData\Sonidos tendremos una carpeta llamada BRGTV10 con los sonidos.
/////////////////////////////////////////////////////////////////////////////////
Archivo .gen y spinner.gen
Antes de seguir, si surgen dudas, recomiendo leer el post sobre exportación:
http://burningtm.creatuforo.com/exportando-con-3dsmax-tema61.html
Y ahora muy importante es colocar bien en el archivo .gen donde esta el .mas que contiene el modelo del coche, ya que si no lo encuentra, o no encuentra algo nos tirará un error al entrar en el rfactor.
Al abrir el .gen en las primeras filas nos encontramos con:
SearchPath=
SearchPath=
MASFile=2010\TEAMS\rgp.mas
MASFile=cmaps.mas
Hay que colocar la ruta exacta de donde se encuentra el .mas, en este caso esta en GameData\Vehicles\RGP\2010\TEAMS\rgp.mas, pero como en el archivo .rfm ya le hemos indicado que los coches se encuentran en
VehiclesDir=GAMEDATA\VEHICLES\RGP\, no es necesario volver a poner RGP asi que ponemos solo 2010\TEAMS\rgp.mas
Ahora hay que rellenar cada instancia (Instance) con el .gmt de nuestro coche, esta parte esta explicada en el tutorial puesto arriba "Exportando con 3dsMax". Solo hay que seguir las lineas y cambiar los nombres.
Para no escribirlo todo desde 0, se coje un .gen de un mod parecido al nuestro, es decir, si el mod es monoplaza, cojemos un .gen de un monoplaza y lo modificamos. Esto es porque un turismo tiene instancias de luces, por ejemplo, y un monoplaza no, luego borramos la instancia de las luces y listo.
Para el archivo spinner.gen se sigue la misma estética, ya que este archivo cargará el coche en el showroom mientras que el .gen lo hace una vez cargado el circuito.
Extensión archivos .gen y spinner.gen
Vamos a extendernos sobre que hay que poner en cada instancia del .gen. Vamos a usar como ejemplo el .gen del mod rgp2010, si abrimos otro .gen de un mod distinto observaremos instancias diferentes, pero funciona igual, si nuestro coche tiene faros y el rgp no tiene esa instancia, abrimos un .gen de un turismo por ejemplo, copiamos la instancia y la pegamos en nuestro .gen, obviamente hay que cambiar el nombre del .gmt, si el nuestro se llama faros.gmt y el que hemos copiado farosb.gen hay que poner el nuestro si no no encontrará el .gmt y no lo podrá cargar.
La primera instancia que encuentra es Instance=SLOT
Nos pedirá cual es el nombre de nuestro .gmt para un detalle maximo, alto, medio y bajo, tenemos que poner el chasis principal, esta instancia es la que se encarga de controlar los gráficos, si ponemos low, cargará un chasis con pocos polígonos por si tenemos un pc cortillo de potencia.
Hay que poner un form_shad.gmt que podemos cojer de algun mod que hará de sombra, ya que al ser simple, la sombra no comerá muchos gráficos.
//------------------------------------SHADOW AND COLLISION OBJECTS---------------------------------
Aqui ponemos el .gmt que hará la sombra directa, en este caso Form_col.gmt
Actor=VEHICLE
Instance=COCKPIT
Estas instancias mostrarán lo que vamos a ver desde la vista cockpit, ponemos los .gmt de las piezas que queremos que se vean desde esta cámara.
Por ejemplo, queremos que se vea el chasis y alerones, pues ponemos:
Moveable=True
MeshFile=chasisrgp.gmt CollTarget=False HATTarget=False LODIn=(0.0) LODOut=(1.5) ShadowReceiver=True
MeshFile=rwing.gmt CollTarget=False HATTarget=False LODIn=(0.0) LODOut=(5.0) ShadowReceiver=True
MeshFile=fwing.gmt CollTarget=False HATTarget=False LODIn=(0.0) LODOut=(5.0) ShadowReceiver=True
Ahora viene el volante, hay que indicar que .gmt hará de volante y actuará como tal:
////////////////////////////////////Steering Wheel/////////////////
Instance=wheel
{
Moveable=True
MeshFile=volante.gmt CollTarget=False HATTarget=False LODIn=(0.0) LODOut=(6.0) ShadowReceiver=True
}
Lo mismo para fwin y rwing (en el caso de que los haya, si no hay, se borran estas instancias.
Vamos con la suspensión, como vamos a tener cuatro, en el apartado Suspension, hay que poner 4 instancias, que podemos llamar Debris seguido de un numero para identificarlas o otro nombre, pero ojo hay que recordarlo, porque luego hay que poner esta instancia en el archivo damage, si el archivo damage tiene una instancia debris que en el .gen no esta nos dará error, si esta en el .gen y no en el damage no pasa nada, simplemente esa instancia no sufrirá daños al chocar.
Asi pues tenemos 4 suspensiones, que hay que dividir, como hay 4, asigno 4 números al debris y la suspension la divido en lf, rf, lr y rr:
Instance=DEBRIS5
{
Moveable=True
MeshFile=lfsusp.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(350.0) ShadowReceiver=True
}
Instance=DEBRIS6
{
Moveable=True
MeshFile=lrsusp.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(350.0) ShadowReceiver=True
}
Instance=DEBRIS7
{
Moveable=True
MeshFile=rfsusp.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(350.0) ShadowReceiver=True
}
Instance=DEBRIS8
{
Moveable=True
MeshFile=rrsusp.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(350.0) ShadowReceiver=True
}
Ahora un efecto muy bonito, las llamas al bajar de marcha, lo que sale por el tubo de escape, es la instancia BACKFIRE
//////////////////////////////////// EXHAUST BACKFIRES/////////////////////////////////////////////////////////
Instance=BACKFIRE
{
Moveable=True
MeshFile=fyre.gmt CollTarget=False HATTarget=False LODIn=(0.00) LODOut=(30.0) ShadowReceiver=False
}
/////////////////////////////// TV CAM////////////////////////////////////////////////////////////////////
Aqui hay que poner el chasis y los espejos, si no ponemos espejos no veremos el chasis en la cámara tv cockpit, es un error muy común que uno se vuelve loco porque el chasis no aparece y es por culpa de que no hemos puesto espejos. Los espejos basta que sean dos planos puestos en la posición del espejo y activando la casilla Render Target en el 3dsimed para este objeto.
En este caso, tenemos un espejo a cada lado, pues:
Instance=DEBRIS11
{
Moveable=True
MeshFile=chasisrgp.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(140.0) ShadowReceiver=True
}
Instance=DEBRIS1
{
Moveable=True
MeshFile=rmirror.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(140.0) ShadowReceiver=True
}
Instance=DEBRIS2
{
Moveable=True
MeshFile=lmirror.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(140.0) ShadowReceiver=True
}
Bien, hemos puesto los espejos para que se vean desde la tv cam y para que se vea el chasis, pero hay que decirle que son espejos y que serán los objetos que mostrarán al que viene dandonos la lata por detrás, pues hay que poner las instancias siguientes:
//////////////////////////////////// MIRRORS //////////////////////////////////////////////////////////////////
Instance=DSMirror
{
Moveable=True
MeshFile=lmirror.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(350.0) ShadowReceiver=True
}
Instance=PSMirror
{
Moveable=True
MeshFile=rmirror.gmt CollTarget=False HATTarget=False ShadowCaster=(True, Solid, 64, 64) LODIn=(0.0) LODOut=(350.0) ShadowReceiver=True
}
Ahora vamos a decirle que son el casco y el piloto, si los hay, lo hacemos con las instancias body para el piloto y helmet para el casco:
//////////////////////////////////// DRIVER ///////////////////////////////////////////////////////////////////
Instance=BODY
{
Moveable=True
MeshFile=driver.gmt CollTarget=False HATTarget=False LODIn=(0.0) LODOut=(350.0) ShadowReceiver=True
}
Instance=Helmet
{
Moveable=True
MeshFile=helmet.gmt CollTarget=False HATTarget=False LODIn=(0.0) LODOut=(8.0) ShadowReceiver=True
MeshFile=helmet.gmt CollTarget=False HATTarget=False LODIn=(8.0) LODOut=(20.0) ShadowReceiver=True
MeshFile=helmet.gmt CollTarget=False HATTarget=False LODIn=(20.0) LODOut=(110.0)
}
Vamos con los neumáticos, hay que repetir el paso de la suspensión ya que tenemos 4, los dividimos por ejemplo en lftire, rftire, lrtire y rrtire, además si tenemos llantas, hay que añadirlas tambien con otro (ejemplo):
MeshFile=RIM_LF.GMT CollTarget=False HATTarget=False LODIn=(0.00) LODOut=(4.0) ShadowReceiver=True
Asi pues introducimos los neumáticos seguido de su llanta, y si queremos zapata de freno hay que rellenar el lf_spindle, esto hará que la zapata gire y se mueva pero que no ruede. Asi pues de ejemplo para la delantera izquierda tenemos:
Instance=LFTIRE
{
Moveable=True
MeshFile=form_lf_dg.gmt CollTarget=False HATTarget=False LODIn=(0.00) LODOut=(20.0)
}
MeshFile=RIM_LF.GMT CollTarget=False HATTarget=False LODIn=(0.00) LODOut=(4.0) ShadowReceiver=True
Instance=LFSpindle
{
Moveable=True
MeshFile=lfbrake.gmt CollTarget=False HATTarget=False LODIn=(0.00) LODOut=(20.0) ShadowReceiver=True
}
Y asi con las otras ruedas.
Ahora hay que abrir el archivo damage.ini y poner las instancias que queremos que sufran daños al colisionar y quitar las que no estén, si no hemos puesto debris20 o helmet hay que quitarlas del damage o nos dará error, pero recordad que si que puede haber en el .gen una instancia debris20 y que no queremos que sufra daños, pues no la ponemos en el damage.ini
Ahora para el spinner hay que repetir los mismos pasos, que son menos, pero no hay que copiar y pegar todo el archivo, puesto que en el spinner por ejemplo no queremos que se vea el casco además no hay clasificación de MAX, HIGH, MED y LOW gráficos, si copiamos el archivo directamente como spinner es muy probable que no funcione.
Con esto ya funciona seguro el coche en el rFactor, si se quiere algun efecto en específico como disco de freno o luz de lluvia preguntadme o buscad en algun mod parecido, las instancias que hay son un montón y llenaría medio foro explicándolas todas