Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //---------------------------------------------------------------------------
- #ifndef bcppcH
- #define bcppcH
- #include "SysUtils.hpp"
- #include "Dialogs.hpp"
- #include "Classes.hpp"
- #include "DxcMath.h"
- #include "DxcMatrix.h"
- #include "gl/glew.h"
- #include "gl/gl.h"
- #include "gl/glu.h"
- #include "string_unit.hpp"
- #include "mission_inspector.h"
- //---------------------------------------------------------------------------
- struct TVariable {
- t3dpoint<double> point;
- double number;
- AnsiString str;
- bool boolean;
- t4dpoint<double> point4;
- Matrix44<double> matrix;
- int type;
- AnsiString name;
- };
- typedef DynamicArray<TVariable> var_table;
- void SetVarType(AnsiString type, TVariable & var)
- {
- if ( isIn("t3dpoint", type) var.type = 0;
- if ( isIn("double", type) var.type = 1;
- if ( isIn("AnsiString", type) var.type = 2;
- if ( isIn("bool", type) var.type = 3;
- if ( isIn("vec4", type) var.type = 4;
- if ( isIn("matrix", type) var.type = 5;
- }
- struct TBCPPC_Stript
- {
- TStringList * s;
- TGAMEMission * mission;
- var_table var;
- bool __fastcall isMathFunc(AnsiString str);
- TMissionObject * GetObjectByName(AnsiString name);
- bool isVariable(AnsiString s);
- TVariable __fastcall GetVarFromStr(AnsiString str)
- {
- TVariable result;
- AnsiString type = get_text_between2("var "," =", str);
- SetVarType(type, result);
- AnsiString tmp = get_after_char(" = ");
- tmp = StringReplace(tmp," ","", TReplaceFlags() << rfReplaceAll);
- bool get_from_obj = isIn("OBJECT", tmp);
- bool new_val = isIn("<>", tmp);
- bool func = isMathFunc(tmp);
- bool exp = isExpression(tmp);
- AnsiString expstr = Expression(tmp);
- if (func == false)
- if (get_from_obj == true)
- {
- AnsiString obj_name;
- obj_name = get_text_between2("OBJECT[","]",tmp);
- TMissionObject * p = GetObjectByName(obj_name);
- AnsiString returnFunc = get_after_char(".", tmp, false);
- if (LowerCase(returnFunc) == "pos;") result.pos = p->pos;
- if (LowerCase(returnFunc) == "vel;") result.pos = p->vel;
- }
- if (func == false) if (get_from_obj == false) if (exp == true)
- {
- AnsiString exp1 = get_before_char(expstr, tmp, false);
- AnsiString exp2 = get_after_char(expstr, tmp, false);
- bool var1 = isVariable(exp1);
- bool new_val1 = isIn("<>", exp1);
- bool var2 = isVariable(exp2);
- bool new_val2 = isIn("<>", exp2);
- int vari1;
- int vari2;
- if ( (var1 == true) && (new_val1 == false) ) vari1 = GetVariable(exp1);
- if ( (var2 == true) && (new_val2 == false) ) vari2 = GetVariable(exp2);
- if ((new_val1 && new_val2) == false) {
- if (result.type == 0) //t3dpoint
- {
- if (var[vari2].type == 0) //point expression point
- {
- if (expstr == "+") result.pos = var[vari1].pos + var[vari2].pos;
- if (expstr == "-") result.pos = var[vari1].pos - var[vari2].pos;
- if (expstr == "*") result.pos = var[vari1].pos * var[vari2].pos;
- if (expstr == "/") result.pos = var[vari1].pos / var[vari2].pos;
- }
- if (var[vari2].type == 1) //point expression number
- {
- if (expstr == "*") result.pos = var[vari1].pos * var[vari2].number;
- if (expstr == "/") result.pos = var[vari1].pos / var[vari2].number;
- }
- }
- if (result.type == 1) //double
- {
- if (var[vari2].type == 0) //point expression point
- {
- if (expstr == "+") result.number = var[vari1].number + var[vari2].number;
- if (expstr == "-") result.number = var[vari1].number - var[vari2].number;
- if (expstr == "*") result.number = var[vari1].number * var[vari2].number;
- if (expstr == "/") result.number = var[vari1].number / var[vari2].number;
- }
- }
- }
- if (func == false) if (get_from_obj == false) if (exp == false) //single var assignment
- {
- }
- }
- return result;
- double A = B + 44;
- //#t3dpoint A = t3dpoint<>(0#1000#0);
- }
- void AccumulateAllVariables()
- {
- int cnt = 0;
- for (i=0; s->Count; i++)
- if ( isIn("var ",s->Strings[i]) && isIn(" = ",s->Strings[i]) && isNot("#",s->Strings[i]) ) cnt = cnt + 1;
- var.set_length( cnt );
- cnt = -1;
- for (i=0; s->Count; i++)
- if ( isIn("var ",s->Strings[i]) && isIn(" = ",s->Strings[i]) && isNot("#",s->Strings[i]) )
- {
- cnt = cnt + 1;
- var[cnt] = GetVarFromStr(s->Strings[i]);
- }
- }
- bool isIn(AnsiString substr, AnsiString s)
- {
- return (Pos(LowerCase(substr), LowerCase(s)) > 0);
- }
- bool isNot(AnsiString substr, AnsiString s)
- {
- return (Pos(LowerCase(substr), LowerCase(s)) == 0);
- }
- //#t3dpoint A = t3dpoint<>(0#1000#0);
- //#t3dpoint B = OBJECT[ ALLIED_JET_ALPHA_1 ].pos;
- //#double k = n3ddistance(A,B);
- void ExecuteFunctionLine(AnsiString s)
- {
- AnsiString tmp1;
- AnsiString tmp2;
- AnsiString tmp3;
- AnsiString tmp4;
- AnsiString tmp5;
- AnsiString tmp6;
- if ( isIn("var ",s) && isIn(" = ",s) ) return;
- if ( isIn("n3ddistance(", s) )
- {
- tmp1 = get_text_between2("n3ddistance(",");",s);
- tmp2 = get_before_char(",",s,false);
- tmp3 = get_after_char(",",s, false);
- }
- }
- };
- #endif
- //---------------------------------------------------------------------------
- #pragma hdrstop
- #include "bcppc.h"
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- bool __fastcall TBCPPC_Stript::isMathFunc(AnsiString str)
- {
- if ( isIn("n3ddistance(",str)) ) return true;
- if ( isIn("min(",str)) ) return true;
- if ( isIn("max(",str)) ) return true;
- if ( isIn("abs(",str)) ) return true;
- return false;
- }
- bool isExpression(AnsiString exp)
- {
- if ( Pos("+", exp) > 0) return true;
- if ( Pos("-", exp) > 0) return true;
- if ( Pos("/", exp) > 0) return true;
- if ( Pos("*", exp) > 0) return true;
- if ( Pos("=", exp) > 0) return true; //covers != and ==
- return false;
- }
- AnsiString Expression(AnsiString exp)
- {
- if ( Pos("+", exp) > 0) return "+";
- if ( Pos("-", exp) > 0) return "-";
- if ( Pos("/", exp) > 0) return "/";
- if ( Pos("*", exp) > 0) return "*";
- if ( Pos("==", exp) > 0) return "==";
- if ( Pos("!=", exp) > 0) return "!=";
- if ( Pos("=", exp) > 0) return "=";
- return false;
- }
- bool TBCPPC_Stript::isVariable(AnsiString s)
- {
- int i;
- for (i=0; i<var.length; i++)
- if (s == var[i].name) return true;
- return false;
- }
- int TBCPPC_Stript::GetVariable(AnsiString s)
- {
- int i;
- for (i=0; i<var.length; i++)
- if (s == var[i].name) return i;
- return 0;
- }
- TMissionObject * TBCPPC_Stript::GetObjectByName(AnsiString name)
- {
- if (mission->FIRST_MISSION_OBJECT == NULL) return NULL;
- TMissionObject * p = mission->FIRST_MISSION_OBJECT;
- while (p!=NULL) {
- if (LowerCase(p->name) == LowerCase(name)) return p;
- p = p->next;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement