public unsafe float GetFloat(int offset) { int offset1; float result; if (IsV(offset, out offset1)) { fixed(void *pv = &this.v) { eval_t *a = (eval_t *)((float *)pv + offset1); result = a->_float; } } else { fixed(void *pv = this.fields) { eval_t *a = (eval_t *)((float *)pv + offset1); result = a->_float; } } return(result); }
public unsafe void StoreVector(int offset, eval_t *value) { int offset1; if (IsV(offset, out offset1)) { fixed(void *pv = &this.v) { eval_t *a = (eval_t *)((int *)pv + offset1); a->vector[0] = value->vector[0]; a->vector[1] = value->vector[1]; a->vector[2] = value->vector[2]; } } else { fixed(void *pf = this.fields) { eval_t *a = (eval_t *)((int *)pf + offset1); a->vector[0] = value->vector[0]; a->vector[1] = value->vector[1]; a->vector[2] = value->vector[2]; } } }
public unsafe void LoadVector(int offset, eval_t *result) { int offset1; if (IsV(offset, out offset1)) { fixed(void *pv = &this.v) { eval_t *a = (eval_t *)((int *)pv + offset1); result->vector[0] = a->vector[0]; result->vector[1] = a->vector[1]; result->vector[2] = a->vector[2]; } } else { fixed(void *pf = this.fields) { eval_t *a = (eval_t *)((int *)pf + offset1); result->vector[0] = a->vector[0]; result->vector[1] = a->vector[1]; result->vector[2] = a->vector[2]; } } }
/// <summary> /// PR_UglyValueString /// Returns a string describing *data in a type specific manner /// Easier to parse than PR_ValueString /// </summary> static unsafe string UglyValueString(etype_t type, eval_t *val) { type &= (etype_t) ~DEF_SAVEGLOBAL; string result; switch (type) { case etype_t.ev_string: result = GetString(val->_string); break; case etype_t.ev_entity: result = Server.NumForEdict(Server.ProgToEdict(val->edict)).ToString(); break; case etype_t.ev_function: dfunction_t f = _Functions[val->function]; result = GetString(f.s_name); break; case etype_t.ev_field: ddef_t def = FindField(val->_int); result = GetString(def.s_name); break; case etype_t.ev_void: result = "void"; break; case etype_t.ev_float: result = val->_float.ToString("F6", CultureInfo.InvariantCulture.NumberFormat); break; case etype_t.ev_vector: result = String.Format(CultureInfo.InvariantCulture.NumberFormat, "{0:F6} {1:F6} {2:F6}", val->vector[0], val->vector[1], val->vector[2]); break; default: result = "bad type " + type.ToString(); break; } return(result); }
static unsafe string PR_UglyValueString(etype_t type, eval_t *val) { type &= (etype_t) ~q_shared.DEF_SAVEGLOBAL; string result; switch (type) { case etype_t.ev_string: result = GetString(val->_string); break; case etype_t.ev_entity: result = NUM_FOR_EDICT(PROG_TO_EDICT(val->edict)).ToString(); break; case etype_t.ev_function: dfunction_t f = pr_functions[val->function]; result = GetString(f.s_name); break; case etype_t.ev_field: ddef_t def = ED_FieldAtOfs(val->_int); result = GetString(def.s_name); break; case etype_t.ev_void: result = "void"; break; case etype_t.ev_float: result = val->_float.ToString("F6", CultureInfo.InvariantCulture.NumberFormat); break; case etype_t.ev_vector: result = String.Format(CultureInfo.InvariantCulture.NumberFormat, "{0:F6} {1:F6} {2:F6}", val->vector[0], val->vector[1], val->vector[2]); break; default: result = "bad type " + type.ToString(); break; } return(result); }
public unsafe void SetFloat(int offset, float value) { int offset1; if (IsV(offset, out offset1)) { fixed (void* pv = &this.v) { eval_t* a = (eval_t*)((float*)pv + offset1); a->_float = value; } } else { fixed (void* pv = this.fields) { eval_t* a = (eval_t*)((float*)pv + offset1); a->_float = value; } } }
public unsafe void StoreInt(int offset, eval_t* value) { int offset1; if (IsV(offset, out offset1)) { fixed (void* pv = &this.v) { eval_t* a = (eval_t*)((int*)pv + offset1); a->_int = value->_int; } } else { fixed (void* pv = this.fields) { eval_t* a = (eval_t*)((int*)pv + offset1); a->_int = value->_int; } } }
public unsafe void LoadInt(int offset, eval_t* result) { int offset1; if (IsV(offset, out offset1)) { fixed (void* pv = &this.v) { eval_t* a = (eval_t*)((int*)pv + offset1); result->_int = a->_int; } } else { fixed (void* pv = this.fields) { eval_t* a = (eval_t*)((int*)pv + offset1); result->_int = a->_int; } } }
public unsafe int GetInt(int offset) { int offset1, result; if (IsV(offset, out offset1)) { fixed (void* pv = &this.v) { eval_t* a = (eval_t*)((int*)pv + offset1); result = a->_int; } } else { fixed (void* pv = this.fields) { eval_t* a = (eval_t*)((int*)pv + offset1); result = a->_int; } } return result; }
private static int _Argc; // pr_argc /// <summary> /// PR_ExecuteProgram /// </summary> public unsafe static void Execute(int fnum) { if (fnum < 1 || fnum >= _Functions.Length) { if (progs.GlobalStruct.self != 0) { Print(server.ProgToEdict(progs.GlobalStruct.self)); } host.Error("PR_ExecuteProgram: NULL function"); } dfunction_t f = _Functions[fnum]; int runaway = 100000; Trace = false; // make a stack frame int exitdepth = _Depth; int ofs; int s = EnterFunction(f); edict_t ed; while (true) { s++; // next statement eval_t *a = (eval_t *)Get(_Statements[s].a); eval_t *b = (eval_t *)Get(_Statements[s].b); eval_t *c = (eval_t *)Get(_Statements[s].c); if (--runaway == 0) { RunError("runaway loop error"); } xFunction.profile++; _xStatement = s; if (Trace) { PrintStatement(ref _Statements[s]); } switch ((OP)_Statements[s].op) { case OP.OP_ADD_F: c->_float = a->_float + b->_float; break; case OP.OP_ADD_V: c->vector[0] = a->vector[0] + b->vector[0]; c->vector[1] = a->vector[1] + b->vector[1]; c->vector[2] = a->vector[2] + b->vector[2]; break; case OP.OP_SUB_F: c->_float = a->_float - b->_float; break; case OP.OP_SUB_V: c->vector[0] = a->vector[0] - b->vector[0]; c->vector[1] = a->vector[1] - b->vector[1]; c->vector[2] = a->vector[2] - b->vector[2]; break; case OP.OP_MUL_F: c->_float = a->_float * b->_float; break; case OP.OP_MUL_V: c->_float = a->vector[0] * b->vector[0] + a->vector[1] * b->vector[1] + a->vector[2] * b->vector[2]; break; case OP.OP_MUL_FV: c->vector[0] = a->_float * b->vector[0]; c->vector[1] = a->_float * b->vector[1]; c->vector[2] = a->_float * b->vector[2]; break; case OP.OP_MUL_VF: c->vector[0] = b->_float * a->vector[0]; c->vector[1] = b->_float * a->vector[1]; c->vector[2] = b->_float * a->vector[2]; break; case OP.OP_DIV_F: c->_float = a->_float / b->_float; break; case OP.OP_BITAND: c->_float = (int)a->_float & (int)b->_float; break; case OP.OP_BITOR: c->_float = (int)a->_float | (int)b->_float; break; case OP.OP_GE: c->_float = (a->_float >= b->_float) ? 1 : 0; break; case OP.OP_LE: c->_float = (a->_float <= b->_float) ? 1 : 0; break; case OP.OP_GT: c->_float = (a->_float > b->_float) ? 1 : 0; break; case OP.OP_LT: c->_float = (a->_float < b->_float) ? 1 : 0; break; case OP.OP_AND: c->_float = (a->_float != 0 && b->_float != 0) ? 1 : 0; break; case OP.OP_OR: c->_float = (a->_float != 0 || b->_float != 0) ? 1 : 0; break; case OP.OP_NOT_F: c->_float = (a->_float != 0) ? 0 : 1; break; case OP.OP_NOT_V: c->_float = (a->vector[0] == 0 && a->vector[1] == 0 && a->vector[2] == 0) ? 1 : 0; break; case OP.OP_NOT_S: c->_float = (a->_string == 0 || String.IsNullOrEmpty(GetString(a->_string))) ? 1 : 0; break; case OP.OP_NOT_FNC: c->_float = (a->function == 0) ? 1 : 0; break; case OP.OP_NOT_ENT: c->_float = (server.ProgToEdict(a->edict) == server.sv.edicts[0]) ? 1 : 0; break; case OP.OP_EQ_F: c->_float = (a->_float == b->_float) ? 1 : 0; break; case OP.OP_EQ_V: c->_float = ((a->vector[0] == b->vector[0]) && (a->vector[1] == b->vector[1]) && (a->vector[2] == b->vector[2])) ? 1 : 0; break; case OP.OP_EQ_S: c->_float = (GetString(a->_string) == GetString(b->_string)) ? 1 : 0; //!strcmp(pr_strings + a->_string, pr_strings + b->_string); break; case OP.OP_EQ_E: c->_float = (a->_int == b->_int) ? 1 : 0; break; case OP.OP_EQ_FNC: c->_float = (a->function == b->function) ? 1 : 0; break; case OP.OP_NE_F: c->_float = (a->_float != b->_float) ? 1 : 0; break; case OP.OP_NE_V: c->_float = ((a->vector[0] != b->vector[0]) || (a->vector[1] != b->vector[1]) || (a->vector[2] != b->vector[2])) ? 1 : 0; break; case OP.OP_NE_S: c->_float = (GetString(a->_string) != GetString(b->_string)) ? 1 : 0; //strcmp(pr_strings + a->_string, pr_strings + b->_string); break; case OP.OP_NE_E: c->_float = (a->_int != b->_int) ? 1 : 0; break; case OP.OP_NE_FNC: c->_float = (a->function != b->function) ? 1 : 0; break; case OP.OP_STORE_F: case OP.OP_STORE_ENT: case OP.OP_STORE_FLD: // integers case OP.OP_STORE_S: case OP.OP_STORE_FNC: // pointers b->_int = a->_int; break; case OP.OP_STORE_V: b->vector[0] = a->vector[0]; b->vector[1] = a->vector[1]; b->vector[2] = a->vector[2]; break; case OP.OP_STOREP_F: case OP.OP_STOREP_ENT: case OP.OP_STOREP_FLD: // integers case OP.OP_STOREP_S: case OP.OP_STOREP_FNC: // pointers ed = EdictFromAddr(b->_int, out ofs); ed.StoreInt(ofs, a); break; case OP.OP_STOREP_V: ed = EdictFromAddr(b->_int, out ofs); ed.StoreVector(ofs, a); break; case OP.OP_ADDRESS: ed = server.ProgToEdict(a->edict); if (ed == server.sv.edicts[0] && server.IsActive) { RunError("assignment to world entity"); } c->_int = MakeAddr(a->edict, b->_int); break; case OP.OP_LOAD_F: case OP.OP_LOAD_FLD: case OP.OP_LOAD_ENT: case OP.OP_LOAD_S: case OP.OP_LOAD_FNC: ed = server.ProgToEdict(a->edict); ed.LoadInt(b->_int, c); break; case OP.OP_LOAD_V: ed = server.ProgToEdict(a->edict); ed.LoadVector(b->_int, c); break; case OP.OP_IFNOT: if (a->_int == 0) { s += _Statements[s].b - 1; // offset the s++ } break; case OP.OP_IF: if (a->_int != 0) { s += _Statements[s].b - 1; // offset the s++ } break; case OP.OP_GOTO: s += _Statements[s].a - 1; // offset the s++ break; case OP.OP_CALL0: case OP.OP_CALL1: case OP.OP_CALL2: case OP.OP_CALL3: case OP.OP_CALL4: case OP.OP_CALL5: case OP.OP_CALL6: case OP.OP_CALL7: case OP.OP_CALL8: _Argc = _Statements[s].op - (int)OP.OP_CALL0; if (a->function == 0) { RunError("NULL function"); } dfunction_t newf = _Functions[a->function]; if (newf.first_statement < 0) { // negative statements are built in functions int i = -newf.first_statement; if (i >= QBuiltins.Count) { RunError("Bad builtin call number"); } QBuiltins.Execute(i); break; } s = EnterFunction(newf); break; case OP.OP_DONE: case OP.OP_RETURN: float *ptr = (float *)_GlobalStructAddr; int sta = _Statements[s].a; ptr[OFS.OFS_RETURN + 0] = *(float *)Get(sta); ptr[OFS.OFS_RETURN + 1] = *(float *)Get(sta + 1); ptr[OFS.OFS_RETURN + 2] = *(float *)Get(sta + 2); s = LeaveFunction(); if (_Depth == exitdepth) { return; // all done } break; case OP.OP_STATE: ed = server.ProgToEdict(progs.GlobalStruct.self); #if FPS_20 ed->v.nextthink = pr_global_struct->time + 0.05; #else ed.v.nextthink = progs.GlobalStruct.time + 0.1f; #endif if (a->_float != ed.v.frame) { ed.v.frame = a->_float; } ed.v.think = b->function; break; default: RunError("Bad opcode %i", _Statements[s].op); break; } } }