
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.
Team feature on the Covey.Town course codebase, with no public deployment or repo.
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
- ‹fill in›
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.