You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This issue is implemented in the fresh MIT-licensed Go server under the replacement program. Its gameplay and content-design decisions remain authoritative. C, CPython, classic packet, file-path, and enum details in the preserved specification are historical evidence only; do not copy, translate, or structurally port GPL implementation code.
Replacement implementation contract
Preserve the decision that books are readable without Literacy. Implement native Go book, spell-learning, scroll, identify, and inscription services using stable discipline IDs; there is no enum-renumbering or Python compatibility step.
The server remains authoritative, consumes versioned compiled content, and exposes bounded generated Game Protocol 1 messages. Pure rules may use a specifically approved typed CEL environment. Starlark is not part of this issue unless the separate residual-scripting decision explicitly approves it.
Required verification
Preserve every observable rule, balance decision, disclosure boundary, and anti-exploit invariant from the specification below.
Add deterministic Go unit/property tests and wrapper-managed scenario coverage at the appropriate integration boundary.
Add bounded malformed-input and persistence-failure cases where this feature accepts content, network, or stored data.
Add Go/Rust protocol conformance fixtures for every new cross-process field; the client must not reconstruct authoritative rules from prose.
Demonstrate that implementation and tests contain no copied GPL source/test material and execute no runtime Python.
Preserved product/design specification and historical implementation notes
Summary
Retire Literacy as a player progression skill and make every non-empty ordinary book readable by every non-blind player. Reading lore should expose its text immediately; it should not require grinding other randomly generated books first.
Magical texts should remain constrained by the skill that makes their magic usable, not by a second generic reading skill. Spellbooks should require the spell's declared casting discipline and level to learn, scrolls should require the relevant casting discipline to activate, and Inscription should stand on its own.
Why the current design does not work
The existing code gives Literacy very little independent gameplay value while making lore access tedious:
link_player_skills() automatically clones every registered skill archetype into every player, so possessing Literacy is not a build choice.
server/src/types/book.c requires Literacy and permits a book only when book level <= Literacy level + 12 + Intelligence modifier. Generated books receive a random level around treasure difficulty, so readable drops are not a dependable progression path.
Ordinary books are the only source of Literacy XP. XP is awarded once per book instance after a successful read, which means the skill can be advanced only by finding and manually applying enough eligible books.
server/src/types/book_spell.c separately requires Literacy, caps comprehension at Literacy + 15, and then also requires the real Wizardry level. Spellbooks do not award Literacy XP, so this is a second progression wall with no supporting loop.
server/src/types/scroll.c and server/src/skills/inscription.c check only that Literacy exists. Since every player receives the skill, these checks are effectively vestigial and do not use its level.
The identify spell limits its batch size with Literacy + Intelligence, making an otherwise unrelated spell depend on the grind.
FLAG_NO_SKILL_IDENT currently serves several meanings at once: suppress one-time reading XP, mark a book as read in item text/filtering, and expose that state through CS_FLAG_NO_SKILL_IDENT.
Raising BOOK_LEVEL_DIFF, increasing book XP, or lowering authored book levels would only move the same gate. It would not give Literacy a coherent active loop or useful identity.
Proposed end state
1. Make ordinary books universally readable
For objects of type BOOK:
retain the blindness check and the empty-book response;
remove change_skill(SK_LITERACY), BOOK_LEVEL_DIFF, the Intelligence comprehension table, and every book-level rejection message;
always send the book interface and message when content exists;
continue identifying a book on first open where appropriate;
do not award skill or character XP merely for opening a book;
retain books_read and, if still useful, first-read statistics and inventory (read)/(unread) presentation as informational UX only. Read state must never control whether text is shown.
A book's level may continue to guide random lore generation, treasure placement, value, or descriptive metadata, but it must no longer be a literacy requirement.
If first-read state remains, replace the overloaded FLAG_NO_SKILL_IDENT/CS_FLAG_NO_SKILL_IDENT terminology with an explicit book-read concept and update loaders, authored uses, item naming/filtering, packet definitions, and consumers together. Do not preserve a hidden Literacy dependency just to retain this flag.
2. Put magical texts under their actual discipline
For BOOK_SPELL:
remove the Literacy-presence check and the spell level > Literacy + 15 check;
allow anyone to inspect/identify what spell the book contains;
keep blindness, curse/damnation, confusion, already-known-spell, and consumption behavior;
require the spell's declared casting discipline at the spell's learn level before teaching it.
For SCROLL:
remove the Literacy check;
require the scroll spell's declared casting discipline to activate it;
preserve identification, blindness, casting, consumption, and usage statistics.
Today the applicable discipline is hard-coded as Wizardry. Implementation should either use Wizardry consistently in the current model or, when sequenced with #18, consume the explicit Wizardry/Divine Magic tradition introduced there rather than adding another fallback. Devices remain governed by their own action-source rules.
3. Decouple identify and inscription
Change normal identify batch capacity to use the cast/effect level already passed to cast_identify() plus the recipient's Intelligence, with a clearly named helper and an exact tested bound. This removes the direct skill_ptr[SK_LITERACY] lookup and works for direct casts and explicit alternate sources.
Update the identify spell description to match the new formula.
Remove Inscription's Literacy prerequisite. The Inscription skill, writing implement, valid marked object, blindness, and message validation are sufficient.
4. Remove the Literacy skill identity completely
Remove SK_LITERACY, its skillist.h entry, skill_literacy archetype, help text, icon references that become unused, and every source/content/documentation reference. Update all current numeric skill producers and consumers after the enum changes, including administrator examples such as maps/python/commands/addexp.py.
Do not retain an obsolete enum slot, invisible zero-level skill, alias, or compatibility path solely for old development saves. Define and document the development-save policy needed for the breaking skill-list change, and update all current in-repository fixtures and player templates coherently.
Player-facing behavior
A new character can read a level-1 note, a level-25 authored journal, or a high-level generated lore book immediately.
Reading the same book again still displays its contents.
A character may inspect a spellbook but cannot learn its spell until the corresponding casting discipline reaches the spell's required level.
A character without the corresponding magical discipline cannot activate that tradition's scroll.
Identify scales from its actual cast/effect level and Intelligence, not from unrelated book reading.
A character with Inscription and a writing pen can write without an additional Literacy check.
Acceptance criteria
Every non-empty BOOK opens for every non-blind player regardless of book level, Intelligence, or skills.
Empty books and blindness retain clear failure messages.
Ordinary books grant no Literacy XP and no replacement grind currency.
Read/unread state, if retained, is informational, updates immediately, persists with the object where appropriate, and never gates content.
Spellbooks can be inspected without Literacy and are learned only when the declared casting discipline meets the spell requirement.
Scroll activation depends on the declared spell discipline, not Literacy.
Identify uses its passed cast/effect level plus Intelligence, with no Literacy pointer access and no off-by-one item count.
Inscription has no Literacy prerequisite.
SK_LITERACY, the skill archetype, obsolete UI/help/editor/docs wording, and all direct references are removed.
Skill enum renumbering is reflected in every current C, Python, content, plugin, fixture, and documentation consumer; no permanent legacy alias remains.
Authored story books with high levels are covered by a regression test proving that their text is available to a new character.
Validation
Add focused C tests for ordinary books: readable low/high levels, repeat reads, empty content, blindness, identification/read-state updates, and no XP change.
Add spellbook tests for inspection, discipline too low, successful learning, already-known spells, curses/damnation, confusion, and consumption.
Add scroll tests for missing/wrong/correct declared discipline and successful consumption.
Add identify boundary tests for zero/one/many items, exact capacity, item-level rejection, marked mode, alternate effect levels, and non-player/plugin callers.
Add Inscription tests covering its own skill/equipment requirements without Literacy.
Collect archetypes and interfaces, run content/map validation for removed fields/references, build the server with warnings as errors, and runtime-smoke representative authored and generated books.
Relevant areas
server/src/types/book.c
server/src/types/book_spell.c
server/src/types/scroll.c
server/src/server/spell_effect.c
server/src/skills/inscription.c
server/src/types/player.c
server/src/server/skill_util.c
server/src/include/skills.h and server/src/include/skillist.h
server/src/socket/item.c, server/src/server/item.c, and server/src/server/object.c
common/toolkit/socket.h
arch/intern/skills/literacy.arc and arch/intern/spells/identify.arc
server/doc/, arch/dev/editor/conf/types.xml, authored books, help text, scripts, and tests
Related: #18 (consolidated disciplines and explicit spell traditions), #14 (Wizardry/Divine Magic mastery and book/scroll integration), and #33 (durable metrics if reading history later becomes character-scoped).
Out of scope
Replacing Literacy with a renamed Lore skill is not part of this change. A future Lore/discovery system should be proposed only with a useful non-grind gameplay loop and should enrich information after reading rather than withholding authored text.
Important
This issue is implemented in the fresh MIT-licensed Go server under the replacement program. Its gameplay and content-design decisions remain authoritative. C, CPython, classic packet, file-path, and enum details in the preserved specification are historical evidence only; do not copy, translate, or structurally port GPL implementation code.
Replacement implementation contract
Preserve the decision that books are readable without Literacy. Implement native Go book, spell-learning, scroll, identify, and inscription services using stable discipline IDs; there is no enum-renumbering or Python compatibility step.
The server remains authoritative, consumes versioned compiled content, and exposes bounded generated Game Protocol 1 messages. Pure rules may use a specifically approved typed CEL environment. Starlark is not part of this issue unless the separate residual-scripting decision explicitly approves it.
Required verification
Preserved product/design specification and historical implementation notes
Summary
Retire Literacy as a player progression skill and make every non-empty ordinary book readable by every non-blind player. Reading lore should expose its text immediately; it should not require grinding other randomly generated books first.
Magical texts should remain constrained by the skill that makes their magic usable, not by a second generic reading skill. Spellbooks should require the spell's declared casting discipline and level to learn, scrolls should require the relevant casting discipline to activate, and Inscription should stand on its own.
Why the current design does not work
The existing code gives Literacy very little independent gameplay value while making lore access tedious:
link_player_skills()automatically clones every registered skill archetype into every player, so possessing Literacy is not a build choice.server/src/types/book.crequires Literacy and permits a book only whenbook level <= Literacy level + 12 + Intelligence modifier. Generated books receive a random level around treasure difficulty, so readable drops are not a dependable progression path.server/src/types/book_spell.cseparately requires Literacy, caps comprehension atLiteracy + 15, and then also requires the real Wizardry level. Spellbooks do not award Literacy XP, so this is a second progression wall with no supporting loop.server/src/types/scroll.candserver/src/skills/inscription.ccheck only that Literacy exists. Since every player receives the skill, these checks are effectively vestigial and do not use its level.Literacy + Intelligence, making an otherwise unrelated spell depend on the grind.FLAG_NO_SKILL_IDENTcurrently serves several meanings at once: suppress one-time reading XP, mark a book as read in item text/filtering, and expose that state throughCS_FLAG_NO_SKILL_IDENT.Raising
BOOK_LEVEL_DIFF, increasing book XP, or lowering authored book levels would only move the same gate. It would not give Literacy a coherent active loop or useful identity.Proposed end state
1. Make ordinary books universally readable
For objects of type
BOOK:change_skill(SK_LITERACY),BOOK_LEVEL_DIFF, the Intelligence comprehension table, and every book-level rejection message;books_readand, if still useful, first-read statistics and inventory(read)/(unread)presentation as informational UX only. Read state must never control whether text is shown.A book's
levelmay continue to guide random lore generation, treasure placement, value, or descriptive metadata, but it must no longer be a literacy requirement.If first-read state remains, replace the overloaded
FLAG_NO_SKILL_IDENT/CS_FLAG_NO_SKILL_IDENTterminology with an explicit book-read concept and update loaders, authored uses, item naming/filtering, packet definitions, and consumers together. Do not preserve a hidden Literacy dependency just to retain this flag.2. Put magical texts under their actual discipline
For
BOOK_SPELL:spell level > Literacy + 15check;For
SCROLL:Today the applicable discipline is hard-coded as Wizardry. Implementation should either use Wizardry consistently in the current model or, when sequenced with #18, consume the explicit Wizardry/Divine Magic tradition introduced there rather than adding another fallback. Devices remain governed by their own action-source rules.
3. Decouple identify and inscription
cast_identify()plus the recipient's Intelligence, with a clearly named helper and an exact tested bound. This removes the directskill_ptr[SK_LITERACY]lookup and works for direct casts and explicit alternate sources.4. Remove the Literacy skill identity completely
Remove
SK_LITERACY, itsskillist.hentry,skill_literacyarchetype, help text, icon references that become unused, and every source/content/documentation reference. Update all current numeric skill producers and consumers after the enum changes, including administrator examples such asmaps/python/commands/addexp.py.Do not retain an obsolete enum slot, invisible zero-level skill, alias, or compatibility path solely for old development saves. Define and document the development-save policy needed for the breaking skill-list change, and update all current in-repository fixtures and player templates coherently.
Player-facing behavior
Acceptance criteria
BOOKopens for every non-blind player regardless of book level, Intelligence, or skills.SK_LITERACY, the skill archetype, obsolete UI/help/editor/docs wording, and all direct references are removed.Validation
Relevant areas
server/src/types/book.cserver/src/types/book_spell.cserver/src/types/scroll.cserver/src/server/spell_effect.cserver/src/skills/inscription.cserver/src/types/player.cserver/src/server/skill_util.cserver/src/include/skills.handserver/src/include/skillist.hserver/src/socket/item.c,server/src/server/item.c, andserver/src/server/object.ccommon/toolkit/socket.harch/intern/skills/literacy.arcandarch/intern/spells/identify.arcserver/doc/,arch/dev/editor/conf/types.xml, authored books, help text, scripts, and testsRelated: #18 (consolidated disciplines and explicit spell traditions), #14 (Wizardry/Divine Magic mastery and book/scroll integration), and #33 (durable metrics if reading history later becomes character-scoped).
Out of scope
Replacing Literacy with a renamed Lore skill is not part of this change. A future Lore/discovery system should be proposed only with a useful non-grind gameplay loop and should enrich information after reading rather than withholding authored text.