Annotation of quake2/client/cl_fx.c, revision 1.1.1.3

1.1       root        1: // cl_fx.c -- entity effects parsing and management
1.1.1.2   root        2: 
1.1       root        3: #include "client.h"
1.1.1.2   root        4: 
1.1       root        5: void CL_LogoutEffect (vec3_t org, int type);
                      6: void CL_ItemRespawnParticles (vec3_t org);
1.1.1.2   root        7: 
1.1       root        8: static vec3_t avelocities [NUMVERTEXNORMALS];
                      9: 
                     10: extern struct model_s  *cl_mod_smoke;
                     11: extern struct model_s  *cl_mod_flash;
1.1.1.2   root       12: 
1.1       root       13: /*
                     14: ==============================================================
1.1.1.2   root       15: 
1.1       root       16: LIGHT STYLE MANAGEMENT
1.1.1.2   root       17: 
1.1       root       18: ==============================================================
                     19: */
1.1.1.2   root       20: 
1.1       root       21: typedef struct
                     22: {
                     23:        int             length;
                     24:        float   value[3];
                     25:        float   map[MAX_QPATH];
                     26: } clightstyle_t;
1.1.1.2   root       27: 
1.1       root       28: clightstyle_t  cl_lightstyle[MAX_LIGHTSTYLES];
                     29: int                    lastofs;
1.1.1.2   root       30: 
1.1       root       31: /*
                     32: ================
                     33: CL_ClearLightStyles
                     34: ================
                     35: */
                     36: void CL_ClearLightStyles (void)
                     37: {
                     38:        memset (cl_lightstyle, 0, sizeof(cl_lightstyle));
                     39:        lastofs = -1;
                     40: }
1.1.1.2   root       41: 
1.1       root       42: /*
                     43: ================
                     44: CL_RunLightStyles
                     45: ================
                     46: */
                     47: void CL_RunLightStyles (void)
                     48: {
                     49:        int             ofs;
                     50:        int             i;
                     51:        clightstyle_t   *ls;
1.1.1.2   root       52: 
1.1       root       53:        ofs = cl.time / 100;
                     54:        if (ofs == lastofs)
                     55:                return;
                     56:        lastofs = ofs;
1.1.1.2   root       57: 
1.1       root       58:        for (i=0,ls=cl_lightstyle ; i<MAX_LIGHTSTYLES ; i++, ls++)
                     59:        {
                     60:                if (!ls->length)
                     61:                {
                     62:                        ls->value[0] = ls->value[1] = ls->value[2] = 1.0;
                     63:                        continue;
                     64:                }
                     65:                if (ls->length == 1)
                     66:                        ls->value[0] = ls->value[1] = ls->value[2] = ls->map[0];
                     67:                else
                     68:                        ls->value[0] = ls->value[1] = ls->value[2] = ls->map[ofs%ls->length];
                     69:        }
                     70: }
1.1.1.2   root       71: 
                     72: 
1.1       root       73: void CL_SetLightstyle (int i)
                     74: {
                     75:        char    *s;
                     76:        int             j, k;
1.1.1.2   root       77: 
1.1       root       78:        s = cl.configstrings[i+CS_LIGHTS];
1.1.1.2   root       79: 
1.1       root       80:        j = strlen (s);
                     81:        if (j >= MAX_QPATH)
                     82:                Com_Error (ERR_DROP, "svc_lightstyle length=%i", j);
1.1.1.2   root       83: 
1.1       root       84:        cl_lightstyle[i].length = j;
1.1.1.2   root       85: 
1.1       root       86:        for (k=0 ; k<j ; k++)
                     87:                cl_lightstyle[i].map[k] = (float)(s[k]-'a')/(float)('m'-'a');
                     88: }
1.1.1.2   root       89: 
1.1       root       90: /*
                     91: ================
                     92: CL_AddLightStyles
                     93: ================
                     94: */
                     95: void CL_AddLightStyles (void)
                     96: {
                     97:        int             i;
                     98:        clightstyle_t   *ls;
1.1.1.2   root       99: 
1.1       root      100:        for (i=0,ls=cl_lightstyle ; i<MAX_LIGHTSTYLES ; i++, ls++)
                    101:                V_AddLightStyle (i, ls->value[0], ls->value[1], ls->value[2]);
                    102: }
1.1.1.2   root      103: 
1.1       root      104: /*
                    105: ==============================================================
1.1.1.2   root      106: 
1.1       root      107: DLIGHT MANAGEMENT
1.1.1.2   root      108: 
1.1       root      109: ==============================================================
                    110: */
1.1.1.2   root      111: 
1.1       root      112: cdlight_t              cl_dlights[MAX_DLIGHTS];
1.1.1.2   root      113: 
1.1       root      114: /*
                    115: ================
                    116: CL_ClearDlights
                    117: ================
                    118: */
                    119: void CL_ClearDlights (void)
                    120: {
                    121:        memset (cl_dlights, 0, sizeof(cl_dlights));
                    122: }
1.1.1.2   root      123: 
1.1       root      124: /*
                    125: ===============
                    126: CL_AllocDlight
1.1.1.2   root      127: 
1.1       root      128: ===============
                    129: */
                    130: cdlight_t *CL_AllocDlight (int key)
                    131: {
                    132:        int             i;
                    133:        cdlight_t       *dl;
1.1.1.2   root      134: 
1.1       root      135: // first look for an exact key match
                    136:        if (key)
                    137:        {
                    138:                dl = cl_dlights;
                    139:                for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)
                    140:                {
                    141:                        if (dl->key == key)
                    142:                        {
                    143:                                memset (dl, 0, sizeof(*dl));
                    144:                                dl->key = key;
                    145:                                return dl;
                    146:                        }
                    147:                }
                    148:        }
1.1.1.2   root      149: 
1.1       root      150: // then look for anything else
                    151:        dl = cl_dlights;
                    152:        for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)
                    153:        {
                    154:                if (dl->die < cl.time)
                    155:                {
                    156:                        memset (dl, 0, sizeof(*dl));
                    157:                        dl->key = key;
                    158:                        return dl;
                    159:                }
                    160:        }
1.1.1.2   root      161: 
1.1       root      162:        dl = &cl_dlights[0];
                    163:        memset (dl, 0, sizeof(*dl));
                    164:        dl->key = key;
                    165:        return dl;
                    166: }
1.1.1.2   root      167: 
1.1       root      168: /*
                    169: ===============
                    170: CL_NewDlight
                    171: ===============
                    172: */
                    173: void CL_NewDlight (int key, float x, float y, float z, float radius, float time)
                    174: {
                    175:        cdlight_t       *dl;
1.1.1.2   root      176: 
1.1       root      177:        dl = CL_AllocDlight (key);
                    178:        dl->origin[0] = x;
                    179:        dl->origin[1] = y;
                    180:        dl->origin[2] = z;
                    181:        dl->radius = radius;
                    182:        dl->die = cl.time + time;
                    183: }
1.1.1.2   root      184: 
                    185: 
1.1       root      186: /*
                    187: ===============
                    188: CL_RunDLights
1.1.1.2   root      189: 
1.1       root      190: ===============
                    191: */
                    192: void CL_RunDLights (void)
                    193: {
                    194:        int                     i;
                    195:        cdlight_t       *dl;
1.1.1.2   root      196: 
1.1       root      197:        dl = cl_dlights;
                    198:        for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)
                    199:        {
                    200:                if (!dl->radius)
                    201:                        continue;
                    202:                
                    203:                if (dl->die < cl.time)
                    204:                {
                    205:                        dl->radius = 0;
                    206:                        return;
                    207:                }
                    208:                dl->radius -= cls.frametime*dl->decay;
                    209:                if (dl->radius < 0)
                    210:                        dl->radius = 0;
                    211:        }
                    212: }
1.1.1.2   root      213: 
1.1       root      214: /*
                    215: ==============
                    216: CL_ParseMuzzleFlash
                    217: ==============
                    218: */
                    219: void CL_ParseMuzzleFlash (void)
                    220: {
                    221:        vec3_t          fv, rv;
                    222:        cdlight_t       *dl;
                    223:        int                     i, weapon;
                    224:        centity_t       *pl;
                    225:        int                     silenced;
                    226:        float           volume;
                    227:        char            soundname[64];
1.1.1.2   root      228: 
1.1       root      229:        i = MSG_ReadShort (&net_message);
                    230:        if (i < 1 || i >= MAX_EDICTS)
                    231:                Com_Error (ERR_DROP, "CL_ParseMuzzleFlash: bad entity");
                    232: 
                    233:        weapon = MSG_ReadByte (&net_message);
                    234:        silenced = weapon & MZ_SILENCED;
                    235:        weapon &= ~MZ_SILENCED;
1.1.1.2   root      236: 
1.1       root      237:        pl = &cl_entities[i];
1.1.1.2   root      238: 
1.1       root      239:        dl = CL_AllocDlight (i);
                    240:        VectorCopy (pl->current.origin,  dl->origin);
                    241:        AngleVectors (pl->current.angles, fv, rv, NULL);
                    242:        VectorMA (dl->origin, 18, fv, dl->origin);
                    243:        VectorMA (dl->origin, 16, rv, dl->origin);
                    244:        if (silenced)
                    245:                dl->radius = 100 + (rand()&31);
                    246:        else
                    247:                dl->radius = 200 + (rand()&31);
                    248:        dl->minlight = 32;
                    249:        dl->die = cl.time; // + 0.1;
1.1.1.2   root      250: 
1.1       root      251:        if (silenced)
                    252:                volume = 0.2;
                    253:        else
                    254:                volume = 1;
1.1.1.2   root      255: 
1.1       root      256:        switch (weapon)
                    257:        {
                    258:        case MZ_BLASTER:
                    259:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    260:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/blastf1a.wav"), volume, ATTN_NORM, 0);
                    261:                break;
1.1.1.2   root      262:        case MZ_BLUEHYPERBLASTER:
                    263:                dl->color[0] = 0;dl->color[1] = 0;dl->color[2] = 1;
                    264:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/hyprbf1a.wav"), volume, ATTN_NORM, 0);
                    265:                break;
1.1       root      266:        case MZ_HYPERBLASTER:
                    267:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    268:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/hyprbf1a.wav"), volume, ATTN_NORM, 0);
                    269:                break;
                    270:        case MZ_MACHINEGUN:
                    271:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    272:                Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);
                    273:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0);
                    274:                break;
                    275:        case MZ_SHOTGUN:
                    276:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    277:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/shotgf1b.wav"), volume, ATTN_NORM, 0);
                    278:                S_StartSound (NULL, i, CHAN_AUTO,   S_RegisterSound("weapons/shotgr1b.wav"), volume, ATTN_NORM, 0.1);
                    279:                break;
                    280:        case MZ_SSHOTGUN:
                    281:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    282:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/sshotf1b.wav"), volume, ATTN_NORM, 0);
                    283:                break;
                    284:        case MZ_CHAINGUN1:
                    285:                dl->radius = 200 + (rand()&31);
                    286:                dl->color[0] = 1;dl->color[1] = 0.25;dl->color[2] = 0;
                    287:                Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);
                    288:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0);
                    289:                break;
                    290:        case MZ_CHAINGUN2:
                    291:                dl->radius = 225 + (rand()&31);
                    292:                dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0;
                    293:                dl->die = cl.time  + 0.1;       // long delay
                    294:                Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);
                    295:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0);
                    296:                Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);
                    297:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.05);
                    298:                break;
                    299:        case MZ_CHAINGUN3:
                    300:                dl->radius = 250 + (rand()&31);
                    301:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    302:                dl->die = cl.time  + 0.1;       // long delay
                    303:                Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);
                    304:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0);
                    305:                Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);
                    306:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.033);
                    307:                Com_sprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1);
                    308:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound(soundname), volume, ATTN_NORM, 0.066);
                    309:                break;
                    310:        case MZ_RAILGUN:
                    311:                dl->color[0] = 0.5;dl->color[1] = 0.5;dl->color[2] = 1.0;
                    312:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/railgf1a.wav"), volume, ATTN_NORM, 0);
                    313:                break;
                    314:        case MZ_ROCKET:
                    315:                dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0.2;
                    316:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/rocklf1a.wav"), volume, ATTN_NORM, 0);
                    317:                S_StartSound (NULL, i, CHAN_AUTO,   S_RegisterSound("weapons/rocklr1b.wav"), volume, ATTN_NORM, 0.1);
                    318:                break;
                    319:        case MZ_GRENADE:
                    320:                dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0;
                    321:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), volume, ATTN_NORM, 0);
                    322:                S_StartSound (NULL, i, CHAN_AUTO,   S_RegisterSound("weapons/grenlr1b.wav"), volume, ATTN_NORM, 0.1);
                    323:                break;
                    324:        case MZ_BFG:
                    325:                dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 0;
                    326:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/bfg__f1y.wav"), volume, ATTN_NORM, 0);
                    327:                break;
1.1.1.2   root      328: 
1.1       root      329:        case MZ_LOGIN:
                    330:                dl->color[0] = 0;dl->color[1] = 1; dl->color[2] = 0;
                    331:                dl->die = cl.time + 1.0;
                    332:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0);
                    333:                CL_LogoutEffect (pl->current.origin, weapon);
                    334:                break;
                    335:        case MZ_LOGOUT:
                    336:                dl->color[0] = 1;dl->color[1] = 0; dl->color[2] = 0;
                    337:                dl->die = cl.time + 1.0;
                    338:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0);
                    339:                CL_LogoutEffect (pl->current.origin, weapon);
                    340:                break;
                    341:        case MZ_RESPAWN:
                    342:                dl->color[0] = 1;dl->color[1] = 1; dl->color[2] = 0;
                    343:                dl->die = cl.time + 1.0;
                    344:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/grenlf1a.wav"), 1, ATTN_NORM, 0);
                    345:                CL_LogoutEffect (pl->current.origin, weapon);
                    346:                break;
1.1.1.2   root      347:        // RAFAEL
                    348:        case MZ_PHALANX:
                    349:                dl->color[0] = 1;dl->color[1] = 0.5; dl->color[2] = 0.5;
                    350:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/plasshot.wav"), volume, ATTN_NORM, 0);
                    351:                break;
                    352:        // RAFAEL
                    353:        case MZ_IONRIPPER:      
                    354:                dl->color[0] = 1;dl->color[1] = 0.5; dl->color[2] = 0.5;
                    355:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/rippfire.wav"), volume, ATTN_NORM, 0);
                    356:                break;
1.1.1.3 ! root      357: 
        !           358: // ======================
        !           359: // PGM
        !           360:        case MZ_ETF_RIFLE:
        !           361:                dl->color[0] = 0.9;dl->color[1] = 0.7;dl->color[2] = 0;
        !           362:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/nail1.wav"), volume, ATTN_NORM, 0);
        !           363:                break;
        !           364:        case MZ_SHOTGUN2:
        !           365:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
        !           366:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/shotg2.wav"), volume, ATTN_NORM, 0);
        !           367:                break;
        !           368:        case MZ_HEATBEAM:
        !           369:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
        !           370:                dl->die = cl.time + 100;
        !           371: //             S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/bfg__l1a.wav"), volume, ATTN_NORM, 0);
        !           372:                break;
        !           373:        case MZ_BLASTER2:
        !           374:                dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 0;
        !           375:                // FIXME - different sound for blaster2 ??
        !           376:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/blastf1a.wav"), volume, ATTN_NORM, 0);
        !           377:                break;
        !           378:        case MZ_TRACKER:
        !           379:                // negative flashes handled the same in gl/soft until CL_AddDLights
        !           380:                dl->color[0] = -1;dl->color[1] = -1;dl->color[2] = -1;
        !           381:                S_StartSound (NULL, i, CHAN_WEAPON, S_RegisterSound("weapons/disint2.wav"), volume, ATTN_NORM, 0);
        !           382:                break;          
        !           383:        case MZ_NUKE1:
        !           384:                dl->color[0] = 1;dl->color[1] = 0;dl->color[2] = 0;
        !           385:                dl->die = cl.time + 100;
        !           386:                break;
        !           387:        case MZ_NUKE2:
        !           388:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
        !           389:                dl->die = cl.time + 100;
        !           390:                break;
        !           391:        case MZ_NUKE4:
        !           392:                dl->color[0] = 0;dl->color[1] = 0;dl->color[2] = 1;
        !           393:                dl->die = cl.time + 100;
        !           394:                break;
        !           395:        case MZ_NUKE8:
        !           396:                dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 1;
        !           397:                dl->die = cl.time + 100;
        !           398:                break;
        !           399: // PGM
        !           400: // ======================
1.1       root      401:        }
                    402: }
1.1.1.2   root      403: 
                    404: 
1.1       root      405: /*
                    406: ==============
                    407: CL_ParseMuzzleFlash2
                    408: ==============
                    409: */
1.1.1.3 ! root      410: void CL_ParseMuzzleFlash2 (void) 
1.1       root      411: {
                    412:        int                     ent;
                    413:        vec3_t          origin;
                    414:        int                     flash_number;
                    415:        cdlight_t       *dl;
                    416:        vec3_t          forward, right;
                    417:        char            soundname[64];
1.1.1.2   root      418: 
1.1       root      419:        ent = MSG_ReadShort (&net_message);
                    420:        if (ent < 1 || ent >= MAX_EDICTS)
                    421:                Com_Error (ERR_DROP, "CL_ParseMuzzleFlash2: bad entity");
1.1.1.2   root      422: 
1.1       root      423:        flash_number = MSG_ReadByte (&net_message);
1.1.1.2   root      424: 
1.1       root      425:        // locate the origin
                    426:        AngleVectors (cl_entities[ent].current.angles, forward, right, NULL);
                    427:        origin[0] = cl_entities[ent].current.origin[0] + forward[0] * monster_flash_offset[flash_number][0] + right[0] * monster_flash_offset[flash_number][1];
                    428:        origin[1] = cl_entities[ent].current.origin[1] + forward[1] * monster_flash_offset[flash_number][0] + right[1] * monster_flash_offset[flash_number][1];
                    429:        origin[2] = cl_entities[ent].current.origin[2] + forward[2] * monster_flash_offset[flash_number][0] + right[2] * monster_flash_offset[flash_number][1] + monster_flash_offset[flash_number][2];
1.1.1.2   root      430: 
1.1       root      431:        dl = CL_AllocDlight (ent);
                    432:        VectorCopy (origin,  dl->origin);
                    433:        dl->radius = 200 + (rand()&31);
                    434:        dl->minlight = 32;
                    435:        dl->die = cl.time;      // + 0.1;
1.1.1.2   root      436: 
1.1       root      437:        switch (flash_number)
                    438:        {
                    439:        case MZ2_INFANTRY_MACHINEGUN_1:
                    440:        case MZ2_INFANTRY_MACHINEGUN_2:
                    441:        case MZ2_INFANTRY_MACHINEGUN_3:
                    442:        case MZ2_INFANTRY_MACHINEGUN_4:
                    443:        case MZ2_INFANTRY_MACHINEGUN_5:
                    444:        case MZ2_INFANTRY_MACHINEGUN_6:
                    445:        case MZ2_INFANTRY_MACHINEGUN_7:
                    446:        case MZ2_INFANTRY_MACHINEGUN_8:
                    447:        case MZ2_INFANTRY_MACHINEGUN_9:
                    448:        case MZ2_INFANTRY_MACHINEGUN_10:
                    449:        case MZ2_INFANTRY_MACHINEGUN_11:
                    450:        case MZ2_INFANTRY_MACHINEGUN_12:
                    451:        case MZ2_INFANTRY_MACHINEGUN_13:
                    452:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    453:                CL_ParticleEffect (origin, vec3_origin, 0, 40);
                    454:                CL_SmokeAndFlash(origin);
                    455:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("infantry/infatck1.wav"), 1, ATTN_NORM, 0);
                    456:                break;
1.1.1.2   root      457: 
1.1       root      458:        case MZ2_SOLDIER_MACHINEGUN_1:
                    459:        case MZ2_SOLDIER_MACHINEGUN_2:
                    460:        case MZ2_SOLDIER_MACHINEGUN_3:
                    461:        case MZ2_SOLDIER_MACHINEGUN_4:
                    462:        case MZ2_SOLDIER_MACHINEGUN_5:
                    463:        case MZ2_SOLDIER_MACHINEGUN_6:
                    464:        case MZ2_SOLDIER_MACHINEGUN_7:
                    465:        case MZ2_SOLDIER_MACHINEGUN_8:
                    466:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    467:                CL_ParticleEffect (origin, vec3_origin, 0, 40);
                    468:                CL_SmokeAndFlash(origin);
                    469:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("soldier/solatck3.wav"), 1, ATTN_NORM, 0);
                    470:                break;
1.1.1.2   root      471: 
1.1       root      472:        case MZ2_GUNNER_MACHINEGUN_1:
                    473:        case MZ2_GUNNER_MACHINEGUN_2:
                    474:        case MZ2_GUNNER_MACHINEGUN_3:
                    475:        case MZ2_GUNNER_MACHINEGUN_4:
                    476:        case MZ2_GUNNER_MACHINEGUN_5:
                    477:        case MZ2_GUNNER_MACHINEGUN_6:
                    478:        case MZ2_GUNNER_MACHINEGUN_7:
                    479:        case MZ2_GUNNER_MACHINEGUN_8:
                    480:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    481:                CL_ParticleEffect (origin, vec3_origin, 0, 40);
                    482:                CL_SmokeAndFlash(origin);
                    483:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("gunner/gunatck2.wav"), 1, ATTN_NORM, 0);
                    484:                break;
1.1.1.2   root      485: 
1.1       root      486:        case MZ2_ACTOR_MACHINEGUN_1:
                    487:        case MZ2_SUPERTANK_MACHINEGUN_1:
                    488:        case MZ2_SUPERTANK_MACHINEGUN_2:
                    489:        case MZ2_SUPERTANK_MACHINEGUN_3:
                    490:        case MZ2_SUPERTANK_MACHINEGUN_4:
                    491:        case MZ2_SUPERTANK_MACHINEGUN_5:
                    492:        case MZ2_SUPERTANK_MACHINEGUN_6:
1.1.1.3 ! root      493:        case MZ2_TURRET_MACHINEGUN:                     // PGM
1.1       root      494:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    495: 
                    496:                CL_ParticleEffect (origin, vec3_origin, 0, 40);
                    497:                CL_SmokeAndFlash(origin);
                    498:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("infantry/infatck1.wav"), 1, ATTN_NORM, 0);
                    499:                break;
                    500: 
                    501:        case MZ2_BOSS2_MACHINEGUN_L1:
                    502:        case MZ2_BOSS2_MACHINEGUN_L2:
                    503:        case MZ2_BOSS2_MACHINEGUN_L3:
                    504:        case MZ2_BOSS2_MACHINEGUN_L4:
                    505:        case MZ2_BOSS2_MACHINEGUN_L5:
1.1.1.3 ! root      506:        case MZ2_CARRIER_MACHINEGUN_L1:         // PMM
        !           507:        case MZ2_CARRIER_MACHINEGUN_L2:         // PMM
1.1       root      508:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
1.1.1.2   root      509: 
1.1       root      510:                CL_ParticleEffect (origin, vec3_origin, 0, 40);
                    511:                CL_SmokeAndFlash(origin);
                    512:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("infantry/infatck1.wav"), 1, ATTN_NONE, 0);
                    513:                break;
1.1.1.2   root      514: 
1.1       root      515:        case MZ2_SOLDIER_BLASTER_1:
                    516:        case MZ2_SOLDIER_BLASTER_2:
                    517:        case MZ2_SOLDIER_BLASTER_3:
                    518:        case MZ2_SOLDIER_BLASTER_4:
                    519:        case MZ2_SOLDIER_BLASTER_5:
                    520:        case MZ2_SOLDIER_BLASTER_6:
                    521:        case MZ2_SOLDIER_BLASTER_7:
                    522:        case MZ2_SOLDIER_BLASTER_8:
1.1.1.3 ! root      523:        case MZ2_TURRET_BLASTER:                        // PGM
1.1       root      524:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    525:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("soldier/solatck2.wav"), 1, ATTN_NORM, 0);
                    526:                break;
1.1.1.2   root      527: 
1.1       root      528:        case MZ2_FLYER_BLASTER_1:
                    529:        case MZ2_FLYER_BLASTER_2:
                    530:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    531:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("flyer/flyatck3.wav"), 1, ATTN_NORM, 0);
                    532:                break;
1.1.1.2   root      533: 
1.1       root      534:        case MZ2_MEDIC_BLASTER_1:
                    535:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    536:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("medic/medatck1.wav"), 1, ATTN_NORM, 0);
                    537:                break;
                    538: 
                    539:        case MZ2_HOVER_BLASTER_1:
                    540:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    541:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("hover/hovatck1.wav"), 1, ATTN_NORM, 0);
                    542:                break;
                    543: 
                    544:        case MZ2_FLOAT_BLASTER_1:
                    545:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    546:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("floater/fltatck1.wav"), 1, ATTN_NORM, 0);
                    547:                break;
1.1.1.2   root      548: 
1.1       root      549:        case MZ2_SOLDIER_SHOTGUN_1:
                    550:        case MZ2_SOLDIER_SHOTGUN_2:
                    551:        case MZ2_SOLDIER_SHOTGUN_3:
                    552:        case MZ2_SOLDIER_SHOTGUN_4:
                    553:        case MZ2_SOLDIER_SHOTGUN_5:
                    554:        case MZ2_SOLDIER_SHOTGUN_6:
                    555:        case MZ2_SOLDIER_SHOTGUN_7:
                    556:        case MZ2_SOLDIER_SHOTGUN_8:
                    557:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    558:                CL_SmokeAndFlash(origin);
                    559:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("soldier/solatck1.wav"), 1, ATTN_NORM, 0);
                    560:                break;
1.1.1.2   root      561: 
1.1       root      562:        case MZ2_TANK_BLASTER_1:
                    563:        case MZ2_TANK_BLASTER_2:
                    564:        case MZ2_TANK_BLASTER_3:
                    565:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    566:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("tank/tnkatck3.wav"), 1, ATTN_NORM, 0);
                    567:                break;
1.1.1.2   root      568: 
1.1       root      569:        case MZ2_TANK_MACHINEGUN_1:
                    570:        case MZ2_TANK_MACHINEGUN_2:
                    571:        case MZ2_TANK_MACHINEGUN_3:
                    572:        case MZ2_TANK_MACHINEGUN_4:
                    573:        case MZ2_TANK_MACHINEGUN_5:
                    574:        case MZ2_TANK_MACHINEGUN_6:
                    575:        case MZ2_TANK_MACHINEGUN_7:
                    576:        case MZ2_TANK_MACHINEGUN_8:
                    577:        case MZ2_TANK_MACHINEGUN_9:
                    578:        case MZ2_TANK_MACHINEGUN_10:
                    579:        case MZ2_TANK_MACHINEGUN_11:
                    580:        case MZ2_TANK_MACHINEGUN_12:
                    581:        case MZ2_TANK_MACHINEGUN_13:
                    582:        case MZ2_TANK_MACHINEGUN_14:
                    583:        case MZ2_TANK_MACHINEGUN_15:
                    584:        case MZ2_TANK_MACHINEGUN_16:
                    585:        case MZ2_TANK_MACHINEGUN_17:
                    586:        case MZ2_TANK_MACHINEGUN_18:
                    587:        case MZ2_TANK_MACHINEGUN_19:
                    588:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    589:                CL_ParticleEffect (origin, vec3_origin, 0, 40);
                    590:                CL_SmokeAndFlash(origin);
                    591:                Com_sprintf(soundname, sizeof(soundname), "tank/tnkatk2%c.wav", 'a' + rand() % 5);
                    592:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound(soundname), 1, ATTN_NORM, 0);
                    593:                break;
1.1.1.2   root      594: 
1.1       root      595:        case MZ2_CHICK_ROCKET_1:
1.1.1.3 ! root      596:        case MZ2_TURRET_ROCKET:                 // PGM
1.1       root      597:                dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0.2;
                    598:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("chick/chkatck2.wav"), 1, ATTN_NORM, 0);
                    599:                break;
1.1.1.2   root      600: 
1.1       root      601:        case MZ2_TANK_ROCKET_1:
                    602:        case MZ2_TANK_ROCKET_2:
                    603:        case MZ2_TANK_ROCKET_3:
                    604:                dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0.2;
                    605:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("tank/tnkatck1.wav"), 1, ATTN_NORM, 0);
                    606:                break;
1.1.1.2   root      607: 
1.1       root      608:        case MZ2_SUPERTANK_ROCKET_1:
                    609:        case MZ2_SUPERTANK_ROCKET_2:
                    610:        case MZ2_SUPERTANK_ROCKET_3:
                    611:        case MZ2_BOSS2_ROCKET_1:
                    612:        case MZ2_BOSS2_ROCKET_2:
                    613:        case MZ2_BOSS2_ROCKET_3:
                    614:        case MZ2_BOSS2_ROCKET_4:
1.1.1.3 ! root      615:        case MZ2_CARRIER_ROCKET_1:
        !           616: //     case MZ2_CARRIER_ROCKET_2:
        !           617: //     case MZ2_CARRIER_ROCKET_3:
        !           618: //     case MZ2_CARRIER_ROCKET_4:
1.1       root      619:                dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0.2;
                    620:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("tank/rocket.wav"), 1, ATTN_NORM, 0);
                    621:                break;
1.1.1.2   root      622: 
1.1       root      623:        case MZ2_GUNNER_GRENADE_1:
                    624:        case MZ2_GUNNER_GRENADE_2:
                    625:        case MZ2_GUNNER_GRENADE_3:
                    626:        case MZ2_GUNNER_GRENADE_4:
                    627:                dl->color[0] = 1;dl->color[1] = 0.5;dl->color[2] = 0;
                    628:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("gunner/gunatck3.wav"), 1, ATTN_NORM, 0);
                    629:                break;
1.1.1.2   root      630: 
1.1       root      631:        case MZ2_GLADIATOR_RAILGUN_1:
1.1.1.3 ! root      632:        // PMM
        !           633:        case MZ2_CARRIER_RAILGUN:
        !           634:        case MZ2_WIDOW_RAIL:
        !           635:        // pmm
1.1       root      636:                dl->color[0] = 0.5;dl->color[1] = 0.5;dl->color[2] = 1.0;
                    637:                break;
                    638: 
                    639: // --- Xian's shit starts ---
                    640:        case MZ2_MAKRON_BFG:
                    641:                dl->color[0] = 0.5;dl->color[1] = 1 ;dl->color[2] = 0.5;
                    642:                //S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("makron/bfg_fire.wav"), 1, ATTN_NORM, 0);
                    643:                break;
                    644: 
                    645:        case MZ2_MAKRON_BLASTER_1:
                    646:        case MZ2_MAKRON_BLASTER_2:
                    647:        case MZ2_MAKRON_BLASTER_3:
                    648:        case MZ2_MAKRON_BLASTER_4:
                    649:        case MZ2_MAKRON_BLASTER_5:
                    650:        case MZ2_MAKRON_BLASTER_6:
                    651:        case MZ2_MAKRON_BLASTER_7:
                    652:        case MZ2_MAKRON_BLASTER_8:
                    653:        case MZ2_MAKRON_BLASTER_9:
                    654:        case MZ2_MAKRON_BLASTER_10:
                    655:        case MZ2_MAKRON_BLASTER_11:
                    656:        case MZ2_MAKRON_BLASTER_12:
                    657:        case MZ2_MAKRON_BLASTER_13:
                    658:        case MZ2_MAKRON_BLASTER_14:
                    659:        case MZ2_MAKRON_BLASTER_15:
                    660:        case MZ2_MAKRON_BLASTER_16:
                    661:        case MZ2_MAKRON_BLASTER_17:
                    662:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    663:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("makron/blaster.wav"), 1, ATTN_NORM, 0);
                    664:                break;
                    665:        
                    666:        case MZ2_JORG_MACHINEGUN_L1:
                    667:        case MZ2_JORG_MACHINEGUN_L2:
                    668:        case MZ2_JORG_MACHINEGUN_L3:
                    669:        case MZ2_JORG_MACHINEGUN_L4:
                    670:        case MZ2_JORG_MACHINEGUN_L5:
                    671:        case MZ2_JORG_MACHINEGUN_L6:
                    672:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    673:                CL_ParticleEffect (origin, vec3_origin, 0, 40);
                    674:                CL_SmokeAndFlash(origin);
                    675:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("boss3/xfire.wav"), 1, ATTN_NORM, 0);
                    676:                break;
                    677: 
                    678:        case MZ2_JORG_MACHINEGUN_R1:
                    679:        case MZ2_JORG_MACHINEGUN_R2:
                    680:        case MZ2_JORG_MACHINEGUN_R3:
                    681:        case MZ2_JORG_MACHINEGUN_R4:
                    682:        case MZ2_JORG_MACHINEGUN_R5:
                    683:        case MZ2_JORG_MACHINEGUN_R6:
                    684:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    685:                CL_ParticleEffect (origin, vec3_origin, 0, 40);
                    686:                CL_SmokeAndFlash(origin);
                    687:                break;
                    688: 
                    689:        case MZ2_JORG_BFG_1:
                    690:                dl->color[0] = 0.5;dl->color[1] = 1 ;dl->color[2] = 0.5;
                    691:                break;
                    692: 
                    693:        case MZ2_BOSS2_MACHINEGUN_R1:
                    694:        case MZ2_BOSS2_MACHINEGUN_R2:
                    695:        case MZ2_BOSS2_MACHINEGUN_R3:
                    696:        case MZ2_BOSS2_MACHINEGUN_R4:
                    697:        case MZ2_BOSS2_MACHINEGUN_R5:
1.1.1.3 ! root      698:        case MZ2_CARRIER_MACHINEGUN_R1:                 // PMM
        !           699:        case MZ2_CARRIER_MACHINEGUN_R2:                 // PMM
        !           700: 
1.1       root      701:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
                    702: 
                    703:                CL_ParticleEffect (origin, vec3_origin, 0, 40);
                    704:                CL_SmokeAndFlash(origin);
                    705:                break;
                    706: 
1.1.1.3 ! root      707: // ======
        !           708: // ROGUE
        !           709:        case MZ2_STALKER_BLASTER:
        !           710:        case MZ2_DAEDALUS_BLASTER:
        !           711:        case MZ2_MEDIC_BLASTER_2:
        !           712:        case MZ2_WIDOW_BLASTER:
        !           713:        case MZ2_WIDOW_BLASTER_SWEEP1:
        !           714:        case MZ2_WIDOW_BLASTER_SWEEP2:
        !           715:        case MZ2_WIDOW_BLASTER_SWEEP3:
        !           716:        case MZ2_WIDOW_BLASTER_SWEEP4:
        !           717:        case MZ2_WIDOW_BLASTER_SWEEP5:
        !           718:        case MZ2_WIDOW_BLASTER_SWEEP6:
        !           719:        case MZ2_WIDOW_BLASTER_SWEEP7:
        !           720:        case MZ2_WIDOW_BLASTER_SWEEP8:
        !           721:        case MZ2_WIDOW_BLASTER_SWEEP9:
        !           722:        case MZ2_WIDOW_BLASTER_100:
        !           723:        case MZ2_WIDOW_BLASTER_90:
        !           724:        case MZ2_WIDOW_BLASTER_80:
        !           725:        case MZ2_WIDOW_BLASTER_70:
        !           726:        case MZ2_WIDOW_BLASTER_60:
        !           727:        case MZ2_WIDOW_BLASTER_50:
        !           728:        case MZ2_WIDOW_BLASTER_40:
        !           729:        case MZ2_WIDOW_BLASTER_30:
        !           730:        case MZ2_WIDOW_BLASTER_20:
        !           731:        case MZ2_WIDOW_BLASTER_10:
        !           732:        case MZ2_WIDOW_BLASTER_0:
        !           733:        case MZ2_WIDOW_BLASTER_10L:
        !           734:        case MZ2_WIDOW_BLASTER_20L:
        !           735:        case MZ2_WIDOW_BLASTER_30L:
        !           736:        case MZ2_WIDOW_BLASTER_40L:
        !           737:        case MZ2_WIDOW_BLASTER_50L:
        !           738:        case MZ2_WIDOW_BLASTER_60L:
        !           739:        case MZ2_WIDOW_BLASTER_70L:
        !           740:        case MZ2_WIDOW_RUN_1:
        !           741:        case MZ2_WIDOW_RUN_2:
        !           742:        case MZ2_WIDOW_RUN_3:
        !           743:        case MZ2_WIDOW_RUN_4:
        !           744:        case MZ2_WIDOW_RUN_5:
        !           745:        case MZ2_WIDOW_RUN_6:
        !           746:        case MZ2_WIDOW_RUN_7:
        !           747:        case MZ2_WIDOW_RUN_8:
        !           748:                dl->color[0] = 0;dl->color[1] = 1;dl->color[2] = 0;
        !           749:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("tank/tnkatck3.wav"), 1, ATTN_NORM, 0);
        !           750:                break;
1.1       root      751: 
1.1.1.3 ! root      752:        case MZ2_WIDOW_DISRUPTOR:
        !           753:                dl->color[0] = -1;dl->color[1] = -1;dl->color[2] = -1;
        !           754:                S_StartSound (NULL, ent, CHAN_WEAPON, S_RegisterSound("weapons/disint2.wav"), 1, ATTN_NORM, 0);
        !           755:                break;
        !           756: 
        !           757:        case MZ2_WIDOW_PLASMABEAM:
        !           758:        case MZ2_WIDOW2_BEAMER_1:
        !           759:        case MZ2_WIDOW2_BEAMER_2:
        !           760:        case MZ2_WIDOW2_BEAMER_3:
        !           761:        case MZ2_WIDOW2_BEAMER_4:
        !           762:        case MZ2_WIDOW2_BEAMER_5:
        !           763:        case MZ2_WIDOW2_BEAM_SWEEP_1:
        !           764:        case MZ2_WIDOW2_BEAM_SWEEP_2:
        !           765:        case MZ2_WIDOW2_BEAM_SWEEP_3:
        !           766:        case MZ2_WIDOW2_BEAM_SWEEP_4:
        !           767:        case MZ2_WIDOW2_BEAM_SWEEP_5:
        !           768:        case MZ2_WIDOW2_BEAM_SWEEP_6:
        !           769:        case MZ2_WIDOW2_BEAM_SWEEP_7:
        !           770:        case MZ2_WIDOW2_BEAM_SWEEP_8:
        !           771:        case MZ2_WIDOW2_BEAM_SWEEP_9:
        !           772:        case MZ2_WIDOW2_BEAM_SWEEP_10:
        !           773:        case MZ2_WIDOW2_BEAM_SWEEP_11:
        !           774:                dl->radius = 300 + (rand()&100);
        !           775:                dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0;
        !           776:                dl->die = cl.time + 200;
        !           777:                break;
        !           778: // ROGUE
        !           779: // ======
1.1       root      780: 
                    781: // --- Xian's shit ends ---
1.1.1.2   root      782: 
1.1       root      783:        }
                    784: }
1.1.1.2   root      785: 
                    786: 
1.1       root      787: /*
                    788: ===============
                    789: CL_AddDLights
1.1.1.2   root      790: 
1.1       root      791: ===============
                    792: */
                    793: void CL_AddDLights (void)
                    794: {
                    795:        int                     i;
                    796:        cdlight_t       *dl;
1.1.1.2   root      797: 
1.1       root      798:        dl = cl_dlights;
1.1.1.3 ! root      799: 
        !           800: //=====
        !           801: //PGM
        !           802:        if(vidref_val == VIDREF_GL)
        !           803:        {
        !           804:                for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)
        !           805:                {
        !           806:                        if (!dl->radius)
        !           807:                                continue;
        !           808:                        V_AddLight (dl->origin, dl->radius,
        !           809:                                dl->color[0], dl->color[1], dl->color[2]);
        !           810:                }
        !           811:        }
        !           812:        else
1.1       root      813:        {
1.1.1.3 ! root      814:                for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)
        !           815:                {
        !           816:                        if (!dl->radius)
        !           817:                                continue;
        !           818: 
        !           819:                        // negative light in software. only black allowed
        !           820:                        if ((dl->color[0] < 0) || (dl->color[1] < 0) || (dl->color[2] < 0))
        !           821:                        {
        !           822:                                dl->radius = -(dl->radius);
        !           823:                                dl->color[0] = 1;
        !           824:                                dl->color[1] = 1;
        !           825:                                dl->color[2] = 1;
        !           826:                        }
        !           827:                        V_AddLight (dl->origin, dl->radius,
        !           828:                                dl->color[0], dl->color[1], dl->color[2]);
        !           829:                }
1.1       root      830:        }
1.1.1.3 ! root      831: //PGM
        !           832: //=====
1.1       root      833: }
1.1.1.2   root      834: 
                    835: 
                    836: 
1.1       root      837: /*
                    838: ==============================================================
1.1.1.2   root      839: 
1.1       root      840: PARTICLE MANAGEMENT
1.1.1.2   root      841: 
1.1       root      842: ==============================================================
                    843: */
1.1.1.2   root      844: 
1.1.1.3 ! root      845: /*
        !           846: // THIS HAS BEEN RELOCATED TO CLIENT.H
1.1       root      847: typedef struct particle_s
                    848: {
                    849:        struct particle_s       *next;
1.1.1.2   root      850: 
1.1       root      851:        float           time;
1.1.1.2   root      852: 
1.1       root      853:        vec3_t          org;
                    854:        vec3_t          vel;
                    855:        vec3_t          accel;
                    856:        float           color;
                    857:        float           colorvel;
                    858:        float           alpha;
                    859:        float           alphavel;
                    860: } cparticle_t;
1.1.1.2   root      861: 
                    862: 
1.1       root      863: #define        PARTICLE_GRAVITY        40
1.1.1.3 ! root      864: */
1.1.1.2   root      865: 
1.1       root      866: cparticle_t    *active_particles, *free_particles;
1.1.1.2   root      867: 
1.1       root      868: cparticle_t    particles[MAX_PARTICLES];
                    869: int                    cl_numparticles = MAX_PARTICLES;
1.1.1.2   root      870: 
                    871: 
1.1       root      872: /*
                    873: ===============
                    874: CL_ClearParticles
                    875: ===============
                    876: */
                    877: void CL_ClearParticles (void)
                    878: {
                    879:        int             i;
                    880:        
                    881:        free_particles = &particles[0];
                    882:        active_particles = NULL;
1.1.1.2   root      883: 
1.1       root      884:        for (i=0 ;i<cl_numparticles ; i++)
                    885:                particles[i].next = &particles[i+1];
                    886:        particles[cl_numparticles-1].next = NULL;
                    887: }
1.1.1.2   root      888: 
                    889: 
1.1       root      890: /*
                    891: ===============
                    892: CL_ParticleEffect
1.1.1.2   root      893: 
1.1       root      894: Wall impact puffs
                    895: ===============
                    896: */
                    897: void CL_ParticleEffect (vec3_t org, vec3_t dir, int color, int count)
                    898: {
                    899:        int                     i, j;
                    900:        cparticle_t     *p;
                    901:        float           d;
1.1.1.2   root      902: 
1.1       root      903:        for (i=0 ; i<count ; i++)
                    904:        {
                    905:                if (!free_particles)
                    906:                        return;
                    907:                p = free_particles;
                    908:                free_particles = p->next;
                    909:                p->next = active_particles;
                    910:                active_particles = p;
1.1.1.2   root      911: 
1.1       root      912:                p->time = cl.time;
                    913:                p->color = color + (rand()&7);
1.1.1.2   root      914: 
1.1       root      915:                d = rand()&31;
                    916:                for (j=0 ; j<3 ; j++)
                    917:                {
                    918:                        p->org[j] = org[j] + ((rand()&7)-4) + d*dir[j];
                    919:                        p->vel[j] = crand()*20;
                    920:                }
1.1.1.2   root      921: 
1.1       root      922:                p->accel[0] = p->accel[1] = 0;
                    923:                p->accel[2] = -PARTICLE_GRAVITY;
                    924:                p->alpha = 1.0;
1.1.1.2   root      925: 
1.1       root      926:                p->alphavel = -1.0 / (0.5 + frand()*0.3);
                    927:        }
                    928: }
1.1.1.2   root      929: 
                    930: 
1.1       root      931: /*
                    932: ===============
                    933: CL_ParticleEffect2
                    934: ===============
                    935: */
                    936: void CL_ParticleEffect2 (vec3_t org, vec3_t dir, int color, int count)
                    937: {
                    938:        int                     i, j;
                    939:        cparticle_t     *p;
                    940:        float           d;
                    941: 
                    942:        for (i=0 ; i<count ; i++)
                    943:        {
                    944:                if (!free_particles)
                    945:                        return;
                    946:                p = free_particles;
                    947:                free_particles = p->next;
                    948:                p->next = active_particles;
                    949:                active_particles = p;
                    950: 
                    951:                p->time = cl.time;
                    952:                p->color = color;
                    953: 
                    954:                d = rand()&7;
                    955:                for (j=0 ; j<3 ; j++)
                    956:                {
                    957:                        p->org[j] = org[j] + ((rand()&7)-4) + d*dir[j];
                    958:                        p->vel[j] = crand()*20;
                    959:                }
                    960: 
                    961:                p->accel[0] = p->accel[1] = 0;
                    962:                p->accel[2] = -PARTICLE_GRAVITY;
                    963:                p->alpha = 1.0;
                    964: 
                    965:                p->alphavel = -1.0 / (0.5 + frand()*0.3);
                    966:        }
                    967: }
                    968: 
1.1.1.2   root      969: 
                    970: // RAFAEL
                    971: /*
                    972: ===============
                    973: CL_ParticleEffect3
                    974: ===============
                    975: */
                    976: void CL_ParticleEffect3 (vec3_t org, vec3_t dir, int color, int count)
                    977: {
                    978:        int                     i, j;
                    979:        cparticle_t     *p;
                    980:        float           d;
                    981: 
                    982:        for (i=0 ; i<count ; i++)
                    983:        {
                    984:                if (!free_particles)
                    985:                        return;
                    986:                p = free_particles;
                    987:                free_particles = p->next;
                    988:                p->next = active_particles;
                    989:                active_particles = p;
                    990: 
                    991:                p->time = cl.time;
                    992:                p->color = color;
                    993: 
                    994:                d = rand()&7;
                    995:                for (j=0 ; j<3 ; j++)
                    996:                {
                    997:                        p->org[j] = org[j] + ((rand()&7)-4) + d*dir[j];
                    998:                        p->vel[j] = crand()*20;
                    999:                }
                   1000: 
                   1001:                p->accel[0] = p->accel[1] = 0;
                   1002:                p->accel[2] = PARTICLE_GRAVITY;
                   1003:                p->alpha = 1.0;
                   1004: 
                   1005:                p->alphavel = -1.0 / (0.5 + frand()*0.3);
                   1006:        }
                   1007: }
                   1008: 
1.1       root     1009: /*
                   1010: ===============
                   1011: CL_TeleporterParticles
                   1012: ===============
                   1013: */
                   1014: void CL_TeleporterParticles (entity_state_t *ent)
                   1015: {
                   1016:        int                     i, j;
                   1017:        cparticle_t     *p;
                   1018: 
                   1019:        for (i=0 ; i<8 ; i++)
                   1020:        {
                   1021:                if (!free_particles)
                   1022:                        return;
                   1023:                p = free_particles;
                   1024:                free_particles = p->next;
                   1025:                p->next = active_particles;
                   1026:                active_particles = p;
                   1027: 
                   1028:                p->time = cl.time;
                   1029:                p->color = 0xdb;
                   1030: 
                   1031:                for (j=0 ; j<2 ; j++)
                   1032:                {
                   1033:                        p->org[j] = ent->origin[j] - 16 + (rand()&31);
                   1034:                        p->vel[j] = crand()*14;
                   1035:                }
                   1036: 
                   1037:                p->org[2] = ent->origin[2] - 8 + (rand()&7);
                   1038:                p->vel[2] = 80 + (rand()&7);
                   1039: 
                   1040:                p->accel[0] = p->accel[1] = 0;
                   1041:                p->accel[2] = -PARTICLE_GRAVITY;
                   1042:                p->alpha = 1.0;
                   1043: 
                   1044:                p->alphavel = -0.5;
                   1045:        }
                   1046: }
                   1047: 
1.1.1.2   root     1048: 
1.1       root     1049: /*
                   1050: ===============
                   1051: CL_LogoutEffect
1.1.1.2   root     1052: 
1.1       root     1053: ===============
                   1054: */
                   1055: void CL_LogoutEffect (vec3_t org, int type)
                   1056: {
                   1057:        int                     i, j;
                   1058:        cparticle_t     *p;
1.1.1.2   root     1059: 
1.1       root     1060:        for (i=0 ; i<500 ; i++)
                   1061:        {
                   1062:                if (!free_particles)
                   1063:                        return;
                   1064:                p = free_particles;
                   1065:                free_particles = p->next;
                   1066:                p->next = active_particles;
                   1067:                active_particles = p;
1.1.1.2   root     1068: 
1.1       root     1069:                p->time = cl.time;
1.1.1.2   root     1070: 
1.1       root     1071:                if (type == MZ_LOGIN)
                   1072:                        p->color = 0xd0 + (rand()&7);   // green
                   1073:                else if (type == MZ_LOGOUT)
                   1074:                        p->color = 0x40 + (rand()&7);   // red
                   1075:                else
                   1076:                        p->color = 0xe0 + (rand()&7);   // yellow
1.1.1.2   root     1077: 
1.1       root     1078:                p->org[0] = org[0] - 16 + frand()*32;
                   1079:                p->org[1] = org[1] - 16 + frand()*32;
                   1080:                p->org[2] = org[2] - 24 + frand()*56;
1.1.1.2   root     1081: 
1.1       root     1082:                for (j=0 ; j<3 ; j++)
                   1083:                        p->vel[j] = crand()*20;
1.1.1.2   root     1084: 
1.1       root     1085:                p->accel[0] = p->accel[1] = 0;
                   1086:                p->accel[2] = -PARTICLE_GRAVITY;
                   1087:                p->alpha = 1.0;
1.1.1.2   root     1088: 
1.1       root     1089:                p->alphavel = -1.0 / (1.0 + frand()*0.3);
                   1090:        }
                   1091: }
1.1.1.2   root     1092: 
                   1093: 
1.1       root     1094: /*
                   1095: ===============
                   1096: CL_ItemRespawnParticles
1.1.1.2   root     1097: 
1.1       root     1098: ===============
                   1099: */
                   1100: void CL_ItemRespawnParticles (vec3_t org)
                   1101: {
                   1102:        int                     i, j;
                   1103:        cparticle_t     *p;
1.1.1.2   root     1104: 
1.1       root     1105:        for (i=0 ; i<64 ; i++)
                   1106:        {
                   1107:                if (!free_particles)
                   1108:                        return;
                   1109:                p = free_particles;
                   1110:                free_particles = p->next;
                   1111:                p->next = active_particles;
                   1112:                active_particles = p;
1.1.1.2   root     1113: 
1.1       root     1114:                p->time = cl.time;
1.1.1.2   root     1115: 
1.1       root     1116:                p->color = 0xd4 + (rand()&3);   // green
1.1.1.2   root     1117: 
1.1       root     1118:                p->org[0] = org[0] + crand()*8;
                   1119:                p->org[1] = org[1] + crand()*8;
                   1120:                p->org[2] = org[2] + crand()*8;
1.1.1.2   root     1121: 
1.1       root     1122:                for (j=0 ; j<3 ; j++)
                   1123:                        p->vel[j] = crand()*8;
1.1.1.2   root     1124: 
1.1       root     1125:                p->accel[0] = p->accel[1] = 0;
                   1126:                p->accel[2] = -PARTICLE_GRAVITY*0.2;
                   1127:                p->alpha = 1.0;
1.1.1.2   root     1128: 
1.1       root     1129:                p->alphavel = -1.0 / (1.0 + frand()*0.3);
                   1130:        }
                   1131: }
1.1.1.2   root     1132: 
                   1133: 
1.1       root     1134: /*
                   1135: ===============
                   1136: CL_ExplosionParticles
                   1137: ===============
                   1138: */
                   1139: void CL_ExplosionParticles (vec3_t org)
                   1140: {
                   1141:        int                     i, j;
                   1142:        cparticle_t     *p;
                   1143: 
                   1144:        for (i=0 ; i<256 ; i++)
                   1145:        {
                   1146:                if (!free_particles)
                   1147:                        return;
                   1148:                p = free_particles;
                   1149:                free_particles = p->next;
                   1150:                p->next = active_particles;
                   1151:                active_particles = p;
                   1152: 
                   1153:                p->time = cl.time;
                   1154:                p->color = 0xe0 + (rand()&7);
                   1155: 
                   1156:                for (j=0 ; j<3 ; j++)
                   1157:                {
                   1158:                        p->org[j] = org[j] + ((rand()%32)-16);
                   1159:                        p->vel[j] = (rand()%384)-192;
                   1160:                }
                   1161: 
                   1162:                p->accel[0] = p->accel[1] = 0;
                   1163:                p->accel[2] = -PARTICLE_GRAVITY;
                   1164:                p->alpha = 1.0;
                   1165: 
                   1166:                p->alphavel = -0.8 / (0.5 + frand()*0.3);
                   1167:        }
                   1168: }
                   1169: 
                   1170: 
                   1171: /*
                   1172: ===============
                   1173: CL_BigTeleportParticles
                   1174: ===============
                   1175: */
                   1176: void CL_BigTeleportParticles (vec3_t org)
                   1177: {
                   1178:        int                     i;
                   1179:        cparticle_t     *p;
                   1180:        float           angle, dist;
                   1181:        static int colortable[4] = {2*8,13*8,21*8,18*8};
                   1182: 
                   1183:        for (i=0 ; i<4096 ; i++)
                   1184:        {
                   1185:                if (!free_particles)
                   1186:                        return;
                   1187:                p = free_particles;
                   1188:                free_particles = p->next;
                   1189:                p->next = active_particles;
                   1190:                active_particles = p;
                   1191: 
                   1192:                p->time = cl.time;
                   1193: 
                   1194:                p->color = colortable[rand()&3];
                   1195: 
                   1196:                angle = M_PI*2*(rand()&1023)/1023.0;
                   1197:                dist = rand()&31;
                   1198:                p->org[0] = org[0] + cos(angle)*dist;
                   1199:                p->vel[0] = cos(angle)*(70+(rand()&63));
                   1200:                p->accel[0] = -cos(angle)*100;
                   1201: 
                   1202:                p->org[1] = org[1] + sin(angle)*dist;
                   1203:                p->vel[1] = sin(angle)*(70+(rand()&63));
                   1204:                p->accel[1] = -sin(angle)*100;
                   1205: 
                   1206:                p->org[2] = org[2] + 8 + (rand()%90);
                   1207:                p->vel[2] = -100 + (rand()&31);
                   1208:                p->accel[2] = PARTICLE_GRAVITY*4;
                   1209:                p->alpha = 1.0;
                   1210: 
                   1211:                p->alphavel = -0.3 / (0.5 + frand()*0.3);
                   1212:        }
                   1213: }
                   1214: 
                   1215: 
                   1216: /*
                   1217: ===============
                   1218: CL_BlasterParticles
1.1.1.2   root     1219: 
1.1       root     1220: Wall impact puffs
                   1221: ===============
                   1222: */
                   1223: void CL_BlasterParticles (vec3_t org, vec3_t dir)
                   1224: {
                   1225:        int                     i, j;
                   1226:        cparticle_t     *p;
                   1227:        float           d;
                   1228:        int                     count;
1.1.1.2   root     1229: 
1.1       root     1230:        count = 40;
                   1231:        for (i=0 ; i<count ; i++)
                   1232:        {
                   1233:                if (!free_particles)
                   1234:                        return;
                   1235:                p = free_particles;
                   1236:                free_particles = p->next;
                   1237:                p->next = active_particles;
                   1238:                active_particles = p;
1.1.1.2   root     1239: 
1.1       root     1240:                p->time = cl.time;
                   1241:                p->color = 0xe0 + (rand()&7);
1.1.1.2   root     1242: 
1.1       root     1243:                d = rand()&15;
                   1244:                for (j=0 ; j<3 ; j++)
                   1245:                {
                   1246:                        p->org[j] = org[j] + ((rand()&7)-4) + d*dir[j];
                   1247:                        p->vel[j] = dir[j] * 30 + crand()*40;
                   1248:                }
1.1.1.2   root     1249: 
1.1       root     1250:                p->accel[0] = p->accel[1] = 0;
                   1251:                p->accel[2] = -PARTICLE_GRAVITY;
                   1252:                p->alpha = 1.0;
1.1.1.2   root     1253: 
1.1       root     1254:                p->alphavel = -1.0 / (0.5 + frand()*0.3);
                   1255:        }
                   1256: }
1.1.1.2   root     1257: 
                   1258: 
1.1       root     1259: /*
                   1260: ===============
                   1261: CL_BlasterTrail
1.1.1.2   root     1262: 
1.1       root     1263: ===============
                   1264: */
                   1265: void CL_BlasterTrail (vec3_t start, vec3_t end)
                   1266: {
                   1267:        vec3_t          move;
                   1268:        vec3_t          vec;
                   1269:        float           len;
                   1270:        int                     j;
                   1271:        cparticle_t     *p;
                   1272:        int                     dec;
1.1.1.2   root     1273: 
1.1       root     1274:        VectorCopy (start, move);
                   1275:        VectorSubtract (end, start, vec);
                   1276:        len = VectorNormalize (vec);
1.1.1.2   root     1277: 
1.1       root     1278:        dec = 5;
                   1279:        VectorScale (vec, 5, vec);
1.1.1.2   root     1280: 
1.1       root     1281:        // FIXME: this is a really silly way to have a loop
                   1282:        while (len > 0)
                   1283:        {
                   1284:                len -= dec;
1.1.1.2   root     1285: 
1.1       root     1286:                if (!free_particles)
                   1287:                        return;
                   1288:                p = free_particles;
                   1289:                free_particles = p->next;
                   1290:                p->next = active_particles;
                   1291:                active_particles = p;
                   1292:                VectorClear (p->accel);
                   1293:                
                   1294:                p->time = cl.time;
1.1.1.2   root     1295: 
1.1       root     1296:                p->alpha = 1.0;
                   1297:                p->alphavel = -1.0 / (0.3+frand()*0.2);
                   1298:                p->color = 0xe0;
                   1299:                for (j=0 ; j<3 ; j++)
                   1300:                {
                   1301:                        p->org[j] = move[j] + crand();
                   1302:                        p->vel[j] = crand()*5;
                   1303:                        p->accel[j] = 0;
                   1304:                }
1.1.1.2   root     1305: 
1.1       root     1306:                VectorAdd (move, vec, move);
                   1307:        }
                   1308: }
1.1.1.2   root     1309: 
1.1       root     1310: /*
                   1311: ===============
                   1312: CL_QuadTrail
                   1313: 
                   1314: ===============
                   1315: */
                   1316: void CL_QuadTrail (vec3_t start, vec3_t end)
                   1317: {
                   1318:        vec3_t          move;
                   1319:        vec3_t          vec;
                   1320:        float           len;
                   1321:        int                     j;
                   1322:        cparticle_t     *p;
                   1323:        int                     dec;
                   1324: 
                   1325:        VectorCopy (start, move);
                   1326:        VectorSubtract (end, start, vec);
                   1327:        len = VectorNormalize (vec);
                   1328: 
                   1329:        dec = 5;
                   1330:        VectorScale (vec, 5, vec);
                   1331: 
                   1332:        while (len > 0)
                   1333:        {
                   1334:                len -= dec;
                   1335: 
                   1336:                if (!free_particles)
                   1337:                        return;
                   1338:                p = free_particles;
                   1339:                free_particles = p->next;
                   1340:                p->next = active_particles;
                   1341:                active_particles = p;
                   1342:                VectorClear (p->accel);
                   1343:                
                   1344:                p->time = cl.time;
                   1345: 
                   1346:                p->alpha = 1.0;
                   1347:                p->alphavel = -1.0 / (0.8+frand()*0.2);
                   1348:                p->color = 115;
                   1349:                for (j=0 ; j<3 ; j++)
                   1350:                {
                   1351:                        p->org[j] = move[j] + crand()*16;
                   1352:                        p->vel[j] = crand()*5;
                   1353:                        p->accel[j] = 0;
                   1354:                }
                   1355: 
                   1356:                VectorAdd (move, vec, move);
                   1357:        }
                   1358: }
                   1359: 
                   1360: /*
                   1361: ===============
                   1362: CL_FlagTrail
                   1363: 
                   1364: ===============
                   1365: */
                   1366: void CL_FlagTrail (vec3_t start, vec3_t end, float color)
                   1367: {
                   1368:        vec3_t          move;
                   1369:        vec3_t          vec;
                   1370:        float           len;
                   1371:        int                     j;
                   1372:        cparticle_t     *p;
                   1373:        int                     dec;
                   1374: 
                   1375:        VectorCopy (start, move);
                   1376:        VectorSubtract (end, start, vec);
                   1377:        len = VectorNormalize (vec);
                   1378: 
                   1379:        dec = 5;
                   1380:        VectorScale (vec, 5, vec);
                   1381: 
                   1382:        while (len > 0)
                   1383:        {
                   1384:                len -= dec;
                   1385: 
                   1386:                if (!free_particles)
                   1387:                        return;
                   1388:                p = free_particles;
                   1389:                free_particles = p->next;
                   1390:                p->next = active_particles;
                   1391:                active_particles = p;
                   1392:                VectorClear (p->accel);
                   1393:                
                   1394:                p->time = cl.time;
                   1395: 
                   1396:                p->alpha = 1.0;
                   1397:                p->alphavel = -1.0 / (0.8+frand()*0.2);
                   1398:                p->color = color;
                   1399:                for (j=0 ; j<3 ; j++)
                   1400:                {
                   1401:                        p->org[j] = move[j] + crand()*16;
                   1402:                        p->vel[j] = crand()*5;
                   1403:                        p->accel[j] = 0;
                   1404:                }
                   1405: 
                   1406:                VectorAdd (move, vec, move);
                   1407:        }
                   1408: }
                   1409: 
                   1410: /*
                   1411: ===============
                   1412: CL_DiminishingTrail
1.1.1.2   root     1413: 
1.1       root     1414: ===============
                   1415: */
                   1416: void CL_DiminishingTrail (vec3_t start, vec3_t end, centity_t *old, int flags)
                   1417: {
                   1418:        vec3_t          move;
                   1419:        vec3_t          vec;
                   1420:        float           len;
                   1421:        int                     j;
                   1422:        cparticle_t     *p;
                   1423:        float           dec;
                   1424:        float           orgscale;
                   1425:        float           velscale;
1.1.1.2   root     1426: 
1.1       root     1427:        VectorCopy (start, move);
                   1428:        VectorSubtract (end, start, vec);
                   1429:        len = VectorNormalize (vec);
1.1.1.2   root     1430: 
1.1       root     1431:        dec = 0.5;
                   1432:        VectorScale (vec, dec, vec);
1.1.1.2   root     1433: 
1.1       root     1434:        if (old->trailcount > 900)
                   1435:        {
                   1436:                orgscale = 4;
                   1437:                velscale = 15;
                   1438:        }
                   1439:        else if (old->trailcount > 800)
                   1440:        {
                   1441:                orgscale = 2;
                   1442:                velscale = 10;
                   1443:        }
                   1444:        else
                   1445:        {
                   1446:                orgscale = 1;
                   1447:                velscale = 5;
                   1448:        }
1.1.1.2   root     1449: 
1.1       root     1450:        while (len > 0)
                   1451:        {
                   1452:                len -= dec;
1.1.1.2   root     1453: 
1.1       root     1454:                if (!free_particles)
                   1455:                        return;
1.1.1.2   root     1456: 
1.1       root     1457:                // drop less particles as it flies
                   1458:                if ((rand()&1023) < old->trailcount)
                   1459:                {
                   1460:                        p = free_particles;
                   1461:                        free_particles = p->next;
                   1462:                        p->next = active_particles;
                   1463:                        active_particles = p;
                   1464:                        VectorClear (p->accel);
                   1465:                
                   1466:                        p->time = cl.time;
1.1.1.2   root     1467: 
1.1       root     1468:                        if (flags & EF_GIB)
                   1469:                        {
                   1470:                                p->alpha = 1.0;
                   1471:                                p->alphavel = -1.0 / (1+frand()*0.4);
                   1472:                                p->color = 0xe8 + (rand()&7);
                   1473:                                for (j=0 ; j<3 ; j++)
                   1474:                                {
                   1475:                                        p->org[j] = move[j] + crand()*orgscale;
                   1476:                                        p->vel[j] = crand()*velscale;
                   1477:                                        p->accel[j] = 0;
                   1478:                                }
                   1479:                                p->vel[2] -= PARTICLE_GRAVITY;
                   1480:                        }
                   1481:                        else if (flags & EF_GREENGIB)
                   1482:                        {
                   1483:                                p->alpha = 1.0;
                   1484:                                p->alphavel = -1.0 / (1+frand()*0.4);
1.1.1.2   root     1485:                                p->color = 0xdb + (rand()&7);
1.1       root     1486:                                for (j=0; j< 3; j++)
                   1487:                                {
                   1488:                                        p->org[j] = move[j] + crand()*orgscale;
                   1489:                                        p->vel[j] = crand()*velscale;
                   1490:                                        p->accel[j] = 0;
                   1491:                                }
                   1492:                                p->vel[2] -= PARTICLE_GRAVITY;
                   1493:                        }
                   1494:                        else
                   1495:                        {
                   1496:                                p->alpha = 1.0;
                   1497:                                p->alphavel = -1.0 / (1+frand()*0.2);
                   1498:                                p->color = 4 + (rand()&7);
                   1499:                                for (j=0 ; j<3 ; j++)
                   1500:                                {
                   1501:                                        p->org[j] = move[j] + crand()*orgscale;
                   1502:                                        p->vel[j] = crand()*velscale;
                   1503:                                }
                   1504:                                p->accel[2] = 20;
                   1505:                        }
                   1506:                }
1.1.1.2   root     1507: 
1.1       root     1508:                old->trailcount -= 5;
                   1509:                if (old->trailcount < 100)
                   1510:                        old->trailcount = 100;
                   1511:                VectorAdd (move, vec, move);
                   1512:        }
                   1513: }
1.1.1.2   root     1514: 
1.1       root     1515: void MakeNormalVectors (vec3_t forward, vec3_t right, vec3_t up)
                   1516: {
                   1517:        float           d;
1.1.1.2   root     1518: 
1.1       root     1519:        // this rotate and negat guarantees a vector
                   1520:        // not colinear with the original
                   1521:        right[1] = -forward[0];
                   1522:        right[2] = forward[1];
                   1523:        right[0] = forward[2];
1.1.1.2   root     1524: 
1.1       root     1525:        d = DotProduct (right, forward);
                   1526:        VectorMA (right, -d, forward, right);
                   1527:        VectorNormalize (right);
                   1528:        CrossProduct (right, forward, up);
                   1529: }
1.1.1.2   root     1530: 
1.1       root     1531: /*
                   1532: ===============
                   1533: CL_RocketTrail
1.1.1.2   root     1534: 
1.1       root     1535: ===============
                   1536: */
                   1537: void CL_RocketTrail (vec3_t start, vec3_t end, centity_t *old)
                   1538: {
                   1539:        vec3_t          move;
                   1540:        vec3_t          vec;
                   1541:        float           len;
                   1542:        int                     j;
                   1543:        cparticle_t     *p;
                   1544:        float           dec;
1.1.1.2   root     1545: 
1.1       root     1546:        // smoke
                   1547:        CL_DiminishingTrail (start, end, old, EF_ROCKET);
1.1.1.2   root     1548: 
1.1       root     1549:        // fire
                   1550:        VectorCopy (start, move);
                   1551:        VectorSubtract (end, start, vec);
                   1552:        len = VectorNormalize (vec);
1.1.1.2   root     1553: 
1.1       root     1554:        dec = 1;
                   1555:        VectorScale (vec, dec, vec);
1.1.1.2   root     1556: 
1.1       root     1557:        while (len > 0)
                   1558:        {
                   1559:                len -= dec;
1.1.1.2   root     1560: 
1.1       root     1561:                if (!free_particles)
                   1562:                        return;
1.1.1.2   root     1563: 
1.1       root     1564:                if ( (rand()&7) == 0)
                   1565:                {
                   1566:                        p = free_particles;
                   1567:                        free_particles = p->next;
                   1568:                        p->next = active_particles;
                   1569:                        active_particles = p;
                   1570:                        
                   1571:                        VectorClear (p->accel);
                   1572:                        p->time = cl.time;
1.1.1.2   root     1573: 
1.1       root     1574:                        p->alpha = 1.0;
                   1575:                        p->alphavel = -1.0 / (1+frand()*0.2);
                   1576:                        p->color = 0xdc + (rand()&3);
                   1577:                        for (j=0 ; j<3 ; j++)
                   1578:                        {
                   1579:                                p->org[j] = move[j] + crand()*5;
                   1580:                                p->vel[j] = crand()*20;
                   1581:                        }
                   1582:                        p->accel[2] = -PARTICLE_GRAVITY;
                   1583:                }
                   1584:                VectorAdd (move, vec, move);
                   1585:        }
                   1586: }
1.1.1.2   root     1587: 
1.1       root     1588: /*
                   1589: ===============
                   1590: CL_RailTrail
1.1.1.2   root     1591: 
1.1       root     1592: ===============
                   1593: */
                   1594: void CL_RailTrail (vec3_t start, vec3_t end)
                   1595: {
                   1596:        vec3_t          move;
                   1597:        vec3_t          vec;
                   1598:        float           len;
                   1599:        int                     j;
                   1600:        cparticle_t     *p;
                   1601:        float           dec;
                   1602:        vec3_t          right, up;
                   1603:        int                     i;
                   1604:        float           d, c, s;
                   1605:        vec3_t          dir;
1.1.1.2   root     1606:        byte            clr = 0x74;
                   1607: 
1.1       root     1608:        VectorCopy (start, move);
                   1609:        VectorSubtract (end, start, vec);
                   1610:        len = VectorNormalize (vec);
1.1.1.2   root     1611: 
1.1       root     1612:        MakeNormalVectors (vec, right, up);
1.1.1.2   root     1613: 
1.1       root     1614:        for (i=0 ; i<len ; i++)
                   1615:        {
                   1616:                if (!free_particles)
                   1617:                        return;
1.1.1.2   root     1618: 
1.1       root     1619:                p = free_particles;
                   1620:                free_particles = p->next;
                   1621:                p->next = active_particles;
                   1622:                active_particles = p;
                   1623:                
                   1624:                p->time = cl.time;
                   1625:                VectorClear (p->accel);
1.1.1.2   root     1626: 
1.1       root     1627:                d = i * 0.1;
                   1628:                c = cos(d);
                   1629:                s = sin(d);
1.1.1.2   root     1630: 
1.1       root     1631:                VectorScale (right, c, dir);
                   1632:                VectorMA (dir, s, up, dir);
1.1.1.2   root     1633: 
1.1       root     1634:                p->alpha = 1.0;
                   1635:                p->alphavel = -1.0 / (1+frand()*0.2);
1.1.1.2   root     1636:                p->color = clr + (rand()&7);
1.1       root     1637:                for (j=0 ; j<3 ; j++)
                   1638:                {
                   1639:                        p->org[j] = move[j] + dir[j]*3;
                   1640:                        p->vel[j] = dir[j]*6;
                   1641:                }
1.1.1.2   root     1642: 
1.1       root     1643:                VectorAdd (move, vec, move);
                   1644:        }
1.1.1.2   root     1645: 
1.1       root     1646:        dec = 0.75;
                   1647:        VectorScale (vec, dec, vec);
                   1648:        VectorCopy (start, move);
1.1.1.2   root     1649: 
1.1       root     1650:        while (len > 0)
                   1651:        {
                   1652:                len -= dec;
1.1.1.2   root     1653: 
1.1       root     1654:                if (!free_particles)
                   1655:                        return;
                   1656:                p = free_particles;
                   1657:                free_particles = p->next;
                   1658:                p->next = active_particles;
                   1659:                active_particles = p;
1.1.1.2   root     1660: 
1.1       root     1661:                p->time = cl.time;
                   1662:                VectorClear (p->accel);
1.1.1.2   root     1663: 
1.1       root     1664:                p->alpha = 1.0;
                   1665:                p->alphavel = -1.0 / (0.6+frand()*0.2);
                   1666:                p->color = 0x0 + rand()&15;
1.1.1.2   root     1667: 
1.1       root     1668:                for (j=0 ; j<3 ; j++)
                   1669:                {
                   1670:                        p->org[j] = move[j] + crand()*3;
                   1671:                        p->vel[j] = crand()*3;
                   1672:                        p->accel[j] = 0;
                   1673:                }
                   1674: 
                   1675:                VectorAdd (move, vec, move);
                   1676:        }
                   1677: }
                   1678: 
1.1.1.2   root     1679: // RAFAEL
1.1       root     1680: /*
                   1681: ===============
1.1.1.2   root     1682: CL_IonripperTrail
1.1       root     1683: ===============
                   1684: */
1.1.1.2   root     1685: void CL_IonripperTrail (vec3_t start, vec3_t ent)
1.1       root     1686: {
                   1687:        vec3_t  move;
                   1688:        vec3_t  vec;
                   1689:        float   len;
                   1690:        int             j;
                   1691:        cparticle_t *p;
                   1692:        int             dec;
                   1693:        int     left = 0;
                   1694: 
                   1695:        VectorCopy (start, move);
1.1.1.2   root     1696:        VectorSubtract (ent, start, vec);
1.1       root     1697:        len = VectorNormalize (vec);
                   1698: 
                   1699:        dec = 5;
                   1700:        VectorScale (vec, 5, vec);
                   1701: 
                   1702:        while (len > 0)
                   1703:        {
                   1704:                len -= dec;
                   1705: 
                   1706:                if (!free_particles)
                   1707:                        return;
                   1708:                p = free_particles;
                   1709:                free_particles = p->next;
                   1710:                p->next = active_particles;
                   1711:                active_particles = p;
                   1712:                VectorClear (p->accel);
                   1713: 
                   1714:                p->time = cl.time;
                   1715:                p->alpha = 0.5;
1.1.1.2   root     1716:                p->alphavel = -1.0 / (0.3 + frand() * 0.2);
1.1       root     1717:                p->color = 0xe4 + (rand()&3);
1.1.1.2   root     1718: 
1.1       root     1719:                for (j=0; j<3; j++)
                   1720:                {
                   1721:                        p->org[j] = move[j];
                   1722:                        p->accel[j] = 0;
                   1723:                }
                   1724:                if (left)
                   1725:                {
                   1726:                        left = 0;
                   1727:                        p->vel[0] = 10;
                   1728:                }
                   1729:                else 
                   1730:                {
                   1731:                        left = 1;
                   1732:                        p->vel[0] = -10;
                   1733:                }
                   1734: 
1.1.1.2   root     1735:                p->vel[1] = 0;
                   1736:                p->vel[2] = 0;
1.1       root     1737: 
                   1738:                VectorAdd (move, vec, move);
                   1739:        }
                   1740: }
                   1741: 
1.1.1.2   root     1742: 
1.1       root     1743: /*
                   1744: ===============
                   1745: CL_BubbleTrail
1.1.1.2   root     1746: 
1.1       root     1747: ===============
                   1748: */
                   1749: void CL_BubbleTrail (vec3_t start, vec3_t end)
                   1750: {
                   1751:        vec3_t          move;
                   1752:        vec3_t          vec;
                   1753:        float           len;
                   1754:        int                     i, j;
                   1755:        cparticle_t     *p;
                   1756:        float           dec;
1.1.1.2   root     1757: 
1.1       root     1758:        VectorCopy (start, move);
                   1759:        VectorSubtract (end, start, vec);
                   1760:        len = VectorNormalize (vec);
1.1.1.2   root     1761: 
1.1       root     1762:        dec = 32;
                   1763:        VectorScale (vec, dec, vec);
1.1.1.2   root     1764: 
1.1       root     1765:        for (i=0 ; i<len ; i+=dec)
                   1766:        {
                   1767:                if (!free_particles)
                   1768:                        return;
1.1.1.2   root     1769: 
1.1       root     1770:                p = free_particles;
                   1771:                free_particles = p->next;
                   1772:                p->next = active_particles;
                   1773:                active_particles = p;
1.1.1.2   root     1774: 
1.1       root     1775:                VectorClear (p->accel);
                   1776:                p->time = cl.time;
1.1.1.2   root     1777: 
1.1       root     1778:                p->alpha = 1.0;
                   1779:                p->alphavel = -1.0 / (1+frand()*0.2);
                   1780:                p->color = 4 + (rand()&7);
                   1781:                for (j=0 ; j<3 ; j++)
                   1782:                {
                   1783:                        p->org[j] = move[j] + crand()*2;
                   1784:                        p->vel[j] = crand()*5;
                   1785:                }
                   1786:                p->vel[2] += 6;
1.1.1.2   root     1787: 
1.1       root     1788:                VectorAdd (move, vec, move);
                   1789:        }
                   1790: }
1.1.1.2   root     1791: 
                   1792: 
1.1       root     1793: /*
                   1794: ===============
                   1795: CL_FlyParticles
                   1796: ===============
                   1797: */
1.1.1.2   root     1798: 
1.1       root     1799: #define        BEAMLENGTH                      16
                   1800: void CL_FlyParticles (vec3_t origin, int count)
                   1801: {
                   1802:        int                     i;
                   1803:        cparticle_t     *p;
                   1804:        float           angle;
                   1805:        float           sr, sp, sy, cr, cp, cy;
                   1806:        vec3_t          forward;
                   1807:        float           dist = 64;
                   1808:        float           ltime;
                   1809: 
1.1.1.2   root     1810: 
1.1       root     1811:        if (count > NUMVERTEXNORMALS)
                   1812:                count = NUMVERTEXNORMALS;
1.1.1.2   root     1813: 
1.1       root     1814:        if (!avelocities[0][0])
                   1815:        {
                   1816:                for (i=0 ; i<NUMVERTEXNORMALS*3 ; i++)
                   1817:                        avelocities[0][i] = (rand()&255) * 0.01;
                   1818:        }
1.1.1.2   root     1819: 
                   1820: 
1.1       root     1821:        ltime = (float)cl.time / 1000.0;
                   1822:        for (i=0 ; i<count ; i+=2)
                   1823:        {
                   1824:                angle = ltime * avelocities[i][0];
                   1825:                sy = sin(angle);
                   1826:                cy = cos(angle);
                   1827:                angle = ltime * avelocities[i][1];
                   1828:                sp = sin(angle);
                   1829:                cp = cos(angle);
                   1830:                angle = ltime * avelocities[i][2];
                   1831:                sr = sin(angle);
                   1832:                cr = cos(angle);
                   1833:        
                   1834:                forward[0] = cp*cy;
                   1835:                forward[1] = cp*sy;
                   1836:                forward[2] = -sp;
1.1.1.2   root     1837: 
1.1       root     1838:                if (!free_particles)
                   1839:                        return;
                   1840:                p = free_particles;
                   1841:                free_particles = p->next;
                   1842:                p->next = active_particles;
                   1843:                active_particles = p;
1.1.1.2   root     1844: 
1.1       root     1845:                p->time = cl.time;
1.1.1.2   root     1846: 
1.1       root     1847:                dist = sin(ltime + i)*64;
                   1848:                p->org[0] = origin[0] + bytedirs[i][0]*dist + forward[0]*BEAMLENGTH;
                   1849:                p->org[1] = origin[1] + bytedirs[i][1]*dist + forward[1]*BEAMLENGTH;
                   1850:                p->org[2] = origin[2] + bytedirs[i][2]*dist + forward[2]*BEAMLENGTH;
1.1.1.2   root     1851: 
1.1       root     1852:                VectorClear (p->vel);
                   1853:                VectorClear (p->accel);
1.1.1.2   root     1854: 
1.1       root     1855:                p->color = 0;
                   1856:                p->colorvel = 0;
1.1.1.2   root     1857: 
1.1       root     1858:                p->alpha = 1;
                   1859:                p->alphavel = -100;
                   1860:        }
                   1861: }
1.1.1.2   root     1862: 
1.1       root     1863: void CL_FlyEffect (centity_t *ent, vec3_t origin)
                   1864: {
                   1865:        int             n;
                   1866:        int             count;
                   1867:        int             starttime;
                   1868: 
                   1869:        if (ent->fly_stoptime < cl.time)
                   1870:        {
                   1871:                starttime = cl.time;
                   1872:                ent->fly_stoptime = cl.time + 60000;
                   1873:        }
                   1874:        else
                   1875:        {
                   1876:                starttime = ent->fly_stoptime - 60000;
                   1877:        }
                   1878: 
                   1879:        n = cl.time - starttime;
                   1880:        if (n < 20000)
                   1881:                count = n * 162 / 20000.0;
                   1882:        else
                   1883:        {
                   1884:                n = ent->fly_stoptime - cl.time;
                   1885:                if (n < 20000)
                   1886:                        count = n * 162 / 20000.0;
                   1887:                else
                   1888:                        count = 162;
                   1889:        }
                   1890: 
                   1891:        CL_FlyParticles (origin, count);
                   1892: }
1.1.1.2   root     1893: 
                   1894: 
1.1       root     1895: /*
                   1896: ===============
                   1897: CL_BfgParticles
                   1898: ===============
                   1899: */
1.1.1.2   root     1900: 
1.1       root     1901: #define        BEAMLENGTH                      16
                   1902: void CL_BfgParticles (entity_t *ent)
                   1903: {
                   1904:        int                     i;
                   1905:        cparticle_t     *p;
                   1906:        float           angle;
                   1907:        float           sr, sp, sy, cr, cp, cy;
                   1908:        vec3_t          forward;
                   1909:        float           dist = 64;
                   1910:        vec3_t          v;
                   1911:        float           ltime;
                   1912:        
                   1913:        if (!avelocities[0][0])
                   1914:        {
                   1915:                for (i=0 ; i<NUMVERTEXNORMALS*3 ; i++)
                   1916:                        avelocities[0][i] = (rand()&255) * 0.01;
                   1917:        }
1.1.1.2   root     1918: 
                   1919: 
1.1       root     1920:        ltime = (float)cl.time / 1000.0;
                   1921:        for (i=0 ; i<NUMVERTEXNORMALS ; i++)
                   1922:        {
                   1923:                angle = ltime * avelocities[i][0];
                   1924:                sy = sin(angle);
                   1925:                cy = cos(angle);
                   1926:                angle = ltime * avelocities[i][1];
                   1927:                sp = sin(angle);
                   1928:                cp = cos(angle);
                   1929:                angle = ltime * avelocities[i][2];
                   1930:                sr = sin(angle);
                   1931:                cr = cos(angle);
                   1932:        
                   1933:                forward[0] = cp*cy;
                   1934:                forward[1] = cp*sy;
                   1935:                forward[2] = -sp;
1.1.1.2   root     1936: 
1.1       root     1937:                if (!free_particles)
                   1938:                        return;
                   1939:                p = free_particles;
                   1940:                free_particles = p->next;
                   1941:                p->next = active_particles;
                   1942:                active_particles = p;
1.1.1.2   root     1943: 
1.1       root     1944:                p->time = cl.time;
1.1.1.2   root     1945: 
1.1       root     1946:                dist = sin(ltime + i)*64;
                   1947:                p->org[0] = ent->origin[0] + bytedirs[i][0]*dist + forward[0]*BEAMLENGTH;
                   1948:                p->org[1] = ent->origin[1] + bytedirs[i][1]*dist + forward[1]*BEAMLENGTH;
                   1949:                p->org[2] = ent->origin[2] + bytedirs[i][2]*dist + forward[2]*BEAMLENGTH;
1.1.1.2   root     1950: 
1.1       root     1951:                VectorClear (p->vel);
                   1952:                VectorClear (p->accel);
1.1.1.2   root     1953: 
1.1       root     1954:                VectorSubtract (p->org, ent->origin, v);
                   1955:                dist = VectorLength(v) / 90.0;
                   1956:                p->color = floor (0xd0 + dist * 7);
                   1957:                p->colorvel = 0;
1.1.1.2   root     1958: 
1.1       root     1959:                p->alpha = 1.0 - dist;
                   1960:                p->alphavel = -100;
                   1961:        }
                   1962: }
1.1.1.2   root     1963: 
                   1964: 
                   1965: /*
                   1966: ===============
                   1967: CL_TrapParticles
                   1968: ===============
                   1969: */
                   1970: // RAFAEL
                   1971: void CL_TrapParticles (entity_t *ent)
                   1972: {
                   1973:        vec3_t          move;
                   1974:        vec3_t          vec;
                   1975:        vec3_t          start, end;
                   1976:        float           len;
                   1977:        int                     j;
                   1978:        cparticle_t     *p;
                   1979:        int                     dec;
                   1980: 
                   1981:        ent->origin[2]-=14;
                   1982:        VectorCopy (ent->origin, start);
                   1983:        VectorCopy (ent->origin, end);
                   1984:        end[2]+=64;
                   1985: 
                   1986:        VectorCopy (start, move);
                   1987:        VectorSubtract (end, start, vec);
                   1988:        len = VectorNormalize (vec);
                   1989: 
                   1990:        dec = 5;
                   1991:        VectorScale (vec, 5, vec);
                   1992: 
                   1993:        // FIXME: this is a really silly way to have a loop
                   1994:        while (len > 0)
                   1995:        {
                   1996:                len -= dec;
                   1997: 
                   1998:                if (!free_particles)
                   1999:                        return;
                   2000:                p = free_particles;
                   2001:                free_particles = p->next;
                   2002:                p->next = active_particles;
                   2003:                active_particles = p;
                   2004:                VectorClear (p->accel);
                   2005:                
                   2006:                p->time = cl.time;
                   2007: 
                   2008:                p->alpha = 1.0;
                   2009:                p->alphavel = -1.0 / (0.3+frand()*0.2);
                   2010:                p->color = 0xe0;
                   2011:                for (j=0 ; j<3 ; j++)
                   2012:                {
                   2013:                        p->org[j] = move[j] + crand();
                   2014:                        p->vel[j] = crand()*15;
                   2015:                        p->accel[j] = 0;
                   2016:                }
                   2017:                p->accel[2] = PARTICLE_GRAVITY;
                   2018: 
                   2019:                VectorAdd (move, vec, move);
                   2020:        }
                   2021: 
                   2022:        {
                   2023: 
                   2024:        
                   2025:        int                     i, j, k;
                   2026:        cparticle_t     *p;
                   2027:        float           vel;
                   2028:        vec3_t          dir;
                   2029:        vec3_t          org;
                   2030: 
                   2031:        
                   2032:        ent->origin[2]+=14;
                   2033:        VectorCopy (ent->origin, org);
                   2034: 
                   2035: 
                   2036:        for (i=-2 ; i<=2 ; i+=4)
                   2037:                for (j=-2 ; j<=2 ; j+=4)
                   2038:                        for (k=-2 ; k<=4 ; k+=4)
                   2039:                        {
                   2040:                                if (!free_particles)
                   2041:                                        return;
                   2042:                                p = free_particles;
                   2043:                                free_particles = p->next;
                   2044:                                p->next = active_particles;
                   2045:                                active_particles = p;
                   2046: 
                   2047:                                p->time = cl.time;
                   2048:                                p->color = 0xe0 + (rand()&3);
                   2049: 
                   2050:                                p->alpha = 1.0;
                   2051:                                p->alphavel = -1.0 / (0.3 + (rand()&7) * 0.02);
                   2052:                                
                   2053:                                p->org[0] = org[0] + i + ((rand()&23) * crand());
                   2054:                                p->org[1] = org[1] + j + ((rand()&23) * crand());
                   2055:                                p->org[2] = org[2] + k + ((rand()&23) * crand());
                   2056:        
                   2057:                                dir[0] = j * 8;
                   2058:                                dir[1] = i * 8;
                   2059:                                dir[2] = k * 8;
                   2060:        
                   2061:                                VectorNormalize (dir);                                          
                   2062:                                vel = 50 + rand()&63;
                   2063:                                VectorScale (dir, vel, p->vel);
                   2064: 
                   2065:                                p->accel[0] = p->accel[1] = 0;
                   2066:                                p->accel[2] = -PARTICLE_GRAVITY;
                   2067:                        }
                   2068:        }
                   2069: }
                   2070: 
                   2071: 
1.1       root     2072: /*
                   2073: ===============
                   2074: CL_BFGExplosionParticles
                   2075: ===============
                   2076: */
                   2077: //FIXME combined with CL_ExplosionParticles
                   2078: void CL_BFGExplosionParticles (vec3_t org)
                   2079: {
                   2080:        int                     i, j;
                   2081:        cparticle_t     *p;
                   2082: 
                   2083:        for (i=0 ; i<256 ; i++)
                   2084:        {
                   2085:                if (!free_particles)
                   2086:                        return;
                   2087:                p = free_particles;
                   2088:                free_particles = p->next;
                   2089:                p->next = active_particles;
                   2090:                active_particles = p;
                   2091: 
                   2092:                p->time = cl.time;
                   2093:                p->color = 0xd0 + (rand()&7);
                   2094: 
                   2095:                for (j=0 ; j<3 ; j++)
                   2096:                {
                   2097:                        p->org[j] = org[j] + ((rand()%32)-16);
                   2098:                        p->vel[j] = (rand()%384)-192;
                   2099:                }
                   2100: 
                   2101:                p->accel[0] = p->accel[1] = 0;
                   2102:                p->accel[2] = -PARTICLE_GRAVITY;
                   2103:                p->alpha = 1.0;
                   2104: 
                   2105:                p->alphavel = -0.8 / (0.5 + frand()*0.3);
                   2106:        }
                   2107: }
                   2108: 
1.1.1.2   root     2109: 
1.1       root     2110: /*
                   2111: ===============
                   2112: CL_TeleportParticles
                   2113: 
                   2114: ===============
                   2115: */
                   2116: void CL_TeleportParticles (vec3_t org)
                   2117: {
                   2118:        int                     i, j, k;
                   2119:        cparticle_t     *p;
                   2120:        float           vel;
                   2121:        vec3_t          dir;
                   2122: 
                   2123:        for (i=-16 ; i<=16 ; i+=4)
                   2124:                for (j=-16 ; j<=16 ; j+=4)
                   2125:                        for (k=-16 ; k<=32 ; k+=4)
                   2126:                        {
                   2127:                                if (!free_particles)
                   2128:                                        return;
                   2129:                                p = free_particles;
                   2130:                                free_particles = p->next;
                   2131:                                p->next = active_particles;
                   2132:                                active_particles = p;
                   2133: 
                   2134:                                p->time = cl.time;
                   2135:                                p->color = 7 + (rand()&7);
                   2136: 
                   2137:                                p->alpha = 1.0;
                   2138:                                p->alphavel = -1.0 / (0.3 + (rand()&7) * 0.02);
                   2139:                                
                   2140:                                p->org[0] = org[0] + i + (rand()&3);
                   2141:                                p->org[1] = org[1] + j + (rand()&3);
                   2142:                                p->org[2] = org[2] + k + (rand()&3);
                   2143:        
                   2144:                                dir[0] = j*8;
                   2145:                                dir[1] = i*8;
                   2146:                                dir[2] = k*8;
                   2147:        
                   2148:                                VectorNormalize (dir);                                          
                   2149:                                vel = 50 + (rand()&63);
                   2150:                                VectorScale (dir, vel, p->vel);
                   2151: 
                   2152:                                p->accel[0] = p->accel[1] = 0;
                   2153:                                p->accel[2] = -PARTICLE_GRAVITY;
                   2154:                        }
                   2155: }
                   2156: 
1.1.1.2   root     2157: 
1.1       root     2158: /*
                   2159: ===============
                   2160: CL_AddParticles
                   2161: ===============
                   2162: */
                   2163: void CL_AddParticles (void)
                   2164: {
                   2165:        cparticle_t             *p, *next;
                   2166:        float                   alpha;
                   2167:        float                   time, time2;
                   2168:        vec3_t                  org;
                   2169:        int                             color;
                   2170:        cparticle_t             *active, *tail;
1.1.1.2   root     2171: 
1.1       root     2172:        active = NULL;
                   2173:        tail = NULL;
1.1.1.2   root     2174: 
1.1       root     2175:        for (p=active_particles ; p ; p=next)
                   2176:        {
                   2177:                next = p->next;
1.1.1.2   root     2178: 
1.1.1.3 ! root     2179:                // PMM - added INSTANT_PARTICLE handling for heat beam
        !          2180:                if (p->alphavel != INSTANT_PARTICLE)
        !          2181:                {
        !          2182:                        time = (cl.time - p->time)*0.001;
        !          2183:                        alpha = p->alpha + time*p->alphavel;
        !          2184:                        if (alpha <= 0)
        !          2185:                        {       // faded out
        !          2186:                                p->next = free_particles;
        !          2187:                                free_particles = p;
        !          2188:                                continue;
        !          2189:                        }
        !          2190:                }
        !          2191:                else
        !          2192:                {
        !          2193:                        alpha = p->alpha;
1.1       root     2194:                }
1.1.1.2   root     2195: 
1.1       root     2196:                p->next = NULL;
                   2197:                if (!tail)
                   2198:                        active = tail = p;
                   2199:                else
                   2200:                {
                   2201:                        tail->next = p;
                   2202:                        tail = p;
                   2203:                }
1.1.1.2   root     2204: 
1.1       root     2205:                if (alpha > 1.0)
                   2206:                        alpha = 1;
                   2207:                color = p->color;
1.1.1.2   root     2208: 
1.1       root     2209:                time2 = time*time;
1.1.1.2   root     2210: 
1.1       root     2211:                org[0] = p->org[0] + p->vel[0]*time + p->accel[0]*time2;
                   2212:                org[1] = p->org[1] + p->vel[1]*time + p->accel[1]*time2;
                   2213:                org[2] = p->org[2] + p->vel[2]*time + p->accel[2]*time2;
1.1.1.2   root     2214: 
1.1       root     2215:                V_AddParticle (org, color, alpha);
1.1.1.3 ! root     2216:                // PMM
        !          2217:                if (p->alphavel == INSTANT_PARTICLE)
        !          2218:                {
        !          2219:                        p->alphavel = 0.0;
        !          2220:                        p->alpha = 0.0;
        !          2221:                }
1.1       root     2222:        }
1.1.1.2   root     2223: 
1.1       root     2224:        active_particles = active;
                   2225: }
                   2226: 
                   2227: 
                   2228: /*
                   2229: ==============
                   2230: CL_EntityEvent
                   2231: 
                   2232: An entity has just been parsed that has an event value
                   2233: 
                   2234: the female events are there for backwards compatability
                   2235: ==============
                   2236: */
                   2237: extern struct sfx_s    *cl_sfx_footsteps[4];
                   2238: 
                   2239: void CL_EntityEvent (entity_state_t *ent)
                   2240: {
                   2241:        switch (ent->event)
                   2242:        {
                   2243:        case EV_ITEM_RESPAWN:
                   2244:                S_StartSound (NULL, ent->number, CHAN_WEAPON, S_RegisterSound("items/respawn1.wav"), 1, ATTN_IDLE, 0);
                   2245:                CL_ItemRespawnParticles (ent->origin);
                   2246:                break;
                   2247:        case EV_PLAYER_TELEPORT:
                   2248:                S_StartSound (NULL, ent->number, CHAN_WEAPON, S_RegisterSound("misc/tele1.wav"), 1, ATTN_IDLE, 0);
                   2249:                CL_TeleportParticles (ent->origin);
                   2250:                break;
                   2251:        case EV_FOOTSTEP:
                   2252:                if (cl_footsteps->value)
                   2253:                        S_StartSound (NULL, ent->number, CHAN_BODY, cl_sfx_footsteps[rand()&3], 1, ATTN_NORM, 0);
                   2254:                break;
                   2255:        case EV_FALLSHORT:
                   2256:                S_StartSound (NULL, ent->number, CHAN_AUTO, S_RegisterSound ("player/land1.wav"), 1, ATTN_NORM, 0);
                   2257:                break;
                   2258:        case EV_FALL:
                   2259:                S_StartSound (NULL, ent->number, CHAN_AUTO, S_RegisterSound ("*fall2.wav"), 1, ATTN_NORM, 0);
                   2260:                break;
                   2261:        case EV_FALLFAR:
                   2262:                S_StartSound (NULL, ent->number, CHAN_AUTO, S_RegisterSound ("*fall1.wav"), 1, ATTN_NORM, 0);
                   2263:                break;
                   2264:        }
                   2265: }
                   2266: 
                   2267: 
                   2268: /*
                   2269: ==============
                   2270: CL_ClearEffects
                   2271: 
                   2272: ==============
                   2273: */
                   2274: void CL_ClearEffects (void)
                   2275: {
                   2276:        CL_ClearParticles ();
                   2277:        CL_ClearDlights ();
                   2278:        CL_ClearLightStyles ();
                   2279: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.