From aa8f15a828e925cc1e613d58367d452140eab2fb Mon Sep 17 00:00:00 2001 From: Marcus Comstedt Date: Thu, 18 Apr 2002 23:21:40 +0000 Subject: [PATCH] Megapatch: Updated to new OSystem interface and added CD audio. svn-id: r3998 --- dc/Makefile | 22 +++++-- dc/README | 2 +- dc/audio.cpp | 28 ++++++-- dc/dc.h | 104 ++++++++++++++++++++++++++++-- dc/dcmain.cpp | 168 ++++++++++++++++++++++++++++++++++-------------- dc/display.cpp | 119 ++++++++++++++++++---------------- dc/input.cpp | 64 ++++++++++++++---- dc/selector.cpp | 54 ++++++++++------ dc/vmsave.cpp | 16 +++-- 9 files changed, 417 insertions(+), 160 deletions(-) diff --git a/dc/Makefile b/dc/Makefile index 587a4f366ae..59e3b2281c6 100644 --- a/dc/Makefile +++ b/dc/Makefile @@ -1,12 +1,12 @@ # $Header$ -ronindir = /usr/local/ronin +ronindir = /home/marcus/hack/dreamcast/libronin VPATH = .. CC = sh-elf-g++ -ml -m4-single-only CFLAGS = -O1 -Wno-multichar -DEFINES = -D__DC__ -DNONSTANDARD_PORT -DUSE_ADLIB -DNONSTANDARD_SAVE +DEFINES = -D__DC__ -DNONSTANDARD_PORT -DNONSTANDARD_SAVE LDFLAGS := -Wl,-Ttext,0x8c010000 -nostartfiles ronin/crt0.o INCLUDES:= -I./ -I../ -I../sound CPPFLAGS= $(DEFINES) $(INCLUDES) @@ -17,8 +17,11 @@ INCS = scumm.h scummsys.h stdafx.h portdefs.h dc.h OBJS = actor.o boxes.o costume.o gfx.o object.o resource.o \ saveload.o script.o scummvm.o sound.o string.o \ sys.o verbs.o script_v1.o script_v2.o debug.o gui.o \ - sound/imuse.o sound/fmopl.o sound/adlib.o insane.o debugrl.o \ - akos.o vars.o dcmain.o display.o audio.o input.o selector.o icon.o \ + sound/imuse.o sound/fmopl.o sound/mixer.o debugrl.o \ + akos.o vars.o insane.o gameDetector.o init.o mp3_cd.o \ + v3/resource_v3.o v4/resource_v4.o main.o \ + simon/midi.o simon/simon.o simon/simonsys.o sound/mididrv.o \ + dcmain.o display.o audio.o input.o selector.o icon.o \ label.o vmsave.o .cpp.o: @@ -29,11 +32,20 @@ all: scummvm scummvm: $(OBJS) ronin $(CC) $(LDFLAGS) -o $(@) $(OBJS) $(LIBS) -$(OBJS): Makefile sound/.create ronin +$(OBJS): Makefile sound/.create simon/.create v3/.create v4/.create ronin sound/.create: mkdir sound && touch $@ +simon/.create: + mkdir simon && touch $@ + +v3/.create: + mkdir v3 && touch $@ + +v4/.create: + mkdir v4 && touch $@ + ronin: ln -s $(ronindir) $@ diff --git a/dc/README b/dc/README index 9113aa67afa..d4bf04c5bd7 100644 --- a/dc/README +++ b/dc/README @@ -9,7 +9,7 @@ you'll need the following: * newlib for sh-elf : -* libronin-0.2 : +* libronin-0.3 : * GNU make diff --git a/dc/audio.cpp b/dc/audio.cpp index 35dab8c5f61..863c1e97acc 100644 --- a/dc/audio.cpp +++ b/dc/audio.cpp @@ -24,19 +24,32 @@ #include "scumm.h" #include "dc.h" -#include - EXTERN_C void *memcpy4(void *s1, const void *s2, unsigned int n); -short temp_sound_buffer[RING_BUFFER_SAMPLES]; void initSound() { stop_sound(); - do_sound_command(CMD_SET_FREQ(0)); - do_sound_command(CMD_SET_BUFFER(0)); + do_sound_command(CMD_SET_FREQ_EXP(FREQ_22050_EXP)); + do_sound_command(CMD_SET_BUFFER(3)); } -void checkSound(Scumm *s) +bool OSystem_Dreamcast::set_sound_proc(void *param, SoundProc *proc, + byte format) +{ +#if SAMPLE_MODE == 0 + assert(format == SOUND_16BIT); +#elif SAMPLE_MODE == 1 + assert(format == SOUND_8BIT); +#else +#error Invalid SAMPLE_MODE +#endif + _sound_proc_param = param; + _sound_proc = proc; + + return true; +} + +void OSystem_Dreamcast::checkSound() { int n; int curr_ring_buffer_samples; @@ -56,7 +69,8 @@ void checkSound(Scumm *s) if(n<100) return; - s->mixWaves((short*)temp_sound_buffer, n); + _sound_proc(_sound_proc_param, (byte*)temp_sound_buffer, + SAMPLES_TO_BYTES(n)); if(fillpos+n > curr_ring_buffer_samples) { int r = curr_ring_buffer_samples - fillpos; diff --git a/dc/dc.h b/dc/dc.h index 5e6e43bda63..ed2c5f7a772 100644 --- a/dc/dc.h +++ b/dc/dc.h @@ -1,8 +1,102 @@ +#include +#define NUM_BUFFERS 4 + +class OSystem_Dreamcast : public OSystem { + + public: + // Set colors of the palette + void set_palette(const byte *colors, uint start, uint num); + + // Set the size of the video bitmap. + // Typically, 320x200 + void init_size(uint w, uint h); + + // Draw a bitmap to screen. + // The screen will not be updated to reflect the new bitmap + void copy_rect(const byte *buf, int pitch, int x, int y, int w, int h); + + // Update the dirty areas of the screen + void update_screen(); + + // Either show or hide the mouse cursor + bool show_mouse(bool visible); + + // Set the position of the mouse cursor + void set_mouse_pos(int x, int y); + + // Set the bitmap that's used when drawing the cursor. + void set_mouse_cursor(const byte *buf, uint w, uint h, int hotspot_x, int hotspot_y); + + // Shaking is used in SCUMM. Set current shake position. + void set_shake_pos(int shake_pos); + + // Get the number of milliseconds since the program was started. + uint32 get_msecs(); + + // Delay for a specified amount of milliseconds + void delay_msecs(uint msecs); + + // Create a thread + void *create_thread(ThreadProc *proc, void *param); + + // Get the next event. + // Returns true if an event was retrieved. + bool poll_event(Event *event); + + // Set function that generates samples + bool set_sound_proc(void *param, SoundProc *proc, byte sound); + + // Poll cdrom status + // Returns true if cd audio is playing + bool poll_cdrom(); + + // Play cdrom audio track + void play_cdrom(int track, int num_loops, int start_frame, int end_frame); + + // Stop cdrom audio track + void stop_cdrom(); + + // Update cdrom audio status + void update_cdrom(); + + // Quit + void quit(); + + // Set a parameter + uint32 property(int param, uint32 value); + + static OSystem *create(); + + + private: + + int _ms_cur_x, _ms_cur_y, _ms_cur_w, _ms_cur_h, _ms_old_x, _ms_old_y; + int _ms_hotspot_x, _ms_hotspot_y, _ms_visible, _devpoll; + int _current_shake_pos; + unsigned char *_ms_buf; + SoundProc *_sound_proc; + void *_sound_proc_param; + + unsigned char *screen; + unsigned short *mouse; + void *screen_tx[NUM_BUFFERS]; + void *mouse_tx[NUM_BUFFERS]; + int current_buffer; + unsigned short palette[256]; + + short temp_sound_buffer[RING_BUFFER_SAMPLES]; + + void checkSound(); + + void drawMouse(int xdraw, int ydraw, int w, int h, + unsigned char *buf, bool visible); + +}; + +extern int handleInput(struct mapledev *pad, + int &mouse_x, int &mouse_y, + byte &shiftFlags); extern void initSound(); -extern void checkSound(Scumm *s); -extern void handleInput(struct mapledev *pad, int16 &mouse_x, int16 &mouse_y, - byte &leftBtnPressed, byte &rightBtnPressed, - int &keyPressed); -extern bool selectGame(Scumm *s, char *&, char *&, class Icon &); +extern bool selectGame(GameDetector *d, char *&, char *&, class Icon &); diff --git a/dc/dcmain.cpp b/dc/dcmain.cpp index e2ff7c56489..a8451f71d36 100644 --- a/dc/dcmain.cpp +++ b/dc/dcmain.cpp @@ -22,33 +22,127 @@ #include "stdafx.h" #include "scumm.h" -#include "gui.h" +#include "mididrv.h" +#include "gameDetector.h" #include "dc.h" #include "icon.h" -Scumm scumm; -ScummDebugger debugger; -Gui gui; Icon icon; -IMuse sound; -SOUND_DRIVER_TYPE snd_driv; -/* CD Audio stubs */ -void cd_playtrack(int track, int offset, int delay) {;} -void cd_play(int track, int num_loops, int start_frame) {;} -void cd_stop() {;} -int cd_is_running() {return 0;} - -void launcherLoop() { - /* No launcher on DC yet => stub function */ +OSystem *OSystem_Dreamcast_create() { + return OSystem_Dreamcast::create(); } -void BoxTest(int num) { - /* No debugger on the DC => stub function */ +OSystem *OSystem_Dreamcast::create() { + OSystem_Dreamcast *syst = new OSystem_Dreamcast(); + return syst; } +/* CD Audio */ +static bool find_track(int track, int &first_sec, int &last_sec) +{ + struct TOC *toc = cdfs_gettoc(); + if(!toc) + return false; + int i, first, last; + first = TOC_TRACK(toc->first); + last = TOC_TRACK(toc->last); + if(first < 1 || last > 99 || first > last) + return false; + for(i=last; i>=first; --i) + if(!(TOC_CTRL(toc->entry[i-1])&4)) + if(track==1) { + first_sec = TOC_LBA(toc->entry[i-1]); + last_sec = TOC_LBA(toc->entry[i]); + return true; + } else + --track; + return false; +} + +void OSystem_Dreamcast::play_cdrom(int track, int num_loops, + int start_frame, int end_frame) +{ + int first_sec, last_sec; +#if 1 + if(num_loops) + --num_loops; +#endif + if(num_loops>14) num_loops=14; + else if(num_loops<0) num_loops=15; // infinity + if(!find_track(track, first_sec, last_sec)) + return; + if(end_frame) + last_sec = first_sec + start_frame + end_frame; + first_sec += start_frame; + play_cdda_sectors(first_sec, last_sec, num_loops); +} + +void OSystem_Dreamcast::stop_cdrom() +{ + stop_cdda(); +} + +bool OSystem_Dreamcast::poll_cdrom() +{ + extern int getCdState(); + return getCdState() == 3; +} + +void OSystem_Dreamcast::update_cdrom() +{ + // Dummy. The CD drive takes care of itself. +} + +uint32 OSystem_Dreamcast::property(int param, uint32 value) +{ + switch(param) { + + case PROP_GET_SAMPLE_RATE: + return 22050; + + } + + return 0; +} + +void OSystem_Dreamcast::quit() { + exit(0); +} + +void *OSystem_Dreamcast::create_thread(ThreadProc *proc, void *param) { + warning("Creating a thread! (not supported.)\n"); +} + +uint32 OSystem_Dreamcast::get_msecs() +{ + static uint32 msecs=0; + static unsigned int t0=0; + + unsigned int t = Timer(); + unsigned int dm, dt = t - t0; + + t0 = t; + dm = (dt << 6)/3125U; + dt -= (dm * 3125U)>>6; + t0 -= dt; + + return msecs += dm; +} + +void OSystem_Dreamcast::delay_msecs(uint msecs) +{ + get_msecs(); + unsigned int t, start = Timer(); + int time = (((unsigned int)msecs)*100000U)>>11; + while(((int)((t = Timer())-start))0) { setimask(15); - checkSound(s); + checkSound(); handleInput(locked_get_pads(), s->mouse.x, s->mouse.y, s->_leftBtnPressed, s->_rightBtnPressed, s->_keyPressed); setimask(mask); devpoll += USEC_TO_TIMER(17000); if(s->mouse.x != oldmousex || s->mouse.y != oldmousey) { + extern void updateScreen(Scumm *s); updateScreen(s); oldmousex = s->mouse.x; oldmousey = s->mouse.y; } } } +*/ -static char *argv[] = { "scummvm", NULL, NULL, NULL }; -static int argc = 3; - -int main() +int dc_setup(GameDetector &detector) { - int delta,tmp; - int last_time, new_time; + static char *argv[] = { "scummvm", NULL, NULL, NULL }; + static int argc = 3; #ifndef NOSERIAL serial_init(57600); @@ -96,33 +189,10 @@ int main() initSound(); - if(!selectGame(&scumm, argv[2], argv[1], icon)) + if(!selectGame(&detector, argv[2], argv[1], icon)) exit(0); - sound.initialize(&scumm, &snd_driv); + // sound.initialize(&scumm, &snd_driv); - scumm._gui = &gui; - scumm.scummMain(argc, argv); - - gui.init(&scumm); - - last_time = Timer(); - delta = 0; - do { - updateScreen(&scumm); - - new_time = Timer(); - waitForTimer(&scumm, delta * 15 - ((new_time - last_time)<<11)/100000); - last_time = Timer(); - - if (gui._active) { - gui.loop(); - delta = 5; - } else { - delta = scumm.scummLoop(delta); - } - } while(1); - - /* NOTREACHED */ - exit(0); + detector.parseCommandLine(argc, argv); } diff --git a/dc/display.cpp b/dc/display.cpp index 7db22113110..aeda52e7545 100644 --- a/dc/display.cpp +++ b/dc/display.cpp @@ -28,7 +28,6 @@ #define SCREEN_H 200 #define MOUSE_W 64 #define MOUSE_H 64 -#define NUM_BUFFERS 4 #define TOP_OFFSET 40.0 @@ -36,15 +35,6 @@ #define QACR1 (*(volatile unsigned int *)(void *)0xff00003c) -static unsigned char *screen = NULL; -static unsigned short *mouse = NULL; -static void *screen_tx[NUM_BUFFERS] = { NULL, }; -static void *mouse_tx[NUM_BUFFERS] = { NULL, }; -static int current_buffer = 0; -static int shakePos = 0; -unsigned short palette[256]; - - #define COPYPIXEL(n) do { \ unsigned short _tmp = pal[*s++]; \ d[n] = _tmp|(pal[*s++]<<16); \ @@ -100,38 +90,79 @@ void commit_dummy_transpoly() } -void updatePalette(Scumm *s) +void OSystem_Dreamcast::set_palette(const byte *colors, uint start, uint num) { - int first = s->_palDirtyMin; - int num = s->_palDirtyMax - first + 1; - unsigned char *src = s->_currentPalette; - unsigned short *dst = palette + first; - src += first*3; + unsigned short *dst = palette + start; if(num>0) while( num-- ) { - *dst++ = ((src[0]<<7)&0x7c00)| - ((src[1]<<2)&0x03e0)| - ((src[2]>>3)&0x001f); - src += 3; + *dst++ = ((colors[0]<<7)&0x7c00)| + ((colors[1]<<2)&0x03e0)| + ((colors[2]>>3)&0x001f); + colors += 4; } } -void blitToScreen(Scumm *s, unsigned char *src, int x, int y, int w, int h) +void OSystem_Dreamcast::init_size(uint w, uint h) +{ + assert(w == SCREEN_W && h == SCREEN_H); + + ta_sync(); + if(!screen) + screen = new unsigned char[SCREEN_W*SCREEN_H]; + for(int i=0; i_palDirtyMax != -1) { - updatePalette(s); - } - for( int y = 0; y>5, palette ); @@ -179,7 +206,7 @@ void updateScreen(Scumm *s) myvertex.v = 0.0; myvertex.x = 0.0; - myvertex.y = shakePos*2.0+TOP_OFFSET; + myvertex.y = _current_shake_pos*2.0+TOP_OFFSET; ta_commit_list(&myvertex); myvertex.x = SCREEN_W*2.0; @@ -199,7 +226,7 @@ void updateScreen(Scumm *s) ta_commit_end(); // *((volatile unsigned int *)(void*)0xa05f8040) = 0xffff00; - s->drawMouse(); + drawMouse(_ms_cur_x, _ms_cur_y, _ms_cur_w, _ms_cur_h, _ms_buf, _ms_visible); // *((volatile unsigned int *)(void*)0xa05f8040) = 0xff00ff; ta_commit_frame(); @@ -208,8 +235,8 @@ void updateScreen(Scumm *s) // *((volatile unsigned int *)(void*)0xa05f8040) = 0x0; } -void drawMouse(int xdraw, int ydraw, int w, int h, - unsigned char *buf, bool visible) +void OSystem_Dreamcast::drawMouse(int xdraw, int ydraw, int w, int h, + unsigned char *buf, bool visible) { struct polygon_list mypoly; struct packed_colour_vertex_list myvertex; @@ -253,15 +280,15 @@ void drawMouse(int xdraw, int ydraw, int w, int h, myvertex.u = 0.0; myvertex.v = 0.0; - myvertex.x = xdraw*2.0; - myvertex.y = (ydraw+shakePos)*2.0 + TOP_OFFSET; + myvertex.x = (xdraw-_ms_hotspot_y)*2.0; + myvertex.y = (ydraw+_current_shake_pos-_ms_hotspot_x)*2.0 + TOP_OFFSET; ta_commit_list(&myvertex); myvertex.x += w*2.0; myvertex.u = w*(1.0/MOUSE_W); ta_commit_list(&myvertex); - myvertex.x = xdraw*2.0; + myvertex.x = (xdraw-_ms_hotspot_y)*2.0; myvertex.y += h*2.0; myvertex.u = 0.0; myvertex.v = h*(1.0/MOUSE_H); @@ -273,19 +300,3 @@ void drawMouse(int xdraw, int ydraw, int w, int h, ta_commit_list(&myvertex); } -void initGraphics(Scumm *s, bool fullScreen, unsigned int scaleFactor) -{ - ta_sync(); - if(!screen) - screen = new unsigned char[SCREEN_W*SCREEN_H]; - for(int i=0; ifunc & MAPLE_FUNC_CONTROLLER) { int buttons = pad->cond.controller.buttons; @@ -68,8 +69,11 @@ void handleInput(struct mapledev *pad, int16 &mouse_x, int16 &mouse_y, int key = pad->cond.kbd.key[p]; if(shift & 0x08) lmb++; if(shift & 0x80) rmb++; + if(shift & 0x11) shiftFlags |= OSystem::KBD_CTRL; + if(shift & 0x44) shiftFlags |= OSystem::KBD_ALT; + if(shift & 0x22) shiftFlags |= OSystem::KBD_SHIFT; if(key >= 4 && key <= 0x1d) - newkey = key+((shift & 0x22)? ('A'-4) : ('a'-4)); + newkey = key+('a'-4); else if(key >= 0x1e && key <= 0x26) newkey = key+((shift & 0x22)? ('!'-0x1e) : ('1'-0x1e)); else if(key >= 0x59 && key <= 0x61) @@ -106,28 +110,64 @@ void handleInput(struct mapledev *pad, int16 &mouse_x, int16 &mouse_y, } if(lmb && !lastlmb) { - leftBtnPressed |= msClicked|msDown; lastlmb = 1; + return -OSystem::EVENT_LBUTTONDOWN; } else if(lastlmb && !lmb) { - leftBtnPressed &= ~msDown; lastlmb = 0; + return -OSystem::EVENT_LBUTTONUP; } if(rmb && !lastrmb) { - rightBtnPressed |= msClicked|msDown; lastrmb = 1; + return -OSystem::EVENT_RBUTTONDOWN; } else if(lastrmb && !rmb) { - rightBtnPressed &= ~msDown; lastrmb = 0; + return -OSystem::EVENT_RBUTTONUP; } if(!newkey) lastkey = 0; else if(newkey != lastkey) - keyPressed = lastkey = newkey; + return lastkey = newkey; - if (mouse_x<0) mouse_x=0; - if (mouse_x>319) mouse_x=319; - if (mouse_y<0) mouse_y=0; - if (mouse_y>199) mouse_y=199; + return 0; +} + +bool OSystem_Dreamcast::poll_event(Event *event) +{ + unsigned int t = Timer(); + if(((int)(t-_devpoll))<0) + return false; + _devpoll += USEC_TO_TIMER(17000); + int mask = getimask(); + setimask(15); + checkSound(); + int e = handleInput(locked_get_pads(), _ms_cur_x, _ms_cur_y, + event->kbd.flags); + setimask(mask); + if (_ms_cur_x<0) _ms_cur_x=0; + if (_ms_cur_x>319) _ms_cur_x=319; + if (_ms_cur_y<0) _ms_cur_y=0; + if (_ms_cur_y>199) _ms_cur_y=199; + event->mouse.x = _ms_cur_x; + event->mouse.y = _ms_cur_y; + event->kbd.ascii = event->kbd.keycode = 0; + if(e<0) { + event->event_code = -e; + return true; + } else if(e>0) { + event->event_code = EVENT_KEYDOWN; + event->kbd.keycode = e; + event->kbd.ascii = (e>='a' && e<='z' && (event->kbd.flags & KBD_SHIFT)? + e &~ 0x20 : e); + return true; + } else if(_ms_cur_x != _ms_old_x || _ms_cur_y != _ms_old_y) { + event->event_code = EVENT_MOUSEMOVE; + _ms_old_x = _ms_cur_x; + _ms_old_y = _ms_cur_y; + return true; + } else { + event->event_code = 0; + return false; + } } diff --git a/dc/selector.cpp b/dc/selector.cpp index f82215689bd..22cba5bbfc8 100644 --- a/dc/selector.cpp +++ b/dc/selector.cpp @@ -22,6 +22,8 @@ #include "stdafx.h" #include "scumm.h" +#include "mididrv.h" +#include "gameDetector.h" #include "dc.h" #include "icon.h" #include "label.h" @@ -159,16 +161,27 @@ static bool isGame(const char *fn, char *base) return false; } -static void checkName(Scumm *s, Game &game) +static void checkName(GameDetector *d, Game &game) { - s->_exe_name = game.filename_base; - if(s->detectGame()) { - char *n = s->getGameName(); + d->_exe_name = game.filename_base; + if(d->detectGame()) { + char *n = d->getGameName(); strcpy(game.text, n); free(n); } else strcpy(game.text, game.filename_base); - s->_exe_name = NULL; + d->_exe_name = NULL; +} + +static bool checkExe(const char *dir, const char *f) +{ + char fn[520]; + int fd; + sprintf(fn, "%s%s.EXE", dir, f); + if((fd = open(fn, O_RDONLY))<0) + return false; + close(fd); + return true; } static bool isIcon(const char *fn) @@ -202,7 +215,7 @@ static void makeDefIcon(Icon &icon) icon.load(NULL, 0); } -static int findGames(Scumm *s, Game *games, int max) +static int findGames(GameDetector *d, Game *games, int max) { Dir *dirs = new Dir[MAX_DIR]; int curr_game = 0, curr_dir = 0, num_dirs = 1; @@ -242,8 +255,10 @@ static int findGames(Scumm *s, Game *games, int max) games[curr_game].dir[i+1]='\0'; #endif } + if(checkExe(games[curr_game].dir, "loom")) + strcpy(games[curr_game].filename_base, "loomcd"); } - checkName(s, games[curr_game]); + checkName(d, games[curr_game]); #if 0 printf("Registered game <%s> in <%s> <%s> because of <%s> <%s>\n", games[curr_game].text, games[curr_game].dir, @@ -306,13 +321,12 @@ void waitForDisk() ta_commit_frame(); - int16 mousex = 0, mousey = 0; - byte lmb=0, rmb=0; - int key=0; + int mousex = 0, mousey = 0; + byte shiftFlags; int mask = getimask(); setimask(15); - handleInput(locked_get_pads(), mousex, mousey, lmb, rmb, key); + handleInput(locked_get_pads(), mousex, mousey, shiftFlags); setimask(mask); } } @@ -329,7 +343,7 @@ static void drawGameLabel(Game &game, int pal, float x, float y, int gameMenu(Game *games, int num_games) { int top_game = 0, selector_pos = 0; - int16 mousex = 0, mousey = 64; + int mousex = 0, mousey = 0; if(!num_games) return -1; @@ -361,15 +375,15 @@ int gameMenu(Game *games, int num_games) ta_commit_frame(); - byte lmb=0, rmb=0; - int key=0; + byte shiftFlags; + int event; int mask = getimask(); setimask(15); - handleInput(locked_get_pads(), mousex, mousey, lmb, rmb, key); + event = handleInput(locked_get_pads(), mousex, mousey, shiftFlags); setimask(mask); - if(lmb || key==13 || key==319) { + if(event==-OSystem::EVENT_LBUTTONDOWN || event==13 || event==319) { int selected_game = top_game + selector_pos; for(int fade=0; fade<=256; fade+=4) { @@ -402,14 +416,14 @@ int gameMenu(Game *games, int num_games) return selected_game; } - if(mousey>=64+16) { + if(mousey>=16) { if(selector_pos + top_game + 1 < num_games) if(++selector_pos >= 10) { --selector_pos; ++top_game; } mousey -= 16; - } else if(mousey<=64-16) { + } else if(mousey<=-16) { if(selector_pos + top_game > 0) if(--selector_pos < 0) { ++selector_pos; @@ -420,7 +434,7 @@ int gameMenu(Game *games, int num_games) } } -bool selectGame(Scumm *s, char *&ret, char *&dir_ret, Icon &icon) +bool selectGame(GameDetector *d, char *&ret, char *&dir_ret, Icon &icon) { Game *games = new Game[MAX_GAMES]; int selected, num_games; @@ -429,7 +443,7 @@ bool selectGame(Scumm *s, char *&ret, char *&dir_ret, Icon &icon) void *mark = ta_txmark(); for(;;) { - num_games = findGames(s, games, MAX_GAMES); + num_games = findGames(d, games, MAX_GAMES); for(int i=0; igetGameName(); + char *game_name = d->getGameName(); strncpy(header.longdesc, game_name, 32); free(game_name); strncpy(header.id, "ScummVM", 16); @@ -125,17 +127,17 @@ static bool tryLoad(char *&buffer, int &size, const char *filename, int vm) return false; } -vmsaveResult writeSaveGame(Scumm *s, const char *data, int size, +vmsaveResult writeSaveGame(GameDetector *d, const char *data, int size, const char *filename, class Icon &icon) { vmsaveResult r, res = VMSAVE_NOVM; if(lastvm >= 0 && - (res = trySave(s, data, size, filename, icon, lastvm)) == VMSAVE_OK) + (res = trySave(d, data, size, filename, icon, lastvm)) == VMSAVE_OK) return res; for(int i=0; i<24; i++) - if((r = trySave(s, data, size, filename, icon, i)) == VMSAVE_OK) { + if((r = trySave(d, data, size, filename, icon, i)) == VMSAVE_OK) { lastvm = i; return r; } else if(r > res) @@ -200,7 +202,7 @@ bool SerializerStream::fopen(const char *filename, const char *mode) void SerializerStream::fclose() { - extern Scumm scumm; + extern GameDetector detector; extern Icon icon; if(context) { @@ -216,7 +218,7 @@ void SerializerStream::fclose() c->pos = destlen; } else delete compbuf; } - writeSaveGame(&scumm, c->buffer, c->pos, + writeSaveGame(&detector, c->buffer, c->pos, c->filename, icon); } delete c->buffer;