diff --git a/dfhack b/dfhack index 22a0bd1..abbdbcf 160000 --- a/dfhack +++ b/dfhack @@ -1 +1 @@ -Subproject commit 22a0bd1e543f5b9b58c86572c11100f64a74e1b1 +Subproject commit abbdbcf76b50f5764fb0d4c3802a01260f940b88 diff --git a/dist/library/modules/buildings.lua b/dist/library/modules/buildings.lua index 425bf47..4ad07d2 100644 --- a/dist/library/modules/buildings.lua +++ b/dist/library/modules/buildings.lua @@ -3,12 +3,30 @@ ---@class buildings_module ---@field containsTile function ----@field findAtTile function ----@field findCivzonesAt function ----@field getCorrectSize function ----@field findPenPitAt function dfhack.buildings = {} +---@param pos df.coord +---@return df.building +function dfhack.buildings.findAtTile(pos) end + +---@param pvec df.DFVector +---@param pos df.coord +---@return boolean +function dfhack.buildings.findCivzonesAt(pvec, pos) end + +---@param size df.coord2d +---@param center df.coord2d +---@param type df.building_type +---@param subtype integer +---@param custom integer +---@param direction integer +---@return boolean +function dfhack.buildings.getCorrectSize(size, center, type, subtype, custom, direction) end + +---@param coord df.coord +---@return df.building +function dfhack.buildings.findPenPitAt(coord) end + ---@param building df.building ---@param type df.general_ref_type ---@return df.general_ref @@ -34,12 +52,12 @@ function dfhack.buildings.allocInstance(pos, type, subtype, custom) end ---@param pos df.coord ---@param size df.coord2d ---@param ext df.building_extents ----@param createext boolean|nil ----@param allowoccupied boolean|nil ----@param allowwall boolean|nil ----@param allowflow boolean|nil +---@param create_ext boolean|nil +---@param allow_occupied boolean|nil +---@param allow_wall boolean|nil +---@param allow_flow boolean|nil ---@return boolean -function dfhack.buildings.checkFreeTiles(pos, size, ext, createext, allowoccupied, allowwall, allowflow) end +function dfhack.buildings.checkFreeTiles(pos, size, ext, create_ext, allow_occupied, allow_wall, allow_flow) end ---@param ext df.building_extents ---@param defval integer diff --git a/dist/library/modules/burrows.lua b/dist/library/modules/burrows.lua index bc4c0b1..0e208a2 100644 --- a/dist/library/modules/burrows.lua +++ b/dist/library/modules/burrows.lua @@ -4,13 +4,17 @@ ---@class burrows_module ---@field isAssignedBlockTile function ---@field setAssignedBlockTile function ----@field listBlocks function dfhack.burrows = {} +---@param pvec df.DFVector +---@param burrow df.burrow +---@return nil +function dfhack.burrows.listBlocks(pvec, burrow) end + ---@param name string ----@param ignorefinalplus boolean|nil +---@param ignore_final_plus boolean|nil ---@return df.burrow -function dfhack.burrows.findByName(name, ignorefinalplus) end +function dfhack.burrows.findByName(name, ignore_final_plus) end ---@param burrow df.burrow ---@return nil @@ -31,9 +35,3 @@ function dfhack.burrows.setAssignedUnit(burrow, unit, enable) end ---@return nil function dfhack.burrows.clearTiles(burrow) end ----@return unknown -function dfhack.burrows.isAssignedTile(...) end - ----@return unknown -function dfhack.burrows.setAssignedTile(...) end - diff --git a/dist/library/modules/constructions.lua b/dist/library/modules/constructions.lua index a125871..ea833d1 100644 --- a/dist/library/modules/constructions.lua +++ b/dist/library/modules/constructions.lua @@ -2,16 +2,23 @@ ---@meta ---@class constructions_module ----@field designateRemove function ----@field findAtTile function dfhack.constructions = {} +---@param pos df.coord +---@param immediate boolean|nil +---@return boolean +function dfhack.constructions.designateRemove(pos, immediate) end + +---@param pos df.coord +---@return df.ruction +function dfhack.constructions.findAtTile(pos) end + ---@param pos df.coord ---@param type df.construction_type ---@param item df.item_type ----@param matindex integer +---@param mat_index integer ---@return boolean -function dfhack.constructions.designateNew(pos, type, item, matindex) end +function dfhack.constructions.designateNew(pos, type, item, mat_index) end ---@param constr df.construction ---@return boolean diff --git a/dist/library/modules/designations.lua b/dist/library/modules/designations.lua index 2eb3b02..2732240 100644 --- a/dist/library/modules/designations.lua +++ b/dist/library/modules/designations.lua @@ -2,9 +2,12 @@ ---@meta ---@class designations_module ----@field getPlantDesignationTile function dfhack.designations = {} +---@param plant df.plant +---@return df.coord +function dfhack.designations.getPlantDesignationTile(plant) end + ---@param plant df.plant ---@return boolean function dfhack.designations.markPlant(plant) end diff --git a/dist/library/modules/dfhack.lua b/dist/library/modules/dfhack.lua index 5a975cd..9ea6dc3 100644 --- a/dist/library/modules/dfhack.lua +++ b/dist/library/modules/dfhack.lua @@ -13,41 +13,41 @@ ---@field gitXmlMatch function ---@field isRelease function ---@field isPrerelease function ----@field getCommandHistory function dfhack = {} +---@param state df.lua_State +---@return integer +function dfhack.getCommandHistory(state) end + ---@return string -function dfhack.getOSType(...) end +function dfhack.getOSType() end ---@return integer -function dfhack.getArchitecture(...) end +function dfhack.getArchitecture() end ---@return string -function dfhack.getArchitectureName(...) end +function dfhack.getArchitectureName() end ---@return string -function dfhack.getDFVersion(...) end +function dfhack.getDFVersion() end ---@return string -function dfhack.getDFPath(...) end +function dfhack.getDFPath() end ---@return integer -function dfhack.getTickCount(...) end +function dfhack.getTickCount() end ---@return string -function dfhack.getHackPath(...) end +function dfhack.getHackPath() end ---@return boolean -function dfhack.isWorldLoaded(...) end +function dfhack.isWorldLoaded() end ---@return boolean -function dfhack.isMapLoaded(...) end +function dfhack.isMapLoaded() end ---@return boolean -function dfhack.isSiteLoaded(...) end - ----@return unknown -function dfhack.TranslateName(...) end +function dfhack.isSiteLoaded() end ---@param s string ---@return string @@ -78,8 +78,8 @@ function dfhack.toSearchNormalized(s) end function dfhack.capitalizeStringWords(s) end ---@param id string ----@param srcfile string +---@param src_file string ---@param command string ---@return nil -function dfhack.addCommandToHistory(id, srcfile, command) end +function dfhack.addCommandToHistory(id, src_file, command) end diff --git a/dist/library/modules/filesystem.lua b/dist/library/modules/filesystem.lua index a5e9ef0..1c94bef 100644 --- a/dist/library/modules/filesystem.lua +++ b/dist/library/modules/filesystem.lua @@ -2,18 +2,29 @@ ---@meta ---@class filesystem_module ----@field listdir function ----@field listdir_recursive function dfhack.filesystem = {} +---@param dir string +---@param files df.DFVector +---@return integer +function dfhack.filesystem.listdir(dir, files) end + +---@param dir string +---@param std::map +---@param / df.int depth / = 10 +---@param / df.bool include_prefix / = true +---@return integer +function dfhack.filesystem.listdir_recursive(dir, std::map +function dfhack.gui.getFocusStrings(top) end + +---@param container df.widget_container +---@param name string +---@return df.widget +function dfhack.gui.getWidget(container, name) end + +---@param skip_dismissed boolean|nil ---@return df.viewscreen -function dfhack.gui.getCurViewscreen(skipdismissed) end +function dfhack.gui.getCurViewscreen(skip_dismissed) end ----@param skipdismissed boolean|nil +---@param skip_dismissed boolean|nil ---@param screen df.viewscreen ---@return df.viewscreen -function dfhack.gui.getDFViewscreen(skipdismissed, screen) end +function dfhack.gui.getDFViewscreen(skip_dismissed, screen) end ---@param quiet boolean|nil ---@return df.job @@ -53,9 +114,10 @@ function dfhack.gui.getSelectedBuilding(quiet) end ---@return df.building_civzonest function dfhack.gui.getSelectedCivZone(quiet) end +---@param out df.color_ostream ---@param quiet boolean|nil ---@return df.building_stockpilest -function dfhack.gui.getSelectedStockpile(quiet) end +function dfhack.gui.getSelectedStockpile(out, quiet) end ---@param quiet boolean|nil ---@return df.plant @@ -102,18 +164,18 @@ function dfhack.gui.writeToGamelog(message) end function dfhack.gui.resetDwarfmodeView(pause) end ---@return boolean -function dfhack.gui.refreshSidebar(...) end +function dfhack.gui.refreshSidebar() end ---@return boolean -function dfhack.gui.inRenameBuilding(...) end +function dfhack.gui.inRenameBuilding() end ---@param x number ---@param y number ---@return integer function dfhack.gui.getDepthAt(x, y) end ----@param focusstring string +---@param focus_string string ---@param top df.viewscreen ---@return boolean -function dfhack.gui.matchFocusString(focusstring, top) end +function dfhack.gui.matchFocusString(focus_string, top) end diff --git a/dist/library/modules/items.lua b/dist/library/modules/items.lua index 7229ef4..897a265 100644 --- a/dist/library/modules/items.lua +++ b/dist/library/modules/items.lua @@ -9,12 +9,41 @@ ---@field remove function ---@field findType function ---@field findSubtype function ----@field getPosition function ----@field getOuterContainerRef function ----@field getContainedItems function ----@field moveToBuilding function dfhack.items = {} +---@param item df.item +---@return df.coord +function dfhack.items.getPosition(item) end + +---@param spec_ref df.specific_ref +---@param item df.item +---@param init_ref boolean|nil +---@return nil +function dfhack.items.getOuterContainerRef(spec_ref, item, init_ref) end + +---@param item df.item +---@param items df.DFVector +---@return nil +function dfhack.items.getContainedItems(item, items) end + +---@param mc df.MapExtras::MapCache +---@param item df.item +---@param building df.building_actual +---@param use_mode df.building_item_role_type +---@param force_in_building boolean|nil +---@return boolean +function dfhack.items.moveToBuilding(mc, item, building, use_mode, force_in_building) end + +---@param unit df.unit +---@param item_type df.item_type +---@param item_subtype number +---@param mat_type number +---@param mat_index number +---@param growth_print number +---@param no_floor boolean|nil +---@return boolean +function dfhack.items.createItem(unit, item_type, item_subtype, mat_type, mat_index, growth_print, no_floor) end + ---@param item df.item ---@param type df.general_ref_type ---@return df.general_ref @@ -56,6 +85,10 @@ function dfhack.items.getBookTitle(item) end ---@return string function dfhack.items.getDescription(item, type, decorate) end +---@param item df.item +---@return string +function dfhack.items.getReadableDescription(item) end + ---@param itype df.item_type ---@return boolean function dfhack.items.isCasteMaterial(itype) end @@ -69,12 +102,12 @@ function dfhack.items.getSubtypeCount(itype) end ---@return df.itemdef function dfhack.items.getSubtypeDef(itype, subtype) end ----@param itemtype number ----@param itemsubtype number ----@param mattype number ----@param matsubtype number +---@param item_type number +---@param item_subtype number +---@param mat_type number +---@param mat_subtype number ---@return integer -function dfhack.items.getItemBaseValue(itemtype, itemsubtype, mattype, matsubtype) end +function dfhack.items.getItemBaseValue(item_type, item_subtype, mat_type, mat_subtype) end ---@param item df.item ---@param caravan df.caravan_state @@ -86,14 +119,6 @@ function dfhack.items.getValue(item, caravan) end ---@return boolean function dfhack.items.isRequestedTradeGood(item, caravan) end ----@param itemtype df.item_type ----@param itemsubtype number ----@param mattype number ----@param matindex number ----@param unit df.unit ----@return number -function dfhack.items.createItem(itemtype, itemsubtype, mattype, matindex, unit) end - ---@param item df.item ---@return boolean function dfhack.items.checkMandates(item) end @@ -116,9 +141,9 @@ function dfhack.items.canTradeAnyWithContents(item) end function dfhack.items.markForTrade(item, depot) end ---@param item df.item ----@param gameui boolean|nil +---@param game_ui boolean|nil ---@return boolean -function dfhack.items.canMelt(item, gameui) end +function dfhack.items.canMelt(item, game_ui) end ---@param item df.item ---@return boolean diff --git a/dist/library/modules/job.lua b/dist/library/modules/job.lua index f5e6014..1f16169 100644 --- a/dist/library/modules/job.lua +++ b/dist/library/modules/job.lua @@ -4,16 +4,20 @@ ---@class job_module ---@field is_equal function ---@field is_item_equal function ----@field listNewlyCreated function dfhack.job = {} +---@param pvec df.DFVector +---@param id_var integer +---@return boolean +function dfhack.job.listNewlyCreated(pvec, id_var) end + ---@param job df.job ---@param item df.item ---@param role df.job_item_ref::T_role ----@param filteridx integer ----@param insertidx integer +---@param filter_idx integer +---@param insert_idx integer ---@return boolean -function dfhack.job.attachJobItem(job, item, role, filteridx, insertidx) end +function dfhack.job.attachJobItem(job, item, role, filter_idx, insert_idx) end ---@param job df.job ---@param keepEverything boolean|nil @@ -59,10 +63,10 @@ function dfhack.job.setJobCooldown(workshop, worker, cooldown) end function dfhack.job.removeWorker(job, cooldown) end ---@return nil -function dfhack.job.checkBuildingsNow(...) end +function dfhack.job.checkBuildingsNow() end ---@return nil -function dfhack.job.checkDesignationsNow(...) end +function dfhack.job.checkDesignationsNow() end ---@param item df.job_item ---@param itype df.item_type @@ -71,30 +75,30 @@ function dfhack.job.checkDesignationsNow(...) end function dfhack.job.isSuitableItem(item, itype, isubtype) end ---@param item df.job_item ----@param mattype integer ----@param matindex integer +---@param mat_type integer +---@param mat_index integer ---@param itype df.item_type ---@return boolean -function dfhack.job.isSuitableMaterial(item, mattype, matindex, itype) end +function dfhack.job.isSuitableMaterial(item, mat_type, mat_index, itype) end ---@param job df.job ---@return string function dfhack.job.getName(job) end ---@param job df.job ----@param newid boolean|nil +---@param new_id boolean|nil ---@return boolean -function dfhack.job.linkIntoWorld(job, newid) end +function dfhack.job.linkIntoWorld(job, new_id) end ---@param job df.job ----@param removeall boolean|nil +---@param remove_all boolean|nil ---@return boolean -function dfhack.job.removePostings(job, removeall) end +function dfhack.job.removePostings(job, remove_all) end ---@param job df.job ----@param itemref df.job_item_ref +---@param item_ref df.job_item_ref ---@return nil -function dfhack.job.disconnectJobItem(job, itemref) end +function dfhack.job.disconnectJobItem(job, item_ref) end ---@param job df.job ---@param ref df.general_ref diff --git a/dist/library/modules/kitchen.lua b/dist/library/modules/kitchen.lua index 6bea23a..9e4a9ec 100644 --- a/dist/library/modules/kitchen.lua +++ b/dist/library/modules/kitchen.lua @@ -5,26 +5,26 @@ dfhack.kitchen = {} ---@param type df.kitchen_exc_type ----@param itemtype df.item_type ----@param itemsubtype number ----@param mattype number ----@param matindex number +---@param item_type df.item_type +---@param item_subtype number +---@param mat_type number +---@param mat_index number ---@return integer -function dfhack.kitchen.findExclusion(type, itemtype, itemsubtype, mattype, matindex) end +function dfhack.kitchen.findExclusion(type, item_type, item_subtype, mat_type, mat_index) end ---@param type df.kitchen_exc_type ----@param itemtype df.item_type ----@param itemsubtype number ----@param mattype number ----@param matindex number +---@param item_type df.item_type +---@param item_subtype number +---@param mat_type number +---@param mat_index number ---@return boolean -function dfhack.kitchen.addExclusion(type, itemtype, itemsubtype, mattype, matindex) end +function dfhack.kitchen.addExclusion(type, item_type, item_subtype, mat_type, mat_index) end ---@param type df.kitchen_exc_type ----@param itemtype df.item_type ----@param itemsubtype number ----@param mattype number ----@param matindex number +---@param item_type df.item_type +---@param item_subtype number +---@param mat_type number +---@param mat_index number ---@return boolean -function dfhack.kitchen.removeExclusion(type, itemtype, itemsubtype, mattype, matindex) end +function dfhack.kitchen.removeExclusion(type, item_type, item_subtype, mat_type, mat_index) end diff --git a/dist/library/modules/maps.lua b/dist/library/modules/maps.lua index 280659a..1316eed 100644 --- a/dist/library/modules/maps.lua +++ b/dist/library/modules/maps.lua @@ -7,18 +7,48 @@ ---@field getTileAssignment function ---@field setTileAssignment function ---@field resetTileAssignment function ----@field isValidTilePos function ----@field isTileVisible function ----@field getTileBlock function ----@field ensureTileBlock function ----@field getTileType function ----@field getTileFlags function ----@field getRegionBiome function ----@field getTileBiomeRgn function ----@field getPlantAtTile function ----@field getBiomeType function dfhack.maps = {} +---@param x number +---@param y number +---@param z number +---@return boolean +function dfhack.maps.isValidTilePos(x, y, z) end + +---@param x number +---@param y number +---@param z number +---@return boolean +function dfhack.maps.isTileVisible(x, y, z) end + +---@param x number +---@param y number +---@param z number +---@return df.map_block +function dfhack.maps.getTileBlock(x, y, z) end + +---@param x number +---@param y number +---@param z number +---@return df.map_block +function dfhack.maps.ensureTileBlock(x, y, z) end + +---@param x number +---@param y number +---@param z number +---@return df.tiletype +function dfhack.maps.getTileType(x, y, z) end + +---@param rgn_pos df.coord2d +---@return df.region_map_entry +function dfhack.maps.getRegionBiome(rgn_pos) end + +---@param x number +---@param y number +---@param z number +---@return df.plant +function dfhack.maps.getPlantAtTile(x, y, z) end + ---@param blk df.map_block ---@param flow boolean|nil ---@param temperature boolean|nil @@ -29,10 +59,10 @@ function dfhack.maps.enableBlockUpdates(blk, flow, temperature) end ---@return df.feature_init function dfhack.maps.getGlobalInitFeature(index) end ----@param rgnpos df.coord2d +---@param rgn_pos df.coord2d ---@param index number ---@return df.feature_init -function dfhack.maps.getLocalInitFeature(rgnpos, index) end +function dfhack.maps.getLocalInitFeature(rgn_pos, index) end ---@param pos df.coord ---@return integer @@ -45,9 +75,9 @@ function dfhack.maps.canWalkBetween(pos1, pos2) end ---@param pos df.coord ---@param type df.flow_type ----@param mattype integer ----@param matindex integer +---@param mat_type integer +---@param mat_index integer ---@param density integer ---@return df.flow_info -function dfhack.maps.spawnFlow(pos, type, mattype, matindex, density) end +function dfhack.maps.spawnFlow(pos, type, mat_type, mat_index, density) end diff --git a/dist/library/modules/military.lua b/dist/library/modules/military.lua index 67d9d37..cbee2a3 100644 --- a/dist/library/modules/military.lua +++ b/dist/library/modules/military.lua @@ -4,17 +4,17 @@ ---@class military_module dfhack.military = {} ----@param assignmentid number +---@param assignment_id number ---@return df.squad -function dfhack.military.makeSquad(assignmentid) end +function dfhack.military.makeSquad(assignment_id) end ----@param squadid number ----@param civzoneid number +---@param squad_id number +---@param civzone_id number ---@param flags df.squad_use_flags ---@return nil -function dfhack.military.updateRoomAssignments(squadid, civzoneid, flags) end +function dfhack.military.updateRoomAssignments(squad_id, civzone_id, flags) end ----@param squadid number +---@param squad_id number ---@return string -function dfhack.military.getSquadName(squadid) end +function dfhack.military.getSquadName(squad_id) end diff --git a/dist/library/modules/screen.lua b/dist/library/modules/screen.lua index 7cea276..b290e8b 100644 --- a/dist/library/modules/screen.lua +++ b/dist/library/modules/screen.lua @@ -2,28 +2,77 @@ ---@meta ---@class screen_module ----@field getMousePos function ----@field getMousePixels function ----@field getWindowSize function ----@field paintTile function ----@field readTile function ----@field paintString function ----@field fillRect function ----@field findGraphicsTile function ----@field _doSimulateInput function ----@field keyToChar function ----@field charToKey function ----@field zoom function dfhack.screen = {} +---@return df.coord2d +function dfhack.screen.getMousePos() end + +---@return df.coord2d +function dfhack.screen.getMousePixels() end + +---@return df.coord2d +function dfhack.screen.getWindowSize() end + +---@param pen df.Pen +---@param x integer +---@param y integer +---@param map boolean|nil +---@param df::graphic_viewportst::texpos_field df.int32_t +---@return boolean +function dfhack.screen.paintTile(pen, x, y, map, df::graphic_viewportst::texpos_field) end + +---@param x integer +---@param y integer +---@param map boolean|nil +---@param df::graphic_viewportst::texpos_field df.int32_t +---@return df.Pen +function dfhack.screen.readTile(x, y, map, df::graphic_viewportst::texpos_field) end + +---@param pen df.Pen +---@param x integer +---@param y integer +---@param text string +---@param map boolean|nil +---@return boolean +function dfhack.screen.paintString(pen, x, y, text, map) end + +---@param pen df.Pen +---@param x1 integer +---@param y1 integer +---@param x2 integer +---@param y2 integer +---@param map boolean|nil +---@return boolean +function dfhack.screen.fillRect(pen, x1, y1, x2, y2, map) end + +---@param pagename string +---@param x integer +---@param y integer +---@param ptile integer +---@param pgs integer +---@return boolean +function dfhack.screen.findGraphicsTile(pagename, x, y, ptile, pgs) end + +---@param key df.interface_key +---@return integer +function dfhack.screen.keyToChar(key) end + +---@param code df.char +---@return df.interface_key +function dfhack.screen.charToKey(code) end + +---@param cmd df.zoom_commands +---@return nil +function dfhack.screen.zoom(cmd) end + ---@return boolean -function dfhack.screen.inGraphicsMode(...) end +function dfhack.screen.inGraphicsMode() end ---@return boolean -function dfhack.screen.clear(...) end +function dfhack.screen.clear() end ---@return boolean -function dfhack.screen.invalidate(...) end +function dfhack.screen.invalidate() end ---@param key df.interface_key ---@return string diff --git a/dist/library/modules/units.lua b/dist/library/modules/units.lua index d2991ab..1a319c3 100644 --- a/dist/library/modules/units.lua +++ b/dist/library/modules/units.lua @@ -2,16 +2,49 @@ ---@meta ---@class units_module ----@field getPosition function ----@field getOuterContainerRef function ----@field getNoblePositions function ----@field getUnitsInBox function ----@field getCitizens function ----@field getUnitsByNobleRole function ----@field getStressCutoffs function ----@field assignTrainer function dfhack.units = {} +---@param unit df.unit +---@return df.coord +function dfhack.units.getPosition(unit) end + +---@param spec_ref df.specific_ref +---@param unit df.unit +---@param init_ref boolean|nil +---@return nil +function dfhack.units.getOuterContainerRef(spec_ref, unit, init_ref) end + +---@param pvec df.DFVector +---@param unit df.unit +---@return boolean +function dfhack.units.getNoblePositions(pvec, unit) end + +---@param units df.DFVector +---@param x1 number +---@param y1 number +---@param z1 number +---@param x2 number +---@param y2 number +---@param z2 number +---@return boolean +function dfhack.units.getUnitsInBox(units, x1, y1, z1, x2, y2, z2) end + +---@param citizens df.vector +---@param exclude_residents boolean|nil +---@param include_insane boolean|nil +---@return boolean +function dfhack.units.getCitizens(citizens, exclude_residents, include_insane) end + +---@param units df.vector +---@param noble string +---@return boolean +function dfhack.units.getUnitsByNobleRole(units, noble) end + +---@param unit df.unit +---@param trainer_id number +---@return boolean +function dfhack.units.assignTrainer(unit, trainer_id) end + ---@param u df.unit ---@param x1 number ---@param y1 number @@ -31,14 +64,14 @@ function dfhack.units.isActive(unit) end function dfhack.units.isVisible(unit) end ---@param unit df.unit ----@param includeinsane boolean|nil +---@param include_insane boolean|nil ---@return boolean -function dfhack.units.isCitizen(unit, includeinsane) end +function dfhack.units.isCitizen(unit, include_insane) end ---@param unit df.unit ----@param includeinsane boolean|nil +---@param include_insane boolean|nil ---@return boolean -function dfhack.units.isResident(unit, includeinsane) end +function dfhack.units.isResident(unit, include_insane) end ---@param unit df.unit ---@return boolean @@ -253,9 +286,9 @@ function dfhack.units.isVisitor(unit) end function dfhack.units.isInvader(unit) end ---@param unit df.unit ----@param includevamps boolean|nil +---@param include_vamps boolean|nil ---@return boolean -function dfhack.units.isUndead(unit, includevamps) end +function dfhack.units.isUndead(unit, include_vamps) end ---@param unit df.unit ---@return boolean @@ -290,9 +323,9 @@ function dfhack.units.isDanger(unit) end function dfhack.units.isGreatDanger(unit) end ---@param unit df.unit ----@param targetpos df.coord +---@param target_pos df.coord ---@return boolean -function dfhack.units.teleport(unit, targetpos) end +function dfhack.units.teleport(unit, target_pos) end ---@param unit df.unit ---@param type df.general_ref_type @@ -348,30 +381,30 @@ function dfhack.units.casteFlagSet(race, caste, flag) end function dfhack.units.getMiscTrait(unit, type, create) end ---@param unit df.unit ----@param trueage boolean|nil +---@param true_age boolean|nil ---@return number -function dfhack.units.getAge(unit, trueage) end +function dfhack.units.getAge(unit, true_age) end ---@param unit df.unit ---@return integer function dfhack.units.getKillCount(unit) end ---@param unit df.unit ----@param skillid df.job_skill ----@param userust boolean|nil +---@param skill_id df.job_skill +---@param use_rust boolean|nil ---@return integer -function dfhack.units.getNominalSkill(unit, skillid, userust) end +function dfhack.units.getNominalSkill(unit, skill_id, use_rust) end ---@param unit df.unit ----@param skillid df.job_skill +---@param skill_id df.job_skill ---@return integer -function dfhack.units.getEffectiveSkill(unit, skillid) end +function dfhack.units.getEffectiveSkill(unit, skill_id) end ---@param unit df.unit ----@param skillid df.job_skill +---@param skill_id df.job_skill ---@param total boolean|nil ---@return integer -function dfhack.units.getExperience(unit, skillid, total) end +function dfhack.units.getExperience(unit, skill_id, total) end ---@param unit df.unit ---@param labor df.unit_labor @@ -392,10 +425,10 @@ function dfhack.units.computeMovementSpeed(unit) end function dfhack.units.computeSlowdownFactor(unit) end ---@param unit df.unit ----@param ignorenoble boolean|nil +---@param ignore_noble boolean|nil ---@param plural boolean|nil ---@return string -function dfhack.units.getProfessionName(unit, ignorenoble, plural) end +function dfhack.units.getProfessionName(unit, ignore_noble, plural) end ---@param race integer ---@param casteid integer @@ -405,9 +438,9 @@ function dfhack.units.getProfessionName(unit, ignorenoble, plural) end function dfhack.units.getCasteProfessionName(race, casteid, pid, plural) end ---@param unit df.unit ----@param ignorenoble boolean|nil +---@param ignore_noble boolean|nil ---@return number -function dfhack.units.getProfessionColor(unit, ignorenoble) end +function dfhack.units.getProfessionColor(unit, ignore_noble) end ---@param race integer ---@param casteid integer @@ -478,9 +511,9 @@ function dfhack.units.getMainSocialEvent(unit) end ---@return integer function dfhack.units.getStressCategory(unit) end ----@param stresslevel number +---@param stress_level number ---@return integer -function dfhack.units.getStressCategoryRaw(stresslevel) end +function dfhack.units.getStressCategoryRaw(stress_level) end ---@param unit df.unit ---@param amount number diff --git a/dist/library/modules/world.lua b/dist/library/modules/world.lua index f67857a..25eca1a 100644 --- a/dist/library/modules/world.lua +++ b/dist/library/modules/world.lua @@ -5,31 +5,31 @@ dfhack.world = {} ---@return boolean -function dfhack.world.ReadPauseState(...) end +function dfhack.world.ReadPauseState() end ---@param paused boolean|nil ---@return nil function dfhack.world.SetPauseState(paused) end ---@return integer -function dfhack.world.ReadCurrentTick(...) end +function dfhack.world.ReadCurrentTick() end ---@return integer -function dfhack.world.ReadCurrentYear(...) end +function dfhack.world.ReadCurrentYear() end ---@return integer -function dfhack.world.ReadCurrentMonth(...) end +function dfhack.world.ReadCurrentMonth() end ---@return integer -function dfhack.world.ReadCurrentDay(...) end +function dfhack.world.ReadCurrentDay() end ---@return integer -function dfhack.world.ReadCurrentWeather(...) end +function dfhack.world.ReadCurrentWeather() end ---@param weather integer ---@return nil function dfhack.world.SetCurrentWeather(weather) end ---@return string -function dfhack.world.ReadWorldFolder(...) end +function dfhack.world.ReadWorldFolder() end diff --git a/lib/cpp.rb b/lib/cpp.rb index d711098..7479db7 100644 --- a/lib/cpp.rb +++ b/lib/cpp.rb @@ -57,7 +57,54 @@ def parse_type(string) def sanitize(string) return nil unless string - string.gsub(/[^A-Za-z0-9]/, '').strip + string.gsub(/[^A-Za-z0-9]_/, '').strip + end + + def parse_function(match, module_name:, prefix:, function_name:) + annotation = [] + + captures = match.captures + return_type = parse_type(captures[0]) + arguments = [] + + if captures[1] + # TODO: Naming convention or actual compiler behaviour? + arguments = captures[1].split(',').reject { |arg| arg.include? '&out' } + arguments = arguments.map { |arg| arg.gsub(/const\s|[*&]/, '').strip } + arguments = arguments&.map do |argument| + type, _, name = argument.rpartition(' ') + type = DFHackLuaDefinitions::CPP.parse_type(type) + type = "df.#{type}" unless DFHackLuaDefinitions::LuaLS::TYPES.include? type + + { + name: DFHackLuaDefinitions::LuaLS.safe_name(DFHackLuaDefinitions::CPP.sanitize(name)), + type: type == 'boolean' ? 'boolean|nil' : type.strip + } + end&.compact + end + unless arguments&.empty? + arguments&.each do |argument| + annotation << "---@param #{argument[:name]} #{argument[:type]}\n" + end + end + + if return_type + # Namespacing + return_type = "df.#{return_type}" unless DFHackLuaDefinitions::LuaLS::TYPES.include? return_type + + annotation << "---@return #{return_type.gsub(/const|[*&]/, '')}\n" if return_type + else + annotation << "---@return unknown\n" + end + + annotation << "function #{prefix}#{module_name}.#{function_name}(" + annotation << if !arguments + '...' + else + arguments&.map { |arg| arg[:name] }&.join(', ') + end + annotation << ") end\n\n" + annotation.join end end end diff --git a/lib/generate.rb b/lib/generate.rb index 0e89315..c3176c3 100755 --- a/lib/generate.rb +++ b/lib/generate.rb @@ -51,67 +51,40 @@ def parse_cpp_modules(files) output << "---@field #{function_name} function\n" end + prefix = module_name == 'dfhack' ? '' : 'dfhack.' + namespace = module_name == 'dfhack' ? '' : "#{module_name.capitalize}::" + output << "#{prefix}#{module_name} = {}\n\n" + + functions = [] + + # Guessing here a little bit. file.scan(/^static.*#{module_name}_funcs\[\][\s\S]+?};/) do |funcs| funcs.scan(/{([^}\n]+)}/) do match = Regexp.last_match(1) next if match =~ /NULL/ function_name = match.split(',')[0].strip.gsub(/"/, '') + signature_name = match.split(',')[1].strip.gsub('"', '').gsub("#{module_name}_", '') - output << "---@field #{function_name} function\n" + module_file[/^(?:static\s)?(?:DFHACK_EXPORT\s)?(\S+).*?#{namespace}#{signature_name}\s?\(([^)]+)?\)/] + next unless Regexp.last_match + + functions << DFHackLuaDefinitions::CPP.parse_function(Regexp.last_match, module_name:, prefix:, function_name:) end end - prefix = module_name == 'dfhack' ? '' : 'dfhack.' - namespace = module_name == 'dfhack' ? '' : "#{module_name.capitalize}::" - output << "#{prefix}#{module_name} = {}\n\n" - cpp_module.scan(/(?:WRAP|WRAPM)\((.+)?\),?/) do |function_name,| function_name = Regexp.last_match(1) if function_name =~ /,\s?(\S+)/ signature = "#{namespace}#{function_name}" module_file[/^(?:static\s)?(?:DFHACK_EXPORT\s)?(\S+).*?#{signature}\s?\(([^)]+)?\)/] - return_type = DFHackLuaDefinitions::CPP.parse_type(Regexp.last_match(1)) - arguments = Regexp.last_match(2)&.gsub(/const\s|[*&]/, '')&.split(',')&.map(&:strip) - - arguments = arguments&.map do |argument| - type, name = argument.split(' ') - type = DFHackLuaDefinitions::CPP.parse_type(type) - type = "df.#{type}" unless DFHackLuaDefinitions::LuaLS::TYPES.include? type - - if name == 'out' - nil - else - { - name: DFHackLuaDefinitions::LuaLS.safe_name(DFHackLuaDefinitions::CPP.sanitize(name)), - type: type == 'boolean' ? 'boolean|nil' : type - } - end - end&.compact - unless arguments&.empty? - arguments&.each do |argument| - output << "---@param #{argument[:name]} #{argument[:type]}\n" - end - end + next unless Regexp.last_match - if return_type - # Namespacing - return_type = "df.#{return_type}" unless DFHackLuaDefinitions::LuaLS::TYPES.include? return_type - - output << "---@return #{return_type.gsub(/const|[*&]/, '')}\n" if return_type - else - output << "---@return unknown\n" - end - - output << "function #{prefix}#{module_name}.#{function_name}(" - output << if !arguments - '...' - else - arguments&.map { |arg| arg[:name] }&.join(', ') - end - output << ") end\n\n" + functions << DFHackLuaDefinitions::CPP.parse_function(Regexp.last_match, module_name:, prefix:, function_name:) end + + output << functions.join end end end