mirror of
https://github.com/PixelGuys/Cubyz.git
synced 2025-08-03 19:28:49 -04:00
Start working on items.
This commit is contained in:
parent
b3ea5d517c
commit
0f0b0b6ac4
@ -1,15 +1,17 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const Allocator = std.mem.Allocator;
|
const Allocator = std.mem.Allocator;
|
||||||
|
|
||||||
|
const blocks_zig = @import("blocks.zig");
|
||||||
|
const items_zig = @import("items.zig");
|
||||||
const json = @import("json.zig");
|
const json = @import("json.zig");
|
||||||
const JsonElement = json.JsonElement;
|
const JsonElement = json.JsonElement;
|
||||||
const blocks_zig = @import("blocks.zig");
|
|
||||||
const main = @import("main.zig");
|
const main = @import("main.zig");
|
||||||
|
|
||||||
var arena: std.heap.ArenaAllocator = undefined;
|
var arena: std.heap.ArenaAllocator = undefined;
|
||||||
var arenaAllocator: Allocator = undefined;
|
var arenaAllocator: Allocator = undefined;
|
||||||
var commonBlocks: std.StringHashMap(JsonElement) = undefined;
|
var commonBlocks: std.StringHashMap(JsonElement) = undefined;
|
||||||
var commonBiomes: std.StringHashMap(JsonElement) = undefined;
|
var commonBiomes: std.StringHashMap(JsonElement) = undefined;
|
||||||
|
var commonItems: std.StringHashMap(JsonElement) = undefined;
|
||||||
var commonRecipes: std.ArrayList([]const u8) = undefined;
|
var commonRecipes: std.ArrayList([]const u8) = undefined;
|
||||||
|
|
||||||
/// Reads json files recursively from all subfolders.
|
/// Reads json files recursively from all subfolders.
|
||||||
@ -42,7 +44,7 @@ pub fn readAllJsonFilesInAddons(externalAllocator: Allocator, addons: std.ArrayL
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn readAssets(externalAllocator: Allocator, assetPath: []const u8, blocks: *std.StringHashMap(JsonElement), biomes: *std.StringHashMap(JsonElement)) !void {
|
pub fn readAssets(externalAllocator: Allocator, assetPath: []const u8, blocks: *std.StringHashMap(JsonElement), items: *std.StringHashMap(JsonElement), biomes: *std.StringHashMap(JsonElement)) !void {
|
||||||
var addons = std.ArrayList(std.fs.Dir).init(main.threadAllocator);
|
var addons = std.ArrayList(std.fs.Dir).init(main.threadAllocator);
|
||||||
defer addons.deinit();
|
defer addons.deinit();
|
||||||
var addonNames = std.ArrayList([]const u8).init(main.threadAllocator);
|
var addonNames = std.ArrayList([]const u8).init(main.threadAllocator);
|
||||||
@ -65,6 +67,7 @@ pub fn readAssets(externalAllocator: Allocator, assetPath: []const u8, blocks: *
|
|||||||
};
|
};
|
||||||
|
|
||||||
try readAllJsonFilesInAddons(externalAllocator, addons, addonNames, "blocks", blocks);
|
try readAllJsonFilesInAddons(externalAllocator, addons, addonNames, "blocks", blocks);
|
||||||
|
try readAllJsonFilesInAddons(externalAllocator, addons, addonNames, "items", items);
|
||||||
try readAllJsonFilesInAddons(externalAllocator, addons, addonNames, "biomes", biomes);
|
try readAllJsonFilesInAddons(externalAllocator, addons, addonNames, "biomes", biomes);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,13 +75,18 @@ pub fn init() !void {
|
|||||||
arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
||||||
arenaAllocator = arena.allocator();
|
arenaAllocator = arena.allocator();
|
||||||
commonBlocks = std.StringHashMap(JsonElement).init(arenaAllocator);
|
commonBlocks = std.StringHashMap(JsonElement).init(arenaAllocator);
|
||||||
|
commonItems = std.StringHashMap(JsonElement).init(arenaAllocator);
|
||||||
commonBiomes = std.StringHashMap(JsonElement).init(arenaAllocator);
|
commonBiomes = std.StringHashMap(JsonElement).init(arenaAllocator);
|
||||||
commonRecipes = std.ArrayList([]const u8).init(arenaAllocator);
|
commonRecipes = std.ArrayList([]const u8).init(arenaAllocator);
|
||||||
|
|
||||||
try readAssets(arenaAllocator, "assets/", &commonBlocks, &commonBiomes);
|
try readAssets(arenaAllocator, "assets/", &commonBlocks, &commonItems, &commonBiomes);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn registerBlock(assetFolder: []const u8, id: []const u8, info: JsonElement) !void {
|
fn registerItem(assetFolder: []const u8, id: []const u8, info: JsonElement) !void {
|
||||||
|
try items_zig.register(assetFolder, id, info);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn registerBlock(assetFolder: []const u8, id: []const u8, info: JsonElement) !void {
|
||||||
try blocks_zig.register(assetFolder, id, info); // TODO: Modded block registries
|
try blocks_zig.register(assetFolder, id, info); // TODO: Modded block registries
|
||||||
try blocks_zig.meshes.register(assetFolder, id, info);
|
try blocks_zig.meshes.register(assetFolder, id, info);
|
||||||
|
|
||||||
@ -185,11 +193,14 @@ pub const BlockPalette = struct {
|
|||||||
pub fn loadWorldAssets(assetFolder: []const u8, palette: *BlockPalette) !void {
|
pub fn loadWorldAssets(assetFolder: []const u8, palette: *BlockPalette) !void {
|
||||||
var blocks = try commonBlocks.cloneWithAllocator(main.threadAllocator);
|
var blocks = try commonBlocks.cloneWithAllocator(main.threadAllocator);
|
||||||
defer blocks.clearAndFree();
|
defer blocks.clearAndFree();
|
||||||
|
var items = try commonItems.cloneWithAllocator(main.threadAllocator);
|
||||||
|
defer items.clearAndFree();
|
||||||
var biomes = try commonBiomes.cloneWithAllocator(main.threadAllocator);
|
var biomes = try commonBiomes.cloneWithAllocator(main.threadAllocator);
|
||||||
defer biomes.clearAndFree();
|
defer biomes.clearAndFree();
|
||||||
|
|
||||||
try readAssets(arenaAllocator, assetFolder, &blocks, &biomes);
|
try readAssets(arenaAllocator, assetFolder, &blocks, &items, &biomes);
|
||||||
|
|
||||||
|
// blocks:
|
||||||
var block: u32 = 0;
|
var block: u32 = 0;
|
||||||
for(palette.palette.items) |id| {
|
for(palette.palette.items) |id| {
|
||||||
var nullKeyValue = blocks.fetchRemove(id);
|
var nullKeyValue = blocks.fetchRemove(id);
|
||||||
@ -213,6 +224,12 @@ pub fn loadWorldAssets(assetFolder: []const u8, palette: *BlockPalette) !void {
|
|||||||
block += 1;
|
block += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// items:
|
||||||
|
iterator = items.iterator();
|
||||||
|
while(iterator.next()) |entry| {
|
||||||
|
try registerItem(assetFolder, entry.key_ptr.*, entry.value_ptr.*);
|
||||||
|
}
|
||||||
|
|
||||||
// public void registerBlocks(Registry<DataOrientedRegistry> registries, NoIDRegistry<Ore> oreRegistry, BlockPalette palette) {
|
// public void registerBlocks(Registry<DataOrientedRegistry> registries, NoIDRegistry<Ore> oreRegistry, BlockPalette palette) {
|
||||||
// HashMap<Resource, JsonObject> perWorldBlocks = new HashMap<>(commonBlocks);
|
// HashMap<Resource, JsonObject> perWorldBlocks = new HashMap<>(commonBlocks);
|
||||||
// readAllJsonObjects("blocks", (json, id) -> {
|
// readAllJsonObjects("blocks", (json, id) -> {
|
||||||
|
@ -638,6 +638,16 @@ pub const Image = struct {
|
|||||||
width: u31,
|
width: u31,
|
||||||
height: u31,
|
height: u31,
|
||||||
imageData: []Color,
|
imageData: []Color,
|
||||||
|
pub fn init(allocator: Allocator, width: u31, height: u31) !Image {
|
||||||
|
return Image{
|
||||||
|
.width = width,
|
||||||
|
.height = height,
|
||||||
|
.imageData = try allocator.alloc(Color, width*height),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
pub fn deinit(self: Image, allocator: Allocator) void {
|
||||||
|
allocator.free(self.imageData);
|
||||||
|
}
|
||||||
pub fn readFromFile(allocator: Allocator, path: []const u8) !Image {
|
pub fn readFromFile(allocator: Allocator, path: []const u8) !Image {
|
||||||
var result: Image = undefined;
|
var result: Image = undefined;
|
||||||
var channel: c_int = undefined;
|
var channel: c_int = undefined;
|
||||||
|
1118
src/items.zig
Normal file
1118
src/items.zig
Normal file
File diff suppressed because it is too large
Load Diff
79
src/json.zig
79
src/json.zig
@ -25,7 +25,41 @@ pub const JsonElement = union(JsonType) {
|
|||||||
JsonArray: *ArrayList(JsonElement),
|
JsonArray: *ArrayList(JsonElement),
|
||||||
JsonObject: *std.StringHashMap(JsonElement),
|
JsonObject: *std.StringHashMap(JsonElement),
|
||||||
|
|
||||||
// TODO: Add simple array access.
|
pub fn initObject(allocator: Allocator) !JsonElement {
|
||||||
|
var map: *std.StringHashMap(JsonElement) = try allocator.create(std.StringHashMap(JsonElement));
|
||||||
|
map.* = std.StringHashMap(JsonElement).init(allocator);
|
||||||
|
return JsonElement{.JsonObject=map};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn initArray(allocator: Allocator) !JsonElement {
|
||||||
|
const list: *ArrayList(JsonElement) = try allocator.create(ArrayList(JsonElement));
|
||||||
|
list.* = ArrayList(JsonElement).init(allocator);
|
||||||
|
return JsonElement{.JsonArray=list};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn getAtIndex(self: *const JsonElement, comptime _type: type, index: usize, replacement: _type) @TypeOf(replacement) {
|
||||||
|
if(self.* != JsonType.JsonArray) {
|
||||||
|
return replacement;
|
||||||
|
} else {
|
||||||
|
if(index < self.JsonArray.items.len) {
|
||||||
|
return self.JsonArray.items[index].as(_type, replacement);
|
||||||
|
} else {
|
||||||
|
return replacement;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn getChildAtIndex(self: *const JsonElement, index: usize) JsonElement {
|
||||||
|
if(self.* != JsonType.JsonArray) {
|
||||||
|
return JsonElement{.JsonNull={}};
|
||||||
|
} else {
|
||||||
|
if(index < self.JsonArray.items.len) {
|
||||||
|
return self.JsonArray.items[index];
|
||||||
|
} else {
|
||||||
|
return JsonElement{.JsonNull={}};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get(self: *const JsonElement, comptime _type: type, key: []const u8, replacement: _type) @TypeOf(replacement) {
|
pub fn get(self: *const JsonElement, comptime _type: type, key: []const u8, replacement: _type) @TypeOf(replacement) {
|
||||||
if(self.* != JsonType.JsonObject) {
|
if(self.* != JsonType.JsonObject) {
|
||||||
@ -52,23 +86,29 @@ pub const JsonElement = union(JsonType) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn as(self: *const JsonElement, comptime _type: type, replacement: _type) _type {
|
pub fn as(self: *const JsonElement, comptime _type: type, replacement: _type) _type {
|
||||||
switch(@typeInfo(_type)) {
|
comptime var typeInfo = @typeInfo(_type);
|
||||||
|
comptime var innerType = _type;
|
||||||
|
inline while(typeInfo == .Optional) {
|
||||||
|
innerType = typeInfo.Optional.child;
|
||||||
|
typeInfo = @typeInfo(innerType);
|
||||||
|
}
|
||||||
|
switch(typeInfo) {
|
||||||
.Int => {
|
.Int => {
|
||||||
switch(self.*) {
|
switch(self.*) {
|
||||||
JsonType.JsonInt => return std.math.cast(_type, self.JsonInt) orelse replacement,
|
JsonType.JsonInt => return std.math.cast(innerType, self.JsonInt) orelse replacement,
|
||||||
JsonType.JsonFloat => return std.math.lossyCast(_type, std.math.round(self.JsonFloat)),
|
JsonType.JsonFloat => return std.math.lossyCast(innerType, std.math.round(self.JsonFloat)),
|
||||||
else => return replacement,
|
else => return replacement,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
.Float => {
|
.Float => {
|
||||||
switch(self.*) {
|
switch(self.*) {
|
||||||
JsonType.JsonInt => return @intToFloat(_type, self.JsonInt),
|
JsonType.JsonInt => return @intToFloat(innerType, self.JsonInt),
|
||||||
JsonType.JsonFloat => return @floatCast(_type, self.JsonFloat),
|
JsonType.JsonFloat => return @floatCast(innerType, self.JsonFloat),
|
||||||
else => return replacement,
|
else => return replacement,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
else => {
|
else => {
|
||||||
switch(_type) {
|
switch(innerType) {
|
||||||
[]const u8 => {
|
[]const u8 => {
|
||||||
switch(self.*) {
|
switch(self.*) {
|
||||||
JsonType.JsonString => return self.JsonString,
|
JsonType.JsonString => return self.JsonString,
|
||||||
@ -90,6 +130,31 @@ pub const JsonElement = union(JsonType) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn createElementFromRandomType(value: anytype) JsonElement {
|
||||||
|
switch(@typeInfo(@TypeOf(value))) {
|
||||||
|
.Void => return JsonElement{.JsonNull={}},
|
||||||
|
.Null => return JsonElement{.JsonNull={}},
|
||||||
|
.Bool => return JsonElement{.JsonBool=value},
|
||||||
|
.Int, .ComptimeInt => return JsonElement{.JsonInt=@intCast(i64, value)},
|
||||||
|
.Float, .ComptimeFloat => return JsonElement{.JsonInt=@floatCast(f64, value)},
|
||||||
|
.Union => {
|
||||||
|
if(@TypeOf(value) == JsonElement) {
|
||||||
|
return value;
|
||||||
|
} else {
|
||||||
|
@compileError("Unknown value type.");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
else => {
|
||||||
|
@compileError("Unknown value type.");
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn put(self: *const JsonElement, key: []const u8, value: anytype) !void {
|
||||||
|
const result = createElementFromRandomType(value);
|
||||||
|
try self.JsonObject.put(key, result);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn free(self: *const JsonElement, allocator: Allocator) void {
|
pub fn free(self: *const JsonElement, allocator: Allocator) void {
|
||||||
switch(self.*) {
|
switch(self.*) {
|
||||||
JsonType.JsonInt, JsonType.JsonFloat, JsonType.JsonBool, JsonType.JsonNull, JsonType.JsonString => return,
|
JsonType.JsonInt, JsonType.JsonFloat, JsonType.JsonBool, JsonType.JsonNull, JsonType.JsonString => return,
|
||||||
|
@ -6,6 +6,7 @@ const chunk = @import("chunk.zig");
|
|||||||
const entity = @import("entity.zig");
|
const entity = @import("entity.zig");
|
||||||
const game = @import("game.zig");
|
const game = @import("game.zig");
|
||||||
const graphics = @import("graphics.zig");
|
const graphics = @import("graphics.zig");
|
||||||
|
const items = @import("items.zig");
|
||||||
const models = @import("models.zig");
|
const models = @import("models.zig");
|
||||||
const renderer = @import("renderer.zig");
|
const renderer = @import("renderer.zig");
|
||||||
const network = @import("network.zig");
|
const network = @import("network.zig");
|
||||||
@ -239,6 +240,9 @@ pub fn main() !void {
|
|||||||
try models.init();
|
try models.init();
|
||||||
defer models.deinit();
|
defer models.deinit();
|
||||||
|
|
||||||
|
items.globalInit();
|
||||||
|
defer items.deinit();
|
||||||
|
|
||||||
try assets.init();
|
try assets.init();
|
||||||
defer assets.deinit();
|
defer assets.deinit();
|
||||||
|
|
||||||
|
@ -18,6 +18,14 @@ pub fn dot(self: anytype, other: @TypeOf(self)) @typeInfo(@TypeOf(self)).Vector.
|
|||||||
return @reduce(.Add, self*other);
|
return @reduce(.Add, self*other);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn length(self: anytype) @typeInfo(@TypeOf(self)).Vector.child {
|
||||||
|
return @sqrt(@reduce(.Add, self*self));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn normalize(self: anytype) @typeInfo(@TypeOf(self)).Vector.child {
|
||||||
|
return self/length(self);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn cross(self: anytype, other: @TypeOf(self)) @TypeOf(self) {
|
pub fn cross(self: anytype, other: @TypeOf(self)) @TypeOf(self) {
|
||||||
if(@typeInfo(@TypeOf(self)).Vector.len != 3) @compileError("Only available for vectors of length 3.");
|
if(@typeInfo(@TypeOf(self)).Vector.len != 3) @compileError("Only available for vectors of length 3.");
|
||||||
return @TypeOf(self) {
|
return @TypeOf(self) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user