deleting a good item asks in the reference's words

- deleting a rare-or-better item forks to the reference's typed confirm — "Type \"DELETE\" into the field to confirm": Yes starts disabled, the box takes focus, the button enables only while the field spells DELETE, and a reflexive Enter over a half-typed word is inert; the missing engine piece was one hook, the edit box's on-text-changed; beside it, the loot bind-on-pickup confirm — bind-on-pickup AND uncommon-or-better, two conjuncts and no others, so a white BoP drop is taken with no dialog and a bind-on-equip blue never asks here — with the reference's one-pending-slot latch, and the take split into two verbs the way 1.12 actually has it: the row click stays C-side, and LootSlot is only the confirmation's continuation
- the message frames get their justify quartet, read out of the binary's method tables (with the Button table re-derived as the control that lacks it); Frame:EnableDrawLayer/DisableDrawLayer and Region:GetDrawLayer land — the disabled layers are a five-bit mask on the frame, so re-enabling a layer restores exactly what was showing underneath; and the Skills tab's children take the reference's names, with SKILLS_TO_DISPLAY published — pfUI loops over it and got "'for' limit must be a number"
- the README's roadmap line now names what is genuinely big — battlegrounds and meeting stones, both verified still missing — plus the long tail, because the old line named four features that have since landed and small features go stale on a roadmap within a week

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Sam
2026-08-31 20:15:38 +07:00
co-authored by Claude Fable 5
parent c4f432d0c3
commit a5c44f367e
21 changed files with 1369 additions and 92 deletions
@@ -10,7 +10,7 @@ use crate::order::Strata;
use crate::script::{event, Backdrop, Insets, Model};
use crate::widget::FrameKind;
use super::{decode_id, frame_handle_of, frame_wrapper, strata_from_str};
use super::{decode_id, draw_layer_from_str, frame_handle_of, frame_wrapper, strata_from_str};
/// Populate `m`'s visibility/hierarchy/strata/backdrop/mouse methods (see the module doc).
pub(super) fn install(lua: &Lua, m: &Table) -> mlua::Result<()> {
@@ -717,6 +717,38 @@ pub(super) fn install(lua: &Lua, m: &Table) -> mlua::Result<()> {
// attribute, declare it on those 44 sites, then gate. Until then this is a disclosed superset
// (1189's argument, pointed the other way), and the two corpus addons that stopped on the
// missing *method* are unblocked either way.
// EnableDrawLayer(layer) / DisableDrawLayer(layer) — Frame method table `0x878ec0`, entries
// `0x7755b0` / `0x775680`, between `IsToplevel` and `Show`. See [`crate::widget::Frame`]'s
// `disabled_layers` for what was read and why the mask lives on the frame.
//
// An unknown layer name is a NO-OP here rather than a raise. That is the honest state, not a
// decision: `draw_layer_from_str` is the same parser `SetDrawLayer` and `CreateTexture` use,
// and what the reference does with an unparseable name in THIS pair has not been read out of
// the binary. Both corpus callers (pfUI, MoveAnything) pass literals from the five-name set.
for (name, disable) in [("EnableDrawLayer", false), ("DisableDrawLayer", true)] {
m.set(
name,
lua.create_function(move |lua, (this, layer): (Table, Value)| {
let Some(l) = layer
.as_string()
.and_then(|s| s.to_str().ok().and_then(|s| draw_layer_from_str(&s)))
else {
return Ok(());
};
let h = frame_handle_of(lua, &this)?;
let mut model = lua.app_data_mut::<Model>().expect("model");
if let Some(frame) = model.arena.frame_mut(h) {
let bit = 1u8 << l.index();
if disable {
frame.disabled_layers |= bit;
} else {
frame.disabled_layers &= !bit;
}
}
Ok(())
})?,
)?;
}
m.set(
"EnableMouseWheel",
lua.create_function(|lua, (this, enable): (Table, bool)| {