Skip to content

Commit 91da635

Browse files
authored
fix: Use correct RRNG state (#593)
RewindableRandomNumberGenerator was setting its internal RNG's `state` field to ensure consistency. This does not always work, since `state` might need to satisfy some criteria. The fix uses `seed` instead.
1 parent 5bda852 commit 91da635

6 files changed

Lines changed: 32 additions & 11 deletions

File tree

addons/netfox.extras/plugin.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
name="netfox.extras"
44
description="Game-specific utilities for Netfox"
55
author="Tamas Galffy and contributors"
6-
version="1.43.2"
6+
version="1.43.3"
77
script="netfox-extras.gd"

addons/netfox.extras/rewindable-random-number-generator.gd

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@ class_name RewindableRandomNumberGenerator
1717
## @tutorial(RewindableRandomNumberGenerator Guide): https://foxssake.github.io/netfox/latest/netfox.extras/guides/rewindable-random-number-generator/
1818

1919
var _rng: RandomNumberGenerator
20+
var _seed := 0
2021
var _last_reset_tick := -1
2122
var _last_reset_rollback_tick := -1
2223

2324
static var _logger := NetfoxLogger._for_extras("RewindableRandomNumberGenerator")
2425

2526
func _init(p_seed: int):
27+
_seed = p_seed
2628
_rng = RandomNumberGenerator.new()
27-
_rng.set_seed(p_seed)
29+
_rng.set_seed(_seed)
2830

2931
## Returns a pseudo-random float between [code]0.0[/code] and [code]1.0[/code]
3032
## (inclusive).
@@ -63,9 +65,9 @@ func _ensure_state() -> void:
6365
return
6466

6567
if NetworkRollback.is_rollback():
66-
_rng.state = hash([_rng.seed, NetworkRollback.tick])
68+
_rng.seed = hash([_seed, NetworkRollback.tick])
6769
else:
68-
_rng.state = hash([_rng.seed, NetworkTime.tick])
70+
_rng.seed = hash([_seed, NetworkTime.tick])
6971

7072
_last_reset_rollback_tick = NetworkRollback.tick
7173
_last_reset_tick = NetworkTime.tick

addons/netfox.internals/plugin.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
name="netfox.internals"
44
description="Shared internals for netfox addons"
55
author="Tamas Galffy and contributors"
6-
version="1.43.2"
6+
version="1.43.3"
77
script="plugin.gd"

addons/netfox.noray/plugin.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
name="netfox.noray"
44
description="Bulletproof your connectivity with noray integration for netfox"
55
author="Tamas Galffy and contributors"
6-
version="1.43.2"
6+
version="1.43.3"
77
script="netfox-noray.gd"

addons/netfox/plugin.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
name="netfox"
44
description="Shared internals for netfox addons"
55
author="Tamas Galffy and contributors"
6-
version="1.43.2"
6+
version="1.43.3"
77
script="netfox.gd"
Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,40 @@
11
extends VestTest
22

3+
const SOME_SEED = 3079
4+
const OTHER_SEED = 9875
5+
36
func get_suite_name():
47
return "RewindableRandomNumberGenerator"
58

69
func suite():
710
test("should generate the same numbers for the same rollback tick in different loop", func():
811
NetworkMocks.in_rollback(func():
9-
var rng := RewindableRandomNumberGenerator.new(0)
12+
var rng := RewindableRandomNumberGenerator.new(SOME_SEED)
1013

1114
NetworkMocks.set_tick(2, 4)
1215
var first_batch := range(4).map(func(__): return rng.randi_range(0, 10))
1316

1417
NetworkMocks.set_tick(3, 4)
1518
var second_batch := range(4).map(func(__): return rng.randi_range(0, 10))
1619

20+
Vest.message("First batch: %s" % [first_batch])
21+
Vest.message("Second batch: %s" % [second_batch])
1722
expect_equal(first_batch, second_batch)
1823
)
1924
)
2025

2126
test("should generate different numbers for different ticks", func():
2227
NetworkMocks.in_rollback(func():
23-
var rng := RewindableRandomNumberGenerator.new(0)
28+
var rng := RewindableRandomNumberGenerator.new(SOME_SEED)
2429

2530
NetworkMocks.set_tick(2, 4)
2631
var first_batch := range(4).map(func(__): return rng.randi_range(0, 10))
2732

2833
NetworkMocks.set_tick(2, 2)
2934
var second_batch := range(4).map(func(__): return rng.randi_range(0, 10))
3035

36+
Vest.message("First batch: %s" % [first_batch])
37+
Vest.message("Second batch: %s" % [second_batch])
3138
expect_not_equal(first_batch, second_batch)
3239
)
3340
)
@@ -36,12 +43,24 @@ func suite():
3643
NetworkMocks.in_rollback(func():
3744
NetworkMocks.set_tick(0, 0)
3845

39-
var first_rng := RewindableRandomNumberGenerator.new(1)
40-
var second_rng := RewindableRandomNumberGenerator.new(2)
46+
var first_rng := RewindableRandomNumberGenerator.new(SOME_SEED)
47+
var second_rng := RewindableRandomNumberGenerator.new(OTHER_SEED)
4148

4249
var first_batch := range(4).map(func(__): return first_rng.randi_range(0, 10))
4350
var second_batch := range(4).map(func(__): return second_rng.randi_range(0, 10))
4451

52+
Vest.message("First batch: %s" % [first_batch])
53+
Vest.message("Second batch: %s" % [second_batch])
4554
expect_not_equal(first_batch, second_batch)
4655
)
4756
)
57+
58+
test("randf_range() should not need warmup", func():
59+
var rrng := RewindableRandomNumberGenerator.new(SOME_SEED)
60+
61+
var batch := range(4).map(func(__): return rrng.randf_range(-1., 1.))
62+
63+
Vest.message("Batch: %s" % [batch])
64+
expect_not_equal(batch[0], -1., "RRNG shouldn't start at lower bound!")
65+
expect_not_equal(batch[0], +1., "RRNG shouldn't start at upper bound!")
66+
)

0 commit comments

Comments
 (0)