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' itemTypeValues = {} itemIdValues = {} count = 0 # 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 outHeader += f" ITEM_TYPE_COUNT = {count}\n" outHeader += "} itemtype_t;\n\n" 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 outHeader += f" ITEM_ID_COUNT = {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" # 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)