Jump to content

Funcionamiento de la IA: todos los parámetros.


Sire

Publicaciones recomendadas

  • Arquitecto

Los parámetros que gobiernan la IA se encuentran en la siguiente ruta codificada*: data/luascripts/ia
(Por codificada quiero decir encriptada dentro del correspondiente GTP, y por lo tanto modificable sólo mediante el uso de mods).

Para no tener que estar nosotros desencriptando los GTP podemos abrir un mod que ya los haya abierto para nosotros y así lo hacemos con el mod de IA Gunnery que nos permite apreciar, dentro de la carpeta ia, una serie de archivos de los que extraigo dos imágenes:

image.png

...

image.png

Estamos viendo los archivos de datos en texto plano que configuran el comportamiento de los aviones de la IA.

Para que se entienda, el movimiento general de la IA (cualquier tipo de reacción, incluido disparos), se resuelve con una misma fórmula igual para todos y esta fórmula se alimenta de datos (variables) que cambian dependiendo del modelo de avión (y de la veteranía del piloto).

Un ejemplo sencillito: un avión avanzará cada segundo más metros cuanto mayor velocidad pueda generar. Así a un bombardero le pondrás un valor de velocidad bajo y a un caza un valor más alto. La misma fórmula gobierna su avance, pero la variable de velocidad determinará la diferencia entre ambos.

Esto no sólo es lógico, si no que facilita la creación de nuevos modelos nada más que proporcionando su propio perfil específico de variables.

Así en la primera captura podemos ver que cada avión del juego tiene su perfil, como por ejemplo el bf-10 g2, el 64, etc, etc. todos precedidos de "caeroplane".

Bien. Llama la atención ver que hay dos archivos que no hacen mención a ningún modelo concreto, el caeroplane.txt y el cplaneai.txt. Estos archivos son genéricos y aplicables a todos los modelos. Así cada avión de la IA se gobierna por los comunes "caeroplane", el "cplaneai" y su propio archivo de definición del modelo, por ejemplo "caeroplane_bf_109_g2".

Un vistazo a los archivos de definición de la IA

Ahora vamos a echar un vistazo al contenido de los archivos. Tengamos en cuenta que sus parámetros (sus valores) han podido ser modificados por el modder del IA Gunnery. En este punto no lo sé. Sería mejor ver los valores sacados directamente del GTP para saber que son los oficiales, o investigar lo que dice el modder que ha tocado. Pero ahora mismo no me apetece dedicar el tiempo a eso. Me interesa saber qué variables gobiernan la IA.

caeroplante.txt

Controla los parámetros derivados de la veteranía del piloto que son:

image.png

En la captura (de un trozo) podéis ver los parámetros que gobierna cada grado de veteranía.
También podéis ver que los comentarios internos están hechos algunos en inglés y otros en ruso. (He traducido los comentarios del "normal" para que se vea que lo explican bastante claro.
Afortunadamente el nombre de las variables es en inglés.
Y el sistema de métrica del juego es en unidades de SMI, es decir metros, segundos, kilogramos... que es el que usan los rusos (los programadores son rusos) y todo el mundo menos los americanos y los británicos 😞

Forestalling Angle hace referencia al Forestall Angle, que es el ángulo de (no estoy seguro de cómo se traduce en español) deflexión. Me explico: para acertar a un blanco que se te cruza de izquierda a derecha no puedes disparar donde ahora está el blanco, si no donde estará. Por tanto tienes que anticipar dónde estará para poner allí el disparo. Esa anticipación, se mide como el ángulo entre tu visión al objetivo actual y tu visión a donde (crees que) estará cuando llegue el tiro, es decir, insisto, el ángulo de deflexión.

Bien. Pues ahí podemos ver que el ángulo máximo de deflexión con el que trabaja una IA novata es de 15º, un normal es de 25º, un veterano es de 30º y un as (aunque no se ve en la captura) es de 45º.

Forestalling Altitude es la diferencia de altura entre la IA y su objetivo que es capaz de manejar para hacer un apuntado correcto. Novato/ normal/ veterano/ as = 0/125/250/500. ¿Unidades? Ya lo he dicho antes, utilizan el sistema métrico internacional, así que metros.

Si quieres saber más sobre cómo funcionan las fórmulas para programar una predicción de tiro aquí te dejo un pequeño artículo técnico en inglés)

Os invito a que leáis el resto de parámetros y tratéis de imaginar a qué se refieren.

¡Si alguien averigua cuál es y mejor, cómo funciona el modo de ataque 80Z que me lo haga saber, por favor! Yo entiendo que es una fórmula que gobierna el comportamiento de la IA para pasarla al ataque (o dejarla en modo "tranquilo").

Veamos ahora el siguiente archivo genérico:

cplaneai.txt

image.png

(Lo que está en español lo he traducido del ruso)

En este archivo tenemos otra serie de variables genéricas. En el anterior eran dependiendo de la veteranía y en esta realmente aplicables a todos los aviones.

En este archivo, fundamentalmente se gobierna la relación entre las formaciones de IA. Siendo el master el avión líder de la formación, y los slaves los diferentes puntos. Senior slave es el punto precedente en una serie. Así #3 es el precedente de #4.
Según esto (si no hay otro parámetro que no conozco que lo gobierne), una formación de 4 aviones nunca se va a dividir en dos secciones de 2 como harían los humanos.

En esa relación de formación, los slaves van a buscar a su master y a su senior slave para saber cómo deben actuar.
Así, por ejemplo, para el despegue, un slave iniciará su carrera cuando su predecesor le supere en 20 Km/h en la pista.

Adicionalmente este archivo gobierna algunos parámetros de ataque. Destaco uno en la captura que es el "tiempo de decisión para ataque en picado": es el tiempo teórico máximo que se le da a la IA para coger la altura necesaria para hacer un ataque en picado. Si el ordenador calcula que no le va a dar tiempo en ese tiempo para subir, no subirá y hará un ataque en pendiente suave. Esto es evidente en el comportamiento de los Stukas de la IA.

Finalmente hay unos parámetros que activan unos modos de prueba para los desarrolladores. Imagino que presentando sobreimpreso en el juego valores de configuración y parámetros de vuelo. Habrá que probarlo a ver qué se ve.

 

caeroplane_bf_109_g2.txt

Este es el conjunto de parámetros que gobierna al 109-g2. (Tened en cuenta que en esta captura algún parámetro ha podido ser modificado por el modder. De hecho seguro que alguno está modificado, ya que es el objeto del mod AI gunner: cambiar los parámetros de disparo)

Lo voy a poner como una entrada de código porque hay mucho texto y todo es importante:

(El texto en español traducido del ruso con el Google)


//
// Bf109G2
//
//

[performance]
    MaxSpeed           = 550.3
    MaxClimbRate       = 21.0
    ServiceCeiling     = 11500.0
    MinStructureHealth = 0.863
    MinEngineHealth    = 0.6
    EngineWarming      = true
    TurnRate           = 300.0, 67.0

    ////// ClimbTime = <float ALTITUDE>, <float TIME> // 1.3 ATA, радиатор автомат
    ClimbTime = 0,0
    ClimbTime = 1000,48
    ClimbTime = 2000,97
    ClimbTime = 3000,149
    ClimbTime = 4000,201
    ClimbTime = 5000,258
    ClimbTime = 6000,317
    ClimbTime = 7000,389
    ClimbTime = 8000,471
    ClimbTime = 9000,574
    ClimbTime = 10000,702
    ClimbTime = 11000,892

    ////// MaxAltTAS = <float ALTITUDE>, <float TAS> // 1.3 ATA, радиатор автомат
    MaxAltTAS = 0,530
    MaxAltTAS = 1000,550
    MaxAltTAS = 2000,577
    MaxAltTAS = 3000,597
    MaxAltTAS = 4000,615
    MaxAltTAS = 5000,632
    MaxAltTAS = 6000,653
    MaxAltTAS = 7000,656
    MaxAltTAS = 8000,656
    MaxAltTAS = 9000,652
    MaxAltTAS = 10000,642
    MaxAltTAS = 11000,623

    ////// turn time at altitude (m/s) = <float ALTITUDE>, <float TIME> // временно от G4
    TurnTimeAlt = 0,21.2
    TurnTimeAlt = 1000,22.4
    TurnTimeAlt = 2000,24.4
    TurnTimeAlt = 3000,27.2
    TurnTimeAlt = 4000,29.5
    TurnTimeAlt = 5000,32.6
    TurnTimeAlt = 6000,36.7
    TurnTimeAlt = 7000,45.0

    ////// optimal turn CAS at altitude= <float ALTITUDE>, <float CAS>
    TurnOptimal_CAS_Alt = 0,275
    TurnOptimal_CAS_Alt = 1000,275
    TurnOptimal_CAS_Alt = 2000,265
    TurnOptimal_CAS_Alt = 3000,265
    TurnOptimal_CAS_Alt = 4000,265
    TurnOptimal_CAS_Alt = 5000,265
    TurnOptimal_CAS_Alt = 6000,260
    TurnOptimal_CAS_Alt = 7000,260

    MaxClimbCAS = 280
    MaxClimbRate = 21.0
    MaxAltitude = 11500.0
    CruiseFuelRate = 1.86  //[л./мин.] 280 км/ч (MinCruiseCAS); 1000 м; 50% бака, без подвесов, стандартная атмосфера
    PriorityType = 1				//FIGHTER=1,HEAVY_FIGHTER=2,LIGHT_BOMBER=3,BOMBER=4,LIGHT_RECON=5,RECON=6,SHTURMOVIK=7,CARGO=8
[end]

[cruise]
    RefAngle               = 90.0
    RefRoll                = 85.0
    MaxRoll                = 60.0
    MaxRollClimb           = 40.0
    RefRollFactor          = 0.5
    RefAltError            = 100.0
    RefClimb               = 20.0
    RefClimbFactor         = 1.5
    RefDive                = 20.0
    RefDiveFactor          = 1.5
    TurnOffError           = -5
    TurnOnError            = -2
    MinRPM                 = 550
    MinCruiseCAS           = 260.0
    MinWingmanCAS          = 240.0
    WingLeaderLagCorrectionK = 1.0		// coeficiente de 0,0 a 1,0 (predeterminado), lo que reduce el grado de reducción de velocidad por parte del líder cuando espera a los esclavos
    PursueWingmanDist      = 300.0		// Distancia umbral hasta el lugar de la formación a partir del cual comienza a caer un límite de velocidad determinado.
    WingLeaderThrottleLowLimit = 0.25	// Limitar el mínimo de gas adelantado en descenso y frenada.
    WingLeaderThrottleUpLimit  = 0.95	// Limitar la aceleración máxima durante el ascenso y la aceleración.
    LandRoundCAS0          = 290		// Velocidad de aproximación al aeródromo, ida y vuelta, 2º y 3º giros
    LandRoundCAS1          = 280		// Velocidad en la aproximación a la 4ª curva.
    LandRoundCAS2          = 240		// Velocidad de aproximación al punto de entrada de la trayectoria de planeo
    LandingApproachCAS     = 210.0
    LandingTouchDownCAS    = 190.0
    TouchDownDistance      = 300.0	// Distancia desde el punto de inicio de la alineación hasta el final de la pista
    TouchDownPitch         = 14.0
    LandingApproachCAS_NoFuel  = 210.0
    LandingTouchDownCAS_NoFuel = 185.0
    TouchDownDistance_NoFuel   = 100.0
    TouchDownPitch_NoFuel      = 14.0
    StartTurnBeforeGlissadeDistance = 600.0
    TouchDownPitchUpSpeed  = 140.0	// la velocidad a la que, al aterrizar, comienza a tirar intensamente del mango hacia usted para frenar después de tocarlo
    TouchDownAlignHeight   = 50.0	// altura inicial de nivelación
    SmoothTouchDownHeight  = 3	// altura del inicio del "toque suave (sostener)"
    LandingThrottleLimit   = false
    BrakePitchMax          = 15.0	// Paso en el que los frenos comienzan a soltarse.
    BrakePitchMin          = 10.0	// Paso en el que ya no se aplicarán los frenos. BrakeLimMin
    BrakeLimMin            = 1.0	// multiplicador de la señal de freno de paso especificada BrakePitchMin (protección anti-adherencia)
    ApproachLowering       = false
    ApproachIgnition       = false
    LandingRoundIgnition   = false
    TouchDownCYRFactor     = 0.0
    RestrictAttackAngle    = true
    MinAttackAngle         = 14
    MaxAttackAngle         = 17
    MinNegativeAttackAngle = -8.0
    MaxNegativeAttackAngle = -12.0
    MinSlipAngle           = 15.0
    MaxSlipAngle           = 20.0
    TaxiD1                 = 2.0
    TaxiD2                 = 5.0
    TaxiD3                 = 80.0
    TaxiD4                 = 300.0
    TaxiSpeedD1            = 10.0	// la velocidad de rodaje especificada hasta la distancia D1, hasta D2 se interpola linealmente
    TaxiSpeedD2D3          = 15.0	// velocidad de rodaje especificada desde la distancia D2 a D3, a D2 interpolada linealmente
    TaxiSpeedD4            = 60.0	// velocidad de rodaje especificada desde la distancia D4
    TaxiMaxAngle           = 90.0	// ángulo de desviación de la dirección de dirección especificada en el que la velocidad especificada disminuirá a TaxiSpeedD1
    TaxiMaxAside           = 50.0	// desviación lateral de la dirección de dirección especificada, en la que la velocidad especificada disminuirá a TaxiSpeedD1
    TaxiBrakingThrottleUp  = 0.5	// cuánto acelerar al usar el freno para girar a una velocidad menor que TaxiSpeedD1
    TaxiingPitch           = false	// control del bloqueo de la rueda trasera tirando de la palanca de control hacia usted, tirando de la palanca cuando esté lejos del punto de rodaje y durante el despegue. Si está apagado, siempre funciona.
    TaxiingPIDSpeed        = 150.0	// Velocidad de cambio PID de [pid_taxiing] a [pid_0] durante el despegue, durante el aterrizaje cambio inverso a velocidad 0,75*TaxiingPIDSpeed predeterminado = TakeOffCAS+10
    Switch_2_TaxiingPIDSpeed = 140.0	// Velocidad de cambio de PID de [pid_0] a [pid_taxiing] al aterrizar. Predeterminado = LandingTouchDownCAS - 20.0
    TakeOffCAS             = 210.0	// velocidad objetivo, al alcanzar la cual el robot comienza a intentar arrancar el avión de la pista.
    TakeoffPitch           = 15.0	// Ángulo de cabeceo hasta una determinada altitud de finalización de la maniobra de despegue.
    TakeoffElevatorSafe    = true
    TakeoffSafePitch       = 0.0
    TakeoffSurfaceSlope    = false
    TakeoffCriticalSlope   = 0.0
    CriticalTakeoffRoll    = 10
    TakeoffYawFactor       = 0
    TakeOffBrakingMax      = 0.0	// valor de frenado al desviarse en el despegue a lo largo del rumbo en TakeOffBrakingAngle (hasta la velocidad de pid_taxiing)
    TakeOffBrakingAngle    = 10.0	// desviación de rumbo durante el despegue, durante el cual el frenado se realiza mediante TakeOffBrakingMax
    StallRollRate          = 160.0
    StallYawRate           = 60.0
    StructureAlert         = true
    StructureAlertNy       = 5		// límite por piloto, por avión =8
    StructureAlertTAS      = 700.0
    AttackIgnitionControl  = false
    TakeoffRefAngle        = 10.0
    MaxFlapsCAS            = 160.0
    MinFlapsCAS            = 250.0
    TakeOFFFlapsAngle      = 0.5	// 0..1 posición de flap durante el despegue
    LandingFlapsAngle      = 1.0	// 0..1 posición de flap en configuración de aterrizaje
    FlapsPosQuantity       = 0
    DifferentialBrakes     = true	// "true" si el control de freno está separado (Messer), "false" - general (LaGG)
    OpenCocpitWhileTaxi    = false	//  true - rodaje para el despegue con la cabina abierta
    NeedFilter             = true	// ¿Es necesario aplicar un filtro de control?
    MinStickMoveTime       = 0.2	// el tiempo mínimo durante el cual se lanza el mango desde la posición extrema a la posición extrema
    MaxStickMoveTime       = 0.4	// el tiempo máximo durante el cual se lanza el mango desde la posición extrema a la posición extrema
    MinStickMoveCAS        = 350.0	// velocidad a la que tiempo de transferencia m_MinStickMoveTime
    MaxStickMoveCAS        = 400.0	// velocidad a la que tiempo de transferencia m_MaxStickMoveTime
    CruiseThrottleLimit    = 1.0	// limitador de posición del acelerador en modos de vuelo de crucero, 0..1, predeterminado - 1
    taxiWindLimit          = 7.5	// Velocidad del viento (m/s) por encima de la cual el avión no puede rodar en tierra y, al aterrizar, se desvía y se detiene en la pista (predeterminado: 15,0 m/s).
[end]

[dogfight]
    [novice]
        RefNoseAngle      = 30.0
        MinCAS1           = 200.0
        MaxCAS2           = 650.0
        MaxPitchRate      = 180.0
        AttackDistance    = 500.0
        EngageDistance    = 1500.0
        MinFireDistance   = 100.0
        MaxFireDistance   = 800.0
        MinOpenFireAngle  = 13.0
        MaxOpenFireAngle  = 1.0
        MinStopFireAngle  = 26.0
        MaxStopFireAngle  = 2.0
        CollisionTimeTreshold  = 3.0
        HBTNegativeRoll        = -60.0
        HBTPositiveBTRoll      = 60.0
        InterceptAltitudeAdvance = 0.0
    [end]
    [normal]
        RefNoseAngle      = 30.0
        MinCAS1           = 200.0
        MaxCAS2           = 600.0
        MaxPitchRate      = 180.0
        AttackDistance    = 800.0
        EngageDistance    = 2000.0
        MinFireDistance   = 70.0
        MaxFireDistance   = 600.0
        MinOpenFireAngle  = 10.7
        MaxOpenFireAngle  = 3.67
        MinStopFireAngle  = 18.57
        MaxStopFireAngle  = 5.51
        CollisionTimeTreshold  = 3.0
        HBTNegativeRoll        = -70.0
        HBTPositiveBTRoll      = 70.0
        InterceptAltitudeAdvance = 0.0
    [end]
    [high]
        RefNoseAngle      = 30.0
        MinCAS1           = 200.0
        MaxCAS2           = 500.0
        MaxPitchRate      = 180.0
        AttackDistance    = 1200.0
        EngageDistance    = 2500.0
        MinFireDistance   = 50.0
        MaxFireDistance   = 500.0
        MinOpenFireAngle  = 8.5
        MaxOpenFireAngle  = 4.0
        MinStopFireAngle  = 12.7
        MaxStopFireAngle  = 5.99
        CollisionTimeTreshold  = 3.0
        HBTNegativeRoll        = -75.0
        HBTPositiveBTRoll      = 75.0
        InterceptAltitudeAdvance = 300.0
    [end]
    [ace]
        RefNoseAngle      = 30.0
        MinCAS1           = 200.0
        MaxCAS2           = 450.0
        MaxPitchRate      = 180.0
        AttackDistance    = 2000.0
        EngageDistance    = 3000.0
        MinFireDistance   = 30.0
        MaxFireDistance   = 400.0
        MinOpenFireAngle  = 5.61
        MaxOpenFireAngle  = 3.64
        MinStopFireAngle  = 6.93
        MaxStopFireAngle  = 4.47	
        CollisionTimeTreshold  = 1.5
        HBTNegativeRoll        = -80.0
        HBTPositiveBTRoll      = 80.0
        InterceptAltitudeAdvance = 1000.0
    [end]

    MinSafeAltitude0  = 50.0
    MaxSafeAltitude0  = 100.0
    MinSafeAltitude45 = 80.0
    MaxSafeAltitude45 = 250.0
    MinSafeAltitudeVP = 600.0
    MaxSafeAltitudeVP = 1200.0

    CASPitchLimit  = false
    MinPitchCAS    = 125.0
    MaxPitchCAS    = 365.0
    STVOffset      = -1.5 // -5.5
    YawAimingAngle = 7.0

    AirTargetToLeaderCriticalDistance = 10000,15000

    DiveCAS   = 700.0
    CruiseCAS = 400.0
    ClimbCAS  = 300.0

    RestrictPitchBySSA = true
    MinPitchSSA = 10.0
    MaxPitchSSA = 15.0

    GunAirAimSmooth = 0.4    // Suavizar la guía del arma en combate aéreo (necesaria en caso de accidente). [0..1], 0 - máximo, 1 - mínimo, -1 - deshabilitado
[end]

[approach]
    GroundTargetToLeaderCriticalDistance = 10000,15000
    VFAngle              = 0.0
    ApproachCAS          = 400.0
    ApproachRadius       = 600.0
    ApproachDistance     = 2500.0
    ApproachAltitude     = 600.0
    GroundAttackExitAltitude = 100.0   // altitud mínima de recuperación en picado al atacar con cohetes y cañones (establecida por encima de las copas de los árboles, y luego +40 m)
    GroundAttackDistance = 300.0
    GroundEngageDistance = 2200.0
    GroundEngageRocketK  = 1.0     // el número por el cual se multiplica m_GroundEngageDistance al atacar con cohetes
    SpiralAttackApproach = true
    DiveBombAltitude     = 2500.0  // la altitud mínima para el inicio de un bombardeo en picado, si el avión está más bajo y hay una orden de atacar, ganará esta altitud antes de bombardear
    DiveBombExitAltitude = 650.0   // altitud mínima para salir de un bombardeo en picado
    DeepDiveWeaponSet    = -1    // conjunto de cargas útiles adecuadas para bombardeo en picado vertical, -1 no utilizada, hasta 15 valores por línea
    ShallowDiveWeaponSet = 1,2   // conjunto de cargas útiles adecuadas para bombardeos en picado poco profundos, no se utiliza -1, hasta 15 valores por línea
    OwerWingDive         = true    // entrar en picado vertical, verdadero: volteando el ala, falso: alejando el mango de usted
    DiveSoftness         = 1.0     // "suavidad" al seleccionar el mango en una inmersión, un valor más alto significa que se lleva más lentamente al punto de liberación, mientras que el avión, si el número es grande, puede no ser capaz de mantener el ritmo a bajas altitudes (para un giro 0,5 )
    PushDiveEntranceDistance = 1500.0 // la distancia horizontal (m) al objetivo desde donde comienza la entrada en inmersión "con el mango alejado de usted", selecciónela de tal manera que la aeronave tenga tiempo de tomar la posición para bombardear en inmersión, cuanto menor sea la inmersión ángulo - cuanto más alto
    PushDiveEntranceK    = 1.3     // Coef. intensidad de entrada en el pico "con el mango alejado de usted", cuando aumenta - entrada más intensa, aproximadamente, (Distancia horizontal - PushDiveEntranceDistance)*PushDiveEntranceK = ángulo de inclinación requerido (para un rollover 2.0)
    ShallowDiveAngle     = 30.0    // ángulo en una inmersión plana (para un flip 42.0)
    ShallowExitAltitude  = 260.0   // altitud mínima de salida desde una inmersión poco profunda (establecida por encima de las copas de los árboles, y luego +40 m)
    ShallowDiveEnterKoef = 1.3     // el coeficiente por el cual se multiplica el alcance estimado del inicio de la inmersión, >1 - la aeronave comienza a bucear antes, < 1 - más tarde, seleccione para el individuo. características de la aeronave
    Salvo2WeaponSet    = 1       // un conjunto de cargas útiles, durante el cual se produce una salva/lanzamiento de bombas/cohetes de 2 piezas, -1 no se utiliza, hasta 15 valores por línea
    Salvo4WeaponSet    = -1      // un conjunto de cargas útiles, durante el cual se produce una salva/lanzamiento de bombas/cohetes de 4 piezas, -1 no se utiliza, hasta 15 valores por línea
    SalvoAllWeaponSet  = -1      // un conjunto de cargas útiles en las que se lanzan todas una salva de bombas/misiles a la vez, -1 no se utiliza, hasta 15 valores por línea
    GunAimSmooth         = 1.8  //  Nitidez del cañón apuntando a objetivos terrestres. En <1 es más suave, en >1 es más nítido. Predeterminado = 1,8
    AimDamperCompensationTime = 1.45 // compensación del amortiguador de guía, que intenta detener la rotación de la aeronave.
[end]

[adapt_pid_0]
    CAS     = 200.0
    Roll    = 15.0,  0.0,  1.5, 0.04
    Pitch   = 80.0,  0.0, 30.0, 0.1
    PitchVy = 50.0,  0.0, 30.0, 0.1
    Yaw     = 50.0,  0.0,  8.0, 0.05
    Speed   = 20.0, 50.0, 30.0, 0.25
[end]
[adapt_pid_1]
    CAS     = 280.0
    Roll    = 15.0,  0.0,  1.5, 0.04
    Pitch   = 35.0,  0.0,  6.0, 0.1
    PitchVy = 17.0,  0.0, 10.0, 0.1
    Yaw     = 60.0,  0.0,  7.0, 0.05
    Speed   = 20.0, 50.0, 30.0, 0.25
[end]
[adapt_pid_2]
    CAS     = 320.0
    Roll    = 12.0,  0.0,  1.2, 0.03
    Pitch   = 25.0,  0.0,  1.7,  0.05
    PitchVy = 11.0,  0.0,  4.0,  0.05
    Yaw     = 50.0,  0.0,  7.0,  0.05
    Speed   = 20.0, 50.0, 30.0,  0.25
[end]
[adapt_pid_3]
    CAS     = 500.0
    Roll    = 10.0,  0.0,  1.0, 0.02
    Pitch   = 18.0,  0.0,  1.0,  0.05
    PitchVy =  8.0,  0.0,  4.0,  0.05
    Yaw     = 40.0,  0.0,  7.0,  0.05
    Speed   = 20.0, 50.0, 30.0,  0.25
[end]
[pid_taxiing]
    Roll    = 20.0,  0.0,  0.0, 0.04
    Pitch   =  4.0,  0.0,  0.0, 0.1
    Yaw     = 15.0,  0.0,  0.0, 0.05
    Speed   = 30.0, 20.0,  2.0, 0.25
    WheelBrakes = 2.0, 0.0, 0.0
[end]

Ahí os lo dejo para estudiarlo.

Todo esto es lo que he tenido que hacer para encontrar los parámetros que fijan el patrón de aterrizaje de cada avión. Y sí, aquí está. Así que ahora toca experimentar a ver si se pueden conseguir patrones más realistas.

Como deberes para los más aplicados os propongo que reviséis si los parámetros de vuelo del G2 IA son iguales a los parámetros de vuelo que le dan al jugador. Sería lo lógico, pero no tiene necesariamente que ser así. Los parámetros de la IA se definen en este archivo, y los "volables" se definen en otro archivo (probablemente diferente y quizás más complejo).

Si alguien lo hace que me diga aquí si son iguales.

Un saludo y hasta la próxima.

  • Master 1
Enlace al comentario
Compartir en otros sitios web

  • Sire changed the title to Funcionamiento de la IA: todos los parámetros.
  • Arquitecto

El mapa va creciendo.

He añadido más iconos al mapa.
Ocupa toda la extensión del mapa de Kuban, pero eso es para toda la extensión de la campaña.

Lo lógico sería hacerla por lo menos entres fases: inicial, media y final. Así los aeródromos irían cambiando de manos conforme avanzan las líneas y los alemanes creando más aeródromos auxiliares en su retaguardia.

En la fase final tenían su fuerza aérea completamente diseminada y ningún avión estaba más de 8h en el mismo lugar debido a la frecuencia con la con los aliados machacaban sus aeródromos.

image.png

En la práctica eso resuelve con tres misiones diferentes, cargándose la que corresponda. Lo que no tengo nada claro es que la carga se pueda hacer conforme a las condiciones de victoria de un determinado escenario.

Otra opción sería sobreponer en capas las tres misiones y activar sólo la capa correspondiente. Pero para mi que el número de objetos (aunque no estén activos) de la misión puede acabar siendo brutal.

Creo que voy a empezar desde el escenario de mediados, que es lo que se ve en la imagen, y ya veremos por donde continúo.

  • Like 1
Enlace al comentario
Compartir en otros sitios web

Unirse a la conversación

Puedes publicar ahora y registrarte más tarde. Si tienes una cuenta, conecta ahora para publicar con tu cuenta.

Guest
Responder a esta discusión...

×   Pegar como texto enriquecido.   Restaurar formato

  Sólo se permiten 75 emoji.

×   Tu enlace se ha incrustado automáticamente..   Mostrar como un enlace en su lugar

×   Se ha restaurado el contenido anterior.   Limpiar editor

×   No se pueden pegar imágenes directamente. Carga o inserta imágenes desde la URL.

×
×
  • Crear nuevo...