Wesser

GTA LCS Function Commands Implementation

Jul 3rd, 2016 (edited)
474
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.03 KB | None | 0 0
  1. enum eScriptCommand
  2. {
  3.     COMMAND_RETURN                  = 81,
  4.     COMMAND_RETURN_TRUE             = 197,
  5.     COMMAND_RETURN_FALSE,
  6.     COMMAND_CALL                    = 1454,
  7.     COMMAND_CALLNOT,
  8.     COMMAND_RETURN_IF_TRUE          = 1477, // never used
  9.     COMMAND_RETURN_FALSE_IF_TRUE            // never used
  10. };
  11.  
  12. class CTheScripts
  13. {
  14. public:
  15.     static unsigned char* ScriptSpace;
  16. };
  17.  
  18. extern int ScriptParams[32];
  19.  
  20. class CRunningScript
  21. {
  22. public:
  23.     union ReturnPC
  24.     {
  25.         struct {
  26.             unsigned int m_countersPC : 22;
  27.             unsigned int m_bNotFlag : 1;
  28.             unsigned int m_bIsFunction : 1;
  29.             unsigned int m_outParamsOffset : 8;
  30.         };
  31.         unsigned int m_PC;
  32.     };
  33.  
  34.     CRunningScript* m_next;
  35.     CRunningScript* m_prev;
  36.     int m_processId;
  37.     char __pad_C[4];
  38.     char m_name[8];                 // On CRunningScript::Init, sprintf(m_name, "id%02i", m_processId)
  39.     unsigned int m_PC;
  40.     ReturnPC m_returnStack[16];
  41.     short m_returnStackPosition;
  42.     char __align_5E[2];
  43.     int m_aLocalVariables[106];
  44.     int m_baseLocalVariableIndex;
  45.     bool m_bIsActiveScript;
  46.     bool m_bCompareFlag;
  47.     bool m_bUseMissionCleanUp;
  48.     bool m_bClearMessagesOnWait;
  49.     unsigned int m_wakeTime;
  50.     unsigned short m_andOr;
  51.     bool m_bNotFlag;
  52.     bool m_bDeatharrestState;
  53.     bool m_bHasDeatharrestExecuted;
  54.     bool m_bIsMissionScript;
  55.     char __align_21A[2];
  56.  
  57.     void UpdatePC(int address);
  58.     void UpdateCompareFlag(bool state);
  59.  
  60.     int CollectParameters(unsigned int* pPC, int count, int* list);
  61.     void StoreParameters(unsigned int* pPC, short count);
  62.     void ReturnFromGosubOrFunction();
  63.  
  64.     int ProcessCommands0To99(int index);
  65.     int ProcessCommands100To199(int index);
  66.     int ProcessCommands1400To1499(int index);
  67. };
  68.  
  69. int CRunningScript::ProcessCommands0To99(int index)
  70. {
  71.     switch(index)
  72.     {
  73.     case COMMAND_RETURN:
  74.         ReturnFromGosubOrFunction();
  75.     }
  76.  
  77.     return 0;
  78. }
  79.  
  80. int CRunningScript::ProcessCommands100To199(int index)
  81. {
  82.     switch(index)
  83.     {
  84.     case COMMAND_RETURN_TRUE:
  85.         UpdateCompareFlag(true);
  86.         ReturnFromGosubOrFunction();
  87.  
  88.         break;
  89.     case COMMAND_RETURN_FALSE:
  90.         UpdateCompareFlag(false);
  91.         ReturnFromGosubOrFunction();
  92.     }
  93.  
  94.     return 0;
  95. }
  96.  
  97. int CRunningScript::ProcessCommands1400To1499(int index)
  98. {
  99.     switch(index)
  100.     {
  101.     case COMMAND_CALL:
  102.     case COMMAND_CALLNOT:
  103.         {
  104.             m_returnStack[m_returnStackPosition].m_PC = m_PC;
  105.             m_returnStack[m_returnStackPosition].m_bNotFlag = index == COMMAND_CALLNOT;
  106.             m_returnStack[m_returnStackPosition].m_bIsFunction = true;
  107.             m_returnStackPosition++;
  108.  
  109.             int numInputParams = (char)CTheScripts::ScriptSpace[m_PC];
  110.             int baseLocalVariableIndex = m_baseLocalVariableIndex + (char)CTheScripts::ScriptSpace[m_PC + 2];
  111.  
  112.             unsigned int paramsPC = m_PC + 3;
  113.             m_PC = paramsPC;
  114.  
  115.             CollectParameters(&m_PC, 1, ScriptParams);
  116.  
  117.             if(numInputParams > 0)
  118.             {
  119.                 CollectParameters(&m_PC, numInputParams, &m_aLocalVariables[baseLocalVariableIndex]);
  120.             }
  121.  
  122.             m_baseLocalVariableIndex = baseLocalVariableIndex;
  123.             m_returnStack[m_returnStackPosition - 1].m_outParamsOffset = m_PC - paramsPC;
  124.  
  125.             UpdatePC(ScriptParams[0]);
  126.         }
  127.  
  128.         break;
  129.     case COMMAND_RETURN_IF_TRUE:
  130.         if(m_bCompareFlag)
  131.         {
  132.             ReturnFromGosubOrFunction();
  133.         }
  134.  
  135.         break;
  136.     case COMMAND_RETURN_FALSE_IF_TRUE:
  137.         if(m_bCompareFlag)
  138.         {
  139.             UpdateCompareFlag(false);
  140.             ReturnFromGosubOrFunction();
  141.         }
  142.     }
  143.  
  144.     return 0;
  145. }
  146.  
  147. void CRunningScript::ReturnFromGosubOrFunction()
  148. {
  149.     m_returnStackPosition--;
  150.  
  151.     if(!m_returnStack[m_returnStackPosition].m_bIsFunction)
  152.     {
  153.         m_PC = m_returnStack[m_returnStackPosition].m_PC;
  154.  
  155.         return;
  156.     }
  157.  
  158.     if(m_returnStack[m_returnStackPosition].m_bNotFlag)
  159.     {
  160.         m_bNotFlag = !m_bNotFlag;
  161.     }
  162.  
  163.     unsigned int PC = m_returnStack[m_returnStackPosition].m_countersPC;
  164.  
  165.     int* storedLocalVariables = &m_aLocalVariables[m_baseLocalVariableIndex + (char)CTheScripts::ScriptSpace[PC]];
  166.     short numOutputParams = (char)CTheScripts::ScriptSpace[PC + 1];
  167.  
  168.     for(int i = 0; i < numOutputParams; i++)
  169.     {
  170.         ScriptParams[i] = storedLocalVariables[i];
  171.     }
  172.  
  173.     m_PC = PC + 3 + m_returnStack[m_returnStackPosition].m_outParamsOffset;
  174.     m_baseLocalVariableIndex -= (char)CTheScripts::ScriptSpace[PC + 2];
  175.  
  176.     StoreParameters(&m_PC, numOutputParams);
  177. }
  178.  
Add Comment
Please, Sign In to add comment