bsnes v0.041 released

Archived bsnes development news, feature requests and bug reports. Forum is now located at http://board.byuu.org/
Locked
FitzRoy
Veteran
Posts: 861
Joined: Wed Aug 04, 2004 5:43 pm
Location: Sloop

Post by FitzRoy »

Well then google and wikipedia hath failed me.
byuu

Post by byuu »

I've tried absolutely everything. I cannot properly map analog buttons with DirectInput. I've tried every possible function here:
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

None work.

The goddamn controller starts with the analog buttons reporting 0,0. The ONLY way for the driver to wake the fuck up and report the proper values is for a button on the gamepad to be pressed. And god forbid you should be allowed to fake a gamepad button press. Noooo ... why implement that?

Literally nothing else does it. Not Acquire(), not Initialize(), not Poll(), not pre-filled GetDeviceState(), not SetProperty : DIPROPCALIBRATIONMODE_RAW, not SetProperty : DIPROPAUTOCENTER_OFF, nothing.

Nothing tells you that it's an analog button and not an axis. Granulaurity is the same, saturation is the same, range is the same, dwType is the same, it's all identical.

The best I can do is hook an event notification and determine the first time any input is given, and calibrate then. But to setup a new joypad, what's the first thing the user will do? Map it. What's the first controller to map? Joypad 1. What's the first button? Up. So the user presses up and I quickly poll the state. Now my application sees the first axis as +32767, and thinks it's an analog button, and I'm fucked.

So fuck it, no analog buttons. Treat everything as axes right? Nope. You go to do an assign all and it'll see the analog button state change from 0 to +32767 the first time you press a button to assign, say a POV hat up or analog stick up, and it'll quickly assign that either to up or down, depending on which button comes first.

Can't even map the second analog stick because for some bastardized reason, analog buttons are lRx and lRy, while the second stick is lZ and lRz. And that's almost guaranteed to be different somewhere else. So my only option is to pray to god lX and lY are actual axes and leave the rest unmapped.

I'm not going to write a joypad calibration tool and require all kinds of file loading and saving, and subsequent issues hot-swapping joypads, for this.

There's no way around this, and Google has fuck all of nothing on this problem. How the hell has NOBODY had to deal with this issue before? Am I the only person to ever write joypad mapping code or something??
FirebrandX
Trooper
Posts: 376
Joined: Tue Apr 19, 2005 11:08 pm
Location: DFW area, TX USA
Contact:

Post by FirebrandX »

I'm of the opinion that you shouldn't even bother with analog mapping. The snes pad was digital and so I play it with digital mode on my PS2 controller.
NES NTSC palette file:

http://www.firebrandx.com/downloads/fbx2pal.zip
byuu

Post by byuu »

Okay, new WIP. That's the best I can possibly do.

For all six axes, I now ignore input until the state changes for the first time. If it goes from 0 to > 24576 in a single poll, it considers the axis to be a button. Otherwise it treats it as a stick.

Positive on a stick means down or right, so it's less likely users will hit this first (up, left are more common for assignment as they're first in the control lists.)

To minimize the damage of a bad map, I now map each axis to their own value without regard for axis vs analog button indexing. Eg you will have { axis00, axis01, analogbutton02, analogbutton03, axis04, axis05 } instead of { axis00, axis01, analogbutton00, analogbutton01, axis02, axis03 }. That way if you do screw up the mapping and restart, the indexes won't change on you. I don't do that on Linux to allow as many axes + analog buttons as possible, and because it's not needed.

I had to choose what to bias, so I went with axes as they seem more important overall. Eg -32768 to +24575 = stick; +24576 to +32767 = button. That means it's easier to map a button as an axis than vice versa.

It's unfortunately still quite easy to map these incorrectly, eg if you slam down on a button or smack a stick as hard as you can down or to the right.

But it was basically ... have a chance of mapping inputs wrong, or don't let them be mappable at all. The former seems better in that case.

If anyone has a proper solution for this problem, I'd greatly appreciate it. In fact, let's put a bounty on it. I'll pitch in $20 for the solution (a way to get the true state of axes without requiring the user to press a button first.)

I also used EnumObjects over all absolute axes to map them to -32768 to +32767. That should help with the Xbox 360 controller that defaults to half that range or whatever (fuck you, XInput.)

Testing would be appreciated. Both for the Windows and Linux ports, though I can't foresee there being any problems with the Linux one.

---

SDL on Win32 does the same thing ... not surprising since it just uses DirectInput anyway.

Code: Select all

#include <SDL/SDL.h>
SDL_Joystick *gamepad;

int __stdcall WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
  SDL_InitSubSystem(SDL_INIT_JOYSTICK);
  SDL_JoystickEventState(SDL_IGNORE);

  gamepad = SDL_JoystickOpen(0);
  while(true) {
    SDL_JoystickUpdate();
    unsigned axes = SDL_JoystickNumAxes(gamepad);
    for(unsigned n = 0; n < axes; n++) {
      printf("%d = %6d; ", n, SDL_JoystickGetAxis(gamepad, n));
    }
    printf("\n");
  }

  return 0;
}
grinvader
ZSNES Shake Shake Prinny
Posts: 5632
Joined: Wed Jul 28, 2004 4:15 pm
Location: PAL50, dood !

Post by grinvader »

In a rather extreme way, I guess you could ask the user to fill in the type of key...
It would be some sort of:

[emulated target] = [input type] [key type] [label]
Now a problem is the key type could affect the emulated target. :/

For instance;
UP/DOWN = pad analog_axis J04
but you'd need
UP = pad analog_button J07
DOWN = pad analog_button J08

Reordered to make that clearer:
[key_type] [emulated target] = [input type] [label]

key_type could be (no deadzones taken into account)
- analog_button (neutral = +32767, min = -32768)
- analog_axis (neutral = 0, min = -32768, max = 32767)
- digital_button (sort of boolean)

Axis would cover 2 emulated targets, typically, while buttons cover one. The target would have to change accordingly... getting kinda tedious here, probably.

Ohnoes, more hassle on the user, but you know where I stand in that matter (before anyone wastes time, it's also useless to try and argument what software should cater to with me, concrete walls make a better audience).
皆黙って俺について来い!!

Code: Select all

<jmr> bsnes has the most accurate wiki page but it takes forever to load (or something)
Pantheon: Gideon Zhi | CaitSith2 | Nach | kode54
I.S.T.
Zealot
Posts: 1325
Joined: Tue Nov 27, 2007 7:03 am

Post by I.S.T. »

Software should cater to concrete walls?

*runs*
tetsuo55
Regular
Posts: 307
Joined: Sat Mar 04, 2006 3:17 pm

Post by tetsuo55 »

Byuu, can you legally take a peek at PCSX2 and MAME/MESS sourcecode?

Both should be C++, opensource and use DirectInput
Mame supports every kind of input method known to man
byuu

Post by byuu »

Okay, SDL uses WinMM:
http://msdn.microsoft.com/en-us/library ... 85%29.aspx

So this is more than just a DirectInput issue. Cool API, though. That plus GetAsyncKeyState + mouse capture could make a nice DirectInput alternative.
Byuu, can you legally take a peek at PCSX2 and MAME/MESS sourcecode?
Before I try, do they properly support analog buttons?
Ohnoes, more hassle on the user, but you know where I stand in that matter
If the Linux port had the same problem, I'd be with you 100%. But I don't want to write all that code to work around an issue with Windows, which may just be an issue with my particular gamepad drivers (tried both stock HID and vendor supplied.)
tetsuo55
Regular
Posts: 307
Joined: Sat Mar 04, 2006 3:17 pm

Post by tetsuo55 »

byuu wrote:
Byuu, can you legally take a peek at PCSX2 and MAME/MESS sourcecode?
Before I try, do they properly support analog buttons?
They both should, at least my analog buttons appear to working correctly...
Dullaron
Lurker
Posts: 199
Joined: Mon Mar 10, 2008 11:36 pm

Post by Dullaron »

tetsuo55 I thinking the same thing.

You can even ask Aaron who work on MAME. All kind controllers work on MAME.
Window Vista Home Premium 32-bit / Intel Core 2 Quad Q6600 2.40Ghz / 3.00 GB RAM / Nvidia GeForce 8500 GT
Lazarus
Rookie
Posts: 13
Joined: Tue Aug 29, 2006 2:51 am

Post by Lazarus »

Dullaron wrote:All kind controllers work on MAME.
I think byuu is more concerned with the unkind ones! :mrgreen:

...i'm so funny. :|
FirebrandX
Trooper
Posts: 376
Joined: Tue Apr 19, 2005 11:08 pm
Location: DFW area, TX USA
Contact:

Post by FirebrandX »

Hola Byuu,

I've been having a blast with the new marquee feature using that style sheet. Is there by chance a way to make a favorites database where bsnes will use the assigned background for each game in the database? I just think it would be really cool to have a theme for Zelda that only loads for that game, and then a theme for Super Metroid when you load that.
NES NTSC palette file:

http://www.firebrandx.com/downloads/fbx2pal.zip
Dullaron
Lurker
Posts: 199
Joined: Mon Mar 10, 2008 11:36 pm

Post by Dullaron »

Lazarus wrote:
Dullaron wrote:All kind controllers work on MAME.
I think byuu is more concerned with the unkind ones! :mrgreen:

...i'm so funny. :|
I think byuu wanna make sure he is doing the right way without doing any hacking involve.

Far I know there no hacking in MAME source. Else I haven't read anywhere there is.
Window Vista Home Premium 32-bit / Intel Core 2 Quad Q6600 2.40Ghz / 3.00 GB RAM / Nvidia GeForce 8500 GT
byuu

Post by byuu »

Does anyone here have a joypad with analog buttons? Can you tell me if their values start off centered in the control panel until you press a button, or if they report the correct fully depressed state immediately after opening the panel?

-----

MAME doesn't distinguish between analog axes and buttons.

Internally, it uses the RawInput API for keyboards and mice (kind of neat actually, easy to use and gives you access to multiple mice); and DirectInput for the rest. Thought it requires WinXP+, and will make the binary require that without a half-dozen GetProcAddress calls.

Code: Select all

	// populate the axes
	for (axisnum = axiscount = 0; axiscount < devinfo->dinput.caps.dwAxes && axisnum < 8; axisnum++)
	{
		DIPROPRANGE dipr;
		const char *name;

		// fetch the range of this axis
		dipr.diph.dwSize = sizeof(dipr);
		dipr.diph.dwHeaderSize = sizeof(dipr.diph);
		dipr.diph.dwObj = offsetof(DIJOYSTATE2, lX) + axisnum * sizeof(LONG);
		dipr.diph.dwHow = DIPH_BYOFFSET;
		result = IDirectInputDevice_GetProperty(devinfo->dinput.device, DIPROP_RANGE, &dipr.diph);
	 	if (result != DI_OK)
	 		continue;
		devinfo->joystick.rangemin[axisnum] = dipr.lMin;
		devinfo->joystick.rangemax[axisnum] = dipr.lMax;

		// populate the item description as well
		name = dinput_device_item_name(devinfo, offsetof(DIJOYSTATE2, lX) + axisnum * sizeof(LONG), default_axis_name[axisnum], NULL);
		input_device_item_add(devinfo->device, name, &devinfo->joystick.state.lX + axisnum, (input_item_id)(ITEM_ID_XAXIS + axisnum), generic_axis_get_state);
		free((void *)name);

		axiscount++;
	}
Nothing at all outside the ordinary there. It's actually a little screwy the way it directly indexes into the DIJOYSTATE array, but it works since the layout is static anyway.
Verdauga Greeneyes
Regular
Posts: 347
Joined: Tue Mar 07, 2006 10:32 am
Location: The Netherlands

Post by Verdauga Greeneyes »

byuu wrote:Does anyone here have a joypad with analog buttons? Can you tell me if their values start off centered in the control panel until you press a button, or if they report the correct fully depressed state immediately after opening the panel?
Does the playstation 2 controller have them? And to test it, you press down on one of them and open the control panel while holding it?
byuu

Post by byuu »

When the PlayStation 2 computer entertainment system was announced, the DualShock 2 Analog Controller (SCPH-10010) included with it ... internally, the DualShock 2 was lighter and all of the buttons (except for the Select, Start, Analog mode, L3 and R3 buttons) were readable as analog values (pressure sensitive)[2].
Seems to be the case. I'd imagine whatever adapter you have to run it on a PC might treat them as digital.

Kind of screwy since only the L3/R3 on my controller are analog.

To test, look at the values in the control panel. Now press a button and let go. Is everything the same as when you first opened the panel, or did any of the axes suddenly jump from centered to fully off / on?
Verdauga Greeneyes
Regular
Posts: 347
Joined: Tue Mar 07, 2006 10:32 am
Location: The Netherlands

Post by Verdauga Greeneyes »

All the axes start out centred, and move to their actual values the moment I press a button. The buttons are treated as digital, I guess.
byuu

Post by byuu »

Verdauga Greeneyes wrote:All the axes start out centred, and move to their actual values the moment I press a button. The buttons are treated as digital, I guess.
How many axes do you have total? Just the two thumb sticks (thusly, four unique axes, two per stick), or are there two more for eg the top buttons or anything like that?

And by centered, hmm ... so you're saying after you press a button they go to their actual values ... does that mean you were holding a stick left when you started the control panel test window, but it still showed centered until you pressed a button? Sticks themselves are centered in their natural position. Or are you just saying that the sticks start flickering a bit, as analog inputs often do, but are still ~99% centered.

----------------------------------------

I think I'm starting to get a handle on the situation. From what I've read, DirectInput is basically a glorified wrapper around RawInput. The way it works is DI creates its own thread to process WM_INPUT messages and present the data in a normalized and buffered manner. WinMM almost certainly works the same way.

But the thing is, RawInput only sends WM_INPUT messages on state changes. When you start an application, there's no way to know the state of something until you get a message.

So most likely, the states are all initialized to zero until the first message is sent. That one message most likely contains the state of every axis and button.

And if I'm correct, the same thing will actually apply to Linux, but there's most likely a global process somewhere doing the same thing as DirectInput, but on a system-wide basis. That would coincide with a glitch I noticed this morning where on the first run on bsnes, it mapped the analog button incorrectly. I assumed it was a glitch and restarting it fixed it. It wasn't until now I'm thinking it was more than that ...

Damn. That really complicates things.

----------------------------------------

Okay, how about this?

I drop the distinction between axes and analog buttons completely from nall::input. Now there's just 32 axes + 96 buttons.

Whenever the user goes to map something, if they move a stick / analog button, it will pop open a window that asks the user to specify what it is they pressed, eg:

"You pressed joypad #0, axis #4. Is this a bi-directional motion input (eg it remains centered when not pressed), or is this a uni-directional pressure-sensitive button (eg you can only push it down from its default, unpressed state)? If you are not sure, hit auto-detect while the axis is in its default state (eg make sure it is not being pressed.)

[Auto-detect] [Bi-directional axis] [Uni-directional button]"

Auto-detect will read the current value, which will obviously be valid by this point.

Alternatively, I can pop up a window like this:

"You pressed joypad #0, axis #4. I need to determine what kind of axis this is (eg a stick or a pressure-sensitive button.) To do this, I need to know its default state. Ergo, please make sure said axis is not being pressed during this time!"
+
A) show a count-down from five to zero, then query the current state.
B) put an okay button on the window for the user to click when ready.

Mapping will suck, but once completed it will 'just work' on all future runs of the emulator.
Last edited by byuu on Tue Mar 24, 2009 12:12 am, edited 1 time in total.
FirebrandX
Trooper
Posts: 376
Joined: Tue Apr 19, 2005 11:08 pm
Location: DFW area, TX USA
Contact:

Post by FirebrandX »

I'm using the Dualshock2 and it treats the buttons as digital whether I'm in analog mode or not. Just the two sticks read as analog.

Edit: Here's a pic:

Image

The left axis box is for the left stick, and the z-axis meters are for the right stick. The buttons are still read as analog, and my dualshock2 was one of the first ones made.
NES NTSC palette file:

http://www.firebrandx.com/downloads/fbx2pal.zip
byuu

Post by byuu »

Hmm, my examples would fail one more edge case: D-pads running in "analog" mode versus analog buttons that 'pop' from 0 to +32767. It would throw off my detection of the first axis pressed if the axis requested came after the analog buttons.

Okay, last idea. Mark all 16 joypads as 'uncalibrated' at startup, and when you go to map input, if the joypad is uncalibrated, it will pop open a calibration window.

This window will ask you to press any button down on the controller and then hit next. Once you do, the "Next" button will ungray itself. You hit next and it will then tell you to make sure no button or axis is moved at all, eg don't touch the controller and hit Finish. You hit finish, and it runs the calibration tool over all the joypad axes at that point.

This way, you only get one popup per controller, and only when you're mapping inputs. If you run the emu afterward, it relies on the cached data (stored in the assignment values in the config file.)

Unless anyone has objections, that's what I'm going with.
Verdauga Greeneyes
Regular
Posts: 347
Joined: Tue Mar 07, 2006 10:32 am
Location: The Netherlands

Post by Verdauga Greeneyes »

byuu wrote:How many axes do you have total? Just the two thumb sticks (thusly, four unique axes, two per stick), or are there two more for eg the top buttons or anything like that?

And by centered, hmm ... so you're saying after you press a button they go to their actual values ... does that mean you were holding a stick left when you started the control panel test window, but it still showed centered until you pressed a button? Sticks themselves are centered in their natural position. Or are you just saying that the sticks start flickering a bit, as analog inputs often do, but are still ~99% centered.
I'm not touching the controller when I open the dialog, and I press a button to make it read the states. It seems the axes don't quite centre themselves, so when I press the button it adjusts their values noticeably even though I haven't moved them. The dialog looks like FirebrandX's.
This window will ask you to press any button down on the controller and then hit next. Once you do, the "Next" button will ungray itself. You hit next and it will then tell you to make sure no button or axis is moved at all, eg don't touch the controller and hit Finish. You hit finish, and it runs the calibration tool over all the joypad axes at that point.
Couldn't you combine this into one step? i.e. "Press any button, then let go of your controller before pressing next." I also think it makes more sense to do this every time bsnes is run the first time you try to assign a button. (regardless of whether you use assign all or try to assign a specific button) Otherwise if you change your controller it'll lead to some undefined and unexplained behavior.

Edit: wait, I think I read that wrong and this is what you were already proposing. You should also use the 'uncalibrated' thing when a game is loaded so that bsnes doesn't use the joypad states until a change is registered.
FitzRoy
Veteran
Posts: 861
Joined: Wed Aug 04, 2004 5:43 pm
Location: Sloop

Post by FitzRoy »

How about just disallowing analog joypad stuff altogether? What's the point?
byuu

Post by byuu »

Got it. Not typing all this again, so copy-paste it is:
Yesterday I requested assistance for a joypad axis mapping issue, but I believe I understand the problem and have the proper solution now.

Background: new joypads have pressure-sensitive buttons; rather than simply being on or off, the joypad reports how far down a button is pressed. Given how new this is, various input APIs and indeed the USB HID itself do not directly support these new buttons. Instead, they are mapped as axes, which are basically bi-directional sticks. Unlike buttons that start off fully depressed, sticks start off centered.

A problem arises in trying to tell them apart: at application startup, polling the joypad state returns zero, or centered, for all axes. Even buttons that are fully depressed. It isn't until a button is pressed or an axis is moved that the actual state of the pressure-sensitive buttons are read correctly.

I believe the reason for this is due to the design of the USB HID. Rather than having an interface to poll the current state of joypads, it instead sends messages with the state of the entire device whenever the state is changed (eg a button is pressed.) On Windows, this would correspond to the raw input WM_INPUT window message. DirectInput appears to buffer this information on an app-by-app basis. On Linux, this data seems to be cached by the input driver globally; so each joypad needs only one message sent per system reset.

So what happens when you first start an application? It can't possibly know the state until a message is sent, so it feeds back what you would expect: unpressed buttons and centered (zero-positioned) axes.

Further, we can't simply check the axis states after the first button press, because the user may decide to move an axis or press an analog button first. Since we can't tell which object state changed, we may end up detecting an analog button as a stick or vice versa.

My solution was to display a popup the first time the user attempts to map a joypad axis. It asks the user not to press any buttons, and to leave all axes alone; and then to press okay. After hitting okay, I then query the states of each axis. To prevent needing to calibrate the joypad every time the application is run, and to avoid issues with swapping out joypads, I save the type of input by appending it onto the assignment name for a given ID, eg "joypad01.axis03::trigger" states that axis03 is a pressure-sensitive button (or trigger), whereas "joypad01.axis03::lo" indicates an axis that is triggered by moving a given axis left or up (depending on direction.) Therefore, on future startups, the type of axis will already be known without having to prompt the user to calibrate the joypad again.

So, all of that said, bsnes v042 will now fully support up to 16 controllers, 8 POV hats, 32 analog axes (be it sticks or pressure-sensitive buttons) and 96 buttons. All of these can be mapped to any emulated device or UI shortcut.
Now then, if anyone wants explicit support for the Xbox 360 controller, then they're going to have to pay me to get one. It's the only controller in the world that uses XInput instead of DirectInput. Those controllers cost sixty fucking dollars because Microsoft is batshit insane. I'm not paying that for the 'privilege' of learning and writing a new API input driver.
(and please don't offer just for the sake of it. It's a bit of trouble, so I only want to add it if someone genuinely wants the support.)

Otherwise, the controller should work, but the pressure-sensitive buttons on the top are treated like one axis, at least according to MSDN. Meaning you can use one or the other, but not both at the same time.

No idea and no promises on what happens under Linux. My guess is it won't be possible to support the PS-buttons there at all. That or it already works fully.

The same goes for any other controller that doesn't work properly. Though I'd like to hear about it so I know, I can't really troubleshoot this stuff without the actual joypads. I hate sending a hundred debug binaries to people.
How about just disallowing analog joypad stuff altogether? What's the point?
It gives ten additional buttons to assign controller input and/or UI shortcuts to on my controller.

I may want L1/R1 to control emulator speed, or if I ever get savestate support it would be nice to have a quicksave button without reaching for the keyboard. It's also more comfortable to use the pressure-sensitive triggers than L1/R1 for the SNES shoulder buttons.

Some people may also prefer an analog stick for movement over the D-pad.

And it's about quality. Just treating buttons and sticks as dead is really tacky. I want the app to be as professional as possible. And since apparently no other emu has ever had this issue, that'd make mine the only one to properly support these buttons :P

By adding this support, the only inconvenience is a popup once per app run whenever you assign an analog input that you click okay to. You only see it when you assign new inputs, so most users will only ever see it once or twice. And if they don't use the analog inputs anyway, then they won't ever see it.
Nightcrawler
Romhacking God
Posts: 922
Joined: Wed Jul 28, 2004 11:27 pm
Contact:

Post by Nightcrawler »

For your entertainment on the subject, read the following. Specifically how the Xbox360 controller works in Xinput vs. DirectInput such as the left and right triggers acting as a SINGLE axis!!

http://en.wikipedia.org/wiki/Xinput

MS has made a mess out of windows input APIs. MS doesn't even recommend using DirectInput for keyboards or mice anymore!

What they need to do is update Xinput to work on all input devices, but they don't because they're too blinded by monopoly lust with Xbox 360.

There's no good way to support these buttons to my knowledge other than some hacked up ideas to figure it all out yourself in the application as you have done. That's probably the best you can hope for at present.

P.S. What controller are you using that has so many buttons and axis?
[url=http://transcorp.romhacking.net]TransCorp[/url] - Home of the Dual Orb 2, Cho Mahou Tairyku Wozz, and Emerald Dragon SFC/SNES translations.
[url=http://www.romhacking.net]ROMhacking.net[/url] - The central hub of the ROM hacking community.
byuu

Post by byuu »

Specifically how the Xbox360 controller works in Xinput vs. DirectInput such as the left and right triggers acting as a SINGLE axis!!
Yeah. As a result, left button press will map as axis??::lo, and right as axis??::hi. So you can press either button to trigger it, but if you try and press both at the same time, they'll cancel each other out.

It's funny that they say "the combination of the left and right triggers in DirectInput is by design". It certainly didn't stop every other USB HID device from adding pressure-sensitive buttons as independent axes.
Games have always assumed that DirectInput device axes are centered when there is no user interaction with the device. However, the Xbox 360 controller was designed to register minimum value, not center, when the triggers are not being held." MSDN's 'solution' was to combine the triggers, setting one trigger to a positive direction and the other to a negative direction, so no user interaction is indicative to DirectInput of the 'control' being at center.
A more logical decision would've been to treat each as their own axis, and have the default non-pressed state report as 0 (centered). The more force you give, the higher it goes. Sure you'd only have half the range, 0 to +32767, but it's not like those buttons can (or really even should) register more than 32k unique states anyway.

And then you could easily tell them apart by examining their range (DIPROP_RANGE).
Maximum of four controllers at a time. This is an Xbox limit that is carried over to Windows. Although there are currently few PC games that need more than four controllers at once, this seems like an arbitrary restriction as DirectInput has no such limitation.
So much for N-Warp Daisakusen and Super Bomberman :(
P.S. What controller are you using that has so many buttons and axis?
http://www.amazon.co.uk/Thrustmaster-Tr ... B000U7RJ0W

What you don't see is L1/L2/R1/R2 and pressure-sensitive L3/R3. It does force-feedback and cost me $20 new.
@Byuu: I doubt a xbox360 controller is really that expensive.
You got me. I was just hoping to make some quick cash :P

http://www.bestbuy.com/site/olspage.jsp ... e=category
http://www.bestbuy.com/site/olspage.jsp ... 6839533325

Note: pre-tax. They don't even sell the wired version, I'd actually prefer that as I hate things that need batteries.

Seriously ... Microsoft and Apple have lost their minds. As Ballmer said, "developers x4". News flash, developers aren't consumer whores with money to throw away. We're the guys building our own systems. You need us more than we need you for commercial success.

Want your APIs to catch on? Get your hardware into developer hands so that we can write code that uses it.

Trying to marginalize your under-priced game console / OS by charging extortionate fees on peripherals / hardware is not the way to attract us.

It's really too bad Joe Sixpack is stupid enough to see an Xbox $200 (sorry, $199.99 -- big difference) price tag, and subsequently purchase three additional controllers (+$180) and a wireless adapter (+$100), thinking the system was somehow 'affordable'.
Locked