Oddworld: Abe's Exoddus

Oddworld: Abe's Exoddus

Not enough ratings
Getting the game running with with a DS4 on modern systems.
By KBD20
The first part of this guide will go through how I got a working setup for the window/graphics without altering your screens resolutions.

The second part will go through how to get proper PSX like controls (at least for gameplay) using DS4windows for the DS4, and will cover possible alternatives for other controller types and if you don't want to use DS4windows.
   
Award
Favorite
Favorited
Unfavorite
Setting the game window up for modern systems
At the time of writing (2020/03/10), Abe's Exoddus works fine on my syste (windows 10) after I used a program called DXGL [dxgl.org](I believe it does something like port directx windows to an open gl renderer).

Something to keep in mind is I am not using the latest version (I'm on 0.5.15r855 - latest is 0.5.17r950). It should still work the same though.

This is the main DXGL window you get when you first start:




The first thing you will need to do is add Exoddus.exe from your steam folder for Abes Exoddus
Browse to that and all is left is the configs.

The most important thing to configure is the window mode:
I use Non-exclusive fullscreen, but any other option that is not global defaults is fine, the rest are user preference.

The other setting that I don't think affects how compatible the game is, but still needed to set your preferred screen size etc is the window mode:
I use Aspect corrected stretch for the original 5:4 windowing, you can use just stretch if you prefer 16:9 - feel free to experiment with the rest.


An alternative method (mentioned by Senzorei) is to use your graphics card drivers to set an appropriate visual mode, here [www.nvidia.com]for nvidia and here[www.amd.com] for amd. Set this to aspect ratio to keep the original ratio at full screen.
Unlike the previous method, I believe this will keep the game in exclusive full screen, so alt-tabbing likely wont work as well.


If you only want to play the game with the keyboard, then this is as far as you need to read - If you want to play with a controller with a PSX like layout, read on.
Getting PSX-like controls working
Most of this section will cover how to set this game up for use for a DS4 on DS4windows - however since the program used to only have xinput mode I will note how I set it up for that so you can use those settings in steam config or an alternative xbox control editor.

Since there are 2 branches of DS4windows, I will specify that Ryochan 7's DS4windows[github.com] is the one I use (it has the features needed for this part of the guide), and the other fork is no longer maintained.

Once downloaded, extract wherever you prefer, and I recommend setting the program to always start in administrator mode, the downside is you will have to manually start it on boot every time, but it's more reliable for me that way.

Further down the guide I will paste the contents of the .xml for you to import, you can just skip to that section if you prefer, but the rest of this section will be for manual setup, with notes for xinput/xbox pad users.

Otherwise the first thing you need to do is create a new profile:

Once you've clicked that you will be in a new profile window, which for now ignore, and go in to the "Other" tab:
Change "Controller" to "Dualshock 4" mode, otherwise controls will be muddled.

Then go back to the main page:
If you click a button on the DS4 GUI you will get this:
And for secondary controls, or shift modifiers you will get this, and a dropdown menu:

I use finger over touchpad for any shift modifiers in this guide - for example I set square to square with no modifier, and set square with a finger on the touchpad to F6, since that's whats used to load a quicksave on the PC version, mimicking square being load quicksave on the PSX version.


Now, here are the controls I used:
The face buttons and all 4 shoulder buttons I just had match their actual function. (note for xinput users - rotate the buttons clockwise by one, B set to A, A to X etc, and set LT and RT to clicking in the respective sticks instead.)

For the dpad I set them to the respective analogue sticks (digital doesnt work for some reason) - I also left the left stick intact as the PSX ver can use both. No change for xinput.

For clicking the touchpad I set it to the keyboard button, you can also use options if you prefer: escape. (Xinput users do the same for start, leave back for other functions).

The rest are Shift modifiers using finger on touchpad,
for X/Cross I set it to the keyboard letter x, just in case for main menu config.
Square I set to F6 to load quicksave,
Circle I set to delete for deleting saves.

If Steam or another xinput editing app has a similar feature, use back as the shift modifier for A, X and B.

Once the profile is created, you will need to create an autoprofile for abes exoddus:
Select browse and select Exoddus.exe
Then for controller 1 use the dropdown menu to select your Oddworld profile, and tick the checkbox then you're done.


Once ingame you may need to use the keyboard for initial setup:
Run is R1,
Sneak is R2
Jump is Triangle
Action is Square
Throw is Circle
Fart is X/Cross
Speak1 is L1
Speak2 is L2

Note: unlike consoles, where any 2 shoulder buttons are chant, on PC it is only speeak1 + speak2 (so L1/L2).
Quick setup
If you don't want to manually setup the DS4windows profile or set the ingame control settings then use this in place of part 2, you will still need to download DS4windows that I linked earlier however.

First copy the following code into a blank text document and save it as "Oddworld.xml" or whatever else .xml.

<?xml version="1.0" encoding="utf-8"?> <!-- DS4Windows Configuration Data. 03/09/2020 19:12:15 --> <!-- Made with DS4Windows version 2.0.11 --> <DS4Windows> <flushHIDQueue>True</flushHIDQueue> <touchToggle>False</touchToggle> <idleDisconnectTimeout>0</idleDisconnectTimeout> <Color>10,3,13</Color> <RumbleBoost>100</RumbleBoost> <RumbleAutostopTime>0</RumbleAutostopTime> <LightbarMode>DS4Win</LightbarMode> <ledAsBatteryIndicator>False</ledAsBatteryIndicator> <FlashType>0</FlashType> <flashBatteryAt>10</flashBatteryAt> <touchSensitivity>100</touchSensitivity> <LowColor>255,255,255</LowColor> <ChargingColor>255,255,255</ChargingColor> <FlashColor>0,0,0</FlashColor> <touchpadJitterCompensation>True</touchpadJitterCompensation> <lowerRCOn>False</lowerRCOn> <tapSensitivity>100</tapSensitivity> <doubleTap>True</doubleTap> <scrollSensitivity>5</scrollSensitivity> <LeftTriggerMiddle>0</LeftTriggerMiddle> <RightTriggerMiddle>0</RightTriggerMiddle> <TouchpadInvert>0</TouchpadInvert> <L2AntiDeadZone>0</L2AntiDeadZone> <R2AntiDeadZone>0</R2AntiDeadZone> <L2MaxZone>100</L2MaxZone> <R2MaxZone>100</R2MaxZone> <L2MaxOutput>100</L2MaxOutput> <R2MaxOutput>100</R2MaxOutput> <ButtonMouseSensitivity>25</ButtonMouseSensitivity> <Rainbow>0</Rainbow> <MaxSatRainbow>100</MaxSatRainbow> <LSDeadZone>0</LSDeadZone> <RSDeadZone>0</RSDeadZone> <LSAntiDeadZone>0</LSAntiDeadZone> <RSAntiDeadZone>0</RSAntiDeadZone> <LSMaxZone>100</LSMaxZone> <RSMaxZone>100</RSMaxZone> <LSMaxOutput>100</LSMaxOutput> <RSMaxOutput>100</RSMaxOutput> <LSRotation>0</LSRotation> <RSRotation>0</RSRotation> <SXDeadZone>0.25</SXDeadZone> <SZDeadZone>0.25</SZDeadZone> <SXMaxZone>100</SXMaxZone> <SZMaxZone>100</SZMaxZone> <SXAntiDeadZone>0</SXAntiDeadZone> <SZAntiDeadZone>0</SZAntiDeadZone> <Sensitivity>1|1|1|1|1|1</Sensitivity> <ChargingType>0</ChargingType> <MouseAcceleration>True</MouseAcceleration> <LaunchProgram> </LaunchProgram> <DinputOnly>False</DinputOnly> <StartTouchpadOff>False</StartTouchpadOff> <UseTPforControls>True</UseTPforControls> <UseSAforMouse>False</UseSAforMouse> <SATriggers>-1</SATriggers> <SATriggerCond>and</SATriggerCond> <SASteeringWheelEmulationAxis>None</SASteeringWheelEmulationAxis> <SASteeringWheelEmulationRange>360</SASteeringWheelEmulationRange> <TouchDisInvTriggers>-1</TouchDisInvTriggers> <GyroSensitivity>100</GyroSensitivity> <GyroSensVerticalScale>100</GyroSensVerticalScale> <GyroInvert>0</GyroInvert> <GyroTriggerTurns>True</GyroTriggerTurns> <GyroSmoothingWeight>50</GyroSmoothingWeight> <GyroSmoothing>False</GyroSmoothing> <GyroMouseHAxis>0</GyroMouseHAxis> <GyroMouseDeadZone>10</GyroMouseDeadZone> <GyroMouseToggle>False</GyroMouseToggle> <GyroOutputMode>Controls</GyroOutputMode> <GyroMouseStickTriggers>-1</GyroMouseStickTriggers> <GyroMouseStickTriggerCond>and</GyroMouseStickTriggerCond> <GyroMouseStickTriggerTurns>True</GyroMouseStickTriggerTurns> <GyroMouseStickHAxis>0</GyroMouseStickHAxis> <GyroMouseStickDeadZone>30</GyroMouseStickDeadZone> <GyroMouseStickMaxZone>830</GyroMouseStickMaxZone> <GyroMouseStickAntiDeadX>0.4</GyroMouseStickAntiDeadX> <GyroMouseStickAntiDeadY>0.4</GyroMouseStickAntiDeadY> <GyroMouseStickInvert>0</GyroMouseStickInvert> <GyroMouseStickToggle>False</GyroMouseStickToggle> <GyroMouseStickVerticalScale>100</GyroMouseStickVerticalScale> <GyroMouseStickSmoothing>False</GyroMouseStickSmoothing> <GyroMouseStickSmoothingWeight>50</GyroMouseStickSmoothingWeight> <LSCurve>0</LSCurve> <RSCurve>0</RSCurve> <ProfileActions>Disconnect Controller</ProfileActions> <BTPollRate>4</BTPollRate> <LSOutputCurveMode>linear</LSOutputCurveMode> <LSOutputCurveCustom> </LSOutputCurveCustom> <RSOutputCurveMode>linear</RSOutputCurveMode> <RSOutputCurveCustom> </RSOutputCurveCustom> <LSSquareStick>False</LSSquareStick> <RSSquareStick>False</RSSquareStick> <SquareStickRoundness>5</SquareStickRoundness> <SquareRStickRoundness>5</SquareRStickRoundness> <L2OutputCurveMode>linear</L2OutputCurveMode> <L2OutputCurveCustom> </L2OutputCurveCustom> <R2OutputCurveMode>linear</R2OutputCurveMode> <R2OutputCurveCustom> </R2OutputCurveCustom> <SXOutputCurveMode>linear</SXOutputCurveMode> <SXOutputCurveCustom> </SXOutputCurveCustom> <SZOutputCurveMode>linear</SZOutputCurveMode> <SZOutputCurveCustom> </SZOutputCurveCustom> <TrackballMode>False</TrackballMode> <TrackballFriction>10</TrackballFriction> <OutputContDevice>DS4</OutputContDevice> <Control> <Button> <DpadUp>Left Y-Axis-</DpadUp> <DpadRight>Left X-Axis+</DpadRight> <DpadDown>Left Y-Axis+</DpadDown> <DpadLeft>Left X-Axis-</DpadLeft> <TouchUpper>Unbound</TouchUpper> <SwipeLeft>Unbound</SwipeLeft> <SwipeRight>Unbound</SwipeRight> <SwipeDown>Unbound</SwipeDown> </Button> <Macro> <SwipeUp>8/800/8/310/160/310/75/75/310/66/66/310/68/68/310/160/310/189/189/310/160/310/77/77/310/160/310/65/65/310/73/73/310/78/78/310/13/13</SwipeUp> </Macro> <Key> <TouchLeft>27</TouchLeft> <TouchMulti>27</TouchMulti> <TouchRight>27</TouchRight> </Key> <KeyType> <SwipeUp>Macro</SwipeUp> </KeyType> </Control> <ShiftControl> <Macro> <LXPos Trigger="26">160/37/37/39/39/38/38/40/40/37/37/39/39/160</LXPos> <LYNeg Trigger="26">160/310/40/40/310/39/39/310/37/37/310/39/39/310/37/37/310/39/39/310/37/37/310/38/38/310/160</LYNeg> <LYPos Trigger="26">160/38/38/37/37/39/39/37/37/39/39/37/37/39/39/40/40/160</LYPos> <Triangle Trigger="26">264/325/264</Triangle> </Macro> <Key> <Square Trigger="26">117</Square> <Circle Trigger="26">46</Circle> <Cross Trigger="26">88</Cross> </Key> <KeyType> <Triangle>HoldMacroMacro</Triangle> </KeyType> </ShiftControl> </DS4Windows>


Once saved import the profile in DS4windows

Then browse to the xml you created and add it, refer to the last section for setting it to an autoprofile.


Next browse to your abes exoddus directory and paste the following in abe2.ini over the [Game Pad] section.

[Game Pad] buttons = 10 run = B6 sneak = B0 jump = B4 action = B3 throw = B2 fart = B1 speak1 = B5 speak2 = B9

Then when you start the game you should have PSX like controls on DS4.
Closing
Hopefully this guide helps with everything.
The majority of this guide applies to Oddysee as well;

The only difference is to set L1 to be R2 and L2 to be R1 in DS4Windows, because Run and Speak 2 are hardwired to be the same button, as is Sneak and Speak 1.
For Xinput it will be LB to RS and RT to RB in Steam config or any other program that modifies the controller.
5 Comments
Füchschen-San Dec 22, 2022 @ 10:24am 
R.E.L.I.V.E. Engine works great for controller support too :eaglederp:
ingi Mar 12, 2022 @ 2:44am 
Thanks, its Now Mutch Better XD:steamthumbsup:
KBD20  [author] Dec 18, 2020 @ 5:04pm 
Thanks for the info, I'm just more used to dxgl, and for some it can help with controller compatibility (for some reason).

I'll add what you suggested to the guide.
Senzorei Dec 18, 2020 @ 8:36am 
No need to use any fancy schmancy programs for the graphics part, if you set up your display or graphics card to scale via aspect ratio instead of filling the entire screen, then you retain the correct proportions. For displays it's usually through the OSD (some displays don't have aspect ratio scaling though, in which case) or you can use scaling on your graphics card and set the mode to aspect ratio. {LINK REMOVED} {LINK REMOVED}. As for the controller part, you need a wrapper for XInput devices to DirectInput (like the aforementioned program in the guide), or you could use something like JoyToKey to map button inputs and combinations to keys on the keyboard (which would allow you to replicate the PS1 mappings and even change the combinations for various gamespeak options).
Retrograde Sep 29, 2020 @ 4:20pm 
Thank you for doing this, I've never gotten it to work.