diff --git a/docs/index.html b/docs/index.html index b4c840a10..677851a23 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1057,8 +1057,18 @@ <tr><td>Start game #2</td><td>9 (same as Right Pad Button '2')</td></tr> <tr><td>Start game #3</td><td>0 (same as Right Pad Button '3')</td></tr> <tr><td>Skip current song</br> - (except initial songs of Berenstain Bears and Harmony Smurf) + (except initial songs of Berenstain Bears and Harmony Smurf) </td><td>P (same as Right Pad Button '6')</td></tr> + <tr> + <td colspan="3"> + The games can also be started with the 'Select Game' key. The + settings of the difficulty switches</br>determine which game is started. + <ul> + <li>Left = B, Right = B: Start game #1</li> + <li>Left = A, Right = B: Start game #2</li> + <li>Left = B, Right = A: Start game #3</li> + </ul></td> + </tr> </table> </br> diff --git a/src/emucore/Console.cxx b/src/emucore/Console.cxx index 9e34d0ed8..ebe3d43b4 100644 --- a/src/emucore/Console.cxx +++ b/src/emucore/Console.cxx @@ -1028,8 +1028,7 @@ unique_ptr<Controller> Console::getControllerPort(const Controller::Type type, break; case Controller::Type::KidVid: - controller = make_unique<KidVid>(port, myEvent, *mySystem, myOSystem.baseDir().getPath(), - myOSystem.sound(), romMd5); + controller = make_unique<KidVid>(port, myEvent, myOSystem, *mySystem, romMd5); break; case Controller::Type::MindLink: diff --git a/src/emucore/KidVid.cxx b/src/emucore/KidVid.cxx index ec145a3a5..a8849df15 100644 --- a/src/emucore/KidVid.cxx +++ b/src/emucore/KidVid.cxx @@ -15,17 +15,21 @@ // this file, and for a DISCLAIMER OF ALL WARRANTIES. //============================================================================ +#include "Console.hxx" #include "Event.hxx" +#include "FSNode.hxx" +#include "OSystem.hxx" #include "Sound.hxx" +#include "Switches.hxx" + #include "KidVid.hxx" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -KidVid::KidVid(Jack jack, const Event& event, const System& system, - const string& baseDir, Sound& sound, const string& romMd5) +KidVid::KidVid(Jack jack, const Event& event, const OSystem& osystem, + const System& system, const string& romMd5) : Controller(jack, event, system, Controller::Type::KidVid), myEnabled{myJack == Jack::Right}, - myBaseDir{baseDir}, - mySound{sound} + myOSystem{osystem} { // Right now, there are only two games that use the KidVid if(romMd5 == "ee6665683ebdb539e89ba620981cb0f6") @@ -65,8 +69,8 @@ void KidVid::update() const uInt32 songLength = ourSongStart[temp + 1] - ourSongStart[temp]; // Play the remaining WAV file - const string& fileName = myBaseDir + ((temp < 10) ? "KVSHARED.WAV" : getFileName()); - mySound.playWav(fileName, ourSongStart[temp] + (songLength - mySongLength), mySongLength); + const string& fileName = myOSystem.baseDir().getPath() + ((temp < 10) ? "KVSHARED.WAV" : getFileName()); + myOSystem.sound().playWav(fileName, ourSongStart[temp] + (songLength - mySongLength), mySongLength); myContinueSong = false; } @@ -75,7 +79,7 @@ void KidVid::update() { myTape = 0; // rewind Kid Vid tape myFilesFound = mySongPlaying = false; - mySound.stopWav(); + myOSystem.sound().stopWav(); } else if(myEvent.get(Event::RightKeyboard6)) { @@ -83,7 +87,7 @@ void KidVid::update() if(mySongPointer && ourSongPositions[mySongPointer - 1] != 0 && // First song of all BBears games ourSongPositions[mySongPointer - 1] != 11) // First song of Harmony Smurf - mySound.stopWav(); + myOSystem.sound().stopWav(); } if(!myTape) { @@ -93,6 +97,21 @@ void KidVid::update() myTape = 3; else if(myEvent.get(Event::RightKeyboard3)) myTape = myGame == Game::BBears ? 4 : 1; // Berenstain Bears or Smurfs Save The Day? + // If no Keyboard controller is available, use SELECT and the same + // switches settings as for playing Smurfs without a Kid Vid. + else if(myEvent.get(Event::ConsoleSelect) && myOSystem.hasConsole()) + { + // Harmony (2) : A B + // Handy (3) : B A + // Greedy (1/4): B B + myTape = 1 + + (myOSystem.console().switches().leftDifficultyA() ? 1 : 0) + + (myOSystem.console().switches().rightDifficultyA() ? 2 : 0); + if(myTape == 4) // ignore A A + myTape = 0; + else if(myTape == 1 && myGame == Game::BBears) + myTape = 4; + } if(myTape) { myIdx = myGame == Game::BBears ? NumBlockBits : 0; // KVData48/KVData44 @@ -138,7 +157,7 @@ void KidVid::update() { if(mySongPlaying) { - mySongLength = mySound.wavSize(); + mySongLength = myOSystem.sound().wavSize(); myTapeBusy = (mySongLength > 262 * ClickFrames) || !myBeep; // Check for end of played sample if(mySongLength == 0) @@ -231,11 +250,8 @@ void KidVid::openSampleFiles() int i = myGame == Game::Smurfs ? myTape - 1 : myTape + 2; if(myTape == 4) i = 3; - std::ifstream f1, f2; - f1.open(myBaseDir + getFileName()); - f2.open(myBaseDir + "KVSHARED.WAV"); - - myFilesFound = f1.is_open() && f2.is_open(); + myFilesFound = FSNode(myOSystem.baseDir().getPath() + getFileName()).exists() && + FSNode(myOSystem.baseDir().getPath() + "KVSHARED.WAV").exists(); #ifdef DEBUG_BUILD if(myFilesFound) @@ -262,7 +278,8 @@ void KidVid::setNextSong() // Play the WAV file const string& fileName = (temp < 10) ? "KVSHARED.WAV" : getFileName(); - mySound.playWav(myBaseDir + fileName, ourSongStart[temp], mySongLength); + myOSystem.sound().playWav(myOSystem.baseDir().getPath() + fileName, + ourSongStart[temp], mySongLength); #ifdef DEBUG_BUILD cerr << fileName << ": " << (ourSongPositions[mySongPointer] & 0x7f) << endl; #endif diff --git a/src/emucore/KidVid.hxx b/src/emucore/KidVid.hxx index c845f20cd..2fc854f17 100644 --- a/src/emucore/KidVid.hxx +++ b/src/emucore/KidVid.hxx @@ -41,13 +41,14 @@ class KidVid : public Controller /** Create a new KidVid controller plugged into the specified jack - @param jack The jack the controller is plugged into - @param event The event object to use for events - @param system The system using this controller - @param romMd5 The md5 of the ROM using this controller + @param jack The jack the controller is plugged into + @param event The event object to use for events + @param osystem The OSystem object to use + @param system The system using this controller + @param romMd5 The md5 of the ROM using this controller */ - KidVid(Jack jack, const Event& event, const System& system, - const string& baseDir, Sound& sound, const string& romMd5); + KidVid(Jack jack, const Event& event, const OSystem& osystem, + const System& system, const string& romMd5); ~KidVid() override = default; public: @@ -115,8 +116,7 @@ class KidVid : public Controller // supports, and if it's plugged into the right port) bool myEnabled{false}; - string myBaseDir; - Sound& mySound; + const OSystem& myOSystem; // Indicates if the sample files have been found bool myFilesFound{false};