A fairly large overhaul of the mouse-emulates-controller functionality,

fixing bugs too numerous to mention.  The end result is that using
Control-0 to switch between mouse modes is much more understandable.

Updated properties database for Telepathy ROM, which now uses the
MindLink controller.  Also updated Astroblast ROMs to use paddles
by default.


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@2444 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2012-04-19 13:00:02 +00:00
parent ccf9128cdf
commit 822a378182
27 changed files with 451 additions and 297 deletions

View File

@ -16,16 +16,18 @@
* Updated the CompuMate keyboard handler to recognize more keys on an
actual keyboard, instead of having to remember the weird combinations
used on the original CompuMate keyboard.
used on the original CompuMate keyboard (although those original keys
will continue to work).
* Added emulation for MindLink controller; the Bionic Breakthrough
ROM now works.
* Added emulation for MindLink controller using the mouse; the 'Bionic
Breakthrough' and 'Telepathy' ROMs now work.
* Updated FA2 bankswitch scheme (Star Castle) to emulate load/save
high score functionality to the Harmony cart flash RAM.
* Updated internal database for 'Juno First' ROMs; they will now use
an AtariVox/SaveKey when possible.
* Several updates to the internal properties database:
- 'Juno First' ROMs now use an AtariVox/SaveKey when possible
- 'Astroblast' ROMs now use the paddles by default
* Updated included PNG library to latest stable version.

View File

@ -30,53 +30,117 @@ MouseControl::MouseControl(Console& console, const string& mode)
myRightController(console.controller(Controller::Right)),
myCurrentModeNum(0)
{
if(BSPF_equalsIgnoreCase(mode, "never"))
if(BSPF_equalsIgnoreCase(mode, "none"))
{
myModeList.push_back(MouseMode("Mouse input is disabled"));
return;
}
else if(!BSPF_equalsIgnoreCase(mode, "auto") && mode.length() == 2 &&
mode[0] >= '0' && mode[0] <= '5' &&
mode[1] >= '0' && mode[1] <= '5')
mode[0] >= '0' && mode[0] <= '8' &&
mode[1] >= '0' && mode[1] <= '8')
{
Axis xaxis = (Axis) ((int)mode[0] - '0');
Axis yaxis = (Axis) ((int)mode[1] - '0');
ostringstream msg;
msg << "Mouse X-axis is ";
Controller::Type xtype = Controller::Joystick, ytype = Controller::Joystick;
int xid = -1, yid = -1;
switch(xaxis)
{
case NoControl:
msg << "not used";
break;
case Paddle0:
msg << "Paddle 0"; break;
xtype = Controller::Paddles;
xid = 0;
msg << "Paddle 0";
break;
case Paddle1:
msg << "Paddle 1"; break;
xtype = Controller::Paddles;
xid = 1;
msg << "Paddle 1";
break;
case Paddle2:
msg << "Paddle 2"; break;
xtype = Controller::Paddles;
xid = 2;
msg << "Paddle 2";
break;
case Paddle3:
msg << "Paddle 3"; break;
xtype = Controller::Paddles;
xid = 3;
msg << "Paddle 3";
break;
case Driving0:
msg << "Driving 0"; break;
xtype = Controller::Driving;
xid = 0;
msg << "Driving 0";
break;
case Driving1:
msg << "Driving 1"; break;
xtype = Controller::Driving;
xid = 1;
msg << "Driving 1";
break;
case MindLink0:
xtype = Controller::MindLink;
xid = 0;
msg << "MindLink 0";
break;
case MindLink1:
xtype = Controller::MindLink;
xid = 1;
msg << "MindLink 1";
break;
default: break;
}
msg << ", Y-axis is ";
switch(yaxis)
{
case NoControl:
msg << "not used";
break;
case Paddle0:
msg << "Paddle 0"; break;
ytype = Controller::Paddles;
yid = 0;
msg << "Paddle 0";
break;
case Paddle1:
msg << "Paddle 1"; break;
ytype = Controller::Paddles;
yid = 1;
msg << "Paddle 1";
break;
case Paddle2:
msg << "Paddle 2"; break;
ytype = Controller::Paddles;
yid = 2;
msg << "Paddle 2";
break;
case Paddle3:
msg << "Paddle 3"; break;
ytype = Controller::Paddles;
yid = 3;
msg << "Paddle 3";
break;
case Driving0:
msg << "Driving 0"; break;
ytype = Controller::Driving;
yid = 0;
msg << "Driving 0";
break;
case Driving1:
msg << "Driving 1"; break;
ytype = Controller::Driving;
yid = 1;
msg << "Driving 1";
break;
case MindLink0:
ytype = Controller::MindLink;
yid = 0;
msg << "MindLink 0";
break;
case MindLink1:
ytype = Controller::MindLink;
yid = 1;
msg << "MindLink 1";
break;
default: break;
}
myModeList.push_back(MouseMode(xaxis, yaxis, -1, msg.str()));
myModeList.push_back(MouseMode(xtype, xid, ytype, yid, msg.str()));
}
// Now consider the possible modes for the mouse based on the left
@ -96,6 +160,11 @@ MouseControl::MouseControl(Console& console, const string& mode)
// If the mouse isn't used at all, we still need one item in the list
if(myModeList.size() == 0)
myModeList.push_back(MouseMode("Mouse not used for current controllers"));
#if 0
for(unsigned int i = 0; i < myModeList.size(); ++i)
cerr << myModeList[i] << endl;
#endif
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -109,8 +178,8 @@ const string& MouseControl::next()
const MouseMode& mode = myModeList[myCurrentModeNum];
myCurrentModeNum = (myCurrentModeNum + 1) % myModeList.size();
myLeftController.setMouseControl(mode.xaxis, mode.yaxis, mode.controlID);
myRightController.setMouseControl(mode.xaxis, mode.yaxis, mode.controlID);
myLeftController.setMouseControl(mode.xtype, mode.xid, mode.ytype, mode.yid);
myRightController.setMouseControl(mode.xtype, mode.xid, mode.ytype, mode.yid);
return mode.message;
}
@ -118,69 +187,56 @@ const string& MouseControl::next()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void MouseControl::addLeftControllerModes(bool noswap)
{
switch(myLeftController.type())
if(controllerSupportsMouse(myLeftController))
{
case Controller::Joystick:
case Controller::BoosterGrip:
case Controller::Genesis:
case Controller::Driving:
case Controller::TrackBall22:
case Controller::TrackBall80:
case Controller::AmigaMouse:
// case Controller::Mindlink:
if(myLeftController.type() == Controller::Paddles)
{
if(noswap) addPaddleModes(0, 1, 0, 1);
else addPaddleModes(2, 3, 0, 1);
}
else
{
ostringstream msg;
msg << "Mouse is left " << myLeftController.name() << " controller";
myModeList.push_back(MouseMode(Automatic, Automatic, noswap ? 0 : 1, msg.str()));
break;
Controller::Type type = myLeftController.type();
int id = noswap ? 0 : 1;
myModeList.push_back(MouseMode(type, id, type, id, msg.str()));
}
case Controller::Paddles:
if(noswap) addPaddleModes(0, 1, 0, 1);
else addPaddleModes(2, 3, 0, 1);
break;
default:
break;
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void MouseControl::addRightControllerModes(bool noswap)
{
switch(myRightController.type())
if(controllerSupportsMouse(myRightController))
{
case Controller::Joystick:
case Controller::BoosterGrip:
case Controller::Genesis:
case Controller::Driving:
case Controller::TrackBall22:
case Controller::TrackBall80:
case Controller::AmigaMouse:
// case Controller::Mindlink:
if(myRightController.type() == Controller::Paddles)
{
if(noswap) addPaddleModes(2, 3, 2, 3);
else addPaddleModes(0, 1, 2, 3);
}
else
{
ostringstream msg;
msg << "Mouse is right " << myRightController.name() << " controller";
myModeList.push_back(MouseMode(Automatic, Automatic, noswap ? 1 : 0, msg.str()));
break;
Controller::Type type = myRightController.type();
int id = noswap ? 1 : 0;
myModeList.push_back(MouseMode(type, id, type, id, msg.str()));
}
case Controller::Paddles:
if(noswap) addPaddleModes(2, 3, 2, 3);
else addPaddleModes(0, 1, 2, 3);
break;
default:
break;
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void MouseControl::addPaddleModes(int lport, int rport, int lname, int rname)
{
Controller::Type type = Controller::Paddles;
ostringstream msg;
msg << "Mouse is Paddle " << lname << " controller";
MouseMode mode0(Automatic, Automatic, lport, msg.str());
MouseMode mode0(type, lport, type, lport, msg.str());
msg.str("");
msg << "Mouse is Paddle " << rname << " controller";
MouseMode mode1(Automatic, Automatic, rport, msg.str());
MouseMode mode1(type, rport, type, rport, msg.str());
if(BSPF_equalsIgnoreCase(myProps.get(Controller_SwapPaddles), "NO"))
{
@ -193,3 +249,13 @@ void MouseControl::addPaddleModes(int lport, int rport, int lname, int rname)
myModeList.push_back(mode0);
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool MouseControl::controllerSupportsMouse(Controller& controller)
{
// Test whether the controller uses the mouse at all
// We can pass in dummy values here, since the controllers will be
// initialized by a call to next() once the system is up and running
return controller.setMouseControl(
Controller::Joystick, -1, Controller::Joystick, -1);
}

View File

@ -21,11 +21,11 @@
#define MOUSE_CONTROL_HXX
class Console;
class Controller;
class Properties;
#include "bspf.hxx"
#include "Array.hxx"
#include "Control.hxx"
/**
The mouse can control various virtual 'controllers' in many different
@ -47,7 +47,8 @@ class MouseControl
enum Axis
{
Paddle0 = 0, Paddle1, Paddle2, Paddle3,
Driving0, Driving1, Automatic, NoControl
Driving0, Driving1, MindLink0, MindLink1,
NoControl
};
public:
@ -76,6 +77,7 @@ class MouseControl
void addLeftControllerModes(bool noswap);
void addRightControllerModes(bool noswap);
void addPaddleModes(int lport, int rport, int lname, int rname);
bool controllerSupportsMouse(Controller& controller);
private:
const Properties& myProps;
@ -83,29 +85,30 @@ class MouseControl
Controller& myRightController;
struct MouseMode {
Axis xaxis, yaxis;
int controlID;
Controller::Type xtype, ytype;
int xid, yid;
string message;
MouseMode()
: xaxis(NoControl),
yaxis(NoControl),
controlID(-1),
message("") { }
MouseMode(const string& msg)
: xaxis(NoControl),
yaxis(NoControl),
controlID(-1),
MouseMode(const string& msg = "")
: xtype(Controller::Joystick),
ytype(Controller::Joystick),
xid(-1),
yid(-1),
message(msg) { }
MouseMode(Axis x, Axis y, int id, const string& msg)
: xaxis(x),
yaxis(y),
controlID(id),
MouseMode(Controller::Type xtype, int xid,
Controller::Type ytype, int yid,
const string& msg)
: xtype(xtype),
ytype(ytype),
xid(xid),
yid(yid),
message(msg) { }
friend ostream& operator<<(ostream& os, const MouseMode& mm)
{
os << "xaxis=" << mm.xaxis << ", yaxis=" << mm.yaxis
<< ", id=" << mm.controlID << ", msg=" << mm.message;
os << "xtype=" << mm.xtype << ", xid=" << mm.xid
<< ", ytype=" << mm.ytype << ", yid=" << mm.yid
<< ", msg=" << mm.message;
return os;
}
};

View File

@ -129,16 +129,21 @@ void BoosterGrip::update()
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void BoosterGrip::setMouseControl(
MouseControl::Axis xaxis, MouseControl::Axis yaxis, int ctrlID)
bool BoosterGrip::setMouseControl(
Controller::Type xtype, int xid, Controller::Type ytype, int yid)
{
// In 'automatic' mode, both axes on the mouse map to a single normal booster
if(xaxis == MouseControl::Automatic || yaxis == MouseControl::Automatic)
// Currently, the booster-grip takes full control of the mouse, using both
// axes for its two degrees of movement, and the left/right buttons for
// fire and booster, respectively
if(xtype == Controller::BoosterGrip && ytype == Controller::BoosterGrip &&
xid == yid)
{
myControlID = ((myJack == Left && ctrlID == 0) ||
(myJack == Right && ctrlID == 1)
) ? ctrlID : -1;
myControlID = ((myJack == Left && xid == 0) ||
(myJack == Right && xid == 1)
) ? xid : -1;
}
else // Otherwise, boosters are not used in 'non-auto' mode
else
myControlID = -1;
return true;
}

View File

@ -58,20 +58,21 @@ class BoosterGrip : public Controller
/**
Determines how this controller will treat values received from the
X/Y axis and left/right buttons of the mouse. Since not all controllers
use the mouse, it's up to the specific class to decide how to use this data.
If either of the axis is set to 'Automatic', then we automatically
use the ctrlID for the control type.
use the mouse the same way (or at all), it's up to the specific class to
decide how to use this data.
In the current implementation, the left button is tied to the X axis,
and the right one tied to the Y axis.
@param xaxis How the controller should use x-axis data
@param yaxis How the controller should use y-axis data
@param ctrlID The controller ID to use axis 'auto' mode
@param xtype The controller to use for x-axis data
@param xid The controller ID to use for x-axis data (-1 for no id)
@param ytype The controller to use for y-axis data
@param yid The controller ID to use for y-axis data (-1 for no id)
@return Whether the controller supports using the mouse
*/
void setMouseControl(
MouseControl::Axis xaxis, MouseControl::Axis yaxis, int ctrlID = -1);
bool setMouseControl(
Controller::Type xtype, int xid, Controller::Type ytype, int yid);
private:
// Pre-compute the events we care about based on given port
@ -80,7 +81,7 @@ class BoosterGrip : public Controller
myFireEvent, myBoosterEvent, myTriggerEvent,
myXAxisValue, myYAxisValue;
// Controller to emulate in mouse axis 'automatic' mode
// Controller to emulate in normal mouse axis mode
int myControlID;
};

View File

@ -26,7 +26,6 @@ class System;
#include "Serializable.hxx"
#include "bspf.hxx"
#include "MouseControl.hxx"
/**
A controller is a device that plugs into either the left or right
@ -181,20 +180,22 @@ class Controller : public Serializable
/**
Determines how this controller will treat values received from the
X/Y axis and left/right buttons of the mouse. Since not all controllers
use the mouse, it's up to the specific class to decide how to use this data.
If either of the axis is set to 'Automatic', then we automatically
use the ctrlID for the control type.
use the mouse the same way (or at all), it's up to the specific class to
decide how to use this data.
In the current implementation, the left button is tied to the X axis,
and the right one tied to the Y axis.
@param xaxis How the controller should use x-axis data
@param yaxis How the controller should use y-axis data
@param ctrlID The controller ID to use axis 'auto' mode
@param xtype The controller to use for x-axis data
@param xid The controller ID to use for x-axis data (-1 for no id)
@param ytype The controller to use for y-axis data
@param yid The controller ID to use for y-axis data (-1 for no id)
@return Whether the controller supports using the mouse
*/
virtual void setMouseControl(
MouseControl::Axis xaxis, MouseControl::Axis yaxis, int ctrlID = -1) { };
virtual bool setMouseControl(
Controller::Type xtype, int xid, Controller::Type ytype, int yid)
{ return false; }
/**
Returns the name of this controller.

View File

@ -331,7 +331,7 @@ static const char* DefProps[DEF_PROPS_SIZE][21] = {
{ "16e04823887c547dc24bc70dff693df4", "Atari", "CX26163P", "Tennis (32 in 1) (1988) (Atari) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "16f494f20af5dc803bc35939ef924020", "Mark De Smet", "", "Video Simon (Mark De Smet)", "", "New Release", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "16fbb36a6124567405a235821e8f69ee", "", "", "Star Fire (28-11-2002) (MP)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "170e7589a48739cfb9cc782cbb0fe25a", "M Network, Hal Finney - INTV", "MT5666", "Astroblast (1982) (M Network) [fixed]", "", "Uncommon", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "170e7589a48739cfb9cc782cbb0fe25a", "M Network, Hal Finney - INTV", "MT5666", "Astroblast (1982) (M Network) [fixed]", "Can also use left joystick", "Uncommon", "", "", "", "", "", "", "PADDLES", "", "YES", "", "", "", "", "", "" },
{ "171cd6b55267573e6a9c2921fb720794", "Kurt Howe", "", "Adventure 34 (Kurt Howe) (Hack)", "Hack of Adventure", "Hack", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "1733772165d7b886a94e2b4ed0f74ccd", "", "", "Boring Journey Escape (Hack)", "Hack of Journey - Escape", "Hack", "", "", "", "", "", "", "", "", "", "", "", "", "230", "", "" },
{ "1738b2e3f25ab3eef3cecb95e1d0d957", "", "", "Hangman Monkey Biglist1 (Hack)", "Hack of Hangman", "Hack", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
@ -829,7 +829,7 @@ static const char* DefProps[DEF_PROPS_SIZE][21] = {
{ "3d48b8b586a09bdbf49f1a016bf4d29a", "Video Game Cartridge - Ariola", "TP-606", "Hole Hunter (Video Game Cartridge)", "AKA Topy", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "3d6fc7a19be76d808aa233415cb583fc", "CCE", "C-833", "Target Practice (1983) (CCE)", "AKA Carnival", "", "", "", "", "", "", "", "", "", "", "", "", "26", "214", "", "" },
{ "3d7749fb9c2f91a276dfe494495234c5", "Jone Yuan Telephonic Enterprise Co", "", "Checkers (Jone Yuan)", "2600 Screen Search Console", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "3d7aad37c55692814211c8b590a0334c", "Atari, Dan Oliver", "", "Telepathy (1983) (Atari) (Prototype)", "", "Prototype", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "3d7aad37c55692814211c8b590a0334c", "Atari, Dan Oliver", "", "Telepathy (1983) (Atari) (Prototype)", "Uses both left joystick and right Mindlink controllers (press Fire on respective controller to begin)", "Prototype", "", "", "", "", "", "", "", "MINDLINK", "", "78", "", "", "", "", "" },
{ "3d8a2d6493123a53ade45e3e2c5cafa0", "Atari, Jim Huether - Sears", "CX2629 - 6-99843, 49-75118", "Sky Diver (1979) (Atari) (4K)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "3d934bb980e2e63e1ead3e7756928ccd", "Activision, Steve Cartwright - Ariola", "EAX-017, EAX-017-04I - 711 017-720", "MegaMania (1982) (Activision) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "3d9c2fccf8b11630762ff00811c19277", "", "", "Challenge of.... Nexar, The (Unknown) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
@ -954,7 +954,7 @@ static const char* DefProps[DEF_PROPS_SIZE][21] = {
{ "469473ff6fed8cc8d65f3c334f963aab", "Atari, Bruce Poehlman, Gary Stark", "", "Dune (07-10-1984) (Atari) (Prototype)", "", "Prototype", "", "", "", "", "", "", "", "", "", "", "", "23", "", "YES", "" },
{ "46c021a3e9e2fd00919ca3dd1a6b76d8", "Atari, Jim Huether - Sears", "CX2629 - 6-99843, 49-75118", "Sky Diver (1979) (Atari)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "46c43fdcbce8fde3a91ebeafc05b7cbd", "", "", "Invaders Demo (PAL) (2001) (Eckhard Stolberg)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "46e9428848c9ea71a4d8f91ff81ac9cc", "Telegames", "", "Astroblast (1989) (Telegames) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "46e9428848c9ea71a4d8f91ff81ac9cc", "Telegames", "", "Astroblast (1989) (Telegames) (PAL)", "Can also use left joystick", "", "", "", "", "", "", "", "PADDLES", "", "YES", "", "", "", "", "", "" },
{ "4702d8d9b48a332724af198aeac9e469", "Atari, Jerome Domurat, Steve Woita", "CX2699", "Taz (1983) (Atari) [a]", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "470878b9917ea0348d64b5750af149aa", "Atari, Suki Lee - Sears", "CX2658 - 49-75128", "Math Gran Prix (1982) (Atari)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "47464694e9cce07fdbfd096605bf39d4", "Activision, Dan Kitchen", "EAK-050-04", "Double Dragon (1989) (Activision) (PAL) [a]", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
@ -1540,7 +1540,7 @@ static const char* DefProps[DEF_PROPS_SIZE][21] = {
{ "74f623833429d35341b7a84bc09793c0", "Zellers", "", "Radar (Zellers)", "AKA Exocet", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "75028162bfc4cc8e74b04e320f9e6a3f", "Atari, Greg Easter, Mimi Nyden", "CX26107", "Snow White and the Seven Dwarfs (02-09-1983) (Atari) (Prototype)", "", "Prototype", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "7511c34518a9a124ea773f5b0b5c9a48", "", "", "Donkey Kong (208 in 1) (Unknown) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "75169c08b56e4e6c36681e599c4d8cc5", "M Network, Hal Finney - INTV", "MT5666", "Astroblast (1982) (M Network)", "", "Uncommon", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "75169c08b56e4e6c36681e599c4d8cc5", "M Network, Hal Finney - INTV", "MT5666", "Astroblast (1982) (M Network)", "Can also use left joystick", "Uncommon", "", "", "", "", "", "", "PADDLES", "", "YES", "", "", "", "", "", "" },
{ "753375d183c713cfa0aa7298d1f3067b", "Arcadia Corporation, Steve Hales, Stephen Harland Landrum", "AR-4102", "Suicide Mission (1982) (Arcadia) [a]", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "" },
{ "7550b821ee56fb5833dca2be88622d5a", "", "", "Multiple Moving Objects Demo (B. Watson)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "75511bb694662301c9e71df645f4b5a7", "Activision, Bob Whitehead - Ariola", "EAG-011, PAG-011 - 711 011-715", "Stampede (1981) (Activision) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
@ -2581,7 +2581,7 @@ static const char* DefProps[DEF_PROPS_SIZE][21] = {
{ "cbc373fbcb1653b4c56bfabba33ea50d", "CCE", "", "Super Voleyball (CCE)", "AKA RealSports Volleyball", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "cbced209dd0575a27212d3eee6aee3bc", "Apollo - Games by Apollo, Ed Salvo, Byron Parks", "AP-2003", "Racquetball (1981) (Apollo)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "" },
{ "cbd981a23c592fb9ab979223bb368cd5", "Atari, Carla Meninsky - Sears", "CX2660 - 49-75187", "Star Raiders (1982) (Atari)", "Uses Joystick (left) and Keypad (right) Controllers", "", "", "", "", "", "", "", "", "KEYBOARD", "", "", "", "", "", "", "" },
{ "cbe5a166550a8129a5e6d374901dffad", "Atari, Carla Meninsky - Sears", "CX2610 - 49-75127", "Warlords (1981) (Atari)", "Uses the Paddle Controllers", "", "", "", "", "", "", "", "PADDLES", "PADDLES", "", "01", "", "", "", "", "" },
{ "cbe5a166550a8129a5e6d374901dffad", "Atari, Carla Meninsky - Sears", "CX2610 - 49-75127", "Warlords (1981) (Atari)", "Uses the Paddle Controllers", "", "", "", "", "", "", "", "PADDLES", "PADDLES", "", "", "", "", "", "", "" },
{ "cbeafd37f15e0dddb0540dbe15c545a4", "", "", "Black and White Fast Scolling Demo (PD)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "cc03c68b8348b62331964d7a3dbec381", "Jone Yuan Telephonic Enterprise Co", "", "Marauder (Jone Yuan)", "2600 Screen Search Console", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "cc12581e079cd18330a89902625b8347", "Dave Neuman", "", "Space Battle (PAL)", "", "Homebrew", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },

View File

@ -136,31 +136,34 @@ void Driving::update()
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Driving::setMouseControl(
MouseControl::Axis xaxis, MouseControl::Axis yaxis, int ctrlID)
bool Driving::setMouseControl(
Controller::Type xtype, int xid, Controller::Type ytype, int yid)
{
// In 'automatic' mode, only the X-axis is used
if(xaxis == MouseControl::Automatic || yaxis == MouseControl::Automatic)
// When the mouse emulates a single driving controller, only the X-axis is
// used, and both mouse buttons map to the same 'fire' event
if(xtype == Controller::Driving && ytype == Controller::Driving && xid == yid)
{
myControlID = ((myJack == Left && ctrlID == 0) ||
(myJack == Right && ctrlID == 1)
) ? ctrlID : -1;
myControlID = ((myJack == Left && xid == 0) ||
(myJack == Right && xid == 1)
) ? xid : -1;
myControlIDX = myControlIDY = -1;
}
else
{
// The following is somewhat complex, but we need to pre-process as much
// as possible, so that ::update() can run quickly
// Otherwise, each axis can be mapped to a separate driving controller,
// and the buttons map to separate (corresponding) controllers
myControlID = -1;
if(myJack == Left)
{
myControlIDX = xaxis == MouseControl::Driving0 ? 0 : -1;
myControlIDY = yaxis == MouseControl::Driving0 ? 0 : -1;
myControlIDX = (xtype == Controller::Driving && xid == 0) ? 0 : -1;
myControlIDY = (ytype == Controller::Driving && yid == 0) ? 0 : -1;
}
else // myJack == Right
{
myControlIDX = xaxis == MouseControl::Driving1 ? 1 : -1;
myControlIDY = yaxis == MouseControl::Driving1 ? 1 : -1;
myControlIDX = (xtype == Controller::Driving && xid == 1) ? 1 : -1;
myControlIDY = (ytype == Controller::Driving && yid == 1) ? 1 : -1;
}
}
return true;
}

View File

@ -58,20 +58,21 @@ class Driving : public Controller
/**
Determines how this controller will treat values received from the
X/Y axis and left/right buttons of the mouse. Since not all controllers
use the mouse, it's up to the specific class to decide how to use this data.
If either of the axis is set to 'Automatic', then we automatically
use the ctrlID for the control type.
use the mouse the same way (or at all), it's up to the specific class to
decide how to use this data.
In the current implementation, the left button is tied to the X axis,
and the right one tied to the Y axis.
@param xaxis How the controller should use x-axis data
@param yaxis How the controller should use y-axis data
@param ctrlID The controller ID to use axis 'auto' mode
@param xtype The controller to use for x-axis data
@param xid The controller ID to use for x-axis data (-1 for no id)
@param ytype The controller to use for y-axis data
@param yid The controller ID to use for y-axis data (-1 for no id)
@return Whether the controller supports using the mouse
*/
void setMouseControl(
MouseControl::Axis xaxis, MouseControl::Axis yaxis, int ctrlID = -1);
bool setMouseControl(
Controller::Type xtype, int xid, Controller::Type ytype, int yid);
private:
// Counter to iterate through the gray codes
@ -89,10 +90,10 @@ class Driving : public Controller
Event::Type myCWEvent, myCCWEvent, myFireEvent,
myXAxisValue, myYAxisValue, myAxisMouseMotion;
// Controller to emulate in mouse axis 'automatic' mode
// Controller to emulate in normal mouse axis mode
int myControlID;
// Controller to emulate in mouse axis 'specific' mode
// Controllers to emulate in 'specific' mouse axis mode
int myControlIDX, myControlIDY;
};

View File

@ -518,10 +518,7 @@ void EventHandler::poll(uInt64 time)
{
case KBDK_0: // Ctrl-0 switches between mouse control modes
if(myMouseControl)
{
const string& message = myMouseControl->next();
myOSystem->frameBuffer().showMessage(message);
}
myOSystem->frameBuffer().showMessage(myMouseControl->next());
break;
case KBDK_1: // Ctrl-1 swaps Stelladaptor/2600-daptor ports
@ -1964,13 +1961,14 @@ void EventHandler::takeSnapshot(uInt32 number)
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void EventHandler::setMouseControllerMode(const string& mode)
void EventHandler::setMouseControllerMode(bool enable)
{
delete myMouseControl; myMouseControl = NULL;
if(&myOSystem->console())
{
const string& control = mode == "rom" ?
myOSystem->console().properties().get(Controller_MouseAxis) : mode;
delete myMouseControl; myMouseControl = NULL;
const string& control = enable ?
myOSystem->console().properties().get(Controller_MouseAxis) : "none";
myMouseControl = new MouseControl(myOSystem->console(), control);
myMouseControl->next(); // set first available mode

View File

@ -157,12 +157,12 @@ class EventHandler
void quit() { handleEvent(Event::Quit, 1); }
/**
Sets the mouse axes and buttons to act as controller 'mode', where
the mode is defined from the Controller::MouseAxisControl enum
Sets the mouse axes and buttons to act as the controller specified in
the ROM properties, otherwise disable mouse control completely
@param mode The controller which the mouse axes should emulate
@param enable Whether to use the mouse to emulate controllers
*/
void setMouseControllerMode(const string& mode);
void setMouseControllerMode(bool enable);
/**
Set the number of seconds between taking a snapshot in

View File

@ -105,16 +105,20 @@ void Genesis::update()
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Genesis::setMouseControl(
MouseControl::Axis xaxis, MouseControl::Axis yaxis, int ctrlID)
bool Genesis::setMouseControl(
Controller::Type xtype, int xid, Controller::Type ytype, int yid)
{
// In 'automatic' mode, both axes on the mouse map to a single Genesis
if(xaxis == MouseControl::Automatic || yaxis == MouseControl::Automatic)
// Currently, the Genesis controller takes full control of the mouse, using
// both axes for its two degrees of movement, and the left/right buttons for
// 'B' and 'C', respectively
if(xtype == Controller::Genesis && ytype == Controller::Genesis && xid == yid)
{
myControlID = ((myJack == Left && ctrlID == 0) ||
(myJack == Right && ctrlID == 1)
) ? ctrlID : -1;
myControlID = ((myJack == Left && xid == 0) ||
(myJack == Right && xid == 1)
) ? xid : -1;
}
else // Otherwise, Genesis controllers are not used in 'non-auto' mode
else
myControlID = -1;
return true;
}

View File

@ -59,20 +59,21 @@ class Genesis : public Controller
/**
Determines how this controller will treat values received from the
X/Y axis and left/right buttons of the mouse. Since not all controllers
use the mouse, it's up to the specific class to decide how to use this data.
If either of the axis is set to 'Automatic', then we automatically
use the ctrlID for the control type.
use the mouse the same way (or at all), it's up to the specific class to
decide how to use this data.
In the current implementation, the left button is tied to the X axis,
and the right one tied to the Y axis.
@param xaxis How the controller should use x-axis data
@param yaxis How the controller should use y-axis data
@param ctrlID The controller ID to use axis 'auto' mode
@param xtype The controller to use for x-axis data
@param xid The controller ID to use for x-axis data (-1 for no id)
@param ytype The controller to use for y-axis data
@param yid The controller ID to use for y-axis data (-1 for no id)
@return Whether the controller supports using the mouse
*/
void setMouseControl(
MouseControl::Axis xaxis, MouseControl::Axis yaxis, int ctrlID = -1);
bool setMouseControl(
Controller::Type xtype, int xid, Controller::Type ytype, int yid);
private:
// Pre-compute the events we care about based on given port
@ -80,7 +81,7 @@ class Genesis : public Controller
Event::Type myUpEvent, myDownEvent, myLeftEvent, myRightEvent,
myFire1Event, myFire2Event;
// Controller to emulate in mouse axis 'automatic' mode
// Controller to emulate in normal mouse axis mode
int myControlID;
};

View File

@ -120,18 +120,22 @@ void Joystick::update()
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Joystick::setMouseControl(
MouseControl::Axis xaxis, MouseControl::Axis yaxis, int ctrlID)
bool Joystick::setMouseControl(
Controller::Type xtype, int xid, Controller::Type ytype, int yid)
{
// In 'automatic' mode, both axes on the mouse map to a single normal joystick
if(xaxis == MouseControl::Automatic || yaxis == MouseControl::Automatic)
// Currently, the joystick takes full control of the mouse, using both
// axes for its two degrees of movement, and both mouse buttons for the
// single joystick button
if(xtype == Controller::Joystick && ytype == Controller::Joystick && xid == yid)
{
myControlID = ((myJack == Left && ctrlID == 0) ||
(myJack == Right && ctrlID == 1)
) ? ctrlID : -1;
myControlID = ((myJack == Left && xid == 0) ||
(myJack == Right && xid == 1)
) ? xid : -1;
}
else // Otherwise, joysticks are not used in 'non-auto' mode
else
myControlID = -1;
return true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -57,20 +57,21 @@ class Joystick : public Controller
/**
Determines how this controller will treat values received from the
X/Y axis and left/right buttons of the mouse. Since not all controllers
use the mouse, it's up to the specific class to decide how to use this data.
If either of the axis is set to 'Automatic', then we automatically
use the ctrlID for the control type.
use the mouse the same way (or at all), it's up to the specific class to
decide how to use this data.
In the current implementation, the left button is tied to the X axis,
and the right one tied to the Y axis.
@param xaxis How the controller should use x-axis data
@param yaxis How the controller should use y-axis data
@param ctrlID The controller ID to use axis 'auto' mode
@param xtype The controller to use for x-axis data
@param xid The controller ID to use for x-axis data (-1 for no id)
@param ytype The controller to use for y-axis data
@param yid The controller ID to use for y-axis data (-1 for no id)
@return Whether the controller supports using the mouse
*/
void setMouseControl(
MouseControl::Axis xaxis, MouseControl::Axis yaxis, int ctrlID = -1);
bool setMouseControl(
Controller::Type xtype, int xid, Controller::Type ytype, int yid);
/**
Sets the deadzone amount for real analog joysticks.
@ -86,7 +87,7 @@ class Joystick : public Controller
Event::Type myUpEvent, myDownEvent, myLeftEvent, myRightEvent,
myXAxisValue, myYAxisValue, myFireEvent;
// Controller to emulate in mouse axis 'automatic' mode
// Controller to emulate in normal mouse axis mode
int myControlID;
static int _DEAD_ZONE;

View File

@ -24,7 +24,8 @@
MindLink::MindLink(Jack jack, const Event& event, const System& system)
: Controller(jack, event, system, Controller::MindLink),
myMindlinkPos(0x2800),
myMindlinkShift(1)
myMindlinkShift(1),
myMouseEnabled(false)
{
myDigitalPinState[One] = true;
myDigitalPinState[Two] = true;
@ -48,6 +49,9 @@ void MindLink::update()
myDigitalPinState[Three] =
myDigitalPinState[Four] = true;
if(!myMouseEnabled)
return;
myMindlinkPos = (myMindlinkPos & 0x3fffffff) +
(myEvent.get(Event::MouseAxisXValue) << 3);
if(myMindlinkPos < 0x2800)
@ -75,3 +79,16 @@ void MindLink::nextMindlinkBit()
myMindlinkShift <<= 1;
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool MindLink::setMouseControl(
Controller::Type xtype, int xid, Controller::Type ytype, int yid)
{
// Currently, the mindlink takes full control of the mouse, but only ever
// uses the x-axis, and both mouse buttons for the single mindlink button
// As well, there's no separate setting for x and y axis, so any
// combination of Controller and id is valid
myMouseEnabled = (xtype == myType || ytype == myType) &&
(xid != -1 || yid != -1);
return true;
}

View File

@ -81,6 +81,25 @@ class MindLink : public Controller
*/
void update();
/**
Determines how this controller will treat values received from the
X/Y axis and left/right buttons of the mouse. Since not all controllers
use the mouse the same way (or at all), it's up to the specific class to
decide how to use this data.
In the current implementation, the left button is tied to the X axis,
and the right one tied to the Y axis.
@param xtype The controller to use for x-axis data
@param xid The controller ID to use for x-axis data (-1 for no id)
@param ytype The controller to use for y-axis data
@param yid The controller ID to use for y-axis data (-1 for no id)
@return Whether the controller supports using the mouse
*/
bool setMouseControl(
Controller::Type xtype, int xid, Controller::Type ytype, int yid);
private:
void nextMindlinkBit();
@ -91,6 +110,9 @@ class MindLink : public Controller
// Which bit to transfer next
int myMindlinkShift;
// Whether to use the mouse to emulate this controller
int myMouseEnabled;
};
#endif

View File

@ -531,7 +531,7 @@ bool OSystem::createConsole(const string& romfile, const string& md5sum)
//////////////////////////////////////////////////////////////////////////
myConsole->initializeAudio();
myEventHandler->reset(EventHandler::S_EMULATE);
myEventHandler->setMouseControllerMode(mySettings->getString("mcontrol"));
myEventHandler->setMouseControllerMode(mySettings->getBool("usemouse"));
if(createFrameBuffer() != kSuccess) // Takes care of initializeVideo()
{
logMessage("ERROR: Couldn't create framebuffer for console\n", 0);

View File

@ -383,17 +383,17 @@ void Paddles::update()
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Paddles::setMouseControl(
MouseControl::Axis xaxis, MouseControl::Axis yaxis, int ctrlID)
bool Paddles::setMouseControl(
Controller::Type xtype, int xid, Controller::Type ytype, int yid)
{
// In 'automatic' mode, both axes on the mouse map to a single paddle,
// and the paddle axis and direction settings are taken into account
// This overrides any other mode
if(xaxis == MouseControl::Automatic || yaxis == MouseControl::Automatic)
if(xtype == Controller::Paddles && ytype == Controller::Paddles && xid == yid)
{
myMPaddleID = ((myJack == Left && (ctrlID == 0 || ctrlID == 1)) ||
(myJack == Right && (ctrlID == 2 || ctrlID == 3))
) ? ctrlID & 0x01 : -1;
myMPaddleID = ((myJack == Left && (xid == 0 || xid == 1)) ||
(myJack == Right && (xid == 2 || xid == 3))
) ? xid & 0x01 : -1;
myMPaddleIDX = myMPaddleIDY = -1;
}
else
@ -401,37 +401,19 @@ void Paddles::setMouseControl(
// The following is somewhat complex, but we need to pre-process as much
// as possible, so that ::update() can run quickly
myMPaddleID = -1;
if(myJack == Left)
if(myJack == Left && xtype == Controller::Paddles)
{
switch(xaxis)
myMPaddleIDX = (xid == 0 || xid == 1) ? xid & 0x01 : -1;
myMPaddleIDY = (yid == 0 || yid == 1) ? yid & 0x01 : -1;
}
else if(myJack == Right && ytype == Controller::Paddles)
{
case MouseControl::Paddle0: myMPaddleIDX = 0; break;
case MouseControl::Paddle1: myMPaddleIDX = 1; break;
default: myMPaddleIDX = -1; break;
}
switch(yaxis)
{
case MouseControl::Paddle0: myMPaddleIDY = 0; break;
case MouseControl::Paddle1: myMPaddleIDY = 1; break;
default: myMPaddleIDY = -1; break;
}
}
else // myJack == Right
{
switch(xaxis)
{
case MouseControl::Paddle2: myMPaddleIDX = 0; break;
case MouseControl::Paddle3: myMPaddleIDX = 1; break;
default: myMPaddleIDX = -1; break;
}
switch(yaxis)
{
case MouseControl::Paddle2: myMPaddleIDY = 0; break;
case MouseControl::Paddle3: myMPaddleIDY = 1; break;
default: myMPaddleIDY = -1; break;
}
myMPaddleIDX = (xid == 2 || xid == 3) ? xid & 0x01 : -1;
myMPaddleIDY = (yid == 2 || yid == 3) ? yid & 0x01 : -1;
}
}
return true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -64,20 +64,21 @@ class Paddles : public Controller
/**
Determines how this controller will treat values received from the
X/Y axis and left/right buttons of the mouse. Since not all controllers
use the mouse, it's up to the specific class to decide how to use this data.
If either of the axis is set to 'Automatic', then we automatically
use the ctrlID for the control type.
use the mouse the same way (or at all), it's up to the specific class to
decide how to use this data.
In the current implementation, the left button is tied to the X axis,
and the right one tied to the Y axis.
@param xaxis How the controller should use x-axis data
@param yaxis How the controller should use y-axis data
@param ctrlID The controller ID to use axis 'auto' mode
@param xtype The controller to use for x-axis data
@param xid The controller ID to use for x-axis data (-1 for no id)
@param ytype The controller to use for y-axis data
@param yid The controller ID to use for y-axis data (-1 for no id)
@return Whether the controller supports using the mouse
*/
void setMouseControl(
MouseControl::Axis xaxis, MouseControl::Axis yaxis, int ctrlID = -1);
bool setMouseControl(
Controller::Type xtype, int xid, Controller::Type ytype, int yid);
/**
Sets the sensitivity for digital emulation of paddle movement.

View File

@ -76,7 +76,7 @@ Settings::Settings(OSystem* osystem)
setInternal("combomap", "");
setInternal("joydeadzone", "13");
setInternal("joyallow4", "false");
setInternal("mcontrol", "auto");
setInternal("usemouse", "true");
setInternal("dsense", "5");
setInternal("msense", "7");
setInternal("saport", "lr");
@ -280,10 +280,6 @@ void Settings::validate()
if(i < 0) setInternal("joydeadzone", "0");
else if(i > 29) setInternal("joydeadzone", "29");
s = getString("mcontrol");
if(s != "never" && s != "auto" && s != "rom")
setInternal("mcontrol", "auto");
if(i < 1) setInternal("dsense", "1");
else if(i > 10) setInternal("dsense", "10");
@ -373,8 +369,7 @@ void Settings::usage()
<< " -logtoconsole <1|0> Log output to console/commandline\n"
<< " -joydeadzone <number> Sets 'deadzone' area for analog joysticks (0-29)\n"
<< " -joyallow4 <1|0> Allow all 4 directions on a joystick to be pressed simultaneously\n"
<< " -mcontrol <never|auto| Use mouse axes as specified controller type (see manual)\n"
<< " rom>\n"
<< " -usemouse <1|0> Use mouse as a controller as specified by ROM properties (see manual)\n"
<< " -dsense <number> Sensitivity of digital emulated paddle movement (1-10)\n"
<< " -msense <number> Sensitivity of mouse emulated paddle movement (1-15)\n"
<< " -saport <lr|rl> How to assign virtual ports to multiple Stelladaptor/2600-daptors\n"

View File

@ -29,7 +29,8 @@ TrackBall::TrackBall(Jack jack, const Event& event, const System& system,
Type type)
: Controller(jack, event, system, type),
myHCounter(0),
myVCounter(0)
myVCounter(0),
myMouseEnabled(false)
{
// This code in ::read() is set up to always return IOPortA values in
// the lower 4 bits data value
@ -115,6 +116,9 @@ uInt8 TrackBall::read()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void TrackBall::update()
{
if(!myMouseEnabled)
return;
// Get the current mouse position
myHCounter = myEvent.get(Event::MouseAxisXValue);
myVCounter = myEvent.get(Event::MouseAxisYValue);
@ -135,6 +139,19 @@ void TrackBall::update()
(myEvent.get(Event::MouseButtonRightValue) == 0);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool TrackBall::setMouseControl(
Controller::Type xtype, int xid, Controller::Type ytype, int yid)
{
// Currently, the various trackball controllers take full control of the
// mouse, and use both mouse buttons for the single fire button
// As well, there's no separate setting for x and y axis, so any
// combination of Controller and id is valid
myMouseEnabled = (xtype == myType || ytype == myType) &&
(xid != -1 || yid != -1);
return true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
const uInt32 TrackBall::ourTrakBallTableTB_H[2][2] = {
{ 0x40, 0x00 }, { 0xc0, 0x80 }

View File

@ -71,6 +71,25 @@ class TrackBall : public Controller
*/
void update();
/**
Determines how this controller will treat values received from the
X/Y axis and left/right buttons of the mouse. Since not all controllers
use the mouse the same way (or at all), it's up to the specific class to
decide how to use this data.
In the current implementation, the left button is tied to the X axis,
and the right one tied to the Y axis.
@param xtype The controller to use for x-axis data
@param xid The controller ID to use for x-axis data (-1 for no id)
@param ytype The controller to use for y-axis data
@param yid The controller ID to use for y-axis data (-1 for no id)
@return Whether the controller supports using the mouse
*/
bool setMouseControl(
Controller::Type xtype, int xid, Controller::Type ytype, int yid);
private:
// Counter to iterate through the gray codes
int myHCounter, myVCounter;
@ -89,6 +108,9 @@ class TrackBall : public Controller
int myScanCountH, myScanCountV, myCountH, myCountV;
// Whether to use the mouse to emulate this controller
int myMouseEnabled;
// CX-22
static const uInt32 ourTrakBallTableTB_H[2][2];
static const uInt32 ourTrakBallTableTB_V[2][2];

View File

@ -402,14 +402,6 @@
"Controller.MouseAxis" "01"
""
"Cartridge.MD5" "c246e05b52f68ab2e9aee40f278cd158"
"Cartridge.Manufacturer" "Thomas Jentzsch"
"Cartridge.Name" "Star Wars - Ewok Adventure (Thomas Jentzsch) (Prototype)"
"Cartridge.Note" "NTSC Conversion"
"Cartridge.Rarity" "Homebrew"
"Display.Height" "230"
""
"Cartridge.MD5" "7b5207e68ee85b16998bea861987c690"
"Cartridge.Manufacturer" "Atari, Carol Shaw"
"Cartridge.ModelNo" "CX26163P"
@ -421,6 +413,14 @@
"Cartridge.Name" "Fu Kung! (V0.16) (2003) (AD)"
""
"Cartridge.MD5" "c246e05b52f68ab2e9aee40f278cd158"
"Cartridge.Manufacturer" "Thomas Jentzsch"
"Cartridge.Name" "Star Wars - Ewok Adventure (Thomas Jentzsch) (Prototype)"
"Cartridge.Note" "NTSC Conversion"
"Cartridge.Rarity" "Homebrew"
"Display.Height" "230"
""
"Cartridge.MD5" "cba56e939252b05df7b7de87307d12ca"
"Cartridge.Name" "Playfield Text Demo (2001) (Roger Williams)"
""
@ -760,11 +760,6 @@
"Cartridge.Rarity" "Prototype"
""
"Cartridge.MD5" "bdf1996e2dd64baf8eff5511811ca6ca"
"Cartridge.Manufacturer" "Tron"
"Cartridge.Name" "H.E.R.O. (Tron)"
""
"Cartridge.MD5" "81414174f1816d5c1e583af427ac89fc"
"Cartridge.Manufacturer" "Thomas Jentzsch"
"Cartridge.Name" "Treasure Below (Thomas Jentzsch)"
@ -782,6 +777,11 @@
"Cartridge.Note" "AKA International Soccer"
""
"Cartridge.MD5" "bdf1996e2dd64baf8eff5511811ca6ca"
"Cartridge.Manufacturer" "Tron"
"Cartridge.Name" "H.E.R.O. (Tron)"
""
"Cartridge.MD5" "521f4dd1eb84a09b2b19959a41839aad"
"Cartridge.Manufacturer" "Bit Corporation"
"Cartridge.ModelNo" "PG206"
@ -3581,7 +3581,10 @@
"Cartridge.Manufacturer" "M Network, Hal Finney - INTV"
"Cartridge.ModelNo" "MT5666"
"Cartridge.Name" "Astroblast (1982) (M Network)"
"Cartridge.Note" "Can also use left joystick"
"Cartridge.Rarity" "Uncommon"
"Controller.Left" "PADDLES"
"Controller.SwapPaddles" "YES"
""
"Cartridge.MD5" "db971b6afc9d243f614ebf380af0ac60"
@ -5676,6 +5679,15 @@
"Cartridge.Note" "AKA Chuck Norris Superkicks"
""
"Cartridge.MD5" "90b647bfb6b18af35fcf613573ad2eec"
"Cartridge.Manufacturer" "AtariAge (Chris Walton)"
"Cartridge.Name" "Juno First (2009)"
"Cartridge.Note" "AtariVox supported"
"Cartridge.Rarity" "Homebrew"
"Controller.Right" "ATARIVOX"
"Display.Phosphor" "YES"
""
"Cartridge.MD5" "f8240e62d8c0a64a61e19388414e3104"
"Cartridge.Manufacturer" "Activision, Steve Cartwright"
"Cartridge.ModelNo" "AX-013"
@ -11041,7 +11053,10 @@
"Cartridge.Manufacturer" "M Network, Hal Finney - INTV"
"Cartridge.ModelNo" "MT5666"
"Cartridge.Name" "Astroblast (1982) (M Network) [fixed]"
"Cartridge.Note" "Can also use left joystick"
"Cartridge.Rarity" "Uncommon"
"Controller.Left" "PADDLES"
"Controller.SwapPaddles" "YES"
""
"Cartridge.MD5" "047ac3b9faea64522b7a23c4465a7aa8"
@ -12621,7 +12636,6 @@
"Cartridge.Note" "Uses the Paddle Controllers"
"Controller.Left" "PADDLES"
"Controller.Right" "PADDLES"
"Controller.MouseAxis" "01"
""
"Cartridge.MD5" "75028162bfc4cc8e74b04e320f9e6a3f"
@ -14296,7 +14310,10 @@
"Cartridge.MD5" "3d7aad37c55692814211c8b590a0334c"
"Cartridge.Manufacturer" "Atari, Dan Oliver"
"Cartridge.Name" "Telepathy (1983) (Atari) (Prototype)"
"Cartridge.Note" "Uses both left joystick and right Mindlink controllers (press Fire on respective controller to begin)"
"Cartridge.Rarity" "Prototype"
"Controller.Right" "MINDLINK"
"Controller.MouseAxis" "78"
""
"Cartridge.MD5" "f777444fc21a5925e066b68b1d350575"
@ -15889,6 +15906,9 @@
"Cartridge.MD5" "46e9428848c9ea71a4d8f91ff81ac9cc"
"Cartridge.Manufacturer" "Telegames"
"Cartridge.Name" "Astroblast (1989) (Telegames) (PAL)"
"Cartridge.Note" "Can also use left joystick"
"Controller.Left" "PADDLES"
"Controller.SwapPaddles" "YES"
""
"Cartridge.MD5" "43c7eb836378b1b3df6788d908940b59"
@ -19568,6 +19588,16 @@
"Cartridge.Rarity" "Hack"
""
"Cartridge.MD5" "fa98d48cd609c9babc819e0a1bd8d598"
"Cartridge.Manufacturer" "AtariAge (Chris Walton)"
"Cartridge.Name" "Juno First (2009) (PAL60)"
"Cartridge.Note" "AtariVox supported"
"Cartridge.Rarity" "Homebrew"
"Controller.Right" "ATARIVOX"
"Display.Format" "PAL60"
"Display.Phosphor" "YES"
""
"Cartridge.MD5" "c59633dbebd926c150fb6d30b0576405"
"Cartridge.Manufacturer" "Telegames"
"Cartridge.ModelNo" "5861 A030"
@ -19944,21 +19974,3 @@
"Cartridge.Name" "Seaquest (Digivision)"
""
"Cartridge.MD5" "90b647bfb6b18af35fcf613573ad2eec"
"Cartridge.Manufacturer" "AtariAge (Chris Walton)"
"Cartridge.Name" "Juno First (2009)"
"Cartridge.Note" "AtariVox supported"
"Cartridge.Rarity" "Homebrew"
"Controller.Right" "ATARIVOX"
"Display.Phosphor" "YES"
""
"Cartridge.MD5" "fa98d48cd609c9babc819e0a1bd8d598"
"Cartridge.Manufacturer" "AtariAge (Chris Walton)"
"Cartridge.Name" "Juno First (2009) (PAL60)"
"Cartridge.Note" "AtariVox supported"
"Cartridge.Rarity" "Homebrew"
"Controller.Right" "ATARIVOX"
"Display.Format" "PAL60"
"Display.Phosphor" "YES"
""

View File

@ -21,6 +21,7 @@
//============================================================================
#include "Console.hxx"
#include "MouseControl.hxx"
#include "Dialog.hxx"
#include "EditTextWidget.hxx"
#include "Launcher.hxx"
@ -300,14 +301,17 @@ GameInfoDialog::GameInfoDialog(
// Mouse controller specific axis
lwidth = font.getStringWidth("X-Axis is: ");
pwidth = font.getStringWidth("Driving 0");
pwidth = font.getStringWidth("MindLink 0");
items.clear();
items.push_back("None", BSPF_toString(MouseControl::NoControl));
items.push_back("Paddle 0", BSPF_toString(MouseControl::Paddle0));
items.push_back("Paddle 1", BSPF_toString(MouseControl::Paddle1));
items.push_back("Paddle 2", BSPF_toString(MouseControl::Paddle2));
items.push_back("Paddle 3", BSPF_toString(MouseControl::Paddle3));
items.push_back("Driving 0", BSPF_toString(MouseControl::Driving0));
items.push_back("Driving 1", BSPF_toString(MouseControl::Driving1));
items.push_back("MindLink 0", BSPF_toString(MouseControl::MindLink0));
items.push_back("MindLink 1", BSPF_toString(MouseControl::MindLink1));
xpos = 45; ypos += lineHeight + 4;
myMouseX = new PopUpWidget(myTab, font, xpos, ypos, pwidth, lineHeight, items,

View File

@ -190,17 +190,10 @@ void InputDialog::addDevicePortTab(const GUI::Font& font)
myGrabMouse->clearFlags(WIDGET_ENABLED);
#endif
// Mouse is controller type
ypos += lineHeight + 12;
lwidth = font.getStringWidth("Use mouse as a controller: ");
pwidth = font.getStringWidth("Automatic");
items.clear();
items.push_back("Never", "never");
items.push_back("Automatic", "auto");
items.push_back("By ROM", "rom");
myMouseControl =
new PopUpWidget(myTab, font, xpos, ypos, pwidth, lineHeight, items,
"Use mouse as a controller: ", lwidth);
// Use mouse as a controller
ypos += lineHeight + 4;
myMouseControl = new CheckboxWidget(myTab, font, xpos, ypos,
"Use mouse as a controller");
wid.push_back(myMouseControl);
// Add items for virtual device ports
@ -233,9 +226,8 @@ void InputDialog::loadConfig()
// Allow all 4 joystick directions
myAllowAll4->setState(instance().settings().getBool("joyallow4"));
// Mouse is controller type
myMouseControl->setSelected(
instance().settings().getString("mcontrol"), "auto");
// Use mouse as a controller
myMouseControl->setState(instance().settings().getBool("usemouse"));
myTab->loadConfig();
}
@ -271,10 +263,10 @@ void InputDialog::saveConfig()
instance().settings().setBool("joyallow4", allowall4);
instance().eventHandler().allowAllDirections(allowall4);
// Mouse is controller type
const string& mcontrol = myMouseControl->getSelectedTag();
instance().settings().setString("mcontrol", mcontrol);
instance().eventHandler().setMouseControllerMode(mcontrol);
// Use mouse as a controller
bool usemouse = myMouseControl->getState();
instance().settings().setBool("usemouse", usemouse);
instance().eventHandler().setMouseControllerMode(usemouse);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -314,8 +306,8 @@ void InputDialog::setDefaults()
// Allow all 4 joystick directions
myAllowAll4->setState(false);
// Mouse is controller type
myMouseControl->setSelected(1);
// Use mouse as a controller
myMouseControl->setState(true);
break;
}

View File

@ -78,7 +78,7 @@ class InputDialog : public Dialog
StaticTextWidget* myMPaddleLabel;
CheckboxWidget* myAllowAll4;
CheckboxWidget* myGrabMouse;
PopUpWidget* myMouseControl;
CheckboxWidget* myMouseControl;
};
#endif