I am making a board game and am implementing a card system that mutates how board pieces are scored. My confusion comes from my understanding that comptime errors should only be happening if a length is unknown at compile time. In this line p.points[i] = pattern_points[i]; both p.points and pattern_points length should be known at compile time. However, I’m obviously missing something, so I’m hoping someone can point out my error. I’ve been stuck on this one for a while now.
const game = @import("./game.zig");
// Material Pattern Map
const Mp_map = struct {
points: [10]?PatternPoint,
pub fn new(comptime pattern_points: []PatternPoint) Mp_map {
var p: Mp_map = undefined;
p.points = @splat(null);
for (0..pattern_points.len) |i| {
p.points[i] = pattern_points[i];
}
return p;
}
};
pub const BASE_CARDS = [_]Card{CottageCard};
const PatternPoint = struct {
x: u8,
y: u8,
material: game.MaterialType,
pub fn new(x: u8, y: u8, m: game.MaterialType) PatternPoint {
return PatternPoint{ .x = x, .y = y, .material = m };
}
};
pub const Card = struct {
name: []const u8,
desc: []const u8,
kind: game.BuildingType,
pattern: Mp_map,
effect: fn (p: *game.Player, b: game.BoardPiece, *game.Game) void,
};
//5 default cards
const pp = PatternPoint;
var cc_pattern = [_]PatternPoint{
pp.new(0, 1, game.MaterialType.Brick),
pp.new(1, 1, game.MaterialType.Glass),
pp.new(1, 0, game.MaterialType.Wheat),
};
const CottageCard: Card = Card{ .name = "cottage", .desc = "a simple residence", .kind = game.BuildingType.Cottage, .pattern = Mp_map.new(&cc_pattern), .effect = cottage_card_effect };
//Cottage Card Effect
fn cottage_card_effect(p: *game.Player, b: game.BoardPiece, _: *game.Game) void {
if (b.fed) {
p.points += 3;
}
}
error:
src/card.zig:11:41: error: unable to evaluate comptime expression
p.points[i] = pattern_points[i];
~~~~~~~~~~~~~~^~~
src/card.zig:42:138: note: called at comptime from here
const CottageCard: Card = Card{ .name = "cottage", .desc = "a simple residence", .kind = game.BuildingType.Cottage, .pattern = Mp_map.new(&cc_pattern), .effect = cottage_card_effect };
~~~~~~~~~~^~~~~~~~~~~~~
src/card.zig:42:31: note: initializer of container-level variable must be comptime-known
const CottageCard: Card = Card{ .name = "cottage", .desc = "a simple residence", .kind = game.BuildingType.Cottage, .pattern = Mp_map.new(&cc_pattern), .effect = cottage_card_effect };
~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~