Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2014
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.44 KB | None | 0 0
  1. //---------------------------------------------------------------------------
  2.  
  3. #ifndef bcppcH
  4. #define bcppcH
  5. #include "SysUtils.hpp"
  6. #include "Dialogs.hpp"
  7. #include "Classes.hpp"
  8. #include "DxcMath.h"
  9. #include "DxcMatrix.h"
  10. #include "gl/glew.h"
  11. #include "gl/gl.h"
  12. #include "gl/glu.h"
  13. #include "string_unit.hpp"
  14. #include "mission_inspector.h"
  15.  
  16. //---------------------------------------------------------------------------
  17.  
  18.  
  19. struct  TVariable {
  20. t3dpoint<double>    point;
  21. double              number;
  22. AnsiString          str;
  23. bool                boolean;
  24. t4dpoint<double>    point4;
  25. Matrix44<double>    matrix;
  26.  
  27. int type;
  28. AnsiString name;
  29.  
  30. };
  31.  
  32. typedef DynamicArray<TVariable> var_table;
  33.  
  34.  
  35. void SetVarType(AnsiString type, TVariable & var)
  36. {
  37. if ( isIn("t3dpoint", type) var.type = 0;
  38. if ( isIn("double", type) var.type = 1;
  39. if ( isIn("AnsiString", type) var.type = 2;
  40. if ( isIn("bool", type) var.type = 3;
  41. if ( isIn("vec4", type) var.type = 4;
  42. if ( isIn("matrix", type) var.type = 5;
  43. }
  44.  
  45.  
  46. struct TBCPPC_Stript
  47. {
  48. TStringList * s;
  49. TGAMEMission * mission;
  50.  
  51. var_table var;
  52. bool __fastcall isMathFunc(AnsiString str);
  53. TMissionObject * GetObjectByName(AnsiString name);
  54. bool isVariable(AnsiString s);
  55.  
  56. TVariable __fastcall GetVarFromStr(AnsiString str)
  57. {
  58. TVariable result;
  59. AnsiString type = get_text_between2("var "," =", str);
  60. SetVarType(type, result);
  61.  
  62. AnsiString tmp = get_after_char(" = ");
  63. tmp = StringReplace(tmp," ","", TReplaceFlags() << rfReplaceAll);
  64.  
  65. bool get_from_obj = isIn("OBJECT", tmp);
  66. bool new_val = isIn("<>", tmp);
  67. bool func = isMathFunc(tmp);
  68.  
  69.  
  70. bool exp = isExpression(tmp);
  71. AnsiString expstr = Expression(tmp);
  72.  
  73.  
  74. if (func == false)
  75. if (get_from_obj == true)
  76. {
  77. AnsiString obj_name;
  78. obj_name = get_text_between2("OBJECT[","]",tmp);
  79. TMissionObject * p = GetObjectByName(obj_name);
  80. AnsiString returnFunc = get_after_char(".", tmp, false);
  81.  
  82. if (LowerCase(returnFunc) == "pos;") result.pos = p->pos;
  83. if (LowerCase(returnFunc) == "vel;") result.pos = p->vel;
  84.  
  85.  
  86. }
  87.  
  88.  
  89. if (func == false) if (get_from_obj == false) if (exp == true)
  90. {
  91. AnsiString exp1 = get_before_char(expstr, tmp, false);
  92. AnsiString exp2 = get_after_char(expstr, tmp, false);
  93.  
  94. bool var1 = isVariable(exp1);
  95. bool new_val1 = isIn("<>", exp1);
  96. bool var2 = isVariable(exp2);
  97. bool new_val2 = isIn("<>", exp2);
  98. int vari1;
  99. int vari2;
  100. if ( (var1 == true) && (new_val1 == false) ) vari1 = GetVariable(exp1);
  101. if ( (var2 == true) && (new_val2 == false) ) vari2 = GetVariable(exp2);
  102.  
  103. if ((new_val1 && new_val2) == false) {
  104. if (result.type == 0)      //t3dpoint
  105. {
  106. if (var[vari2].type == 0) //point expression point
  107. {
  108. if (expstr == "+") result.pos = var[vari1].pos + var[vari2].pos;
  109. if (expstr == "-") result.pos = var[vari1].pos - var[vari2].pos;
  110. if (expstr == "*") result.pos = var[vari1].pos * var[vari2].pos;
  111. if (expstr == "/") result.pos = var[vari1].pos / var[vari2].pos;
  112. }
  113.  
  114.  
  115. if (var[vari2].type == 1) //point expression number
  116. {
  117. if (expstr == "*") result.pos = var[vari1].pos * var[vari2].number;
  118. if (expstr == "/") result.pos = var[vari1].pos / var[vari2].number;
  119. }
  120.  
  121. }
  122.  
  123. if (result.type == 1)      //double
  124. {
  125. if (var[vari2].type == 0) //point expression point
  126. {
  127. if (expstr == "+") result.number = var[vari1].number + var[vari2].number;
  128. if (expstr == "-") result.number = var[vari1].number - var[vari2].number;
  129. if (expstr == "*") result.number = var[vari1].number * var[vari2].number;
  130. if (expstr == "/") result.number = var[vari1].number / var[vari2].number;
  131. }
  132.  
  133. }
  134.  
  135.                                      }
  136.  
  137.  
  138.  
  139. if (func == false) if (get_from_obj == false) if (exp == false) //single var assignment
  140. {
  141.  
  142. }
  143.  
  144. }
  145.  
  146.  
  147. return result;
  148. double A = B + 44;
  149.  
  150. //#t3dpoint A = t3dpoint<>(0#1000#0);
  151.  
  152. }
  153.  
  154. void AccumulateAllVariables()
  155. {
  156.  
  157. int cnt = 0;
  158. for (i=0; s->Count; i++)
  159. if ( isIn("var ",s->Strings[i]) && isIn(" = ",s->Strings[i]) && isNot("#",s->Strings[i]) ) cnt = cnt + 1;
  160.  
  161. var.set_length( cnt );
  162. cnt = -1;
  163.  
  164. for (i=0; s->Count; i++)
  165. if ( isIn("var ",s->Strings[i]) && isIn(" = ",s->Strings[i]) && isNot("#",s->Strings[i]) )
  166. {
  167. cnt = cnt + 1;
  168. var[cnt] = GetVarFromStr(s->Strings[i]);
  169.  
  170. }
  171.  
  172.  
  173. }
  174.  
  175.  
  176. bool isIn(AnsiString substr, AnsiString s)
  177. {
  178. return (Pos(LowerCase(substr), LowerCase(s)) > 0);
  179. }
  180.  
  181. bool isNot(AnsiString substr, AnsiString s)
  182. {
  183. return (Pos(LowerCase(substr), LowerCase(s)) == 0);
  184. }
  185.  
  186. //#t3dpoint A = t3dpoint<>(0#1000#0);
  187. //#t3dpoint B = OBJECT[ ALLIED_JET_ALPHA_1 ].pos;
  188. //#double k = n3ddistance(A,B);
  189.  
  190.  
  191.  
  192. void ExecuteFunctionLine(AnsiString s)
  193. {
  194. AnsiString tmp1;
  195. AnsiString tmp2;
  196. AnsiString tmp3;
  197. AnsiString tmp4;
  198. AnsiString tmp5;
  199. AnsiString tmp6;
  200.  
  201. if ( isIn("var ",s) && isIn(" = ",s) ) return;
  202.        if ( isIn("n3ddistance(", s) )
  203.        {
  204.  
  205.        tmp1 = get_text_between2("n3ddistance(",");",s);
  206.        tmp2 = get_before_char(",",s,false);
  207.        tmp3 = get_after_char(",",s, false);
  208.  
  209.  
  210.  
  211.        }
  212.  
  213.        
  214. }
  215.  
  216.  
  217. };
  218.  
  219.  
  220.  
  221. #endif
  222.  
  223.  
  224.  
  225. //---------------------------------------------------------------------------
  226.  
  227.  
  228. #pragma hdrstop
  229.  
  230. #include "bcppc.h"
  231.  
  232. //---------------------------------------------------------------------------
  233.  
  234. #pragma package(smart_init)
  235.  
  236.  
  237. bool __fastcall TBCPPC_Stript::isMathFunc(AnsiString str)
  238. {
  239.  
  240. if ( isIn("n3ddistance(",str)) ) return true;
  241. if ( isIn("min(",str)) ) return true;
  242. if ( isIn("max(",str)) ) return true;
  243. if ( isIn("abs(",str)) ) return true;
  244.  
  245.  
  246.  
  247. return false;
  248.  
  249. }
  250.  
  251. bool isExpression(AnsiString exp)
  252. {
  253.  if ( Pos("+", exp) > 0) return true;
  254.  if ( Pos("-", exp) > 0) return true;
  255.  if ( Pos("/", exp) > 0) return true;
  256.  if ( Pos("*", exp) > 0) return true;
  257.  if ( Pos("=", exp) > 0) return true; //covers != and ==
  258.  
  259.  return false;
  260. }
  261.  
  262. AnsiString Expression(AnsiString exp)
  263. {
  264.  if ( Pos("+", exp) > 0) return "+";
  265.  if ( Pos("-", exp) > 0) return "-";
  266.  if ( Pos("/", exp) > 0) return "/";
  267.  if ( Pos("*", exp) > 0) return "*";
  268.  if ( Pos("==", exp) > 0) return "==";
  269.  if ( Pos("!=", exp) > 0) return "!=";
  270.  if ( Pos("=", exp) > 0) return "=";
  271.  
  272.  return false;
  273. }
  274.  
  275.  
  276. bool TBCPPC_Stript::isVariable(AnsiString s)
  277. {
  278. int i;
  279. for (i=0; i<var.length; i++)
  280. if (s == var[i].name) return true;
  281. return false;
  282. }
  283.  
  284.  
  285. int TBCPPC_Stript::GetVariable(AnsiString s)
  286. {
  287. int i;
  288. for (i=0; i<var.length; i++)
  289. if (s == var[i].name) return i;
  290. return 0;
  291. }
  292.  
  293.  
  294. TMissionObject * TBCPPC_Stript::GetObjectByName(AnsiString name)
  295. {
  296.  
  297. if (mission->FIRST_MISSION_OBJECT == NULL) return NULL;
  298. TMissionObject * p = mission->FIRST_MISSION_OBJECT;
  299.  
  300. while (p!=NULL) {
  301. if (LowerCase(p->name) == LowerCase(name)) return p;
  302.  
  303. p = p->next;
  304. }
  305.  
  306. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement