This is the platform used during the IRL portion of Hack Club: The Game, an 80 person scavenger hunt across Manhattan.
The platform has custom functionality to support the kind of scavenger hunt we were going for. Admins can create challenges, create and adjust zones on a map, assign challenges to zones, see and review submissions and pause challenge submissions. They can also invite new users + admins to the platform, create houses and assign teams to houses.
Media uploaded by teams are stored in an R2 bucket, and if the right credentials are provided a Google Calendar can also be imported to the platform for participants to view.
This project uses Hack Club Auth. Users are DM'd on Slack when their AirTag enters a new location, when their submissions are reviewed, or when they claim a zone.
This platform is designed to be used in conjunction with the AirTag tracking provided by hackclub/thegamezone, but is not fully necessary - a browser geolocation fallback exists.
Teams can claim a zone if their AirTag/location is detected as being in a zone. They will be prompted to submit media to complete that challenge.
The submission then enters the review queue. Once it is approved, the team earns X points/hr since their initial submission of the challenge, rewarding teams for having claimed zones longer.
If a zone has been claimed by another team, another team can steal it from them by completing the zone's challenge in it. Once a zone is stolen, the team will earn 80% of the points/hr of what the previous team was earning.
Quests are also known as general challenges. They are not associated with zones and give a base amount of points. Any number of teams can complete the same quest, however teams cannot resubmit to a quest unless their submissions were rejected.
Live events show up as a notification on the home page and represent scheduled events that award points for participation. Since points from a live event may be distributed strangely, awarding points for a live event means manually going to the team page (/admin/teams/:id) and adjusting their points.
Prerequisites: Ruby 3.4.8 (use rbenv or rvm), PostgreSQL 14+, Node.js 18+.
Copy .env.example to .env and fill it out, then:
bundle install
bin/rails db:encryption:init # generates ACTIVE_RECORD_ENCRYPTION_* values — paste into .env
bin/rails db:create db:migrate
bin/devWhitelist and promote your first admin user by running AllowedEmail.create!(email: "hcaemailofyourfirstadmin"), sign in then run User.find_by(email: "hcaemailofyourfirstadmin").update!(role: "admin") in the Rails console. Please note that from there, all new users need to be manually invited with their HCA email, which can be done from /admin.
Then, go to /admin/settings for game configuration.
First, create a house in /admin/houses. users that are assigned as Heads of Houses will see their team's submissions prioritised when reviewing at /admin/submissions. Then, create teams for each house at /admin/teams and designate team captains. Team captains are merely a visual change to the platform.
To manually adjust points as an admin, go to /teams/:id or /admin/teams:id and scroll to the point adjustments section.
Can be done from /admin/users. Please note you should be importing users from CSV and adding admin users through the UI.
From playing this game - here are some considerations from the IRL event.
- It is very important you balance the points that are awarded from zone challenges, quests and live events.
Quests that take longer to complete should award more points, because they only give points as a one-time thing. Likewise with live events - increasing the amount of points awarded by live events will also promote attendance at them.
Because zone challenges will reward passive points for as long as the team holds them, they should reward less points to avoid massive inflation in the amount of points given. There is an incentive for claiming a zone first because a zone that is stolen multiple times will progressively reward less and less points.
- Design quests that are completable indoors!
Some of your quests should be completable indoors/with minimal props, in cases of bad weather, or during game downtime where teams technically shouldn't be going outside but still want to be completing challenges.
- Pause passive point earning from zones during game downtime.
There's an option for this in /admin/settings. This is to avoid massive point inflation for games that have overnight downtime.
-
Make sure your reviewers are consistent with what counts for challenge completions.
-
We strongly recommend you have another method of contact with your attendees other than Slack (preferably phone numbers) so that you can inform them of last minute game updates or changes.