diff --git a/Slang-Installer/Slang-Installer.vdproj b/Slang-Installer/Slang-Installer.vdproj index e916a29..684f821 100644 --- a/Slang-Installer/Slang-Installer.vdproj +++ b/Slang-Installer/Slang-Installer.vdproj @@ -33,12 +33,6 @@ } "Entry" { - "MsmKey" = "8:_30B059D12CC4427B998612ABE14AD9FE" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_38EBD2EEB8C34316A3249C9D9873B1C2" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -57,18 +51,6 @@ } "Entry" { - "MsmKey" = "8:_63B7B5320B9540CBB4C2AFA5A14B2649" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_6631FA01F35946F2B90DE75D9A2924D7" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_7C9D3FE3584D494F807EBD12C93E2FC5" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -230,26 +212,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_30B059D12CC4427B998612ABE14AD9FE" - { - "SourcePath" = "8:..\\Releases\\Slang-Win-x64\\SDL2_image.dll" - "TargetName" = "8:SDL2_image.dll" - "Tag" = "8:" - "Folder" = "8:_BCDF457FF4564F7BBFD6AEF054FE16C2" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_38EBD2EEB8C34316A3249C9D9873B1C2" { "SourcePath" = "8:..\\Releases\\Slang-Win-x64\\zlib1.dll" @@ -310,46 +272,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_63B7B5320B9540CBB4C2AFA5A14B2649" - { - "SourcePath" = "8:..\\Releases\\Slang-Win-x64\\SDL2.dll" - "TargetName" = "8:SDL2.dll" - "Tag" = "8:" - "Folder" = "8:_BCDF457FF4564F7BBFD6AEF054FE16C2" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_6631FA01F35946F2B90DE75D9A2924D7" - { - "SourcePath" = "8:..\\Releases\\Slang-Win-x64\\SDL2_ttf.dll" - "TargetName" = "8:SDL2_ttf.dll" - "Tag" = "8:" - "Folder" = "8:_BCDF457FF4564F7BBFD6AEF054FE16C2" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_7C9D3FE3584D494F807EBD12C93E2FC5" { "SourcePath" = "8:installer-icon.ico" @@ -537,15 +459,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:Slang" - "ProductCode" = "8:{3F1665C5-F602-4107-B71C-6101FF2DC973}" - "PackageCode" = "8:{E26509B2-C19C-4E07-A5D1-8E05B189963C}" + "ProductCode" = "8:{A5629CD2-46CB-4945-BBA2-BAC60F2DDFC4}" + "PackageCode" = "8:{DEE267E6-C968-4059-8F0F-4560CF270A35}" "UpgradeCode" = "8:{8ABDE53F-7FF9-455B-A777-B4C1C624FA13}" "AspNetVersion" = "8:2.0.50727.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:1.2.1" + "ProductVersion" = "8:1.2.2" "Manufacturer" = "8:Sam-Astro" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" diff --git a/Slang/Main.cpp b/Slang/Main.cpp index c1af317..10b7002 100644 --- a/Slang/Main.cpp +++ b/Slang/Main.cpp @@ -1,4 +1,4 @@ - + #include #include #include @@ -86,7 +86,7 @@ vector VarValues(const vector& varNames, unordered_map& v bool inQuotes = false; #if DEVELOPER_MESSAGES == true - InterpreterLog("OLDEXPRESSION: |" + expression + "|"); + InterpreterLog(" old expression: |" + expression + "|"); #endif bool isFunc = IsFunction(split(expression, '(')[0]); @@ -229,7 +229,7 @@ boost::any EvalExpression(const string& ex, unordered_map& v } } #if DEVELOPER_MESSAGES == true - InterpreterLog("NEW EXPRESSION: |" + newExpression + "|"); + InterpreterLog(" new expression: |" + newExpression + "|"); #endif bool addStrings = false; @@ -290,168 +290,168 @@ bool BooleanLogic(const string& valA, const string& determinant, const string& v int varOperation(const vector& str, unordered_map& variableValues) { - if (IsVar(str[0], variableValues)) + if (IsVar(str.at(0), variableValues)) { // Checks if type is simple, like int or string - if (any_type(variableValues[str[0]]) <= 3) + if (any_type(variableValues[str.at(0)]) <= 3) { - if (str[1] == "=") - variableValues[str[0]] = EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues); - else if (str[1] == "+=") - variableValues[str[0]] = EvalExpression(str[0] + "+(" + unWrapVec(vector(str.begin() + 2, str.end())) + ")", variableValues); - else if (str[1] == "-=") - variableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) - AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); - else if (str[1] == "*=") - variableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) * AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); - else if (str[1] == "/=") - variableValues[str[0]] = AnyAsFloat(variableValues[str[0]]) / AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); + if (str.at(1) == "=") + variableValues[str.at(0)] = EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues); + else if (str.at(1) == "+=") + variableValues[str.at(0)] = EvalExpression(str.at(0) + "+(" + unWrapVec(vector(str.begin() + 2, str.end())) + ")", variableValues); + else if (str.at(1) == "-=") + variableValues[str.at(0)] = AnyAsFloat(variableValues[str.at(0)]) - AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); + else if (str.at(1) == "*=") + variableValues[str.at(0)] = AnyAsFloat(variableValues[str.at(0)]) * AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); + else if (str.at(1) == "/=") + variableValues[str.at(0)] = AnyAsFloat(variableValues[str.at(0)]) / AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); else - LogWarning("unrecognized operator \'" + str[1] + "\'"); + LogWarning("unrecognized operator \'" + str.at(1) + "\'"); } // Else it is a Vec2. No other complex class can be operated on it's base form (ex. you can't do: Sprite += Sprite) - else if (any_type(variableValues[str[0]]) == 5) + else if (any_type(variableValues[str.at(0)]) == 5) { boost::any otherExpression = EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues); - if (str[1] == "=") - variableValues[str[0]] = otherExpression; - else if (str[1] == "+=") - variableValues[str[0]] = AnyAsVec2(variableValues[str[0]]) + AnyAsVec2(otherExpression); - else if (str[1] == "-=") - variableValues[str[0]] = AnyAsVec2(variableValues[str[0]]) - AnyAsVec2(otherExpression); - else if (str[1] == "*=") - variableValues[str[0]] = AnyAsVec2(variableValues[str[0]]) * AnyAsFloat(otherExpression); - else if (str[1] == "/=") - variableValues[str[0]] = AnyAsVec2(variableValues[str[0]]) / AnyAsFloat(otherExpression); + if (str.at(1) == "=") + variableValues[str.at(0)] = otherExpression; + else if (str.at(1) == "+=") + variableValues[str.at(0)] = AnyAsVec2(variableValues[str.at(0)]) + AnyAsVec2(otherExpression); + else if (str.at(1) == "-=") + variableValues[str.at(0)] = AnyAsVec2(variableValues[str.at(0)]) - AnyAsVec2(otherExpression); + else if (str.at(1) == "*=") + variableValues[str.at(0)] = AnyAsVec2(variableValues[str.at(0)]) * AnyAsFloat(otherExpression); + else if (str.at(1) == "/=") + variableValues[str.at(0)] = AnyAsVec2(variableValues[str.at(0)]) / AnyAsFloat(otherExpression); else - LogWarning("unrecognized operator \'" + str[1] + "\'"); + LogWarning("unrecognized operator \'" + str.at(1) + "\'"); } return 0; } - else if (IsVar(str[0], globalVariableValues)) + else if (IsVar(str.at(0), globalVariableValues)) { // Checks if type is simple, like int or string - if (any_type(globalVariableValues[str[0]]) <= 3) + if (any_type(globalVariableValues[str.at(0)]) <= 3) { - if (str[1] == "=") - globalVariableValues[str[0]] = EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues); - else if (str[1] == "+=") - globalVariableValues[str[0]] = EvalExpression(str[0] + "+(" + unWrapVec(vector(str.begin() + 2, str.end())) + ")", variableValues); - else if (str[1] == "-=") - globalVariableValues[str[0]] = AnyAsFloat(globalVariableValues[str[0]]) - AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); - else if (str[1] == "*=") - globalVariableValues[str[0]] = AnyAsFloat(globalVariableValues[str[0]]) * AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); - else if (str[1] == "/=") - globalVariableValues[str[0]] = AnyAsFloat(globalVariableValues[str[0]]) / AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); + if (str.at(1) == "=") + globalVariableValues[str.at(0)] = EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues); + else if (str.at(1) == "+=") + globalVariableValues[str.at(0)] = EvalExpression(str.at(0) + "+(" + unWrapVec(vector(str.begin() + 2, str.end())) + ")", variableValues); + else if (str.at(1) == "-=") + globalVariableValues[str.at(0)] = AnyAsFloat(globalVariableValues[str.at(0)]) - AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); + else if (str.at(1) == "*=") + globalVariableValues[str.at(0)] = AnyAsFloat(globalVariableValues[str.at(0)]) * AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); + else if (str.at(1) == "/=") + globalVariableValues[str.at(0)] = AnyAsFloat(globalVariableValues[str.at(0)]) / AnyAsFloat(EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues)); else - LogWarning("unrecognized operator \'" + str[1] + "\'"); + LogWarning("unrecognized operator \'" + str.at(1) + "\'"); } // Else it is a Vec2. No other complex class can be operated on it's base form (ex. you can't do: Sprite += Sprite) - else if (any_type(globalVariableValues[str[0]]) == 5) + else if (any_type(globalVariableValues[str.at(0)]) == 5) { boost::any otherExpression = EvalExpression(unWrapVec(vector(str.begin() + 2, str.end())), variableValues); - if (str[1] == "=") - globalVariableValues[str[0]] = otherExpression; - else if (str[1] == "+=") - globalVariableValues[str[0]] = AnyAsVec2(globalVariableValues[str[0]]) + AnyAsVec2(otherExpression); - else if (str[1] == "-=") - globalVariableValues[str[0]] = AnyAsVec2(globalVariableValues[str[0]]) - AnyAsVec2(otherExpression); - else if (str[1] == "*=") - globalVariableValues[str[0]] = AnyAsVec2(globalVariableValues[str[0]]) * AnyAsFloat(otherExpression); - else if (str[1] == "/=") - globalVariableValues[str[0]] = AnyAsVec2(globalVariableValues[str[0]]) / AnyAsFloat(otherExpression); + if (str.at(1) == "=") + globalVariableValues[str.at(0)] = otherExpression; + else if (str.at(1) == "+=") + globalVariableValues[str.at(0)] = AnyAsVec2(globalVariableValues[str.at(0)]) + AnyAsVec2(otherExpression); + else if (str.at(1) == "-=") + globalVariableValues[str.at(0)] = AnyAsVec2(globalVariableValues[str.at(0)]) - AnyAsVec2(otherExpression); + else if (str.at(1) == "*=") + globalVariableValues[str.at(0)] = AnyAsVec2(globalVariableValues[str.at(0)]) * AnyAsFloat(otherExpression); + else if (str.at(1) == "/=") + globalVariableValues[str.at(0)] = AnyAsVec2(globalVariableValues[str.at(0)]) / AnyAsFloat(otherExpression); else - LogWarning("unrecognized operator \'" + str[1] + "\'"); + LogWarning("unrecognized operator \'" + str.at(1) + "\'"); } return 0; } - LogWarning("uninitialized variable or typo in \'" + str[0] + "\'"); + LogWarning("uninitialized variable or typo in \'" + str.at(0) + "\'"); return 1; } boost::any ProcessLine(const vector>& words, int lineNum, unordered_map& variableValues) { - if (words[lineNum][0][0] == '/' && words[lineNum][0][1] == '/') + if (words.at(lineNum).at(0)[0] == '/' && words.at(lineNum).at(0)[1] == '/') return nullType; // If print statement (deprecated, now use SLB.System.Print() function) - else if (words[lineNum][0] == "print") + else if (words.at(lineNum).at(0) == "print") { - cout << StringRaw(AnyAsString(EvalExpression(unWrapVec(vector(words[lineNum].begin() + 1, words[lineNum].end())), variableValues))) << endl; + cout << StringRaw(AnyAsString(EvalExpression(unWrapVec(vector(words.at(lineNum).begin() + 1, words.at(lineNum).end())), variableValues))) << endl; return nullType; } // Check if function return - else if (words[lineNum][0] == "return") - return EvalExpression(unWrapVec(vector(words[lineNum].begin() + 1, words[lineNum].end())), variableValues); + else if (words.at(lineNum).at(0) == "return") + return EvalExpression(unWrapVec(vector(words.at(lineNum).begin() + 1, words.at(lineNum).end())), variableValues); // Check if it is SLB Builtin function - else if (words[lineNum][0][0] == 'S' && words[lineNum][0][1] == 'L' && words[lineNum][0][2] == 'B' && words[lineNum][0][3] == '.') - return EvalExpression(unWrapVec(words[lineNum]), variableValues); + else if (words.at(lineNum).at(0)[0] == 'S' && words.at(lineNum).at(0)[1] == 'L' && words.at(lineNum).at(0)[2] == 'B' && words.at(lineNum).at(0)[3] == '.') + return EvalExpression(unWrapVec(words.at(lineNum)), variableValues); // Check if it is function - else if (IsFunction(trim(split(words[lineNum][0], '(')[0]))) + else if (IsFunction(trim(split(words.at(lineNum).at(0), '(')[0]))) { - if (count(words[lineNum][0], '(') > 0 && count(words[lineNum][0], ')') > 0) - ExecuteFunction(trim(split(words[lineNum][0], '(')[0]), vector()); + if (count(words.at(lineNum).at(0), '(') > 0 && count(words.at(lineNum).at(0), ')') > 0) + ExecuteFunction(trim(split(words.at(lineNum).at(0), '(')[0]), vector()); else - ExecuteFunction(trim(split(words[lineNum][0], '(')[0]), VarValues(split(RMParenthesis("(" + split(unWrapVec(rangeInVec(words[lineNum], 0, (int)words[lineNum].size() - 1)), '(')[1]), ','), variableValues)); + ExecuteFunction(trim(split(words.at(lineNum).at(0), '(')[0]), VarValues(split(RMParenthesis("(" + split(unWrapVec(rangeInVec(words.at(lineNum), 0, (int)words.at(lineNum).size() - 1)), '(')[1]), ','), variableValues)); return nullType; } // Check if global variable declaration - else if (trim(words[lineNum][0]) == "global") + else if (trim(words.at(lineNum).at(0)) == "global") { - globalVariableValues[words[lineNum][2]] = EvalExpression(unWrapVec(slice(words[lineNum], 4, -1)), variableValues); + globalVariableValues[words.at(lineNum).at(2)] = EvalExpression(unWrapVec(slice(words.at(lineNum), 4, -1)), variableValues); return nullType; } // Iterate through all types to see if line inits or // re-inits a variable then store it with it's value - else if (countInVector(types, trim(words[lineNum][0])) > 0) + else if (countInVector(types, trim(words.at(lineNum).at(0))) > 0) { - variableValues[words[lineNum][1]] = EvalExpression(unWrapVec(slice(words[lineNum], 3, -1)), variableValues); + variableValues[words.at(lineNum).at(1)] = EvalExpression(unWrapVec(slice(words.at(lineNum), 3, -1)), variableValues); return nullType; } // Check existing variables: If matches, then it means // the variables value is getting changed with an operator - else if (count(words[lineNum][0], '.') == 0 && (IsVar(words[lineNum][0], variableValues) || IsVar(words[lineNum][0], globalVariableValues))) + else if (count(words.at(lineNum).at(0), '.') == 0 && (IsVar(words.at(lineNum).at(0), variableValues) || IsVar(words.at(lineNum).at(0), globalVariableValues))) { // Evaluates what the operator (ex. '=', '+=') does to the value on the left by the value on the right - varOperation(vector(words[lineNum].begin(), words[lineNum].end()), variableValues); + varOperation(vector(words.at(lineNum).begin(), words.at(lineNum).end()), variableValues); return nullType; } // Check existing variables: To see if class sub component matches - else if (count(words[lineNum][0], '.') > 0 && IsVar(split(words[lineNum][0], '.')[0], variableValues) || IsVar(split(words[lineNum][0], '.')[0], globalVariableValues)) + else if (count(words.at(lineNum).at(0), '.') > 0 && IsVar(split(words.at(lineNum).at(0), '.')[0], variableValues) || IsVar(split(words.at(lineNum).at(0), '.')[0], globalVariableValues)) { - if (IsVar(split(words[lineNum][0], '.')[0], variableValues)) - variableValues[split(words[lineNum][0], '.')[0]] = EditClassSubComponent(variableValues[split(words[lineNum][0], '.')[0]], words[lineNum][1], EvalExpression(unWrapVec(vector(words[lineNum].begin() + 2, words[lineNum].end())), variableValues), split(words[lineNum][0], '.')[1]); - else if (IsVar(split(words[lineNum][0], '.')[0], globalVariableValues)) - globalVariableValues[split(words[lineNum][0], '.')[0]] = EditClassSubComponent(globalVariableValues[split(words[lineNum][0], '.')[0]], words[lineNum][1], EvalExpression(unWrapVec(vector(words[lineNum].begin() + 2, words[lineNum].end())), variableValues), split(words[lineNum][0], '.')[1]); + if (IsVar(split(words.at(lineNum).at(0), '.')[0], variableValues)) + variableValues[split(words.at(lineNum).at(0), '.')[0]] = EditClassSubComponent(variableValues[split(words.at(lineNum).at(0), '.')[0]], words.at(lineNum).at(1), EvalExpression(unWrapVec(vector(words.at(lineNum).begin() + 2, words.at(lineNum).end())), variableValues), split(words.at(lineNum).at(0), '.')[1]); + else if (IsVar(split(words.at(lineNum).at(0), '.')[0], globalVariableValues)) + globalVariableValues[split(words.at(lineNum).at(0), '.')[0]] = EditClassSubComponent(globalVariableValues[split(words.at(lineNum).at(0), '.')[0]], words.at(lineNum).at(1), EvalExpression(unWrapVec(vector(words.at(lineNum).begin() + 2, words.at(lineNum).end())), variableValues), split(words.at(lineNum).at(0), '.')[1]); return nullType; } // Gathers while loop contents - else if (words[lineNum][0] == "while") + else if (words.at(lineNum).at(0) == "while") { vector> whileContents; vector whileParameters; - for (int w = 1; w < (int)words[lineNum].size(); w++) - whileParameters.push_back(words[lineNum][w]); + for (int w = 1; w < (int)words.at(lineNum).size(); w++) + whileParameters.push_back(words.at(lineNum)[w]); int numOfBrackets = 1; for (int p = lineNum + 2; p < (int)words.size(); p++) { - numOfBrackets += countInVector(words[p], "{") - countInVector(words[p], "}"); + numOfBrackets += countInVector(words.at(p), "{") - countInVector(words.at(p), "}"); if (numOfBrackets == 0) break; - whileContents.push_back(words[p]); + whileContents.push_back(words.at(p)); } whileContents = removeTabsWdArry(whileContents, 1); - while (BooleanLogic(whileParameters[0], whileParameters[1], whileParameters[2], variableValues)) + while (BooleanLogic(whileParameters.at(0), whileParameters.at(1), whileParameters.at(2), variableValues)) { //Iterate through all lines in while loop for (int lineNum = 0; lineNum < (int)whileContents.size(); lineNum++) @@ -465,27 +465,27 @@ boost::any ProcessLine(const vector>& words, int lineNum, unorder } // Gathers if statement contents - else if (words[lineNum][0] == "if") + else if (words.at(lineNum).at(0) == "if") { vector> ifContents; vector ifParameters; - for (int w = 1; w < (int)words[lineNum].size(); w++) - ifParameters.push_back(words[lineNum][w]); + for (int w = 1; w < (int)words.at(lineNum).size(); w++) + ifParameters.push_back(words.at(lineNum).at(w)); int numOfBrackets = 1; lineNum += 2; while (lineNum < (int)words.size()) { - numOfBrackets += countInVector(words[lineNum], "{") - countInVector(words[lineNum], "}"); + numOfBrackets += countInVector(words.at(lineNum), "{") - countInVector(words.at(lineNum), "}"); if (numOfBrackets == 0) break; - ifContents.push_back(words[lineNum]); + ifContents.push_back(words.at(lineNum)); lineNum++; } ifContents = removeTabsWdArry(ifContents, 1); - if (BooleanLogic(ifParameters[0], ifParameters[1], ifParameters[2], variableValues)) + if (BooleanLogic(ifParameters.at(0), ifParameters.at(1), ifParameters.at(2), variableValues)) { //Iterate through all lines in if statement for (int l = 0; l < (int)ifContents.size(); l++) @@ -546,7 +546,7 @@ boost::any ExecuteFunction(const string& functionName, const vector& unordered_map variableValues = {}; - std::vector funcArgs = words[0]; // This causes problem in linux + std::vector funcArgs = words.at(0); for (int i = 0; i < (int)inputVarVals.size(); i++) { @@ -570,7 +570,7 @@ boost::any ExecuteFunction(const string& functionName, const vector& } catch (const std::exception&) { - LogCriticalError("\'" + unWrapVec(words[lineNum]) + "\'\n In function: " + functionName + "\n Line: " + to_string(lineNum)); + LogCriticalError("\'" + unWrapVec(words.at(lineNum)) + "\'\n In function: " + functionName + "\n Line: " + to_string(lineNum)); } } return nullType; @@ -586,7 +586,7 @@ int parseSlang(string script) vector lines = split(script, '\n'); vector> words; for (int i = 0; i < (int)lines.size(); i++) - words.push_back(split(lines[i], ' ')); + words.push_back(split(lines.at(i), ' ')); #if DEVELOPER_MESSAGES InterpreterLog("Gather variables & functions..."); @@ -596,20 +596,20 @@ int parseSlang(string script) for (int lineNum = 0; lineNum < (int)words.size(); lineNum++) { //Checks if it is function - if (words[lineNum][0] == "func") + if (words.at(lineNum).at(0) == "func") { vector> functionContents; - string functName = split(words[lineNum][1], '(')[0]; + string functName = split(words.at(lineNum).at(1), '(')[0]; #if DEVELOPER_MESSAGES == true InterpreterLog("Load script function " + functName + "..."); #endif string args = ""; - if (indexInStr(unWrapVec(words[lineNum]), ')') - indexInStr(unWrapVec(words[lineNum]), '(') > 1) - for (int w = 1; w < (int)words[lineNum].size(); w++) // Get all words from the instantiation line: these are the args + if (indexInStr(unWrapVec(words.at(lineNum)), ')') - indexInStr(unWrapVec(words.at(lineNum)), '(') > 1) + for (int w = 1; w < (int)words.at(lineNum).size(); w++) // Get all words from the instantiation line: these are the args { - args += replace(replace(words[lineNum][w], "(", " "), ")", ""); + args += replace(replace(words.at(lineNum).at(w), "(", " "), ")", ""); } args = trim(replace(args, functName + " ", "")); @@ -618,42 +618,41 @@ int parseSlang(string script) int numOfBrackets = 1; for (int p = lineNum + 2; p < (int)words.size(); p++) { - numOfBrackets += countInVector(words[p], "{") - countInVector(words[p], "}"); + numOfBrackets += countInVector(words.at(p), "{") - countInVector(words.at(p), "}"); if (numOfBrackets == 0) break; - functionContents.push_back(removeTabs(words[p], 1)); + functionContents.push_back(removeTabs(words.at(p), 1)); } functionValues[functName] = functionContents; - //cout << functName << " is \n" << Vec2Str(functionContents) << endl << endl; } else { - if (words[lineNum][0] == "string"){ - globalVariableValues[words[lineNum][1]] = StringRaw(words[lineNum][3]); + if (words.at(lineNum).at(0) == "string"){ + globalVariableValues[words.at(lineNum).at(1)] = StringRaw(words.at(lineNum).at(3)); #if DEVELOPER_MESSAGES == true - InterpreterLog("Load script variable " + words[lineNum][1] + "..."); + InterpreterLog("Load script variable " + words.at(lineNum).at(1) + "..."); #endif } - else if (words[lineNum][0] == "int"){ - globalVariableValues[words[lineNum][1]] = stoi(words[lineNum][3]); + else if (words.at(lineNum).at(0) == "int"){ + globalVariableValues[words.at(lineNum).at(1)] = stoi(words.at(lineNum).at(3)); #if DEVELOPER_MESSAGES == true - InterpreterLog("Load script variable " + words[lineNum][1] + "..."); + InterpreterLog("Load script variable " + words.at(lineNum).at(1) + "..."); #endif } - else if (words[lineNum][0] == "float"){ - globalVariableValues[words[lineNum][1]] = stof(words[lineNum][3]); + else if (words.at(lineNum).at(0) == "float"){ + globalVariableValues[words.at(lineNum).at(1)] = stof(words.at(lineNum).at(3)); #if DEVELOPER_MESSAGES == true - InterpreterLog("Load script variable " + words[lineNum][1] + "..."); + InterpreterLog("Load script variable " + words.at(lineNum).at(1) + "..."); #endif } - else if (words[lineNum][0] == "bool"){ - globalVariableValues[words[lineNum][1]] = stob(words[lineNum][3]); + else if (words.at(lineNum).at(0) == "bool"){ + globalVariableValues[words.at(lineNum).at(1)] = stob(words.at(lineNum).at(3)); #if DEVELOPER_MESSAGES == true - InterpreterLog("Load script variable " + words[lineNum][1] + "..."); + InterpreterLog("Load script variable " + words.at(lineNum).at(1) + "..."); #endif } - //else - // LogWarning("unrecognized type \'" + words[lineNum][0] + "\' on line: " + to_string(lineNum)); + /*else + LogWarning("unrecognized type \'" + words.at(lineNum).at(0) + "\' on line: " + to_string(lineNum));*/ } } @@ -724,7 +723,8 @@ int main(int argc, char* argv[]) else { LogWarning("No script provided! Please drag and drop .SLG file over interpreter executable file, or provide it's path as a command-line argument."); - //system("pause"); + cout << "Press Enter to Continue"; + cin.ignore(); exit(1); } diff --git a/Slang/builtin.h b/Slang/builtin.h index 9365041..d9bc11d 100644 --- a/Slang/builtin.h +++ b/Slang/builtin.h @@ -47,12 +47,16 @@ float lerp(float a, float b, float f) int LogWarning(const string& warningText) { - cerr << "\x1B[33mWARNING: " << warningText << "\033[0m\t\t" << endl; + cout << "\x1B[33mWARNING: " << warningText << "\033[0m\t\t" << endl; return 1; } int InterpreterLog(const string& logText) { + int Hour = 0; + int Min = 0; + int Sec = 0; + time_t timer = time(0); tm bt{}; @@ -60,25 +64,24 @@ int InterpreterLog(const string& logText) //localtime_r(&timer, &bt); #elif defined(_MSC_VER) localtime_s(&bt, &timer); + Hour = bt.tm_hour; + Min = bt.tm_min; + Sec = bt.tm_sec; #else static mutex mtx; std::lock_guard lock(mtx); bt = *localtime(&timer); #endif - //int Hour = bt.tm_hour; - //int Min = bt.tm_min; - //int Sec = bt.tm_sec; - int Hour = 0; - int Min = 0; - int Sec = 0; - cout << "\x1B[34m[" + to_string(Hour) + ":" + to_string(Min) + ":" + to_string(Sec) + "] \x1B[33mSlang: \x1B[32m" << logText << "\033[0m\t\t" << endl; return 1; } int LogCriticalError(const string& errorText) { + int Hour = 0; + int Min = 0; + int Sec = 0; time_t timer = time(0); tm bt{}; @@ -86,19 +89,15 @@ int LogCriticalError(const string& errorText) //localtime_r(&timer, &bt); #elif defined(_MSC_VER) localtime_s(&bt, &timer); + Hour = bt.tm_hour; + Min = bt.tm_min; + Sec = bt.tm_sec; #else static mutex mtx; std::lock_guard lock(mtx); bt = *localtime(&timer); #endif - //int Hour = bt.tm_hour; - //int Min = bt.tm_min; - //int Sec = bt.tm_sec; - int Hour = 0; - int Min = 0; - int Sec = 0; - cerr << "\x1B[34m[" + to_string(Hour) + ":" + to_string(Min) + ":" + to_string(Sec) + "] \x1B[33mSlang: \x1B[31mERROR: " << errorText << "\033[0m\t\t" << endl; exit(EXIT_FAILURE); return 2; @@ -179,7 +178,7 @@ int GetBuiltins(std::string s) vector> words; for (int i = 0; i < (int)lines.size(); i++) { - words.push_back(split(lines[i], ' ')); + words.push_back(split(lines.at(i), ' ')); } // Go through entire script and iterate through all types to see if line is a @@ -187,20 +186,20 @@ int GetBuiltins(std::string s) for (int lineNum = 0; lineNum < (int)words.size(); lineNum++) { //Checks if it is function - if (words[lineNum][0] == "func") + if (words.at(lineNum).at(0) == "func") { vector> functionContents; - string functName = split(words[lineNum][1], '(')[0]; + string functName = split(words.at(lineNum).at(1), '(')[0]; #if DEVELOPER_MESSAGES == true InterpreterLog("Load builtin function " + functName + "..."); #endif string args = ""; - for (int w = 1; w < (int)words[lineNum].size(); w++) // Get all words from the instantiation line: these are the args + for (int w = 1; w < (int)words.at(lineNum).size(); w++) // Get all words from the instantiation line: these are the args { - args += replace(replace(words[lineNum][w], "(", " "), ")", ""); + args += replace(replace(words.at(lineNum).at(w), "(", " "), ")", ""); } args = replace(args, functName + " ", ""); @@ -209,42 +208,42 @@ int GetBuiltins(std::string s) int numOfBrackets = 1; for (int p = lineNum + 2; p < (int)words.size(); p++) { - numOfBrackets += countInVector(words[p], "{") - countInVector(words[p], "}"); + numOfBrackets += countInVector(words.at(p), "{") - countInVector(words.at(p), "}"); if (numOfBrackets == 0) break; - functionContents.push_back(removeTabs(words[p], 1)); + functionContents.push_back(removeTabs(words.at(p), 1)); } builtinFunctionValues[functName] = functionContents; //cout << functName << " is \n" << Vec2Str(functionContents) << endl << endl; } else { - if (words[lineNum][0] == "string") + if (words.at(lineNum).at(0) == "string") { - builtinVarVals[words[lineNum][1]] = StringRaw(words[lineNum][3]); + builtinVarVals[words.at(lineNum).at(1)] = StringRaw(words.at(lineNum).at(3)); #if DEVELOPER_MESSAGES == true - InterpreterLog("Load builtin variable " + words[lineNum][1] + "..."); + InterpreterLog("Load builtin variable " + words.at(lineNum).at(1) + "..."); #endif } - else if (words[lineNum][0] == "int") + else if (words.at(lineNum).at(0) == "int") { - builtinVarVals[words[lineNum][1]] = stoi(words[lineNum][3]); + builtinVarVals[words.at(lineNum).at(1)] = stoi(words.at(lineNum).at(3)); #if DEVELOPER_MESSAGES == true - InterpreterLog("Load builtin variable " + words[lineNum][1] + "..."); + InterpreterLog("Load builtin variable " + words.at(lineNum).at(1) + "..."); #endif } - else if (words[lineNum][0] == "float") + else if (words.at(lineNum).at(0) == "float") { - builtinVarVals[words[lineNum][1]] = stof(words[lineNum][3]); + builtinVarVals[words.at(lineNum).at(1)] = stof(words.at(lineNum).at(3)); #if DEVELOPER_MESSAGES == true - InterpreterLog("Load builtin variable " + words[lineNum][1] + "..."); + InterpreterLog("Load builtin variable " + words.at(lineNum).at(1) + "..."); #endif } - else if (words[lineNum][0] == "bool") + else if (words.at(lineNum).at(0) == "bool") { - builtinVarVals[words[lineNum][1]] = stob(words[lineNum][3]); + builtinVarVals[words.at(lineNum).at(1)] = stob(words.at(lineNum).at(3)); #if DEVELOPER_MESSAGES == true - InterpreterLog("Load builtin variable " + words[lineNum][1] + "..."); + InterpreterLog("Load builtin variable " + words.at(lineNum).at(1) + "..."); #endif } //else @@ -259,55 +258,55 @@ int GetBuiltins(std::string s) boost::any SLBFunction(const string& name, const vector& args) { if (name == "SLB.Math.Sin") - return sin(AnyAsFloat(args[0])); + return sin(AnyAsFloat(args.at(0))); else if (name == "SLB.Math.Cos") - return cos(AnyAsFloat(args[0])); + return cos(AnyAsFloat(args.at(0))); else if (name == "SLB.Math.Tan") - return tan(AnyAsFloat(args[0])); + return tan(AnyAsFloat(args.at(0))); else if (name == "SLB.Math.Round") - return AnyAsInt(args[0]); + return AnyAsInt(args.at(0)); else if (name == "SLB.Math.Lerp") - return lerp(AnyAsFloat(args[0]), AnyAsFloat(args[1]), AnyAsFloat(args[2])); + return lerp(AnyAsFloat(args.at(0)), AnyAsFloat(args.at(1)), AnyAsFloat(args.at(2))); else if (name == "SLB.Math.Abs") - return abs(AnyAsFloat(args[0])); + return abs(AnyAsFloat(args.at(0))); else if (name == "SLB.Graphics.Init") { #if DEVELOPER_MESSAGES == true InterpreterLog("Init graphics"); #endif - initGraphics(StringRaw(AnyAsString(args[0])), AnyAsInt(args[1]), AnyAsInt(args[2])); + initGraphics(StringRaw(AnyAsString(args.at(0))), AnyAsInt(args.at(1)), AnyAsInt(args.at(2))); } else if (name == "SLB.Graphics.Sprite") { - Sprite s(StringRaw(AnyAsString(args[0])), any_cast(args[1]), any_cast(args[2]), AnyAsFloat(args[3])); + Sprite s(StringRaw(AnyAsString(args.at(0))), any_cast(args.at(1)), any_cast(args.at(2)), AnyAsFloat(args.at(3))); return s; } else if (name == "SLB.Graphics.Draw") - any_cast(args[0]).Draw(); + any_cast(args.at(0)).Draw(); else if (name == "SLB.Graphics.Load") - any_cast(args[0]).Load(); + any_cast(args.at(0)).Load(); else if (name == "SLB.Graphics.Text") { - Text t(StringRaw(AnyAsString(args[0])), StringRaw(AnyAsString(args[1])), any_cast(args[2]), AnyAsFloat(args[3]), AnyAsFloat(args[4]), (Uint8)AnyAsFloat(args[5]), (Uint8)AnyAsFloat(args[6]), (Uint8)AnyAsFloat(args[7])); + Text t(StringRaw(AnyAsString(args.at(0))), StringRaw(AnyAsString(args.at(1))), any_cast(args.at(2)), AnyAsFloat(args.at(3)), AnyAsFloat(args.at(4)), (Uint8)AnyAsFloat(args.at(5)), (Uint8)AnyAsFloat(args.at(6)), (Uint8)AnyAsFloat(args.at(7))); return t; } else if (name == "SLB.Graphics.DrawText") - any_cast(args[0]).Draw(); + any_cast(args.at(0)).Draw(); else if (name == "SLB.Graphics.LoadText") - any_cast(args[0]).Load(); + any_cast(args.at(0)).Load(); else if (name == "SLB.Physics.AxisAlignedCollision") { - return AxisAlignedCollision(any_cast(args[0]), any_cast(args[1])); + return AxisAlignedCollision(any_cast(args.at(0)), any_cast(args.at(1))); } else if (name == "SLB.Input.GetKey") - return KEYS[StringRaw(any_cast(args[0]))] == 1; + return KEYS[StringRaw(any_cast(args.at(0)))] == 1; else if (name == "SLB.System.Print") - cout << StringRaw(AnyAsString(args[0])); + cout << StringRaw(AnyAsString(args.at(0))); else if (name == "SLB.System.PrintLine") - cout << StringRaw(AnyAsString(args[0])) << endl; + cout << StringRaw(AnyAsString(args.at(0))) << endl; else if (name == "SLB.System.Vec2") { - Vec2 v(AnyAsFloat(args[0]), AnyAsFloat(args[1])); + Vec2 v(AnyAsFloat(args.at(0)), AnyAsFloat(args.at(1))); return v; } else diff --git a/Slang/graphics.h b/Slang/graphics.h index c146242..283504e 100644 --- a/Slang/graphics.h +++ b/Slang/graphics.h @@ -113,9 +113,11 @@ SDL_Renderer* gRenderer = NULL; SDL_Surface* gScreenSurface = NULL; bool running = true; -bool buttons[4] = {}; float dt = 0.0f; +float clamp(float v, float min, float max); + + SDL_Surface* loadSurface(std::string path) { //The final optimized image @@ -529,14 +531,10 @@ class Text int Load() { - cout << "Load" << endl; SDL_Color color = { r, g, b }; SDL_Surface* surface = TTF_RenderText_Solid(font, content.c_str(), color); - //if(texture != NULL) - // SDL_DestroyTexture(texture); - cout << "Loaded" << endl; texture = SDL_CreateTextureFromSurface(gRenderer, surface); TTF_SizeText(font, content.c_str(), &rect.w, &rect.h); @@ -1014,7 +1012,7 @@ int updateLoop() // Calculate frame time auto stopTime = std::chrono::high_resolution_clock::now(); dt = std::chrono::duration(stopTime - startTime).count() / 1000.0f; - + dt = clamp(dt, 0, 1000); } return 0; }