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

📄 i_system.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 2 页
字号:
// Emacs style mode select   -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: i_system.c,v 1.15 2001/03/12 21:03:10 metzgermeister Exp $//// Copyright (C) 1993-1996 by id Software, Inc.// Portions Copyright (C) 1998-2000 by DooM Legacy Team.//// This program is free software; you can redistribute it and/or// modify it under the terms of the GNU General Public License// as published by the Free Software Foundation; either version 2// of the License, or (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU General Public License for more details.////// $Log: i_system.c,v $// Revision 1.15  2001/03/12 21:03:10  metzgermeister//   * new symbols for rendererlib added in SDL//   * console printout fixed for Linux&SDL//   * Crash fixed in Linux SW renderer initialization//// Revision 1.14  2000/10/21 08:43:32  bpereira// no message//// Revision 1.13  2000/10/16 07:53:57  metzgermeister// fixed I_GetFreeMem//// Revision 1.12  2000/10/09 16:22:42  metzgermeister// implemented GetFreeMem//// Revision 1.11  2000/10/02 18:25:47  bpereira// no message//// Revision 1.10  2000/09/10 10:50:21  metzgermeister// make it work again//// Revision 1.9  2000/08/11 19:11:07  metzgermeister// *** empty log message ***//// Revision 1.8  2000/04/25 19:49:46  metzgermeister// support for automatic wad search//// Revision 1.7  2000/04/16 18:38:07  bpereira// no message//// Revision 1.6  2000/04/12 19:31:37  metzgermeister// added use_mouse to menu//// Revision 1.5  2000/04/07 23:12:38  metzgermeister// fixed some minor bugs//// Revision 1.4  2000/03/22 18:52:56  metzgermeister// added I_ShutdownCD to I_Quit//// Revision 1.3  2000/03/06 15:19:58  hurdler// Add Bell Kin's changes//// Revision 1.2  2000/02/27 00:42:11  hurdler// fix CR+LF problem//// Revision 1.1.1.1  2000/02/22 20:32:33  hurdler// Initial import into CVS (v1.29 pr3)////// DESCRIPTION:////-----------------------------------------------------------------------------#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/uio.h>#include <unistd.h>#include <fcntl.h>#include <signal.h>#include <string.h>#include <stdarg.h>#include <sys/time.h>#ifdef LMOUSE2#include <termios.h>#endif// statfs()#include <sys/vfs.h>#ifdef LJOYSTICK // linux joystick 1.x#include <sys/types.h>#include <sys/stat.h>#include <sys/ioctl.h>#include <fcntl.h>#include <linux/joystick.h>#endif#include "doomdef.h"#include "m_misc.h"#include "i_video.h"#include "i_sound.h"#include "d_net.h"#include "g_game.h"#include "endtxt.h"#ifdef __GNUG__#pragma implementation "i_system.h"#endif#include "i_system.h"#include "i_joy.h"extern void D_PostEvent(event_t*);extern event_t         events[MAXEVENTS];extern int             eventhead;extern int             eventtail;// Locations for searching the doom3.wad#define DEFAULTWADLOCATION1 "/usr/local/games/legacy"#define DEFAULTWADLOCATION2 "/usr/games/legacy"#define DEFAULTSEARCHPATH1 "/usr/local"#define DEFAULTSEARCHPATH2 "/usr/games"#define WADKEYWORD "doom3.wad"// holds wad pathstatic char returnWadPath[256];#ifdef LJOYSTICKint joyfd = -1;int joyaxes = 0;int joystick_started = 0;int joy_scale = 1;#endifJoyType_t Joystick;#ifdef LMOUSE2int fdmouse2 = -1;int mouse2_started = 0;#endif// dummy 19990119 by Kinbyte keyboard_started = 0;void I_StartupKeyboard (void) {}void I_StartupTimer (void) {}void I_OutputMsg (char *fmt, ...) {    va_list     argptr;    va_start (argptr,fmt);    vfprintf (stderr,fmt,argptr);    va_end (argptr);}int I_GetKey (void) {    // Warning: I_GetKey emties the event queue till next keypress    event_t*    ev;    int rc=0;        // return the first keypress from the event queue    for ( ; eventtail != eventhead ; eventtail = (++eventtail)&(MAXEVENTS-1) )    {        ev = &events[eventtail];        if(ev->type == ev_keydown)        {            rc = ev->data1;            continue;        }    }        return rc; }#ifdef LJOYSTICKvoid I_JoyScale() {  joy_scale = (cv_joyscale.value==0)?1:cv_joyscale.value;}void I_GetJoyEvent() {  struct js_event jdata;  static event_t event = {0,0,0,0};  static int buttons = 0;  if(!joystick_started) return;  while(read(joyfd,&jdata,sizeof(jdata))!=-1) {    switch(jdata.type) {    case JS_EVENT_AXIS:      event.type = ev_joystick;      event.data1 = 0;      switch(jdata.number) {      case 0:        event.data2 = ((jdata.value >> 5)/joy_scale)*joy_scale;        D_PostEvent(&event);        break;      case 1:        event.data3 = ((jdata.value >> 5)/joy_scale)*joy_scale;        D_PostEvent(&event);      default:        break;      }      break;    case JS_EVENT_BUTTON:      if(jdata.number<JOYBUTTONS) {        if(jdata.value) {          if(!((buttons >> jdata.number)&1)) {            buttons |= 1 << jdata.number;            event.type = ev_keydown;            event.data1 = KEY_JOY1+jdata.number;            D_PostEvent(&event);          }        } else {          if((buttons>>jdata.number)&1) {            buttons ^= 1 << jdata.number;            event.type = ev_keyup;            event.data1 = KEY_JOY1+jdata.number;            D_PostEvent(&event);          }        }      }      break;    }  }}void I_ShutdownJoystick() {  if(joyfd!=-1) {    close(joyfd);    joyfd = -1;  }  joyaxes = 0;  joystick_started = 0;}int joy_open(char *fname) {  joyfd = open(fname,O_RDONLY|O_NONBLOCK);  if(joyfd==-1) {    CONS_Printf("Error opening %s!\n",fname);    return 0;  }  ioctl(joyfd,JSIOCGAXES,&joyaxes);  if(joyaxes<2) {    CONS_Printf("Not enought axes?\n");    joyaxes = 0;    joyfd = -1;    close(joyfd);    return 0;  }  return joyaxes;}/*int joy_waitb(int fd, int *xpos,int *ypos,int *hxpos,int *hypos) {  int i,xps,yps,hxps,hyps;  struct js_event jdata;  for(i=0;i<1000;i++) {    while(read(fd,&jdata,sizeof(jdata))!=-1) {      switch(jdata.type) {      case JS_EVENT_AXIS:        switch(jdata.number) {        case 0: // x          xps = jdata.value;          break;        case 1: // y          yps = jdata.value;          break;        case 3: // hat x          hxps = jdata.value;          break;        case 4: // hat y          hyps = jdata.value;        default:          break;        }        break;      case JS_EVENT_BUTTON:        break;      }    }  }  }*/#endifvoid I_InitJoystick (void) {#ifdef LJOYSTICK  I_ShutdownJoystick();  if(!strcmp(cv_usejoystick.string,"0"))    return;  if(!joy_open(cv_joyport.string)) return;  joystick_started = 1;  return;#endif}#ifdef LMOUSE2void I_GetMouse2Event() {  static unsigned char mdata[5];  static int i = 0,om2b = 0;  int di,j,mlp,button;  event_t event;  const int mswap[8] = {0,4,1,5,2,6,3,7};  if(!mouse2_started) return;  for(mlp=0;mlp<20;mlp++) {    for(;i<5;i++) {      di = read(fdmouse2,mdata+i,1);      if(di==-1) return;    }    if((mdata[0]&0xf8)!=0x80) {      for(j=1;j<5;j++) {        if((mdata[j]&0xf8)==0x80) {          for(i=0;i<5-j;i++) { // shift            mdata[i] = mdata[i+j];          }        }      }      if(i<5) continue;    } else {      button = mswap[~mdata[0]&0x07];      for(j=0;j<MOUSEBUTTONS;j++) {        if(om2b&(1<<j)) {          if(!(button&(1<<j))) { //keyup            event.type = ev_keyup;            event.data1 = KEY_2MOUSE1+j;            D_PostEvent(&event);            om2b ^= 1 << j;          }        } else {          if(button&(1<<j)) {            event.type = ev_keydown;            event.data1 = KEY_2MOUSE1+j;            D_PostEvent(&event);            om2b ^= 1 << j;          }        }      }      event.data2 = ((signed char)mdata[1])+((signed char)mdata[3]);      event.data3 = ((signed char)mdata[2])+((signed char)mdata[4]);      if(event.data2&&event.data3) {        event.type = ev_mouse2;        event.data1 = 0;        D_PostEvent(&event);      }    }    i = 0;  }}void I_ShutdownMouse2() {  if(fdmouse2!=-1) close(fdmouse2);  mouse2_started = 0;}#endifvoid I_StartupMouse2 (void) {#ifdef LMOUSE2  struct termios m2tio;  int i,dtr,rts;  I_ShutdownMouse2();  if(cv_usemouse2.value == 0) return;  if((fdmouse2 = open(cv_mouse2port.string,O_RDONLY|O_NONBLOCK|O_NOCTTY))==-1) {    CONS_Printf("Error opening %s!\n",cv_mouse2port.string);    return;  }  tcflush(fdmouse2, TCIOFLUSH);  m2tio.c_iflag = IGNBRK;  m2tio.c_oflag = 0;  m2tio.c_cflag = CREAD|CLOCAL|HUPCL|CS8|CSTOPB|B1200;  m2tio.c_lflag = 0;  m2tio.c_cc[VTIME] = 0;  m2tio.c_cc[VMIN] = 1;  tcsetattr(fdmouse2, TCSANOW, &m2tio);  strupr(cv_mouse2opt.string);  for(i=0,rts = dtr = -1;i<strlen(cv_mouse2opt.string);i++) {    if(cv_mouse2opt.string[i]=='D') {      if(cv_mouse2opt.string[i+1]=='-') {        dtr = 0;      } else {        dtr = 1;      }    }    if(cv_mouse2opt.string[i]=='R') {      if(cv_mouse2opt.string[i+1]=='-') {        rts = 0;      } else {        rts = 1;      }    }  }  if((dtr!=-1)||(rts!=-1)) {    if(!ioctl(fdmouse2, TIOCMGET, &i)) {      if(!dtr) {        i &= ~TIOCM_DTR;      } else {        if(dtr>0) i |= TIOCM_DTR;      }      if(!rts) {        i &= ~TIOCM_RTS;      } else {        if(rts>0) i |= TIOCM_RTS;      }      ioctl(fdmouse2, TIOCMSET, &i);    }  }  mouse2_started = 1;#endif}// return free and total physical memory in the system#define MEMINFO_FILE "/proc/meminfo"#define MEMTOTAL "MemTotal:"#define MEMFREE "MemFree:"ULONG I_GetFreeMem(ULONG *total){    char buf[1024];        char *memTag;    ULONG freeKBytes;    ULONG totalKBytes;    int n;

⌨️ 快捷键说明

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