37 lines
1013 B
Rust
37 lines
1013 B
Rust
use std::ops::Range;
|
|
|
|
use rand::Rng;
|
|
|
|
use crate::vm::{RuntimeValue, Thread};
|
|
|
|
pub fn random_int(data: &mut Thread, destination: usize, argument_range: Range<usize>) {
|
|
let current_frame = data.current_frame_mut();
|
|
let mut argument_range_iter = argument_range.into_iter();
|
|
let (min, max) = {
|
|
let mut min = None;
|
|
|
|
loop {
|
|
let register_index = argument_range_iter
|
|
.next()
|
|
.unwrap_or_else(|| panic!("No argument was passed to \"random_int\""));
|
|
let integer = current_frame
|
|
.get_integer_from_register(register_index)
|
|
.clone_inner();
|
|
|
|
if min.is_none() {
|
|
min = Some(integer);
|
|
} else {
|
|
break (min, integer);
|
|
}
|
|
}
|
|
};
|
|
|
|
let random_integer = rand::thread_rng().gen_range(min.unwrap()..max);
|
|
|
|
current_frame
|
|
.registers
|
|
.integers
|
|
.get_mut(destination)
|
|
.set(RuntimeValue::Raw(random_integer));
|
|
}
|