- disappears on click outside its borders
- disappears on r-click
- mouse over the help panel counts as "over the menu" (so the menu
doesn't close if the player moves the mouse to the help text)
- menu panels appear next to the logo hotspot instead of over it,
allowing players to avoid clicking on the wrong item if they
intend to click on the logo
and combine hotkeys for identical commands
and don't hide the menu until the mouse has left the frame
and start the widget one tile closer to the edge so the mouse is already
on the list instead of on the frame
* Update eventful.lua
Had wrong function. Fixes https://github.com/DFHack/dfhack/issues/2202
* Update Lua API.rst
Update docs to add onReactionCompleting and remove outdated info
* Update Lua API.rst
Some more minor doc fixes
* [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
* add changelog entry
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
* Adds cxxrandom unit test and fixes interface problems
* Tightens braces
* Adds detection code for Shuffle's seqID/engID
* Adds usage examples for cxxrandom
* Gives cxxrandom objects id ranges, sort of
* Updates changelog
* Updates changelog.txt
* Increases id space for cxxrandom
* Fixes bool distribution error message and improves check
* Adds comment explaining the seeded RNG tests for cxxrandom
* Fixes type problem for 32bit builds
* Reduces loop count a few magnitudes
* Fixes a mistake in test.cxxrandom_seed
--splitby=none is the new default, allowing all blueprint phases to be
written to a single file. old behavior of one phase per file is
supported via --splitby=phase.
refactor is a straight copy-paste. this code could really stand some
cleanup (unused vars, unnecessary use of the MapCache layer, forced
allocation of all blocks even if they are not being unhidden, etc.), but
that can come in a later PR.
- make depth and name parameters optional
- allow depth to be negative to indicate top-down instead of the
previous hard-coded bottom-up
- add --cursor for specifying start position (game cursor is not needed
if this param is specified)
Planning a 4x2 construction with DF's `umkh` keys (i.e. not automaterial's box-select) would previously produce a 5x3 construction instead, for example.
This kind of functionality is much more important now than it used to
be since there are so many supported building types.
Also modified the 'Planning Mode' status on the building placement
screen to reflect whether we're in quickfort mode, enable all mode, or
whether just the building type is enabled.
this setting is not persisted (just like quickfort_mode is not
persisted), but it can be set from onMapLoad.init
for items that cannot have a quality or be decorated:
in place mode, don't show quality adjustment hotkeys (or isDecorated
flag hotkey) and don't interpret the associated keycodes if they are
pressed.
in query mode, don't show quality or decorated fields.
solves the confusing behavior when both automaterial and buildingplan
are enabled for constructions. the two plugins now communicate with each
other over the Lua layer to negotiate consistent behavior.
if neither plugin is enabled, the standard DF UI acts as normal
if automaterial is enabled but buildingplan is not, then automaterial
behavior is unchanged.
if buildingplan is enabled and automaterial is not then behavior is
the same as other buildings with buildingplan (no material selection
screen, screen stays on building placement screen after placement).
this commit fixes a bug, though, where buildingplan would only lay
down a single tile of contruction instead of a solid block when a
block is requested.
if both plugins are enabled but buildingplan is not enabled for the
building type then automaterial is unchanged from previous behavior,
execpt for an additional header showing the separation between
automaterial hotkeys and buildingplan hotkeys.
finally, if both plugins are enabled and buildingplan is enabled for the
building type then buildingplan behavior prevails, but the box select and
hollow designations features of automaterial are still usable and
useful. the 'Auto Mat-select', 'Reselect Type', and "Open Placement"
automaterial hotkeys are hidden in the UI and ignored in the feed. This
is because buildingplan takes over material selection, so 'Auto
Mat-select' doesn't make sense. Buildingplan also already stays on the
placement screen after placement, so 'Reselect Type' is not necessary.
And all buildingplan-placed buildings have relaxed placement
restrictions (e.g. they can be built in mid-air) so 'Open Placement' is
also not necessary. The missing options are replaced with blank lines so
the vertical alignment of all other options stays constant.
we also remove a few extra lua_pop() calls that are made superfluous by
the StackUnwinder.
- remove buildings_use_blocks setting from quickfort config file
- add a new Buildingplan Global Settings dialog to house global settings
- move Quickfort Mode (for legacy Python Quickfort) into that dialog
- add four settings to control how generic building materials are matched:
- blocks
- boulders
- logs
- bars
- ajust the buildingplan algorithm to register duplicate tasks for
building material item filters, one for each type. since we track how
many items we've matched for a filter, the first matched item will
"win" and the extras will get detected as invalid and popped off the
queue.
- ensure boulders, logs, and bars are scanned last, and in that order
- more global settings planned for the future! see
http://www.bay12forums.com/smf/index.php?topic=176889.msg8202679#msg8202679
but restrict to only the currently supported set so we can still assume only one filter is required for each building.
changes:
- update buildingplan plugin version to 2.0
- new serialization format for planned buildings
- old persistent data is automatically migrated to new format on load
- algorithm now respects job_item filters; items must match job_item filter and buildingplan ItemFilter
- more invalid items are now filtered out, like items encased in ice. are there any others we should be checking (see BadFlags struct)
- items are sorted before job is unsuspended so final item ordering is correct regardless of what order the items were matched and attached
- item counts in filters are kept up to date so if buildingplan is disabled before all filters are matched and the building is completed by DF itself, the item counts will come out correct (though the item ordering and building "roughness" may be incorrect)
- fixes two memory leaks in building finalization code
- allows artifacts to be matched (ItemFilter defaults now top out at Masterful -- Artifact is selectable but must be manually specified)
- add gui to switch between items for buildings that require multiple item types
Replace C++ building construction code with lua constructBuilding so we can get the proper job_item filters set. these filters will be used when we replace the core buildingplan algorithm in the next PR.
Lots of refactoring and reorganizing, with only cosmetic player-visible changes.
- show quickfort mode hotlkey label regardless of whether the current building type has buildingplan enabled. before, it was only shown after the user enabled buildingplan for the current building. this eliminates the extra step when enabling quickfort mode, which force-enables all building types.
- changed signature of lua-exported isPlannableBuilding to take subtype
and custom type in addition to building type. this is only used by
quickfort, and it already sends all three params in preparation for
this change
- added lua-exported scheduleCycle(), which is like doCycle(), but only
takes effect on the next non-paused frame. this lets quickfort
run only one buildingplan cycle regardless of how many #build
blueprints were run
- declared a few dfhack library methods and params const so buildingplan
could call them from const methods
- converted buildingplan internal debug logging fn to have a printf api
- reshaped buildingplan-planner API and refactored implementation in
preparation for upcoming core algorithm changes for supporing all
building types (no externally-visible functionality changes)
- changed df::building_type params to type, subtype, custom tuple keys
- introduced capability to return multiple filters per building type
(though the current buildings all only have one filter per)
- split monolith hook functions in buildingplan.cpp into one per scope.
this significantly cleans up the code and preps the hooks to handle
iterating through multiple item filters.
- got rid of send_key function and replaced with better reporting of
whether keys have been handled
Major Revision
update v2.0
=-=-=-=-=
Native functions(exported to lua):
-GenerateEngine: returns engine id (args: seed)
-DestroyEngine: destroys corresponding engine (args: rngID)
-NewSeed re-seeds engine (args: rngID, seed)
-rollInt generates random integer (args: rngID, min, max)
-rollDouble generates random double (args: rngID, min, max)
-rollNormal generates random normal[gaus.] (args: rngID, avg, stddev)
-rollBool generates random boolean (args: rngID, chance)
-MakeNumSequence returns sequence id (args: start, end)
-AddToSequence adds a number to the sequence (args: seqID, num)
-ShuffleSequence shuffles the number sequence (args: rngID, seqID)
-NextInSequence returns the next number in seq.(args: seqID)
Lua plugin functions:
-MakeNewEngine returns engine id (args: seed)
Lua plugin classes:
-crng
methods:
-init(id, df, dist) :: constructor
id - Reference ID of engine to use in RNGenerations
df (optional) - bool indicating whether to destroy the Engine when the crng object is garbage collected
dist (optional) - lua number distribution to use
-__gc() :: destructor
-changeSeed(seed) :: alters engine's seed value
-setNumDistrib(distrib) :: set's the number distribution crng object should use
distrib - number distribution object to use in RNGenerations
-next() :: returns the next number in the distribution
-shuffle() :: effectively shuffles the number distribution
-normal_distribution
methods:
-init(avg, stddev) :: constructor
-next(id) :: returns next number in the distribution
id - engine ID to pass to native function
-real_distribution
methods:
-init(min, max) :: constructor
-next(id) :: returns next number in the distribution
id - engine ID to pass to native function
-int_distribution
methods:
-init(min, max) :: constructor
-next(id) :: returns next number in the distribution
id - engine ID to pass to native function
-bool_distribution
methods:
-init(min, max) :: constructor
-next(id) :: returns next boolean in the distribution
id - engine ID to pass to native function
-num_sequence
methods:
-init(a, b) :: constructor
-add(num) :: adds num to the end of the number sequence
-shuffle() :: shuffles the sequence of numbers
-next() :: returns next number in the sequence
Adds missing function exports.
Fixes numerous problems I won't go into
Implements helper functions for random number generation.
Implemented using C++11 <random> library.
Exported Lua Functions:
- seedRNG(seed)
- rollInt(min, max)
- rollDouble(min, max)
- rollNormal(mean, std_deviation)
- rollBool(chance_for_true)
- resetIndexRolls(string, array_length) --String identifies the instance of SimpleNumDistribution to reset
- rollIndex(string, array_length) --String identifies the instance of SimpleNumDistribution to use
--(Shuffles a vector of indices, Next() increments through then reshuffles when end() is reached)
On branch cxxrandom-rel
Changes to be committed:
modified: plugins/CMakeLists.txt
new file: plugins/cxxrandom.cpp
new file: plugins/lua/cxxrandom.lua
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Squashed commit of the following:
commit 3a7ef70d45f3e0c2fe367141dd0349dddaaff60d
Merge: fd9f1982 7aa0608c
Author: Josh Cooper <cooper.s.josh@gmail.com>
Date: Fri Dec 22 22:17:27 2017 -0800
Merge remote-tracking branch 'origin/temp' into cxxrandom
commit 7aa0608cb85dcf82686193db7a6e9d1318f5f2a5
Author: Josh Cooper <cooper.s.josh@gmail.com>
Date: Thu Dec 21 21:43:35 2017 -0800
Revises cxxrandom plugin
New functions:
- seedRNG(ushort seed)
--lua exported
- GetDistribContainer()
--internal singleton
- RNG()
--internal singleton
Summary:
- Removed class CXXRNG
--Refactored functions that used CXXRNG
Changes to be committed:
modified: plugins/cxxrandom.cpp
commit b42979818a01c1121eace7b1ac14676f5ad5d8b2
Author: Josh Cooper <cooper.s.josh@gmail.com>
Date: Wed Dec 20 13:21:49 2017 -0800
Fixes plugin_init()
Misread the lines indicated by lethosor to be excluded, had broken the plugin in the process.
Changes to be committed:
modified: plugins/cxxrandom.cpp
commit 753a00a14d9e6519d299638e014abf30509940af
Author: Josh Cooper <cooper.s.josh@gmail.com>
Date: Wed Dec 20 12:36:17 2017 -0800
Cleans up cxxrandom.cpp
DFHack contributions specifies:
-spaces instead of tabs, so tabs were converted.
-C++ headers before dfhack stuff, so it was done
*Also added author name, creation date, and last updated date.
Changes to be committed:
modified: plugins/cxxrandom.cpp
commit 498ebe4b8fdccc01ac1f169269f3093c830a8a10
Author: Josh Cooper <cooper.s.josh@gmail.com>
Date: Tue Dec 19 22:51:58 2017 -0800
Updates cxxrandom, fixes instance leak
deleted header
moved definition to cpp file #lethosor
fixed singleton instance, no longer a pointer
commented out dfhack commands, now only init/shutdown and exported lua functions
modified: cxxrandom.cpp
deleted: cxxrandom.h
commit 821044bef2a0201d0d74192e445c7b29766b42a1
Author: Josh Cooper <cooper.s.josh@gmail.com>
Date: Sun Dec 17 04:01:11 2017 -0800
Fixes RollIndex and Renames RollNormal
Renamed the Normal Distribution RNG function to fit the standard.
Now named RollNormal(m,s)
Fixed some wonky white space in the lua macro export block.
Fixed a stupid mistake with the RollIndex output. (it was outputting 0's)
Updated usage details.
Changes to be committed:
modified: plugins/cxxrandom.cpp
commit 1536f43d137b6bc55d55759b43bdccf6ff429b33
Author: Josh Cooper <cooper.s.josh@gmail.com>
Date: Fri Dec 15 08:50:08 2017 -0800
Fixes/Improves cxxrandom
Modified return types
Corrected index distribution code
commit 8629c7e1509522cb0cc4b649914b90d033cb4763
Author: Josh Cooper <cooper.s.josh@gmail.com>
Date: Thu Dec 14 19:02:29 2017 -0800
Implements SimpleNumDistribution
Exported additional functions to lua.
Functions allow the generation of random 0-N index values.
Generation promises all unique values [0,N] will be returned once each when generation is run N times.
On branch cxxrandom
Changes to be committed:
modified: plugins/cxxrandom.cpp
modified: plugins/cxxrandom.h
commit f035f3d20415790542cf83e5e696261661d911f3
Author: Josh Cooper <cooper.s.josh@gmail.com>
Date: Wed Dec 13 23:55:39 2017 -0800
Implements cxxrandom
cxxrandom was implemented using a singleton.
This singleton provides an interface for generating uniform numbers, or numbers in a normal distribution, and also booleans(given the probability for the true outcome)
The singleton interface is wrapped in functions which are exposed for lua usage.
Integrated into plugins/CMakeLists.txt
On branch dev
Changes to be committed:
modified: CMakeLists.txt
new file: cxxrandom.cpp
new file: cxxrandom.h
new file: lua/cxxrandom.lua
It should not try to do that if e.g. showing buildingitems. Maybe later we will have more valid focus strings (e.g. custom item view for some buildings) but for now just use vanilla (or callback function not a class)
The manager can now specify each type of craft individually, as well as in general.
There may be a better justification for not allowing pearl and shell scepters, though.
Mostly, instruments and their pieces are made through generated custom reactions, instead of as tools.
Depends on df-structures commit e551233 for full potency.
This should make resolving future issues easier, although implementing
new confirmations in lua isn't possible yet (each one requires a line
in confirm.cpp).
This also resolves an issue with note-delete and route-delete, with
dfhack/df-structures@1bc4f61
It's been four years since meaningful updates, and in that time
alternatives have emerged to almost everything. Any remaining
functionality to replace is on the issue tracker.
Simpler is better, for users and developers, and removing a legacy
system makes it easier to understand how DFHack works.
Previously, it was possible to save outside of the stocksettings
directory or fail to save in a nonexistent subdirectory (e.g. when
a stockpile name had slashes in it).
Resolves#621
Widget positions and a few other options (e.g. date formats) can be
specified in dfhack-config/dwarfmonitor.json on a per-instance basis.
Related changes:
* Fixed an issue loading JSON files from Lua
* JSON files in dfhack-config (only dwarfmonitor.json currently) are
no longer copied into the DF directory when building DFHack. This
keeps developers' personal settings intact, but will require
copying over changes made to DFHack's copies manually.
* Fixed incorrect config path in dwarfmonitor help
Makes workflow understand "seeds of any plant", "thread of any plant",
"drink of any plant", "powder of any plant", and "liquid of any plant"
when counting items.
Changes workflow's handling of the built-in plant reactions to
understand that they always produce plant products, and that they also
produce seeds.
This means that you can set a target for, for example, "powder of any
plant", and workflow will use a milling job to produce that.
Fixed buildings not consuming correct value of power. Added way to ignore unpowered state. Added setPower/getPower to change how much power building uses on the fly.
For the most part, mismatches should only happen if the reaction list has changed between world loads, which means either the raw files or the plugin files have been changed. For now, such entries are ignored, though in some cases it might be possible to recover a new order number by searching through the reaction list.
- Duplicate definition of a function now in uicommon.h
- Assertion failure due to missing core suspend claim.
- Incorrect way of accessing the civ entity.
- Accessing nil objects in the lua module if filter matches nothing.
- Lua module breaking on reload('plugins.stockflow').
Now frees manager_order objects in the reaction_list when the plugin is disabled or the world unloaded. However, there may still be orders leaked elsewhere.
Specifically, any "if (verbose) { Core::printerr("blah") }" kind
of stuff definitely doesn't belong in the common API functions.
Also, ref->getUnit() is very expensive.
On the other hand, checks for crash-inducing conflicts with the
ui should be in the core api, and not in client plugins.
- To ensure reload safety functions have to be wrapped. Every call
checks the loaded state and locks a mutex in Plugin. If the plugin
is unloaded, calling its functions throws a lua error. Therefore,
plugins may not create closures or export yieldable functions.
- The set of function argument and return types supported by
LuaWrapper is severely limited when compared to being compiled
inside the main library.
Currently supported types: numbers, bool, std::string, df::foo,
df::foo*, std::vector<bool>, std::vector<df::foo*>.
- To facilitate postponing initialization until after all plugins
have been loaded, the core sends a SC_CORE_INITIALIZED event.
- As an example, the burrows plugin now exports its functions.