
Covey Town
achievements system for a live multiplayer virtual town
Delivered a working achievements layer for Covey.Town: event-driven progress tracking, a filterable modal, global completion stats, custom achievement creation, and in-chat earned-achievement popups, all covered by 7 test files.
Walk the town with the arrow keys (or W A S D) once the board is focused, or use the move buttons. Each step counts 10 feet; at 100 feet the Walk 100 Feet achievement unlocks and broadcasts into the town chat, like the real feature.
PLAYER_WALK criterion · Global category
0 / 100 feet · 0 steps
- town · Achievements online. 5 preset achievements loaded.
The earned-achievement popup lands here, like the real socket broadcast.
Use the arrow keys or the move buttons to start walking.
Synthetic preview. No real data: no live town, players, or sockets. Walk 100 Feet is one of the 5 real preset achievements our CS4530 team shipped (PLAYER_WALK criterion, Global category); this page compresses the scale to 10 feet per step so it unlocks in ten steps.
Synthetic recreation of the team's achievements feature. Walk 100 Feet is a real preset (PLAYER_WALK criterion); no real town, player, or game data.
Built as the CS4530 Software Engineering final project by a team of four, this adds a complete achievements layer to the existing Covey.Town codebase. On the backend (Node.js, Express, Socket.IO, tsoa), an AchievementManager loads achievement definitions from JSON at startup, registers per-player progress listeners keyed to criteria event types (PLAYER_WALK, INTERACT_WITH_GAME_OBJECT, WIN_CONNECT_FOUR, GET_ACHIEVEMENT), and emits an in-game chat-message popup over the socket broadcast when a player earns an achievement. The REST layer (tsoa-generated OpenAPI) exposes endpoints for listing achievements, fetching and updating per-player progress, reading global completion rates, toggling achievement activation, and creating custom achievements. On the frontend (React, Chakra UI, Phaser), a keyboard-triggered progress modal lets players view their own or another player's achievements filtered by status (All, Completed, Incomplete, Unstarted, Self-Made) or category (Global, Tic-Tac-Toe, Connect Four), with per-achievement progress bars and global-completion percentages. Players can also author custom achievements directly from the video-call menu bar. The feature ships with 5 preset achievement definitions and 7 dedicated test files covering components, listeners, and the manager.
- TypeScript
- React
- Chakra UI
- Phaser 3
- Node.js
- Express
- Socket.IO
- tsoa
- Jest
- React Testing Library
- Team size
- 4 engineers
- Preset achievements
- 5
- Criteria event types
- 4 (walk, interact, win, chain)
- Achievement test files
- 7
- Achievement categories
- 3 (Global, Tic-Tac-Toe, Connect Four)
- Custom achievements
- User-created, in-town
Where the numbers come from
The project poster (this card's cover) credits Group 416 as Karim, Shai…
The project poster (this card's cover) credits Group 416 as Karim, Shai, and George; the team size of 4 comes from the owner's project records, which include a fourth member not named on the poster.
Custom achievements are counted as a capability, not a number: the poster…
Custom achievements are counted as a capability, not a number: the poster documents the in-town add-achievement form rather than a tally of created achievements.
What I'd improve
The progress modal re-fetches from the server on every open rather than subscribing to a socket event, which causes a visible round-trip delay. A socket-push model, or even a local cache invalidated by the existing chatMessage event, would make progress feel instant. I would also extract the achievement definitions from flat JSON into a typed builder API to catch schema drift at compile time.