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

📄 win_cfg.c

📁 经典的老游戏digger的源代码.提起digger相信很多人会回忆起曾经为了它挑灯夜战的时光
💻 C
📖 第 1 页 / 共 2 页
字号:

  case WM_CLOSE:
    iPage = TabCtrl_GetCurSel(g_hWndTabControl);
    switch (iPage)
    {
    case 0:
      hide_video_config_page(hWndConfigWindow);
      break;
    case 1:
      hide_audio_config_page(hWndConfigWindow);
      break;
    case 2:
      break;
    }
    if (DestroyWindow(g_hDlg))
      g_hDlg=0;

    apply_new_cfg_settings();
    EnableWindow(hWnd,TRUE);
    DestroyWindow(hWndConfigWindow);
    cur_dialog_box=hWndConfigWindow=NULL;
    SetForegroundWindow(hWnd);
    suspend_game=FALSE;
    hide_mouse_cursor();
    if (!g_bWindowed)
    {
      release_clipper();
      gpal(cur_palette);
    }
    resume_windows_sound_playback();
    InvalidateRect(hWnd, NULL, FALSE);
    UpdateWindow(hWnd);

    return 0;
  }
  return DefWindowProc(hWndConfigWindow, message, wParam, lParam);
}

LRESULT CALLBACK ConfigTabDlgWndProc (HWND hWndPage, UINT message, WPARAM wParam, LPARAM lParam)
{
  HWND control;

  switch(message)
  {
  case WM_KEYDOWN:
    return DefWindowProc(hWndPage, message, wParam, lParam);
  case WM_SIZE:
    //GetClientRect(g_hWndTabControl,&tempRect);
    //TabCtrl_AdjustRect(g_hWndTabControl,FALSE, &tempRect);
    MoveWindow(g_hDlg,tempRect.left,tempRect.top,tempRect.right - tempRect.left, tempRect.bottom - tempRect.top,FALSE);
    return 0;

  case WM_COMMAND:
    switch (LOWORD(wParam))
    {
    case IDC_BUTTON_BIND_SELECT:
      control = GetDlgItem(hWndPage, IDC_LIST_KEY_ASSIGNMENTS);
      cur_key_map_idx=ListBox_GetCurSel(control);
      if (cur_key_map_idx<0)
        cur_key_map_idx=0;
      do_dialog_box(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG_SELECT_KEY),
                    hWndPage, (DLGPROC) bind_key_from_list_dialog_proc);
      load_mapped_key_list(GetDlgItem(g_hDlg, IDC_LIST_KEY_ASSIGNMENTS));

      return TRUE;
    }

  }
  return DefWindowProc(hWndPage, message, wParam, lParam);
}

extern bool started;
void init_video_config_page(HWND hWndTabControl)
{
  HWND control;
  char strbuf[40];
  struct FULLSCREEN_VID_MODE_INFO* vmode;

  //RECT tempRect;
  g_hDlg=CreateDialog(g_hInstance,MAKEINTRESOURCE(IDD_DIALOG_CFG_VIDEO),g_hWndTabControl,ConfigTabDlgWndProc);
  if (g_hDlg)
  {
    //MoveWindow(g_hDlg,0,30,300,200,TRUE);

    control = GetDlgItem(g_hDlg,IDC_COMBO_FULLSCREEN_VIDEO_MODE);
    vmode=supported_video_modes;
    while (vmode!=NULL)
    {
      sprintf(strbuf,"%d x %d (%d bit)",vmode->width,vmode->height,vmode->bpp);
      ComboBox_AddString(control, strbuf);
      vmode=vmode->next_mode;
    }
    ComboBox_SetCurSel(control, cfg.video.preferred_video_mode_index - 1 );
    control = GetDlgItem(g_hDlg,IDC_COMBO_GAME_GRAPHICS);
    ComboBox_AddString(control, "CGA (Original)");
    ComboBox_AddString(control, "VGA (Digger Remastered)");
    ComboBox_SetCurSel(control, cfg.video.graphics_mode );
    EnableWindow(control, !started);

    control = GetDlgItem(g_hDlg,IDC_CHECK_USE_ASYNC);
    Button_SetCheck(control,cfg.video.use_async_updates ? 1 : 0);

    control = GetDlgItem(g_hDlg,IDC_CHECK_USE_DIRECTDRAW);
    Button_SetCheck(control,cfg.video.use_directdraw ? 1 : 0);

   MoveWindow(g_hDlg,tempRect.left,tempRect.top,tempRect.right - tempRect.left, tempRect.bottom - tempRect.top,TRUE);

   ShowWindow(g_hDlg,SW_SHOW);
   if (GetFocus() != g_hWndTabControl)
    SetFocus(g_hDlg);
  }
  else
    fatal_error(0,"init_video_config_page() failed");
}

void init_audio_config_page(HWND hWndTabControl)
{
  HWND control;
  char strbuf[20];
  g_hDlg=CreateDialog(g_hInstance,MAKEINTRESOURCE(IDD_DIALOG_CFG_AUDIO),g_hWndTabControl,ConfigTabDlgWndProc);
  if (g_hDlg)
  {
    MoveWindow(g_hDlg,0,30,300,200,TRUE);

    control = GetDlgItem(g_hDlg,IDC_COMBO_AUDIO_DEVICE);
    ComboBox_AddString(control, "[Disabled");
    ComboBox_AddString(control, "Use DirectSound");
    ComboBox_AddString(control, "Use Wave Out");
    ComboBox_SetCurSel(control,cfg.audio.output_device);
    itoa(cfg.audio.buffer_size,strbuf,10);
    SetDlgItemText(g_hDlg,IDC_EDIT_BUFFER_SIZE, strbuf);
    itoa(cfg.audio.freq,strbuf,10);
    SetDlgItemText(g_hDlg,IDC_EDIT_SAMPLE_RATE, strbuf);

    control = GetDlgItem(g_hDlg,IDC_CHECK_PLAY_MUSIC);
    Button_SetCheck(control,cfg.audio.play_music);
    control = GetDlgItem(g_hDlg,IDC_CHECK_PLAY_SOUNDS);
    Button_SetCheck(control,cfg.audio.play_sounds);

    control = GetDlgItem(g_hDlg,IDC_SLIDER_VOLUME);
    SendMessage(control, TBM_SETRANGEMAX, (WPARAM) FALSE, 100);
    SendMessage(control, TBM_SETRANGEMIN, (WPARAM) FALSE, 0);
    SendMessage(control, TBM_SETPOS, (WPARAM) TRUE, 100 - cfg.audio.volume);

    ShowWindow(g_hDlg,SW_SHOW);
    if (GetFocus() != g_hWndTabControl)
      SetFocus(g_hDlg);
  }
  else
    fatal_error(0,"init_audio_config_page() failed");

}

extern char *keynames[];
void load_mapped_key_list(HWND control)
{
  SIZE sz;
  int max_text_width=0;
  HDC dc;
  int i;
  int list_size;
  struct KEY_MAPPINGS_STRUCT *next;
  char strbuf[200];

  while (ListBox_GetCount(control))
     ListBox_DeleteString(control,0);

   dc = GetDC(control);
   for (i=0;i<19;i++)
   {
     if (i<5)
      sprintf(strbuf,"Player1 %s:\t",keynames[i]);
     else
     {
       if (i<10)
         sprintf(strbuf,"Player2 %s\t",keynames[i]);
       else
         sprintf(strbuf,"%s:\t",keynames[i]);

     }
     if (key_mappings[i])
     {
       strcat(strbuf,get_key_name(key_mappings[i]->key_code));
       next = key_mappings[i]->next;
       while (next)
       {
         strcat(strbuf,", ");
         strcat(strbuf,get_key_name(next->key_code));
         next=next->next;
       }
     }
     else
       strcat(strbuf,"(no key assigned)");

     GetTextExtentPoint32(dc,strbuf,strlen(strbuf),&sz);
     if (sz.cx>max_text_width)
       max_text_width=sz.cx;
     ListBox_AddString(control,strbuf);
   }
   ReleaseDC(control,dc);
   ListBox_SetHorizontalExtent(control,max_text_width);
}

void init_input_config_page(HWND hWndTabControl)
{
  HWND control;
  int i;
  int tabstops[1]={64};

  //RECT tempRect;
  g_hDlg=CreateDialog(g_hInstance,MAKEINTRESOURCE(IDD_DIALOG_CFG_INPUT),g_hWndTabControl,ConfigTabDlgWndProc);
  if (g_hDlg)
  {

   MoveWindow(g_hDlg,tempRect.left,tempRect.top,tempRect.right - tempRect.left, tempRect.bottom - tempRect.top,TRUE);

   control = GetDlgItem(g_hDlg, IDC_LIST_KEY_ASSIGNMENTS);
   ListBox_SetTabStops(control,1,tabstops);

   load_mapped_key_list(control);
   ShowWindow(g_hDlg,SW_SHOW);
   if (GetFocus() != g_hWndTabControl)
    SetFocus(g_hDlg);
  }
  else
    fatal_error(0,"init_input_config_page() failed");
}

void hide_video_config_page(HWND hWndTabControl)
{
  HWND control;
  control = GetDlgItem(g_hDlg,IDC_COMBO_FULLSCREEN_VIDEO_MODE);
  cfg.video.hardware_video_mode = (ComboBox_GetCurSel(control)==1);
  control = GetDlgItem(g_hDlg,IDC_COMBO_GAME_GRAPHICS);
  cfg.video.graphics_mode = ComboBox_GetCurSel(control);
  control = GetDlgItem(g_hDlg,IDC_CHECK_USE_ASYNC);
  cfg.video.use_async_updates = Button_GetCheck(control);
  control = GetDlgItem(g_hDlg,IDC_CHECK_USE_DIRECTDRAW);
  cfg.video.use_directdraw = Button_GetCheck(control);

  control = GetDlgItem(g_hDlg,IDC_COMBO_FULLSCREEN_VIDEO_MODE);
  cfg.video.preferred_video_mode_index=ComboBox_GetCurSel(control)+1;
}

void hide_audio_config_page(HWND hWndTabControl)
{
  char strbuf[20];
  HWND control;
  if (GetDlgItemText(g_hDlg,IDC_EDIT_BUFFER_SIZE,strbuf,20))
    cfg.audio.buffer_size = atoi(strbuf);
  if (GetDlgItemText(g_hDlg,IDC_EDIT_SAMPLE_RATE,strbuf,20))
    cfg.audio.freq = atoi(strbuf);
  control = GetDlgItem(g_hDlg,IDC_COMBO_AUDIO_DEVICE);
  cfg.audio.output_device = ComboBox_GetCurSel(control);
  control = GetDlgItem(g_hDlg,IDC_CHECK_PLAY_MUSIC);
  cfg.audio.play_music = Button_GetCheck(control);
  control = GetDlgItem(g_hDlg,IDC_CHECK_PLAY_SOUNDS);
  cfg.audio.play_sounds = Button_GetCheck(control);
  control = GetDlgItem(g_hDlg,IDC_SLIDER_VOLUME);
  cfg.audio.volume = 100 - SendMessage(control, TBM_GETPOS, 0, 0);
}

void hide_input_config_page(HWND hWndTabControl)
{

}

void retrieve_current_cfg_settings()
{
  struct FULLSCREEN_VID_MODE_INFO* vmode;
  int i,preferred_vid_mode_index;

  cfg.audio.buffer_size = size / 2;
  cfg.audio.disabled = FALSE;
  cfg.audio.freq = get_sound_freq();
  cfg.audio.play_music = musicflag;
  cfg.audio.play_sounds = soundflag;
  cfg.audio.volume = dx_sound_volume;
  cfg.audio.output_device = sound_output_device;

  cfg.game.speed = ftime;

  cfg.video.hardware_video_mode = use_640x480_fullscreen;
  cfg.video.use_async_updates = use_async_screen_updates;
  cfg.video.use_directdraw = use_direct_draw;
  cfg.video.graphics_mode = video_mode;

  preferred_vid_mode_index=0;
  vmode=supported_video_modes;
  i=1;
  while (vmode!=NULL)
  {
    if (vmode->width==preferred_video_mode.width &&
        vmode->height==preferred_video_mode.height &&
        vmode->bpp==preferred_video_mode.bpp)
          preferred_vid_mode_index=i;
    if (!preferred_vid_mode_index && vmode->width==640 && vmode->height>=400)   // if nothing in the list matches the preferred mode, then select a mode 640x400 or 640x480
      preferred_vid_mode_index=i;
    vmode=vmode->next_mode;
    i++;
  }
  cfg.video.preferred_video_mode_index = preferred_vid_mode_index;
}

void apply_new_cfg_settings()
{
  struct FULLSCREEN_VID_MODE_INFO* vmode;
  int i,preferred_vid_mode_index;

  release_sound_card();
  if ((cfg.audio.buffer_size!=size / 2) && (cfg.audio.buffer_size > 0))
  {
    sound_length = size = cfg.audio.buffer_size * 2;
  }
  if ((cfg.audio.freq!=sound_rate) && (cfg.audio.freq > 0))
  {
    sound_rate=cfg.audio.freq;
  }
  if (cfg.audio.output_device != sound_output_device)
  {
    sound_output_device=cfg.audio.output_device;
  }

  vmode=supported_video_modes;
  for (i=1;i<cfg.video.preferred_video_mode_index;i++)
  {
    vmode=vmode->next_mode;
  }
  if (vmode->width != preferred_video_mode.width ||
      vmode->height != preferred_video_mode.height ||
      vmode->bpp != preferred_video_mode.bpp)
      set_preferred_vidmode(vmode->width,vmode->height,vmode->bpp);

  if (video_mode!=cfg.video.graphics_mode)
    change_graphics_routines(cfg.video.graphics_mode);

  capture_sound_card();
  set_sound_volume(dx_sound_volume = cfg.audio.volume);
  musicflag = cfg.audio.play_music;
  soundflag = cfg.audio.play_sounds;
  store_mapped_keys();
}


char* get_key_name(int code)
{
  int i;

  for (i=0;i<(sizeof(key_list)/sizeof(key_list[0]));i++)
  {
    if (code == key_list[i].key_code)
      return key_list[i].key_name;
  }
  return UNKNOWN_KEY_NAME;
}

int translate_key_code_to_function(int code)
{
  int i;
  for (i=10;i<19;i++)
  {
    if (is_key_bound(code,i))
      return i+1;
  }
  return 0;
}

BOOL is_key_bound(int key_code, int function)
{
  struct KEY_MAPPINGS_STRUCT *cur;
  cur=key_mappings[function];
  while (cur)
  {
    if (cur->key_code==key_code)
      return TRUE;
    cur=cur->next;
  }
  return FALSE;
}

/* checks to see if any of the keys mapped to a specific function have been preseed.  */
BOOL key_pressed(int function,BOOL check_current_state_only)
{
  struct KEY_MAPPINGS_STRUCT *cur;
  SHORT keystate;
  cur=key_mappings[function];
  while (cur)
  {
    keystate=GetAsyncKeyState(cur->key_code);
    if (check_current_state_only)
      keystate=keystate & 0x8000;
    if (keystate)
      return TRUE;
    cur=cur->next;
  }
  return FALSE;
}

void clear_mapped_keys(int idx)
{
  struct KEY_MAPPINGS_STRUCT *cur,*prev;

  /* remove existing keys mapped to this function */
  cur=key_mappings[idx];
  key_mappings[idx]=NULL;
  while (cur)
  {
    prev=cur;
    cur=cur->next;
    farfree(prev);
  }
}

void add_mapped_key(int idx, int key_code)
{
  struct KEY_MAPPINGS_STRUCT *cur;

  if (!key_code)  //if not a valid Virtual Key Code then return
    return;

  if (key_mappings[idx])
  {
    cur=key_mappings[idx];
    while (cur->next)
    {
      cur=cur->next;
    }
    cur->next=malloc(sizeof(struct KEY_MAPPINGS_STRUCT));
    cur=cur->next;
    cur->key_code = key_code;
    cur->next = NULL;
  }
  else
  {
    cur=key_mappings[idx]=malloc(sizeof(struct KEY_MAPPINGS_STRUCT));
    cur->key_code = key_code;
    cur->next=NULL;
  }

}

void store_mapped_keys()
{
  int i;
  char kbuf[80],vbuf[256];
  char tempnum[32];

  struct KEY_MAPPINGS_STRUCT *cur;

  for (i=0;i<SIZEOF_KEY_MAPPINGS_LIST;i++)
  {
    cur=key_mappings[i];
    sprintf(kbuf,"%s%c",keynames[i],(i>=5 && i<10) ? '2' : 0);
    vbuf[0]='\0';
    while (cur)
    {
      strcat(vbuf,itoa(cur->key_code,tempnum,10));
      cur=cur->next;
      if (cur)
        strcat(vbuf,"/");
    }
    WriteINIString(INI_KEY_SETTINGS,kbuf,vbuf,ININAME);
  }
}

⌨️ 快捷键说明

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