Enemy Engaged flight model improvement

I’ve made some breakthroughs on tweaking the ini. Two of the values are an order of magnitude in either direction with some very surprising results. Other than some persistent issues with yaw rate inconsistency and ramp up that I have some ideas about dealing with longterm that you can tweak on a helo-by-helo basis in GlovePIE, the flight model of EECH is now better than anything in FSX or Flight Gear for AFCS helos with 1.16.2 when using GWUT 1.16.1 while using PPJoy & GlovePIE. While X-Plane might be best for pole cyclics, with DCS a close runner up, EECH now can hold its own nicely for joystick and pressure stick side access controller flying. If you have a pole cyclic or low-resistance joystick with a long throw, you won’t need PPJoy & GlovePIE and it will just be a lower workload compared to what you’re used to. You might want to also increase the head g-forces and vibration in the ini to 1.5 each. Personally, I like the effect.

I’m using PPJoy virtual joystick as an intermediary between my HOTAS and EECH, and assigning the virtual joystick in the sim and ini. Then I use GlovePIE running a script as a programming intermediary to roughly and ‘dummly’ (it doesn’t know the sim aircraft’s attitude) do auto trimming rate-command / attitude-hold, as well as limit the ranges of auto trimming and limit the range available for yaw, to add yaw trim, etc.


Here is my latest GlovePIE EECH script:

var.nlzrots = sign(Joystick1.zrot) //Nonlinear pedals. Can be combined with sim nonlinear setting.
var.nlzrotm = abs(Joystick1.zrot)^(1.3) //Usually 1.3 but 1 will make it linear.
var.nlzrot = var.nlzrotm * var.nlzrots

if var.nlzrot = 0 then { //Better pedal fix.
var.pedalfix = -0.999999
else
var.pedalfix = var.nlzrot // pedals
}

var.dial = smooth(deadzone(joystick2.dial, 0.008), 10)

if shift+t then begin { //Auto trim clear
var.xhold = 0
var.yhold = 0
PPJoy1.Analog0 = var.xhold + deadzone(joystick2.x, 0.075)
PPJoy1.Analog1 = var.yhold + deadzone(joystick2.y, 0.075)
PPJoy1.Analog5 = var.pedalfix / 2 - var.dial /2 //For pedals. Usually bypassed unless FM 0 or 1 with coaxials.

else

var.xhold = EnsureRange(deadzone(joystick2.x, 0.075) / 30 + var.xhold, -.4, .4) //Roll auto trimming. Over -.5/.5 causes continuous roll, but -.75/.75 is nicely responsive.
PPJoy1.Analog0 = var.xhold + deadzone(joystick2.x, 0.075) //Roll
var.yhold = EnsureRange(deadzone(joystick2.y, 0.075)/ 30 + var.yhold, -.75, .75) //Pitch auto trimming
PPJoy1.Analog1 = var.yhold + deadzone(joystick2.y, 0.075) //Pitch
PPJoy1.Analog2 = Joystick2.z //Collective that I’m currently bypassing and going direct
PPJoy1.Analog5 = var.pedalfix / 2 - var.dial /2 //For pedals. Dividers 1 or 2 for non-hokums, Higher for hokum B. Can be bypassed and assign pedals directly in sim for FM 2.
}
var.bank = PPJoy1.Analog0
var.pitch = PPJoy1.Analog1
var.collective = PPJoy1.Analog2
var.GPyaw = PPJoy1.Analog5
var.rawpedals = Joystick1.zrot
var.throttle2 = Joystick2.zrot
var.bottomwheel = Joystick2.slider
var.rawtopdial = Joystick2.dial

Lets call this Reticuli’s AFCS Mimic EECH.ini FM Tweaks for use with GWUT1.16.1:


EECH.ini edits:

[Dynamics]
flight_model=0 # 0 is the default flight model with coordinated turning that the dyn and ini setting affect. 1 is werewolf’s adjustments of this default FM which is similar to FM 0 but without some yaw aerodynamic streamlining or any auto coordinated turning, 2 - alternative pseudoreal FM (def = 2) has IAS affecting RPM slightly with rotor disengaged and RPM supposedly affects lift with rotor engaged, though RPM does not fluctuate enough with fast collective changes with rotor engaged and increasing IAS takes too long to increase RPM with rotor disengaged. Taxiing does is not safe with FM 2 due to strange yaw and roll moments possibly due to FM interaction with suspension mods. FM 2 is not affected by any dyn files or most ini lines. FM 2 adversely lowered both translational lift and ground effect, the latter of which was prior to these ini changes already too low in the sim on FM 0 and 1. FM 0 and 1 Hokum B max yaw is always too high, while FM 2’s is too low. FM 2 also reverses the EECH Translational Lift menu option such that on is off, so if using FM 2 you must set that to off to get any ETL at all. FM 2 has more realistic auto rotation. FM 0 and 1 are slightly too lite and high thrust. FM 2 is too heavy and low thrust. Hence differences in dmrl. FM 0 and 2 turn coordination mixes in yaw when banking at too low a speed still. FM 0 (optionally, obviously, you can use FM 1 with these settings if you don’t want turn coordination or yaw streamlining, but it’s a mystery how FM 2 is affected by these settings if at all other than dmrl and dyad) with Reticuli’s 1-5-2021 ini values in combination with PPJoy and GlovePIE causes EECH to most closely mimic a FBW helicopter like especially the Comanche and also somewhat like the Zulu Viper, Apache D, or Hokum similar to the work Penn State’s rotorcraft research lab and the Army ADOCs program have done.
enginerealism=1 # realistic engine workload simulation model (0 = off, 1 = on) (def = 1)
enginestartup=0 # manual engine start up, off by default (0 = off, 1 = on) (def = 0)
drbs=1.0 # retreating blade stall, floating point scaling factor for RBS effect (default = 1.0). Most helos should have this happening sooner and benefit from 1.1 or even 1.2, but some like the Zulu Viper are the reverse, so might as well just leave it at the default.
drv=1.0 # rudder value, scaling factor for drag on tail rotation (Default = 1.0.) Undesirable parameter to be adjusting since this must work as the tail drag, max Hokum B yaw rate, and as an inappropriate yaw damper that should be separate from drag. Very high like 30 is possible with very low fractional dra below. Even higher drv produces counter effects when banking opposite during yaw.
dra=1.0 # rudder acceleration, scaling factor for tail rotation acceleration (default = 0.8). Undesirable value to be adjusting, as maximum yaw rate would be more useful. If set low enough and the tail drag high enough, non-Hokums will not continually ramp up yaw rate, but then the Hokum with such a high tail drag gets further insane max yaw rates.
drd=0.1 # main rotor drag, scaling factor for drag caused by main rotor (default = 1.0). It’s uncertain if this affects parallel aerodynamic streamlining drag of the rotor disc, but it is definitely perpendicular drag that affects angular rotational rates for a given X and Y input and at higher settings causes the helicopter to bleed speed with X and Y axis maneuvering. Ground effect may noticeably increase at 0.1 over higher values, and since ground effect, aerodynamic streamlining, and aerobatic capabilities are problematic in EECH, this value at 0.1 seems essential. Joystick sensitivity on your end may need adjustment to compensate for this increased pitch and roll authority.
dmrl=0.9 # main rotor lift, scaling factor for lift of main rotor (default = 1.0). With FM 0 or 1, dmrl of 0.9 is most accurate. With FM 2, dmrl of 1.1 is most accurate.
dtrd=10.0 # tail rotor drag, scaling factor for drag caused by tail in forward flight (default = 1.0). It is difficult to say exactly how this is affecting flight, but lower than 10.0 seems to have an adverse effect on aerobatics, and at 10.0 something magical seemed to happen both with aerobatics and in just the normal flight envelope maneuvering NOE with collective and banking flying between buildings seat-of-the-pants. The ability to do a proper forward speed landing on a runway and taxi in FM 0 with all the above (whatever your chosen yaw setting and other mitigation methods) made it apparent something had snapped into place with these non-yaw ini values.
dyal=2.5 # yaw altitude loss (default = 5.0). This is the only yaw ini value I have some confidence about. If you have crosscoupling off, you might want a value of 5.0. This is perhaps excessive for AFCS aircraft and with crosscoupling 2.5 feels better and is less prone to crashing with large pedal inputs while still having a noticeable affect. YMMV.
dyad=3.0 # global air density modifier (0.5 - increase dynamics ceiling, 2.0 - decrease) (default = 1.0) A value of about 3.0 appears required with FM 0 to get an Apache D up to just over 20,000ft but not much higher at 100kts for a realistic ceiling.


Optionally I’m also using the following nonlinear collective settings, but I’m sure that’s very dependent on your individual throttle model:

nonlinear-collective-zone1=0.4 # non-linear control value for throttle (n = % throttle position joystick to represents 60% collective) (10% = 0.1) (0.0 = off (linear control), 1.0 = max) (def = 0.3)

nonlinear-collective-zone2=1.0 # non-linear control value for throttle (n = % throttle position joystick to represents 100% collective) (10% = 0.1) (0.0 = off (linear control), 1.2 = max) (def = 0.7)

nonlinear-collective-percentage-at-zone1=50.0 # collective percentage at zone1. Valid values are in range from 1.0 to 99.0, default is 60.0.

What I think drd at 0.1 might be doing at low altitude is causing the rotor disc to deviate upward away from the ground effect, which, while more likely to occur with lighter helicopters in real life, is a wonderful effect to be having in EECH at all, and is evidence, I believe, of that parameter being responsible to some degree for an aerodynamic streamlining effect of the main rotor disc. It also is a larger effect with the turbulence of landing gear.

New GlovePIE script with yaw range knob. I’m still working on a pumping yaw script that does more pumping during hovering and less when laterally moving, but it’s proving to be slightly more buggy than I expected even though it mostly seems to work.

var.yawrange = (smooth(deadzone(joystick2.slider, 0.008), 10) + 2 ) ^ 2 // Bottom throttle thumb rotary assigned as a yaw range.
var.nlzrots = sign(Joystick1.zrot) //Nonlinear pedals.
var.nlzrotm = abs(Joystick1.zrot)^(1.3) //Usually 1.3 but 1 will make it linear.
var.nlzrot = var.nlzrotm * var.nlzrots
if var.nlzrot = 0 then { //Better pedal fix.
var.pedalfix = -0.999999
else
var.pedalfix = var.nlzrot // pedals
}
var.dial = smooth(deadzone(joystick2.dial, 0.008), 10)
if shift+t then begin { //Auto trim clear
var.xhold = 0
var.yhold = 0
PPJoy1.Analog0 = var.xhold + deadzone(joystick2.x, 0.075)
PPJoy1.Analog1 = var.yhold + deadzone(joystick2.y, 0.075)
PPJoy1.Analog5 = (var.pedalfix / 1 - var.dial / 2 ) / var.yawrange //For pedals. Usually bypassed unless FM 0 or 1 with coaxials.
else
var.xhold = EnsureRange(deadzone(joystick2.x, 0.075) / 30 + var.xhold, -.4, .4) //Roll auto trimming. Over -.5/.5 causes continuous roll, but -.75/.75 is nicely responsive.
PPJoy1.Analog0 = var.xhold + deadzone(joystick2.x, 0.075) //Roll
var.yhold = EnsureRange(deadzone(joystick2.y, 0.075)/ 30 + var.yhold, -.75, .75) //Pitch auto trimming
PPJoy1.Analog1 = var.yhold + deadzone(joystick2.y, 0.075) //Pitch
PPJoy1.Analog2 = Joystick2.z //Collective that I’m currently bypassing and going direct
PPJoy1.Analog5 = (var.pedalfix / 1 - var.dial / 2 ) / var.yawrange //For pedals. Usually bypassed unless FM 0 or 1 with coaxials. Now with yawrange on thumb dial.
}
var.bank = PPJoy1.Analog0
var.pitch = PPJoy1.Analog1
var.collective = PPJoy1.Analog2
var.GPyaw = PPJoy1.Analog5
var.rawpedals = Joystick1.zrot
var.throttle2 = Joystick2.zrot
var.bottomwheel = Joystick2.slider
var.rawtopdial = Joystick2.dial

I’ve been testing GWUT 1.16.2 with EECH v1.16.2 and so far have not noticed much difference in the FMs over GWUT 1.16.1. May be fine to use the newer GWUT after all.

More organized recommended to-do list posted at-request

FM Stuff:

  1. Make my ini Dynamics tweaks the default… including the comments, like dmrl at 0.9 for FM0/1 and 1.1 for FM2. Obviously when some of the below stuff is done, some of the explanatory text will go.

  2. Fix Translational Lift option when FM2 is in use. Currently, on is off and off is on. Some people may choose to use FM2 with its bizarrely-weak Ground effect and Translational Lift even when it’s properly on, so might as well get that option setting working correctly. It’s also possible that in the long run this model might have more potential, such as with more stable yaw pedal performance, but only time will tell.

  3. Muted yaw on coaxials in FM2 needs fixing next. Makes them and much of FM 2 basically unusable right now.

  4. Fix rotor clutch/brake disengaging when you jump into an aircraft with it already on. Falling out of the sky abruptly could be categorized as a FM problem.

  5. Vibration from extreme cyclic and also on extreme coaxial yaw changes, so like from -1 to 1 of the roll axis in a split second would apply most vibration, and that same amount slower or a less amount just as fast would be less vibration induced briefly. Have it IAS-compensated, too, like the current banking angle vibration is, which is a good thing, by the way. Coning effects from just holding a bank causes some vibration, so don’t get rid of that.

  6. Main rotor damage from the more extreme #5 for longer lengths of time. Less length of time means less chance of damage. More extreme handling requires less time to cause damage. First instance causes some damage and main rotor oscillations, continued extreme handling after a few seconds of oscillations or another instance causes loss of main rotor. The damage and vibration threshold could lower when you are already damaged. Obviously the vibration and noise will be a warning this might occur before the first instance occurs.

  7. Try to put RPM effects from FM2 into FM0/1, or at least make similar RPM response effects in FM0/1. The RPM effects in general need be greater even in FM2, so more sluggish RPM response and opposite effect even with very large and fast collective changes. Excessive RPM and eventually damage with rotor disengaged is already occurring with FM2. Rotor engaged effects are too slight right now, though. In general, RPM and lift needs to also increase sooner when you lower collective and nose down with rotor disengaged. During auto rotation you manage RPM that way immediately, while currently there’s a lag for the first few seconds and you require a ridiculous amount of IAS and altitude loss to get the RPM to start increasing.

  8. Add an axis in-sim for yaw scaling for people that don’t want to use PPJoy/GlovePIE. All the way to one end and you get normal full yaw available on the yaw axis, other end of axis and you get some fraction. Probably bringing the axis that’s been smoothed and added 2 then to the power of 1 is sufficient rather than a power of 2, which gives you a divider of 1 at minimum (the original axis), around 2 on the center of the axis, and a divider of 3 at max attenuation. A power of 2 for 1 of the axis itself plus 2 at max gives a divider of 9, which is excessive unless you’re doing crazy stuff with the ini yaw drag and acceleration Dynamics.

  9. Yaw is too fast and ramping up on coaxials on FM0/1. The most extreme yaw rates in a hover are related to an acceleration or ramp up and increases dramatically after extended continuous pedal. It appears worse with higher altitude or collective. While yaw drag should not be mimicking yaw damping and yaw acceleration is really the wrong value to be adjusting, I don’t know how much of max yaw is dictated by the GWUT. A separate yaw damper parameter may be necessary.

  10. In FM 0 and 2, auto coordinated turning mixes in too much yaw at low an IAS. Turn coordination needs to not occur until into translational lift, and then only more slightly at low speed and to keep FPM centered during bank at higher speeds. Right now on FM 0 and 2 it seems almost completely proportional to banking regardless of IAS, making side slipping in a hover impossible without counter yaw, which is difficult to do predictably. Of course FM 1 doesn’t have a lack of ease of side slipping when in a hover…

  11. FM 1 should really just be FM 0 without coordinated turns. The yaw streamlining when in forward flight is too weak right now to be remotely realistic in FM 1, though its current lack of coordinated turning is slightly useful considering the current ways it mixes in too soon in FM 0 and 2. Hypothetically, FM 1 could simply be removed completely if Auto Turn Coordination became an in-sim options setting like Translational Lift and Ground Effect are… assuming #10 can be done. In contrast, the only reason ETL, GE, and RBS are in-sim settings were so people could turn them off and see how deep the EECH flight model was. It is not easier to fly without ETL and GE, as should be glaringly obvious to anyone trying the current FM 2 with Translational Lift set to “ON” (actually off).

  12. Zulu Cobra needs its max IAS and RBS threshold raised. Most other helos need it slightly lowered, but for the meantime I’d probably leave the others where they are.

  13. Taxi yawing in FM 2 is not working right, as there seems to be weird force moments occurring, possibly related to the suspension mod interacting with the ‘alternative’ FM coding mod.

  14. Ensure wind is part of IAS calculations when there is a headwind or tailwind. Not sure if it is.

  15. G-forces head movement is too slow to move, especially on returning back to center.

  16. Later on we can figure out a way to add my GlovePIE scripts into EECH so people have to do less setup. I will work on having three control modes where you double tap the trimmer button to change to each with a voice telling you the mode. First will be the current default pitch and roll wings level mode with manual trimmer. Second mode will be same as first but with auto trimming of pitch. Third will be full dynamic auto trim like the above posted scripts.

  17. As for FM stuff off the top of my head, the final step before a complete rewrite of the FM code of EECH would be simply to find a way to stop the continuous roll that occurs past a certain roll angle. That way you could roll inverted, stop applying X axis, and it will stay. Right now, past about 0.40/-0.40 on X, you get this continuous roll. So when you are finally inverted, you have to deflect a bit back in the opposite direction to hold the attitude rather than just release stick pressure. This appears to be part of this artificial wings leveling it’s doing.

Non-FM stuff:

  1. I would like a view mode that keeps the FPM in the center of the view as you maneuver.

  2. Calling in artillery doesn’t seem to be working. Not sure if that’s actually a bug or just a misperception on my part.

  3. AI helos landing on top of helos.

  4. Carriers don’t seem to be protected by CAPs or the rest of their group ships very well.

  5. The game’s low-level foot of its contrast curve or gamma seems off, like you’d need a pro-quality CRT or an OLED to see any detail in shadows. I don’t mean just at night, which by the way I turn down to 0.3 darkness usually in the ini to make the NVG necessary. The gamma just seems oddly skewed. I can sort of adjust for this with my monitor or with NVidia settings, but it might be worth checking out.

  6. The ability to change the amount of dust or have the dust change depending on environment. Deserts should have the most, obviously, and are fine where they are, but most other environments have too much dustout effect. Maybe use the same flag as clouds not being in deserts to have them get the full dust out and everywhere else get 50% of that amount.

  7. Add jettison stores. Ctrl + J. Useful for increasing lift after engine failure.

  8. Previous/next target both cycling in the same direction bug is also present in 1.16.1, so might be quite old.

You must use FM 2 to have crosscoupling OFF. FM 0 & 1 have an issue with yaw and lift in forward flight with CC OFF under the sim’s Options Menu in Dynamics. I always have it on and use FM 0 now with the above tweaks, but if you use FM 2 obviously coaxials are problematic with their weak yaw in a hover right now. So if you want to do all the pedal mixing yourself with your feet old-school, then use FM 2 and don’t plan on flying coaxials expecting much yaw rate.

Crosscoupling ON or flying a coaxial:

flight_model=0
drv=1.0
dra=1.0
drd=0.1
dmrl=0.9
dtrd=10.0
dyal=2.5
dyad=3.0

Plus Translational Lift Options-Dynamics setting to ON


NOT flying a coaxial and you have crosscoupling OFF:

flight_model=2
drv=1.0
dra=1.0
drd=0.1
dmrl=1.1
dtrd=10.0
dyal=5.0
dyad=3.0

Plus Translational Lift Options-Dynamics setting to OFF


And here is an example of collective ‘nonlinearity’ settings (it’s not really nonlinear, just changing the min and max):

nonlinear-collective-zone1=0.4 # Use a value like this to offset zone1 bottom percentage
nonlinear-collective-zone2=0.9 # Depends on the throttle you’re using to get 120% at just exactly full rearward
nonlinear-collective-percentage-at-zone1=54.0 # 6% minimum torque. 50.0 gives more realistic reduced deceleration but shows 10% instead of the real-life 6% minimum.

[your collective axis] * 0.7 - 0.15.

I’ve been trying to mitigate lately both EECH’s excessive tendency to decelerate rapidly and more importantly the crazy amount of overtorque power we can get. The diminishing return of very high engine torque is not properly being modeled, and therefore we can not only slow down too fast or VRS too easily, but then are able to just power out of VRS. Adding this math to the collective axis is one way of dealing with both on the Saitek throttle with EECH’s internal collective option set to linear. This returns the minimum collective torque with engine spooled up completely at about 10%, first rearward detent at 90% with no cyclic or trim applied, and 97% fully rearward with no cyclic or trim applied. Applying cyclic or trim will obviously add slight overtorque. With this, I cannot decelerate too rapidly and I cannot simply power through a VRS by yanking to 120% torque. With VRS, I must really try to get lateral movement.

Turning the yaw nonlinearity up in this GlovePIE script and turning it off in the sim is helping tremendously, including changing the yaw trim dial knob on the throttle to a smaller range. The collective to linear in the sim and limited in this script to 10ish% to 100ish% is still working well.

var.nlzs = sign(Joystick2.z) // Collective nonlinearity that can be made more gradual near center.
var.nlzm = abs(Joystick2.z)^(1.0) // Previous Exponent of 2.0 for true nonlinear with large gradation in the middle, but 1.0 is linear.
var.nlz = var.nlzm * var.nlzs

var.yawrange = (smooth(deadzone(joystick2.slider, 0.008), 10) + 2 ) ^ 1 // Bottom throttle thumb rotary assigned as a yaw range.

var.nlzrots = sign(Joystick1.zrot) //Nonlinear pedals.
var.nlzrotm = abs(Joystick1.zrot)^(2.0) //1 will make it linear. Higher, less linear.
var.nlzrot = var.nlzrotm * var.nlzrots

if var.nlzrot = 0 then { //Better pedal fix.
var.pedalfix = -0.999999
else
var.pedalfix = var.nlzrot // pedals
}

var.dial = smooth(deadzone(joystick2.dial, 0.008), 10) //yaw trim

if shift+t then begin { //Auto trim clear
var.xhold = 0
var.yhold = 0
PPJoy1.Analog0 = var.xhold + deadzone(joystick2.x, 0.075)
PPJoy1.Analog1 = var.yhold + deadzone(joystick2.y, 0.075)
PPJoy1.Analog5 = (var.pedalfix / 1 - var.dial / 20 ) / var.yawrange //For pedals. Usually bypassed unless FM 0 or 1 with coaxials.

else

var.xhold = EnsureRange(deadzone(joystick2.x, 0.075) / 30 + var.xhold, -.4, .4) //Roll auto trimming. Over -.5/.5 causes continuous roll, but -.75/.75 is nicely responsive.
PPJoy1.Analog0 = var.xhold + deadzone(joystick2.x, 0.075) //Roll
var.yhold = EnsureRange(deadzone(joystick2.y, 0.075)/ 30 + var.yhold, -.75, .75) //Pitch auto trimming
PPJoy1.Analog1 = var.yhold + deadzone(joystick2.y, 0.075) //Pitch
PPJoy1.Analog2 = var.nlz * 0.7 - 0.15 //Collective currently reducing/adjusting range to prevent overpowering VRS and to reduce decel
PPJoy1.Analog5 = (var.pedalfix / 1 - var.dial / 20 ) / var.yawrange //For pedals. Usually bypassed unless FM 0 or 1 with coaxials. Now with yawrange on thumb dial.

}

var.bank = PPJoy1.Analog0
var.pitch = PPJoy1.Analog1
var.rawcollective = Joystick2.z
var.GPcollective = PPJoy1.Analog2
var.rawpedals = Joystick1.zrot
var.GPyaw = PPJoy1.Analog5
var.throttle2 = Joystick2.zrot
var.bottomwheel = Joystick2.slider
var.rawtopdial = Joystick2.dial

//These buttons below are not used in EECH, but do not appear harmful. For other sims.

PPJoy1.Digital0 = Joystick2.Button1
PPJoy1.Digital1 = Joystick2.Button2
PPJoy1.Digital2 = Joystick2.Button3
PPJoy1.Digital3 = Joystick2.Button4
PPJoy1.Digital4 = Joystick2.Button5
PPJoy1.Digital5 = Joystick2.Button6
PPJoy1.Digital6 = Joystick2.Button7
PPJoy1.Digital7 = Joystick2.Button8
PPJoy1.Digital8 = Joystick2.Button9
PPJoy1.Digital9 = Joystick2.Button10
PPJoy1.Digital10 = Joystick2.Button11
PPJoy1.Digital11 = Joystick2.Button12
PPJoy1.Digital12 = Joystick2.Button13
PPJoy1.Digital13 = Joystick2.Button14
PPJoy1.Digital14 = Joystick2.Button15
PPJoy1.Digital15 = Joystick2.Button16
PPJoy1.Digital16 = Joystick2.Button17
PPJoy1.Digital17 = Joystick2.Button18
PPJoy1.Digital18 = Joystick2.Button19
PPJoy1.Digital19 = Joystick2.Button20
PPJoy1.Digital20 = Joystick2.Button21
PPJoy1.Digital21 = Joystick2.Button22
PPJoy1.Digital22 = Joystick2.Button23
PPJoy1.Digital23 = Joystick2.Button24
PPJoy1.Digital24 = Joystick2.Button25
PPJoy1.Digital25 = Joystick2.Button26
PPJoy1.Digital26 = Joystick2.Button27
PPJoy1.Digital27 = Joystick2.Button28
PPJoy1.Digital28 = Joystick2.Button29
PPJoy1.Digital29 = Joystick2.Button30
PPJoy1.Digital30 = Joystick2.Button31

$0.59 right now