Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of LCKRL v2.1.1
BepInEx/plugins/Asta-LCKRL/LCKRL.dll
Decompiled a day ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Cryptography; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using BepInEx; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LCKR.Patches; using Microsoft.CodeAnalysis; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.SceneManagement; using UnityEngine.UI; using UnityEngine.Video; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("RadiationIsCool")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("RadiationIsCool")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("8ee335db-0cbe-470c-8fbc-69263f01b35a")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: IgnoresAccessChecksTo("0Harmony")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("BepInEx")] [assembly: IgnoresAccessChecksTo("BepInEx.Harmony")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")] [assembly: IgnoresAccessChecksTo("UnityEngine.UI")] [assembly: IgnoresAccessChecksTo("UnityEngine.UnityWebRequestModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.VideoModule")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } public static class Const { public const int ImageDiv = 16; public const int ImageCompareSize = 64; } namespace LCKR { [BepInPlugin("asta.light.LCKR", "LCKR", "2.1.1")] public class Plugin : BaseUnityPlugin { private const string modGUID = "asta.light.LCKR"; private const string modName = "LCKR"; public const string modVersion = "2.1.1"; public static string modVerType = "b"; private readonly Harmony harmony = new Harmony("asta.light.LCKR"); private static Plugin Instance; public static ManualLogSource mls; public static AssetBundle Bundle; public static TMP_FontAsset font3270_HUDIngame; public static TMP_FontAsset font3270_HUDIngame_Variant; public static TMP_FontAsset font3270_HUDIngameB; public static TMP_FontAsset font3270_Regular_SDF; public static TMP_FontAsset font3270_b; public static TMP_FontAsset font3270_DialogueText; public static TMP_FontAsset fontEdunline; public static TMP_FontAsset fontAds; public static VideoClip snareKorean; public static bool fullyKoreanMoons; public static GameObject resetPanel; public static bool patchFont; public static bool toKG; public static bool toCelsius; public static bool showVersion; public static bool versionChanged; public static string deathText; public static string quotaReached; public static string firedText; public static string sellText; public static string injuryText; public static string systemOnlineText; public static string allDead1; public static string allDead2; public static string autoTakeoff1; public static string autoTakeoff2; public static string midnightWarning; public static string PluginDirectory; public static string TranslationFilePath; public static string DefTranslationFilePath; private void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = this; } PluginDirectory = ((BaseUnityPlugin)this).Info.Location; string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Config.ConfigFilePath); TranslationFilePath = Path.Combine(directoryName, "LCKR_Translation"); DefTranslationFilePath = Path.Combine(TranslationFilePath, "Default"); mls = Logger.CreateLogSource("asta.light.LCKR"); LoadAssets(); TextureReplacer.Setup(); TranslationManager.Setup(); patchFont = ((BaseUnityPlugin)this).Config.Bind<bool>("폰트", "폰트 변경", true, "기본값은 true입니다.\nFontPatcher 등 외부 폰트 모드를 사용하려면 이 값을 false로 설정하세요. false로 설정하면 본 모드에서 폰트를 변경하지 않습니다.").Value; showVersion = ((BaseUnityPlugin)this).Config.Bind<bool>("일반", "버전 표시", true, "기본값은 true입니다.\ntrue로 설정하면 메인 화면에 모드의 버전을 표시합니다..").Value; toKG = ((BaseUnityPlugin)this).Config.Bind<bool>("번역", "KG으로 표기", false, "기본값은 false입니다.\ntrue로 설정하면 무게 수치를 kg으로 변환/표기합니다.").Value; toCelsius = ((BaseUnityPlugin)this).Config.Bind<bool>("번역", "섭씨로 표기", false, "기본값은 false입니다.\ntrue로 설정하면 온도를 섭씨로 변환/표기합니다.").Value; string path = Path.Combine(Paths.ConfigPath, "lckrVersion.txt"); if (File.Exists(path)) { string text = File.ReadAllText(path); if (text != "2.1.1") { ((BaseUnityPlugin)this).Logger.LogInfo((object)("버전 변경됨: " + text + " -> 2.1.1")); versionChanged = true; } } else { versionChanged = true; } File.WriteAllText(path, "2.1.1"); mls.LogInfo((object)"LCKR is loaded"); mls.LogInfo((object)("base.Config.ConfigFilePath: " + ((BaseUnityPlugin)this).Config.ConfigFilePath)); Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null); } private void LoadAssets() { try { Bundle = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(PluginDirectory), "lckorean")); } catch (Exception ex) { mls.LogError((object)("Couldn't load asset bundle: " + ex.Message)); return; } try { font3270_HUDIngame = Bundle.LoadAsset<TMP_FontAsset>("3270-HUDIngame.asset"); font3270_HUDIngame_Variant = Bundle.LoadAsset<TMP_FontAsset>("3270-HUDIngame - Variant.asset"); font3270_HUDIngameB = Bundle.LoadAsset<TMP_FontAsset>("3270-HUDIngameB.asset"); font3270_Regular_SDF = Bundle.LoadAsset<TMP_FontAsset>("3270-Regular SDF.asset"); font3270_b = Bundle.LoadAsset<TMP_FontAsset>("b.asset"); font3270_DialogueText = Bundle.LoadAsset<TMP_FontAsset>("DialogueText.asset"); fontEdunline = Bundle.LoadAsset<TMP_FontAsset>("edunline SDF.asset"); fontAds = Bundle.LoadAsset<TMP_FontAsset>("HakgyoansimMalgeunnalB SDF.asset"); snareKorean = Bundle.LoadAsset<VideoClip>("SnareFleaTipChannel2.m4v"); resetPanel = Bundle.LoadAsset<GameObject>("LCKRComponent.prefab"); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Successfully loaded assets!"); } catch (Exception ex2) { ((BaseUnityPlugin)this).Logger.LogError((object)("Couldn't load assets: " + ex2.Message)); } } private void ReplaceImageFile() { string location = Assembly.GetExecutingAssembly().Location; string directoryName = Path.GetDirectoryName(location); string text = "example.png"; string text2 = Path.Combine(directoryName, text); if (!File.Exists(text2)) { ((BaseUnityPlugin)this).Logger.LogError((object)("이미지 파일이 " + text2 + "에 없습니다.")); return; } string text3 = Path.Combine("게임_이미지_파일_경로", text); if (!File.Exists(text3)) { ((BaseUnityPlugin)this).Logger.LogError((object)("게임 내 이미지 파일이 " + text3 + "에 없습니다.")); return; } try { File.Copy(text2, text3, overwrite: true); ((BaseUnityPlugin)this).Logger.LogInfo((object)("이미지 파일 " + text + "이 " + text3 + "에 성공적으로 덮어쓰기되었습니다.")); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("이미지 파일 덮어쓰기 중 오류 발생: " + ex.Message)); } } } public static class MyPluginInfo { public const string PLUGIN_GUID = "LCKRL"; public const string PLUGIN_NAME = "LCKRL"; public const string PLUGIN_VERSION = "2.1.1"; } } namespace LCKR.Patches { [HarmonyPatch(typeof(EntranceTeleport))] internal class EntranceTeleportPatch { } [HarmonyPatch(typeof(GameNetworkManager))] internal class GameNetworkManagerPatch { } [HarmonyPatch(typeof(GrabbableObject))] internal class GrabbableObjectPatch { } [HarmonyPatch(typeof(HUDManager))] internal class HUDManagerPatch { private static readonly FieldInfo forceChangeTextCoroutineField = AccessTools.Field(typeof(HUDManager), "forceChangeTextCoroutine"); private static readonly MethodInfo forceChangeTextMethod = AccessTools.Method(typeof(HUDManager), "ForceChangeText", (Type[])null, (Type[])null); private string amPM; private string newLine; [HarmonyPostfix] [HarmonyPatch("Start")] private static void Start_Postfix(ref PlayerLevel[] ___playerLevels) { //IL_0054: Unknown result type (might be due to invalid IL or missing references) PlayerLevel[] array = ___playerLevels; foreach (PlayerLevel val in array) { val.levelName = TranslationManager.GetArrayTranslation("PlayerLevel", val.levelName); } ((TMP_Text)HUDManager.Instance.planetRiskLevelText).transform.localPosition = new Vector3(336.5525f, 274.1743f, -74f); } private static void TranslateAdvertText(HUDManager __instance) { TextMeshProUGUI advertTopText = __instance.advertTopText; TextMeshProUGUI advertBottomText = __instance.advertBottomText; if (!((TMP_Text)advertTopText).text.Contains("<size=35>")) { ((TMP_Text)advertTopText).text = TranslationManager.ReplaceArrayText(((TMP_Text)advertTopText).text, "Item", ((TMP_Text)advertTopText).text); ((TMP_Text)advertTopText).text = "<size=35>" + ((TMP_Text)advertTopText).text; } if (!((TMP_Text)advertBottomText).text.Contains("<size=35>")) { ((TMP_Text)advertBottomText).text = "<size=35>" + ((TMP_Text)advertBottomText).text; ((TMP_Text)advertBottomText).text = TranslationManager.ReplaceArrayText(((TMP_Text)advertBottomText).text, "HUD", "OFF"); ((TMP_Text)advertBottomText).text = TranslationManager.ReplaceArrayText(((TMP_Text)advertBottomText).text, "HUD", "AVAILABLE NOW"); ((TMP_Text)advertBottomText).text = TranslationManager.ReplaceArrayText(((TMP_Text)advertBottomText).text, "HUD", "CURES CANCER"); ((TMP_Text)advertBottomText).text = TranslationManager.ReplaceArrayText(((TMP_Text)advertBottomText).text, "HUD", "NO WAY"); ((TMP_Text)advertBottomText).text = TranslationManager.ReplaceArrayText(((TMP_Text)advertBottomText).text, "HUD", "LIMITED TIME ONLY"); ((TMP_Text)advertBottomText).text = TranslationManager.ReplaceArrayText(((TMP_Text)advertBottomText).text, "HUD", "GET YOURS TODAY"); } } [HarmonyPostfix] [HarmonyPatch("Update")] private static void Update_Postfix(HUDManager __instance, ref TextMeshProUGUI ___weightCounter, ref Animator ___weightCounterAnimator, ref TextMeshProUGUI ___holdButtonToEndGameEarlyText, ref TextMeshProUGUI ___holdButtonToEndGameEarlyVotesText) { if (GameNetworkManager.Instance.gameVersionNum >= 70) { TranslateAdvertText(__instance); } ((TMP_Text)___holdButtonToEndGameEarlyText).text = TranslationManager.ReplaceArrayTextAll(((TMP_Text)___holdButtonToEndGameEarlyText).text, "HUD"); if (!GameNetworkManager.Instance.localPlayerController.isPlayerDead) { if (Plugin.toKG) { float num = Mathf.RoundToInt(Mathf.Clamp(GameNetworkManager.Instance.localPlayerController.carryWeight - 1f, 0f, 100f) * 105f / 2.2f); ((TMP_Text)___weightCounter).text = $"{num}kg"; ___weightCounterAnimator.SetFloat("weight", num / 130f); } else { float num2 = Mathf.RoundToInt(Mathf.Clamp(GameNetworkManager.Instance.localPlayerController.carryWeight - 1f, 0f, 100f) * 105f); ((TMP_Text)___weightCounter).text = $"{num2} lb"; ___weightCounterAnimator.SetFloat("weight", num2 / 130f); } } } [HarmonyPrefix] [HarmonyPatch("DisplaySpectatorTip")] private static void DisplaySpectatorTip_Postfix(string tipText, ref TextMeshProUGUI ___spectatorTipText) { string arrayTranslation = TranslationManager.GetArrayTranslation("HUD", "TipMouse"); if (StartOfRound.Instance.localPlayerUsingController) { arrayTranslation = TranslationManager.GetArrayTranslation("HUD", "TipController"); } ((TMP_Text)___spectatorTipText).text = arrayTranslation; } [HarmonyPostfix] [HarmonyPatch("DisplayStatusEffect")] private static void DisplayStatusEffect_Postfix(string statusEffect, ref TextMeshProUGUI ___statusEffectText) { if (statusEffect == "VISIBILITY LOW!\n\nSteam leak detected in area") { ((TMP_Text)___statusEffectText).text = TranslationManager.GetArrayTranslation("HUD", "SteamLeakDetected") + "\n\n" + TranslationManager.GetArrayTranslation("HUD", "SteamLeakDetected", 1) + "\n" + TranslationManager.GetArrayTranslation("HUD", "SteamLeakDetected", 2); } else if (statusEffect.Contains("Oxygen")) { ((TMP_Text)___statusEffectText).text = TranslationManager.GetArrayTranslation("HUD", "OxygenLow"); } else if (statusEffect.Contains("HEALTH RISK!")) { ((TMP_Text)___statusEffectText).text = TranslationManager.GetArrayTranslation("HUD", "HealthRisk") + "\n" + TranslationManager.GetArrayTranslation("HUD", "HealthRisk", 1) + "\n" + TranslationManager.GetArrayTranslation("HUD", "HealthRisk", 2); } else if (statusEffect.Contains("HIGH FEVER DETECTED!") && statusEffect.Contains("REACHING")) { string text = ((TMP_Text)___statusEffectText).text; string text2 = text; if (Plugin.toCelsius) { text2 = Regex.Replace(text, "-?\\d+(\\.\\d+)?", delegate(Match match) { float num = float.Parse(match.Value); float num2 = (num - 32f) * 5f / 9f; return Mathf.RoundToInt(num2).ToString(); }).Replace("°F", "°C"); ((TMP_Text)___statusEffectText).text = text2; } ((TMP_Text)___statusEffectText).text = ((TMP_Text)___statusEffectText).text.Replace("HIGH FEVER DETECTED!", TranslationManager.GetArrayTranslation("HUD", "HighFever")); ((TMP_Text)___statusEffectText).text = ((TMP_Text)___statusEffectText).text.Replace("REACHING", TranslationManager.GetArrayTranslation("HUD", "HighFever", 1)); ((TMP_Text)___statusEffectText).text = text2; } else if (statusEffect.Contains("HIGH FEVER DETECTED!!!")) { TextMeshProUGUI obj = ___statusEffectText; string text3 = (((TMP_Text)___statusEffectText).text = TranslationManager.GetArrayTranslation("HUD", "HighFever2") + "\n\n" + TranslationManager.GetArrayTranslation("HUD", "HighFever2", 1) + "\n\n" + TranslationManager.GetArrayTranslation("HUD", "HighFever2", 2)); ((TMP_Text)obj).text = text3; } } [HarmonyPostfix] [HarmonyPatch("SetSpectatingTextToPlayer")] private static void SetSpectatingTextToPlayer_Postfix(ref TextMeshProUGUI ___spectatingPlayerText) { ((TMP_Text)___spectatingPlayerText).text = TranslationManager.ReplaceArrayText(((TMP_Text)___spectatingPlayerText).text, "HUD", "Spectating"); } [HarmonyPostfix] [HarmonyPatch("ApplyPenalty")] private static void ApplyPenalty_Postfix(ref EndOfGameStatUIElements ___statsUIElements) { TMP_Text penaltyAddition = (TMP_Text)(object)___statsUIElements.penaltyAddition; penaltyAddition.text = TranslationManager.ReplaceArrayText(penaltyAddition.text, "HUD", " casualties"); penaltyAddition.text = TranslationManager.ReplaceArrayText(penaltyAddition.text, "HUD", " bodies recovered"); } [HarmonyPrefix] [HarmonyPatch("ReadDialogue")] private static void ReadDialogue_Prefix(DialogueSegment[] dialogueArray) { foreach (DialogueSegment val in dialogueArray) { val.speakerText = TranslationManager.GetArrayTranslation("Dialogue", val.speakerText); float shipLeaveAutomaticallyTime = TimeOfDay.Instance.shipLeaveAutomaticallyTime; if (val.bodyText == "AM. A vote has been cast") { val.bodyText = TranslationManager.GetArrayTranslation("Dialogue", "ReturnAM").Replace("{time}", GetClockTimeFormatted(shipLeaveAutomaticallyTime, TimeOfDay.Instance.numberOfHours, createNewLine: false)); } else if (val.bodyText == "PM. A vote has been cast") { val.bodyText = TranslationManager.GetArrayTranslation("Dialogue", "ReturnPM").Replace("{time}", GetClockTimeFormatted(shipLeaveAutomaticallyTime, TimeOfDay.Instance.numberOfHours, createNewLine: false)); } else { val.bodyText = TranslationManager.GetArrayTranslation("Dialogue", val.bodyText); } } } public static string GetClockTimeFormatted(float timeNormalized, float numberOfHours, bool createNewLine = true) { int num = (int)(timeNormalized * (60f * numberOfHours)) + 360; int num2 = (int)Mathf.Floor((float)(num / 60)); string text = (createNewLine ? "\n" : " "); if (num2 >= 24) { return "오전" + text + "12:00"; } string text2 = ((num2 >= 12) ? "오후" : "오전"); if (num2 > 12) { num2 %= 12; } int num3 = num % 60; string text3 = $"{num2:00}:{num3:00}".TrimStart('0'); return text2 + text + text3; } [HarmonyPostfix] [HarmonyPatch("DisplayTip")] private static void DisplayTip_Postfix(TextMeshProUGUI ___tipsPanelHeader, TextMeshProUGUI ___tipsPanelBody) { switch (((TMP_Text)___tipsPanelHeader).text) { case "To read the manual:": ((TMP_Text)___tipsPanelHeader).text = TranslationManager.GetArrayTranslation("Tip", "ReadManual"); ((TMP_Text)___tipsPanelBody).text = TranslationManager.GetArrayTranslation("Tip", "ReadManual", 1); break; case "TIP:": ((TMP_Text)___tipsPanelHeader).text = TranslationManager.GetArrayTranslation("Tip", "TipTerminal"); if (((TMP_Text)___tipsPanelBody).text == "Use the ship computer terminal to access secure doors.") { ((TMP_Text)___tipsPanelBody).text = TranslationManager.GetArrayTranslation("Tip", "TipTerminal", 1); } else { ((TMP_Text)___tipsPanelBody).text = TranslationManager.GetArrayTranslation("Tip", "TipLockedDoor", 1); } break; case "Welcome!": ((TMP_Text)___tipsPanelHeader).text = TranslationManager.GetArrayTranslation("Tip", "Welcome"); ((TMP_Text)___tipsPanelBody).text = TranslationManager.GetArrayTranslation("Tip", "Welcome", 1); break; case "Got scrap!": ((TMP_Text)___tipsPanelHeader).text = TranslationManager.GetArrayTranslation("Tip", "GotScrap"); ((TMP_Text)___tipsPanelBody).text = TranslationManager.GetArrayTranslation("Tip", "GotScrap", 1); break; case "Items missed!": ((TMP_Text)___tipsPanelHeader).text = TranslationManager.GetArrayTranslation("Tip", "ItemMissed"); ((TMP_Text)___tipsPanelBody).text = TranslationManager.GetArrayTranslation("Tip", "ItemMissed", 1); break; case "Item stored!": ((TMP_Text)___tipsPanelHeader).text = TranslationManager.GetArrayTranslation("Tip", "ItemStored"); ((TMP_Text)___tipsPanelBody).text = TranslationManager.GetArrayTranslation("Tip", "ItemStored", 1); break; case "HALT!": ((TMP_Text)___tipsPanelHeader).text = TranslationManager.GetArrayTranslation("Tip", "DeadlineWarning"); ((TMP_Text)___tipsPanelBody).text = TranslationManager.GetArrayTranslation("Tip", "DeadlineWarning", 1); break; case "Weather alert!": ((TMP_Text)___tipsPanelHeader).text = TranslationManager.GetArrayTranslation("Tip", "EclipseWarning"); ((TMP_Text)___tipsPanelBody).text = TranslationManager.GetArrayTranslation("Tip", "EclipseWarning", 1); break; case "???": ((TMP_Text)___tipsPanelBody).text = TranslationManager.GetArrayTranslation("Tip", "MissingEntrance", 1); break; case "ALERT!": ((TMP_Text)___tipsPanelHeader).text = TranslationManager.GetArrayTranslation("Tip", "LightningWarning"); ((TMP_Text)___tipsPanelBody).text = TranslationManager.GetArrayTranslation("Tip", "LightningWarning", 1); break; case "Welcome back!": ((TMP_Text)___tipsPanelHeader).text = TranslationManager.GetArrayTranslation("Tip", "WelcomeBack"); ((TMP_Text)___tipsPanelBody).text = TranslationManager.GetArrayTranslation("Tip", "WelcomeBack", 1); break; case "Tip": ((TMP_Text)___tipsPanelHeader).text = TranslationManager.GetArrayTranslation("Tip", "TipShipObject"); ((TMP_Text)___tipsPanelBody).text = TranslationManager.GetArrayTranslation("Tip", "TipShipObject", 1); break; case "Equipped to utility belt!": ((TMP_Text)___tipsPanelHeader).text = TranslationManager.GetArrayTranslation("Tip", "UtilityBelt"); ((TMP_Text)___tipsPanelBody).text = TranslationManager.GetArrayTranslation("Tip", "UtilityBelt", 1); break; } } [HarmonyPostfix] [HarmonyPatch("DisplayNewScrapFound")] private static void DisplayNewScrapFound_Postfix() { ScrapCollectionBox(HUDManager.Instance.ScrapItemBoxes[0]); ScrapCollectionBox(HUDManager.Instance.ScrapItemBoxes[1]); ScrapCollectionBox(HUDManager.Instance.ScrapItemBoxes[2]); } private static void ScrapCollectionBox(ScrapItemHUDDisplay scrapBox) { ((TMP_Text)scrapBox.headerText).text = TranslationManager.ReplaceArrayText(((TMP_Text)scrapBox.headerText).text, "Item", ((TMP_Text)scrapBox.headerText).text.Replace(" collected!", "")); ((TMP_Text)scrapBox.headerText).text = TranslationManager.ReplaceArrayText(((TMP_Text)scrapBox.headerText).text, "HUD", "collected"); ((TMP_Text)scrapBox.valueText).text = TranslationManager.ReplaceArrayText(((TMP_Text)scrapBox.valueText).text, "HUD", "Value"); } [HarmonyPostfix] [HarmonyPatch("DisplayCreditsEarning")] private static void DisplayCreditsEarning_Postfix(ref TextMeshProUGUI ___moneyRewardsTotalText) { ((TMP_Text)___moneyRewardsTotalText).text = TranslationManager.ReplaceArrayText(((TMP_Text)___moneyRewardsTotalText).text, "HUD", "TOTAL"); } [HarmonyPostfix] [HarmonyPatch("DisplayDaysLeft")] private static void DisplayDaysLeft_Postfix(ref TextMeshProUGUI ___profitQuotaDaysLeftText, ref TextMeshProUGUI ___profitQuotaDaysLeftText2) { string text = TranslationManager.ReplaceArrayText(((TMP_Text)___profitQuotaDaysLeftText).text, "HUD", Regex.Replace(((TMP_Text)___profitQuotaDaysLeftText).text, "\\d", "")); ((TMP_Text)___profitQuotaDaysLeftText).text = text; ((TMP_Text)___profitQuotaDaysLeftText2).text = text; } [HarmonyPostfix] [HarmonyPatch("ChangeControlTip")] private static void ChangeControlTip_Postfix(HUDManager __instance, ref TextMeshProUGUI[] ___controlTipLines, int toolTipNumber, string changeTo, bool clearAllOther = false) { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown string text = changeTo.Split(':')[0].Trim(); string text2 = text; text2 = changeTo.Replace(text, TranslationManager.GetArrayTranslation("ControlTip", text, 0, partialMatch: true)); ((TMP_Text)___controlTipLines[toolTipNumber]).text = text2; Coroutine val = (Coroutine)forceChangeTextCoroutineField.GetValue(__instance); if (val != null) { ((MonoBehaviour)__instance).StopCoroutine(val); } IEnumerator enumerator = (IEnumerator)forceChangeTextMethod.Invoke(__instance, new object[2] { ___controlTipLines[toolTipNumber], text2 }); Coroutine value = ((MonoBehaviour)__instance).StartCoroutine(enumerator); forceChangeTextCoroutineField.SetValue(__instance, value); } [HarmonyPostfix] [HarmonyPatch("ChangeControlTipMultiple")] private static void ChangeControlTipMultiple_Postfix(ref TextMeshProUGUI[] ___controlTipLines, string[] allLines, bool holdingItem, Item itemProperties) { if (!holdingItem || allLines == null) { return; } ((TMP_Text)___controlTipLines[0]).text = TranslationManager.GetArrayTranslation("Item", itemProperties.itemName) + " 떨어뜨리기 : [G]"; int num = Mathf.Min(allLines.Length, ___controlTipLines.Length); for (int i = 0; i < num; i++) { if (allLines.Length > i && !string.IsNullOrEmpty(allLines[i])) { string text = allLines[i]; string text2 = text.Split(':')[0].Trim(); ((TMP_Text)___controlTipLines[i + 1]).text = ((TMP_Text)___controlTipLines[i + 1]).text.Replace(text2, TranslationManager.GetArrayTranslation("ControlTip", text2, 0, partialMatch: true)); } } } [HarmonyPrefix] [HarmonyPatch("Update")] private static void Update_Prefix(ref TextMeshProUGUI ___planetInfoHeaderText, ref TextMeshProUGUI ___globalNotificationText, ref TextMeshProUGUI ___loadingText, ref TextMeshProUGUI[] ___controlTipLines) { if (((TMP_Text)___loadingText).text == "Waiting for crew...") { ((TMP_Text)___loadingText).text = TranslationManager.GetArrayTranslation("HUD", "WaitingForCrew"); } string text = ((TMP_Text)___planetInfoHeaderText).text; if (text.Contains("CELESTIAL BODY:")) { text = TranslationManager.ReplaceArrayText(text, "Planets", "CELESTIAL BODY"); text = TranslationManager.ReplaceArrayText(text, "Planets", "Experimentation"); text = TranslationManager.ReplaceArrayText(text, "Planets", "Where the Company resides"); text = TranslationManager.ReplaceArrayText(text, "Planets", "Assurance"); text = TranslationManager.ReplaceArrayText(text, "Planets", "Offense"); text = TranslationManager.ReplaceArrayText(text, "Planets", "Adamance"); text = TranslationManager.ReplaceArrayText(text, "Planets", "Rend"); text = TranslationManager.ReplaceArrayText(text, "Planets", "Dine"); text = TranslationManager.ReplaceArrayText(text, "Planets", "March"); text = TranslationManager.ReplaceArrayText(text, "Planets", "Vow"); text = TranslationManager.ReplaceArrayText(text, "Planets", "Titan"); text = TranslationManager.ReplaceArrayText(text, "Planets", "Artifice"); text = TranslationManager.ReplaceArrayText(text, "Planets", "Embrion"); text = TranslationManager.ReplaceArrayText(text, "Planets", "Gordion"); ((TMP_Text)___planetInfoHeaderText).text = text; } if (((TMP_Text)___globalNotificationText).text == "New creature data sent to terminal!") { ((TMP_Text)___globalNotificationText).text = TranslationManager.GetArrayTranslation("HUD", "NewCreature"); } else if (((TMP_Text)___globalNotificationText).text.Contains("Found journal entry:")) { string arrayTranslation = TranslationManager.GetArrayTranslation("HUD", "FoundJournal"); ((TMP_Text)___globalNotificationText).text = ((TMP_Text)___globalNotificationText).text.Replace("Found journal entry:", arrayTranslation); } } [HarmonyPostfix] [HarmonyPatch("AttemptScanNode")] private static void AttemptScanNode_Prefix(ScanNodeProperties node) { if ((Object)(object)node == (Object)null) { return; } string arrayTranslation = TranslationManager.GetArrayTranslation("ScanNode", node.headerText); string text = node.subText; if (node.subText.Contains("Value: ") || node.subText.Contains("value: ") || node.subText.Contains("VALUE: ")) { text = text.Replace("Value: ", TranslationManager.GetArrayTranslation("ScanNode", "valueCheck", 1)); text = text.Replace("value: ", TranslationManager.GetArrayTranslation("ScanNode", "valueCheck", 1)); text = text.Replace("VALUE: ", TranslationManager.GetArrayTranslation("ScanNode", "valueCheck", 1)); } else { string arrayTranslation2 = TranslationManager.GetArrayTranslation("ScanNode", node.headerText, 1); if (!string.IsNullOrEmpty(arrayTranslation2) && arrayTranslation2 != node.headerText) { text = arrayTranslation2; } } node.headerText = arrayTranslation; if (arrayTranslation != text) { node.subText = text; } } [HarmonyPostfix] [HarmonyPatch("DisplayNewDeadline")] private static void DisplayNewDeadline_Postfix(ref TextMeshProUGUI ___reachedProfitQuotaBonusText) { ((TMP_Text)___reachedProfitQuotaBonusText).text = TranslationManager.ReplaceArrayText(((TMP_Text)___reachedProfitQuotaBonusText).text, "HUD", "Overtime bonus"); } } [HarmonyPatch(typeof(IngamePlayerSettings))] internal class IngamePlayerSettingsPatch { [HarmonyPrefix] [HarmonyPatch("SetSettingsOptionsText")] private static void SetSettingsOptionsText_Prefix(SettingsOptionType optionType, string setToText) { setToText = setToText.Replace("Current input device:", "현재 입력 장치:"); setToText = setToText.Replace("No device found \n (click to refresh)", "장치 발견되지 않음 \n (클릭하여 새로고침)"); setToText = setToText.Replace("MODE: Push to talk", "모드: 눌러서 말하기"); setToText = setToText.Replace("MODE: Voice activation", "모드: 음성 감지"); } } [HarmonyPatch(typeof(InteractTrigger))] internal class InteractTriggerPatch { } [HarmonyPatch(typeof(ManualCameraRenderer))] internal class ManualCameraRendererPatch { [HarmonyPostfix] [HarmonyPatch("Update")] private static void Update_Postfix(UnlockableSuit __instance) { TextMeshProUGUI mapScreenPlayerName = StartOfRound.Instance.mapScreenPlayerName; ((TMP_Text)mapScreenPlayerName).text = TranslationManager.ReplaceArrayText(((TMP_Text)mapScreenPlayerName).text, "Ingame", "MONITORING"); } } [HarmonyPatch(typeof(MenuManager))] internal class MenuManagerPatch { [HarmonyPostfix] [HarmonyPatch("DisplayMenuNotification")] private static void DisplayMenuNotification_Prefix(string notificationText, string buttonText, ref GameObject ___menuNotification, ref TextMeshProUGUI ___menuNotificationText, ref TextMeshProUGUI ___menuNotificationButtonText) { if (notificationText.Contains("Some of your save files may not be compatible")) { ((TMP_Text)___menuNotificationText).text = $"일부 저장 파일은 버전 {GameNetworkManager.Instance.compatibleFileCutoffVersion}과 호환되지 않을 수 있으며, 플레이할 경우 손상될 수 있습니다."; ((TMP_Text)___menuNotificationButtonText).text = "[ 닫기 ]"; ___menuNotification.SetActive(true); EventSystem.current.SetSelectedGameObject(((Component)___menuNotification.GetComponentInChildren<Button>()).gameObject); } } [HarmonyPostfix] [HarmonyPatch("HostSetLobbyPublic")] private static void HostSetLobbyPublic_Postfix(ref TextMeshProUGUI ___privatePublicDescription) { if (((TMP_Text)___privatePublicDescription).text.Contains("PUBLIC")) { ((TMP_Text)___privatePublicDescription).text = "공개로 설정하면 모든 사람이 볼 수 있도록 서버가 서버 목록에 표시됩니다."; } else { ((TMP_Text)___privatePublicDescription).text = "비공개로 설정하면 Steam을 통해 플레이어에게 초대를 보내야 합니다."; } } [HarmonyPrefix] [HarmonyPatch("Update")] private static void Update_Prefix(ref TextMeshProUGUI ___settingsBackButton) { if ((Object)(object)___settingsBackButton != (Object)null) { ((TMP_Text)___settingsBackButton).text = ((TMP_Text)___settingsBackButton).text.Replace("DISCARD", "취소"); ((TMP_Text)___settingsBackButton).text = ((TMP_Text)___settingsBackButton).text.Replace("BACK", "뒤로"); } } [HarmonyPostfix] [HarmonyPatch("Start")] private static void Start_Postfix(MenuManager __instance, ref TextMeshProUGUI ___versionNumberText) { if (Plugin.showVersion && (Object)(object)GameNetworkManager.Instance != (Object)null && (Object)(object)___versionNumberText != (Object)null) { ((TMP_Text)___versionNumberText).text = " <size=14>LCKR 2.1.1" + Plugin.modVerType + "</size>\n" + ((TMP_Text)___versionNumberText).text; } if (!__instance.isInitScene) { Transform transform = ((Component)Object.Instantiate<GameObject>(Plugin.resetPanel, GameObject.Find("MenuContainer").transform).AddComponent<LCKRPanel>()).transform; transform.SetSiblingIndex(GameObject.Find("MainButtons").transform.GetSiblingIndex() + 1); } } } [HarmonyPatch(typeof(PlayerControllerB))] internal class PlayerControllerBPatch { public static string cursorTip; [HarmonyPostfix] [HarmonyPatch("SetHoverTipAndCurrentInteractTrigger")] private static void SetHoverTipAndCurrentInteractTrigger_Postfix(ref TextMeshProUGUI ___cursorTip) { string text = ((TMP_Text)___cursorTip).text; if (text != cursorTip) { cursorTip = TranslationManager.ReplaceArrayTextAll(text, "CursorTip"); ((TMP_Text)___cursorTip).text = cursorTip; } } [HarmonyPostfix] [HarmonyPatch("SpawnDeadBody")] private static void SpawnDeadBody_Postfix() { DeadBodyInfo[] array = Object.FindObjectsOfType<DeadBodyInfo>(); DeadBodyInfo[] array2 = array; foreach (DeadBodyInfo val in array2) { ScanNodeProperties componentInChildren = ((Component)val).gameObject.GetComponentInChildren<ScanNodeProperties>(); if (!componentInChildren.headerText.Contains(TranslationManager.GetArrayTranslation("DeathReasons", "PlayerBody"))) { componentInChildren.headerText = componentInChildren.headerText.Replace("Body of ", ""); componentInChildren.headerText += TranslationManager.GetArrayTranslation("DeathReasons", "PlayerBody"); } string[] array3 = componentInChildren.subText.Split(':'); string key = array3[0].Trim(); string key2 = array3[1].Trim(); componentInChildren.subText = TranslationManager.ReplaceArrayText(componentInChildren.subText, "DeathReasons", key); componentInChildren.subText = TranslationManager.ReplaceArrayText(componentInChildren.subText, "DeathReasons", key2); } } } [HarmonyPatch(typeof(PreInitSceneScript))] internal class PreInitSceneScriptPatch { [HarmonyPostfix] [HarmonyPatch("PressContinueButton")] private static void PressContinueButton_Postfix(ref int ___currentLaunchSettingPanel, ref GameObject[] ___LaunchSettingsPanels, ref Animator ___blackTransition, ref GameObject ___continueButton, ref TextMeshProUGUI ___headerText) { if (((TMP_Text)___headerText).text == "LAUNCH MODE") { ((TMP_Text)___headerText).text = "실행 모드"; } } [HarmonyPostfix] [HarmonyPatch("SkipToFinalSetting")] private static void SkipToFinalSetting_Postfix(PreInitSceneScript __instance, ref TextMeshProUGUI ___headerText) { LoadingManager loadingManager = ((Component)__instance).gameObject.AddComponent<LoadingManager>(); loadingManager.text = (TMP_Text)(object)___headerText; loadingManager.buttons = GameObject.Find("LANOrOnline"); ((TMP_Text)___headerText).text = "실행 모드"; } } [HarmonyPatch(typeof(QuickMenuManager))] internal class QuickMenuManagerPatch { [HarmonyPrefix] [HarmonyPatch("Update")] private static void Update_Prefix(ref TextMeshProUGUI ___settingsBackButton) { if ((Object)(object)___settingsBackButton != (Object)null) { ((TMP_Text)___settingsBackButton).text = ((TMP_Text)___settingsBackButton).text.Replace("Discard changes", "변경 사항 취소"); ((TMP_Text)___settingsBackButton).text = ((TMP_Text)___settingsBackButton).text.Replace("Back", "뒤로"); } } } [HarmonyPatch(typeof(RoundManager))] internal class RoundManagerPatch { private static TextMeshProUGUI _loadingText; [HarmonyPrefix] [HarmonyPatch("Start")] private static void Start_Prefix() { if (GameNetworkManager.Instance.gameVersionNum >= 80 && (Object)(object)_loadingText == (Object)null) { _loadingText = GameObject.Find("LoadText").GetComponent<TextMeshProUGUI>(); ((TMP_Text)_loadingText).text = TranslationManager.GetArrayTranslation("HUD", "LoadText"); } } [HarmonyPostfix] [HarmonyPatch("GenerateNewLevelClientRpc")] private static void GenerateNewLevelClientRpc_Postfix() { if (((TMP_Text)HUDManager.Instance.loadingText).text.Contains("Random seed")) { ((TMP_Text)HUDManager.Instance.loadingText).text = ((TMP_Text)HUDManager.Instance.loadingText).text.Replace("Random seed", "무작위 시드"); } } } [HarmonyPatch(typeof(SaveFileUISlot))] internal class SaveFileUISlotPatch { [HarmonyPostfix] [HarmonyPatch("OnEnable")] private static void OnEnable_Postfix(SaveFileUISlot __instance, ref string ___fileString) { if (__instance.fileNum == -1) { ((TMP_Text)__instance.fileNameText).text = GameNetworkManager.Instance.GetNameForWeekNumber(-1); } if (ES3.FileExists(___fileString) && __instance.fileNum != -1) { int num = ES3.Load<int>("GroupCredits", ___fileString, 0); int num2 = ES3.Load<int>("Stats_DaysSpent", ___fileString, 0); ((TMP_Text)__instance.fileStatsText).text = $"${num}\n{num2}일차"; } } [HarmonyPostfix] [HarmonyPatch("SetFileToThis")] private static void SetFileToThis_Postfix(ref TextMeshProUGUI ___specialTipText) { if ((Object)(object)___specialTipText != (Object)null && ((Behaviour)___specialTipText).enabled) { ((TMP_Text)___specialTipText).text = ((TMP_Text)___specialTipText).text.Replace("This is the weekly challenge moon. You have one day to make as much profit as possible.", "주간 챌린지 위성입니다. 하루 안에 가능한 한 많은 수익을 획득하세요."); } } } [HarmonyPatch(typeof(ShipBuildModeManager))] internal class ShipBuildModeManagerPatch { [HarmonyPostfix] [HarmonyPatch("CreateGhostObjectAndHighlight")] private static void CreateGhostObjectAndHighlight_Postfix() { string text = ((TMP_Text)HUDManager.Instance.buildModeControlTip).text.Replace("Confirm", "배치"); text = text.Replace("Rotate", "회전"); text = text.Replace("Store", "보관"); ((TMP_Text)HUDManager.Instance.buildModeControlTip).text = text; } } [HarmonyPatch(typeof(ShotgunItem))] internal class ShotgunItemPatch { } [HarmonyPatch(typeof(StartMatchLever))] internal class StartMatchLeverPatch { } [HarmonyPatch(typeof(StartOfRound))] internal class StartOfRoundPatch { [HarmonyPostfix] [HarmonyPatch("Start")] private static void Start_Postfix() { try { TranslatePlanet(); } catch (Exception ex) { Plugin.mls.LogError((object)("행성 리스트를 번역하는 과정에서 오류가 발생했습니다!\n" + ex)); } } [HarmonyPrefix] [HarmonyPatch("LateUpdate")] private static void LateUpdate_Prefix() { ((TMP_Text)HUDManager.Instance.planetInfoSummaryText).text = TranslationManager.GetArrayTranslation("Planets", StartOfRound.Instance.currentLevel.LevelDescription, 0, partialMatch: true); } [HarmonyPostfix] [HarmonyPatch("SceneManager_OnLoad")] private static void SceneManager_OnLoad_Postfix() { if (((TMP_Text)HUDManager.Instance.loadingText).text == "LOADING WORLD...") { ((TMP_Text)HUDManager.Instance.loadingText).text = "세계 불러오는 중..."; } } [HarmonyPostfix] [HarmonyPatch("FirePlayersAfterDeadlineClientRpc")] private static void FirePlayersAfterDeadlineClientRpc_Postfix() { TextMeshProUGUI endOfRunStatsText = HUDManager.Instance.EndOfRunStatsText; ((TMP_Text)endOfRunStatsText).text = TranslationManager.ReplaceArrayText(((TMP_Text)endOfRunStatsText).text, "HUD", "Days on the job"); ((TMP_Text)endOfRunStatsText).text = TranslationManager.ReplaceArrayText(((TMP_Text)endOfRunStatsText).text, "HUD", "Scrap value collected"); ((TMP_Text)endOfRunStatsText).text = TranslationManager.ReplaceArrayText(((TMP_Text)endOfRunStatsText).text, "HUD", "Deaths"); ((TMP_Text)endOfRunStatsText).text = TranslationManager.ReplaceArrayText(((TMP_Text)endOfRunStatsText).text, "HUD", "Steps taken"); } [HarmonyPostfix] [HarmonyPatch("SetMapScreenInfoToCurrentLevel")] private static void SetMapScreenInfoToCurrentLevel_Postfix(ref TextMeshProUGUI ___screenLevelDescription) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Invalid comparison between Unknown and I4 TranslatePlanet(); SelectableLevel[] levels = StartOfRound.Instance.levels; foreach (SelectableLevel val in levels) { if (val.riskLevel == "Safe") { val.riskLevel = "안전"; } } string text; if ((int)StartOfRound.Instance.currentLevel.currentWeather != -1) { string arrayTranslation = TranslationManager.GetArrayTranslation("Planets", "Weather"); string arrayTranslation2 = TranslationManager.GetArrayTranslation("Planets", ((object)Unsafe.As<LevelWeatherType, LevelWeatherType>(ref StartOfRound.Instance.currentLevel.currentWeather)/*cast due to .constrained prefix*/).ToString()); text = arrayTranslation + ": " + arrayTranslation2; } else { text = ""; } string levelDescription = StartOfRound.Instance.currentLevel.LevelDescription; if (StartOfRound.Instance.isChallengeFile) { ((TMP_Text)StartOfRound.Instance.screenLevelDescription).text = string.Concat(TranslationManager.GetArrayTranslation("Planets", "Orbiting") + ": ", GameNetworkManager.Instance.GetNameForWeekNumber(-1), "\n", TranslationManager.GetArrayTranslation("Planets", levelDescription, 0, partialMatch: true), "\n", text); } else { ((TMP_Text)StartOfRound.Instance.screenLevelDescription).text = "공전 중: " + TranslationManager.GetArrayTranslation("Planets", StartOfRound.Instance.currentLevel.PlanetName, 0, partialMatch: true) + "\n" + TranslationManager.GetArrayTranslation("Planets", levelDescription, 0, partialMatch: true) + "\n" + text; } } private bool TryGetValueAfterColon(string text, string removalKey, out string value) { value = null; if (string.IsNullOrEmpty(text)) { return false; } int num = text.IndexOf(':'); if (num < 0) { return false; } string text2 = text.Substring(0, num).Trim(); if (text2 != removalKey) { return false; } value = text.Substring(num + 1).Trim(); return true; } [HarmonyPostfix] [HarmonyPatch("WritePlayerNotes")] public static void WritePlayerNotes_Postfix(ref EndOfGameStats ___gameStats, ref PlayerControllerB[] ___allPlayerScripts, ref int ___connectedPlayersAmount, ref bool ___localPlayerWasMostProfitableThisRound) { for (int i = 0; i < ___allPlayerScripts.Length; i++) { for (int j = 0; j < ___gameStats.allPlayerStats[i].playerNotes.Count; j++) { string key = ___gameStats.allPlayerStats[i].playerNotes[j]; key = TranslationManager.GetArrayTranslation("HUD", key); ___gameStats.allPlayerStats[i].playerNotes[j] = key; } } } private static void TranslatePlanet() { } } [HarmonyPatch(typeof(Terminal))] internal class TerminalPatch { public static bool vehicleChecked; private static FieldInfo modifyingTextField = AccessTools.Field(typeof(Terminal), "modifyingText"); private static FieldInfo totalCostField = AccessTools.Field(typeof(Terminal), "totalCostOfItems"); private static string confirmString; private static string denyString; [HarmonyPostfix] [HarmonyPatch("Start")] private static void Start_Postfix(Terminal __instance, ref TerminalNodesList ___terminalNodes, ref List<TerminalNode> ___enemyFiles, ref TMP_InputField ___screenText, ref string ___currentText) { confirmString = TranslationManager.GetArrayTranslation("Terminal", "확인"); denyString = TranslationManager.GetArrayTranslation("Terminal", "취소"); Plugin.mls.LogInfo((object)("클라이언트 버전: " + GameNetworkManager.Instance.gameVersionNum)); TranslateKeyword(___terminalNodes, ___enemyFiles); TranslateNode(__instance); } private static void TranslateVehicle(Terminal instance) { BuyableVehicle[] buyableVehicles = instance.buyableVehicles; foreach (BuyableVehicle val in buyableVehicles) { if (val.vehicleDisplayName == "Cruiser") { val.vehicleDisplayName = "크루저"; } } } private static void TranslateTerminalScreen(string key, TMP_InputField screenText, ref string ___currentText) { string text = TranslationManager.ReplaceArrayTextAll(screenText.text, "Terminal"); text = (screenText.text = TranslationManager.ReplaceArrayTextAll(screenText.text, "Planets")); ___currentText = text; } [HarmonyPrefix] [HarmonyPatch("LoadNewNode")] public static bool LoadNewNode_Prefix(Terminal __instance, TerminalNode node) { modifyingTextField.SetValue(__instance, true); __instance.RunTerminalEvents(node); ((Selectable)__instance.screenText).interactable = true; string text = ""; if (node.clearPreviousText) { text = "\n\n\n" + node.displayText.ToString(); } else { text = "\n\n" + __instance.screenText.text.ToString() + "\n\n" + node.displayText.ToString(); int num = text.Length - 250; text = text.Substring(Mathf.Clamp(num, 0, text.Length)).ToString(); } try { text = TextPostProcess(__instance, text, node); } catch (Exception arg) { Debug.LogError((object)$"An error occured while post processing terminal text: {arg}"); } __instance.screenText.text = text; __instance.currentText = __instance.screenText.text; __instance.textAdded = 0; if (node.playSyncedClip != -1) { __instance.PlayTerminalAudioServerRpc(node.playSyncedClip); } else if ((Object)(object)node.playClip != (Object)null) { __instance.terminalAudio.PlayOneShot(node.playClip); } __instance.LoadTerminalImage(node); __instance.currentNode = node; return false; } private static string TextPostProcess(Terminal __instance, string modifiedDisplayText, TerminalNode node) { //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Invalid comparison between Unknown and I4 //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Invalid comparison between Unknown and I4 int num = modifiedDisplayText.Split("[planetTime]").Length - 1; if (num > 0) { Regex regex = new Regex(Regex.Escape("[planetTime]")); for (int i = 0; i < num && __instance.moonsCatalogueList.Length > i; i++) { Debug.Log((object)$"isDemo:{GameNetworkManager.Instance.isDemo} ; {__instance.moonsCatalogueList[i].lockedForDemo}"); string replacement = ((GameNetworkManager.Instance.isDemo && __instance.moonsCatalogueList[i].lockedForDemo) ? TranslationManager.GetArrayTranslation("Terminal", "Locked") : (((int)__instance.moonsCatalogueList[i].currentWeather != -1) ? ("(" + TranslationManager.GetArrayTranslation("Planets", ((object)Unsafe.As<LevelWeatherType, LevelWeatherType>(ref __instance.moonsCatalogueList[i].currentWeather)/*cast due to .constrained prefix*/).ToString()) + ")") : "")); modifiedDisplayText = regex.Replace(modifiedDisplayText, replacement, 1); } } try { if (node.displayPlanetInfo != -1) { string newValue = (((int)StartOfRound.Instance.levels[node.displayPlanetInfo].currentWeather != -1) ? (TranslationManager.GetArrayTranslation("Planets", ((object)Unsafe.As<LevelWeatherType, LevelWeatherType>(ref StartOfRound.Instance.levels[node.displayPlanetInfo].currentWeather)/*cast due to .constrained prefix*/).ToString()) ?? "") : TranslationManager.GetArrayTranslation("Planets", "mild weather")); modifiedDisplayText = modifiedDisplayText.Replace("[currentPlanetTime]", newValue); } } catch { Debug.Log((object)$"Exception occured on terminal while setting node planet info; current node displayPlanetInfo:{node.displayPlanetInfo}"); } if (modifiedDisplayText.Contains("[warranty]")) { modifiedDisplayText = ((!__instance.hasWarrantyTicket) ? modifiedDisplayText.Replace("[warranty]", "") : modifiedDisplayText.Replace("[warranty]", TranslationManager.GetArrayTranslation("Terminal", "FreeWarranty", 0, partialMatch: false, "[warranty]"))); } if (modifiedDisplayText.Contains("[currentScannedEnemiesList]")) { if (__instance.scannedEnemyIDs == null || __instance.scannedEnemyIDs.Count <= 0) { modifiedDisplayText = modifiedDisplayText.Replace("[currentScannedEnemiesList]", TranslationManager.GetArrayTranslation("Terminal", "NoCreatureData", 0, partialMatch: false, "No data collected on wildlife. Scans are required.")); } else { StringBuilder stringBuilder = new StringBuilder(); for (int j = 0; j < __instance.scannedEnemyIDs.Count; j++) { Debug.Log((object)$"scanID # {j}: {__instance.scannedEnemyIDs[j]}; {__instance.enemyFiles[__instance.scannedEnemyIDs[j]].creatureName}"); Debug.Log((object)$"scanID # {j}: {__instance.scannedEnemyIDs[j]}"); stringBuilder.Append("\n" + __instance.enemyFiles[__instance.scannedEnemyIDs[j]].creatureName); if (__instance.newlyScannedEnemyIDs.Contains(__instance.scannedEnemyIDs[j])) { stringBuilder.Append(" (" + TranslationManager.GetArrayTranslation("Terminal", "NEW") + ")"); } } modifiedDisplayText = modifiedDisplayText.Replace("[currentScannedEnemiesList]", stringBuilder.ToString()); } } if (modifiedDisplayText.Contains("[buyableItemsList]")) { if (__instance.buyableItemsList == null || __instance.buyableItemsList.Length == 0) { modifiedDisplayText = modifiedDisplayText.Replace("[buyableItemsList]", TranslationManager.GetArrayTranslation("Terminal", "NoStock")); } else { StringBuilder stringBuilder2 = new StringBuilder(); for (int k = 0; k < __instance.buyableItemsList.Length; k++) { stringBuilder2.Append("\n* " + TranslationManager.GetArrayTranslation("Item", __instance.buyableItemsList[k].itemName) + " // " + TranslationManager.GetArrayTranslation("Terminal", "Price") + ": $" + (float)__instance.buyableItemsList[k].creditsWorth * ((float)__instance.itemSalesPercentages[k] / 100f)); if (__instance.itemSalesPercentages[k] != 100) { stringBuilder2.Append(string.Format(" ({0}% " + TranslationManager.GetArrayTranslation("Terminal", "OFF!") + ")", 100 - __instance.itemSalesPercentages[k])); } } modifiedDisplayText = modifiedDisplayText.Replace("[buyableItemsList]", stringBuilder2.ToString()); } } if (modifiedDisplayText.Contains("[buyableVehiclesList]")) { if (__instance.buyableVehicles == null || __instance.buyableVehicles.Length == 0) { modifiedDisplayText = modifiedDisplayText.Replace("[buyableVehiclesList]", TranslationManager.GetArrayTranslation("Terminal", "NoStock")); } else { StringBuilder stringBuilder3 = new StringBuilder(); for (int l = 0; l < __instance.buyableVehicles.Length; l++) { stringBuilder3.Append("\n* " + __instance.buyableVehicles[l].vehicleDisplayName + " // " + TranslationManager.GetArrayTranslation("Terminal", "Price") + ": $" + (float)__instance.buyableVehicles[l].creditsWorth * ((float)__instance.itemSalesPercentages[l + __instance.buyableItemsList.Length] / 100f)); if (__instance.itemSalesPercentages[l + __instance.buyableItemsList.Length] != 100) { stringBuilder3.Append(string.Format(" ({0}% " + TranslationManager.GetArrayTranslation("Terminal", "OFF!") + ")", 100 - __instance.itemSalesPercentages[l + __instance.buyableItemsList.Length])); } } modifiedDisplayText = modifiedDisplayText.Replace("[buyableVehiclesList]", stringBuilder3.ToString()); } } if (modifiedDisplayText.Contains("[currentUnlockedLogsList]")) { if (__instance.unlockedStoryLogs == null || __instance.unlockedStoryLogs.Count <= 0) { modifiedDisplayText = modifiedDisplayText.Replace("[currentUnlockedLogsList]", TranslationManager.GetArrayTranslation("Terminal", "DataCorrupted")); } else { StringBuilder stringBuilder4 = new StringBuilder(); for (int m = 0; m < __instance.unlockedStoryLogs.Count; m++) { stringBuilder4.Append("\n" + __instance.logEntryFiles[__instance.unlockedStoryLogs[m]].creatureName); if (__instance.newlyUnlockedStoryLogs.Contains(__instance.unlockedStoryLogs[m])) { stringBuilder4.Append(" (" + TranslationManager.GetArrayTranslation("Terminal", "NEW") + ")"); } } modifiedDisplayText = modifiedDisplayText.Replace("[currentUnlockedLogsList]", stringBuilder4.ToString()); } } if (modifiedDisplayText.Contains("[unlockablesSelectionList]")) { if (__instance.ShipDecorSelection == null || __instance.ShipDecorSelection.Count <= 0) { modifiedDisplayText = modifiedDisplayText.Replace("[unlockablesSelectionList]", TranslationManager.GetArrayTranslation("Terminal", "NoItems")); } else { StringBuilder stringBuilder5 = new StringBuilder(); for (int n = 0; n < __instance.ShipDecorSelection.Count; n++) { stringBuilder5.Append($"\n{__instance.ShipDecorSelection[n].creatureName} // ${__instance.ShipDecorSelection[n].itemCost}"); } modifiedDisplayText = modifiedDisplayText.Replace("[unlockablesSelectionList]", stringBuilder5.ToString()); } } if (modifiedDisplayText.Contains("[storedUnlockablesList]")) { StringBuilder stringBuilder6 = new StringBuilder(); bool flag = false; for (int num2 = 0; num2 < StartOfRound.Instance.unlockablesList.unlockables.Count; num2++) { if (StartOfRound.Instance.unlockablesList.unlockables[num2].inStorage) { flag = true; stringBuilder6.Append("\n" + StartOfRound.Instance.unlockablesList.unlockables[num2].unlockableName); } } modifiedDisplayText = (flag ? modifiedDisplayText.Replace("[storedUnlockablesList]", stringBuilder6.ToString()) : modifiedDisplayText.Replace("[storedUnlockablesList]", TranslationManager.GetArrayTranslation("Terminal", "NoStored"))); } if (modifiedDisplayText.Contains("[scanForItems]")) { Random random = new Random(StartOfRound.Instance.randomMapSeed + 91); int num3 = 0; int num4 = 0; int num5 = 0; GrabbableObject[] array = Object.FindObjectsOfType<GrabbableObject>(); for (int num6 = 0; num6 < array.Length; num6++) { if (array[num6].itemProperties.isScrap && !array[num6].isInShipRoom && !array[num6].isInElevator) { num5 += array[num6].itemProperties.maxValue - array[num6].itemProperties.minValue; num4 += Mathf.Clamp(random.Next(array[num6].itemProperties.minValue, array[num6].itemProperties.maxValue), array[num6].scrapValue - 6 * num6, array[num6].scrapValue + 9 * num6); num3++; } } modifiedDisplayText = modifiedDisplayText.Replace("[scanForItems]", string.Format(TranslationManager.GetArrayTranslation("Terminal", "ScanForItems"), num3, num4)); } modifiedDisplayText = ((__instance.numberOfItemsInDropship > 0) ? modifiedDisplayText.Replace("[numberOfItemsOnRoute]", string.Format(TranslationManager.GetArrayTranslation("Terminal", "BoughtItemsInRoute"), __instance.numberOfItemsInDropship)) : modifiedDisplayText.Replace("[numberOfItemsOnRoute]", "")); CultureInfo cultureInfo = CultureInfo.GetCultureInfo("ko-KR"); modifiedDisplayText = modifiedDisplayText.Replace("[currentDay]", DateTime.Now.ToString("dddd", cultureInfo)); modifiedDisplayText = modifiedDisplayText.Replace("[variableAmount]", __instance.playerDefinedAmount.ToString()); modifiedDisplayText = modifiedDisplayText.Replace("[playerCredits]", "$" + __instance.groupCredits); modifiedDisplayText = modifiedDisplayText.Replace("[totalCost]", "$" + totalCostField.GetValue(__instance).ToString()); modifiedDisplayText = modifiedDisplayText.Replace("[companyBuyingPercent]", $"{Mathf.RoundToInt(StartOfRound.Instance.companyBuyingRate * 100f)}%"); if (Object.op_Implicit((Object)(object)__instance.displayingPersistentImage)) { modifiedDisplayText = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" + modifiedDisplayText; } return modifiedDisplayText; } [HarmonyPostfix] [HarmonyPatch("Update")] private static void Update_Postfix(Terminal __instance, ref TMP_InputField ___screenText, ref string ___currentText, ref int ___numberOfItemsInDropship) { if (!vehicleChecked) { if (GameNetworkManager.Instance.gameVersionNum >= 55) { TranslateVehicle(__instance); } foreach (UnlockableItem unlockable in StartOfRound.Instance.unlockablesList.unlockables) { TranslateUnlockable(unlockable); } vehicleChecked = true; } if (___screenText.text.Contains("numberOfItemsOnRoute2")) { if (___numberOfItemsInDropship != 0) { ___screenText.text = ___screenText.text.Replace("[numberOfItemsOnRoute2]", TranslationManager.GetArrayTranslation("Terminal", "InRoute") + ___numberOfItemsInDropship + TranslationManager.GetArrayTranslation("Terminal", "ItemBought")); ___currentText = ___screenText.text; } else { ___screenText.text = ___screenText.text.Replace("[numberOfItemsOnRoute2]", ""); ___currentText = ___screenText.text; } } if (!___screenText.text.Contains("objects outside the ship, totalling at an approximate value")) { return; } Random random = new Random(StartOfRound.Instance.randomMapSeed + 91); int num = 0; int num2 = 0; int num3 = 0; GrabbableObject[] array = Object.FindObjectsOfType<GrabbableObject>(); for (int i = 0; i < array.Length; i++) { if (array[i].itemProperties.isScrap && !array[i].isInShipRoom && !array[i].isInElevator) { num3 += array[i].itemProperties.maxValue - array[i].itemProperties.minValue; num2 += Mathf.Clamp(random.Next(array[i].itemProperties.minValue, array[i].itemProperties.maxValue), array[i].scrapValue - 6 * i, array[i].scrapValue + 9 * i); num++; } } ___screenText.text = "\n\n" + TranslationManager.GetArrayTranslation("Terminal", "ScanForItems") + "\n\n"; ___currentText = ___screenText.text; } private static void TranslateNode(Terminal instance) { foreach (TerminalNode specialNode in instance.terminalNodes.specialNodes) { specialNode.displayText = TranslationManager.GetArrayTranslation("Terminal", ((Object)specialNode).name, 0, partialMatch: false, specialNode.displayText); } } private static void TranslateUnlockable(UnlockableItem unlockableItem) { if (!((Object)(object)unlockableItem.shopSelectionNode == (Object)null)) { TerminalNode shopSelectionNode = unlockableItem.shopSelectionNode; switch (unlockableItem.unlockableName) { case "Bunkbeds": unlockableItem.unlockableName = "벙커침대"; shopSelectionNode.displayText = "벙커침대\n\n"; shopSelectionNode.creatureName = "벙커침대"; break; case "File Cabinet": unlockableItem.unlockableName = "파일 캐비닛"; shopSelectionNode.displayText = "파일 캐비닛\n\n"; shopSelectionNode.creatureName = "파일 캐비닛"; break; case "Cupboard": unlockableItem.unlockableName = "수납장"; shopSelectionNode.displayText = "수납장\n\n"; shopSelectionNode.creatureName = "수납장"; break; case "Teleporter": unlockableItem.unlockableName = "순간이동기"; shopSelectionNode.displayText = "순간이동기를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; shopSelectionNode.creatureName = "순간이동기"; break; case "Television": unlockableItem.unlockableName = "텔레비전"; shopSelectionNode.displayText = "텔레비전을 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; shopSelectionNode.creatureName = "텔레비전"; break; case "Toilet": unlockableItem.unlockableName = "변기"; shopSelectionNode.displayText = "변기를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; shopSelectionNode.creatureName = "변기"; break; case "Shower": unlockableItem.unlockableName = "샤워 부스"; shopSelectionNode.displayText = "샤워 부스를 주문하려고 합니다. \\n아이템의 총 가격: [totalCost].\\n\\n\" + confirmString.ToUpper() + \" 또는 \" + denyString.ToUpper() + \"을(를) 입력하세요.\\n\\n\n\n"; shopSelectionNode.creatureName = "샤워 부스"; break; case "Record player": unlockableItem.unlockableName = "레코드 플레이어"; shopSelectionNode.displayText = "레코드 플레이어를 주문하려고 합니다. \\n아이템의 총 가격: [totalCost].\\n\\n\" + confirmString.ToUpper() + \" 또는 \" + denyString.ToUpper() + \"을(를) 입력하세요.\\n\\n\n\n"; shopSelectionNode.creatureName = "레코드"; break; case "Table": unlockableItem.unlockableName = "테이블"; shopSelectionNode.displayText = "테이블을 주문하려고 합니다. \\n아이템의 총 가격: [totalCost].\\n\\n\" + confirmString.ToUpper() + \" 또는 \" + denyString.ToUpper() + \"을(를) 입력하세요.\\n\\n\n\n"; shopSelectionNode.creatureName = "테이블"; break; case "Romantic table": unlockableItem.unlockableName = "로맨틱한 테이블"; shopSelectionNode.displayText = "로맨틱한 테이블을 주문하려고 합니다. \\n아이템의 총 가격: [totalCost].\\n\\n\" + confirmString.ToUpper() + \" 또는 \" + denyString.ToUpper() + \"을(를) 입력하세요.\\n\\n\n\n"; shopSelectionNode.creatureName = "로맨틱한 테이블"; break; case "Sofa chair": unlockableItem.unlockableName = "소파 의자"; shopSelectionNode.displayText = "소파 의자를 주문하려고 합니다. \\n아이템의 총 가격: [totalCost].\\n\\n\" + confirmString.ToUpper() + \" 또는 \" + denyString.ToUpper() + \"을(를) 입력하세요.\\n\\n\n\n"; shopSelectionNode.creatureName = "소파 의자"; break; case "Microwave": unlockableItem.unlockableName = "전자레인지"; shopSelectionNode.displayText = "전자레인지를 주문하려고 합니다. \\n아이템의 총 가격: [totalCost].\\n\\n\" + confirmString.ToUpper() + \" 또는 \" + denyString.ToUpper() + \"을(를) 입력하세요.\\n\\n\n\n"; shopSelectionNode.creatureName = "전자레인지"; break; case "Fridge": unlockableItem.unlockableName = "냉장고"; shopSelectionNode.displayText = "냉장고를 주문하려고 합니다. \\n아이템의 총 가격: [totalCost].\\n\\n\" + confirmString.ToUpper() + \" 또는 \" + denyString.ToUpper() + \"을(를) 입력하세요.\\n\\n\n\n"; shopSelectionNode.creatureName = "냉장고"; break; case "Signal translator": unlockableItem.unlockableName = "신호 해석기"; shopSelectionNode.displayText = "신호 해석기를 주문하려고 합니다. \\n아이템의 총 가격: [totalCost].\\n\\n\" + confirmString.ToUpper() + \" 또는 \" + denyString.ToUpper() + \"을(를) 입력하세요.\\n\\n\n\n"; shopSelectionNode.creatureName = "신호 해석기"; break; case "Loud horn": unlockableItem.unlockableName = "시끄러운 경적"; shopSelectionNode.displayText = "시끄러운 경적을 주문하려고 합니다. \\n아이템의 총 가격: [totalCost].\\n\\n\" + confirmString.ToUpper() + \" 또는 \" + denyString.ToUpper() + \"을(를) 입력하세요.\\n\\n\n\n"; shopSelectionNode.creatureName = "시끄러운 경적"; break; case "Inverse Teleporter": unlockableItem.unlockableName = "역방향 순간이동기"; shopSelectionNode.displayText = "역방향 순간이동기를 주문하려고 합니다. \\n아이템의 총 가격: [totalCost].\\n\\n\" + confirmString.ToUpper() + \" 또는 \" + denyString.ToUpper() + \"을(를) 입력하세요.\\n\\n\n\n"; shopSelectionNode.creatureName = "역방향 순간이동기"; break; case "JackOLantern": unlockableItem.unlockableName = "잭오랜턴"; shopSelectionNode.displayText = "잭오랜턴을 주문하려고 합니다. \\n아이템의 총 가격: [totalCost].\\n\\n\" + confirmString.ToUpper() + \" 또는 \" + denyString.ToUpper() + \"을(를) 입력하세요.\\n\\n\n\n"; shopSelectionNode.creatureName = "잭오랜턴"; break; case "Welcome mat": unlockableItem.unlockableName = "웰컴 매트"; shopSelectionNode.displayText = "웰컴 매트를 주문하려고 합니다. \\n아이템의 총 가격: [totalCost].\\n\\n\" + confirmString.ToUpper() + \" 또는 \" + denyString.ToUpper() + \"을(를) 입력하세요.\\n\\n\n\n"; shopSelectionNode.creatureName = "웰컴 매트"; break; case "Goldfish": unlockableItem.unlockableName = "금붕어"; shopSelectionNode.displayText = "금붕어 어항을 주문하려고 합니다. \\n아이템의 총 가격: [totalCost].\\n\\n\" + confirmString.ToUpper() + \" 또는 \" + denyString.ToUpper() + \"을(를) 입력하세요.\\n\\n\n\n"; shopSelectionNode.creatureName = "금붕어"; break; case "Plushie pajama man": unlockableItem.unlockableName = "인형 파자마 맨"; shopSelectionNode.displayText = "인형 파자마 맨을 주문하려고 합니다. \\n아이템의 총 가격: [totalCost].\\n\\n\" + confirmString.ToUpper() + \" 또는 \" + denyString.ToUpper() + \"을(를) 입력하세요.\\n\\n\n\n"; shopSelectionNode.creatureName = "인형 파자마 맨"; break; case "Disco Ball": unlockableItem.unlockableName = "디스코 볼"; shopSelectionNode.displayText = "디스코 볼을 주문하려고 합니다. \\n아이템의 총 가격: [totalCost].\\n\\n\" + confirmString.ToUpper() + \" 또는 \" + denyString.ToUpper() + \"을(를) 입력하세요.\\n\\n\n\n"; shopSelectionNode.creatureName = "디스코 볼"; break; } } } private static void TranslateKeyword(TerminalNodesList terminalNodes, List<TerminalNode> ___enemyFiles) { if (___enemyFiles != null) { foreach (TerminalNode ___enemyFile in ___enemyFiles) { if (!((Object)(object)___enemyFile == (Object)null)) { if (!Utility.IsNullOrWhiteSpace(TranslationManager.GetArrayTranslation("Terminal", ((Object)___enemyFile).name))) { ___enemyFile.creatureName = TranslationManager.GetArrayTranslation("Terminal", ((Object)___enemyFile).name); } if (!Utility.IsNullOrWhiteSpace(TranslationManager.GetArrayTranslation("Terminal", ((Object)___enemyFile).name, 1))) { ___enemyFile.displayText = TranslationManager.GetArrayTranslation("Terminal", ((Object)___enemyFile).name, 1); } } } } if (!((Object)(object)terminalNodes != (Object)null) || terminalNodes.allKeywords == null) { return; } TerminalKeyword[] allKeywords = terminalNodes.allKeywords; foreach (TerminalKeyword val in allKeywords) { if (((Object)val).name.Contains("LogFile")) { val.word = TranslationManager.GetArrayTranslation("Sigurd", ((Object)val).name, 0, partialMatch: false, val.word); CompatibleNoun[] compatibleNouns = val.defaultVerb.compatibleNouns; foreach (CompatibleNoun val2 in compatibleNouns) { val2.result.creatureName = TranslationManager.GetArrayTranslation("Sigurd", ((Object)val2.noun).name, 1, partialMatch: false, val2.result.creatureName); val2.result.displayText = TranslationManager.GetArrayTranslation("Sigurd", ((Object)val2.noun).name, 2, partialMatch: false, val2.result.displayText); } } switch (val.word) { case "buy": { CompatibleNoun[] compatibleNouns2 = val.compatibleNouns; foreach (CompatibleNoun val3 in compatibleNouns2) { switch (((Object)val3.result).name) { case "buyProFlashlight1": val3.result.displayText = "프로 손전등을 주문하려고 합니다. 수량: [variableAmount]. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "[variableAmount]개의 프로 손전등을 주문했습니다. 당신의 현재 소지금은 [playerCredits]입니다.\n\n우리의 계약자는 작업 중에도 빠른 무료 배송 혜택을 누릴 수 있습니다! 구매한 모든 상품은 1시간마다 대략적인 위치에 도착합니다.\n\n\n"; val3.result.terminalOptions[0].noun.word = confirmString; val3.result.terminalOptions[1].result.displayText = "주문을 취소했습니다.\n\n"; val3.result.terminalOptions[1].noun.word = denyString; break; case "buyFlash": val3.result.displayText = "손전등을 주문하려고 합니다. 수량: [variableAmount]. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "[variableAmount]개의 손전등을 주문했습니다. 당신의 현재 소지금은 [playerCredits]입니다.\n\n우리의 계약자는 작업 중에도 빠른 무료 배송 혜택을 누릴 수 있습니다! 구매한 모든 상품은 1시간마다 대략적인 위치에 도착합니다.\n\n\n"; break; case "buyLockpickers": val3.result.displayText = "자물쇠 따개를 주문하려고 합니다. 수량: [variableAmount]. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "[variableAmount]개의 자물쇠 따개를 주문했습니다. 당신의 현재 소지금은 [playerCredits]입니다.\n\n우리의 계약자는 작업 중에도 빠른 무료 배송 혜택을 누릴 수 있습니다! 구매한 모든 상품은 1시간마다 대략적인 위치에 도착합니다.\n\n\n"; break; case "buyBoombox": val3.result.displayText = "붐박스를 주문하려고 합니다. 수량: [variableAmount]. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "[variableAmount]개의 붐박스를 주문했습니다. 당신의 현재 소지금은 [playerCredits]입니다.\n\n우리의 계약자는 작업 중에도 빠른 무료 배송 혜택을 누릴 수 있습니다! 구매한 모든 상품은 1시간마다 대략적인 위치에 도착합니다.\n\n\n"; break; case "buyExtensLadder": val3.result.displayText = "연장형 사다리를 주문하려고 합니다. 수량: [variableAmount]. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "[variableAmount]개의 연장형 사다리를 주문했습니다. 당신의 현재 소지금은 [playerCredits]입니다.\n\n우리의 계약자는 작업 중에도 빠른 무료 배송 혜택을 누릴 수 있습니다! 구매한 모든 상품은 1시간마다 대략적인 위치에 도착합니다.\n\n\n"; break; case "buyJetpack": val3.result.displayText = "제트팩을 주문하려고 합니다. 수량: [variableAmount]. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "[variableAmount]개의 제트팩을 주문했습니다. 당신의 현재 소지금은 [playerCredits]입니다.\n\n우리의 계약자는 작업 중에도 빠른 무료 배송 혜택을 누릴 수 있습니다! 구매한 모든 상품은 1시간마다 대략적인 위치에 도착합니다.\n\n\n"; break; case "buyRadarBooster": val3.result.displayText = "레이더 부스터를 주문하려고 합니다. 수량: [variableAmount]. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "[variableAmount]개의 레이더 부스터를 주문했습니다. 당신의 현재 소지금은 [playerCredits]입니다.\n\n우리의 계약자는 작업 중에도 빠른 무료 배송 혜택을 누릴 수 있습니다! 구매한 모든 상품은 1시간마다 대략적인 위치에 도착합니다.\n\n\n"; break; case "buyShovel": val3.result.displayText = "철제 삽을 주문하려고 합니다. 수량: [variableAmount]. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "[variableAmount]개의 철제 삽을 주문했습니다. 당신의 현재 소지금은 [playerCredits]입니다.\n\n우리의 계약자는 작업 중에도 빠른 무료 배송 혜택을 누릴 수 있습니다! 구매한 모든 상품은 1시간마다 대략적인 위치에 도착합니다.\n\n\n"; break; case "buySpraypaint": val3.result.displayText = "스프레이 페인트를 주문하려고 합니다. 수량: [variableAmount]. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "[variableAmount]개의 스프레이 페인트를 주문했습니다. 당신의 현재 소지금은 [playerCredits]입니다.\n\n우리의 계약자는 작업 중에도 빠른 무료 배송 혜택을 누릴 수 있습니다! 구매한 모든 상품은 1시간마다 대략적인 위치에 도착합니다.\n\n\n"; break; case "buyStunGrenade": val3.result.displayText = "기절 수류탄을 주문하려고 합니다. 수량: [variableAmount]. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "[variableAmount]개의 기절 수류탄을 주문했습니다. 당신의 현재 소지금은 [playerCredits]입니다.\n\n우리의 계약자는 작업 중에도 빠른 무료 배송 혜택을 누릴 수 있습니다! 구매한 모든 상품은 1시간마다 대략적인 위치에 도착합니다.\n\n\n"; break; case "buyTZP": val3.result.displayText = "TZP-흡입제를 주문하려고 합니다. 수량: [variableAmount]. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "[variableAmount]개의 TZP-흡입제를 주문했습니다. 당신의 현재 소지금은 [playerCredits]입니다.\n\n우리의 계약자는 작업 중에도 빠른 무료 배송 혜택을 누릴 수 있습니다! 구매한 모든 상품은 1시간마다 대략적인 위치에 도착합니다.\n\n\n"; break; case "buyWalkieTalkie": val3.result.displayText = "무전기를 주문하려고 합니다. 수량: [variableAmount]. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "[variableAmount]개의 무전기를 주문했습니다. 당신의 현재 소지금은 [playerCredits]입니다.\n\n우리의 계약자는 작업 중에도 빠른 무료 배송 혜택을 누릴 수 있습니다! 구매한 모든 상품은 1시간마다 대략적인 위치에 도착합니다.\n\n\n"; break; case "buyZapGun": val3.result.displayText = "잽건을 주문하려고 합니다. 수량: [variableAmount]. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "[variableAmount]개의 잽건을 주문했습니다. 당신의 현재 소지금은 [playerCredits]입니다.\n\n우리의 계약자는 작업 중에도 빠른 무료 배송 혜택을 누릴 수 있습니다! 구매한 모든 상품은 1시간마다 대략적인 위치에 도착합니다.\n\n\n"; break; case "buyWeedkiller": val3.result.displayText = "제초제를 주문하려고 합니다. 수량: [variableAmount]. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "[variableAmount]개의 제초제를 주문했습니다. 당신의 현재 소지금은 [playerCredits]입니다.\n\n우리의 계약자는 작업 중에도 빠른 무료 배송 혜택을 누릴 수 있습니다! 구매한 모든 상품은 1시간마다 대략적인 위치에 도착합니다.\n\n\n"; break; case "buyBeltBag": val3.result.displayText = "전술 벨트 배낭을 주문하려고 합니다. 수량: [variableAmount]. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "[variableAmount]개의 전술 벨트 배낭을 주문했습니다. 당신의 현재 소지금은 [playerCredits]입니다.\n\n우리의 계약자는 작업 중에도 빠른 무료 배송 혜택을 누릴 수 있습니다! 구매한 모든 상품은 1시간마다 대략적인 위치에 도착합니다.\n\n\n"; break; case "buyCruiser": val3.result.displayText = "컴퍼니 크루저를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "컴퍼니 크루저를 주문했습니다. 당신의 현재 소지금은 [playerCredits]입니다.\n\n당사는 이 제품의 품질을 매우 확신하며, 보증이 제공됩니다! 크루저를 분실하거나 파손한 경우, 한 번 무료로 교체할 수 있습니다. 차량을 운반하는 동안에는 아이템을 구매할 수 없습니다.\n\n"; break; case "CozyLightsBuy1": val3.result.creatureName = "아늑한 조명"; val3.result.displayText = "아늑한 조명을 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "아늑한 조명을 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n전등 스위치를 사용해 아늑한 조명을 활성화하세요.\n\n"; break; case "GreenSuitBuy1": val3.result.creatureName = "초록색 슈트"; val3.result.displayText = "초록색 슈트를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "초록색 슈트를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n\n"; break; case "HazardSuitBuy1": val3.result.creatureName = "방호복 슈트"; val3.result.displayText = "방호복 슈트를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "방호복 슈트를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n\n"; break; case "LoudHornBuy1": val3.result.creatureName = "시끄러운 경적"; val3.result.displayText = "시끄러운 경적을 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "시끄러운 경적을 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n함선 안의 물체를 재배치하려면 [B]를 누르세요. 배치를 확정하려면 [V]를 누르세요.\n코드를 길게 당겨 시끄러운 경적을 활성화합니다.\n\n"; break; case "PajamaSuitBuy1": val3.result.creatureName = "파자마 슈트"; val3.result.displayText = "파자마 슈트를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "파자마 슈트를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n\n"; break; case "PurpleSuitBuy1": val3.result.creatureName = "보라색 슈트"; val3.result.displayText = "보라색 슈트를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "보라색 슈트를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n\n"; break; case "RomTableBuy1": val3.result.creatureName = "로맨틱한 테이블"; val3.result.displayText = "로맨틱한 테이블을 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "로맨틱한 테이블을 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n함선 안의 물체를 재배치하려면 [B]를 누르세요. 배치를 확정하려면 [V]를 누르세요.\n\n"; break; case "SofaChairBuy": val3.result.creatureName = "소파 의자"; val3.result.displayText = "소파 의자를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "소파 의자를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n"; break; case "MicrowaveBuy": val3.result.creatureName = "전자레인지"; val3.result.displayText = "전자레인지를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "전자레인지를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n"; break; case "FridgeBuy": val3.result.creatureName = "냉장고"; val3.result.displayText = "냉장고를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "냉장고를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n"; break; case "ElectricChairBuy": val3.result.creatureName = "전기 의자"; val3.result.displayText = "전기 의자를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "전기 의자를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n"; break; case "DoghouseBuy": val3.result.creatureName = "개집"; val3.result.displayText = "개집을 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "개집을 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n"; break; case "ClassicPaintingBuy": val3.result.creatureName = "고전적인 그림"; val3.result.displayText = "고전적인 그림을 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "고전적인 그림을 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n"; break; case "ShowerBuy1": val3.result.creatureName = "샤워 부스"; val3.result.displayText = "샤워 부스를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "샤워 부스를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n함선 안의 물체를 재배치하려면 [B]를 누르세요. 배치를 확정하려면 [V]를 누르세요.\n\n"; break; case "TableBuy1": val3.result.creatureName = "테이블"; val3.result.displayText = "테이블을 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "테이블을 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n함선 안의 물체를 재배치하려면 [B]를 누르세요. 배치를 확정하려면 [V]를 누르세요.\n\n"; break; case "TeleporterBuy1": val3.result.creatureName = "순간이동기"; val3.result.displayText = "순간이동기를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "순간이동기를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n버튼을 눌러 순간이동기를 활성화합니다. 현재 함선의 레이더에 모니터링 중인 사람을 순간이동시킵니다. 순간이동기를 통해 보유한 아이템은 보관할 수 없습니다. 재충전하는 데 약 10초가 걸립니다.\n\n함선 안의 물체를 재배치하려면 [B]를 누르세요. 배치를 확정하려면 [V]를 누르세요.\n\n"; break; case "InverseTeleporterBuy": val3.result.creatureName = "역방향 순간이동기"; val3.result.displayText = "역방향 순간이동기를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "역방향 순간이동기를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n함선 안의 물체를 재배치하려면 [B]를 누르세요. 배치를 확정하려면 [V]를 누르세요.\n\n버튼을 누르고 역방향 순간이동기가 활성화되는 동안 위에 올라가세요.\n\n"; break; case "TelevisionBuy1": val3.result.creatureName = "텔레비전"; val3.result.displayText = "텔레비전을 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "텔레비전을 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n함선 안의 물체를 재배치하려면 [B]를 누르세요. 배치를 확정하려면 [V]를 누르세요.\n\n"; break; case "ToiletBuy1": val3.result.creatureName = "변기"; val3.result.displayText = "변기를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "변기를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n함선 안의 물체를 재배치하려면 [B]를 누르세요. 배치를 확정하려면 [V]를 누르세요.\n\n"; break; case "WelcomeMatBuy": val3.result.creatureName = "웰컴 매트"; val3.result.displayText = "웰컴 매트를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "웰컴 매트를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n함선 안의 물체를 재배치하려면 [B]를 누르세요. 배치를 확정하려면 [V]를 누르세요.\n\n"; break; case "SignalTranslatorBuy": val3.result.creatureName = "신호 해석기"; val3.result.displayText = "신호 해석기를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "신호 해석기를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n함선 안의 물체를 재배치하려면 [B]를 누르세요. 배치를 확정하려면 [V]를 누르세요.\n\n\n신호 해석기는 'transmit' 명령 뒤에 10글자 미만의 메시지를 입력해서 사용할 수 있습니다.\n\n"; break; case "FishBowlBuy": val3.result.creatureName = "금붕어"; val3.result.displayText = "금붕어 어항을 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "금붕어 어항을 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n함선 안의 물체를 재배치하려면 [B]를 누르세요. 배치를 확정하려면 [V]를 누르세요.\n\n"; break; case "DiscoBallBuy": val3.result.creatureName = "디스코 볼"; val3.result.displayText = "디스코 볼을 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "디스코 볼을 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n전등 스위치를 사용해 디스코를 시작합니다.\n\n"; break; case "RecordPlayerBuy": val3.result.creatureName = "레코드 플레이어"; val3.result.displayText = "레코드 플레이어를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "레코드 플레이어를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n함선 안의 물체를 재배치하려면 [B]를 누르세요. 배치를 확정하려면 [V]를 누르세요.\n\n"; break; case "JackOLanternBuy": val3.result.creatureName = "잭오랜턴"; val3.result.displayText = "잭오랜턴을 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "잭오랜턴을 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n함선 안의 물체를 재배치하려면 [B]를 누르세요. 배치를 확정하려면 [V]를 누르세요.\n\n"; break; case "BunnySuitBuy": val3.result.creatureName = "토끼 슈트"; val3.result.displayText = "토끼 슈트를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "토끼 슈트를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n\n"; break; case "BeeSuitBuy": val3.result.creatureName = "꿀벌 슈트"; val3.result.displayText = "꿀벌 슈트를 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "꿀벌 슈트를 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n\n"; break; case "PlushiePajamaManBuy": val3.result.creatureName = "인형 파자마 맨"; val3.result.displayText = "인형 파자마 맨을 주문하려고 합니다. \n아이템의 총 가격: [totalCost].\n\n" + confirmString.ToUpper() + " 또는 " + denyString.ToUpper() + "을(를) 입력하세요.\n\n"; val3.result.terminalOptions[0].result.displayText = "인형 파자마 맨을 주문했습니다! 당신의 현재 소지금은 [playerCredits]입니다.\n함선 안의 물체를 재배치하려면 [B]를 누르세요. 배치를 확정하려면 [V]를 누르세요.\n\n"; break; } } break; } case "info": { CompatibleNoun[] compatibleNouns3 = val.compatibleNouns; foreach (CompatibleNoun val4 in compatibleNouns3) { switch (((Object)val4.result).name) { case "FlashlightInfo": val4.result.displayText = "\n길어진 배터리 수명과 더욱 밝아진 전구 덕분에 동료들이 더 이상 어둠 속에 헤매지 않아도 됩니다!\n\n"; break; case "MapperInfo": val4.result.displayText = "\n빛 감지 및 거리 측정 기능을 사용하여 주변 환경을 한눈에 볼 수 있는 가장 진보된 지도 장치입니다.\n\n"; break; case "BBbulbInfo": val4.result.displayText = "\n가성비 좋은 광원입니다. 심지어 방수까지 됩니다!\n\n"; break; case "ShovelInfo": val4.result.displayText = "\n자기 방어를 위해!\n\n"; break; case "ZapGunInfo": val4.result.displayText = "\n80,000 볼트 이상을 보낼 수 있는 가장 특화된 자기 보호 장비!\n\n최대한 오래 표적을 유지하려면 총을 좌우로 당겨 광선을 직선으로 유지해야 합니다. 전류가 흐르는 동안에만 기절시킬 수 있습니다.\n\n"; break; case "AutopickerInfo": val4.result.displayText = "\n자물쇠 따개는 업무 효율을 높일 수 있는 무한한 잠재력을 열어줍니다. 독점 AI 소프트웨어로 구동되며, 잠긴 문을 열 수 있도록 도와줍니다.\n\n"; break; case "WalkieTalkieInfo": val4.result.displayText = "\n연락을 유지하는 데 유용합니다! 무전기가 인벤토리에 있으면 다른 플레이어의 목소리를 들을 수 있습니다. 음성을 전송하려면 손에 든 상태로 버튼을 눌러야 합니다.\n\n"; break; case "SurvivalKitInfo": val4.result.displayText = "\n생존 키트에는 이러한 필수품이 편리한 패키지에 포함되어 있습니다! :\n\n* 손전등 x4\n* 무전기 x4\n* 철제 삽 x2"; break; case "BoomboxInfo": val4.result.displayText = "\n이 흥겨운 음악은 팀원들의 사기를 복돋우는 데 아주 좋을 것입니다!\n\n"; break; case "JetpackInfo": val4.result.displayText = "\n이 장비를 이용해 어디든 갈 수 있습니다! 책임감 있게 사용하세요!\n\n"; break; case "TZPChemicalInfo": val4.result.displayText = "\n이 안전하고 합법적인 약을 투여하면 업무 수행에 큰 도움이 됩니다! 무거운 물건을 들고 먼 거리를 이동하는 능력이 누구에게도 뒤쳐지지 않을 것입니다! 경고: TZP 가스는 장시간 노출 시 뇌에 영향을 미칠 수 있습니다. 용기와 함께 제공된 사용 설명서를 따르십시오.\n나눠주는 걸 잊지 마세요!\n\n"; break; case "ExtensionLadderInfo": val4.result.displayText = "\n연장형 사다리는 9미터까지 올라갈 수 있습니다! 이 사다리를 이용해 절벽을 오르고 별을 향해 손을 뻗어 보세요! 배터리를 절약하기 위해 연장형 사다리는 18초 후에 자동으로 수납됩니다.\n\n"; break; case "RadarBoosterInfo": val4.result.displayText = "\n레이더 부스터는 다양한 용도로 사용할 수 있습니다!\n\n레이더 부스터의 이름 앞에 \"SWITCH\" 명령어를 입력하여 메인 모니터에서 레이더 부스터를 확인합니다. 활성화되어 있어야만 합니다.\n\n레이더 부스터의 이름 앞에 \"PING\" 명령어를 입력하여 장치에서 특수한 소리를 재생합니다.\n\n"; break; case "WeedKillerInfo": val4.result.displayText = "성가신 잡초를 처리하세요! 잡초의 뿌리를 바라보고 방아쇠를 반복해서 누르기만 하면 됩니다!"; break; case "BeltBagInfo": val4.result.displayText = "우리 회사의 전술 벨트 배낭은 모든 것을 가지고 다니고 싶은 분들을 위한 필수품입니다! 한 번에 15개의 유틸리티 아이템을 넣을 수 있습니다. 다시는 쓸모없다고 느낄 일이 없을 겁니다!\n\n[Q]를 눌러 가방에 아이템을 보관한 다음, 클릭하여 내용물을 확인하고 아이템을 드래그하면 됩니다. 가방을 허리에 착용한 상태에서는 다른 플레이어도 배낭을 사용할 수 있습니다.\n\n"; break; case "CruiserInfo": val4.result.displayText = "컴퍼니 크루저는 필요한 만큼 많은 물품, 심지어 동료 직원까지 운반할 수 있는 배달 트럭입니다! 컴퍼니 크루저를 구매하시면 무상 보증이 제공됩니다. 당사는 내구성과 유용성에 대한 자신감으로 가득하기 때문이죠!\n\n지침서가 함께 제공되므로 사용법을 꼭 읽어보시길 바랍니다."; break; case "LoudHornInfo": val4.result.displayText = "\n무전기 없이도 모든 팀원과 원거리에서 소통할 수 있습니다! 경적은 어디서나 들을 수 있습니다. 하지만 무슨 뜻일까요? 그건 당신에게 달려 있습니다!\n\n"; break; case "TeleporterInfo": val4.result.displayText = "버튼을 눌러 순간이동기를 활성화합니다. 현재 함선의 레이더에 모니터링 중인 사람을 순간이동시킵니다. 순간이동기를 통해 보유한 아이템은 보관할 수 없습니다. 재충전하는 데 약 10초가 걸립니다.\n\n"; break; case "InverseTeleporterInfo": val4.result.displayText = "\n역방향 순간이동기는 순간이동기의 변형으로, 함선 외부의 임의 위치로 순간이동합니다. 모든 아이템은 이동 전에 순간이동기 위에 떨어집니다. 역방향 순간이동기는 모든 플레이어가 한 번에 사용할 수 있으며 재사용 대기시간은 3.5분입니다.\n\n면책 조항: 역방향 순간이동기는 사용자를 밖으로만 이동시킬 수 있고 안으로 이동시킬 수 없으며, 갇힐 수 있습니다. 회사는 양자 얽힘 및 불운으로 인한 부상이나 머리와 팔다리의 교체에 대해 책임을 지지 않습니다.\n\n"; break; case "SignalTranslatorInfo": val4.result.displayText = "\n'transmit' 명령을 사용하여 모든 팀원에게 메시지를 전송합니다. 메시지는 10자 이내여야 합니다.\n\n"; break; case "CompanyBuildingInfo": val4.result.displayText = "회사가 귀하의 상품을 [companyBuyingPercent]에 매입하고 있습니다. \n\n업무 중에 수집한 귀중한 폐품을 여기로 가져가세요. 판매 비율은 매시간 업데이트되며 며칠에 걸쳐 변동됩니다. \n\n"; break; case "ExpInfo": val4.result.displayText = "41-익스페리멘테이션\n\n----------------------\n\n조건: 건조하며, 거주 가능성이 낮습니다. 산업 인공물로 인해 악화되었습니다.\n\n역사: 거대 기체 행성인 빅 그린과 가까이 있기 때문에 꽤 오랫동안 발견되지 않았습니다. 그러나 비밀리에 사용되어 온 것으로 보입니다.\n\n동물군: 알 수 없음\n\n"; break; case "AssInfo": val4.result.displayText = "220-어슈어런스\n----------------------\n\n조건: 쌍둥이 달인