DS: Backported 0.12 changes to trunk

svn-id: r34568
This commit is contained in:
Max Horn 2008-09-15 22:43:20 +00:00
parent 880bc085b1
commit 05d78c26b4
18 changed files with 1939 additions and 311 deletions

View File

@ -416,6 +416,7 @@ FILE* std_fopen(const char* name, const char* mode) {
if (DS::isGBAMPAvailable()) {
FAT_chdir("/");
// Turn all back slashes into forward slashes for gba_nds_fat
char* p = realName;
while (*p) {
if (*p == '\\') *p = '/';
@ -441,6 +442,7 @@ FILE* std_fopen(const char* name, const char* mode) {
int r = 0;
while (handle[r].used) r++;
#ifdef GBA_SRAM_SAVE
if (strchr(mode, 'w')) {
// consolePrintf("Writing %s\n", realName);
handle[r].sramFile = (DSSaveFile *) DSSaveFileManager::instance()->openSavefile(realName, true);
@ -448,6 +450,7 @@ FILE* std_fopen(const char* name, const char* mode) {
// consolePrintf("Reading %s\n", realName);
handle[r].sramFile = (DSSaveFile *) DSSaveFileManager::instance()->openSavefile(realName, false);
}
#endif
if (handle[r].sramFile) {
handle[r].used = true;

View File

@ -0,0 +1,840 @@
The official port of ScummVM
to the Nintendo DS handheld console
by Neil Millstone (agentq)
http://scummvm.drunkencoders.com
------------------------------------------------------------------------
Visit the main ScummVM website <http://www.scummvm.org>
Contents
------------------------------------------------------------------------
* What's New?
* What is ScummVM DS?
* Features
* Screenshots
* How to Get ScummVM DS Onto Your DS - Simple Explanation
o Using a CF/SD/Mini SD/Micro SD card reader and a DLDI driver
o Instructions for specific card readers
* What to do if saving doesn't work or your card gets corruped -
force SRAM saves
* How to use ScummVM DS
* Game Specific Controls
* DS Options Screen
* Which games are compatible with ScummVM DS
* Predictive dictionary for Sierra AGI games
* Converting your CD audio
* Converting speech to MP3 format
* Frequently Asked Questions
* Downloads
* Contributors
* Donations and Getting Help
* Building from Sources
What's New?
------------------------------------------------------------------------
ScummVM DS 0.12.0
* New games supported: Lure of the Temptress, Nippon Safes, Lost in Time.
* New laptop-style trackpad input method. Uses relative movement when you
drag on the touch screen.
* New option which allows you to drag to hover, tap the touch screen to
click, and double tap the screen to right click.
* Reorganised DS Options screen into three tabs for clearer navigation
* New top screen scaling options let you choose the scaling factor used
on startup.
* The usual round of bug fixes.
ScummVM DS 0.11.1
* Bugfix release - No new DS port features
ScummVM DS 0.11.0
* New games supported: Elvira 1 and 2, Waxworks (Amiga version)
* Software scaler for improved image quality. Turn it on using the DS options
screen (press select during the game). Thanks to Tramboi and Robin Watts for
this feature!
* Function keys added to virtual keyboard (used in AGI games)
* Plenty of bug fixes
What is ScummVM DS?
------------------------------------------------------------------------
ScummVM DS is a part of the ScummVM project. The ScummVM project is an
attempt to re-engineer many classic point and click adventure games of the
80s and 90s to run on modern computer hardware. Technology has changed a
lot since these games were written, and so ScummVM attempts to replicate the
gameplay of the original games in exacting details, without any of the original
code that the game ran on. ScummVM needs a copy of the original game, in order
to take the graphics, sound, and scripts that made the game work.
ScummVM is written in such a way that it can be 'ported' from one type of
machine to another, and ScummVM DS is a port of ScummVM to the Nintendo DS
handheld games console.
Features
------------------------------------------------------------------------
* Runs nearly all of Lucasarts' SCUMM games up to and including Sam
& Max Hit the Road
* Runs many non-Lucasarts point-and-click adventures too
* Supports sound
* Provides a GUI to change settings and choose games
* Supports using the DS touch screen for controls
* Suports saving games to compatible flash cards
* All games run at pretty much full speed
How to Get ScummVM DS Onto Your DS - Simple Explanation
------------------------------------------------------------------------
Nintendo don't want you to run ScummVM on your DS. They control
which companies can make games on the DS, and there is an expensive
process to go through in order to be licenced. Having to pay for
this would prevent me from giving away ScummVM for free.
So, the result is that to run ScummVM on your DS you'll need an
unofficial card reader. There are many of these, and all are different.
Popular models at the time of writing are the R4DS and the M3DS Real,
but many different models work. You need to buy one of these, and at
MicroSD card to go with it.
There are also slot-2 card readers which fit into the bottom slot on
your DS, usually used for Game Boy Advance games. These are less common
these days, and although they have certain advantages, the details of
these are beyond the scope of this website. Information on these is
quite easy to find by searching.
Once you have your card reader and a MicroSD card, you will also need
a copy of the game you want to run. ScummVM can run a large variety
of games, but you must own a real boxed copy of the game. These games
are still under copyright, and it is illegal to copy them from a friend
or download them from the Internet without paying. The exception to
this are the three Revolution Software games. These are 'Beneath a
Steel Sky', 'Lure of the Temptress' and 'Flight of the Amazon Queen'.
Revolution have kindly allowed us to give these games away for free.
You can download them from the main ScummVM site at
<http://www.scummvm.org/downloads.php>
NOTE: Previous version of ScummVM DS supported a method which used a
zip file to run games on unsupported flash card readers. This method
is no longer supported.
How to Get ScummVM DS Onto Your DS - Using a CF/SD/Mini SD/Micro
SD card reader and a DLDI driver
------------------------------------------------------------------------
ScummVM DS needs something called a DLDI driver to run on each make
and model of card reader. Many modern card readers (R4DS, M3 DS Real)
handle this autmatically and for those, you don't have to do anything.
Just running ScummVM on the card will handle this step for you.
For others, you will need to follow the steps in this section before
ScummVM DS will work.
All DS card readers are different in the way that they work. In order to
support many different card readers, ScummVM DS uses a DLDI driver installed
into the ScummVM DS code. This is done using a program called DLDITool
which you can download and run on your computer. Each DLDI driver is
designed to tell ScummVM DS how to use a specific type of card reader.
These drivers can be used with any homebrew program which supports the
DLDI interface.
While each card reader should work with these instructions, there are
some exceptions. Please read the card reader notes
section to see if there is any specific information about your card reader.
Here is what you need to do:
* Visit the DLDI page <http://dldi.drunkencoders.com/> and
download the executable for DLDITool for your operating system
(versions are available for Windows, Linux, and MacOS)
* Download the DLDI for your card reader. This is the big table at
the top of the page. The first column marked DLDI is the one you
want. You should get a single file with a .dldi extension.
* Extract DLDITool into a folder, and put the DLDI of your choice in
the same folder.
* If you're using the command line version of DLDITool enter the
following at a command prompt:
dlditool <dldiname> <scummvm nds name>
If you're using the Windows GUI version, double click on
dlditool32.exe, select your card reader from the box, drag your
ScummVM binaries (either the .nds, or the .ds.gba version
depending on your card reader. I think only Supercards use the
.ds.gba files) into the lower box, then click patch.
Either way, you should see 'Patched Successfully'. If you don't,
you're doing something wrong.
You need to patch one of the builds labeled A - F depending on
which game you want to run. See the table on the ScummVM DS
website to see which games are supported by which build.
* Put the patched .nds or .ds.gba files on your flash card. If
you're using the Supercard, you will need to use the .ds.gba
files, but rename them to .nds.
* Put your game data in any folder on the card. Do NOT use a zip file.
* Boot up your DS and run ScummVM.
* Click 'Add Game', browse to the folder with your game data, click
'Choose', then 'OK'. Click 'Start' to run the game.
If your copy of ScummVM DS has been successfully patched, you will get a
message on the top screen that looks like this:
DLDI Device:
GBA Movie Player (Compact Flash)
The message should show the name of your card reader. If it is wrong,
you have used the wrong DLDI file.
If you haven't patched your .nds file, you will get the following message
DLDI Driver not patched!
DLDI Initialise failed.
In this case, you've made a mistake following the above instructions, or
have patched the wrong file.
You may also see the following message:
DLDI Device:
GBA Movie Player (Compact Flash)
DLDI Initialise failed.
In this case, the driver did not start up correctly. The driver is
probably broken, or you've used the wrong one for your card reader.
In the case of the Supercard, M3 Lite and DS Link, there are several
drivers available. You might want to try one of the others.
This version of ScummVM DS will run on any card reader that has a DLDI
driver available. If yours doesn't, you need to pressure your card
reader manufacturer to release one.
DO NOT EMAIL ME TO ASK ME TO CREATE A DRIVER FOR YOUR CARD READER, I
CANNOT DO THIS.
How to Get ScummVM DS Onto Your DS - Instructions for specific
card readers
------------------------------------------------------------------------
* *GBAMP CF:* You need to upload replacement firmware to your card
reader before it will work. You can download the firmware program
here <http://chishm.drunkencoders.com/NDSMP/index.html>. Name your
.nds file _BOOT_MP.nds.
* *M3 CF/SD:* Copy the .nds file to your card with the M3 Game
Manager in order to avoid an annoying message when you boot your
M3. Use the default options to copy the file. Be sure to press 'A'
in the M3 browser to start the .nds file, and not 'Start', or it
won't work.
* *M3 CF/SD:* Copy the .nds file to your card with the M3 Game
Manager in order to avoid an annoying message when you boot your
M3. Use the default options to copy the file. Be sure to press 'A'
in the M3 browser to start the .nds file, and not 'Start', or it
won't work.
* *Supercard CF/SD (slot-2):* Use the .ds.gba files to run ScummVM
on the Supercard. Other than that, just follow the instructions as
normal.
* *Supercard Lite (slot-2):* It has been reported that only the
standard Supercard driver and the Moonshell version work with
ScummVM DS.
* *Datel Max Media Dock: * If you haven't already, upgrade your
firmware to the latest version. The firmware that came with my Max
Media Dock was unable to run ScummVM DS at all. Click here to
visit Datel's support page and download the latest firmware
<http://us.codejunkies.com/mpds/support.htm>
* *NinjaDS*: There are firmware upgrades for this device, but for
me, ScummVM DS ran straight out of the box. Visit this page
<http://www.ninjads.com/news.html> to download the latest firmware
if you want. If you have installed FlashMe on your DS, it will
make your DS crash on boot when the NinjaDS is inserted. You can
hold the 'select' button during boot to disable FlashMe, which
will allow the NinjaDS to work. Due to this, it is not recommended
to install FlashMe if you use a NinjaDS.
* *EZ-Flash*: This card reader uses .ds.gba files from the ScummVM
archive. Rename them to .nds before patching them with the DLDI
patcher.
* *R4DS*: If you upgrade the firmware for your R4DS to version 1.10
or later, the card will autmatically DLDI patch the game, meaning
you don't have to use dlditool to patch the .NDS file. This makes
things a lot easier!
* *M3DS Real*: This card autmatically DLDI patches the game, meaning
that you do not need to do this yourself.
Which games are compatible with ScummVM DS?
------------------------------------------------------------------------
I'm glad you asked. Here is a list of the compatible games in version
0.12.0. Demo versions of the games listed should work too.
Flight of the Amazon Queen, Beneath a Steel Sky, and Lure of the
Temptress have generously been released as freeware by the original
authors, Revolution Software <http://www.revolution.co.uk/>. This is a
great thing and we should support Revolution for being so kind to us.
You can download the game data from the official ScummVM download page
<http://www.scummvm.org/downloads.php>.
The other games on this list are commercial, and still under copyright,
which means downloading them without paying for it is illegal. You can
probably find a second-hand copy on eBay. Please don't email me to ask
for a copy, as I am unable to send it to you.
Game Build Notes
Manic Mansion A
Zak McKracken and the Alien Mindbenders A
Indiana Jones and the Last Crusade A
Loom A
Passport to Adventure A
The Secret of Monkey Island A
Monkey Island 2: LeChuck's Revenge A
Indiana Jones and the Fate of Atlantis A
Day of the Tentacle A
Sam & Max Hit the Road A Some slowdown in a few scenes
when MP3 audio is enabled
Bear Stormin' (DOS) A
Fatty Bear's Birthday Surprise (DOS) A
Fatty Bear's Fun Pack (DOS) A
Putt-Putt's Fun Pack (DOS) A
Putt-Putt Goes to the Moon (DOS) A
Putt-Putt Joins the Parade (DOS) A Can sometimes crash due to low memory
Beneath a Steel Sky B
Flight of the Amazon Queen B
Simon the Sorcerer 1 C Zoomed view does not follow the
speaking character
Simon the Sorcerer 2 C Zoomed view does not follow the
speaking character
Elvira 1 C
Elvira 2 C
Waxworks (Amiga version) C
Gobliiins D
Gobliins 2 D
Goblins 3 D
Ween: The Prophecy D
Bargon Attack D
Lost in Time D
Future Wars D
All Sierra AGI games.
For a complete list, see this page
<http://wiki.scummvm.org/index.php/AGI> D
Inherit the Earth E
The Legend of Kyrandia F Zoomed view does not follow the
speaking character
Lure of the Temptress G
Nippon Safes G
There is no support for Full Throttle, The Dig, or The Curse of Monkey
Island because of memory issues. There simply is not enough RAM on the
DS to run these games. Sorry. Also there is no support for Windows Humongous
Entertainment games. The extra code required to make this work uses up
too much RAM.
What to do when saving doesn't work or your card gets corrupted -
forcing SRAM Saves
------------------------------------------------------------------------
This method only works for cards which use the Game Boy Advance slot on the
bottom of your DS.
If ScummVM DS cannot save games to your SD card, or it causes corruption
when it does, you can force it to use GBA SRAM to save the game. This
uses your flash cart reader's GBA features to save the game to a .sav or
.dat file (depending on the reader). Only slot-2 devices can use SRAM saves,
and only ones with support for GBA games.
If you want to use SRAM save, just create a text file called scummvm.ini
(or scummvmb.ini, scummvmc.ini for builds B or C) in the root of your
card which contains the following:
[ds]
forcesramsave=true
When you boot your game, ScummVM DS will not save games to your SD card
directly, instead it will save to GBA SRAM. On most cards, you need to
transfer the data to your SD card by rebooting and using your card
reader's boot-up menu. Using this method, around four saves can me made.
One disadvantage of forcing SRAM saves is that your settings won't be
saved. You can add games manually to the ini file so that you don't have
to select them on each boot. Just add a section like the following on
for each game on your card.
[monkey2]
description=Monkey Island 2: LeChuck's Revenge (English/DOS)
path=mp:/MONKEY2
How to Use ScummVM
------------------------------------------------------------------------
Once you've booted up ScummVM, you'll see the start up screen.
1. Tap the 'Add' button with the pen, then browse to the folder
containing your game data. Once you have clicked on your folder, you will
not see any files inside. This is normal, as the folder selector only shows
folders!
2. Click the 'Choose' button.
3. You will get some options for the game. You can usually just click 'Ok' to
this.
4. Now click on the name of the game you want to play from the list and
click 'Start'. Your game will start!
You can use the B button to skip cutscenes, and the select button to
show an options menu which will let you tweak the DS contols, including
switch between scaled and unscaled video modes. The text is clearer in
the unscaled mode, but the whole game doesn't fit on the screen. To
scroll around, hold either shoulder button and use the D-pad or drag the
screen around with the stylus. Even in scaled mode, a small amount is
missing from the top and bottom of the screen. You can scroll around to
see those areas. The top screen shows a zoomed-in view. This scrolls
around to focus on the character who's speaking, and also follows where
the pen touches the screen. You can change the zoom level by holding one
of the shoulder buttons and pressing B to zoom in and A to zoom out.
Press the start button for the in-game menu where you can load or save
your game (this works in Lucasarts games, other games vary). Saves will
write directly to your flash card. You can choose the folder where they
are stored using the GUI that appears when you boot up. If you're using
a GBA Flash Cartridge, or an unsupported flash card adaptor, you will be
using GBA SRAM to save your game. Four or five save game will fit in
save RAM. If you save more games than will fit, a warning will appear on
the top screen. When you turn your DS off, the new save will be lost,
and only the first ones you saved will be present.
Many of the games use both mouse buttons. Usually the right button often
performs the default action on any object you click on. To simulate this
with the DS pen, you can switch the input into one of three modes. Press
left on the D-pad to enable the left mouse button. Press right on the
D-pad to enable the right mouse button. Press up on the D-pad to enable
hover mode. In this mode, you won't click on anything, just hover the
mouse cursor over it. This lets you pick out active objects in the scene.
An icon on the top screen will show you which mode you're in.
In hover mode, there are some additional controls. While holding the pen
on the screen, tapping D-pad left or D-pad right (or A/Y in left handed
mode) will click the left or right mouse button.
There is an alternative method of control which doesn't require you to
change modes with the D-pad. Press 'Select' to bring up the DS options,
and choose 'Tap for left click, double tap for right click'. In this
mode, you can quickly tap the screen to left click the mouse, and tap twice
to right click the mouse.
Here is a complete list of controls in right-handed mode (the default
setting):
Key Usage
Pad Left Left mouse button
Pad Right Right mouse button
Pad Up Hover mouse (no mouse button)
Pad Down Skip dialogue line (for some Lucasarts games), Show inventory
(for Beneath a Steel Sky), Show active objects (for Simon the Sorceror)
Start Pause/game menu (works in some games)
Select DS Options
B Skip cutscenes
A Swap main screen and zoomed screen
Y Show/Hide debug console
X Show/Hide on-screen keyboard
L + D-pad or L + Pen Scroll touch screen view
L + B Zoom in
L + A Zoom out
And here's left-handed mode:
Key Usage
Y Left mouse button
A Right mouse button
X Hover mouse (no mouse button)
B Skip dialogue line (for some Lucasarts games), Show inventory (for
Beneath a Steel Sky), Show active objects (for Simon the Sorceror)
Start Pause/game menu (works in some games)
Select DS Options
D-pad down Skip cutscenes
D-pad up Swap main screen and zoomed screen
D-pad left Show/Hide debug console
D-pad right Show/Hide on-screen keyboard
R + D-pad or R + Pen Scroll touch screen view
R + D-pad down Zoom in
R + d-pad right Zoom out
Game-specific controls
------------------------------------------------------------------------
* Sam and Max Hit the Road: The current cursor mode is displayed on
the top screen. Use d-pad right to switch mode.
* Indiana Jones games: If you get into a fight, press Select, and
check the box marked 'Use Indy Fighting Controls'.
Return to the game, then use the following controls to fight:
D-pad left: move left
D-pad right: move right
D-pad up: guard up
D-pad down: guard down
Y: guard middle
X: Punch high
A: Punch middle
B: Punch low
Left shoulder: Fight towards the left
Right shoulder: Fight towards the right
The icon on the top screen shows which way you're currently
facing. Remember to turn the option off when the fight ends, or
the normal controls won't work!
* Beneath a Steel Sky: Press D-pad down to show your inventory.
* Simon the Sorcerer 1/2: Press D-pad down to show active objects.
* AGI games: Press Start to show the menu bar.
* Bargon Attack: Press Start to hit F1 when you need to start the
game. Use the on-screen keyboard (hit X) to press other function keys.
DS Options Screen
------------------------------------------------------------------------
Pressing the 'select' button during any game to show the DS options
screen. This screen shows options specific to the Nintendo DS version
of ScummVM.
Controls tab
Indy Fight Controls - Enable fighting controls for the Indiana Jones
games. See 'Game Specific Controls' for more information.
Left handed Mode - Switch the controls on the D-pad with the controls
on the A/B/X/Y buttons.
Show mouse cursor - Shows the game's mouse cursor on the bottom screen.
Snap to edges - makes it easier for the mouse controls to reach the edges
of the screen. Useful for Beneath a Steel Sky and Goblins 3.
Touch X offset - if your screen doesn't perform properly, this setting
allows you to adjust when the cursor appears left or right relative to
the screen's measured touch position.
Touch Y offset - if your screen doesn't perform properly, this setting
allows you to adjust when the cursor appears higher or lower relative to
the screen's measured touch position.
Use Laptop Trackpad-style cursor control - In this mode, use the lower
screen to drag the cursor around, a bit like using a trackpad on a laptop.
When this option is enabled, the following option is also enabled.
Tap for left click, double tap for right click - In this mode, you can
quickly tap on the screen to left click the mouse, or quickly
double tap on the screen to right click the mouse. If you find clicking
or double-clicking difficult, try and make a firmer touch on the screen,
and keep the pen down for longer.
Sensitivity - this bar adjusts the speed of cursor movement when laptop
trackpad-style cursor control is enabled (see above).
Graphics Tab
Scaling options:
Three scaling options are available for the main screen.
Harware Scale - Scales using the DS hardware scaler using a flicker method.
Produces lower quality graphics but doesn't slow the game down.
Software Scale - Scales using the CPU. A much higher quality image is
produced, but at the expense of speed in some games.
Unscaled - Allows you to see the graphics as originaly displayed. This
doesn't fit on the DS screen, but you can scroll the screen around by holding
the left shoulder button and using the D-pad or touch screen.
Top screen zoom - These three options control the zoom level of the top
screen when ScummVM is started up. Changing this option will set the zoom
to the specified level immediately.
Initial top screen scale:
This option controls the scaling level of the zoomed screen. In ScummVM
DS, one screen shows a zoomed-in view of the action, and this option controls
how zoomed in it is. You can also adjust this in the game by holding L and
pressing A/B.
General Tab
High Quality Audio - Enhance the sound quality, at the expense of some
slowdown during some games.
Disable power off - ScummVM DS turns the power off when the game quits.
This option disables that feature.
Auto completion dictionary for Sierra AGI games
------------------------------------------------------------------------
If you are playing a Sierra AGI game, you will be using the on-screen
keyboard quite a lot (press X to show it). To reduce the amount you have
to type, the game can automatically complete long words for you. To use
this feature, simply copy the PRED.DIC file from the ScummVM DS archive
into your game folder on your card. Now, when you use the keyboard,
possible words will be shown underneith it. To type one of those words,
simply double click on it with your stylus.
Converting your CD audio
------------------------------------------------------------------------
ScummVM supports playing CD audio for specific games which came with
music stored as standard music CD tracks. To use this music in ScummVM
DS, they need to be ripped from the CD and stored in a specific format.
This can only be done for the CD versions of certain games, such as
Monkey Island 1, Loom, and Gobliiins. All the floppy games and CD games
that didn't have CD audio tracks for music don't require any conversion,
and will work unmodified on ScummVM DS. MP3 audio files for CD music are
not supported.
Cdex can do the conversion very well and I recommend using it to convert
your audio files, although any CD ripping software can be used, so feel
free to use your favourite program. The format you need to use is
IMA-ADPCM 4-bit Mono. You may use any sample rate. All other formats
will be rejected, including uncompressed WAV files.
Now I will to describe how to rip your CD tracks with Cdex, which can be
found here: Cdex Homepage <http://sourceforge.net/projects/cdexos/>.
Other software can be used to create IMA ADPCM files under Linux or
MacOS.
To set this up in Cdex, select Settings from the Options menu. On the
Encoder tab, select 'WAV Output Encoder'. Under 'Encoder Options',
choose the following:
Format: WAV
Compression: IMA ADPCM
Samplerate: 22050 Hz
Channels: Mono
On the fly encoding: On
Next, go to the 'Filenames' tab and select the folder you want to save
your Wav files to. Under 'Filename format', enter 'track%3'. This should
name your WAV files in the correct way. Click OK.
Now select all the tracks on your CD, and click 'Extract CD tracks to a
compressed audio file'. Cdex should rip all the audio off your CD.
Now all you have to do is copy the newly created WAV files into the same
directory that your other game data is stored on your CompactFlash card.
Next time your run ScummVM DS, it should play with music!
*Important Note:* Do not select 'Extract CD tracks to a WAV file'. This
creates uncompressed WAVs only. You want 'Extract CD tracks to a
compressed audio file'.
Converting Speech files to MP3 format
------------------------------------------------------------------------
ScummVM supports playing back speech for talkie games in MP3 format.
Unfortunately, the DS CPU is not quite up to the task, and MP3 audio
will sometimes cause slowdown in your game. However, if your flash card
isn't big enough to fit the audio files on, you will have no choice!
To convert your audio you will need a copy of the ScummVM Tools package
<http://sourceforge.net/project/showfiles.php?group_id=37116&package_id=67433>.
You will also need a copy of the LAME MP3 encoder
<http://www.free-codecs.com/Lame_Encoder_download.htm>.
Once this is all installed and set up, the process to encode your audio
varies from game to game, but the Lucasarts games can all be compressed
using the following command line:
compress_scumm_sou --mp3 monster.sou
This produces a monster.so3 file which you can copy to your flash card
and replaces the original monster.sou. Ogg format (monster.sog) and flac
format files are not currently supported by ScummVM DS, and it is
unlikely they will ever be supported. There is no way to convert .sog or
.so3 files back to .sou files. Just dig out your original CD and copy
the file from that.
Frequently Asked Questions
------------------------------------------------------------------------
I get a lot of email about ScummVM DS. Nearly all of them are exactly
the same. Here I'm going to try and answer the questions that everybody
asks me in the hope that I will spend less time answering questions that
are clearly in the documentation and more time helping people who have a
real problem or have discovered a real bug.
*Q:* I can't see the bottom line of inventory items in Day of the
Tentacle, Monkey Island 2, or a few other games! What do I do?
*A:* Hold down the left shoulder button and use D-pad (or the touch
screen) to scroll the screen around.
*Q:* I dont see a menu when I press Start in Flight of the Amazon Queen
or Simon the Sorcerer. Is ScummVM broken?
*A:* No. To save in Simon the Sorcerer, click 'use', then click on the
postcard in your inventory. In Flight of the Amazon Queen, click 'use',
then click on the journal in your inventory.
*Q:* Why does ScummVM crash when I play Monkey Island 1?
*A:* This happens when MP3 audio tracks are present from the PC version
of ScummVM. Delete the MP3 tracks and reencode them to ADPCM WAV files
as described in the CD audio section.
*Q:* When will you support my Mini/Micro SD card reader? I want it!
Pretty please?
*A:* ScummVM uses DLDI drivers. If your card reader manufacturer doesn't
provide a driver, there is nothing I can do about it. The people to ask
are the card reader manufacturers themselves.
*Q:* Can't you use the extra RAM in the M3/Supercard or the official
Opera Expansion Pack to support more games like The Dig and Full
Throttle? DS Linux has done it, so why can't you?
*A:* Not at the moment. The extra RAM has certain differences to the
build in RAM which makes it difficult to use for general programs. As
ScummVM DS is an official port, the changes to the ScummVM code base
must be minimal to avoid making the code difficult to read for other
users. I do have plans to work on this some time in the future, but
don't nag me about when it'll be done. If and when there's progress with
this, I will post on the ScummVM forums about it.
*Q:* ScummVM DS turns off my DS when I hit 'Quit' in the game or quit
from the frontend. Why doesn't it return to the menu?
*A:* Due to bugs in the ScummVM codebase, many of the ScummVM games
cannot quit cleanly leaving the machine in the same state as when it
started. You will notice that no other versions of ScummVM can quit back
to the menu either. This will be fixed at some time in the future.
Contributors
------------------------------------------------------------------------
ScummVM DS uses chishm's GBA Movie Player FAT driver.
The CPU scaler is by Tramboi and Robin Watts
The ARM code was optimised by Robin Watts
Thanks to highpass for the ScummVM DS icons.
Thanks to zhevon for the Sam & Max cursor code.
Thanks to theNinjaBunny for the M3 Adaptor guide on this site.
Thanks also to everyone on the GBADev Forums.
This program was brought to you by caffiene, sugar, and late nights.
Donations and Getting Help
------------------------------------------------------------------------
If you have problems getting ScummVM to work on your hardware, please
read the FAQ first. /Please/ don't ask me questions which are
answered in the FAQ, I get many emails about this program each day, and
I can't help the people who really need help if I'm answering the same
question all the time which is already answered on this page. Other than
that, feel free to post on the ScummVM DS forum <http://forums.scummvm.org>
for help. Please do your research first though. There is no way of
running this on an out-of-the box DS without extra hardware. Most of
these things are fairly inexpensive though.
If you want to contact me, please email me on scummvm at millstone dot
demon dot co dot uk.
If you want to help with the development of ScummVM DS, great! Download
the source code and get building. There are plenty of things left to do.
You can also help by making a donation if you've particularly enjoyed
ScummVM DS. This uses Paypal, and is completely secure. There's no
pressure though, ScummVM DS is completely free. This is just for those
who would like to make a contribution to further development.
Building from Sources
------------------------------------------------------------------------
ScummVM is an open source project. This means that anyone is free to
take the source code to the project and make their own additions and fixes,
contributing them back to the authors for consideration for the next version.
To build ScummVM DS from source, it's probably better to checkout the
latest version of the code from the ScummVM SVN repository. The ScummVM
Sourceforge.net homepage <http://sourceforge.net/projects/scummvm> has
all the information about how to do this.
By default, ScummVM DS expects to find libmad, an MP3 compressor library
targeted for the ARM platform. If you don't have this, you must disable
libmad support by opening 'backends/platform/ds/arm9/makefile' and
commenting out the line which says USE_MAD = 1.
Then, enter the 'backends/platform/ds' folder and type:
make SCUMM_BUILD=a
The executable nds file will build inside 'backends/platform/ds/arm9/SCUMMVM-A'.
For other builds, substitute the letters b - g in the above line.

View File

@ -8,25 +8,29 @@ libndsdir = $(DEVKITPRO)/libnds
# Select the build by setting SCUMM_BUILD to a,b,c,d,e,f or g.
# Anything else gets build a.
ifeq ($(SCUMM_BUILD),g)
DS_BUILD_G = 1
else
ifeq ($(SCUMM_BUILD),f)
DS_BUILD_F = 1
ifeq ($(SCUMM_BUILD),h)
DS_BUILD_H = 1
else
ifeq ($(SCUMM_BUILD),e)
DS_BUILD_E = 1
ifeq ($(SCUMM_BUILD),g)
DS_BUILD_G = 1
else
ifeq ($(SCUMM_BUILD),d)
DS_BUILD_D = 1
ifeq ($(SCUMM_BUILD),f)
DS_BUILD_F = 1
else
ifeq ($(SCUMM_BUILD),e)
DS_BUILD_E = 1
else
ifeq ($(SCUMM_BUILD),c)
DS_BUILD_C = 1
ifeq ($(SCUMM_BUILD),d)
DS_BUILD_D = 1
else
ifeq ($(SCUMM_BUILD),b)
DS_BUILD_B = 1
ifeq ($(SCUMM_BUILD),c)
DS_BUILD_C = 1
else
ifeq ($(SCUMM_BUILD),b)
DS_BUILD_B = 1
else
DS_BUILD_A = 1
endif
endif
endif
endif
@ -80,8 +84,8 @@ vpath %.s $(srcdir)
# I actually had to use
# ./configure --host=arm-elf --enable-speed --enable-sso -enable-fpm=arm CFLAGS='-specs=ds_arm9.specs -mthumb-interwork' LDFLAGS='C:/Progra~1/devkitpro/libnds/lib/libnds9.a' --disable-shared --disable-debugging
USE_ARM_SOUND_ASM = 1
ARM = 1
USE_ARM_SOUND_ASM = 1
USE_ARM_COSTUME_ASM = 1
ifdef DS_BUILD_A
@ -140,6 +144,13 @@ ifdef DS_BUILD_G
BUILD=scummvm-G
endif
ifdef DS_BUILD_H
DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_H
LOGO = logog.bmp
ENABLE_PARALLACTION = STATIC_PLUGIN
BUILD=scummvm-H
endif
ARM7BIN := -7 $(CURDIR)/../../arm7/arm7.bin
ICON := -b ../../../logo.bmp "ScummVM;By Neil Millstone;"
@ -152,6 +163,7 @@ CFLAGS = -Wno-multichar -Wall\
-mcpu=arm9tdmi -mtune=arm9tdmi -fomit-frame-pointer\
-mthumb-interwork -DUSE_ARM_COSTUME_ASM=1
# -ffast-math
ifdef USE_DEBUGGER
@ -165,7 +177,7 @@ ifdef USE_PROFILER
endif
CXXFLAGS= $(CFLAGS) -Wno-non-virtual-dtor -Wno-unknown-pragmas -Wno-reorder \
-fno-exceptions -fno-rtti -mthumb-interwork
-fno-exceptions -fno-rtti -mthumb-interwork -ffunction-sections -fdata-sections
# -mthumb
@ -185,7 +197,7 @@ ifdef USE_MAD
endif
LDFLAGS = -specs=ds_arm9.specs -mthumb-interwork -Wl,--wrap,time -mno-fpu -Wl,-Map,map.txt
LDFLAGS = -specs=ds_arm9.specs -mthumb-interwork -Wl,--wrap,time -mno-fpu -Wl,-Map,map.txt -Wl,--gc-sections
INCLUDES= -I$(portdir)/$(BUILD) -I$(srcdir) -I$(srcdir)/engines \
-I$(portdir)/data -I$(portdir)/../commoninclude \
@ -237,7 +249,8 @@ endif
DATA_OBJS := $(portdir)/data/icons.o $(portdir)/data/keyboard.o $(portdir)/data/keyboard_pal.o $(portdir)/data/default_font.o $(portdir)/data/8x8font_tga.o
COMPRESSOR_OBJS := $(portdir)/source/compressor/lz.o
COMPRESSOR_OBJS :=
#$(portdir)/source/compressor/lz.o
FAT_OBJS := $(portdir)/source/fat/disc_io.o $(portdir)/source/fat/gba_nds_fat.o\
$(portdir)/source/fat/io_fcsr.o $(portdir)/source/fat/io_m3cf.o\
@ -257,14 +270,15 @@ FAT_OBJS := $(portdir)/source/fat/disc_io.o $(portdir)/source/fat/gba_nds_fat.o
# $(portdir)/source/fat/io_sd_common.o $(portdir)/source/fat/io_scsd_s.o \
# $(portdir)/source/fat/io_sc_common.o $(portdir)/source/fat/io_sd_common.o
LIBCARTRESET_OBJS := $(portdir)/source/libcartreset/cartreset.o
LIBCARTRESET_OBJS :=
#$(portdir)/source/libcartreset/cartreset.o
# Files in this list will be optimisied for speed, otherwise they will be optimised for space
OPTLIST := actor.cpp ds_main.cpp osystem_ds.cpp blitters.cpp fmopl.cpp rate.cpp mixer.cpp isomap.cpp image.cpp gfx.cpp sprite.cpp actor_path.cpp actor_walk.cpp
#OPTLIST :=
# Compiler options for files which should be optimised for speed
OPT_SPEED := -O2
OPT_SPEED := -O3
# Compiler options for files which should be optimised for space
OPT_SIZE := -Os
@ -286,7 +300,7 @@ ndsall:
include $(srcdir)/Makefile.common
semiclean:
$(RM) $(portdir)/source/dsoptions.o $(portdir)/source/dsmain.o $(FAT_OBJS) $(DATA_OBJS) $(portdir)/source/wordcompletion.o
$(RM) $(portdir)/source/dsoptions.o $(portdir)/source/dsmain.o $(FAT_OBJS) $(DATA_OBJS) $(portdir)/source/wordcompletion.o $(portdir)/source/dsoptions.o
clean:
$(RM) $(OBJS) $(EXECUTABLE)

View File

@ -20,7 +20,7 @@
*
*/
#ifndef _CDAUDIO_H_
#ifndef _CDAUDIO_H_
#define _CDAUDIO_H_
namespace DS {

File diff suppressed because it is too large Load Diff

View File

@ -38,7 +38,8 @@ enum controlType {
CONT_SIMON,
CONT_FUTURE_WARS,
CONT_AGI,
CONT_GOBLINS
CONT_GOBLINS,
CONT_NIPPON,
};
struct gameListType {
@ -56,6 +57,7 @@ int getPenX();
int getPenY();
GLvector getPenPos();
void consumePenEvents();
controlType getControlType();
// Pad reading
int getKeysHeld();
@ -64,6 +66,8 @@ int getKeysDown();
int getKeysReleased();
void consumeKeys();
int leftHandedSwap(int keys);
void setGameScreenSwap(bool enable);
void setSensitivity(int sensitivity);
// Video
void displayMode8Bit(); // Switch to 8-bit mode5
@ -81,6 +85,7 @@ u16* getScalerBuffer();
void setTalkPos(int x, int y);
void setTopScreenTarget(int x, int y);
void set200PercentFixedScale(bool on);
void setTopScreenZoom(int percentage);
// Timers
void setTimerCallback(OSystem_DS::TimerProc proc, int interval); // Setup a callback function at a regular interval
@ -88,7 +93,9 @@ int getMillis(); // Return the current runtime in milliseconds
void doTimerCallback(); // Call callback function if required
// Sound
void doSoundCallback(); // Call function if sound buffers need more data
void doSoundCallback();
void startSound(int freq, int buffer); // Start sound hardware
// Call function if sound buffers need more data
void playSound(const void* data, u32 length, bool loop, bool adpcm = false, int rate = 22050); // Start a sound
void stopSound(int channel);
int getSoundFrequency();
@ -131,6 +138,8 @@ void setIndyFightState(bool st);
bool getIndyFightState();
bool isCpuScalerEnabled();
void setCpuScalerEnable(bool enable);
void setTrackPadStyleEnable(bool enable);
void setTapScreenClicksEnable(bool enable);
// Display
bool getIsDisplayMode8Bit();

View File

@ -25,6 +25,7 @@
#include "gui/dialog.h"
#include "gui/newgui.h"
#include "gui/ListWidget.h"
#include "gui/TabWidget.h"
#include "osystem_ds.h"
#include "engines/scumm/scumm.h"
#include "touchkeyboard.h"
@ -41,8 +42,67 @@ namespace Scumm {
namespace DS {
DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(5, 0, 320 - 5, 230 - 20) {
addButton(this, 10, 175, "Close", GUI::kCloseCmd, 'C');
DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(0, 0, 320 - 10, 230 - 40) {
addButton(this, 10, 170, "Close", GUI::kCloseCmd, 'C');
_tab = new GUI::TabWidget(this, 5, 5, 300, 230 - 20 - 40 - 10);
_tab->addTab("Controls");
_leftHandedCheckbox = new GUI::CheckboxWidget(_tab, 5, 5, 130, 20, "Left handed mode", 0, 'L');
_indyFightCheckbox = new GUI::CheckboxWidget(_tab, 5, 20, 140, 20, "Indy fight controls", 0, 'I');
_showCursorCheckbox = new GUI::CheckboxWidget(_tab, 150, 5, 130, 20, "Show mouse cursor", 0, 'T');
_snapToBorderCheckbox = new GUI::CheckboxWidget(_tab, 150, 20, 130, 20, "Snap to edges", 0, 'T');
new GUI::StaticTextWidget(_tab, 20, 35, 100, 15, "Touch X Offset", GUI::kTextAlignLeft);
_touchX = new GUI::SliderWidget(_tab, 130, 35, 130, 12, 1);
_touchX->setMinValue(-8);
_touchX->setMaxValue(+8);
_touchX->setValue(0);
_touchX->setFlags(GUI::WIDGET_CLEARBG);
new GUI::StaticTextWidget(_tab, 20, 50, 100, 15, "Touch Y Offset", GUI::kTextAlignLeft);
_touchY = new GUI::SliderWidget(_tab, 130, 50, 130, 12, 2);
_touchY->setMinValue(-8);
_touchY->setMaxValue(+8);
_touchY->setValue(0);
_touchY->setFlags(GUI::WIDGET_CLEARBG);
new GUI::StaticTextWidget(_tab, 130 + 65 - 10, 65, 20, 15, "0", GUI::kTextAlignCenter);
new GUI::StaticTextWidget(_tab, 130 + 130 - 10, 65, 20, 15, "8", GUI::kTextAlignCenter);
new GUI::StaticTextWidget(_tab, 130 - 20, 65, 20, 15, "-8", GUI::kTextAlignCenter);
_touchPadStyle = new GUI::CheckboxWidget(_tab, 5, 80, 270, 20, "Use laptop trackpad-style cursor control", 0x20000001, 'T');
_screenTaps = new GUI::CheckboxWidget(_tab, 5, 95, 285, 20, "Tap for left click, double tap right click", 0x20000002, 'T');
_sensitivityLabel = new GUI::StaticTextWidget(_tab, 20, 110, 110, 15, "Sensitivity", GUI::kTextAlignLeft);
_sensitivity = new GUI::SliderWidget(_tab, 130, 110, 130, 12, 1);
_sensitivity->setMinValue(4);
_sensitivity->setMaxValue(16);
_sensitivity->setValue(8);
_sensitivity->setFlags(GUI::WIDGET_CLEARBG);
_tab->addTab("Graphics");
new GUI::StaticTextWidget(_tab, 5, 70, 180, 15, "Initial top screen scale:", GUI::kTextAlignLeft);
_100PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 85, 230, 20, "100%", 0x30000001, 'T');
_150PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 100, 230, 20, "150%", 0x30000002, 'T');
_200PercentCheckbox = new GUI::CheckboxWidget(_tab, 5, 115, 230, 20, "200%", 0x30000003, 'T');
new GUI::StaticTextWidget(_tab, 5, 5, 180, 15, "Main screen scaling:", GUI::kTextAlignLeft);
_hardScaler = new GUI::CheckboxWidget(_tab, 5, 20, 270, 20, "Hardware scale (fast, but low quality)", 0x10000001, 'T');
_cpuScaler = new GUI::CheckboxWidget(_tab, 5, 35, 270, 20, "Software scale (good quality, but slower)", 0x10000002, 'S');
_unscaledCheckbox = new GUI::CheckboxWidget(_tab, 5, 50, 270, 20, "Unscaled (you must scroll left and right)", 0x10000003, 'S');
_tab->addTab("General");
_highQualityAudioCheckbox = new GUI::CheckboxWidget(_tab, 5, 5, 250, 20, "High quality audio (slower) (reboot)", 0, 'T');
_disablePowerOff = new GUI::CheckboxWidget(_tab, 5, 20, 200, 20, "Disable power off", 0, 'T');
_tab->setActiveTab(0);
_radioButtonMode = false;
@ -52,46 +112,17 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(5, 0, 320 - 5, 230 - 20) {
}
#endif
new GUI::StaticTextWidget(this, 90, 10, 130, 15, "ScummVM DS Options", GUI::kTextAlignCenter);
// new GUI::StaticTextWidget(this, 90, 10, 130, 15, "ScummVM DS Options", GUI::kTextAlignCenter);
_leftHandedCheckbox = new GUI::CheckboxWidget(this, 5, 70, 130, 20, "Left handed mode", 0, 'L');
_indyFightCheckbox = new GUI::CheckboxWidget(this, 5, 40, 200, 20, "Indy fighting controls", 0, 'I');
_twoHundredPercentCheckbox = new GUI::CheckboxWidget(this, 5, 55, 230, 20, "Zoomed screen at fixed 200% zoom", 0, 'T');
_highQualityAudioCheckbox = new GUI::CheckboxWidget(this, 5, 25, 250, 20, "High quality audio (slower) (reboot)", 0, 'T');
_disablePowerOff = new GUI::CheckboxWidget(this, 5, 85, 130, 20, "Disable power off", 0, 'T');
_showCursorCheckbox = new GUI::CheckboxWidget(this, 5, 100, 130, 20, "Show mouse cursor", 0, 'T');
//#ifdef ALLOW_CPU_SCALER
// _cpuScaler = new GUI::CheckboxWidget(this, 160, 115, 90, 20, "CPU scaler", 0, 'T');
//#endif
new GUI::StaticTextWidget(this, 180, 70, 130, 15, "Main screen:", GUI::kTextAlignLeft);
_hardScaler = new GUI::CheckboxWidget(this, 140, 85, 170, 20, "Hardware scale (fast)", 0x10000001, 'T');
_cpuScaler = new GUI::CheckboxWidget(this, 140, 100, 170, 20, "Software scale (quality)", 0x10000002, 'S');
_unscaledCheckbox = new GUI::CheckboxWidget(this, 140, 115, 170, 20, "Unscaled", 0x10000003, 'S');
_snapToBorderCheckbox = new GUI::CheckboxWidget(this, 5, 115, 120, 20, "Snap to border", 0, 'T');
new GUI::StaticTextWidget(this, 20, 145, 110, 15, "Touch X Offset", GUI::kTextAlignLeft);
_touchX = new GUI::SliderWidget(this, 130, 145, 130, 12, 1);
_touchX->setMinValue(-8);
_touchX->setMaxValue(+8);
_touchX->setValue(0);
_touchX->setFlags(GUI::WIDGET_CLEARBG);
new GUI::StaticTextWidget(this, 20, 160, 110, 15, "Touch Y Offset", GUI::kTextAlignLeft);
_touchY = new GUI::SliderWidget(this, 130, 160, 130, 12, 2);
_touchY->setMinValue(-8);
_touchY->setMaxValue(+8);
_touchY->setValue(0);
_touchY->setFlags(GUI::WIDGET_CLEARBG);
new GUI::StaticTextWidget(this, 130 + 65 - 10, 175, 20, 15, "0", GUI::kTextAlignCenter);
new GUI::StaticTextWidget(this, 130 + 130 - 10, 175, 20, 15, "8", GUI::kTextAlignCenter);
new GUI::StaticTextWidget(this, 130 - 10, 175, 20, 15, "-8", GUI::kTextAlignCenter);
#ifdef DS_SCUMM_BUILD
_delDialog = new Scumm::SaveLoadChooser("Delete game:", "Delete", false, Scumm::g_scumm);
@ -125,10 +156,36 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(5, 0, 320 - 5, 230 - 20) {
_unscaledCheckbox->setState(false);
}
if (ConfMan.hasKey("twohundredpercent", "ds")) {
_twoHundredPercentCheckbox->setState(ConfMan.getBool("twohundredpercent", "ds"));
if (ConfMan.hasKey("topscreenzoom", "ds")) {
_100PercentCheckbox->setState(false);
_150PercentCheckbox->setState(false);
_200PercentCheckbox->setState(false);
switch (ConfMan.getInt("topscreenzoom", "ds"))
{
case 100: {
_100PercentCheckbox->setState(true);
break;
}
case 150: {
_150PercentCheckbox->setState(true);
break;
}
case 200: {
_200PercentCheckbox->setState(true);
break;
}
}
} else if (ConfMan.hasKey("twohundredpercent", "ds")) {
_200PercentCheckbox->setState(ConfMan.getBool("twohundredpercent", "ds"));
} else {
_twoHundredPercentCheckbox->setState(false);
// No setting
_150PercentCheckbox->setState(true);
}
if (ConfMan.hasKey("22khzaudio", "ds")) {
@ -165,6 +222,29 @@ DSOptionsDialog::DSOptionsDialog() : GUI::Dialog(5, 0, 320 - 5, 230 - 20) {
_touchY->setValue(0);
}
if (ConfMan.hasKey("sensitivity", "ds")) {
_sensitivity->setValue(ConfMan.getInt("sensitivity", "ds"));
} else {
_sensitivity->setValue(8);
}
if (ConfMan.hasKey("touchpad", "ds")) {
_touchPadStyle->setState(ConfMan.getBool("touchpad", "ds"));
} else {
_touchPadStyle->setState(0);
}
if (ConfMan.hasKey("screentaps", "ds")) {
_screenTaps->setState(ConfMan.getBool("screentaps", "ds"));
} else {
_screenTaps->setState(0);
}
_screenTaps->setEnabled(!_touchPadStyle->getState());
_sensitivity->setEnabled(_touchPadStyle->getState());
_sensitivityLabel->setEnabled(_touchPadStyle->getState());
_sensitivityLabel->draw();
if (!_cpuScaler->getState() && !_unscaledCheckbox->getState()) {
_hardScaler->setState(true);
}
@ -180,7 +260,7 @@ DSOptionsDialog::~DSOptionsDialog() {
void DSOptionsDialog::updateConfigManager() {
ConfMan.setBool("lefthanded", _leftHandedCheckbox->getState(), "ds");
ConfMan.setBool("unscaled", _unscaledCheckbox->getState(), "ds");
ConfMan.setBool("twohundredpercent", _twoHundredPercentCheckbox->getState(), "ds");
// ConfMan.setBool("twohundredpercent", _twoHundredPercentCheckbox->getState(), "ds");
ConfMan.setBool("22khzaudio", _highQualityAudioCheckbox->getState(), "ds");
ConfMan.setBool("disablepoweroff", _disablePowerOff->getState(), "ds");
#ifdef ALLOW_CPU_SCALER
@ -190,6 +270,24 @@ void DSOptionsDialog::updateConfigManager() {
ConfMan.setInt("yoffset", _touchY->getValue(), "ds");
ConfMan.setBool("showcursor", _showCursorCheckbox->getState(), "ds");
ConfMan.setBool("snaptoborder", _snapToBorderCheckbox->getState(), "ds");
ConfMan.setBool("touchpad", _touchPadStyle->getState(), "ds");
ConfMan.setBool("screentaps", _screenTaps->getState(), "ds");
ConfMan.setInt("sensitivity", _sensitivity->getValue(), "ds");
u32 zoomLevel = 150;
if (_100PercentCheckbox->getState()) {
zoomLevel = 100;
} else if (_150PercentCheckbox->getState()) {
zoomLevel = 150;
} else if (_200PercentCheckbox->getState()) {
zoomLevel = 200;
}
consolePrintf("Saved zoom: %d\n", zoomLevel);
ConfMan.setInt("topscreenzoom", zoomLevel, "ds");
DS::setOptions();
}
@ -227,6 +325,70 @@ void DSOptionsDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint
}
if ((!guard) && (_radioButtonMode))
{
guard = true;
if ((sender == _touchPadStyle) && (cmd == 0x20000001)) {
if (_touchPadStyle->getState()) {
// Swap screens when turning on trackpad style, it feels
// much more natural!
DS::setGameScreenSwap(true);
_screenTaps->setState(true);
_screenTaps->setEnabled(false);
_screenTaps->draw();
_sensitivity->setEnabled(true);
_sensitivityLabel->setEnabled(true);
_sensitivityLabel->draw();
_sensitivity->draw();
} else {
DS::setGameScreenSwap(false);
_screenTaps->setEnabled(true);
_screenTaps->setState(false);
_screenTaps->draw();
_sensitivity->setEnabled(false);
_sensitivityLabel->setEnabled(false);
_sensitivityLabel->draw();
_sensitivity->draw();
}
}
guard = false;
}
if ((!guard) && (_radioButtonMode)) {
guard = true;
if (cmd == 0x30000001) {
_100PercentCheckbox->setState(true);
_150PercentCheckbox->setState(false);
_200PercentCheckbox->setState(false);
DS::setTopScreenZoom(100);
}
if (cmd == 0x30000002) {
_100PercentCheckbox->setState(false);
_150PercentCheckbox->setState(true);
_200PercentCheckbox->setState(false);
DS::setTopScreenZoom(150);
}
if (cmd == 0x30000003) {
_100PercentCheckbox->setState(false);
_150PercentCheckbox->setState(false);
_200PercentCheckbox->setState(true);
DS::setTopScreenZoom(200);
}
guard = false;
}
if (cmd == GUI::kCloseCmd) {
updateConfigManager();
close();
@ -297,6 +459,8 @@ void showOptionsDialog() {
}
void setOptions() {
static bool firstLoad = true;
ConfMan.addGameDomain("ds");
if (ConfMan.hasKey("lefthanded", "ds")) {
@ -327,10 +491,16 @@ void setOptions() {
DS::setUnscaledMode(false);
}
if (ConfMan.hasKey("twohundredpercent", "ds")) {
DS::set200PercentFixedScale(ConfMan.getBool("twohundredpercent", "ds"));
} else {
DS::set200PercentFixedScale(false);
if (firstLoad) {
if (ConfMan.hasKey("topscreenzoom", "ds")) {
DS::setTopScreenZoom(ConfMan.getInt("topscreenzoom", "ds"));
} else {
if (ConfMan.hasKey("twohundredpercent", "ds")) {
DS::setTopScreenZoom(200);
} else {
DS::setTopScreenZoom(150);
}
}
}
if (ConfMan.hasKey("xoffset", "ds")) {
@ -345,6 +515,12 @@ void setOptions() {
DS::setTouchXOffset(0);
}
if (ConfMan.hasKey("sensitivity", "ds")) {
DS::setSensitivity(ConfMan.getInt("sensitivity", "ds"));
} else {
DS::setSensitivity(8);
}
#ifdef ALLOW_CPU_SCALER
if (ConfMan.hasKey("cpu_scaler", "ds")) {
DS::setCpuScalerEnable(ConfMan.getBool("cpu_scaler", "ds"));
@ -353,6 +529,33 @@ void setOptions() {
}
#endif
if (ConfMan.hasKey("screentaps", "ds")) {
DS::setTapScreenClicksEnable(ConfMan.getBool("screentaps", "ds"));
} else {
DS::setTapScreenClicksEnable(false);
}
if (ConfMan.hasKey("touchpad", "ds")) {
bool enable = ConfMan.getBool("touchpad", "ds");
DS::setTrackPadStyleEnable(enable);
if ((enable) and (firstLoad)) {
// If we've just booted up, want to swap screens when trackpad mode is in use
// but not every time we enter the options dialog.
DS::setGameScreenSwap(true);
}
if (enable) {
DS::setTapScreenClicksEnable(true);
}
} else {
DS::setTrackPadStyleEnable(false);
}
firstLoad = false;
}
}

View File

@ -30,6 +30,7 @@
#include "gui/object.h"
#include "gui/widget.h"
#include "gui/dialog.h"
#include "gui/TabWidget.h"
#include "scumm/dialogs.h"
namespace DS {
@ -45,11 +46,18 @@ protected:
void togglePause();
void updateConfigManager();
GUI::TabWidget* _tab;
GUI::StaticTextWidget* _sensitivityLabel;
GUI::SliderWidget* _touchX;
GUI::SliderWidget* _touchY;
GUI::SliderWidget* _sensitivity;
GUI::CheckboxWidget* _leftHandedCheckbox;
GUI::CheckboxWidget* _unscaledCheckbox;
GUI::CheckboxWidget* _twoHundredPercentCheckbox;
GUI::CheckboxWidget* _100PercentCheckbox;
GUI::CheckboxWidget* _150PercentCheckbox;
GUI::CheckboxWidget* _200PercentCheckbox;
GUI::CheckboxWidget* _indyFightCheckbox;
GUI::CheckboxWidget* _highQualityAudioCheckbox;
GUI::CheckboxWidget* _disablePowerOff;
@ -59,6 +67,9 @@ protected:
GUI::CheckboxWidget* _hardScaler;
GUI::CheckboxWidget* _cpuScaler;
GUI::CheckboxWidget* _touchPadStyle;
GUI::CheckboxWidget* _screenTaps;
#ifdef DS_SCUMM_BUILD
Scumm::SaveLoadChooser* _delDialog;
#endif

View File

@ -155,11 +155,13 @@ GBAMPSaveFile* GBAMPSaveFileManager::openSavefile(char const* name, bool saveOrL
sprintf(fileSpec, "%s/%s", getSavePath(), name);
}
// consolePrintf(fileSpec);
// consolePrintf("Opening the file: %s\n", fileSpec);
GBAMPSaveFile* sf = new GBAMPSaveFile(fileSpec, saveOrLoad);
if (sf->isOpen()) {
// consolePrintf("Ok");
return sf;
} else {
// consolePrintf("Fail");
delete sf;
return NULL;
}

View File

@ -41,7 +41,8 @@
OSystem_DS* OSystem_DS::_instance = NULL;
OSystem_DS::OSystem_DS()
: eventNum(0), lastPenFrame(0), queuePos(0), _mixer(NULL), _timer(NULL), _frameBufferExists(false)
: eventNum(0), lastPenFrame(0), queuePos(0), _mixer(NULL), _timer(NULL), _frameBufferExists(false),
_disableCursorPalette(true), _graphicsEnable(true)
{
// eventNum = 0;
// lastPenFrame = 0;
@ -71,7 +72,13 @@ void OSystem_DS::initBackend() {
_timer = new DSTimerManager();
DS::setTimerCallback(&OSystem_DS::timerHandler, 10);
_mixer->setOutputRate(11025 /*DS::getSoundFrequency()*/);
if (ConfMan.hasKey("22khzaudio", "ds") && ConfMan.getBool("22khzaudio", "ds")) {
DS::startSound(22050, 8192);
} else {
DS::startSound(11025, 4096);
}
_mixer->setOutputRate(DS::getSoundFrequency());
_mixer->setReady(true);
OSystem::initBackend();
@ -79,7 +86,7 @@ void OSystem_DS::initBackend() {
bool OSystem_DS::hasFeature(Feature f) {
// consolePrintf("hasfeature\n");
return (f == kFeatureVirtualKeyboard);
return (f == kFeatureVirtualKeyboard) || (f == kFeatureCursorHasPalette);
}
void OSystem_DS::setFeatureState(Feature f, bool enable) {
@ -107,7 +114,7 @@ bool OSystem_DS::setGraphicsMode(int mode) {
}
bool OSystem_DS::setGraphicsMode(const char *name) {
// consolePrintf("Set gfx mode %s\n", name);
consolePrintf("Set gfx mode %s\n", name);
return true;
}
@ -116,8 +123,15 @@ int OSystem_DS::getGraphicsMode() const {
}
void OSystem_DS::initSize(uint width, uint height) {
// consolePrintf("Set gfx mode %d x %d\n", width, height);
DS::setGameSize(width, height);
// For Lost in Time, the title screen is displayed in 640x400.
// In order to support this game, the screen mode is set, but
// all draw calls are ignored until the game switches to 320x200.
if ((width == 640) && (height == 400)) {
_graphicsEnable = false;
} else {
_graphicsEnable = true;
DS::setGameSize(width, height);
}
}
int16 OSystem_DS::getHeight() {
@ -129,9 +143,8 @@ int16 OSystem_DS::getWidth() {
}
void OSystem_DS::setPalette(const byte *colors, uint start, uint num) {
// consolePrintf("Set palette %d, %d colours\n", start, num);
//return;
if (!DS::getIsDisplayMode8Bit()) return;
// consolePrintf("Setpal %d, %d\n", start, num);
for (unsigned int r = start; r < start + num; r++) {
int red = *colors;
int green = *(colors + 1);
@ -141,19 +154,46 @@ void OSystem_DS::setPalette(const byte *colors, uint start, uint num) {
green >>= 3;
blue >>= 3;
if (r != 255)
// if (r != 255)
{
BG_PALETTE[r] = red | (green << 5) | (blue << 10);
if (!DS::getKeyboardEnable()) {
BG_PALETTE_SUB[r] = red | (green << 5) | (blue << 10);
u16 paletteValue = red | (green << 5) | (blue << 10);
if (DS::getIsDisplayMode8Bit()) {
BG_PALETTE[r] = paletteValue;
if (!DS::getKeyboardEnable()) {
BG_PALETTE_SUB[r] = paletteValue;
}
}
_palette[r] = paletteValue;
}
// if (num == 16) consolePrintf("pal:%d r:%d g:%d b:%d\n", r, red, green, blue);
// if (num == 255) consolePrintf("pal:%d r:%d g:%d b:%d\n", r, red, green, blue);
colors += 4;
}
}
void OSystem_DS::setCursorPalette(const byte *colors, uint start, uint num) {
// consolePrintf("Cursor palette set: start: %d, cols: %d\n", start, num);
for (unsigned int r = start; r < start + num; r++) {
int red = *colors;
int green = *(colors + 1);
int blue = *(colors + 2);
red >>= 3;
green >>= 3;
blue >>= 3;
u16 paletteValue = red | (green << 5) | (blue << 10);
_cursorPalette[r] = paletteValue;
colors += 4;
}
_disableCursorPalette = false;
}
bool OSystem_DS::grabRawScreen(Graphics::Surface* surf) {
surf->create(DS::getGameWidth(), DS::getGameHeight(), 1);
@ -184,9 +224,11 @@ void OSystem_DS::grabPalette(unsigned char *colors, uint start, uint num) {
}
#define MISALIGNED16(ptr) (((u32) (ptr) & 1) != 0)
void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int w, int h) {
// consolePrintf("Copy rect %d, %d %d, %d ", x, y, w, h);
//consolePrintf("Copy rect %d, %d %d, %d ", x, y, w, h);
if (!_graphicsEnable) return;
if (w <= 1) return;
if (h < 0) return;
if (!DS::getIsDisplayMode8Bit()) return;
@ -195,6 +237,9 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int
s32 stride;
u16* bgSub = (u16 *) BG_GFX_SUB;
// The DS video RAM doesn't support 8-bit writes because Nintendo wanted
// to save a few pennies/euro cents on the hardware.
if (_frameBufferExists) {
bg = (u16 *) _framebuffer.pixels;
stride = _framebuffer.pitch;
@ -203,46 +248,117 @@ void OSystem_DS::copyRectToScreen(const byte *buf, int pitch, int x, int y, int
stride = DS::get8BitBackBufferStride();
}
u16* src = (u16 *) buf;
if (DS::getKeyboardEnable()) {
if (((pitch & 1) != 0) || ((w & 1) != 0) || (((int) (buf) & 1) != 0)) {
// Something is misaligned, so we have to use the slow but sure method
int by = 0;
for (int dy = y; dy < y + h; dy++) {
u16* dest = bg + (dy * (stride >> 1)) + (x >> 1);
DC_FlushRange(src, w << 1);
DC_FlushRange(dest, w << 1);
dmaCopyHalfWords(3, src, dest, w);
src += pitch >> 1;
}
} else {
for (int dy = y; dy < y + h; dy++) {
u16* dest1 = bg + (dy * (stride >> 1)) + (x >> 1);
u16* dest2 = bgSub + (dy << 8) + (x >> 1);
u8* dest = ((u8 *) (bg)) + (dy * stride) + x;
u8* destSub = ((u8 *) (bgSub)) + (dy * 512) + x;
u8* src = (u8 *) buf + (pitch * by);
DC_FlushRange(src, w << 1);
DC_FlushRange(dest1, w << 1);
DC_FlushRange(dest2, w << 1);
dmaCopyHalfWords(3, src, dest1, w);
dmaCopyHalfWords(3, src, dest2, w);
src += pitch >> 1;
u32 dx;
u32 pixelsLeft = w;
if (MISALIGNED16(dest)) {
// Read modify write
dest--;
u16 mix = *((u16 *) dest);
mix = (mix & 0x00FF) | (*src++ << 8);
*dest = mix;
*destSub = mix;
dest += 2;
destSub += 2;
pixelsLeft--;
}
// We can now assume dest is aligned
u16* dest16 = (u16 *) dest;
u16* destSub16 = (u16 *) destSub;
for (dx = 0; dx < pixelsLeft; dx+=2) {
u16 mix;
mix = *src + (*(src + 1) << 8);
*dest16++ = mix;
*destSub16++ = mix;
src += 2;
}
pixelsLeft -= dx;
// At the end we may have one pixel left over
if (pixelsLeft != 0) {
u16 mix = *dest16;
mix = (mix & 0x00FF) | ((*src++) << 8);
*dest16 = mix;
*destSub16 = mix;
}
by++;
}
// consolePrintf("Slow method used!\n");
} else {
// Stuff is aligned to 16-bit boundaries, so it's safe to do DMA.
u16* src = (u16 *) buf;
if (DS::getKeyboardEnable()) {
for (int dy = y; dy < y + h; dy++) {
u16* dest = bg + (dy * (stride >> 1)) + (x >> 1);
DC_FlushRange(src, w << 1);
DC_FlushRange(dest, w << 1);
dmaCopyHalfWords(3, src, dest, w);
while (dmaBusy(3));
src += pitch >> 1;
}
} else {
for (int dy = y; dy < y + h; dy++) {
u16* dest1 = bg + (dy * (stride >> 1)) + (x >> 1);
u16* dest2 = bgSub + (dy << 8) + (x >> 1);
DC_FlushRange(src, w << 1);
DC_FlushRange(dest1, w << 1);
DC_FlushRange(dest2, w << 1);
dmaCopyHalfWords(3, src, dest1, w);
if ((!_frameBufferExists) || (buf == _framebuffer.pixels)) {
dmaCopyHalfWords(2, src, dest2, w);
}
while (dmaBusy(2) || dmaBusy(3));
src += pitch >> 1;
}
}
}
// consolePrintf("Done\n");
}
void OSystem_DS::updateScreen() {
if ((_frameBufferExists) && (DS::getIsDisplayMode8Bit()))
{
if ((_frameBufferExists) && (DS::getIsDisplayMode8Bit())) {
_frameBufferExists = false;
// Copy temp framebuffer back to screen
@ -253,6 +369,12 @@ void OSystem_DS::updateScreen() {
DS::doSoundCallback();
// DS::doTimerCallback();
DS::addEventsToQueue();
// Force back buffer usage for Nippon Safes, as it doesn't double buffer it's output
if (DS::getControlType() == DS::CONT_NIPPON) {
OSystem_DS::instance()->lockScreen();
OSystem_DS::instance()->unlockScreen();
}
}
void OSystem_DS::setShakePos(int shakeOffset) {
@ -334,7 +456,21 @@ void OSystem_DS::warpMouse(int x, int y) {
}
void OSystem_DS::setMouseCursor(const byte *buf, uint w, uint h, int hotspotX, int hotspotY, byte keycolor, int targetCursorScale) {
DS::setCursorIcon(buf, w, h, keycolor, hotspotX, hotspotY);
if ((w > 0) && (w < 64) && (h > 0) && (h < 64))
{
memcpy(_cursorImage, buf, w * h);
_cursorW = w;
_cursorH = h;
_cursorHotX = hotspotX;
_cursorHotY = hotspotY;
_cursorKey = keycolor;
_cursorScale = targetCursorScale;
refreshCursor();
}
}
void OSystem_DS::refreshCursor() {
DS::setCursorIcon(_cursorImage, _cursorW, _cursorH, _cursorKey, _cursorHotX, _cursorHotY);
}
void OSystem_DS::addEvent(Common::Event& e) {
@ -489,7 +625,11 @@ Common::SaveFileManager* OSystem_DS::getSavefileManager() {
if (DS::isGBAMPAvailable() && (!forceSram)) {
return &mpSaveManager;
} else {
#ifdef GBA_SRAM_SAVE
return &saveManager;
#else
return NULL;
#endif
}
}

View File

@ -52,17 +52,32 @@ protected:
Common::Event eventQueue[96];
int queuePos;
#ifdef GBA_SRAM_SAVE
DSSaveFileManager saveManager;
#endif
GBAMPSaveFileManager mpSaveManager;
DSAudioMixer* _mixer;
DSTimerManager* _timer;
Graphics::Surface _framebuffer;
bool _frameBufferExists;
bool _graphicsEnable;
static OSystem_DS* _instance;
u16 _palette[256];
u16 _cursorPalette[256];
u8 _cursorImage[64 * 64];
uint _cursorW;
uint _cursorH;
int _cursorHotX;
int _cursorHotY;
byte _cursorKey;
int _cursorScale;
Graphics::Surface* createTempFrameBuffer();
bool _disableCursorPalette;
public:
typedef void (*SoundProc)(byte *buf, int len);
@ -159,7 +174,16 @@ public:
virtual void clearAutoComplete();
virtual void setCharactersEntered(int count);
u16 getDSPaletteEntry(u32 entry) { return _palette[entry]; }
u16 getDSCursorPaletteEntry(u32 entry) { return !_disableCursorPalette? _cursorPalette[entry]: _palette[entry]; }
virtual void setCursorPalette(const byte *colors, uint start, uint num);
virtual void disableCursorPalette(bool dis) { _disableCursorPalette = dis; refreshCursor(); }
FilesystemFactory *getFilesystemFactory();
void refreshCursor();
};
static const OSystem::GraphicsMode s_supportedGraphicsModes[] = {

View File

@ -81,7 +81,10 @@ void consolePrintf(const char* s, ...);
#define ITCM_DATA __attribute__((section(".itcm")))
// Since I can't change the engine at the moment (post lockdown) this define can go here.
// This define changes the mouse-relative motion which doesn't make sense on a touch screen to
// a more conventional form of input where the menus can be clicked on.
#define LURE_CLICKABLE_MENUS
//#include "common/array.h"
//#include "common/str.h"

View File

@ -19,7 +19,9 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
// Save in order 1,2,3,4,larger 2,5
#ifdef GBA_SRAM_SAVE
#include "ramsave.h"
#include "nds.h"
#include "compressor/lz.h"
@ -237,7 +239,7 @@ uint32 DSSaveFile::write(const void *buf, uint32 size) {
return size;
}
bool DSSaveFile::matches(char* prefix, int num) {
bool DSSaveFile::matches(const char *prefix, int num) {
char str[16];
if (isValid()) {
sprintf(str, "%s%02d", prefix, num);
@ -251,7 +253,7 @@ bool DSSaveFile::matches(char* prefix, int num) {
}
}
bool DSSaveFile::matches(char* filename) {
bool DSSaveFile::matches(const char *filename) {
if (isValid()) {
return !strcmp(save.name, filename);
} else {
@ -532,3 +534,5 @@ int DSSaveFileManager::getExtraData() {
return 0;
}
}
#endif

View File

@ -78,8 +78,8 @@ public:
bool isValid() { return save.isValid; }
bool isTemp() { return isTempFile; }
bool matches(char* prefix, int num);
bool matches(char* filename);
bool matches(const char *prefix, int num);
bool matches(const char *filename);
void clearData();
void compress();

View File

@ -402,6 +402,23 @@ void createKeyEvent(int keyNum, Common::Event& event)
}
}
void releaseAllKeys() {
for (int r = 0; r < DS_NUM_KEYS; r++) {
if (keys[r].pressed) {
DS::setKeyHighlight(r, false);
OSystem_DS* system = OSystem_DS::instance();
Common::Event event;
createKeyEvent(r, event);
event.type = Common::EVENT_KEYUP;
system->addEvent(event);
keys[r].pressed = false;
}
}
}
void addKeyboardEvents() {
bool resetShift = false;
@ -446,7 +463,7 @@ void addKeyboardEvents() {
// consolePrintf("Key: %d\n", r);
if ((keys[r].character == Common::KEYCODE_INVALID)) {
// Close button
DS::closed = true;
//DS::closed = true;
} else {
createKeyEvent(r, event);
}
@ -492,9 +509,14 @@ void addKeyboardEvents() {
OSystem_DS* system = OSystem_DS::instance();
Common::Event event;
createKeyEvent(r, event);
event.type = Common::EVENT_KEYUP;
system->addEvent(event);
if ((keys[r].character == Common::KEYCODE_INVALID)) {
// Close button
DS::closed = true;
} else {
createKeyEvent(r, event);
event.type = Common::EVENT_KEYUP;
system->addEvent(event);
}
keys[r].pressed = false;

View File

@ -40,6 +40,7 @@ bool getKeyboardClosed();
void addAutoComplete(char* word);
void clearAutoComplete();
void setCharactersEntered(int count);
void releaseAllKeys();
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 B

View File

@ -36,3 +36,23 @@ allbuilds:
make all SCUMM_BUILD=f
make semiclean
make all SCUMM_BUILD=g
make semiclean
make all SCUMM_BUILD=h
allbuildssafe:
make clean SCUMM_BUILD=a
make all SCUMM_BUILD=a
make clean SCUMM_BUILD=b
make all SCUMM_BUILD=b
make clean SCUMM_BUILD=c
make all SCUMM_BUILD=c
make clean SCUMM_BUILD=d
make all SCUMM_BUILD=d
make clean SCUMM_BUILD=e
make all SCUMM_BUILD=e
make clean SCUMM_BUILD=f
make all SCUMM_BUILD=f
make clean SCUMM_BUILD=g
make all SCUMM_BUILD=g
make clean SCUMM_BUILD=h
make all SCUMM_BUILD=h