|
@ -611,16 +611,6 @@ BEGIN_OPERATOR(query) |
|
|
} |
|
|
} |
|
|
END_OPERATOR |
|
|
END_OPERATOR |
|
|
|
|
|
|
|
|
static Usz hash32_shift_mult(Usz key) { |
|
|
|
|
|
Usz c2 = UINT32_C(0x27d4eb2d); |
|
|
|
|
|
key = (key ^ UINT32_C(61)) ^ (key >> UINT32_C(16)); |
|
|
|
|
|
key = key + (key << UINT32_C(3)); |
|
|
|
|
|
key = key ^ (key >> UINT32_C(4)); |
|
|
|
|
|
key = key * c2; |
|
|
|
|
|
key = key ^ (key >> UINT32_C(15)); |
|
|
|
|
|
return key; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
BEGIN_OPERATOR(random) |
|
|
BEGIN_OPERATOR(random) |
|
|
LOWERCASE_REQUIRES_BANG; |
|
|
LOWERCASE_REQUIRES_BANG; |
|
|
PORT(0, -1, IN | PARAM); |
|
|
PORT(0, -1, IN | PARAM); |
|
@ -641,8 +631,16 @@ BEGIN_OPERATOR(random) |
|
|
min = b; |
|
|
min = b; |
|
|
max = a; |
|
|
max = a; |
|
|
} |
|
|
} |
|
|
Usz key = hash32_shift_mult((extra_params->random_seed + y * width + x) ^ |
|
|
// Initial input params for the hash
|
|
|
(Tick_number << UINT32_C(16))); |
|
|
Usz key = (extra_params->random_seed + y * width + x) ^ |
|
|
|
|
|
(Tick_number << UINT32_C(16)); |
|
|
|
|
|
// 32-bit shift_mult hash to evenly distribute bits
|
|
|
|
|
|
key = (key ^ UINT32_C(61)) ^ (key >> UINT32_C(16)); |
|
|
|
|
|
key = key + (key << UINT32_C(3)); |
|
|
|
|
|
key = key ^ (key >> UINT32_C(4)); |
|
|
|
|
|
key = key * UINT32_C(0x27d4eb2d); |
|
|
|
|
|
key = key ^ (key >> UINT32_C(15)); |
|
|
|
|
|
// Hash finished. Restrict to desired range of numbers.
|
|
|
Usz val = key % (max - min) + min; |
|
|
Usz val = key % (max - min) + min; |
|
|
POKE(1, 0, glyph_of(val)); |
|
|
POKE(1, 0, glyph_of(val)); |
|
|
END_OPERATOR |
|
|
END_OPERATOR |
|
|