Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
2 changes: 1 addition & 1 deletion addons/netfox.extras/plugin.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
name="netfox.extras"
description="Game-specific utilities for Netfox"
author="Tamas Galffy and contributors"
version="1.43.2"
version="1.43.3"
script="netfox-extras.gd"
8 changes: 5 additions & 3 deletions addons/netfox.extras/rewindable-random-number-generator.gd
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,16 @@ class_name RewindableRandomNumberGenerator
## @tutorial(RewindableRandomNumberGenerator Guide): https://foxssake.github.io/netfox/latest/netfox.extras/guides/rewindable-random-number-generator/

var _rng: RandomNumberGenerator
var _seed := 0
var _last_reset_tick := -1
var _last_reset_rollback_tick := -1

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

func _init(p_seed: int):
_seed = p_seed
_rng = RandomNumberGenerator.new()
_rng.set_seed(p_seed)
_rng.set_seed(_seed)

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

if NetworkRollback.is_rollback():
_rng.state = hash([_rng.seed, NetworkRollback.tick])
_rng.seed = hash([_seed, NetworkRollback.tick])
else:
_rng.state = hash([_rng.seed, NetworkTime.tick])
_rng.seed = hash([_seed, NetworkTime.tick])

_last_reset_rollback_tick = NetworkRollback.tick
_last_reset_tick = NetworkTime.tick
2 changes: 1 addition & 1 deletion addons/netfox.internals/plugin.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
name="netfox.internals"
description="Shared internals for netfox addons"
author="Tamas Galffy and contributors"
version="1.43.2"
version="1.43.3"
script="plugin.gd"
2 changes: 1 addition & 1 deletion addons/netfox.noray/plugin.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
name="netfox.noray"
description="Bulletproof your connectivity with noray integration for netfox"
author="Tamas Galffy and contributors"
version="1.43.2"
version="1.43.3"
script="netfox-noray.gd"
2 changes: 1 addition & 1 deletion addons/netfox/plugin.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
name="netfox"
description="Shared internals for netfox addons"
author="Tamas Galffy and contributors"
version="1.43.2"
version="1.43.3"
script="netfox.gd"
27 changes: 23 additions & 4 deletions test/netfox.extras/rewindable-random-number-generator.test.gd
Original file line number Diff line number Diff line change
@@ -1,33 +1,40 @@
extends VestTest

const SOME_SEED = 3079
const OTHER_SEED = 9875

func get_suite_name():
return "RewindableRandomNumberGenerator"

func suite():
test("should generate the same numbers for the same rollback tick in different loop", func():
NetworkMocks.in_rollback(func():
var rng := RewindableRandomNumberGenerator.new(0)
var rng := RewindableRandomNumberGenerator.new(SOME_SEED)

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

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

Vest.message("First batch: %s" % [first_batch])
Vest.message("Second batch: %s" % [second_batch])
expect_equal(first_batch, second_batch)
)
)

test("should generate different numbers for different ticks", func():
NetworkMocks.in_rollback(func():
var rng := RewindableRandomNumberGenerator.new(0)
var rng := RewindableRandomNumberGenerator.new(SOME_SEED)

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

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

Vest.message("First batch: %s" % [first_batch])
Vest.message("Second batch: %s" % [second_batch])
expect_not_equal(first_batch, second_batch)
)
)
Expand All @@ -36,12 +43,24 @@ func suite():
NetworkMocks.in_rollback(func():
NetworkMocks.set_tick(0, 0)

var first_rng := RewindableRandomNumberGenerator.new(1)
var second_rng := RewindableRandomNumberGenerator.new(2)
var first_rng := RewindableRandomNumberGenerator.new(SOME_SEED)
var second_rng := RewindableRandomNumberGenerator.new(OTHER_SEED)

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

Vest.message("First batch: %s" % [first_batch])
Vest.message("Second batch: %s" % [second_batch])
expect_not_equal(first_batch, second_batch)
)
)

test("randf_range() should not need warmup", func():
var rrng := RewindableRandomNumberGenerator.new(SOME_SEED)

var batch := range(4).map(func(__): return rrng.randf_range(-1., 1.))

Vest.message("Batch: %s" % [batch])
expect_not_equal(batch[0], -1., "RRNG shouldn't start at lower bound!")
expect_not_equal(batch[0], +1., "RRNG shouldn't start at upper bound!")
)
Loading