Specter Inspectors: a game of ghosts and guesses
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Specter Inspectors

a game of ghosts and guesses: http://www.specterinspectors.com

    //        \\    
   //          \\   
  ||     __     ||  
  ||    /  \    ||  
  ||    \  /    ||  
  ||     ||     ||  
  ||     ||     ||  
  ||     ||     ||  
  || __      __ ||  
  ||/  \    /  \||  
  |/    \__/    \|   



• 5-25 players

• 1 smartphone/computer each

• 30-60 minutes


• One player creates a game using the "new" button.

• All other players join using the 4-letter gamecode and the "join" button.

• Each player inputs a name and some clothing color info.

• On launch, each player will be given a secret special role. (2/3 good, 1/3 evil) (1/2 of the good and 1/2 of the evil get special abilities)


Story: This is where the story takes place, including all narrative and interactive events.

Notes: Players can type personal notes throughout the game to keep track of everything that happens.

Chats: Certain roles, like killers and ghosts, are able to communicate in secret with others using this tab.


day: Each day, players learn if anyone was murdered the night before, and they see what dreams they had. All living players can talk openly at this time.

execution: Living players can accuse one another of being a murderer - this prompts a poll, and if a majority approve, the accused is put to death.

night: At night, players "go to sleep" and are not allowed to speak out loud.

murder: Killers can select any living player to be murdered - they must unanimously agree on a target.

dream: Dead players come back as ghosts, who cannot talk, but can send "dreams" - clues about the killers based on their clothing colors.

random: All other players must respond to a few random prompts before progressing - this ensures that player roles remain secret.


person: good, not magic; no special ability

illusionist: good, not magic; escapes from murder on first attempt

• healer: good, magic; immediately resurrects murdered players every night

augur: good, magic; learns allegiance of each executed player

clairvoyant: good, magic; learns if a player was magic (upon execution or murder)

medium: good, magic; sees name of ghost sending each dream received

• seer: good, magic; sees all ghost dreams every night

• immortal: good, magic; cannot be murdered at night

• insomniac: good, not magic; sees names of murder nomination targets, but cannot receive dreams

• psychic: good, magic; learns if allegiance of accused and accuser matches during each execution nomination

• empath: good, magic; one random vote is switched to match this player's during each poll

telepath: good, magic; can chat with the other telepath during the day

watchkeeper: good, not magic; prevents murder of others each night, but reveals identity

detective: good, not magic; learns allegiance of one random player every night

• killer: evil, not magic; can chat with other evil players at night

dreamsnatcher: evil, magic; sees all ghost dreams every night

• obscurer: evil, magic; when poll results are revealed, names will be hidden

cheater: evil, not magic; one random vote is switched to match this player's during each poll

spellcaster: evil, magic; unknown to player ghosts


• good: all evil players are dead

• evil: # evil players alive >= # good players alive

App Structure

|- package.json
|- index.js (handleRequest, parseRequest, routeRequest, _302, _403, _404)
|- /node-modules/
|   |- mongo
|- /data/db/
|   |- sessions
|   |- games
|- /main/
|   |- logic.js (logError, logStatus, logMessage, getEnvironment, getAsset, isReserved, isNumLet, isBot, renderHTML, generateRandom, chooseRandom, sortRandom, locateIP, sanitizeString, determineSession, retrieveData, storeData)
|   |- stylesheet.css
|   |- script.js (isNumLet, isEmail, sanitizeString, displayError, buildGhosts, animateGhosts, sendPost)
|   |
|   |- banner.png
|   |- logo.png
|   |- logo.svg
|   |- _404.html
|- / (home)
|   |- logic.js (createGame, createPlayer, joinGame)
|   |- index.html
|   |- stylesheet.css
|   |- script.js (createGame, joinGame)
|- /about/
|   |- index.html
|   |- stylesheet.css
|   |- script.js (submitFeedback)
|- /game/
    |- logic.js (fetchData, submitChat, submitNotes, submitEvent, createStaticEvent, createActionEvent, createQueueEvent, getRoleDescription, checkQueue, setupPlayer, launchGame, createDay, createNight, executePlayer, murderPlayer, setupDream, setupRandom)
    |- index.html
    |- stylesheet.css
    |- script.js (scrollToNewest, startTouch, moveTouch, slideContainer, submitNotes, submitChat, submitEvent, buildChat, buildEvent, disableEvent, enableEvent, localizeTimes, fetchData)