/** * Copyright (c) 2026 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #pragma once #include "script/module/modulebase.h" #include "item/inventory.h" #include "item/backpack.h" #include "assert/assert.h" JS_FUNC(moduleInventoryItemExists) { if(!jerry_value_is_object(args_p[0])) { return JS_THROW("inventoryItemExists: Expected inventory pointer as first argument"); } if(!jerry_value_is_number(args_p[1])) { return JS_THROW("inventoryItemExists: Expected item ID as second argument"); } inventory_t *inventory = (inventory_t *)jsUnwrapPointer(args_p[0]); itemid_t item = (itemid_t)jerry_value_as_number(args_p[1]); assertNotNull(inventory, "Inventory pointer cannot be NULL."); if(item == ITEM_ID_NULL) { return JS_THROW("inventoryItemExists: Item ID cannot be ITEM_ID_NULL"); } bool_t hasItem = inventoryItemExists(inventory, item); return jerry_boolean(hasItem); } JS_FUNC(moduleInventorySet) { if(!jerry_value_is_object(args_p[0])) { return JS_THROW("inventorySet: Expected inventory pointer as first argument"); } if(!jerry_value_is_number(args_p[1])) { return JS_THROW("inventorySet: Expected item ID as second argument"); } if(!jerry_value_is_number(args_p[2])) { return JS_THROW("inventorySet: Expected quantity as third argument"); } inventory_t *inventory = (inventory_t *)jsUnwrapPointer(args_p[0]); itemid_t item = (itemid_t)jerry_value_as_number(args_p[1]); uint8_t quantity = (uint8_t)jerry_value_as_number(args_p[2]); assertNotNull(inventory, "Inventory pointer cannot be NULL."); inventorySet(inventory, item, quantity); return jerry_undefined(); } JS_FUNC(moduleInventoryAdd) { if(!jerry_value_is_object(args_p[0])) { return JS_THROW("inventoryAdd: Expected inventory pointer as first argument"); } if(!jerry_value_is_number(args_p[1])) { return JS_THROW("inventoryAdd: Expected item ID as second argument"); } if(!jerry_value_is_number(args_p[2])) { return JS_THROW("inventoryAdd: Expected quantity as third argument"); } inventory_t *inventory = (inventory_t *)jsUnwrapPointer(args_p[0]); itemid_t item = (itemid_t)jerry_value_as_number(args_p[1]); uint8_t quantity = (uint8_t)jerry_value_as_number(args_p[2]); assertNotNull(inventory, "Inventory pointer cannot be NULL."); inventoryAdd(inventory, item, quantity); return jerry_undefined(); } JS_FUNC(moduleInventoryRemove) { if(!jerry_value_is_object(args_p[0])) { return JS_THROW("inventoryRemove: Expected inventory pointer as first argument"); } if(!jerry_value_is_number(args_p[1])) { return JS_THROW("inventoryRemove: Expected item ID as second argument"); } inventory_t *inventory = (inventory_t *)jsUnwrapPointer(args_p[0]); itemid_t item = (itemid_t)jerry_value_as_number(args_p[1]); assertNotNull(inventory, "Inventory pointer cannot be NULL."); if(args_count >= 3) { if(!jerry_value_is_number(args_p[2])) { return JS_THROW("inventoryRemove: Expected quantity as third argument"); } uint8_t amount = (uint8_t)jerry_value_as_number(args_p[2]); uint8_t currentQuantity = inventoryGetCount(inventory, item); if(amount >= currentQuantity) { inventoryRemove(inventory, item); return jerry_undefined(); } inventorySet(inventory, item, currentQuantity - amount); return jerry_undefined(); } inventoryRemove(inventory, item); return jerry_undefined(); } JS_FUNC(moduleInventoryGetCount) { if(!jerry_value_is_object(args_p[0])) { return JS_THROW("inventoryGetCount: Expected inventory pointer as first argument"); } if(!jerry_value_is_number(args_p[1])) { return JS_THROW("inventoryGetCount: Expected item ID as second argument"); } inventory_t *inventory = (inventory_t *)jsUnwrapPointer(args_p[0]); itemid_t item = (itemid_t)jerry_value_as_number(args_p[1]); assertNotNull(inventory, "Inventory pointer cannot be NULL."); uint8_t count = inventoryGetCount(inventory, item); return jerry_number(count); } JS_FUNC(moduleInventoryIsFull) { if(!jerry_value_is_object(args_p[0])) { return JS_THROW("inventoryIsFull: Expected inventory pointer as first argument"); } inventory_t *inventory = (inventory_t *)jsUnwrapPointer(args_p[0]); assertNotNull(inventory, "Inventory pointer cannot be NULL."); bool_t isFull = inventoryIsFull(inventory); return jerry_boolean(isFull); } JS_FUNC(moduleInventoryItemFull) { if(!jerry_value_is_object(args_p[0])) { return JS_THROW("inventoryItemFull: Expected inventory pointer as first argument"); } if(!jerry_value_is_number(args_p[1])) { return JS_THROW("inventoryItemFull: Expected item ID as second argument"); } inventory_t *inventory = (inventory_t *)jsUnwrapPointer(args_p[0]); itemid_t item = (itemid_t)jerry_value_as_number(args_p[1]); assertNotNull(inventory, "Inventory pointer cannot be NULL."); bool_t isFull = inventoryItemFull(inventory, item); return jerry_boolean(isFull); } JS_FUNC(moduleInventorySort) { if(!jerry_value_is_object(args_p[0])) { return JS_THROW("inventorySort: Expected inventory pointer as first argument"); } if(!jerry_value_is_number(args_p[1])) { return JS_THROW("inventorySort: Expected sort type as second argument"); } bool_t reverse = false; if(args_count >= 3) { if(!jerry_value_is_boolean(args_p[2])) { return JS_THROW("inventorySort: Expected reverse flag as third argument"); } reverse = (bool_t)jerry_value_is_true(args_p[2]); } inventory_t *inventory = (inventory_t *)jsUnwrapPointer(args_p[0]); inventorysort_t sortBy = (inventorysort_t)jerry_value_as_number(args_p[1]); assertNotNull(inventory, "Inventory pointer cannot be NULL."); inventorySort(inventory, sortBy, reverse); return jerry_undefined(); } static void moduleItem(void) { moduleBaseEval(ITEM_SCRIPT); jerry_value_t backpack = jsWrapPointer(&BACKPACK); jsSetValue("BACKPACK", backpack); jerry_value_free(backpack); jsRegister("inventoryItemExists", moduleInventoryItemExists); jsRegister("inventoryAdd", moduleInventoryAdd); jsRegister("inventorySet", moduleInventorySet); jsRegister("inventoryRemove", moduleInventoryRemove); jsRegister("inventoryGetCount", moduleInventoryGetCount); jsRegister("inventoryIsFull", moduleInventoryIsFull); jsRegister("inventoryItemFull", moduleInventoryItemFull); jsRegister("inventorySort", moduleInventorySort); }