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

📄 st_stuff.c

📁 The source code of Doom legacy for windows
💻 C
📖 第 1 页 / 共 4 页
字号:
                  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 + -