]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - clvm_cmds.c
new menu QC builtin "stringwidth(string text, float handleColors)", does not do anyth...
[xonotic/darkplaces.git] / clvm_cmds.c
index 6e35193ae39de8937a208a2a8e0b2906129999a4..68b8ecc20ed0f8aabc138a0e527478e44f92ca3e 100644 (file)
@@ -130,7 +130,7 @@ static void VM_CL_sound (void)
        const char                      *sample;
        int                                     channel;
        prvm_edict_t            *entity;
-       int                             volume;
+       float                           volume;
        float                           attenuation;
 
        VM_SAFEPARMCOUNT(5, VM_CL_sound);
@@ -138,10 +138,10 @@ static void VM_CL_sound (void)
        entity = PRVM_G_EDICT(OFS_PARM0);
        channel = (int)PRVM_G_FLOAT(OFS_PARM1);
        sample = PRVM_G_STRING(OFS_PARM2);
-       volume = (int)(PRVM_G_FLOAT(OFS_PARM3)*255.0f);
+       volume = PRVM_G_FLOAT(OFS_PARM3);
        attenuation = PRVM_G_FLOAT(OFS_PARM4);
 
-       if (volume < 0 || volume > 255)
+       if (volume < 0 || volume > 1)
        {
                VM_Warning("VM_CL_sound: volume must be in range 0-1\n");
                return;
@@ -162,6 +162,37 @@ static void VM_CL_sound (void)
        S_StartSound(32768 + PRVM_NUM_FOR_EDICT(entity), channel, S_FindName(sample), entity->fields.client->origin, volume, attenuation);
 }
 
+// #483 void(vector origin, string sample, float volume, float attenuation) pointsound
+static void VM_CL_pointsound(void)
+{
+       const char                      *sample;
+       float                           volume;
+       float                           attenuation;
+       vec3_t                          org;
+
+       VM_SAFEPARMCOUNT(4, VM_CL_pointsound);
+
+       VectorCopy( PRVM_G_VECTOR(OFS_PARM0), org);
+       sample = PRVM_G_STRING(OFS_PARM1);
+       volume = PRVM_G_FLOAT(OFS_PARM2);
+       attenuation = PRVM_G_FLOAT(OFS_PARM3);
+
+       if (volume < 0 || volume > 1)
+       {
+               VM_Warning("VM_CL_pointsound: volume must be in range 0-1\n");
+               return;
+       }
+
+       if (attenuation < 0 || attenuation > 4)
+       {
+               VM_Warning("VM_CL_pointsound: attenuation must be in range 0-4\n");
+               return;
+       }
+
+       // Send World Entity as Entity to Play Sound (for CSQC, that is 32768)
+       S_StartSound(32768, 0, S_FindName(sample), org, volume, attenuation);
+}
+
 // #14 entity() spawn
 static void VM_CL_spawn (void)
 {
@@ -234,7 +265,6 @@ static void VM_CL_tracebox (void)
        VM_SetTraceGlobals(&trace);
 }
 
-extern cvar_t cl_gravity;
 trace_t CL_Trace_Toss (prvm_edict_t *tossent, prvm_edict_t *ignore)
 {
        int i;
@@ -257,7 +287,7 @@ trace_t CL_Trace_Toss (prvm_edict_t *tossent, prvm_edict_t *ignore)
                gravity = val->_float;
        else
                gravity = 1.0;
-       gravity *= cl_gravity.value * 0.05;
+       gravity *= cl.movevars_gravity * 0.05;
 
        for (i = 0;i < 200;i++) // LordHavoc: sanity check; never trace more than 10 seconds
        {
@@ -405,7 +435,7 @@ static void VM_CL_findradius (void)
                        eorg[2] -= bound(ent->fields.client->mins[2], eorg[2], ent->fields.client->maxs[2]);
                }
                else
-                       VectorMAMAM(1, eorg, 0.5f, ent->fields.client->mins, 0.5f, ent->fields.client->maxs, eorg);
+                       VectorMAMAM(1, eorg, -0.5f, ent->fields.client->mins, -0.5f, ent->fields.client->maxs, eorg);
                if (DotProduct(eorg, eorg) < radius2)
                {
                        ent->fields.client->chain = PRVM_EDICT_TO_PROG(chain);
@@ -604,14 +634,11 @@ static void VM_CL_getlight (void)
 //[515]: SCENE MANAGER builtins
 extern qboolean CSQC_AddRenderEdict (prvm_edict_t *ed);//csprogs.c
 
-matrix4x4_t csqc_listenermatrix;
-qboolean csqc_usecsqclistener = false;//[515]: per-frame
-
 static void CSQC_R_RecalcView (void)
 {
        extern matrix4x4_t viewmodelmatrix;
-       Matrix4x4_CreateFromQuakeEntity(&r_view.matrix, csqc_origin[0], csqc_origin[1], csqc_origin[2], csqc_angles[0], csqc_angles[1], csqc_angles[2], 1);
-       Matrix4x4_CreateFromQuakeEntity(&viewmodelmatrix, csqc_origin[0], csqc_origin[1], csqc_origin[2], csqc_angles[0], csqc_angles[1], csqc_angles[2], cl_viewmodel_scale.value);
+       Matrix4x4_CreateFromQuakeEntity(&r_view.matrix, cl.csqc_origin[0], cl.csqc_origin[1], cl.csqc_origin[2], cl.csqc_angles[0], cl.csqc_angles[1], cl.csqc_angles[2], 1);
+       Matrix4x4_CreateFromQuakeEntity(&viewmodelmatrix, cl.csqc_origin[0], cl.csqc_origin[1], cl.csqc_origin[2], cl.csqc_angles[0], cl.csqc_angles[1], cl.csqc_angles[2], cl_viewmodel_scale.value);
 }
 
 void CL_RelinkLightFlashes(void);
@@ -622,6 +649,26 @@ static void VM_CL_R_ClearScene (void)
        // clear renderable entity and light lists
        r_refdef.numentities = 0;
        r_refdef.numlights = 0;
+       // FIXME: restore these to the values from VM_CL_UpdateView
+       r_view.x = 0;
+       r_view.y = 0;
+       r_view.z = 0;
+       r_view.width = vid.width;
+       r_view.height = vid.height;
+       r_view.depth = 1;
+       // FIXME: restore frustum_x/frustum_y
+       r_view.useperspective = true;
+       r_view.frustum_y = tan(scr_fov.value * M_PI / 360.0) * (3.0/4.0) * cl.viewzoom;
+       r_view.frustum_x = r_view.frustum_y * (float)r_view.width / (float)r_view.height / vid_pixelheight.value;
+       r_view.frustum_x *= r_refdef.frustumscale_x;
+       r_view.frustum_y *= r_refdef.frustumscale_y;
+       r_view.ortho_x = scr_fov.value * (3.0 / 4.0) * (float)r_view.width / (float)r_view.height / vid_pixelheight.value;
+       r_view.ortho_y = scr_fov.value * (3.0 / 4.0);
+       // FIXME: restore cl.csqc_origin
+       // FIXME: restore cl.csqc_angles
+       cl.csqc_vidvars.drawworld = true;
+       cl.csqc_vidvars.drawenginesbar = false;
+       cl.csqc_vidvars.drawcrosshair = false;
 }
 
 //#301 void(float mask) addentities (EXT_CSQC)
@@ -677,58 +724,55 @@ static void VM_CL_R_SetView (void)
 
        switch(c)
        {
-       case VF_MIN:                    r_view.x = (int)f[0];
-                                                       r_view.y = (int)f[1];
+       case VF_MIN:                    r_view.x = (int)(f[0] * vid.width / vid_conwidth.value);
+                                                       r_view.y = (int)(f[1] * vid.height / vid_conheight.value);
                                                        break;
-       case VF_MIN_X:                  r_view.x = (int)k;
+       case VF_MIN_X:                  r_view.x = (int)(k * vid.width / vid_conwidth.value);
                                                        break;
-       case VF_MIN_Y:                  r_view.y = (int)k;
+       case VF_MIN_Y:                  r_view.y = (int)(k * vid.height / vid_conheight.value);
                                                        break;
-       case VF_SIZE:                   r_view.width = (int)f[0];
-                                                       r_view.height = (int)f[1];
+       case VF_SIZE:                   r_view.width = (int)(f[0] * vid.width / vid_conwidth.value);
+                                                       r_view.height = (int)(f[1] * vid.height / vid_conheight.value);
                                                        break;
-       case VF_SIZE_Y:                 r_view.width = (int)k;
+       case VF_SIZE_Y:                 r_view.width = (int)(k * vid.width / vid_conwidth.value);
                                                        break;
-       case VF_SIZE_X:                 r_view.height = (int)k;
+       case VF_SIZE_X:                 r_view.height = (int)(k * vid.height / vid_conheight.value);
                                                        break;
-       case VF_VIEWPORT:               r_view.x = (int)f[0];
-                                                       r_view.y = (int)f[1];
-                                                       r_view.z = 0;
-                                                       // TODO: make sure that view_z and view_depth are set properly even if csqc does not set them!
+       case VF_VIEWPORT:               r_view.x = (int)(f[0] * vid.width / vid_conwidth.value);
+                                                       r_view.y = (int)(f[1] * vid.height / vid_conheight.value);
                                                        f = PRVM_G_VECTOR(OFS_PARM2);
-                                                       r_view.width = (int)f[0];
-                                                       r_view.height = (int)f[1];
-                                                       r_view.depth = 1;
+                                                       r_view.width = (int)(f[0] * vid.width / vid_conwidth.value);
+                                                       r_view.height = (int)(f[1] * vid.height / vid_conheight.value);
                                                        break;
-       case VF_FOV:                    //r_refdef.fov_x = f[0]; // FIXME!
-                                                       //r_refdef.fov_y = f[1]; // FIXME!
+       case VF_FOV:                    r_view.frustum_x = tan(f[0] * M_PI / 360.0);r_view.ortho_x = f[0];
+                                                       r_view.frustum_y = tan(f[1] * M_PI / 360.0);r_view.ortho_y = f[1];
                                                        break;
-       case VF_FOVX:                   //r_refdef.fov_x = k; // FIXME!
+       case VF_FOVX:                   r_view.frustum_x = tan(k * M_PI / 360.0);r_view.ortho_x = k;
                                                        break;
-       case VF_FOVY:                   //r_refdef.fov_y = k; // FIXME!
+       case VF_FOVY:                   r_view.frustum_y = tan(k * M_PI / 360.0);r_view.ortho_y = k;
                                                        break;
-       case VF_ORIGIN:                 VectorCopy(f, csqc_origin);
+       case VF_ORIGIN:                 VectorCopy(f, cl.csqc_origin);
                                                        CSQC_R_RecalcView();
                                                        break;
-       case VF_ORIGIN_X:               csqc_origin[0] = k;
+       case VF_ORIGIN_X:               cl.csqc_origin[0] = k;
                                                        CSQC_R_RecalcView();
                                                        break;
-       case VF_ORIGIN_Y:               csqc_origin[1] = k;
+       case VF_ORIGIN_Y:               cl.csqc_origin[1] = k;
                                                        CSQC_R_RecalcView();
                                                        break;
-       case VF_ORIGIN_Z:               csqc_origin[2] = k;
+       case VF_ORIGIN_Z:               cl.csqc_origin[2] = k;
                                                        CSQC_R_RecalcView();
                                                        break;
-       case VF_ANGLES:                 VectorCopy(f, csqc_angles);
+       case VF_ANGLES:                 VectorCopy(f, cl.csqc_angles);
                                                        CSQC_R_RecalcView();
                                                        break;
-       case VF_ANGLES_X:               csqc_angles[0] = k;
+       case VF_ANGLES_X:               cl.csqc_angles[0] = k;
                                                        CSQC_R_RecalcView();
                                                        break;
-       case VF_ANGLES_Y:               csqc_angles[1] = k;
+       case VF_ANGLES_Y:               cl.csqc_angles[1] = k;
                                                        CSQC_R_RecalcView();
                                                        break;
-       case VF_ANGLES_Z:               csqc_angles[2] = k;
+       case VF_ANGLES_Z:               cl.csqc_angles[2] = k;
                                                        CSQC_R_RecalcView();
                                                        break;
        case VF_DRAWWORLD:              cl.csqc_vidvars.drawworld = k;
@@ -747,6 +791,9 @@ static void VM_CL_R_SetView (void)
        case VF_CL_VIEWANGLES_Z:cl.viewangles[2] = k;
                                                        break;
 
+       case VF_PERSPECTIVE:    r_view.useperspective = k != 0;
+                                                       break;
+
        default:                                PRVM_G_FLOAT(OFS_RETURN) = 0;
                                                        VM_Warning("VM_CL_R_SetView : unknown parm %i\n", c);
                                                        return;
@@ -834,8 +881,24 @@ static void VM_CL_getstatf (void)
 static void VM_CL_getstati (void)
 {
        int i, index;
-       VM_SAFEPARMCOUNT(1, VM_CL_getstati);
+       int firstbit, bitcount;
+
+       VM_SAFEPARMCOUNTRANGE(1, 3, VM_CL_getstati);
+
        index = (int)PRVM_G_FLOAT(OFS_PARM0);
+       if (prog->argc > 1)
+       {
+               firstbit = (int)PRVM_G_FLOAT(OFS_PARM1);
+               if (prog->argc > 2)
+                       bitcount = (int)PRVM_G_FLOAT(OFS_PARM2);
+               else
+                       bitcount = 1;
+       }
+       else
+       {
+               firstbit = 0;
+               bitcount = 32;
+       }
 
        if(index < 0 || index >= MAX_CL_STATS)
        {
@@ -843,6 +906,8 @@ static void VM_CL_getstati (void)
                return;
        }
        i = cl.stats[index];
+       if (bitcount != 32)     //32 causes the mask to overflow, so there's nothing to subtract from.
+               i = (((unsigned int)i)&(((1<<bitcount)-1)<<firstbit))>>firstbit;
        PRVM_G_FLOAT(OFS_RETURN) = i;
 }
 
@@ -1025,6 +1090,9 @@ static void VM_CL_getplayerkey (void)
        else
                if(!strcasecmp(c, "ping"))
                        sprintf(t, "%i", cl.scores[i].qw_ping);
+       else
+               if(!strcasecmp(c, "pl"))
+                       sprintf(t, "%i", cl.scores[i].qw_packetloss);
        else
                if(!strcasecmp(c, "entertime"))
                        sprintf(t, "%f", cl.scores[i].qw_entertime);
@@ -1056,8 +1124,8 @@ static void VM_CL_isdemo (void)
 static void VM_CL_setlistener (void)
 {
        VM_SAFEPARMCOUNT(4, VM_CL_setlistener);
-       Matrix4x4_FromVectors(&csqc_listenermatrix, PRVM_G_VECTOR(OFS_PARM1), PRVM_G_VECTOR(OFS_PARM2), PRVM_G_VECTOR(OFS_PARM3), PRVM_G_VECTOR(OFS_PARM0));
-       csqc_usecsqclistener = true;    //use csqc listener at this frame
+       Matrix4x4_FromVectors(&cl.csqc_listenermatrix, PRVM_G_VECTOR(OFS_PARM1), PRVM_G_VECTOR(OFS_PARM2), PRVM_G_VECTOR(OFS_PARM3), PRVM_G_VECTOR(OFS_PARM0));
+       cl.csqc_usecsqclistener = true; //use csqc listener at this frame
 }
 
 //#352 void(string cmdname) registercommand (EXT_CSQC)
@@ -1163,7 +1231,7 @@ static void VM_CL_makestatic (void)
 
                // copy it to the current state
                staticent->render.model = CL_GetModelByIndex((int)ent->fields.client->modelindex);
-               staticent->render.frame = staticent->render.frame1 = staticent->render.frame2 = (int)ent->fields.client->frame;
+               staticent->render.frame1 = staticent->render.frame2 = (int)ent->fields.client->frame;
                staticent->render.framelerp = 0;
                // make torchs play out of sync
                staticent->render.frame1time = staticent->render.frame2time = lhrandom(-10, -1);
@@ -1331,16 +1399,29 @@ static void VM_CL_te_spark (void)
        CL_ParticleEffect(EFFECT_TE_SPARK, PRVM_G_FLOAT(OFS_PARM2), pos2, pos2, PRVM_G_VECTOR(OFS_PARM1), PRVM_G_VECTOR(OFS_PARM1), NULL, 0);
 }
 
+extern cvar_t cl_sound_ric_gunshot;
 // #412 void(vector org) te_gunshotquad (DP_QUADEFFECTS1)
 static void VM_CL_te_gunshotquad (void)
 {
        float           *pos;
        vec3_t          pos2;
+       int                     rnd;
        VM_SAFEPARMCOUNT(1, VM_CL_te_gunshotquad);
 
        pos = PRVM_G_VECTOR(OFS_PARM0);
        CL_FindNonSolidLocation(pos, pos2, 4);
        CL_ParticleEffect(EFFECT_TE_GUNSHOTQUAD, 1, pos2, pos2, vec3_origin, vec3_origin, NULL, 0);
+       if(cl_sound_ric_gunshot.integer >= 2)
+       {
+               if (rand() % 5)                 S_StartSound(-1, 0, cl.sfx_tink1, pos2, 1, 1);
+               else
+               {
+                       rnd = rand() & 3;
+                       if (rnd == 1)           S_StartSound(-1, 0, cl.sfx_ric1, pos2, 1, 1);
+                       else if (rnd == 2)      S_StartSound(-1, 0, cl.sfx_ric2, pos2, 1, 1);
+                       else                            S_StartSound(-1, 0, cl.sfx_ric3, pos2, 1, 1);
+               }
+       }
 }
 
 // #413 void(vector org) te_spikequad (DP_QUADEFFECTS1)
@@ -1429,11 +1510,23 @@ static void VM_CL_te_gunshot (void)
 {
        float           *pos;
        vec3_t          pos2;
+       int                     rnd;
        VM_SAFEPARMCOUNT(1, VM_CL_te_gunshot);
 
        pos = PRVM_G_VECTOR(OFS_PARM0);
        CL_FindNonSolidLocation(pos, pos2, 4);
        CL_ParticleEffect(EFFECT_TE_GUNSHOT, 1, pos2, pos2, vec3_origin, vec3_origin, NULL, 0);
+       if(cl_sound_ric_gunshot.integer == 1 || cl_sound_ric_gunshot.integer == 3)
+       {
+               if (rand() % 5)                 S_StartSound(-1, 0, cl.sfx_tink1, pos2, 1, 1);
+               else
+               {
+                       rnd = rand() & 3;
+                       if (rnd == 1)           S_StartSound(-1, 0, cl.sfx_ric1, pos2, 1, 1);
+                       else if (rnd == 2)      S_StartSound(-1, 0, cl.sfx_ric2, pos2, 1, 1);
+                       else                            S_StartSound(-1, 0, cl.sfx_ric3, pos2, 1, 1);
+               }
+       }
 }
 
 // #419 void(vector org) te_spike (DP_TE_STANDARDEFFECTBUILTINS)
@@ -1927,7 +2020,7 @@ int CL_GetTagMatrix (matrix4x4_t *out, prvm_edict_t *ent, int tagindex)
                if (val->_float == 0)
                        val->_float = 1;
 
-               Matrix4x4_CreateFromQuakeEntity(&entitymatrix, csqc_origin[0], csqc_origin[1], csqc_origin[2], csqc_angles[0], csqc_angles[1], csqc_angles[2], val->_float);
+               Matrix4x4_CreateFromQuakeEntity(&entitymatrix, cl.csqc_origin[0], cl.csqc_origin[1], cl.csqc_origin[2], cl.csqc_angles[0], cl.csqc_angles[1], cl.csqc_angles[2], val->_float);
                Matrix4x4_Concat(out, &entitymatrix, &tagmatrix);
 
                /*
@@ -1939,7 +2032,7 @@ int CL_GetTagMatrix (matrix4x4_t *out, prvm_edict_t *ent, int tagindex)
                        // should be done in QC on the server, but oh well, quake is quake)
                        // LordHavoc: figured out bobup: the time at which the sin is at 180
                        // degrees (which allows lengthening or squishing the peak or valley)
-                       cycle = sv.time/cl_bobcycle.value;
+                       cycle = cl.time/cl_bobcycle.value;
                        cycle -= (int)cycle;
                        if (cycle < cl_bobup.value)
                                cycle = sin(M_PI * cycle / cl_bobup.value);
@@ -2876,16 +2969,16 @@ NULL,                                                   // #217
 VM_bitshift,                                   // #218 float(float number, float quantity) bitshift (EXT_BITSHIFT)
 NULL,                                                  // #219
 NULL,                                                  // #220
-NULL,                                                  // #221
+VM_strstrofs,                                  // #221 float(string str, string sub[, float startpos]) strstrofs (FTE_STRINGS)
 VM_str2chr,                                            // #222 float(string str, float ofs) str2chr (FTE_STRINGS)
 VM_chr2str,                                            // #223 string(float c, ...) chr2str (FTE_STRINGS)
-NULL,                                                  // #224
-NULL,                                                  // #225
-NULL,                                                  // #226
-NULL,                                                  // #227
+VM_strconv,                                            // #224 string(float ccase, float calpha, float cnum, string s, ...) strconv (FTE_STRINGS)
+VM_strpad,                                             // #225 string(float chars, string s, ...) strpad (FTE_STRINGS)
+VM_infoadd,                                            // #226 string(string info, string key, string value, ...) infoadd (FTE_STRINGS)
+VM_infoget,                                            // #227 string(string info, string key) infoget (FTE_STRINGS)
 VM_strncmp,                                            // #228 float(string s1, string s2, float len) strncmp (FTE_STRINGS)
-NULL,                                                  // #229
-NULL,                                                  // #230
+VM_strncasecmp,                                        // #229 float(string s1, string s2) strcasecmp (FTE_STRINGS)
+VM_strncasecmp,                                        // #230 float(string s1, string s2, float len) strncasecmp (FTE_STRINGS)
 NULL,                                                  // #231
 NULL,                                                  // #232 void(float index, float type, .void field) SV_AddStat (EXT_CSQC)
 NULL,                                                  // #233
@@ -2982,8 +3075,8 @@ VM_drawpic,                                               // #322 float(vector position, string pic, vector size, vector
 VM_drawfill,                                   // #323 float(vector position, vector size, vector rgb, float alpha, float flag) drawfill (EXT_CSQC)
 VM_drawsetcliparea,                            // #324 void(float x, float y, float width, float height) drawsetcliparea
 VM_drawresetcliparea,                  // #325 void(void) drawresetcliparea
-NULL,                                                  // #326
-NULL,                                                  // #327
+VM_drawcolorcodedstring,               // #326 float drawcolorcodedstring(vector position, string text, vector scale, vector rgb, float alpha, float flag) (EXT_CSQC)
+NULL,                                                  // #327 // FIXME add stringwidth() here?
 NULL,                                                  // #328
 NULL,                                                  // #329
 VM_CL_getstatf,                                        // #330 float(float stnum) getstatf (EXT_CSQC)
@@ -3101,10 +3194,10 @@ NULL,                                                   // #440 void(entity e, string s) clientcommand (KRIMZON_SV_PARSECLIE
 VM_tokenize,                                   // #441 float(string s) tokenize (KRIMZON_SV_PARSECLIENTCOMMAND)
 VM_argv,                                               // #442 string(float n) argv (KRIMZON_SV_PARSECLIENTCOMMAND)
 VM_CL_setattachment,                   // #443 void(entity e, entity tagentity, string tagname) setattachment (DP_GFX_QUAKE3MODELTAGS)
-VM_search_begin,                               // #444 float(string pattern, float caseinsensitive, float quiet) search_begin (DP_FS_SEARCH)
-VM_search_end,                                 // #445 void(float handle) search_end (DP_FS_SEARCH)
-VM_search_getsize,                             // #446 float(float handle) search_getsize (DP_FS_SEARCH)
-VM_search_getfilename,                 // #447 string(float handle, float num) search_getfilename (DP_FS_SEARCH)
+VM_search_begin,                               // #444 float(string pattern, float caseinsensitive, float quiet) search_begin (DP_QC_FS_SEARCH)
+VM_search_end,                                 // #445 void(float handle) search_end (DP_QC_FS_SEARCH)
+VM_search_getsize,                             // #446 float(float handle) search_getsize (DP_QC_FS_SEARCH)
+VM_search_getfilename,                 // #447 string(float handle, float num) search_getfilename (DP_QC_FS_SEARCH)
 VM_cvar_string,                                        // #448 string(string s) cvar_string (DP_QC_CVAR_STRING)
 VM_findflags,                                  // #449 entity(entity start, .float fld, float match) findflags (DP_QC_FINDFLAGS)
 VM_findchainflags,                             // #450 entity(.float fld, float match) findchainflags (DP_QC_FINDCHAINFLAGS)
@@ -3137,12 +3230,12 @@ VM_strlennocol,                                 // #476 float(string s) : DRESK - String Length (not countin
 VM_strdecolorize,                              // #477 string(string s) : DRESK - Decolorized String (DP_QC_STRINGCOLORFUNCTIONS)
 VM_strftime,                                   // #478 string(float uselocaltime, string format, ...) (DP_QC_STRFTIME)
 VM_tokenizebyseparator,                        // #479 float(string s) tokenizebyseparator (DP_QC_TOKENIZEBYSEPARATOR)
-NULL,                                                  // #480
-NULL,                                                  // #481
-NULL,                                                  // #482
-NULL,                                                  // #483
-NULL,                                                  // #484
-NULL,                                                  // #485
+VM_strtolower,                                 // #480 string(string s) VM_strtolower (DP_QC_STRING_CASE_FUNCTIONS)
+VM_strtoupper,                                 // #481 string(string s) VM_strtoupper (DP_QC_STRING_CASE_FUNCTIONS)
+VM_cvar_defstring,                             // #482 string(string s) cvar_defstring (DP_QC_CVAR_DEFSTRING)
+VM_CL_pointsound,                              // #483 void(vector origin, string sample, float volume, float attenuation) (DP_SV_POINTSOUND)
+VM_strreplace,                                 // #484 string(string search, string replace, string subject) strreplace (DP_QC_STRREPLACE)
+VM_strireplace,                                        // #485 string(string search, string replace, string subject) strireplace (DP_QC_STRREPLACE)
 NULL,                                                  // #486
 NULL,                                                  // #487
 NULL,                                                  // #488