⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ggi.cpp

📁 SFC游戏模拟器 snes9x 1.43 的原代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        TEST_KEY('M',         0, SNES_X_MASK);        TEST_KEY('E',         0, SNES_X_MASK);                TEST_KEY('X',         0, SNES_Y_MASK);        TEST_KEY(GIIUC_Comma, 0, SNES_Y_MASK);        TEST_KEY('R',         0, SNES_Y_MASK);                TEST_KEY('D',         0, SNES_A_MASK);        TEST_KEY(GIIUC_Period,0, SNES_A_MASK);        TEST_KEY('T',         0, SNES_A_MASK);                TEST_KEY('C',         0, SNES_B_MASK);        TEST_KEY(GIIUC_Slash, 0, SNES_B_MASK);        TEST_KEY('Y',         0, SNES_B_MASK);                // Joypad 2:        TEST_KEY(GIIK_P8,     1, SNES_UP_MASK);        TEST_KEY(GIIK_P2,     1, SNES_DOWN_MASK);        TEST_KEY(GIIK_P6,     1, SNES_RIGHT_MASK);        TEST_KEY(GIIK_P4,     1, SNES_LEFT_MASK);        TEST_KEY(GIIK_PEnter, 1, SNES_START_MASK);        TEST_KEY(GIIK_PPlus,  1, SNES_SELECT_MASK);        TEST_KEY(GIIK_P0,     1, SNES_TL_MASK);        TEST_KEY(GIIK_PSeparator,1,SNES_TR_MASK);        TEST_KEY(GIIK_P7,     1, SNES_X_MASK);        TEST_KEY(GIIK_P1,     1, SNES_Y_MASK);        TEST_KEY(GIIK_P9,     1, SNES_A_MASK);        TEST_KEY(GIIK_P3,     1, SNES_B_MASK);                if(down)        {            if(event.key.label == GIIUC_Escape)S9xExit();                            if(event.key.label == '1')PPU.BG_Forced ^= 1;            if(event.key.label == '2')PPU.BG_Forced ^= 2;            if(event.key.label == '3')PPU.BG_Forced ^= 4;            if(event.key.label == '4')PPU.BG_Forced ^= 8;            if(event.key.label == '5')PPU.BG_Forced ^= 16;                    if(event.key.label == '6')Settings.SwapJoypads ^= TRUE;            if(event.key.label == '7')Settings.Transparency ^= TRUE;            if(event.key.label == '8')Settings.BGLayering ^= TRUE;            if(event.key.label == '9')Settings.InterpolatedSound ^= TRUE;            if(event.key.label == '0')Settings.DisableHDMA ^= TRUE;                        if(event.key.label == GIIK_Break)Settings.Paused ^= TRUE;                            if(event.key.label == GIIUC_BackSpace)                Settings.DisableGraphicWindows = !Settings.DisableGraphicWindows;                            if(event.key.label == GIIK_P5)kbdtrans_enabled ^= 1;                    int fn = -1;                        if(event.key.label == GIIK_F1)fn = 1;            if(event.key.label == GIIK_F2)fn = 2;            if(event.key.label == GIIK_F3)fn = 3;            if(event.key.label == GIIK_F4)fn = 4;            if(event.key.label == GIIK_F5)fn = 5;            if(event.key.label == GIIK_F6)fn = 6;            if(event.key.label == GIIK_F7)fn = 7;            if(event.key.label == GIIK_F8)fn = 8;            if(event.key.label == GIIK_F9)fn = 9;            if(event.key.label == GIIK_F10)fn = 10;            if(event.key.label == GIIK_F11)fn = 11;            if(event.key.label == GIIK_F12)fn = 12;                        int alt     = event.key.modifiers & GII_MOD_ALT;            int shift   = event.key.modifiers & GII_MOD_SHIFT;            int control = event.key.modifiers & GII_MOD_CTRL;                        if(!alt && !shift && !control)            {                if(fn == 11)                    S9xLoadSnapshot (S9xChooseFilename (TRUE));                else if(fn > 0)                {                    char def [PATH_MAX];                    char filename [PATH_MAX];                    char drive [_MAX_DRIVE];                    char dir [_MAX_DIR];                    char ext [_MAX_EXT];                        _splitpath (Memory.ROMFilename, drive, dir, def, ext);                    sprintf (filename, "%s%s%s.%03d",                         S9xGetSnapshotDirectory (), SLASH_STR, def,                         fn - 1);                    S9xLoadSnapshot (filename);                }            }            else if(alt || control)            {                if (fn >= 4)                    S9xToggleSoundChannel (fn - 4);#ifdef DEBUGGER                else if (fn == 1)                    CPU.Flags |= DEBUG_MODE_FLAG;#endif                else if (fn == 1)                    S9xSPCDump(S9xChooseFilename(2));                else if (fn == 2)                    S9xLoadSnapshot(S9xChooseFilename (TRUE));                else if (fn == 3)                    Snapshot(S9xChooseFilename(FALSE));            }            else if(fn > 0)            {                char def [PATH_MAX];                char filename [PATH_MAX];                char drive [_MAX_DRIVE];                char dir [_MAX_DIR];                char ext [_MAX_EXT];                _splitpath (Memory.ROMFilename, drive, dir, def, ext);                sprintf (filename, "%s%s%s.%03d",                         S9xGetSnapshotDirectory (), SLASH_STR, def,                         fn - 1);                Snapshot (filename);            }            if(event.key.button == 12)            {                if(shift)                {                    if (Settings.FrameTime > 1000)                        Settings.FrameTime -= 1000;                    else if(Settings.FrameTime > 100)                        Settings.FrameTime -= 100;                }                else                {                    if (Settings.SkipFrames <= 1)                        Settings.SkipFrames = AUTO_FRAMERATE;                    else if (Settings.SkipFrames != AUTO_FRAMERATE)                        Settings.SkipFrames--;                }                DrawSpeedIndicator();            }                        if(event.key.button == 13)            {                if(shift)                {                    if(Settings.FrameTime < 600)                        Settings.FrameTime += 100;                    else                        Settings.FrameTime += 1000;                }                else                {                    if (Settings.SkipFrames == AUTO_FRAMERATE)                        Settings.SkipFrames = 1;                    else if (Settings.SkipFrames < 20)                        Settings.SkipFrames++;                }                DrawSpeedIndicator();            }            if(event.key.label=='P')            {                if(alt==0)                {                    text_mode = TRUE;                    if(vis)ggiClose(vis);                    fprintf(stderr, "P: ggiExit: %d\n", ggiExit());                                        fprintf(stderr,                        "The game is now running in videoless mode.\r\n"                        "Press ENTER to re-enable graphics.\r\n");                }                else                {                    fprintf(stderr, "Alt: %d, Shift: %d, Ctrl: %d\n",                            alt,shift,control);                    event.any.type = evCommand;                    event.cmd.code = GGICMD_NOHALT_ON_UNMAP;                    ggiEventSend(vis, &event);                                        // FIXME: Unraw keyboard here!                }                                pause_mode = TRUE;                fcntl(STDIN_FILENO, F_SETFL, (saved_fcntl = fcntl(STDIN_FILENO, F_GETFL))|O_NONBLOCK);                        /* Exit loop, input handling became unstable. */                break;            }        }    }}void S9xSetTitle (const char *title){    title=title;}void S9xPutImage (int width, int height){    #if 1    if(text_mode)return;        if(dihdah)    {        int a, k;        putchar('F');        fwrite(&width,  1, sizeof(int), stdout);        fwrite(&height, 1, sizeof(int), stdout);        fwrite(GFX.Screen, 1, width*height, stdout);            fflush(stdout);        fcntl(STDIN_FILENO, F_SETFL, (a=fcntl(STDIN_FILENO, F_GETFL))|O_NONBLOCK);        k = getchar();        fcntl(STDIN_FILENO, F_SETFL, a);        if(k=='K')        {            ggi_event e;            fread(&e, 1, sizeof(e), stdin);            if(kbdtrans_enabled)ggiEventSend(vis, &e);        }    }    #endif        if(Settings.SixteenBit)    {        /* 16 bpp source */        switch(Bitness())        {          case 8:            Convert16to8();            break;          case 15:            Convert16to15();            break;          case 16:            Convert16to16();            break;          case 24:            Convert16to24();            break;          case 32:            Convert16to32();            break;          default:            break;        }    }    else    {        /* 8 bpp source */        switch(Bitness())        {          case 8:            Convert8to8();            break;          default:            break;        }    }    ggiFlush(vis);}const char *S9xSelectFilename (const char *def, const char *dir1,                            const char *ext1, const char *title){        char InputBuf[PATH_MAX];    strcpy(InputBuf, def);    char *s = InputBuf;    int cpos, len=strlen(s);    int fx, fy;        ggiGetCharSize(vis, &fx, &fy);        int max = vis_mode.visible.x / fx - 4;        ggiSetPalette(vis, 0,16, init_pal16);        ggiSetGCForeground(vis, 0);    ggiDrawBox(vis, 0,0, vis_mode.visible.x, fy*4);        unsigned bright, gray, blue, cyan;        switch(GT_DEPTH(vis_mode.graphtype))    {        case 8:            blue=1;            gray=7;            cyan=11;            bright=15;            break;        case 16:        case 15:            /* These don't work anyway */            break;        default:            blue   = 0x0000FF;            cyan   = 0x00FFFF;            gray   = 0x7F7F7F;            bright = 0xFFFFFF;    }        ggiSetGCForeground(vis, bright);    ggiSetGCBackground(vis, 0);    ggiPuts(vis, 0,fy, title);        if(len > max)s[len=max]=0;    cpos = len;        char *retval = NULL;        for(int x=2; ;)    {        int a, tick=0;        for(;;)        {            struct timeval tv = {0,100000};            for(a=0; a<max; a++)            {                int f = tick<6&&a==cpos;                ggiSetGCForeground(vis, f?blue:cyan);                ggiSetGCBackground(vis, f?gray:blue);                ggiPutc(vis, (x+a)*fx, fy+fy, a<len?s[a]:' ');            }            ggiFlush(vis);                if(ggiEventPoll(vis, gii_event_mask(emKeyPress | emKeyRepeat), &tv))break;            if(++tick==8)tick=4;        }        switch(a=ggiGetc(vis))        {            case '\n':            case '\r':                goto Done;            case GIIK_Left:                if(cpos>0)cpos--;                break;            case GIIK_Right:                if(cpos<len)cpos++;                break;            case GIIK_Home:                cpos=0;                break;            case GIIK_End:                cpos=len;                break;            case GIIUC_Escape:                goto Cancelled;            case GIIUC_Delete:            case GIIUC_BackSpace:                if(!cpos)break;                cpos--;                /* through */            /*case del:*/                if(cpos < len)                {                    memmove(s+cpos, s+1+cpos, len-cpos);                    len--;                }                break;            default:                if(len<max && a>=' ' && a<=255)                {                    memmove(s+cpos+1, s+cpos, len-cpos+1);                    s[cpos++]=a;                    len++;                }        }    }Done: ;    char fname [PATH_MAX];    char drive [_MAX_DRIVE];    char dir [_MAX_DIR];    char ext [_MAX_EXT];    _splitpath (InputBuf, drive, dir, fname, ext);    static char path [PATH_MAX];    _makepath (path, drive, *dir ? dir : dir1, fname, *ext ? ext : ext1);    retval = path;    Cancelled:    ggiSetGCBackground(vis, 0);    ggiSetGCForeground(vis, 0);    ggiFillscreen(vis);    S9xSetPalette();    DrawSpeedIndicator();        return retval;}void S9xParseDisplayArg(char **argv, int &ind, int){    CheckFirst();    if((!strcmp(argv[ind], "-m")     || !strcasecmp(argv[ind], "-mode")) && argv[ind + 1])        ggiParseMode(argv[++ind], &vis_mode);    else if(!strcasecmp(argv[ind], "-scale")         || !strcasecmp(argv[ind], "-sc"))        stretch = TRUE;    else if (!strncasecmp (argv [ind], "-y", 2))    {        Settings.SixteenBit = TRUE;        Settings.SupportHiRes = TRUE;        Settings.ForceTransparency = TRUE;        switch (argv[ind][2])        {            case 0:  interpolate = TRUE;  break;            case '1': interpolate = TRUE; break;            case '2': interpolate = 2; break;            case '3': interpolate = 3; break;            case '4': interpolate = 4; break;            case '5': interpolate = 5; break;        }    }    else if(!strcasecmp(argv[ind], "-dihdah")         || !strcasecmp(argv[ind], "-send"))    {        dihdah = TRUE;        kbdtrans_enabled = TRUE;    }    else        S9xUsage();}void S9xExtraUsage (){    S9xMessage(S9X_INFO, S9X_USAGE, "\-mode or -m modestr       Select screen mode (see libggi manual, specially doc/env.txt)");    S9xMessage(S9X_INFO, S9X_USAGE, "\-scale or -sc             Scale SNES screen to fit S-VGA screen (this probably slows a lot!)");    S9xMessage(S9X_INFO, S9X_USAGE, "\-y1,-y2,-y3,-y4,-y5       Select interpolating: 1=interpolate, 2=Super 2xSaI, 3=Super Eagle, 4=2xSaI, 5=soft");    S9xMessage(S9X_INFO, S9X_USAGE, "\-send or -dihdah          Send palette/screen actions to stdout, read kbd actions from stdin. Can be used for remote controlling.");}bool8 S9xReadMousePosition (int which1, int &x, int &y, uint32 &buttons){    which1=which1, x=x, y=y, buttons=buttons;    return FALSE;}bool8 S9xReadSuperScopePosition (int &x, int &y, uint32 &buttons){    x=x, y=y, buttons=buttons;    return FALSE;}void S9xMessage (int type, int number, const char *message){    CheckFirst();    type=type, number=number;    fprintf (stderr, "%s\n", message);}bool JustifierOffscreen(){  return false;}void JustifierButtons(uint32& justifiers){}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -