feat: paperdoll UI + equipment model (layers, conflicts, OnEquip) (#106) #116
No reviewers
Labels
No labels
alpha:wave-0
alpha:wave-1
alpha:wave-2
alpha:wave-3
area:assets
area:combat
area:ecology
area:infra
area:render
area:scripting
area:ui
area:world
enhancement
epic
migration
post-alpha
roadmap
tech-debt
type:bug
type:chore
type:design
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
marco/IsoMmo!116
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/paperdoll-ui"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Implements the bulk of #106 — paperdoll UI + the equipment model — on
feat/paperdoll-ui.Client — composable gumps + paperdoll
Gumpcontainer + aGumpElementfamily (background / picture / item-icon / label / hotspot / button with callback), with per-window dragging as a property (Draggable). Ready for future vendor/NPC/dialog windows.worn_<kind>_<gender>) — no per-item map.gumps.json): adding art = a JSON row +just pack, no code.Server — equipment model (ModernUO-informed)
EquipSlot{Weapon,Armor}->EquipLayer{OneHanded,TwoHanded,Torso}+ anIEquippableinterface (Layer+OnEquip/OnUnequip).EquipConflictstable: equipping displaces conflicting layers (a 2H weapon and a 1H weapon can't coexist); freed items return to the backpack. AddedGreatsword(2H) to exercise it.Mobile.Arm), OnUnequip disarms; effects are derived (re-applied on restore, never persisted). Replaces the oldCombatSystem.ApplyWeaponpath.ItemRegistry(a component);Worldstays a thin facade.CannotEquipcue for non-equippable items;ProtocolVersionbumped; item save bumped to v2 (legacy Armor slot -> Torso).Tests / gates
Equip_ConflictingHandLayers_DisplaceEachOther(World),Equip_NonEquippableItem_SendsCannotEquipNotice(integration),PaperdollLayouttests. All green (GameServer 170, Client.Core 65, whole suite passing); whole solution builds 0 warnings; CSharpier clean.Deferred (remaining for #106, follow-ups)
EquipOutcome(Equipped/OutOfRange/CannotEquip) to give the right cue — a focused change.IsoMmo.Client.UI/.Gumps/ …) crossing the Core/Client assemblies — mechanical, its own PR.Closes most of #106.
Replace EquipSlot{Weapon,Armor} with EquipLayer{OneHanded,TwoHanded,Torso} + an IEquippable interface (Layer + OnEquip/OnUnequip). Equipping displaces conflicting layers (a 2H weapon and a 1H weapon can't coexist) via a small EquipConflicts table; freed items return to the backpack. A weapon's OnEquip arms the wearer (Mobile.Arm), OnUnequip disarms — effects are derived, re-applied on restore, never persisted. Adds Greatsword (2H) to exercise the conflict. Item save bumped to v2 (legacy Armor slot -> Torso). World stays a thin facade; the orchestration lives in ItemRegistry.