Subastra
Loading...
Searching...
No Matches
construct.h
Go to the documentation of this file.
1#ifndef __H__ENGINE_CONSTRUCT__
2#define __H__ENGINE_CONSTRUCT__
3
4#include "../6502/chip.h"
5#include "../list.h"
6#include "../map.h"
7#include "../rendering/instances.h"
8#include "../vec2i.h"
9
20
22 switch (kind) {
23 case BLOCK_KIND_MESH:
24 return 1;
25 case BLOCK_KIND_CHIP:
26 return 2;
28 return 3;
29 }
30
31 return -1;
32}
33
34typedef struct {
38
39 union {
40 struct {
42 } as_chip;
43 struct {
45 } as_thruster;
46 };
47} block_t;
48
50 block_t ret;
52 return ret;
53}
54static block_t block_new_thruster(int orientation) {
55 block_t ret;
57 ret.as_thruster.throttle = 0;
58
59 return ret;
60}
61
69
70static void block__external_call(chip_t *chip, block_t *block) {
71 switch (block->kind) {
73 if (chip->y == 0) {
74 byte throttle = chip_stack_pull(chip);
75 block->as_thruster.throttle = throttle;
76 }
77 break;
78 }
79 }
80 return;
81}
82
84 construct_t *self = (construct_t *)chip->userdata;
85 byte device = chip->x;
86 vec2i *off = map_get_ty(vec2i, &self->device_map, device);
87
88 if (off == 0) {
89 chip->halted = true;
90 return;
91 }
92
93 for (sz i = 0; i < self->blocks.size; i++) {
94 block_t *blk = list_get_ty_ptr(block_t, &self->blocks, i);
95 if (vec2_eq(blk->offset, *off)) {
96 block__external_call(chip, blk);
97 break;
98 }
99 }
100}
101
102static block_t block_new_chip(allocator_t alloc, sz memory_size) {
103 block_t ret;
104 ret.kind = BLOCK_KIND_CHIP;
105
106 chip_init(&ret.as_chip.chip, alloc, memory_size, 0);
108
109 return ret;
110}
111
112#endif
static void chip_init(chip_t *self, allocator_t allocator, sz memory_size, u32 quota)
Definition chip.h:70
static byte chip_stack_pull(chip_t *self)
Definition chip.h:252
size_t sz
Definition defs.h:51
static block_t block_new_mesh()
Definition construct.h:49
static void block__external_call(chip_t *chip, block_t *block)
Definition construct.h:70
static void block_chip__external_call(chip_t *chip)
Definition construct.h:83
static int block_kind_to_tile_index(block_kind_t kind)
Definition construct.h:21
static block_t block_new_chip(allocator_t alloc, sz memory_size)
Definition construct.h:102
block_kind_t
Definition construct.h:10
@ BLOCK_KIND_CONTOLLER
Definition construct.h:16
@ BLOCK_KIND_MESH
Definition construct.h:11
@ BLOCK_KIND_CHIP
Definition construct.h:14
@ BLOCK_KIND_ACCUMULATOR
Definition construct.h:17
@ BLOCK_KIND_THRUSTER
Definition construct.h:12
@ BLOCK_KIND_ENGINE
Definition construct.h:13
@ BLOCK_KIND_count
Definition construct.h:18
@ BLOCK_KIND_GYROSCOPE
Definition construct.h:15
static block_t block_new_thruster(int orientation)
Definition construct.h:54
#define list_get_ty_ptr(ty, ls, idx)
Definition list.h:128
#define map_get_ty(ty, map, key)
Returns a typed pointer to a member at key key. Returns NULL if the key is not present.
Definition map.h:218
A generic allocator type passed by value. Contains a fallback allocator and a set of function pointer...
Definition memory.h:30
Definition construct.h:34
byte throttle
Definition construct.h:44
int orientation
Definition construct.h:37
chip_t chip
Definition construct.h:41
struct block_t::@0::@3 as_thruster
block_kind_t kind
Definition construct.h:35
struct block_t::@0::@2 as_chip
vec2i offset
Definition construct.h:36
Definition chip.h:27
bool halted
Definition chip.h:34
chip_external_call_f external_call
Definition chip.h:29
byte x
Definition chip.h:39
byte y
Definition chip.h:39
void * userdata
Definition chip.h:31
Definition construct.h:62
vec2 velocity
Definition construct.h:67
instance_buffer_t instance
Definition construct.h:64
map_t device_map
Definition construct.h:65
list_t blocks
Definition construct.h:63
bool is_dirty
Definition construct.h:66
Definition instances.h:20
Definition list.h:13
sz size
Definition list.h:17
Definition map.h:28
Definition vec2.h:11
Definition vec2i.h:7
static bool vec2_eq(vec2i a, vec2i b)
Definition vec2i.h:30