win_sys.c

来自「经典的老游戏digger的源代码.提起digger相信很多人会回忆起曾经为了它挑」· C语言 代码 · 共 1,185 行 · 第 1/3 页

C
1,185
字号
/* Digger Remastered
   Copyright (c) Andrew Jenner 1998-2004 */

#define INITGUID
#include "def.h"
#include <stdio.h>
#include <stdlib.h>
#include "win_dig.h"
#include <windowsx.h>
#include "resource.h"
#include "scores.h"
#include <commctrl.h>
#include "win_vid.h"
#include "win_snd.h"
#include "win_cfg.h"
#include "main.h"
#include "ini.h"
#include "hardware.h"
#include "sprite.h"
#include "record.h"
#include "scores.h"

extern void finish(void);
extern int keycodes[17][5];
extern void redefkeyb(bool allf);
extern void parsecmd(int argc,char *argv[]);

extern bool joyflag;

/* these are used by the menu/dialogue boxes */
extern Sint4 nplayers,diggers,curplayer,startlev;
extern bool start;
extern void shownplayers(void);
extern bool gauntlet;
extern int gtime;
extern bool soundflag,musicflag;
extern bool pausef;
extern Uint5 ftime;
extern bool timeout;
extern Uint4 size;
extern bool soundlevdoneflag;
extern bool escape;
extern Sint4 frame;
extern bool started;

HINSTANCE hDirectDrawInstance=NULL;
HINSTANCE hDirectSoundInstance=NULL;
HRESULT (WINAPI *lpDirectSoundCreate)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN);
HRESULT (WINAPI *lpDirectDrawCreate)(GUID FAR *lpGUID, LPDIRECTDRAW FAR *lplpDD, IUnknown FAR *pUnkOuter );
bool check_for_direct_x=TRUE;

// This will store a copy of the original level data so that the user can return to using the original set of level, after loading one of the DLF files
Sint3 orig_leveldat[8][MHEIGHT][MWIDTH];
Uint4 orig_bonusscore;

// This will store a copy of the 'current' level data so that the current level data is not lost when a DRF is played
Sint3 backup_leveldat[8][MHEIGHT][MWIDTH];
Uint4 backup_bonusscore;
char backup_levfname[FILENAME_BUFFER_SIZE];
bool backup_levfflag;

char drf_filename[FILENAME_BUFFER_SIZE]="";
int use_direct_input=0;

bool suspend_game=FALSE;
HWND hWnd;
SIZE window_size;
HINSTANCE g_hInstance;
bool reset_main_menu_screen=FALSE;
bool use_performance_counter;
_int64 performance_frequency;
int kb_buffer=0;
int command_buffer=0;

HWND cur_dialog_box=(HWND) NULL;
char* params[10];
int param_count;
bool main_function_started=FALSE;   /* has main() been called yet? */
bool shutting_down=FALSE;
HMENU hMenu;
char digger_dir[256];

LRESULT CALLBACK gauntlet_settings_dialog_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK sound_settings_dialog_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK help_about_dialog_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK levels_dialog_proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);

/* time routines */
void olddelay(Sint4 t) { };
Sint5 getkips(void) { return 0; };
void inittimer(void){ };
Uint5 gethrt(void)
{
  return (Uint5) ((DWORD) GetTickCount() * 1193l);
//  return (Uint5) ((DWORD) GetTickCount());
};

Sint5 getlrt(void)
{
  return gethrt();
};

Sint4 getkey(void)  // returns the Virtual Key Code of the last key pressed
{
  Sint4 temp_buffer;
  do
  {
    if (kb_buffer)
    {
      temp_buffer=kb_buffer;
      kb_buffer=0;
      return temp_buffer;
    }
    else
      do_windows_events();
  } while (TRUE);

};

Sint4 getcommand(void)   // similar to getkey() but the value returned has already been translated from the keycode to the function/command that the key is mapped to
{
  Sint4 temp_buffer;

  temp_buffer=command_buffer;
  command_buffer=0;
  return temp_buffer;
};
bool kbhit(void)
{
  return (kb_buffer!=0);
};
bool cmdhit(void)
{
  return (command_buffer);
}

void initkeyb(void) {};
void restorekeyb(void) {};


void clear_nplayerlines()
{
  outtext("          ",180,25,3);
  outtext("            ",170,39,3);
}

void refresh_menu_items()
{
  /* set checkmarks, etc. */
  HMENU cur_menu;

  cur_menu=GetMenu(hWnd);
  CheckMenuItem(cur_menu, ID_GAME_PLAYERS_ONE, MF_BYCOMMAND | (diggers>1||nplayers>1 ? MF_UNCHECKED : MF_CHECKED));
  CheckMenuItem(cur_menu, ID_GAME_PLAYERS_TWO, MF_BYCOMMAND | (diggers>1||nplayers!=2 ? MF_UNCHECKED : MF_CHECKED));
  CheckMenuItem(cur_menu, ID_GAME_PLAYERS_TWOSIMULTANEOUS, MF_BYCOMMAND | (diggers!=2 ? MF_UNCHECKED : MF_CHECKED));
  CheckMenuItem(cur_menu, ID_GAME_MODE_NORMAL, MF_BYCOMMAND | (gauntlet ? MF_UNCHECKED : MF_CHECKED));
  CheckMenuItem(cur_menu, ID_GAME_MODE_GAUNTLET, MF_BYCOMMAND | (!gauntlet ? MF_UNCHECKED : MF_CHECKED));
  CheckMenuItem(cur_menu, ID_SOUND_SOUNDS_PLAY, MF_BYCOMMAND | (!soundflag ? MF_UNCHECKED : MF_CHECKED));
  CheckMenuItem(cur_menu, ID_SOUND_MUSIC_PLAY, MF_BYCOMMAND | (!musicflag ? MF_UNCHECKED : MF_CHECKED));
  CheckMenuItem(cur_menu, ID_CONFIGURATION_GRAPHICS_ASYNCHRONOUS, MF_BYCOMMAND | (!use_async_screen_updates ? MF_UNCHECKED : MF_CHECKED));
  CheckMenuItem(cur_menu, ID_CONFIGURATION_SPEED_DEFAULT, MF_BYCOMMAND | (ftime!=80000l ? MF_UNCHECKED : MF_CHECKED));
  CheckMenuItem(cur_menu, ID_VIEW_FULLSCREEN, MF_BYCOMMAND | (g_bWindowed ? MF_UNCHECKED : MF_CHECKED));
  EnableMenuItem(cur_menu, ID_VIEW_FULLSCREEN, MF_BYCOMMAND | (use_direct_draw /*==6*/ ? MF_ENABLED : MF_GRAYED));
  CheckMenuItem(cur_menu, ID_VIEW_VGAGRAPHICS, MF_BYCOMMAND | (video_mode==VIDEO_MODE_VGA_16 ? MF_CHECKED : MF_UNCHECKED));
  CheckMenuItem(cur_menu, ID_VIEW_CGAGRAPHICS, MF_BYCOMMAND | (video_mode==VIDEO_MODE_CGA ? MF_CHECKED : MF_UNCHECKED));
  EnableMenuItem(cur_menu, ID_RECORDING_SAVE, MF_BYCOMMAND | (gotgame && drfvalid) ? MF_ENABLED : MF_GRAYED);
  EnableMenuItem(cur_menu, ID_RECORDING_INSTANTREPLAY, MF_BYCOMMAND | (gotgame && drfvalid) ? MF_ENABLED : MF_GRAYED);
}

void show_game_menu()
{
 /* Display the menu which should be displayed when a game is in progress */
  HMENU main_menu;
  HMENU cur_menu;

  main_menu = GetMenu(hWnd);
  EnableMenuItem(main_menu, ID_GAME_ABORT, MF_BYCOMMAND | MF_ENABLED);
  EnableMenuItem(main_menu, ID_GAME_PAUSE, MF_BYCOMMAND | MF_ENABLED);
  EnableMenuItem(main_menu, ID_GAME_START, MF_BYCOMMAND | MF_GRAYED);
  EnableMenuItem(main_menu, ID_VIEW_VGAGRAPHICS, MF_BYCOMMAND | MF_GRAYED);
  EnableMenuItem(main_menu, ID_VIEW_CGAGRAPHICS, MF_BYCOMMAND | MF_GRAYED);
  EnableMenuItem(main_menu, ID_CONFIGURATION_CONTROLS_KEYBOARD_REDEFINEKEYS, MF_BYCOMMAND | MF_GRAYED);
  EnableMenuItem(main_menu, ID_CONFIGURATION_CONTROLS_KEYBOARD_REDEFINEALLKEYS, MF_BYCOMMAND | MF_GRAYED);
  cur_menu = GetSubMenu(main_menu, 0);
  EnableMenuItem(cur_menu, 5, MF_BYPOSITION | MF_GRAYED); // MODE>
  EnableMenuItem(cur_menu, 6, MF_BYPOSITION | MF_GRAYED); // PLAYERS>
  EnableMenuItem(cur_menu, 7, MF_BYPOSITION | MF_GRAYED); // LEVELS...
  EnableMenuItem(cur_menu, 9, MF_BYPOSITION | MF_GRAYED); // Recording>
}

void show_main_menu()
{
  /* Display menu for title/high score screen */
  HMENU main_menu;
  HMENU cur_menu;

  main_menu=GetMenu(hWnd);
  EnableMenuItem(main_menu, ID_GAME_ABORT, MF_BYCOMMAND | MF_GRAYED);
  EnableMenuItem(main_menu, ID_GAME_PAUSE, MF_BYCOMMAND | MF_GRAYED);
  EnableMenuItem(main_menu, ID_GAME_START, MF_BYCOMMAND | MF_ENABLED);
  EnableMenuItem(main_menu, ID_VIEW_VGAGRAPHICS, MF_BYCOMMAND | MF_ENABLED);
  EnableMenuItem(main_menu, ID_VIEW_CGAGRAPHICS, MF_BYCOMMAND | MF_ENABLED);
  EnableMenuItem(main_menu, ID_RECORDING_PLAY, MF_BYCOMMAND | MF_ENABLED);
  EnableMenuItem(main_menu, ID_CONFIGURATION_CONTROLS_KEYBOARD_REDEFINEKEYS, MF_BYCOMMAND | MF_ENABLED);
  EnableMenuItem(main_menu, ID_CONFIGURATION_CONTROLS_KEYBOARD_REDEFINEALLKEYS, MF_BYCOMMAND | MF_ENABLED);
  cur_menu=GetSubMenu(main_menu,0);
  EnableMenuItem(cur_menu, 5, MF_BYPOSITION | MF_ENABLED); // MODE>
  EnableMenuItem(cur_menu, 6, MF_BYPOSITION | MF_ENABLED); // PLAYERS>
  EnableMenuItem(cur_menu, 7, MF_BYPOSITION | MF_ENABLED); // LEVEL...
  EnableMenuItem(cur_menu, 9, MF_BYPOSITION | MF_ENABLED); // Recordings>
  cur_menu=GetSubMenu(main_menu, 1);
}

void refresh_screen_info()
{
  /* called whenever the user switches the number of players or the game type */
  loadscores();
  showtable();
  clear_nplayerlines();
  shownplayers();
}

LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  HRESULT hRet;
  BYTE clear_keyboard_state[256];

  switch(message)
  {
  case WM_KEYDOWN:
    //if (wParam!=VK_SHIFT && wParam!=VK_CONTROL)
    //{
      kb_buffer=wParam;
    //}
    if (wParam==VK_MENU && !g_bWindowed)
      SetMenu(hWnd,hMenu);
    return 0;

  case WM_SYSKEYDOWN:
    switch (wParam)
    {
/*
    case VK_RETURN:
      if (use_direct_draw)
        toggle_screen_mode();
      return 0;
*/
    case VK_MENU:
      if (!g_bWindowed)
        SetMenu(hWnd,hMenu);
    }
    break;

  case WM_SYSKEYUP:
    switch (wParam)
    {
    case VK_F10:
      kb_buffer=VK_F10;
      return 0;
    }
    break;

  /************************************/
  /* menu commands                    */
  /************************************/
  case WM_COMMAND:
    switch (LOWORD(wParam))
    {
    case VK_F10:
      kb_buffer=VK_F10;
    case ID_GAME_EXIT:
      SendMessage(hWnd, WM_CLOSE, 0, 0L);
      break;
    case ID_VIEW_FULLSCREEN:
      toggle_screen_mode();
      break;
    case ID_GAME_PLAYERS_ONE:
      nplayers=1;
      diggers=1;
      refresh_screen_info();
      break;
    case ID_GAME_PLAYERS_TWO:
      nplayers=2;
      diggers=1;
      gauntlet=FALSE;
      refresh_screen_info();
      break;
    case ID_GAME_PLAYERS_TWOSIMULTANEOUS:
      nplayers=1;
      diggers=2;
      refresh_screen_info();
      break;
    case ID_GAME_MODE_NORMAL:
      gauntlet=FALSE;
      timeout=FALSE;  /* must do this in case the previous game was a guantlet game */
      refresh_screen_info();
      break;
    case ID_GAME_MODE_GAUNTLET:
      gauntlet=TRUE;
      nplayers=1;
      if (!gtime)
        gtime=120;
      refresh_screen_info();
      if (do_dialog_box(g_hInstance,
                    MAKEINTRESOURCE(IDD_DIALOG_GAUNTLET_SETTINGS),
                    hWnd, (DLGPROC) gauntlet_settings_dialog_proc))
        WriteINIInt(INI_GAME_SETTINGS, "GauntletTime", gtime, ININAME);
      break;
    case ID_GAME_LEVEL:
      if (do_dialog_box(g_hInstance,
                    MAKEINTRESOURCE(IDD_DIALOG_LEVELS),
                    hWnd, (DLGPROC) levels_dialog_proc))
      {
        startlev=startlev;
      }
      break;
    case ID_GAME_START:
      start=TRUE;
      break;
    case ID_GAME_ABORT:
      kb_buffer=0;
      escape=TRUE;
      break;
    case ID_GAME_PAUSE:
      if (!pausef)
        pausef=TRUE;
      else
        kb_buffer=1;  // any key will cause game to continue
      //kb_buffer=keycodes[16][0];
      break;
    case ID_SOUND_SOUNDS_PLAY:
      soundflag=!soundflag;
      soundlevdoneflag=FALSE;
      break;
    case ID_SOUND_MUSIC_PLAY:
      musicflag=!musicflag;
      break;
    case ID_CONFIGURATION_SPEED_DEFAULT:
      ftime=80000l;
      break;
    case ID_SPEED_FASTER:
      if (ftime>10000l)
        ftime-=10000l;
      break;
    case ID_SPEED_SLOWER:
      ftime+=10000l;
      break;
    case ID_SOUND_SETTINGS:
      if (do_dialog_box(g_hInstance,
                    MAKEINTRESOURCE(IDD_DIALOG_SOUND_SETTINGS),
                    hWnd, (DLGPROC) sound_settings_dialog_proc))
      {
        WriteINIBool(INI_SOUND_SETTINGS, "SoundOn", soundflag, ININAME);
        WriteINIInt(INI_SOUND_SETTINGS, "SoundVolume", get_sound_volume(), ININAME);
      }
      break;
    case ID_HELP_ABOUTDIGGER:
      do_dialog_box(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG_ABOUT), hWnd,
                    (DLGPROC) help_about_dialog_proc);
      break;
    case ID_CONFIGURATION_GRAPHICS_ASYNCHRONOUS:
      use_async_screen_updates=!use_async_screen_updates;
      break;
    case ID_CONFIGURATION_CONTROLS_KEYBOARD_REDEFINEKEYS:
        gclear();
        redefkeyb(FALSE);
        reset_main_menu_screen=TRUE;
        break;
    case ID_CONFIGURATION_CONTROLS_KEYBOARD_REDEFINEALLKEYS:
        gclear();
        redefkeyb(TRUE);
        reset_main_menu_screen=TRUE;
      break;
    case ID_CONFIGURATION_SHOWSETTINGSDIALOG:
      if (started)
        pausef=TRUE;
      create_config_window();
      break;
    case ID_VIEW_VGAGRAPHICS:
      change_graphics_routines(VIDEO_MODE_VGA_16);
      break;

    case ID_VIEW_CGAGRAPHICS:
      change_graphics_routines(VIDEO_MODE_CGA);
      break;
    case ID_RECORDING_PLAY:
      if (get_open_save_filename(OPEN, "Open Recorded Game","Digger Record Files (*.drf)\0*.DRF\0All Files (*.*)\0*.*\0","DRF", drf_filename))
      {
        // make a copy of the current level info, so that it can be restored after the DLF playback is finished
        memcpy(backup_leveldat,leveldat,8*MHEIGHT*MWIDTH);
        strcpy(backup_levfname,levfname);
        backup_bonusscore=bonusscore;
        backup_levfflag=levfflag;

        started=FALSE;

⌨️ 快捷键说明

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