Annotation of quake1/cl_tent.c, revision 1.1.1.1

1.1       root        1: // cl_tent.c -- client side temporary entities
                      2: 
                      3: #include "quakedef.h"
                      4: 
                      5: int                    num_temp_entities;
                      6: entity_t       cl_temp_entities[MAX_TEMP_ENTITIES];
                      7: beam_t         cl_beams[MAX_BEAMS];
                      8: 
                      9: sfx_t                  *cl_sfx_wizhit;
                     10: sfx_t                  *cl_sfx_knighthit;
                     11: sfx_t                  *cl_sfx_tink1;
                     12: sfx_t                  *cl_sfx_ric1;
                     13: sfx_t                  *cl_sfx_ric2;
                     14: sfx_t                  *cl_sfx_ric3;
                     15: sfx_t                  *cl_sfx_r_exp3;
                     16: 
                     17: /*
                     18: =================
                     19: CL_ParseTEnt
                     20: =================
                     21: */
                     22: void CL_InitTEnts (void)
                     23: {
                     24:        cl_sfx_wizhit = S_PrecacheSound ("wizard/hit.wav");
                     25:        cl_sfx_knighthit = S_PrecacheSound ("hknight/hit.wav");
                     26:        cl_sfx_tink1 = S_PrecacheSound ("weapons/tink1.wav");
                     27:        cl_sfx_ric1 = S_PrecacheSound ("weapons/ric1.wav");
                     28:        cl_sfx_ric2 = S_PrecacheSound ("weapons/ric2.wav");
                     29:        cl_sfx_ric3 = S_PrecacheSound ("weapons/ric3.wav");
                     30:        cl_sfx_r_exp3 = S_PrecacheSound ("weapons/r_exp3.wav");
                     31: }
                     32: 
                     33: /*
                     34: =================
                     35: CL_ParseBeam
                     36: =================
                     37: */
                     38: void CL_ParseBeam (model_t *m)
                     39: {
                     40:        int             ent;
                     41:        vec3_t  start, end;
                     42:        beam_t  *b;
                     43:        int             i;
                     44:        
                     45:        ent = MSG_ReadShort ();
                     46:        
                     47:        start[0] = MSG_ReadCoord ();
                     48:        start[1] = MSG_ReadCoord ();
                     49:        start[2] = MSG_ReadCoord ();
                     50:        
                     51:        end[0] = MSG_ReadCoord ();
                     52:        end[1] = MSG_ReadCoord ();
                     53:        end[2] = MSG_ReadCoord ();
                     54: 
                     55: // override any beam with the same entity
                     56:        for (i=0, b=cl_beams ; i< MAX_BEAMS ; i++, b++)
                     57:                if (b->entity == ent)
                     58:                {
                     59:                        b->entity = ent;
                     60:                        b->model = m;
                     61:                        b->endtime = cl.time + 0.2;
                     62:                        VectorCopy (start, b->start);
                     63:                        VectorCopy (end, b->end);
                     64:                        return;
                     65:                }
                     66: 
                     67: // find a free beam
                     68:        for (i=0, b=cl_beams ; i< MAX_BEAMS ; i++, b++)
                     69:        {
                     70:                if (!b->model || b->endtime < cl.time)
                     71:                {
                     72:                        b->entity = ent;
                     73:                        b->model = m;
                     74:                        b->endtime = cl.time + 0.2;
                     75:                        VectorCopy (start, b->start);
                     76:                        VectorCopy (end, b->end);
                     77:                        return;
                     78:                }
                     79:        }
                     80:        Con_Printf ("beam list overflow!\n");   
                     81: }
                     82: 
                     83: /*
                     84: =================
                     85: CL_ParseTEnt
                     86: =================
                     87: */
                     88: void CL_ParseTEnt (void)
                     89: {
                     90:        int             type;
                     91:        vec3_t  pos;
                     92:        dlight_t        *dl;
                     93:        int             rnd;
                     94: 
                     95:        type = MSG_ReadByte ();
                     96:        switch (type)
                     97:        {
                     98:        case TE_WIZSPIKE:                       // spike hitting wall
                     99:                pos[0] = MSG_ReadCoord ();
                    100:                pos[1] = MSG_ReadCoord ();
                    101:                pos[2] = MSG_ReadCoord ();
                    102:                R_RunParticleEffect (pos, vec3_origin, 20, 30);
                    103:                S_StartSound (-1, 0, cl_sfx_wizhit, pos, 1, 1);
                    104:                break;
                    105:                
                    106:        case TE_KNIGHTSPIKE:                    // spike hitting wall
                    107:                pos[0] = MSG_ReadCoord ();
                    108:                pos[1] = MSG_ReadCoord ();
                    109:                pos[2] = MSG_ReadCoord ();
                    110:                R_RunParticleEffect (pos, vec3_origin, 226, 20);
                    111:                S_StartSound (-1, 0, cl_sfx_knighthit, pos, 1, 1);
                    112:                break;
                    113:                
                    114:        case TE_SPIKE:                  // spike hitting wall
                    115:                pos[0] = MSG_ReadCoord ();
                    116:                pos[1] = MSG_ReadCoord ();
                    117:                pos[2] = MSG_ReadCoord ();
                    118:                R_RunParticleEffect (pos, vec3_origin, 0, 10);
                    119: 
                    120:                if ( rand() % 5 )
                    121:                        S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, 1);
                    122:                else
                    123:                {
                    124:                        rnd = rand() & 3;
                    125:                        if (rnd == 1)
                    126:                                S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, 1);
                    127:                        else if (rnd == 2)
                    128:                                S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, 1);
                    129:                        else
                    130:                                S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, 1);
                    131:                }
                    132:                break;
                    133:        case TE_SUPERSPIKE:                     // super spike hitting wall
                    134:                pos[0] = MSG_ReadCoord ();
                    135:                pos[1] = MSG_ReadCoord ();
                    136:                pos[2] = MSG_ReadCoord ();
                    137:                R_RunParticleEffect (pos, vec3_origin, 0, 20);
                    138: 
                    139:                if ( rand() % 5 )
                    140:                        S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, 1);
                    141:                else
                    142:                {
                    143:                        rnd = rand() & 3;
                    144:                        if (rnd == 1)
                    145:                                S_StartSound (-1, 0, cl_sfx_ric1, pos, 1, 1);
                    146:                        else if (rnd == 2)
                    147:                                S_StartSound (-1, 0, cl_sfx_ric2, pos, 1, 1);
                    148:                        else
                    149:                                S_StartSound (-1, 0, cl_sfx_ric3, pos, 1, 1);
                    150:                }
                    151:                break;
                    152:                
                    153:        case TE_GUNSHOT:                        // bullet hitting wall
                    154:                pos[0] = MSG_ReadCoord ();
                    155:                pos[1] = MSG_ReadCoord ();
                    156:                pos[2] = MSG_ReadCoord ();
                    157:                R_RunParticleEffect (pos, vec3_origin, 0, 20);
                    158:                break;
                    159:                
                    160:        case TE_EXPLOSION:                      // rocket explosion
                    161:                pos[0] = MSG_ReadCoord ();
                    162:                pos[1] = MSG_ReadCoord ();
                    163:                pos[2] = MSG_ReadCoord ();
                    164:                R_ParticleExplosion (pos);
                    165:                dl = CL_AllocDlight ();
                    166:                VectorCopy (pos, dl->origin);
                    167:                dl->radius = 350;
                    168:                dl->die = cl.time + 0.5;
                    169:                dl->decay = 300;
                    170:                S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1);
                    171:                break;
                    172:                
                    173:        case TE_TAREXPLOSION:                   // tarbaby explosion
                    174:                pos[0] = MSG_ReadCoord ();
                    175:                pos[1] = MSG_ReadCoord ();
                    176:                pos[2] = MSG_ReadCoord ();
                    177:                R_BlobExplosion (pos);
                    178: 
                    179:                S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1);
                    180:                break;
                    181: 
                    182:        case TE_LIGHTNING1:                             // lightning bolts
                    183:                CL_ParseBeam (Mod_ForName("progs/bolt.mdl", true));
                    184:                break;
                    185:        
                    186:        case TE_LIGHTNING2:                             // lightning bolts
                    187:                CL_ParseBeam (Mod_ForName("progs/bolt2.mdl", true));
                    188:                break;
                    189:        
                    190:        case TE_LIGHTNING3:                             // lightning bolts
                    191:                CL_ParseBeam (Mod_ForName("progs/bolt3.mdl", true));
                    192:                break;
                    193:        
                    194:        case TE_LAVASPLASH:     
                    195:                pos[0] = MSG_ReadCoord ();
                    196:                pos[1] = MSG_ReadCoord ();
                    197:                pos[2] = MSG_ReadCoord ();
                    198:                R_LavaSplash (pos);
                    199:                break;
                    200:        
                    201:        case TE_TELEPORT:
                    202:                pos[0] = MSG_ReadCoord ();
                    203:                pos[1] = MSG_ReadCoord ();
                    204:                pos[2] = MSG_ReadCoord ();
                    205:                R_TeleportSplash (pos);
                    206:                break;
                    207:                
                    208:        default:
                    209:                Sys_Error ("CL_ParseTEnt: bad type");
                    210:        }
                    211: }
                    212: 
                    213: 
                    214: /*
                    215: =================
                    216: CL_NewTempEntity
                    217: =================
                    218: */
                    219: entity_t *CL_NewTempEntity (void)
                    220: {
                    221:        entity_t        *ent;
                    222: 
                    223:        if (cl_numvisedicts == MAX_VISEDICTS)
                    224:                return NULL;
                    225:        if (num_temp_entities == MAX_TEMP_ENTITIES)
                    226:                return NULL;
                    227:        ent = &cl_temp_entities[num_temp_entities];
                    228:        memset (ent, 0, sizeof(*ent));
                    229:        num_temp_entities++;
                    230:        cl_visedicts[cl_numvisedicts] = ent;
                    231:        cl_numvisedicts++;
                    232: 
                    233:        ent->colormap = vid.colormap;
                    234:        return ent;
                    235: }
                    236: 
                    237: 
                    238: /*
                    239: =================
                    240: CL_UpdateTEnts
                    241: =================
                    242: */
                    243: void CL_UpdateTEnts (void)
                    244: {
                    245:        int                     i;
                    246:        beam_t          *b;
                    247:        vec3_t          dist, org;
                    248:        float           d;
                    249:        entity_t        *ent;
                    250:        float           yaw, pitch;
                    251:        float           forward;
                    252: 
                    253:        num_temp_entities = 0;
                    254: 
                    255: // update lightning
                    256:        for (i=0, b=cl_beams ; i< MAX_BEAMS ; i++, b++)
                    257:        {
                    258:                if (!b->model || b->endtime < cl.time)
                    259:                        continue;
                    260: 
                    261:        // if coming from the player, update the start position
                    262:                if (b->entity == cl.viewentity)
                    263:                {
                    264:                        VectorCopy (cl_entities[cl.viewentity].origin, b->start);
                    265:                }
                    266: 
                    267:        // calculate pitch and yaw
                    268:                VectorSubtract (b->end, b->start, dist);
                    269: 
                    270:                if (dist[1] == 0 && dist[0] == 0)
                    271:                {
                    272:                        yaw = 0;
                    273:                        if (dist[2] > 0)
                    274:                                pitch = 90;
                    275:                        else
                    276:                                pitch = 270;
                    277:                }
                    278:                else
                    279:                {
                    280:                        yaw = (int) (atan2(dist[1], dist[0]) * 180 / M_PI);
                    281:                        if (yaw < 0)
                    282:                                yaw += 360;
                    283:        
                    284:                        forward = sqrt (dist[0]*dist[0] + dist[1]*dist[1]);
                    285:                        pitch = (int) (atan2(dist[2], forward) * 180 / M_PI);
                    286:                        if (pitch < 0)
                    287:                                pitch += 360;
                    288:                }
                    289: 
                    290:        // add new entities for the lightning
                    291:                VectorCopy (b->start, org);
                    292:                d = VectorNormalize(dist);
                    293:                while (d > 0)
                    294:                {
                    295:                        ent = CL_NewTempEntity ();
                    296:                        if (!ent)
                    297:                                return;
                    298:                        VectorCopy (org, ent->origin);
                    299:                        ent->model = b->model;
                    300:                        ent->angles[0] = pitch;
                    301:                        ent->angles[1] = yaw;
                    302:                        ent->angles[2] = rand()%360;
                    303: 
                    304:                        for (i=0 ; i<3 ; i++)
                    305:                                org[i] += dist[i]*30;
                    306:                        d -= 30;
                    307:                }
                    308:        }
                    309:        
                    310: }
                    311: 
                    312: 

unix.superglobalmegacorp.com

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