feat(progression): unlock stealth from potion invisibility
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
|
||||
## 2026-08-14
|
||||
|
||||
- **Completion**: Completed US-001 with direct potion-drink effect attribution, monotonic elapsed-time accumulation, safe refresh and stop transitions, durable UUID progress, exact-once unlocking, and title plus chat presentation; verified the full Gradle build.
|
||||
- **Implementation**: Began US-001 with monotonic-clock progression tests and potion-cause event attribution.
|
||||
- **Completion**: Completed US-005 with validated eight-hour defaults and configurable messages, UUID-keyed immutable state, RFC 3339 timing metadata, safe invalid-record defaults, unknown-field preservation, atomic YAML replacement, periodic saves, and serialized off-thread persistence; verified the full Gradle build.
|
||||
- **Implementation**: Began US-005 with test-first validated settings, UUID-keyed state, and defensive asynchronous persistence.
|
||||
- **Completion**: Completed US-006 with a Java 17 Gradle build, strict compiler linting, Spigot API, JUnit 5, Mockito, plugin metadata, OKF validation, Gitea CI, conventional-commit checks, semantic releases, and versioned release assets; verified the full build and a `1.2.3` release JAR.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
type: User Story
|
||||
title: "US-001: Accumulate invisibility time and unlock stealth"
|
||||
description: Reward sustained use of directly consumed invisibility potions with the stealth ability.
|
||||
status: backlog
|
||||
status: done
|
||||
---
|
||||
|
||||
# US-001: Accumulate invisibility time and unlock stealth
|
||||
@@ -11,15 +11,19 @@ As a **player**, I want my qualifying invisibility time to accumulate so that su
|
||||
|
||||
## Acceptance criteria
|
||||
|
||||
- [ ] Only time spent online under an invisibility effect produced by a potion the player directly drank contributes to progression.
|
||||
- [ ] Invisibility received from splash potions, lingering potions, tipped arrows, commands, plugins, or other sources does not contribute.
|
||||
- [ ] Qualifying time stops when the effect ends, is removed, is replaced by a non-qualifying source, the player disconnects, or the plugin disables.
|
||||
- [ ] Refreshed or overlapping qualifying effects never count elapsed time more than once.
|
||||
- [ ] Qualifying time accumulates across effects, sessions, and server restarts.
|
||||
- [ ] The ability unlocks when accumulated qualifying time reaches eight hours by default.
|
||||
- [ ] Reaching the threshold grants the unlock exactly once without discarding excess elapsed time.
|
||||
- [ ] When an online player unlocks stealth, they receive both a full-screen title and a chat message explaining the ability.
|
||||
- [ ] Progress and unlock ownership are associated with the player's UUID rather than their current name.
|
||||
- [x] Only time spent online under an invisibility effect produced by a potion the player directly drank contributes to progression.
|
||||
- [x] Invisibility received from splash potions, lingering potions, tipped arrows, commands, plugins, or other sources does not contribute.
|
||||
- [x] Qualifying time stops when the effect ends, is removed, is replaced by a non-qualifying source, the player disconnects, or the plugin disables.
|
||||
- [x] Refreshed or overlapping qualifying effects never count elapsed time more than once.
|
||||
- [x] Qualifying time accumulates across effects, sessions, and server restarts.
|
||||
- [x] The ability unlocks when accumulated qualifying time reaches eight hours by default.
|
||||
- [x] Reaching the threshold grants the unlock exactly once without discarding excess elapsed time.
|
||||
- [x] When an online player unlocks stealth, they receive both a full-screen title and a chat message explaining the ability.
|
||||
- [x] Progress and unlock ownership are associated with the player's UUID rather than their current name.
|
||||
|
||||
## Validation
|
||||
|
||||
Automated tests verify monotonic accumulation across intervals, refresh without duplicate time, exact-once threshold crossing with excess-time preservation, direct potion-drink cause filtering, non-qualifying replacement, UUID state, and online title and chat presentation. The complete `./gradlew clean check jar` lifecycle passes.
|
||||
|
||||
## Related
|
||||
|
||||
|
||||
Reference in New Issue
Block a user