Пример #1
0
        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);
        }
Пример #2
0
        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];
                }
            }
        }
Пример #3
0
        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];
                }
            }
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
    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);
    }
Пример #6
0
 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;
         }
     }
 }
Пример #7
0
 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;
         }
     }
 }
Пример #8
0
 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;
         }
     }
 }
Пример #9
0
 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;
 }
Пример #10
0
        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;
                }
            }
        }