diff --git a/DMCompiler/DMStandard/UnsortedAdditions.dm b/DMCompiler/DMStandard/UnsortedAdditions.dm index 31564bf37a..80f3d3821f 100644 --- a/DMCompiler/DMStandard/UnsortedAdditions.dm +++ b/DMCompiler/DMStandard/UnsortedAdditions.dm @@ -6,30 +6,16 @@ /proc/eval(script) set opendream_unsupported = "eval() is officialy deprecated" -/proc/findlasttext_char(Haystack,Needle,Start=0,End=1) - set opendream_unimplemented = TRUE -/proc/findlasttextEx_char(Haystack,Needle,Start=1,End=0) - set opendream_unimplemented = TRUE -/proc/findtext_char(Haystack,Needle,Start=1,End=0) - set opendream_unimplemented = TRUE -/proc/findtextEx_char(Haystack,Needle,Start=1,End=0) - set opendream_unimplemented = TRUE /proc/load_resource(File) set opendream_unimplemented = TRUE proc/missile(Type, Start, End) set opendream_unimplemented = TRUE /proc/obounds(Ref=src, Dist=0) set opendream_unimplemented = TRUE -/proc/replacetext_char(Haystack,Needle,Replacement,Start=1,End=0) - set opendream_unimplemented = TRUE /proc/run(File) set opendream_unimplemented = TRUE /proc/shell(command) set opendream_unimplemented = TRUE -/proc/nonspantext_char(Haystack,Needles,Start=1) - set opendream_unimplemented = TRUE -/proc/splittext_char(Text,Start=1,End=0,Insert="") - set opendream_unimplemented = TRUE /proc/bound_pixloc(var/atom/Atom, var/Dir as num) as /pixloc set opendream_unimplemented = TRUE diff --git a/DMCompiler/DMStandard/_Standard.dm b/DMCompiler/DMStandard/_Standard.dm index 3657df57ce..4e151cefc4 100644 --- a/DMCompiler/DMStandard/_Standard.dm +++ b/DMCompiler/DMStandard/_Standard.dm @@ -21,9 +21,13 @@ proc/file(Path) proc/file2text(File) as text|null proc/filter(type, ...) proc/findtext(Haystack, Needle, Start = 1, End = 0) as num +proc/findtext_char(Haystack, Needle, Start = 1, End = 0) as num proc/findtextEx(Haystack, Needle, Start = 1, End = 0) as num +proc/findtextEx_char(Haystack, Needle, Start = 1, End = 0) as num proc/findlasttext(Haystack, Needle, Start = 0, End = 1) as num +proc/findlasttext_char(Haystack, Needle, Start = 0, End = 1) as num proc/findlasttextEx(Haystack, Needle, Start = 0, End = 1) as num +proc/findlasttextEx_char(Haystack, Needle, Start = 1, End = 0) as num proc/flick(Icon, Object) proc/flist(Path) as /list proc/floor(A) as num @@ -67,6 +71,7 @@ proc/noise_hash(...) as num set opendream_unimplemented = 1 return 0.5 proc/nonspantext(Haystack, Needles, Start = 1) as num +proc/nonspantext_char(Haystack, Needles, Start = 1) as num proc/num2text(N, A, B) as text proc/orange(Dist = 5, Center = usr) as /list|null // NOTE: Not sure if return types have BYOND parity proc/oview(Dist = 5, Center = usr) as /list @@ -78,7 +83,9 @@ proc/rand_seed(Seed) as null proc/range(Dist, Center) as /list|null // NOTE: Not sure if return types have BYOND parity proc/ref(Object) as text proc/replacetext(Haystack, Needle, Replacement, Start = 1, End = 0) as text|null +proc/replacetext_char(Haystack, Needle, Replacement, Start = 1, End = 0) as text|null proc/replacetextEx(Haystack, Needle, Replacement, Start = 1, End = 0) as text|null +proc/replacetextEx_char(Haystack, Needle, Replacement, Start = 1, End = 0) as text|null proc/rgb(R, G, B, A, space) as text|null proc/rgb2num(color, space = COLORSPACE_RGB) as /list proc/roll(ndice = 1, sides) as num @@ -94,7 +101,8 @@ proc/spantext(Haystack,Needles,Start=1) as num proc/spantext_char(Haystack,Needles,Start=1) as num proc/splicetext(Text, Start = 1, End = 0, Insert = "") as text|null proc/splicetext_char(Text, Start = 1, End = 0, Insert = "") as text|null -proc/splittext(Text, Delimiter) as /list +proc/splittext(Text, Delimiter, Start = 1, End = 0, include_delimiters = 0) as /list +proc/splittext_char(Text, Delimiter, Start = 1, End = 0, include_delimiters = 0) as /list proc/stat(Name, Value) proc/statpanel(Panel, Name, Value) proc/text2ascii(T, pos = 1) as text @@ -156,10 +164,6 @@ proc/winset(player, control_id, params) #include "Types\Atoms\Turf.dm" #include "UnsortedAdditions.dm" -proc/replacetextEx_char(Haystack as text, Needle, Replacement, Start = 1, End = 0) as text - set opendream_unimplemented = TRUE - return Haystack - /proc/step(atom/movable/Ref as /atom/movable, var/Dir, var/Speed=0) as num //TODO: Speed = step_size if Speed is 0 return Ref.Move(get_step(Ref, Dir), Dir) diff --git a/OpenDreamRuntime/Procs/Native/DreamProcNative.cs b/OpenDreamRuntime/Procs/Native/DreamProcNative.cs index e5e22c96ba..c93182b58c 100644 --- a/OpenDreamRuntime/Procs/Native/DreamProcNative.cs +++ b/OpenDreamRuntime/Procs/Native/DreamProcNative.cs @@ -26,9 +26,13 @@ public static void SetupNativeProcs(DreamObjectTree objectTree) { objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_file2text); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_filter); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_findtext); + objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_findtext_char); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_findtextEx); + objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_findtextEx_char); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_findlasttext); + objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_findlasttext_char); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_findlasttextEx); + objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_findlasttextEx_char); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_flick); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_flist); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_floor); @@ -69,6 +73,7 @@ public static void SetupNativeProcs(DreamObjectTree objectTree) { objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_md5); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_min); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_nonspantext); + objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_nonspantext_char); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_num2text); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_ohearers); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_orange); @@ -81,7 +86,9 @@ public static void SetupNativeProcs(DreamObjectTree objectTree) { objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_ref); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_regex); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_replacetext); + objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_replacetext_char); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_replacetextEx); + objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_replacetextEx_char); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_rgb2num); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_roll); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_round); @@ -97,6 +104,7 @@ public static void SetupNativeProcs(DreamObjectTree objectTree) { objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_splicetext); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_splicetext_char); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_splittext); + objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_splittext_char); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_stat); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_statpanel); objectTree.SetGlobalNativeProc(DreamProcNativeRoot.NativeProc_text2ascii); diff --git a/OpenDreamRuntime/Procs/Native/DreamProcNativeRoot.cs b/OpenDreamRuntime/Procs/Native/DreamProcNativeRoot.cs index 35f4508e5c..aec6a47469 100644 --- a/OpenDreamRuntime/Procs/Native/DreamProcNativeRoot.cs +++ b/OpenDreamRuntime/Procs/Native/DreamProcNativeRoot.cs @@ -885,6 +885,16 @@ public static DreamValue NativeProc_findtext(NativeProc.Bundle bundle, DreamObje return new DreamValue(needleIndex + 1); //1-indexed } + [DreamProc("findtext_char")] + [DreamProcParameter("Haystack", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Needle", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Start", Type = DreamValueTypeFlag.Float, DefaultValue = 1)] + [DreamProcParameter("End", Type = DreamValueTypeFlag.Float, DefaultValue = 0)] + public static DreamValue NativeProc_findtext_char(NativeProc.Bundle bundle, DreamObject? src, DreamObject? usr) { + //Wrapper function, Opendream defaults to counting by chars instead of bytes. + return NativeProc_findtext(bundle, src, usr); + } + [DreamProc("findtextEx")] [DreamProcParameter("Haystack", Type = DreamValueTypeFlag.String)] [DreamProcParameter("Needle", Type = DreamValueTypeFlag.String)] @@ -930,6 +940,16 @@ public static DreamValue NativeProc_findtextEx(NativeProc.Bundle bundle, DreamOb } } + [DreamProc("findtextEx_char")] + [DreamProcParameter("Haystack", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Needle", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Start", Type = DreamValueTypeFlag.Float, DefaultValue = 1)] + [DreamProcParameter("End", Type = DreamValueTypeFlag.Float, DefaultValue = 0)] + public static DreamValue NativeProc_findtextEx_char(NativeProc.Bundle bundle, DreamObject? src, DreamObject? usr) { + //Wrapper function, Opendream defaults to counting by chars instead of bytes. + return NativeProc_findtextEx(bundle, src, usr); + } + [DreamProc("findlasttext")] [DreamProcParameter("Haystack", Type = DreamValueTypeFlag.String)] [DreamProcParameter("Needle", Type = DreamValueTypeFlag.String)] @@ -968,6 +988,15 @@ public static DreamValue NativeProc_findlasttext(NativeProc.Bundle bundle, Dream return new DreamValue(needleIndex + 1); //1-indexed, or 0 if not found (LastIndexOf returns -1 if not found) } + [DreamProc("findlasttext_char")] + [DreamProcParameter("Haystack", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Needle", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Start", Type = DreamValueTypeFlag.Float, DefaultValue = 0)] + [DreamProcParameter("End", Type = DreamValueTypeFlag.Float, DefaultValue = 1)] + public static DreamValue NativeProc_findlasttext_char(NativeProc.Bundle bundle, DreamObject? src, DreamObject? usr) { + return NativeProc_findlasttext(bundle, src, usr); + } + [DreamProc("findlasttextEx")] [DreamProcParameter("Haystack", Type = DreamValueTypeFlag.String)] [DreamProcParameter("Needle", Type = DreamValueTypeFlag.String)] @@ -1007,6 +1036,16 @@ public static DreamValue NativeProc_findlasttextEx(NativeProc.Bundle bundle, Dre return new DreamValue(needleIndex + 1); //1-indexed, or 0 if not found (LastIndexOf returns -1 if not found) } + [DreamProc("findlasttextEx_char")] + [DreamProcParameter("Haystack", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Needle", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Start", Type = DreamValueTypeFlag.Float, DefaultValue = 0)] + [DreamProcParameter("End", Type = DreamValueTypeFlag.Float, DefaultValue = 1)] + public static DreamValue NativeProc_findlasttextEx_char(NativeProc.Bundle bundle, DreamObject? src, DreamObject? usr) { + //Wrapper function, Opendream defaults to counting by chars instead of bytes. + return NativeProc_findlasttextEx(bundle, src, usr); + } + [DreamProc("flick")] [DreamProcParameter("Icon", Type = DreamValueTypeFlag.String | DreamValueTypeFlag.DreamResource)] [DreamProcParameter("Object", Type = DreamValueTypeFlag.String | DreamValueTypeFlag.DreamResource)] @@ -2002,6 +2041,15 @@ public static DreamValue NativeProc_nonspantext(NativeProc.Bundle bundle, DreamO return new DreamValue(index); } + [DreamProc("nonspantext_char")] + [DreamProcParameter("Haystack", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Needles", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Start", Type = DreamValueTypeFlag.Float, DefaultValue = 1)] + public static DreamValue NativeProc_nonspantext_char(NativeProc.Bundle bundle, DreamObject? src, DreamObject? usr) { + //Wrapper function, Opendream defaults to counting by chars instead of bytes. + return NativeProc_nonspantext(bundle, src, usr); + } + [DreamProc("num2text")] [DreamProcParameter("N")] [DreamProcParameter("A", Type = DreamValueTypeFlag.Float)] @@ -2334,6 +2382,17 @@ public static DreamValue NativeProc_replacetext(NativeProc.Bundle bundle, DreamO throw new Exception($"Invalid needle {needle}"); } + [DreamProc("replacetext_char")] + [DreamProcParameter("Haystack", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Needle", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Replacement", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Start", Type = DreamValueTypeFlag.Float, DefaultValue = 1)] + [DreamProcParameter("End", Type = DreamValueTypeFlag.Float, DefaultValue = 0)] + public static DreamValue NativeProc_replacetext_char(NativeProc.Bundle bundle, DreamObject? src, DreamObject? usr) { + //Wrapper function, Opendream defaults to counting by chars instead of bytes. + return NativeProc_replacetext(bundle, src, usr); + } + [DreamProc("replacetextEx")] [DreamProcParameter("Haystack", Type = DreamValueTypeFlag.String)] [DreamProcParameter("Needle", Type = DreamValueTypeFlag.String)] @@ -2381,6 +2440,17 @@ public static DreamValue NativeProc_replacetextEx(NativeProc.Bundle bundle, Drea return new DreamValue(text.Substring(start - 1, end - start).Replace(needle, replacement, StringComparison.Ordinal)); } + [DreamProc("replacetextEx_char")] + [DreamProcParameter("Haystack", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Needle", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Replacement", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Start", Type = DreamValueTypeFlag.Float, DefaultValue = 1)] + [DreamProcParameter("End", Type = DreamValueTypeFlag.Float, DefaultValue = 0)] + public static DreamValue NativeProc_replacetextEx_char(NativeProc.Bundle bundle, DreamObject? src, DreamObject? usr) { + //Wrapper function, Opendream defaults to counting by chars instead of bytes. + return NativeProc_replacetextEx(bundle, src, usr); + } + [DreamProc("rgb2num")] [DreamProcParameter("color", Type = DreamValueTypeFlag.String, DefaultValue = "#FFFFFF")] [DreamProcParameter("space", Type = DreamValueTypeFlag.Float, DefaultValue = 0)] // Same value as COLORSPACE_RGB @@ -2852,6 +2922,17 @@ public static DreamValue NativeProc_splittext(NativeProc.Bundle bundle, DreamObj } } + [DreamProc("splittext_char")] + [DreamProcParameter("Text", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Delimiter", Type = DreamValueTypeFlag.String)] + [DreamProcParameter("Start", Type = DreamValueTypeFlag.Float, DefaultValue = 1)] + [DreamProcParameter("End", Type = DreamValueTypeFlag.Float, DefaultValue = 0)] + [DreamProcParameter("include_delimiters", Type = DreamValueTypeFlag.Float, DefaultValue = 0)] + public static DreamValue NativeProc_splittext_char(NativeProc.Bundle bundle, DreamObject? src, DreamObject? usr) { + //Wrapper function, Opendream defaults to counting by chars instead of bytes. + return NativeProc_splittext(bundle, src, usr); + } + private static void OutputToStatPanel(DreamManager dreamManager, DreamConnection connection, DreamValue name, DreamValue value) { if (name.IsNull && value.TryGetValueAsDreamList(out var list)) { foreach (var item in list.EnumerateValues())