📄 st_stuff.c
字号:
tallnum, &plyr->ammo[plyr->weaponinfo[plyr->readyweapon].ammo], &st_statusbaron, ST_AMMOWIDTH ); // the last weapon type w_ready.data = plyr->readyweapon; // health percentage STlib_initPercent(&w_health, st_x + ST_HEALTHX, ST_HEALTHY, tallnum, &plyr->health, &st_statusbaron, tallpercent); // arms background STlib_initBinIcon(&w_armsbg, st_x + ST_ARMSBGX, ST_ARMSBGY, armsbg, &st_notdeathmatch, &st_statusbaron); // weapons owned for(i=0;i<6;i++) { STlib_initMultIcon(&w_arms[i], st_x + ST_ARMSX+(i%3)*ST_ARMSXSPACE, ST_ARMSY+(i/3)*ST_ARMSYSPACE, arms[i], (int *) &plyr->weaponowned[i+1], &st_armson); } // frags sum STlib_initNum(&w_frags, st_x + ST_FRAGSX, ST_FRAGSY, tallnum, &st_fragscount, &st_fragson, ST_FRAGSWIDTH); // faces STlib_initMultIcon(&w_faces, st_x + ST_FACESX, ST_FACESY, faces, &st_faceindex, &st_statusbaron); // armor percentage - should be colored later STlib_initPercent(&w_armor, st_x + ST_ARMORX, ST_ARMORY, tallnum, &plyr->armorpoints, &st_statusbaron, tallpercent); // keyboxes 0-2 STlib_initMultIcon(&w_keyboxes[0], st_x + ST_KEY0X, ST_KEY0Y, keys, &keyboxes[0], &st_statusbaron); STlib_initMultIcon(&w_keyboxes[1], st_x + ST_KEY1X, ST_KEY1Y, keys, &keyboxes[1], &st_statusbaron); STlib_initMultIcon(&w_keyboxes[2], st_x + ST_KEY2X, ST_KEY2Y, keys, &keyboxes[2], &st_statusbaron); // ammo count (all four kinds) STlib_initNum(&w_ammo[0], st_x + ST_AMMO0X, ST_AMMO0Y, shortnum, &plyr->ammo[0], &st_statusbaron, ST_AMMO0WIDTH); STlib_initNum(&w_ammo[1], st_x + ST_AMMO1X, ST_AMMO1Y, shortnum, &plyr->ammo[1], &st_statusbaron, ST_AMMO1WIDTH); STlib_initNum(&w_ammo[2], st_x + ST_AMMO2X, ST_AMMO2Y, shortnum, &plyr->ammo[2], &st_statusbaron, ST_AMMO2WIDTH); STlib_initNum(&w_ammo[3], st_x + ST_AMMO3X, ST_AMMO3Y, shortnum, &plyr->ammo[3], &st_statusbaron, ST_AMMO3WIDTH); // max ammo count (all four kinds) STlib_initNum(&w_maxammo[0], st_x + ST_MAXAMMO0X, ST_MAXAMMO0Y, shortnum, &plyr->maxammo[0], &st_statusbaron, ST_MAXAMMO0WIDTH); STlib_initNum(&w_maxammo[1], st_x + ST_MAXAMMO1X, ST_MAXAMMO1Y, shortnum, &plyr->maxammo[1], &st_statusbaron, ST_MAXAMMO1WIDTH); STlib_initNum(&w_maxammo[2], st_x + ST_MAXAMMO2X, ST_MAXAMMO2Y, shortnum, &plyr->maxammo[2], &st_statusbaron, ST_MAXAMMO2WIDTH); STlib_initNum(&w_maxammo[3], st_x + ST_MAXAMMO3X, ST_MAXAMMO3Y, shortnum, &plyr->maxammo[3], &st_statusbaron, ST_MAXAMMO3WIDTH);}static void ST_Stop (void){ if (st_stopped) return; V_SetPalette (0); st_stopped = true;}void ST_Start (void){ if( gamemode == heretic ) { plyr = &players[statusbarplayer]; st_stopped = false; return; } if (!st_stopped) ST_Stop(); ST_initData(); ST_createWidgets(); st_stopped = false; st_recalc = false; //added:02-02-98: widgets coords have been setup // see ST_drawer()}//// Initializes the status bar,// sets the defaults border patch for the window borders.////faB: used by Glide mode, holds lumpnum of flat used to fill space around the viewwindowint st_borderpatchnum;void ST_Init (void){ int i; //added:26-01-98:screens[4] is allocated at videomode setup, and // set at V_Init(), the first time being at SCR_Recalc() // choose and cache the default border patch switch(gamemode) { case commercial : // DOOM II border patch, original was GRNROCK st_borderpatchnum = W_GetNumForName ("GRNROCK"); break; case heretic : if(W_CheckNumForName("e2m1")==-1) st_borderpatchnum = W_GetNumForName ("FLOOR04"); else st_borderpatchnum = W_GetNumForName ("FLAT513"); break; case hexen : st_borderpatchnum = W_GetNumForName ("F_022"); break; default : // DOOM border patch. st_borderpatchnum = W_GetNumForName ("FLOOR7_2"); } scr_borderpatch = W_CacheLumpNum (st_borderpatchnum, PU_STATIC); if( gamemode == heretic ) { SB_Init(); return; } veryfirsttime = 0; ST_loadData(); // // cache the status bar overlay icons (fullscreen mode) // sbohealth = W_GetNumForName ("SBOHEALT"); sbofrags = W_GetNumForName ("SBOFRAGS"); sboarmor = W_GetNumForName ("SBOARMOR"); for (i=0;i<NUMWEAPONS;i++) { if (i>0 && i!=7) sboammo[i] = W_GetNumForName (va("SBOAMMO%c",'0'+i)); else sboammo[i] = 0; }} //added:16-01-98: change the status bar too, when pressing F12 while viewing// a demo.void ST_changeDemoView (void){ //the same routine is called at multiplayer deathmatch spawn // so it can be called multiple times ST_Start();}// =========================================================================// STATUS BAR OVERLAY// =========================================================================consvar_t cv_stbaroverlay = {"overlay","kahmf",CV_SAVE,NULL};boolean st_overlay;void ST_AddCommands (void){ CV_RegisterVar (&cv_stbaroverlay);}// Draw a number, scaled, over the view// Always draw the number completely since it's overlay//void ST_drawOverlayNum (int x, // right border! int y, int num, patch_t** numpat, patch_t* percent ){ int w = (numpat[0]->width); boolean neg; // in the special case of 0, you draw 0 if (!num) { V_DrawScaledPatch(x - (w*vid.dupx), y, FG|V_NOSCALESTART, numpat[ 0 ]); return; } neg = num < 0; if (neg) num = -num; // draw the number while (num) { x -= (w * vid.dupx); V_DrawScaledPatch(x, y, FG|V_NOSCALESTART, numpat[ num % 10 ]); num /= 10; } // draw a minus sign if necessary if (neg) V_DrawScaledPatch(x - (8*vid.dupx), y, FG|V_NOSCALESTART, sttminus);}static inline int SCY( int y ){ //31/10/99: fixed by Hurdler so it _works_ also in hardware mode // do not scale to resolution for hardware accelerated // because these modes always scale by default if ( rendermode == render_soft ) { y = ( y * vid.height ) / BASEVIDHEIGHT; // scale to resolution if ( cv_splitscreen.value ) { y >>= 1; if (plyr != &players[statusbarplayer]) y += vid.height / 2; } } else {// hardware mode if ( cv_splitscreen.value ) { y >>= 1; if (plyr != &players[statusbarplayer]) y += BASEVIDHEIGHT / 2; // hardware mode is scaled!!! } } return y;}static inline int SCX( int x ){ // hardware accelerated modes scale automatically if ( rendermode == render_soft ) return ( ( x * vid.width ) / BASEVIDWIDTH ); else return x;}// Draw the status bar overlay, customisable : the user choose which// kind of information to overlay//void ST_overlayDrawer (){ char* cmds; char c; int i; cmds = cv_stbaroverlay.string; while ((c=*cmds++)) { if (c>='A' && c<='Z') c = c + 'a' - 'A'; switch (c) { case 'h': // draw health ST_drawOverlayNum(SCX(50), SCY(198)-(16*vid.dupy), plyr->health, tallnum,NULL); V_DrawScalePic (SCX(52),SCY(198)-16*vid.dupy,0,sbohealth); break; case 'f': // draw frags st_fragscount = ST_PlayerFrags(plyr-players); if (cv_deathmatch.value) { ST_drawOverlayNum(SCX(300), SCY(2), st_fragscount, tallnum,NULL); V_DrawScalePic (SCX(302),SCY(2),0,sbofrags); } break; case 'a': // draw ammo i = sboammo[plyr->readyweapon]; if (i) { ST_drawOverlayNum(SCX(234), SCY(198)-(16*vid.dupy), plyr->ammo[plyr->weaponinfo[plyr->readyweapon].ammo], tallnum,NULL); V_DrawScalePic (SCX(236),SCY(198)-(16*vid.dupy),0,i); } break; case 'k': // draw keys c=1; for (i=0;i<3;i++) if( plyr->cards & (1<<(i+3)) ) // first skull then card V_DrawScaledPatch(SCX(318)-(c++)*(ST_KEY0WIDTH*vid.dupx), SCY(198)-((16+8)*vid.dupy), FG | V_NOSCALESTART, keys[i+3]); else if( plyr->cards & (1<<i) ) V_DrawScaledPatch(SCX(318)-(c++)*(ST_KEY0WIDTH*vid.dupx), SCY(198)-((16+8)*vid.dupy), FG | V_NOSCALESTART, keys[i]); break; case 'm': // draw armor ST_drawOverlayNum(SCX(300), SCY(198)-(16*vid.dupy), plyr->armorpoints, tallnum,NULL); V_DrawScalePic (SCX(302),SCY(198)-(16*vid.dupy),0,sboarmor); break; // added by Hurdler for single player only // I don't know why it doesn't work in software mode case 'e': // number of monster killed if ( (!cv_deathmatch.value) && (!cv_splitscreen.value) ) { char buf[16]; sprintf(buf, "%d/%d", plyr->killcount, totalkills); V_DrawString(SCX(318-V_StringWidth(buf)), SCY(1), buf); } break; case 's': // number of secrets found if ( (!cv_deathmatch.value) && (!cv_splitscreen.value) ) { char buf[16]; sprintf(buf, "%d/%d", plyr->secretcount, totalsecret); V_DrawString(SCX(318-V_StringWidth(buf)), SCY(11), buf); } break; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -