import argparse import os import csv from tools.util.type import detectType, stringToCType, typeToCType 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() # Load up CSV file. outHeader = "#pragma once\n" outHeader += '#include "dusk.h"\n\n' itemIds = [] itemTypes = [] itemRowById = {} with open(args.csv, newline="", encoding="utf-8") as csvfile: reader = csv.DictReader(csvfile) # CSV must have id and type columns. if "id" not in reader.fieldnames or "type" not in reader.fieldnames: raise Exception("CSV file must have 'id' and 'type' columns") for row in reader: itemId = row["id"] itemType = row["type"] if itemId not in itemIds: itemIds.append(itemId) if itemType not in itemTypes: itemTypes.append(itemType) itemRowById[itemId] = row # Now Prep output outHeader = "#pragma once\n" outHeader += '#include "dusk.h"\n\n' # Create enum for types and ids, include null and count. outHeader += "typedef enum {\n" outHeader += " ITEM_TYPE_NULL = 0,\n" for itemType in itemTypes: outHeader += f" {csvIdToEnumName(itemType)},\n" outHeader += f" ITEM_TYPE_COUNT\n" outHeader += "} itemtype_t;\n\n" outHeader += "typedef enum {\n" outHeader += " ITEM_ID_NULL = 0,\n" for itemId in itemIds: outHeader += f" {csvIdToEnumName(itemId)},\n" outHeader += f" ITEM_ID_COUNT\n" outHeader += "} itemid_t;\n\n" # 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" # 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" # 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)