Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Content.Tests/DMProject/Tests/Stdlib/generator_rand.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
/proc/RunTest()
var/generator/gen = generator("num", -1, 1)
var/result = gen.Rand()
ASSERT(isnum(result))
ASSERT((result >= -1 || result <= 1))
1 change: 0 additions & 1 deletion DMCompiler/DMStandard/Types/Generator.dm
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
var/_binobj as opendream_unimplemented

/generator/proc/Rand()
set opendream_unimplemented = TRUE

/*
Generator Theory
Expand Down
18 changes: 18 additions & 0 deletions OpenDreamRuntime/Objects/Types/DreamObjectVector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,24 @@ public static DreamObjectVector CreateFromValue(DreamValue value, DreamObjectTre
return vector;
}

/// <summary>
/// Creates a <see cref="DreamObjectVector"/> from a <see cref="Vector3"/>
/// </summary>
public static DreamObjectVector CreateFromValue(Vector3 value, DreamObjectTree tree) {
var vector = tree.CreateObject<DreamObjectVector>(tree.Vector);
vector.Initialize(new(new(value.X), new(value.Y), new(value.Z)));
return vector;
}

/// <summary>
/// Creates a <see cref="DreamObjectVector"/> from a <see cref="Vector2"/>
/// </summary>
public static DreamObjectVector CreateFromValue(Vector2 value, DreamObjectTree tree) {
var vector = tree.CreateObject<DreamObjectVector>(tree.Vector);
vector.Initialize(new(new(value.X), new(value.Y)));
return vector;
}

// TODO: Operators, supports indexing and "most math"
// TODO: For loop support
}
2 changes: 2 additions & 0 deletions OpenDreamRuntime/Procs/Native/DreamProcNative.cs
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,8 @@ public static void SetupNativeProcs(DreamObjectTree objectTree) {
objectTree.SetNativeProc(objectTree.DatabaseQuery, DreamProcNativeDatabaseQuery.NativeProc_NextRow);
objectTree.SetNativeProc(objectTree.DatabaseQuery, DreamProcNativeDatabaseQuery.NativeProc_RowsAffected);

objectTree.SetNativeProc(objectTree.Generator, DreamProcNativeGenerator.NativeProc_Rand);

SetOverridableNativeProc(objectTree, objectTree.World, DreamProcNativeWorld.NativeProc_Error);
SetOverridableNativeProc(objectTree, objectTree.World, DreamProcNativeWorld.NativeProc_Reboot);
}
Expand Down
44 changes: 44 additions & 0 deletions OpenDreamRuntime/Procs/Native/DreamProcNativeGenerator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
using OpenDreamRuntime.Objects;
using OpenDreamRuntime.Objects.Types;
using OpenDreamShared.Dream;
using Robust.Shared.Random;

namespace OpenDreamRuntime.Procs.Native;

internal static class DreamProcNativeGenerator {
[DreamProc("Rand")]
public static DreamValue NativeProc_Rand(NativeProc.Bundle bundle, DreamObject? src, DreamObject? usr) {
DreamObjectGenerator genObj = (DreamObjectGenerator)src!;

switch (genObj.Generator)
{
case GeneratorNum numGen:
{
var result = numGen.Generate(IoCManager.Resolve<IRobustRandom>());
return new DreamValue(result);
}
case GeneratorBox2:
case GeneratorVector2:
case GeneratorCircle:
case GeneratorSquare:
{
var vecGen = (IGeneratorVector)genObj.Generator;
var resultVector = vecGen.GenerateVector2(IoCManager.Resolve<IRobustRandom>());
var resultObj = DreamObjectVector.CreateFromValue(resultVector, bundle.ObjectTree);
return new DreamValue(resultObj);
}
case GeneratorBox3:
case GeneratorVector3:
case GeneratorSphere:
case GeneratorCube:
{
var vecGen = (IGeneratorVector)genObj.Generator;
var resultVector = vecGen.GenerateVector3(IoCManager.Resolve<IRobustRandom>());
var resultObj = DreamObjectVector.CreateFromValue(resultVector, bundle.ObjectTree);
return new DreamValue(resultObj);
}
default:
throw new Exception($"Invalid generator for Rand: {genObj}");
}
}
}
Loading