]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - prvm_execprogram.h
physics: fix and refactor unsticking
[xonotic/darkplaces.git] / prvm_execprogram.h
index e0cc872a7a1b34614f4513051b12e2b0882dadde..a386aa67b673528186be7ab828a7c6f44738caa3 100644 (file)
@@ -377,11 +377,8 @@ int i;
                                }
                                else
                                {
-                                       if (developer.integer)
-                                       {
-                                               PRE_ERROR();
-                                               VM_Warning(prog, "Attempted division by zero in %s\n", prog->name );
-                                       }
+                                       PRE_ERROR();
+                                       VM_Warning(prog, "Attempted division of %f by zero\n", OPA->_float);
                                        OPC->_float = 0.0f;
                                }
                                DISPATCH_OPCODE();
@@ -404,13 +401,13 @@ int i;
                                OPC->_float = OPA->_float < OPB->_float;
                                DISPATCH_OPCODE();
                        HANDLE_OPCODE(OP_AND):
-                               OPC->_float = FLOAT_IS_TRUE_FOR_INT(OPA->_int) && FLOAT_IS_TRUE_FOR_INT(OPB->_int); // TODO change this back to float, and add AND_I to be used by fteqcc for anything not a float
+                               OPC->_float = PRVM_FLOAT_IS_TRUE_FOR_INT(OPA->_int) && PRVM_FLOAT_IS_TRUE_FOR_INT(OPB->_int); // TODO change this back to float, and add AND_I to be used by fteqcc for anything not a float
                                DISPATCH_OPCODE();
                        HANDLE_OPCODE(OP_OR):
-                               OPC->_float = FLOAT_IS_TRUE_FOR_INT(OPA->_int) || FLOAT_IS_TRUE_FOR_INT(OPB->_int); // TODO change this back to float, and add OR_I to be used by fteqcc for anything not a float
+                               OPC->_float = PRVM_FLOAT_IS_TRUE_FOR_INT(OPA->_int) || PRVM_FLOAT_IS_TRUE_FOR_INT(OPB->_int); // TODO change this back to float, and add OR_I to be used by fteqcc for anything not a float
                                DISPATCH_OPCODE();
                        HANDLE_OPCODE(OP_NOT_F):
-                               OPC->_float = !FLOAT_IS_TRUE_FOR_INT(OPA->_int);
+                               OPC->_float = !PRVM_FLOAT_IS_TRUE_FOR_INT(OPA->_int);
                                DISPATCH_OPCODE();
                        HANDLE_OPCODE(OP_NOT_V):
                                OPC->_float = !OPA->vector[0] && !OPA->vector[1] && !OPA->vector[2];
@@ -492,7 +489,7 @@ int i;
                                        if ((prvm_uint_t)OPB->_int < cached_entityfields && !cached_allowworldwrites)
                                        {
                                                PRE_ERROR();
-                                               VM_Warning(prog, "assignment to world.%s (field %i) in %s\n", PRVM_GetString(prog, PRVM_ED_FieldAtOfs(prog, OPB->_int)->s_name), (int)OPB->_int, prog->name);
+                                               VM_Warning(prog, "Attempted assignment to world.%s (edictnum 0 field %i) in %s\n", PRVM_GetString(prog, PRVM_ED_FieldAtOfs(prog, OPB->_int)->s_name), (int)OPB->_int, prog->name);
                                        }
                                }
                                ptr = (prvm_eval_t *)(cached_edictsfields + OPB->_int);
@@ -510,7 +507,7 @@ int i;
                                        if ((prvm_uint_t)OPB->_int < cached_entityfields && !cached_allowworldwrites)
                                        {
                                                PRE_ERROR();
-                                               VM_Warning(prog, "assignment to world.%s (field %i) in %s\n", PRVM_GetString(prog, PRVM_ED_FieldAtOfs(prog, OPB->_int)->s_name), (int)OPB->_int, prog->name);
+                                               VM_Warning(prog, "Attempted assignment to world.%s (edictnum 0 field %i) in %s\n", PRVM_GetString(prog, PRVM_ED_FieldAtOfs(prog, OPB->_int)->s_name), (int)OPB->_int, prog->name);
                                        }
                                }
                                // refresh the garbage collection on the string - this guards
@@ -534,7 +531,7 @@ int i;
                                        if ((prvm_uint_t)OPB->_int < cached_entityfields && !cached_allowworldwrites)
                                        {
                                                PRE_ERROR();
-                                               VM_Warning(prog, "assignment to world.%s (field %i) in %s\n", PRVM_GetString(prog, PRVM_ED_FieldAtOfs(prog, OPB->_int)->s_name), (int)OPB->_int, prog->name);
+                                               VM_Warning(prog, "Attempted assignment to world.%s (edictnum 0 field %i) in %s\n", PRVM_GetString(prog, PRVM_ED_FieldAtOfs(prog, OPB->_int)->s_name), (int)OPB->_int, prog->name);
                                        }
                                }
                                ptr = (prvm_eval_t *)(cached_edictsfields + OPB->_int);
@@ -547,7 +544,7 @@ int i;
                                if ((prvm_uint_t)OPA->edict >= cached_max_edicts)
                                {
                                        PRE_ERROR();
-                                       prog->error_cmd("%s Progs attempted to address an out of bounds edict number", prog->name);
+                                       prog->error_cmd("%s attempted to address an out of bounds edict number", prog->name);
                                        goto cleanup;
                                }
                                if ((prvm_uint_t)OPB->_int >= cached_entityfields)
@@ -560,7 +557,7 @@ int i;
                                if (OPA->edict == 0 && !cached_allowworldwrites)
                                {
                                        PRE_ERROR();
-                                       prog->error_cmd("forbidden assignment to null/world entity in %s", prog->name);
+                                       prog->error_cmd("Forbidden assignment to world (edictnum 0) in %s", prog->name);
                                        goto cleanup;
                                }
 #endif
@@ -574,7 +571,7 @@ int i;
                                if ((prvm_uint_t)OPA->edict >= cached_max_edicts)
                                {
                                        PRE_ERROR();
-                                       prog->error_cmd("%s Progs attempted to read an out of bounds edict number", prog->name);
+                                       prog->error_cmd("%s attempted to read an out of bounds edict number", prog->name);
                                        goto cleanup;
                                }
                                if ((prvm_uint_t)OPB->_int >= cached_entityfields)
@@ -590,7 +587,7 @@ int i;
                                if ((prvm_uint_t)OPA->edict >= cached_max_edicts)
                                {
                                        PRE_ERROR();
-                                       prog->error_cmd("%s Progs attempted to read an out of bounds edict number", prog->name);
+                                       prog->error_cmd("%s attempted to read an out of bounds edict number", prog->name);
                                        goto cleanup;
                                }
                                if ((prvm_uint_t)OPB->_int >= cached_entityfields)
@@ -613,7 +610,7 @@ int i;
                                if ((prvm_uint_t)OPA->edict >= cached_max_edicts)
                                {
                                        PRE_ERROR();
-                                       prog->error_cmd("%s Progs attempted to read an out of bounds edict number", prog->name);
+                                       prog->error_cmd("%s attempted to read an out of bounds edict number", prog->name);
                                        goto cleanup;
                                }
                                if ((prvm_uint_t)OPB->_int > cached_entityfields_3)
@@ -711,7 +708,7 @@ int i;
                                if(!OPA->function || OPA->function < 0 || OPA->function >= prog->numfunctions)
                                {
                                        PRE_ERROR();
-                                       prog->error_cmd("%s CALL outside the program", prog->name);
+                                       prog->error_cmd("%s attempted CALL outside the program", prog->name);
                                        goto cleanup;
                                }
 
@@ -751,7 +748,7 @@ int i;
                                                        goto chooseexecprogram;
                                        }
                                        else
-                                               prog->error_cmd("No such builtin #%i in %s; most likely cause: outdated engine build. Try updating!", builtinnumber, prog->name);
+                                               prog->error_cmd("No such builtin #%i in %s. This program is corrupt or incompatible with DarkPlaces (or this version of it)", builtinnumber, prog->name);
                                }
                                else
                                        st = cached_statements + PRVM_EnterFunction(prog, enterfunc);
@@ -951,7 +948,7 @@ int i;
                                if (OPB->_int < 0 || OPB->_int + 4 > pr_edictareasize)
                                {
                                        PRE_ERROR();
-                                       prog->error_cmd("%s Progs attempted to write to an out of bounds edict", prog->name);
+                                       prog->error_cmd("%s attempted to write to an out of bounds edict", prog->name);
                                        goto cleanup;
                                }
 #endif
@@ -963,13 +960,13 @@ int i;
                                if (OPA->edict < 0 || OPA->edict >= prog->max_edicts)
                                {
                                        PRE_ERROR();
-                                       prog->error_cmd("%s Progs attempted to read an out of bounds edict number", prog->name);
+                                       prog->error_cmd("%s attempted to read an out of bounds edict number", prog->name);
                                        goto cleanup;
                                }
                                if (OPB->_int < 0 || OPB->_int >= progs->entityfields.ip)
                                {
                                        PRE_ERROR();
-                                       prog->error_cmd("%s Progs attempted to read an invalid field in an edict", prog->name);
+                                       prog->error_cmd("%s attempted to read an invalid field in an edict", prog->name);
                                        goto cleanup;
                                }
 #endif
@@ -986,7 +983,7 @@ int i;
                                if (OPB->_int < 0 || OPB->_int >= prog->numglobals)
                                {
                                        PRE_ERROR();
-                                       prog->error_cmd("%s Progs attempted to write to an invalid indexed global", prog->name);
+                                       prog->error_cmd("%s attempted to write to an invalid indexed global", prog->name);
                                        goto cleanup;
                                }
                                prog->globals.ip[OPB->_int] = OPA->_int;
@@ -995,7 +992,7 @@ int i;
                                if (OPB->_int < 0 || OPB->_int + 2 >= prog->numglobals)
                                {
                                        PRE_ERROR();
-                                       prog->error_cmd("%s Progs attempted to write to an invalid indexed global", prog->name);
+                                       prog->error_cmd("%s attempted to write to an invalid indexed global", prog->name);
                                        goto cleanup;
                                }
                                prog->globals.ip[OPB->_int  ] = OPA->ivector[0];
@@ -1008,7 +1005,7 @@ int i;
                                if (i < 0 || i >= prog->numglobaldefs)
                                {
                                        PRE_ERROR();
-                                       prog->error_cmd("%s Progs attempted to address an out of bounds global", prog->name);
+                                       prog->error_cmd("%s attempted to address an out of bounds global", prog->name);
                                        goto cleanup;
                                }
                                OPC->_int = prog->globals.ip[i];
@@ -1020,22 +1017,20 @@ int i;
                        HANDLE_OPCODE(OP_GLOAD_ENT):
                        HANDLE_OPCODE(OP_GLOAD_S):
                        HANDLE_OPCODE(OP_GLOAD_FNC):
-                               // FIXME?: Is this correct?             vvvvvvvvvvvvv
-                               if (OPA->_int < 0 || OPA->_int >= prog->numglobaldefs)
+                               if (OPA->_int < 0 || OPA->_int >= prog->numglobals)
                                {
                                        PRE_ERROR();
-                                       prog->error_cmd("%s Progs attempted to read an invalid indexed global", prog->name);
+                                       prog->error_cmd("%s attempted to read an invalid indexed global", prog->name);
                                        goto cleanup;
                                }
                                OPC->_int = prog->globals.ip[OPA->_int];
                                DISPATCH_OPCODE();
 
                        HANDLE_OPCODE(OP_GLOAD_V):
-                               // FIXME?: Is this correct?                 vvvvvvvvvvvvv
-                               if (OPA->_int < 0 || OPA->_int + 2 >= prog->numglobaldefs)
+                               if (OPA->_int < 0 || OPA->_int + 2 >= prog->numglobals)
                                {
                                        PRE_ERROR();
-                                       prog->error_cmd("%s Progs attempted to read an invalid indexed global", prog->name);
+                                       prog->error_cmd("%s attempted to read an invalid indexed global", prog->name);
                                        goto cleanup;
                                }
                                OPC->ivector[0] = prog->globals.ip[OPA->_int  ];
@@ -1047,7 +1042,7 @@ int i;
                                if ((unsigned int)OPA->_int < (unsigned int)st->operand[2] || (unsigned int)OPA->_int >= (unsigned int)st->operand[1])
                                {
                                        PRE_ERROR();
-                                       prog->error_cmd("Progs boundcheck failed in %s, value is < %d or >= %d", prog->name, OPC->_int, OPB->_int);
+                                       prog->error_cmd("Progs boundcheck failed in %s, value is < %" PRVM_PRIi " or >= %" PRVM_PRIi, prog->name, OPC->_int, OPB->_int);
                                        goto cleanup;
                                }
                                DISPATCH_OPCODE();
@@ -1055,7 +1050,7 @@ int i;
 #if !USE_COMPUTED_GOTOS
                        default:
                                PRE_ERROR();
-                               prog->error_cmd("Bad opcode %i in %s", st->op, prog->name);
+                               prog->error_cmd("Bad opcode %i in %s. This program is corrupt or incompatible with DarkPlaces (or this version of it)", st->op, prog->name);
                                goto cleanup;
                        }
 #if PRVMSLOWINTERPRETER