/
seed.c
71 lines (59 loc) · 3.05 KB
/
seed.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "ops/seed.h"
#include "helpers.h"
#include "tele_rand.h"
#define MAKE_SEED_OP(n, v) \
{ \
.name = #n, .get = op_peek_seed_i16, .set = op_poke_seed_i16, \
.params = 0, .returns = 1, .data = (void *)offsetof(scene_state_t, v) \
}
#define MAKE_SEED_ALIAS_OP(n, v) MAKE_SEED_OP(n, v)
static void op_peek_seed_i16(const void *data, scene_state_t *ss,
exec_state_t *es, command_state_t *cs);
static void op_poke_seed_i16(const void *data, scene_state_t *ss,
exec_state_t *es, command_state_t *cs);
static void op_SEED_get(const void *data, scene_state_t *ss, exec_state_t *es,
command_state_t *cs);
static void op_SEED_set(const void *data, scene_state_t *ss, exec_state_t *es,
command_state_t *cs);
// clang-format off
const tele_op_t op_SEED = MAKE_GET_SET_OP(SEED, op_SEED_get, op_SEED_set, 0, true);
const tele_op_t op_RAND_SEED = MAKE_SEED_OP(RAND.SEED, rand_states.s.rand);
const tele_op_t op_SYM_RAND_SD = MAKE_SEED_ALIAS_OP(RAND.SD, rand_states.s.rand);
const tele_op_t op_SYM_R_SD = MAKE_SEED_ALIAS_OP(R.SD, rand_states.s.rand);
const tele_op_t op_TOSS_SEED = MAKE_SEED_OP(TOSS.SEED, rand_states.s.toss);
const tele_op_t op_SYM_TOSS_SD = MAKE_SEED_ALIAS_OP(TOSS.SD, rand_states.s.toss);
const tele_op_t op_PROB_SEED = MAKE_SEED_OP(PROB.SEED, rand_states.s.prob);
const tele_op_t op_SYM_PROB_SD = MAKE_SEED_ALIAS_OP(PROB.SD, rand_states.s.prob);
const tele_op_t op_DRUNK_SEED = MAKE_SEED_OP(DRUNK.SEED, rand_states.s.drunk);
const tele_op_t op_SYM_DRUNK_SD = MAKE_SEED_ALIAS_OP(DRUNK.SD, rand_states.s.drunk);
const tele_op_t op_P_SEED = MAKE_SEED_OP(P.SEED, rand_states.s.pattern);
const tele_op_t op_SYM_P_SD = MAKE_SEED_ALIAS_OP(P.SD, rand_states.s.pattern);
// clang-format on
static void op_peek_seed_i16(const void *data, scene_state_t *ss,
exec_state_t *NOTUSED(es), command_state_t *cs) {
char *base = (char *)ss;
size_t offset = (size_t)data;
tele_rand_t *ptr = (tele_rand_t *)(base + offset);
cs_push(cs, ptr->seed);
}
static void op_poke_seed_i16(const void *data, scene_state_t *ss,
exec_state_t *NOTUSED(es), command_state_t *cs) {
int16_t s = cs_pop(cs);
char *base = (char *)ss;
size_t offset = (size_t)data;
tele_rand_t *ptr = (tele_rand_t *)(base + offset);
tele_rand_init(ptr, s);
}
static void op_SEED_get(const void *NOTUSED(data), scene_state_t *ss,
exec_state_t *NOTUSED(es), command_state_t *cs) {
cs_push(cs, ss->variables.seed);
}
static void op_SEED_set(const void *NOTUSED(data), scene_state_t *ss,
exec_state_t *NOTUSED(es), command_state_t *cs) {
uint16_t s = cs_pop(cs);
for (u8 i = 0; i < RAND_STATES_COUNT; i++) {
tele_rand_t *r = &ss->rand_states.a[i];
tele_rand_init(r, s);
}
ss->variables.seed = s;
}