Dusk texture creator

This commit is contained in:
2026-04-13 19:51:11 -05:00
parent 4b3826edd9
commit 5a651d2d1f
39 changed files with 1402 additions and 2659 deletions
+82 -72
View File
@@ -1,94 +1,104 @@
import argparse
import os
import csv
import os
parser = argparse.ArgumentParser(description="Item CSV to .h defines")
parser.add_argument("--csv", required=True, help="Path to item CSV file")
parser.add_argument("--output", required=True, help="Path to output .h file")
args = parser.parse_args()
def csvIdToEnumName(itemId):
return "ITEM_ID_" + itemId.upper()
def type_enum(name):
return "ITEM_TYPE_" + name.upper()
itemIds = []
itemTypes = []
itemRowById = {}
def id_enum(name):
return "ITEM_ID_" + name.upper()
with open(args.csv, newline="", encoding="utf-8") as csvfile:
reader = csv.DictReader(csvfile)
# Load CSV
item_ids = []
item_types = []
rows = {}
# CSV must have id and type columns.
with open(args.csv, newline="", encoding="utf-8") as f:
reader = csv.DictReader(f)
if "id" not in reader.fieldnames or "type" not in reader.fieldnames:
raise Exception("CSV file must have 'id' and 'type' columns")
raise ValueError("CSV must have 'id' and 'type' columns")
for row in reader:
itemId = row["id"]
itemType = row["type"]
if itemId not in itemIds:
itemIds.append(itemId)
item_id, item_type = row["id"], row["type"]
if item_id not in item_ids:
item_ids.append(item_id)
if item_type not in item_types:
item_types.append(item_type)
rows[item_id] = row
if itemType not in itemTypes:
itemTypes.append(itemType)
itemRowById[itemId] = row
# Now Prep output
outHeader = "#pragma once\n"
outHeader += '#include "dusk.h"\n\n'
itemTypeValues = {}
itemIdValues = {}
# Assign enum values — types and IDs share a single counter so values never collide
count = 0
type_values = {}
id_values = {}
# Create enum for types and ids, include null and count.
outHeader += "typedef enum {\n"
outHeader += f" ITEM_TYPE_NULL = {count},\n"
count += 1
for itemType in itemTypes:
itemTypeValues[itemType] = count
outHeader += f" {csvIdToEnumName(itemType)} = {count},\n"
count += 1 # 0 = NULL
for t in item_types:
type_values[t] = count
count += 1
outHeader += f" ITEM_TYPE_COUNT = {count}\n"
outHeader += "} itemtype_t;\n\n"
# ITEM_TYPE_COUNT = count; item IDs continue from here
type_count = count
outHeader += "typedef enum {\n"
outHeader += f" ITEM_ID_NULL = {count},\n"
for itemId in itemIds:
itemIdValues[itemId] = count
outHeader += f" {csvIdToEnumName(itemId)} = {count},\n"
count += 1 # type_count = ITEM_ID_NULL
for i in item_ids:
id_values[i] = count
count += 1
outHeader += f" ITEM_ID_COUNT = {count}\n"
outHeader += "} itemid_t;\n\n"
id_count = count
# Create struct for item data.
outHeader += "typedef struct {\n"
outHeader += " itemid_t id;\n"
outHeader += " itemtype_t type;\n"
outHeader += " const char_t *name;\n"
outHeader += "} item_t;\n\n"
# Build output
out = [
"#pragma once",
'#include "dusk.h"',
"",
"typedef enum {",
" ITEM_TYPE_NULL = 0,",
]
for t in item_types:
out.append(f" {type_enum(t)} = {type_values[t]},")
out += [
f" ITEM_TYPE_COUNT = {type_count}",
"} itemtype_t;",
"",
"typedef enum {",
f" ITEM_ID_NULL = {type_count},",
]
for i in item_ids:
out.append(f" {id_enum(i)} = {id_values[i]},")
out += [
f" ITEM_ID_COUNT = {id_count}",
"} itemid_t;",
"",
"typedef struct {",
" itemid_t id;",
" itemtype_t type;",
" const char_t *name;",
"} item_t;",
"",
"static const item_t ITEMS[] = {",
]
for i in item_ids:
row = rows[i]
out += [
f" [{id_enum(i)}] = {{",
f" .id = {id_enum(i)},",
f" .type = {type_enum(row['type'])},",
f" .name = \"{i}\",",
" },",
]
out += [
"};",
"",
"static const char_t *ITEM_SCRIPT =",
]
for i in item_ids:
out.append(f" \"{id_enum(i)} = {id_values[i]}\\n\"")
for t in item_types:
out.append(f" \"{type_enum(t)} = {type_values[t]}\\n\"")
out += [";", ""]
# Create array of item data.
outHeader += f"static const item_t ITEMS[] = {{\n"
for itemId in itemIds:
outHeader += f" [{csvIdToEnumName(itemId)}] = {{\n"
outHeader += f" .id = {csvIdToEnumName(itemId)},\n"
itemType = itemRowById[itemId]["type"]
outHeader += f" .type = {csvIdToEnumName(itemType)},\n"
itemName = itemRowById[itemId]["id"]
outHeader += f" .name = \"{itemName}\",\n"
outHeader += f" }},\n"
outHeader += f"}};\n\n"
# Create lua script defining items.
outHeader += f"static const char_t *ITEM_SCRIPT = \n"
for itemId in itemIds:
outHeader += f" \"{csvIdToEnumName(itemId)} = {itemIdValues[itemId]}\\n\"\n"
for itemType in itemTypes:
outHeader += f" \"{csvIdToEnumName(itemType)} = {itemTypeValues[itemType]}\\n\"\n"
outHeader += f";\n\n"
# Write to output file.
os.makedirs(os.path.dirname(args.output), exist_ok=True)
with open(args.output, "w", encoding="utf-8") as outFile:
outFile.write(outHeader)
with open(args.output, "w", encoding="utf-8") as f:
f.write("\n".join(out))