Files
dusk/tools/item/csv/__main__.py
Dominic Masters fb93453482
Some checks failed
Build Dusk / run-tests (push) Failing after 2m13s
Build Dusk / build-linux (push) Successful in 2m4s
Build Dusk / build-psp (push) Failing after 1m47s
Cleaned some tools up
2026-01-27 08:40:13 -06:00

99 lines
2.9 KiB
Python

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)