@@ -14,6 +14,8 @@ const tile = @import("./tile.zig");
1414const generate = @import ("./generate.zig" );
1515const Mat4f = math .Mat4 (f32 );
1616const Font = @import ("./font_render.zig" ).BitmapFontRenderer ;
17+ const ecs = @import ("ecs" );
18+ const component = @import ("./component.zig" );
1719
1820// Setup environment
1921pub const panic = platform .panic ;
@@ -55,8 +57,10 @@ var font: Font = undefined;
5557
5658var adventureLog = std .ArrayList ([]const u8 ).init (allocator );
5759var map : Map = undefined ;
58- var playerPos = vec2i (10 , 10 );
59- var playerMove = vec2i (0 , 0 );
60+ var registry : ecs.Registry = undefined ;
61+ //var playerPos = vec2i(10, 10);
62+ var camPos = vec2i (0 , 0 );
63+ //var playerMove = vec2i(0, 0);
6064
6165pub fn onInit () ! void {
6266 std .log .info ("app init" , .{});
@@ -82,14 +86,21 @@ pub fn onInit() !void {
8286 },
8387 });
8488
85- playerPos = map .spawn ;
89+ registry = ecs .Registry .init (allocator );
90+
91+ var player = registry .create ();
92+ registry .add (player , component.Position { .pos = map .spawn });
93+ registry .add (player , component.Movement { .vel = vec2i (0 , 0 ) });
94+ registry .add (player , component.Render { .tid = 25 });
95+ registry .add (player , component.PlayerControl {});
8696 try update_fov ();
8797
8898 try adventureLog .append ("You descend into the dungeon, hoping to gain experience and treasure." );
8999}
90100
91101fn onDeinit () void {
92102 std .log .info ("app deinit" , .{});
103+ registry .deinit ();
93104 map .deinit ();
94105 adventureLog .deinit ();
95106 font .deinit ();
@@ -98,6 +109,7 @@ fn onDeinit() void {
98109}
99110
100111pub fn onEvent (event : platform.event.Event ) ! void {
112+ var playerMove = vec2i (0 , 0 );
101113 switch (event ) {
102114 .KeyDown = > | e | switch (e .scancode ) {
103115 .KP_8 , .W , .UP = > playerMove = vec2i (0 , -1 ),
@@ -115,37 +127,80 @@ pub fn onEvent(event: platform.event.Event) !void {
115127 else = > {},
116128 }
117129
118- var moved = false ;
119- if (! map .get (playerPos .addv (playerMove )).solid ()) {
120- playerPos = playerPos .addv (playerMove );
121- moved = true ;
130+ // Set all players movement equal to playerMove
131+ if (! playerMove .eql (vec2i (0 , 0 ))) {
132+ var view = registry .view (.{ component .PlayerControl , component .Movement }, .{});
133+ var iter = view .iterator ();
134+ while (iter .next ()) | entity | {
135+ const move = view .get (component .Movement , entity );
136+ move .vel = playerMove ;
137+ }
122138 }
123- playerMove = vec2i (0 , 0 );
124-
125- if (map .get (playerPos ) == .StairsDown ) {
126- map .deinit ();
127-
128- // Create map
129- map = try generate .generateMap (allocator , .{
130- .size = vec2i (50 , 50 ),
131- .max_rooms = 50 ,
132- .room_size_range = .{
133- .min = 3 ,
134- .max = 10 ,
135- },
136- });
137-
138- playerPos = map .spawn ;
139+
140+ // Move entities
141+ {
142+ var view = registry .view (.{ component .Position , component .Movement }, .{});
143+ var iter = view .iterator ();
144+ while (iter .next ()) | entity | {
145+ const pos = view .get (component .Position , entity );
146+ const move = view .get (component .Movement , entity );
147+
148+ const new_pos = pos .pos .addv (move .vel );
149+ if (! map .get (new_pos ).solid ()) {
150+ pos .pos = new_pos ;
151+ }
152+ move .vel = vec2i (0 , 0 );
153+ }
139154 }
140155
141- if (moved ) {
142- try update_fov ();
156+ // Check if any players are now standing on the stairsdown, and also update the camera pos
157+ {
158+ var any_on_stairs = false ;
159+ var view = registry .view (.{ component .PlayerControl , component .Position }, .{});
160+ var iter = view .iterator ();
161+ while (iter .next ()) | entity | {
162+ const pos = view .getConst (component .Position , entity );
163+ if (map .get (pos .pos ) == .StairsDown ) {
164+ any_on_stairs = true ;
165+ break ;
166+ }
167+ camPos = pos .pos ;
168+ }
169+
170+ if (any_on_stairs ) {
171+ map .deinit ();
172+
173+ // Create map
174+ map = try generate .generateMap (allocator , .{
175+ .size = vec2i (50 , 50 ),
176+ .max_rooms = 50 ,
177+ .room_size_range = .{
178+ .min = 3 ,
179+ .max = 10 ,
180+ },
181+ });
182+
183+ iter = view .iterator ();
184+ while (iter .next ()) | entity | {
185+ const pos = view .get (component .Position , entity );
186+ pos .pos = map .spawn ;
187+ camPos = pos .pos ;
188+ }
189+ }
143190 }
191+ try update_fov ();
144192}
145193
146194fn update_fov () ! void {
147- map .visible .deinit ();
148- map .visible = try map .computeFOV (playerPos , 8 );
195+ map .visible .clearRetainingCapacity ();
196+
197+ var view = registry .view (.{ component .Position , component .PlayerControl }, .{});
198+ var iter = view .iterator ();
199+ while (iter .next ()) | entity | {
200+ const pos = view .getConst (component .Position , entity );
201+ try map .computeFOV (& map .visible , pos .pos , 8 );
202+ }
203+
149204 for (map .visible .items ()) | entry | {
150205 try map .explored .put (entry .key , .{});
151206 }
@@ -159,13 +214,24 @@ pub fn render(alpha: f64) !void {
159214 gl .viewport (0 , 0 , screen_size .x , screen_size .y );
160215
161216 const cam_size = screen_size .intToFloat (f32 );
162- const cam_pos = playerPos .scale (16 ).intToFloat (f32 ).subv (cam_size .scaleDiv (2 ));
217+ const cam_pos = camPos .scale (16 ).intToFloat (f32 ).subv (cam_size .scaleDiv (2 ));
163218
164219 gl .enable (gl .SCISSOR_TEST );
165220 gl .scissor (0 , 0 , screen_size .x , screen_size .y - 50 );
166221 flatRenderer .perspective = Mat4f .orthographic (cam_pos .x , cam_pos .x + cam_size .x , cam_pos .y + cam_size .y , cam_pos .y , -1 , 1 );
167222 map .render (& flatRenderer );
168- render_tile (& flatRenderer , .{ .pos = 25 }, playerPos , 1 );
223+
224+ // Render entities
225+ {
226+ var view = registry .view (.{ component .Position , component .Render }, .{});
227+ var iter = view .iterator ();
228+ while (iter .next ()) | entity | {
229+ const pos = view .getConst (component .Position , entity );
230+ const r = view .getConst (component .Render , entity );
231+ render_tile (& flatRenderer , .{ .pos = r .tid }, pos .pos , 1 );
232+ }
233+ }
234+
169235 flatRenderer .flush ();
170236
171237 gl .disable (gl .SCISSOR_TEST );
0 commit comments