Commit baa3ce0
feat(collectibles): a real shop, and the two fields that decided which furniture the client drew
The shop tab was answering an empty list with a confident comment about needing a
blockchain. That was wrong -- an offer is a furniture classname, a price in
emeralds and two flags, none of which needs a chain, exactly like collections.
It was unbuilt, not impossible, and there was no way for an admin to fill it.
Built end to end: an nft_store_offers table, an NftStoreGrain that both serves
the offers and performs the sale, the purchase message (3196) with its result
(448), and a Shop tab in the dashboard with the offer list and its editor. The
sale runs inside the single-threaded grain so the last copy of a limited edition
cannot be sold twice, refunds the emeralds if handing the furniture over fails,
and refuses outright if the offer names furniture that does not exist.
The picture bug, which was the same bug in two places. The client draws a
collectible by reading itemTypeId with parseInt and looking that number up in one
of its own furniture tables, chosen by productTypeId (0 wall, 1 floor). Both were
being stored or defaulted rather than derived: itemTypeId fell back to the
classname, so parseInt("02_dragonlamp_skream") gave 2, and sprite 2 is the
post-it -- a dragon lamp came out as a post-it. Collections were worse:
ToPrizeItem hardcoded productTypeId 0 and the classname, so every bonus and
reward in every collection was looked up in the wrong table with a nonsense id.
Both now derive from the furniture definition through one shared
CollectibleProductIdentity, and two tests pin sprite-id-not-classname.
Silver and emeralds are pushed at login beside the credits. The client asks for
them once, while its inventory component starts up, and keeps the answer for the
whole session -- so opening the Collectors Guild first left both at zero over a
wallet holding thousands, and the shop's own affordability check then refused
every purchase before sending anything.
A collection's status now means something. The client parses the field and never
reads it, so an admin picking a value was picking noise; the server withholds
anything that is not Visible, which makes Draft a collection you can build over
several sittings without a half-finished set reaching anyone.
Dashboard: the collections editor asked for a bare status number, free-text
rarity and hand-typed prize classnames. Status and rarity are lists now -- rarity
from the client's own colour table -- both prizes are picked from the catalogue
with their image, and the page is split into Collections / Shop / Collectors
tabs instead of stacking three jobs vertically.
Also: the purchase handler now names all six of its outcomes in the log. Only two
were logged, so the three most likely refusals left no trace anywhere and looked
exactly like a packet that never arrived.
Committed with --no-verify at the user's explicit request: the hook cannot run
while Vortex.Main holds the build outputs. The gate's contents were run by hand
instead -- csharpier clean, every touched project builds with no warnings, and
Players 297 / Revisions 209 / Dashboard 20 / Database 124 all pass, plus web lint
and build.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ko6eik295nh81LAxwGayMD1 parent 39c917b commit baa3ce0
98 files changed
Lines changed: 11737 additions & 107 deletions
File tree
- Vortex.Dashboard.API
- Api
- Assets
- Hosting
- Operations
- Vortex.Dashboard.Web/src
- lib/locales
- pages
- Vortex.Database
- Context
- Entities/Collectibles
- Migrations
- Vortex.PacketHandlers
- Collectibles
- Handshake
- Vortex.Players.Tests/Collectibles
- Vortex.Players
- Content
- Grains
- Vortex.Primitives
- Collectibles
- Grains
- Content
- Messages
- Incoming/Collectibles
- Outgoing/Collectibles
- Orleans
- Vortex.Revisions.Tests/Collectibles
- Vortex.Revisions/Revision20260701
- Maps
- Parsers/Collectibles
- Serializers/Collectibles
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 65 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
112 | 112 | | |
113 | 113 | | |
114 | 114 | | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
115 | 175 | | |
116 | 176 | | |
117 | 177 | | |
| |||
141 | 201 | | |
142 | 202 | | |
143 | 203 | | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
144 | 208 | | |
145 | 209 | | |
| 210 | + | |
146 | 211 | | |
147 | 212 | | |
148 | 213 | | |
| |||
Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
0 commit comments