📄 i_ibm.c
字号:
//
//==========================================================================
void S_UpdateSounds(mobj_t *listener)
{
int i, dist, vol;
int angle;
int sep;
int priority;
int absx;
int absy;
if(i_CDMusic)
{
I_UpdateCDMusic();
}
if(snd_MaxVolume == 0)
{
return;
}
// Update any Sequences
SN_UpdateActiveSequences();
if(NextCleanup < gametic)
{
if(UseSndScript)
{
for(i = 0; i < NUMSFX; i++)
{
if(S_sfx[i].usefulness == 0 && S_sfx[i].snd_ptr)
{
S_sfx[i].usefulness = -1;
}
}
}
else
{
for(i = 0; i < NUMSFX; i++)
{
if(S_sfx[i].usefulness == 0 && S_sfx[i].snd_ptr)
{
if(lumpcache[S_sfx[i].lumpnum])
{
if(((memblock_t *)((byte*)
(lumpcache[S_sfx[i].lumpnum])-
sizeof(memblock_t)))->id == 0x1d4a11)
{ // taken directly from the Z_ChangeTag macro
Z_ChangeTag2(lumpcache[S_sfx[i].lumpnum],
PU_CACHE);
#ifdef __WATCOMC__
_dpmi_unlockregion(S_sfx[i].snd_ptr,
lumpinfo[S_sfx[i].lumpnum].size);
#endif
}
}
S_sfx[i].usefulness = -1;
S_sfx[i].snd_ptr = NULL;
}
}
}
NextCleanup = gametic+35*30; // every 30 seconds
}
for(i=0;i<snd_Channels;i++)
{
if(!Channel[i].handle || S_sfx[Channel[i].sound_id].usefulness == -1)
{
continue;
}
if(!I_SoundIsPlaying(Channel[i].handle))
{
if(S_sfx[Channel[i].sound_id].usefulness > 0)
{
S_sfx[Channel[i].sound_id].usefulness--;
}
Channel[i].handle = 0;
Channel[i].mo = NULL;
Channel[i].sound_id = 0;
}
if(Channel[i].mo == NULL || Channel[i].sound_id == 0
|| Channel[i].mo == listener)
{
continue;
}
else
{
absx = abs(Channel[i].mo->x-listener->x);
absy = abs(Channel[i].mo->y-listener->y);
dist = absx+absy-(absx > absy ? absy>>1 : absx>>1);
dist >>= FRACBITS;
if(dist >= MAX_SND_DIST)
{
S_StopSound(Channel[i].mo);
continue;
}
if(dist < 0)
{
dist = 0;
}
//vol = SoundCurve[dist];
vol = (SoundCurve[dist]*(snd_MaxVolume*8)*Channel[i].volume)>>14;
if(Channel[i].mo == listener)
{
sep = 128;
}
else
{
angle = R_PointToAngle2(listener->x, listener->y,
Channel[i].mo->x, Channel[i].mo->y);
angle = (angle-viewangle)>>24;
sep = angle*2-128;
if(sep < 64)
sep = -sep;
if(sep > 192)
sep = 512-sep;
}
I_UpdateSoundParams(Channel[i].handle, vol, sep,
Channel[i].pitch);
priority = S_sfx[Channel[i].sound_id].priority;
priority *= PRIORITY_MAX_ADJUST-(dist/DIST_ADJUST);
Channel[i].priority = priority;
}
}
}
//==========================================================================
//
// S_Init
//
//==========================================================================
void S_Init(void)
{
SoundCurve = W_CacheLumpName("SNDCURVE", PU_STATIC);
// SoundCurve = Z_Malloc(MAX_SND_DIST, PU_STATIC, NULL);
I_StartupSound();
if(snd_Channels > 8)
{
snd_Channels = 8;
}
I_SetChannels(snd_Channels);
I_SetMusicVolume(snd_MusicVolume);
// Attempt to setup CD music
if(snd_MusicDevice == snd_CDMUSIC)
{
ST_Message(" Attempting to initialize CD Music: ");
if(!cdrom)
{
i_CDMusic = (I_CDMusInit() != -1);
}
else
{ // The user is trying to use the cdrom for both game and music
i_CDMusic = false;
}
if(i_CDMusic)
{
ST_Message("initialized.\n");
}
else
{
ST_Message("failed.\n");
}
}
}
//==========================================================================
//
// S_GetChannelInfo
//
//==========================================================================
void S_GetChannelInfo(SoundInfo_t *s)
{
int i;
ChanInfo_t *c;
s->channelCount = snd_Channels;
s->musicVolume = snd_MusicVolume;
s->soundVolume = snd_MaxVolume;
for(i = 0; i < snd_Channels; i++)
{
c = &s->chan[i];
c->id = Channel[i].sound_id;
c->priority = Channel[i].priority;
c->name = S_sfx[c->id].lumpname;
c->mo = Channel[i].mo;
c->distance = P_AproxDistance(c->mo->x-viewx, c->mo->y-viewy)
>>FRACBITS;
}
}
//==========================================================================
//
// S_GetSoundPlayingInfo
//
//==========================================================================
boolean S_GetSoundPlayingInfo(mobj_t *mobj, int sound_id)
{
int i;
for(i = 0; i < snd_Channels; i++)
{
if(Channel[i].sound_id == sound_id && Channel[i].mo == mobj)
{
if(I_SoundIsPlaying(Channel[i].handle))
{
return true;
}
}
}
return false;
}
//==========================================================================
//
// S_SetMusicVolume
//
//==========================================================================
void S_SetMusicVolume(void)
{
if(i_CDMusic)
{
I_CDMusSetVolume(snd_MusicVolume*16); // 0-255
}
else
{
I_SetMusicVolume(snd_MusicVolume);
}
if(snd_MusicVolume == 0)
{
if(!i_CDMusic)
{
I_PauseSong(RegisteredSong);
}
MusicPaused = true;
}
else if(MusicPaused)
{
if(!i_CDMusic)
{
I_ResumeSong(RegisteredSong);
}
MusicPaused = false;
}
}
//==========================================================================
//
// S_ShutDown
//
//==========================================================================
void S_ShutDown(void)
{
extern int tsm_ID;
if(tsm_ID != -1)
{
I_StopSong(RegisteredSong);
I_UnRegisterSong(RegisteredSong);
I_ShutdownSound();
}
if(i_CDMusic)
{
I_CDMusStop();
}
}
//==========================================================================
//
// S_InitScript
//
//==========================================================================
void S_InitScript(void)
{
int p;
int i;
strcpy(ArchivePath, DEFAULT_ARCHIVEPATH);
if(!(p = M_CheckParm("-devsnd")))
{
UseSndScript = false;
SC_OpenLump("sndinfo");
}
else
{
UseSndScript = true;
SC_OpenFile(myargv[p+1]);
}
while(SC_GetString())
{
if(*sc_String == '$')
{
if(!stricmp(sc_String, "$ARCHIVEPATH"))
{
SC_MustGetString();
strcpy(ArchivePath, sc_String);
}
else if(!stricmp(sc_String, "$MAP"))
{
SC_MustGetNumber();
SC_MustGetString();
if(sc_Number)
{
P_PutMapSongLump(sc_Number, sc_String);
}
}
continue;
}
else
{
for(i = 0; i < NUMSFX; i++)
{
if(!strcmp(S_sfx[i].tagName, sc_String))
{
SC_MustGetString();
if(*sc_String != '?')
{
strcpy(S_sfx[i].lumpname, sc_String);
}
else
{
strcpy(S_sfx[i].lumpname, "default");
}
break;
}
}
if(i == NUMSFX)
{
SC_MustGetString();
}
}
}
SC_Close();
for(i = 0; i < NUMSFX; i++)
{
if(!strcmp(S_sfx[i].lumpname, ""))
{
strcpy(S_sfx[i].lumpname, "default");
}
}
}
//==========================================================================
//
// I_UpdateCDMusic
//
// Updates playing time for current track, and restarts the track, if
// needed
//
//==========================================================================
void I_UpdateCDMusic(void)
{
extern boolean MenuActive;
if(MusicPaused || i_CDMusicLength < 0
|| (paused && !MenuActive))
{ // Non-looping song/song paused
return;
}
i_CDMusicLength -= gametic-oldTic;
oldTic = gametic;
if(i_CDMusicLength <= 0)
{
S_StartSong(gamemap, true);
}
}
/*
============================================================================
CONSTANTS
============================================================================
*/
#define SC_INDEX 0x3C4
#define SC_RESET 0
#define SC_CLOCK 1
#define SC_MAPMASK 2
#define SC_CHARMAP 3
#define SC_MEMMODE 4
#define CRTC_INDEX 0x3D4
#define CRTC_H_TOTAL 0
#define CRTC_H_DISPEND 1
#define CRTC_H_BLANK 2
#define CRTC_H_ENDBLANK 3
#define CRTC_H_RETRACE 4
#define CRTC_H_ENDRETRACE 5
#define CRTC_V_TOTAL 6
#define CRTC_OVERFLOW 7
#define CRTC_ROWSCAN 8
#define CRTC_MAXSCANLINE 9
#define CRTC_CURSORSTART 10
#define CRTC_CURSOREND 11
#define CRTC_STARTHIGH 12
#define CRTC_STARTLOW 13
#define CRTC_CURSORHIGH 14
#define CRTC_CURSORLOW 15
#define CRTC_V_RETRACE 16
#define CRTC_V_ENDRETRACE 17
#define CRTC_V_DISPEND 18
#define CRTC_OFFSET 19
#define CRTC_UNDERLINE 20
#define CRTC_V_BLANK 21
#define CRTC_V_ENDBLANK 22
#define CRTC_MODE 23
#define CRTC_LINECOMPARE 24
#define GC_INDEX 0x3CE
#define GC_SETRESET 0
#define GC_ENABLESETRESET 1
#define GC_COLORCOMPARE 2
#define GC_DATAROTATE 3
#define GC_READMAP 4
#define GC_MODE 5
#define GC_MISCELLANEOUS 6
#define GC_COLORDONTCARE 7
#define GC_BITMASK 8
#define ATR_INDEX 0x3c0
#define ATR_MODE 16
#define ATR_OVERSCAN 17
#define ATR_COLORPLANEENABLE 18
#define ATR_PELPAN 19
#define ATR_COLORSELECT 20
#define STATUS_REGISTER_1 0x3da
#define PEL_WRITE_ADR 0x3c8
#define PEL_READ_ADR 0x3c7
#define PEL_DATA 0x3c9
#define PEL_MASK 0x3c6
// boolean grmode;
//==================================================
//
// joystick vars
//
//==================================================
boolean joystickpresent;
extern unsigned joystickx, joysticky;
boolean I_ReadJoystick (void); // returns false if not connected
//==================================================
#define VBLCOUNTER 34000 // hardware tics to a frame
#define TIMERINT 8
#define KEYBOARDINT 9
#define CRTCOFF (_inbyte(STATUS_REGISTER_1)&1)
#define CLI _disable()
#define STI _enable()
#define _outbyte(x,y) (outp(x,y))
#define _outhword(x,y) (outpw(x,y))
#define _inbyte(x) (inp(x))
#define _inhword(x) (inpw(x))
#define MOUSEB1 1
#define MOUSEB2 2
#define MOUSEB3 4
boolean mousepresent;
//static int tsm_ID = -1; // tsm init flag
//===============================
int ticcount;
// REGS stuff used for int calls
union REGS regs;
struct SREGS segregs;
boolean novideo; // if true, stay in text mode for debugging
#define KBDQUESIZE 32
byte keyboardque[KBDQUESIZE];
int kbdtail, kbdhead;
#define KEY_LSHIFT 0xfe
#define KEY_INS (0x80+0x52)
#define KEY_DEL (0x80+0x53)
#define KEY_PGUP (0x80+0x49)
#define KEY_PGDN (0x80+0x51)
#define KEY_HOME (0x80+0x47)
#define KEY_END (0x80+0x4f)
#define SC_RSHIFT 0x36
#define SC_LSHIFT 0x2a
byte scantokey[128] =
{
// 0 1 2 3 4 5 6 7
// 8 9 A B C D E F
0 , 27, '1', '2', '3', '4', '5', '6',
'7', '8', '9', '0', '-', '=', KEY_BACKSPACE, 9, // 0
'q', 'w', 'e', 'r', 't', 'y', 'u', 'i',
'o', 'p', '[', ']', 13 , KEY_RCTRL,'a', 's', // 1
'd', 'f', 'g', 'h', 'j', 'k', 'l', ';',
39 , '`', KEY_LSHIFT,92, 'z', 'x', 'c', 'v', // 2
'b', 'n', 'm', ',', '.', '/', KEY_RSHIFT,'*',
KEY_RALT,' ', 0 , KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, // 3
KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10,0 , 0 , KEY_HOME,
KEY_UPARROW,KEY_PGUP,'-',KEY_LEFTARROW,'5',KEY_RIGHTARROW,'+',KEY_END, //4
KEY_DOWNARROW,KEY_PGDN,KEY_INS,KEY_DEL,0,0, 0, KEY_F11,
KEY_F12,0 , 0 , 0 , 0 , 0 , 0 , 0, // 5
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, // 6
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 // 7
};
//==========================================================================
//--------------------------------------------------------------------------
//
// FUNC I_GetTime
//
// Returns time in 1/35th second tics.
//
//--------------------------------------------------------------------------
int I_GetTime (void)
{
#ifdef NOTIMER
ticcount++;
#endif
return(ticcount);
}
//--------------------------------------------------------------------------
//
// PROC I_ColorBorder
//
//--------------------------------------------------------------------------
/*
void I_ColorBorder(void)
{
int i;
I_WaitVBL(1);
_outbyte(PEL_WRITE_ADR, 0);
for(i = 0; i < 3; i++)
{
_outbyte(PEL_DATA, 63);
}
}
*/
//--------------------------------------------------------------------------
//
// PROC I_UnColorBorder
//
//--------------------------------------------------------------------------
/*
void I_UnColorBorder(void)
{
int i;
I_WaitVBL(1);
_outbyte(PEL_WRITE_ADR, 0);
for(i = 0; i < 3; i++)
{
_outbyte(PEL_DATA, 0);
}
}
*/
/*
============================================================================
USER INPUT
============================================================================
*/
//--------------------------------------------------------------------------
//
// PROC I_WaitVBL
//
//--------------------------------------------------------------------------
void I_WaitVBL(int vbls)
{
int stat;
if(novideo)
{
return;
}
while(vbls--)
{
do
{
stat = inp(STATUS_REGISTER_1);
if(stat&8)
{
break;
}
} while(1);
do
{
stat = inp(STATUS_REGISTER_1);
if((stat&8) == 0)
{
break;
}
} while(1);
}
}
//--------------------------------------------------------------------------
//
// PROC I_SetPalette
//
// Palette source must use 8 bit RGB elements.
//
//--------------------------------------------------------------------------
void I_SetPalette(byte *palette)
{
int i;
if(novideo)
{
return;
}
I_WaitVBL(1);
_outbyte(PEL_WRITE_ADR, 0);
for(i = 0; i < 768; i++)
{
_outbyte(PEL_DATA, (gammatable[usegamma][*palette++])>>2);
}
}
/*
============================================================================
GRAPHICS MODE
============================================================================
*/
byte *pcscreen, *destscreen, *destview;
/*
==============
=
= I_Update
=
==============
*/
int UpdateState;
extern int screenblocks;
void I_Update (void)
{
int i;
byte *dest;
int tics;
static int lasttic;
//
// blit screen to video
//
if(DisplayTicker)
{
if(screenblocks > 9 || UpdateState&(I_FULLSCRN|I_MESSAGES))
{
dest = (byte *)screen;
}
else
{
dest = (byte *)pcscreen;
}
tics = ticcount-lasttic;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -