Skip to content

Commit

Permalink
Merge branch 'main' into tbshotgun_fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
GeckoEidechse authored Jun 22, 2024
2 parents 29334ef + 8037da5 commit d230c45
Show file tree
Hide file tree
Showing 9 changed files with 441 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -312,5 +312,69 @@ Drücke Ja, um zuzustimmen. Du kannst diese Entscheidung jederzeit im Modmenü
"UNSUPPORTED_VERSION" "Die Version die du benutzt ist nicht länger unterstützt"
"SNS_LEADER_BANKRUPT_SUB" "%s1 Wurde Von %s2 Zurückgesetzt"
"SNS_BANKRUPT_SUB" "Dein Punkestand wurde von %s1 zurückgesetzt"
"respawnprotection" "Respawn Schutzdauer"
"SNS_BANKRUPT" "Bankrott!"
"SNS_LEADER_BANKRUPT" "Punktzahlführer Bankrott!"
"sns_reset_pulse_blade_cooldown_on_pulse_blade_kill" "Kill Cooldown Zurücksetzungen"
"player_force_respawn" "Erzwungener Respawn"
"SHOW_ONLY_NOT_REQUIRED" "Nur optionale Mods"
"SHOW_ONLY_REQUIRED" "Nur notwendige Mods"
"PROGRESSION_TOGGLE_DISABLED_HEADER" "Fortschritt aktivieren?"
"TOGGLE_PROGRESSION" "Fortschritt zuschalten"
"PROGRESSION_TOGGLE_ENABLED_HEADER" "Fortschritt deaktivieren?"
"PROGRESSION_TOGGLE_ENABLED_BODY" "Titans, Waffen, Fraktionen, Skins, usw werden freigeschaltet und sind zu jeder Zeit verfügbar .\n\nDies kann in der Mehrspielerlobby zu jedem Zeitpunkt geändert werden."
"MATCH_COUNTDOWN_LENGTH" "Countdown für privates Match"
"LOG_UNKNOWN_CLIENTCOMMANDS" "Unbekannte Clientbefehle loggen"
"DISALLOWED_TACTICALS" "Verbotene Taktiken"
"TACTICAL_REPLACEMENT" "Taktischer Austausch"
"AUTHENTICATION_FAILED_HEADER" "Authentifizierung fehlgeschlagen"
"AUTHENTICATION_FAILED_BODY" "Authentifizierung mit Atlas fehlgeschlagen!"
"AUTHENTICATION_FAILED_ERROR_CODE" "Fehlercode: ^DB6F2C00%s1^"
"AUTHENTICATION_FAILED_HELP" "Hilfe"
"NORTHSTAR_BASE_SETTINGS" "Northstar Grundeinstellungen"
"ONLY_HOST_MATCH_SETTINGS" "Nur der Host kann die Einstellungen eines privaten Matches ändern"
"ONLY_HOST_CAN_START_MATCH" "Nur der Host kann das Match starten"
"MISSING_MOD" "Fehlender Mod \"%s1\" v%s2"
"MOD_DL_DISABLED" "(automatisches Herunterladen ist deaktiviert)"
"DOWNLOADING_MOD_TITLE" "Lade Mod herunter"
"DOWNLOADING_MOD_TITLE_W_PROGRESS" "Lade Mod (%s1%)"
"DOWNLOADING_MOD_TEXT" "Lade %s1 v%s2..."
"DOWNLOADING_MOD_TEXT_W_PROGRESS" "Lade %s1 v%s2...\n(%s3/%s4 MB)"
"CHECKSUMING_TITLE" "Überprüfe Mod Prüfsumme"
"MOD_NOT_VERIFIED" "(mod ist nicht verifiziert und kann nicht automatisch herunterladen werden)"
"MOD_REQUIRED_WARNING" " : Dieser Mod könnte Sie (un)ausgestattet hinterlassen, sobald Sie einem Server beitreten"
"MOD_SETTINGS" "Mod Einstellungen"
"DISALLOWED_WEAPONS" "Verbotene Waffen"
"REPLACEMENT_WEAPON" "Austausch Waffen"
"SHOULD_RETURN_TO_LOBBY" "Zur Lobby nach Matchende zurückkehren"
"ARE_YOU_SURE" "Sind Sie sich sicher?"
"MOD_SETTINGS_SERVER" "Server"
"MOD_SETTINGS_RESET" "Zurücksetzen"
"MOD_SETTINGS_RESET_ALL" "Alles zurücksetzen"
"NO_RESULTS" "Keine Ergebnisse."
"NO_MODS" "Keine Einstellungen verfügbar! Installieren sie weitere Mods über^5588FF00northstar.thunderstore.io^0."
"PROGRESSION_ENABLED_HEADER" "Fortschritt aktiviert!"
"PROGRESSION_DISABLED_HEADER" "Fortschritt deaktiviert!"
"WILL_RESET_ALL_SETTINGS" "Dadurch werden ALLE Einstellungen, die zu dieser Kategorie gehören, zurückgesetzt.\n\nDies kann nicht rückgängig gemacht werden."
"WILL_RESET_SETTING" "Dies setzten die Einstellungen %s1 auf deren Ursprungeswert zurück.\n\nDies kann nicht rückgängig gemacht werden."
"Y_BUTTON_TOGGLE_PROGRESSION" "%[Y_BUTTON|]% Fortschritt zuschalten."
"PROGRESSION_TOGGLE_DISABLED_BODY" "Titans, Waffen, Fraktionen, Skins usw. müssen durch Levelaufstieg freigeschaltet oder mit Verdiensten gekauft werden.\n\nDies kann jederzeit in der Mehrspieler-Lobby geändert werden.\n\n^CC000000Warnung: Wenn Sie derzeit ausgerüstete Gegenstände besitzen, die Sie nicht freigeschaltet haben, werden diese zurückgesetzt!"
"PROGRESSION_ENABLED_BODY" "^CCCC0000Fortschritt wurde aktiviert.^\n\nTitans, Waffen, Fraktionen, Skins usw. müssen durch Levelaufstieg freigeschaltet oder mit Verdiensten gekauft werden.\n\nDies kann jederzeit in der Mehrspieler-Lobby geändert werden."
"PROGRESSION_DISABLED_BODY" "^CCCC0000Fortschritt wurde deaktiviert.^\n\nTitans, Waffen, Fraktionen, Skins usw. werden alle freigeschaltet und jederzeit nutzbar sein.\n\nDies kann jederzeit in der Mehrspieler-Lobby geändert werden."
"CHECKSUMING_TEXT" "Verifiziere Inhalte von %s1 v%s2..."
"EXTRACTING_MOD_TITLE" "Extrahiere Mod (%s1%)"
"EXTRACTING_MOD_TEXT" "Extrahiere %s1 v%s2...\n(%s3/%s4 MB)"
"FAILED_DOWNLOADING" "Herunterladen der Mod fehlgeschlagen"
"FAILED_READING_ARCHIVE" "Während des Lesens der Mod Archivs ist ein Fehler aufgetreten."
"FAILED_WRITING_TO_DISK" "Während des Extrahierens der Mod in das Dateisysteme ist ein Fehler aufgetreten."
"WRONG_MOD_VERSION" "Der Server verfügt über Mod \"%s1\" v%s2 während Sie v%s3 haben"
"MOD_FETCHING_FAILED" "Mod Archiv konnte nicht von Thunderstore heruntergeladen werden."
"MOD_CORRUPTED" "Prüfsumme des heruntergeladenen Archivs stimmt nicht mit der verifizierten Signatur überein."
"NO_DISK_SPACE_AVAILABLE" "Sie verfügen nicht über ausreichend Speicherplatz auf ihrer Festplatte."
"MOD_FETCHING_FAILED_GENERAL" "Mod Extraktion fehlgeschlagen. Überprüfen Sie die Logs für weitere Details."
"gg_assist_reward" "Assist Anteilige Belohnung"
"SCOREBOARD_BANKRUPTS" "Bankrott Kills"
"sns_offhand_kill_value" "Freihand Killwert"
"PROGRESSION_ANNOUNCEMENT_BODY" "^CCCC0000Fortschritt kann jetzt aktiviert werden!^\n\nNorthstar unterstützt nun den standardmäßigen Fortschritt, was bedeutet, dass Sie Waffen, Skins, Titans usw. durch Levelaufstieg und das Abschließen von Herausforderungen freischalten können.\n\nSie können den Fortschritt mit dem Button am unteren Rand des Lobbybildschirms aktivieren.\n\nDies kann jederzeit geändert werden."
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -352,5 +352,6 @@ Presiona Sí al estar de acuerdo. Esta opcion se puede cambiar en el menú de mo
"WILL_RESET_SETTING" "Ésta acción reiniciará %s1 a su valor por defecto.\n\nNo se podrá revertir el proceso."
"PROGRESSION_ANNOUNCEMENT_BODY" "^CCCC0000El progreso puede ser habilitado desde ahora^\n\nNorthstar ahora es compatible con el progreso normal del juego, esto significa que puedes elegir desbloquear Armas, Aspectos, Titanes y otros a través de desafíos y subiendo de nivel.\n\nPuedes habilitar el progreso normal del juego en la opción ubicada al final de la pantalla de la sala de espera.\n\nÉsta opción puede ser cambiada en cualquier momento."
"player_force_respawn" "Reaparición Forzada"
"MOD_REQUIRED_WARNING" " : Esta modificacion puede ser desactivada al entrar a un servidor"
}
}
13 changes: 13 additions & 0 deletions Northstar.Custom/mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,19 @@
"Path": "sh_northstar_safe_io.gnut",
"RunOn": "CLIENT || SERVER || UI"
},
{
"Path": "_testing.nut",
"RunOn": "CLIENT || SERVER || UI",
"ClientCallback": {
"Before": "Testing_Init"
},
"ServerCallback": {
"Before": "Testing_Init"
},
"UICallback": {
"Before": "Testing_Init"
}
},
{
"Path": "_event_models.gnut",
"RunOn": "SERVER && LOBBY",
Expand Down
302 changes: 302 additions & 0 deletions Northstar.Custom/mod/scripts/vscripts/_testing.nut
Original file line number Diff line number Diff line change
@@ -0,0 +1,302 @@
global function Testing_Init
global function RunAllTests
global function RunAllTests_SaveToFile
global function RunTestsByCategory
global function RunTestByCategoryAndName

global function AddTest

struct TestInfo
{
string testName
var functionref() callback
// whether the test completed successfully
// if this is true, actualResult is valid
bool completed
// var not string because then i can just set it to an exception
// which print can then handle
var error
// whether the test is considered successful
var expectedResult
var actualResult
bool passed
}

struct {
table< string, array< TestInfo > > tests = {}
} file

void function Testing_Init()
{
// tests for the testing functions :)
//AddTest( "Example Tests", "example succeeding test", ExampleTest_ReturnsTrue, true )
//AddTest( "Example Tests", "example failing test", ExampleTest_ReturnsFalse, true )
//AddTest( "Example Tests", "example erroring test", ExampleTest_ThrowsError, true )
//AddTest( "Example Tests", "example test with args", var function() {
// return ExampleTest_HasArgs_ReturnsNonVar( 2, 3 )
//}, 6 )
}

int function ExampleTest_HasArgs_ReturnsNonVar( int first, int second )
{
return first * second
}

var function ExampleTest_ReturnsFalse()
{
return false
}

var function ExampleTest_ReturnsTrue()
{
return true
}

var function ExampleTest_ThrowsError()
{
throw "Example exception"
return null
}

void function RunAllTests_SaveToFile()
{
RunAllTests()

#if UI
string fileName = "ns-unit-tests-UI.json"
#elseif CLIENT
string fileName = "ns-unit-tests-CLIENT.json"
#elseif SERVER
string fileName = "ns-unit-tests-SERVER.json"
#endif

// cant encode structs so have to reconstruct a table manually from the structs
table out = {}
foreach ( category, tests in file.tests )
{
array categoryResults = []
foreach ( test in tests )
{
table testTable = {}
testTable[ "name" ] <- test.testName
testTable[ "completed" ] <- test.completed
testTable[ "passed" ] <- test.passed
if ( !test.completed )
testTable[ "error" ] <- test.error
else if ( !test.passed )
{
testTable[ "expectedResult" ] <- test.expectedResult
testTable[ "actualResult" ] <- test.actualResult
}

categoryResults.append( testTable )
}
out[ category ] <- categoryResults
}

NSSaveJSONFile( fileName, out )
}

void function RunAllTests()
{
printt( "Running all tests!" )

foreach ( category, categoryTests in file.tests )
{
foreach ( test in categoryTests )
{
RunTest( test )
}
}

PrintAllTestResults()
}

void function RunTestsByCategory( string category )
{
if ( !( category in file.tests ) )
{
printt( format( "Category '%s' has no tests registered", category ) )
return
}

foreach ( categoryTest in file.tests[ category ] )
{
RunTest( categoryTest )
}
}

void function RunTestByCategoryAndName( string category, string testName )
{
// find test
if ( !( category in file.tests ) )
{
printt( format( "Category '%s' has no tests registered", category ) )
return
}

TestInfo ornull foundTest = null
foreach ( categoryTest in file.tests[ category ] )
{
if ( categoryTest.testName == testName )
{
foundTest = categoryTest
break
}
}

if ( !foundTest )
{
printt( format( "Category '%s' does not contain a test with name '%s'", category, testName ) )
return
}

expect TestInfo( foundTest )

printt( "Running test!" )
// run test
RunTest( foundTest )
// print result
PrintTestResult( foundTest )
}

void function RunTest( TestInfo test )
{
test.completed = false
test.passed = false
test.actualResult = null
test.error = ""

try
{
test.actualResult = test.callback()
test.completed = true
test.passed = test.actualResult == test.expectedResult
}
catch ( exception )
{
test.completed = false
test.error = exception
}
}

void function PrintAllTestResults()
{
int totalSucceeded = 0
int totalFailed = 0
int totalErrored = 0

foreach ( category, categoryTests in file.tests )
{
int categorySucceeded = 0
int categoryFailed = 0
int categoryErrored = 0

printt( format( "Results for category: '%s'", category ) )
foreach ( test in categoryTests )
{
if ( test.completed )
{
if ( test.passed )
{
printt( "\t", test.testName, "- Passed!" )
categorySucceeded++
}
else
{
printt( "\t", test.testName, "- Failed!" )
printt( "\t\tExpected:", test.expectedResult )
printt( "\t\tActual: ", test.actualResult )
categoryFailed++
}
}
else
{
printt( "\t", test.testName, "- Errored!" )
printt( "\t\tError:", test.error )
categoryErrored++
}
}

printt( "Succeeded:", categorySucceeded, "Failed:", categoryFailed, "Errored:", categoryErrored )

totalSucceeded += categorySucceeded
totalFailed += categoryFailed
totalErrored += categoryErrored
}

printt( "TOTAL SUCCEEDED:", totalSucceeded, "TOTAL FAILED:", totalFailed, "TOTAL ERRORED:", totalErrored )
}

void function PrintCategoryResults( string category )
{
int categorySucceeded = 0
int categoryFailed = 0
int categoryErrored = 0

printt( format( "Results for category: '%s'", category ) )
foreach ( test in file.tests[ category ] )
{
if ( test.completed )
{
if ( test.passed )
{
printt( "\t", test.testName, "- Passed!" )
categorySucceeded++
}
else
{
printt( "\t", test.testName, "- Failed!" )
printt( "\t\tExpected:", test.expectedResult )
printt( "\t\tActual: ", test.actualResult )
categoryFailed++
}
}
else
{
printt( "\t", test.testName, "- Errored!" )
printt( "\t\tError:", test.error )
categoryErrored++
}
}

printt( "Succeeded:", categorySucceeded, "Failed:", categoryFailed, "Errored:", categoryErrored )
}

void function PrintTestResult( TestInfo test )
{
string resultString = test.testName

if ( test.completed )
{
if ( test.passed )
resultString += " - Passed!"
else
{
resultString += " - Failed!"
resultString += "\n\tExpected: " + test.expectedResult
resultString += "\n\tActual: " + test.actualResult
}
}
else
{
resultString += " - Not completed!"
resultString += "\n\tError: " + test.error
}

printt( resultString )
}

void function AddTest( string testCategory, string testName, var functionref() testFunc, var expectedResult )
{
TestInfo newTest
newTest.testName = testName
newTest.callback = testFunc
newTest.expectedResult = expectedResult

// create the test category if it doesn't exist
if ( !( testCategory in file.tests ) )
file.tests[ testCategory ] <- [ newTest ]
else
file.tests[ testCategory ].append( newTest )
}
Loading

0 comments on commit d230c45

Please sign in to comment.