idk
Some checks failed
Build Dusk / run-tests (push) Successful in 1m57s
Build Dusk / build-linux (push) Successful in 2m9s
Build Dusk / build-psp (push) Failing after 1m39s

This commit is contained in:
2026-01-26 22:54:05 -06:00
parent d1b03c4cb3
commit 81b08b2eba
19 changed files with 179 additions and 276 deletions

View File

@@ -1 +1,6 @@
# Copyright (c) 2026 Dominic Masters
#
# This software is released under the MIT License.
# https://opensource.org/licenses/MIT
add_subdirectory(csv)

View File

@@ -30,16 +30,17 @@ function(dusk_item_csv CSV_FILE)
# id
# )
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME}
PUBLIC
ITEM_CSV_GENERATED=1
)
dusk_run_python(
dusk_item_csv_defs
tools.item.csv
--csv ${CSV_FILE}
--output ${DUSK_GENERATED_HEADERS_DIR}/item/itemdefs.h
--output ${DUSK_GENERATED_HEADERS_DIR}/item/item.h
)
add_dependencies(${DUSK_LIBRARY_TARGET_NAME} dusk_item_csv_defs)
target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME}
PUBLIC
ITEM_CSV_GENERATED=1
)
endfunction()

View File

@@ -8,12 +8,75 @@ 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 \"item/item.h\"\n\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")
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)