{
  // Configuration file for newserv.

  // This file is standard JSON with C-style comments. Some other extensions to
  // the JSON standard are also supported; notably, integers may be specified in
  // hexadecimal using the 0x prefix. If you use a text editor that auto-formats
  // JSON on save, it may be confused by this file's format. Make sure it
  // doesn't automatically turn hex integers into strings, for example.

  // If you're just setting up a newserv instance for your personal use, you
  // probably only need to change LocalAddress. Set LocalAddress to your
  // machine's local IPv4 address (usually something like 10.0.x.x or
  // 192.168.x.x). In PSO's network configuration, set the DNS server address to
  // the same address you entered in LocalAddress in this file.

  // If you also want people to be able to conenct to your newserv instance from
  // the Internet, you'll need to set ExternalAddress to your public-facing IPv4
  // address (you can find this by visiting e.g. whatismyip.com). You'll also
  // need to set up port forwarding on your router for all the TCP ports listed
  // in PortConfiguration (9000, 9001, etc.), as well as UDP port 53. Players
  // from outside your network can then connect to your server by entering your
  // public address as their DNS server address in PSO's network configuration.

  // Server's name (maximum 16 characters). This appears in the upper-right
  // corner of the screen while in lobbies.
  "ServerName": "newserv",

  // Address to connect local clients to (IP address or interface name). This
  // is the address that newserv will expect clients on the same network as the
  // server to connect to.
  "LocalAddress": "en0",
  // Address to connect external clients to (IP address or interface name). This
  // is the address that newserv will expect clients not on the same network as
  // the server to connect to. If you're running newserv behind a NAT (this
  // applies to most home networks), this should be your router's public-facing
  // IP address.
  "ExternalAddress": "10.0.1.5",

  // Port to listen for DNS queries on. To disable the DNS server, comment this
  // out or set it to zero.
  "DNSServerPort": 53,

  // Ports to listen for game connections on.
  "PortConfiguration": {
    // Format of entries in this dictionary:
    // name: [port, version, behavior]

    // Various versions of PSO hardcode these ports in the clients. Don't change
    // these unless you don't want to support certain versions of PSO.
    // Note: The pc_console_detect behavior is used for separating PSO PC and
    // DC/GC clients that connect on the same port. On these ports, newserv
    // sends a single command that PC and DC/GC clients parse in different ways,
    // leading them to connect to either the console-login port or the pc-login
    // port (both of which must be defined below if pc_console_detect is used).
    // If you want to support only PC, you can change the pc_console_detect
    // behavior for these ports to login_server. If you don't want to support
    // PC, you can do the same, but also change the version from pc to gc.
    // Note: It is not an error that no ports appear here with "dc" in their
    // definitions. DC clients use the same ports as GC clients, and newserv can
    // tell them apart at the time they connect.
    "gc-jp10":       [9000,  "gc",    "login_server"],
    "gc-jp11":       [9001,  "gc",    "login_server"],
    "gc-jp3te":      [9002,  "gc",    "login_server"],
    "gc-jp3":        [9003,  "gc",    "login_server"],
    "gc-us12t1":     [9064,  "gc",    "login_server"],
    "gc-us10":       [9100,  "pc",    "pc_console_detect"],
    "gc-us3":        [9103,  "gc",    "login_server"],
    "gc-eu10":       [9200,  "gc",    "login_server"],
    "gc-eu11":       [9201,  "gc",    "login_server"],
    "gc-eu3-50":     [9202,  "gc",    "login_server"],
    "gc-eu3-60a":    [9203,  "gc",    "login_server"],
    "gc-eu3-60b":    [9204,  "gc",    "login_server"],
    "pc":            [9300,  "pc",    "login_server"],
    "pc-patch":      [10000, "patch", "patch_server_pc"],
    "bb-patch":      [11000, "patch", "patch_server_bb"],
    "bb-init":       [12000, "bb",    "login_server"],

    // PSO Xbox tunnels its connections through the Xbox Live service (or, in
    // modern times, Insignia), and that service determines which port the
    // connection goes to on the server side. By default, newserv uses 9500 for
    // PSO Xbox connections, but this is not hardcoded in the client.
    "xb-login":      [9500,  "xb", "login_server"],

    // Schthack PSOBB uses these ports.
    // "bb-patch2":     [10500, "patch", "patch_server_bb"],
    // "bb-init2":      [13000, "bb",    "login_server"],

    // Ephinea PSOBB uses these ports. Note that 13000 is also used by Schthack
    // PSOBB, but not for the patch server; this means you unfortunately can't
    // support both Schthack and Ephinea PSOBB clients at the same time. This
    // may be fixed in the future using a similar technique as the
    // pc_console_detect behavior, but this isn't implemented yet.
    // "bb-patch3":     [13000, "patch", "patch_server_bb"],
    // "bb-init3":      [14000, "bb",    "login_server"],

    // newserv uses these ports, but there is no external reason that these
    // numbers were chosen. You can change the port numbers here without any
    // issues. Some of these names are required; specifically:
    // - If there are any ports using the pc_console_detect behavior, then the
    //   pc-login and console-login ports must be defined. newserv will fail on
    //   startup if either port is not defined.
    // - If you have any DC, GC, or XB clients connecting to the server, the
    //   console-lobby port must be defined. The version for this port should be
    //   "gc", even though DC and XB clients can connect to it (newserv will
    //   automatically detect the correct game version for each client).
    // - If you have any PC clients connecting to the server, the pc-lobby port
    //   must be defined.
    // - If you have any BB clients connecting to the server, the bb-lobby,
    //   bb-data1, and bb-data2 ports must be defined.
    // - The bb-data1 and bb-data2 ports must be sequential; that is, the
    //   bb-data2 port number must be equal to the bb-data1 port number + 1.
    // - The proxy ports do not need to be defined unless the proxy server is
    //   enabled for the respective version via the ProxyDestinations fields
    //   (below).
    "console-login": [5100,  "gc",    "login_server"],
    "pc-login":      [5101,  "pc",    "login_server"],
    "xb-login":      [5102,  "xb",    "login_server"],
    "xb-lobby":      [5105,  "xb",    "login_server"],
    "console-lobby": [5110,  "gc",    "lobby_server"],
    "pc-lobby":      [5111,  "pc",    "lobby_server"],
    "bb-lobby":      [5112,  "bb",    "lobby_server"],
    "dc-proxy":      [5120,  "dc",    "proxy_server"],
    "pc-proxy":      [5121,  "pc",    "proxy_server"],
    "gc-proxy":      [5122,  "gc",    "proxy_server"],
    "xb-proxy":      [5123,  "xb",    "proxy_server"],
    "bb-proxy":      [5124,  "bb",    "proxy_server"],
    "bb-data1":      [12004, "bb",    "login_server"],
    "bb-data2":      [12005, "bb",    "login_server"],
  },

  // Where to listen for IP and PPP stack clients. This exists to interface with
  // PSO GC clients running in a local Dolphin emulator. To enable local Dolphin
  // clients to connect, set IPStackListen to ["/tmp/dolphin-tap"] and configure
  // Dolphin to use the tapserver type of broadband adapter. You do not need to
  // install or run tapserver. See README.md for details on how to get PSO to
  // connect via this interface. You can also add numbers or "address:port"
  // strings to these lists to listen for tapserver connections on TCP ports.
  // On Windows, Unix sockets are not available, so you can only use TCP sockets
  // here. You can get Dolphin to connect locally by adding a port to this list
  // and configuring Dolphin to connect to the same port. For example, you could
  // set this to ["127.0.0.1:5059"], and configure Dolphin's tapserver BBA to
  // connect to 127.0.0.1:5059.
  "IPStackListen": [],
  "PPPStackListen": [],

  // Other servers to support proxying to. If this is empty for any game
  // version, the proxy server is disabled for that version. Entries in these
  // dictionaries should be of the form "name": "address:port"; the names are
  // used in the proxy server menu.
  // Note that PSO GameCube Episodes 1&2 Trial Edition uses the DC's
  // ProxyDestinations dictionary here. This is because other servers that
  // support that version treat it as PSO DC v2.
  "ProxyDestinations-DC": {},
  "ProxyDestinations-PC": {},
  "ProxyDestinations-GC": {},
  "ProxyDestinations-XB": {},
  // Proxy destination for patch server clients. If this is given, the internal
  // patch server (for PC and BB) is bypassed, and any client that connects to
  // the patch server is instead proxied to this destination.
  // "ProxyDestination-Patch": "",
  // Proxy destination for BB clients. If this is given, all BB clients that
  // connect to newserv will be proxied to this destination.
  // "ProxyDestination-BB": "",

  // There is a proxy option that allows users to save copies of various game
  // files on the server side. If you have external clients connecting to your
  // server, you can disable this option to prevent clients from generating
  // files on the server side which they will never be able to access.
  "ProxyAllowSaveFiles": true,

  // By default, the interactive shell runs if stdin is a terminal, and doesn't
  // run if it's not. This option, if present, overrides that behavior.
  // "RunInteractiveShell": false,

  // Specify which kinds of logging you want to be enabled. This allows you to
  // make the terminal more or less noisy when players are connected, so you can
  // see only the log messages you care about. The log levels are, in decreasing
  // order of verbosity, "DEBUG", "INFO", "WARNING", "ERROR", and "DISABLED".
  "LogLevels": {
    // AX messages are messages sent to the terminal with the $ax command.
    "AXMessages": "INFO",
    // Channel exceptions are messages about clients disconnecting unexpectedly,
    // or other unexpected network-level events.
    "ChannelExceptions": "INFO",
    // Client messages describe events that are specific to a single client's
    // connection or game state.
    "Clients": "INFO",
    // Command data messages show the raw data for all commands sent and
    // received, on both the game server and proxy server. If stderr is a
    // terminal, these messages are colored as well; green is for commands sent
    // by the client, yellow is for commands sent by newserv, and red is for
    // commands sent by the remote server (in proxy server sessions).
    "CommandData": "INFO",
    // Config messages describe server-wide events, and generally only occur
    // during the startup procedure.
    "Config": "INFO",
    // DNS server messages describe erroneous queries that the DNS server does
    // not respond to. Normal DNS queries do not generate any log messages.
    "DNSServer": "INFO",
    // Function compiler messages describe PowerPC function call assembly
    // events, which generally only occur during startup.
    "FunctionCompiler": "INFO",
    // IP stack simulator messages describe clients connecting and disconnecting
    // via the IP stack interface, and errors that occur at the simulated
    // network level within the simulator.
    "IPStackSimulator": "INFO",
    // Lobby messages describe creation and deletion of lobbies and games, as
    // well as item tracking events within games. On Episode 3, debug messages
    // during battles go to this stream as well; use "DEBUG" here to see them.
    "Lobbies": "INFO",
    // Patch file index messages describe finding and preloading the patch files
    // available for download to BB and PC clients.
    "PatchFileIndex": "INFO",
    // Player data messages describe the loading and saving of player and
    // account data files.
    "PlayerData": "INFO",
    // Proxy server messages describe clients connecting and disconnecting from
    // the proxy server, as well as events that occur in each session.
    "ProxyServer": "INFO",
    // Replay messages are generated when replaying a session log (usually
    // during functional testing).
    "Replay": "INFO",
    // Game server messages describe clients connecting and disconnecting from
    // the game server.
    "GameServer": "INFO",
    // Static game data messages describe the loading of any kind of game data.
    "StaticGameData": "INFO",
  },
  // Some large commands (especially during the BB login sequence) can clutter
  // up logs, so we hide these commands by default. If you're investigating or
  // submitting a bug report that occurs on BB clients, set this to false to get
  // a full session log before submitting your report.
  "HideDownloadCommands": true,

  // If this option is disabled, the server only allows users who have licenses
  // on the server to connect. If this is enabled, all users will be allowed to
  // connect even if they don't have licenses. When a user connects with an
  // unregistered license (serial number and access key combination, or username
  // and password combination on BB), a new license is created for them.
  // Licenses are addressed by serial numbers; on BB, the new license's serial
  // number is a hash of the username.
  "AllowUnregisteredUsers": true,

  // If this option is enabled, PC NTE users will be allowed to connect. This is
  // the only version of the game that does not have any way to identify the
  // player (no serial number, username, etc.), so PC NTE players receive random
  // Guild Card numbers every time they connect and cannot be banned by serial
  // number or username.
  "AllowPCNTE": true,

  // User to run the server as. If present, newserv will attempt to switch to
  // this user's permissions after loading its configuration and opening
  // listening sockets. The special value $SUDO_USER causes newserv to look up
  // the desired username in the $SUDO_USER environment variable instead.
  // "User": "$SUDO_USER",

  // Information menu contents. Each entry is a list containing [title,
  // short description, full contents]. In the short description and full
  // contents, you can use PSO escape codes with the $ character (for example,
  // $Cx for colors). You can show different information menus to V1/V2 clients
  // and V3 clients; to do so, copy InformationMenuContents to
  // InformationMenuContentsV1V2 and InformationMenuContentsV3 and edit them as
  // needed. (If either the V1V2 or V3 version of the information menu is not
  // defined, this default version is used instead.)
  "InformationMenuContents": [
    ["Lobby commands", "Show commands used\nin the lobby", "These commands can be used in the lobby.\n\n$C6%sli$C7: Show basic information about the lobby\n$C6%sarrow <color-id>$C7: Change your lobby arrow color\n$C6%sln [name]$C7: Change the lobby type (for you only)\n$C6%sexit$C7: Leave the current game or lobby\n$C6%spatch <name>$C7: Run a patch on your client\n\n$C8Episode 3 only:$C7\n$C6%ssong <song-id>$C7: Play a jukebox song"],
    ["Game commands", "Show commands used\nin games", "These commands can be used to customize games.\n\n$C8Before starting a game:$C7\n$C6%ssecid <section-id>$C7: Set your override section ID\n$C6%srand <seed>$C7: Set your override random seed\n\n$C8When in a game:$C7\n$C6%sli$C7: Show basic information about the game\n$C6%swhat$C7: Describe the nearest item on the ground\n$C6%smaxlevel <level>$C7: Set maximum level to join\n$C6%sminlevel <level>$C7: Set minimum level to join\n$C6%spassword [password]$C7: Lock or unlock the game"],
    ["Player commands", "Show commands used\nto edit player data", "These commands can be used to work with your player data.\n\n$C6%sbbchar <username> <password> <1-4>$C7: Convert your\n    character to BB format\n$C6%sedit <stat> <value>$C7: Modify your character data"],
    ["Ep3 commands", "Show commands used\nin Episode 3 games", "These commands can be used in Episode 3 games.\n\n$C8Before battle begins:$C7\n$C6%sinftime$C7: Disable all battle time limits, regardless\n    of limits set in battle rules\n$C6%sdefrange <min>-<max>$C7: Set the DEF dice range for\n    the next battle\n\n$C8During battle:$C7\n$C6%sspec$C7: Allow or forbid spectators\n$C6%sstat <what>$C7: Show a live statistic\n$C6%ssurrender$C7: Immediately lose the current battle\n\n$C8In game after battle:$C7\n$C6%ssaverec <name>$C7: Save recording of the last battle"],
    ["Cheat commands", "Show commands used\nfor cheating", "These commands can be used to cheat.\n\n$C8In a game:$C7\n$C6%scheat$C7: Enable or disable cheat mode\n\n$C8When cheat mode is enabled:$C7\n$C6%sinfhp$C7 / $C6%sinftp$C7: Enable or disable infinite HP or TP\n$C6%swarpme <area-id>$C7: Warp yourself to the given area\n$C6%swarpall <area-id>$C7: Warp everyone to the given area\n$C6%snext$C7: Warp yourself to the next area\n$C6%sswa$C7: Enable or disable switch assist\n$C6%si <name>$C7 / $C6%si <hex>$C7: Create an item\n\n$C8Episode 3 only:$C7\n$C6%sunset <index>$C7: Remove one of your set cards from\n    the field"],
    ["Admin commands", "Show commands used\nfor setting server\noptions", "These commands provide administration functions.\n\n$C6%sevent <event>$C7: Set the holiday in the current lobby\n$C6%sallevent <event>$C7: Set the holiday in all lobbies\n$C6%sann <message>$C7: Send an announcement message to\n    all players\n$C6%sax <message>$C7: Send a message to the server\n$C6%ssilence <who>$C7: Silence or unsilence a player\n$C6%skick <who>$C7: Disconnect a player\n$C6%sban <who>$C7: Ban a player"],
    ["Debug commands", "Show commands used\nfor debugging", "These commands are used for debugging.\n\n$C6%sdebug$C7: Enable or disable debug messages\n$C6%scall <id>$C7: Call a quest function\n$C6%sgc$C7: Send your own Guild Card to yourself\n$C6%spersist$C7: Cause game to not close when last player\n    leaves\n$C6%ssc <data>$C7: Send a command to yourself\n\n$C8Proxy only:$C7\n$C6%sss <data>$C7: Send a command to the remote server"],
    ["Using $i", "$C7Show how to use\nthe %si command", "The %si command is used to create items.\nUse it like this (for example):\n\n$C6%si Double Cannon +10 0/0/20/15/35$C7\n$C6%si Hell Pallasch$C7\n$C6%si Black Ring +5DEF$C7\n$C6%si Knight/Power++$C7\n$C6%si Sato 5/50/10.5/50 120% 200IQ$C7\n$C6%si Trimate x3$C7\n$C6%si 1000 Meseta$C7\n\nYou can also use a hex code instead of a name\n(this is the same as the Sato example above):\n\n$C6%si 023F7300F40188131A04881378C80000$C7"],
    ["Using $edit", "$C7Show how to use\nthe %sedit command", "%sedit is used in PSOBB to change character stats.\nUse one of the following subcommands:\n\n$C6%sedit ATP <value>$C7\n$C6%sedit MST <value>$C7\n$C6%sedit EVP <value>$C7\n$C6%sedit HP <value>$C7\n$C6%sedit DFP <value>$C7\n$C6%sedit ATA <value>$C7\n$C6%sedit LCK <value>$C7\n$C6%sedit MESETA <amount>$C7\n$C6%sedit EXP <amount>$C7\n$C6%sedit LEVEL <level>$C7\n$C6%sedit NAMECOLOR <color in hex, AARRGGBB format>$C7\n$C6%sedit SECID <section ID name>$C7\n$C6%sedit NAME <new character name>$C7\n$C6%sedit NPC <NPC name>$C7\n$C6%sedit TECH <technique name> <new technique level>$C7\n\nNPC names: none, ninja, rico, sonic, knuckles,\n    flowen, elly\n\nTechnique names: foie, gifoie, rafoie, barta,\n    gibarta, rabarta, zonde, gizonde, razonde,\n    grants, deband, jellen, zalure, shifta, ryuker,\n    resta, anti, reverser, megid, all"],
    ["Using $bbchar", "$C7Show how to use\nthe %sbbchar command", "%sbbchar is used to convert a character from an\nolder version of PSO to Blue Burst format and save\nit on this server. Use the command like this:\n\n$C6%sbbchar <username> <password> <slot>$C7\n\nIf the username and password are correct, the\ncharacter that you're currently playing as will be\nconverted to PSOBB format and saved under that\naccount, in the specified character slot (1-4)."],
    ["Text colors", "Show color values", "These values can be used to color text in\nsome situations with escape codes like %sC6.\nFor example, these can be used in the Info Board.\n\n$C0%sC0$C7 - Black     $C1%sC1$C7 - Blue     $C2%sC2$C7 - Green\n$C3%sC3$C7 - Cyan      $C4%sC4$C7 - Red     $C5%sC5$C7 - Purple\n$C6%sC6$C7 - Yellow    $C7%sC7$C7 - White   $C8%sC8$C7 - Pink\n$C9%sC9$C7 - Violet     $CG%sCG$C7 - Orange Pulse\n\n$Ca%sCa$C7 - Orange (Episode 3 only)"],
    ["Arrow colors", "$C7Show lobby arrow\ncolor list", "Use these names with %sarrow.\n\n0 - no marker\n1 - red\n2 - blue\n3 - green\n4 - yellow\n5 - purple\n6 - cyan\n7 - orange\n8 - pink\n9 - white\n10 - white\n11 - white\n12 - black"],
    ["Event names", "$C7Show lobby event\nnames", "Use these names with %sevent and %sallevent.\n\nnone - no event\nxmas - Christmas event\nval - Valentine's Day\neaster - Easter Sunday event\nhallo - Halloween event\nsonic - Sonic Adventure DX event\nnewyear - New Year's event\nbval - White Day\nwedding - Wedding Day event\nspring - spring event\ns-spring - spring event with striped background\nsummer - summer event\ns-summer - summer event with striped background\nfall - fall event"],
    ["GC lobby types", "$C7Show lobby type\nlist for Episodes\nI & II", "Use these names with %sln on Episodes 1 & 2.\n$C6*$C7 indicates lobbies where players can't move.\n\nnormal - standard lobby\ninormal - under standard lobby $C6*$C7\nipc - under PC lobby $C6*$C7\niball - under soccer lobby $C6*$C7\ncave1 - Cave 1 $C6*$C7\ncave2u - Cave 2 Ultimate $C6*$C7\ndragon - Dragon stage (floor is black)\nderolle - De Rol Le stage (water/walls are gone)\nvolopt - Vol Opt stage\ndarkfalz - Dark Falz stage"],
    ["Ep3 lobby types", "$C7Show lobby type\nlist for Episode III", "Use these names with %sln on Episode 3.\n\nnormal - Standard lobby\nplanet - Blank Ragol lobby\nclouds - Blank sky lobby\ncave - Unguis Lapis (platform missing)\njungle - Nebula Montana 1 (Ep2 Jungle)\nforest2-1 - Lupus Silva 2 (Ep1 Forest 2)\nforest2-2 - Lupus Silva 1 (Ep1 Forest 2)\nwindpower - Molae Venti\noverview - Nebula Montana 2\nseaside - Tener Sinus (Ep2 Seaside)\nfons - Mortis Fons\ndmorgue - Destroyed Morgue (column missing)\ncaelum - Tower of Caelum (top)\ncyber - Cyber\nboss1 - Castor/Pollux map\nboss2 - Amplum Umbra map\ndolor - Dolor Odor\nravum - Ravum Aedes Sacra\nsky - Via Tubus (tube missing)\nmorgue - Morgue (column missing)"],
    ["Area list", "$C7Show stage code\nlist", "Use these names with %swarpme and %swarpall.\n$C2Green$C7 areas will be empty unless you are in a quest.\n$C6Yellow$C7 areas will not allow you to move.\n\n    $C8Episode 1  / Episode 2        / Episode 4$C7\n0: Pioneer 2  / Pioneer 2        / Pioneer 2\n1: Forest 1   / Temple Alpha    / Crater East\n2: Forest 2   / Temple Beta     / Crater West\n3: Caves 1    / Spaceship Alpha / Crater South\n4: Caves 2    / Spaceship Beta  / Crater North\n5: Caves 3    / CCA              / Crater Interior\n6: Mines 1    / Jungle North     / Desert 1\n7: Mines 2    / Jungle South     / Desert 2\n8: Ruins 1     / Mountain         / Desert 3\n9: Ruins 2     / Seaside          / Saint Million\n10: Ruins 3   / Seabed Upper    / $C6Purgatory$C7\n11: Dragon    / Seabed Lower\n12: De Rol Le / Gal Gryphon\n13: Vol Opt   / Olga Flow\n14: Dark Falz / Barba Ray\n15: $C2Lobby$C7     / Gol Dragon\n16: $C6Battle 1$C7  / $C6Seaside Night$C7\n17: $C6Battle 2$C7  / $C2Tower$C7"],
  ],

  // Welcome message. If not blank, this message will be shown to PSO GC users
  // upon first connecting. (If this is blank, they will be taken directly to
  // the main menu instead.) The welcome message is never shown to PSO PC or PSO
  // BB users, though the patch server message (below) can be used for a similar
  // purpose.
  "WelcomeMessage": "",

  // Patch server message. If not blank, these messages will be shown to PSO PC
  // and PSO BB users (respectively) when they connect to the patch server. Note
  // that PSO PC displays the text in a Windows edit control instead of using
  // PSO's normal text renderer, so linebreaks must be \r\n and color escapes
  // (e.g. $C6) do not work in PCPatchServerMessage.
  "PCPatchServerMessage": "newserv patch server\r\n\r\nThis server is not affiliated with, sponsored by, or in any other way connected to SEGA or Sonic Team, and is owned and operated completely independently.",
  "BBPatchServerMessage": "$C7newserv patch server\n\nThis server is not affiliated with, sponsored by, or in any\nother way connected to SEGA or Sonic Team, and is owned\nand operated completely independently.",

  // Default lobby event. If set, this sets the holiday event in all lobbies at
  // server start time, as well as the pre-lobby holiday event. The event can be
  // changed in each lobby independently with the $event command, or in all
  // lobbies with the $allevent command. When a game is created, it inherits the
  // holiday event from the lobby from which it was created.
  // The value for this field can be a string like "xmas" (the names used here
  // are the same as for the $event command), or an integer.
  // "LobbyEvent": "xmas",
  // Episode 3 menu song. If set, Episode 3 clients will hear this song when
  // they are at the newserv main menu. If set, this value must be an integer.
  // "Episode3MenuSong": 0,

  // If this is enabled, all players will have infinite Meseta, effectively
  // making the jukebox and Pinz's Shop free. Otherwise, Meseta behaves as
  // defined below. Meseta rewards are tied to a player's license (and therefore
  // their serial number) and are stored server-side. Unlike other servers,
  // newserv forbids overdrafting Meseta; if this option is disabled and a
  // player spends Meseta they don't have, the player is disconnected.
  "Episode3InfiniteMeseta": false,
  // Meseta values for winning each tournament round. If a player defeats
  // another player in round 1, for example, they will earn 400 Meseta; if they
  // then defeat a COM in round 2, they will earn 200 more Meseta; if they
  // defeat another player in round 3, they will earn an additional 600.
  "Episode3DefeatPlayerMeseta": [400, 500, 600, 700, 800],
  "Episode3DefeatCOMMeseta": [100, 200, 300, 400, 500],
  // Winning the final round is worth this much extra Meseta.
  "Episode3FinalRoundMesetaBonus": 300,
  // If this option is enabled, the jukebox in Episode 3 lobbies does not deduct
  // any Meseta when a song is played. The check for 100 or more meseta happens
  // client-side, however, so even if this option is enabled, the client must
  // either have 100 or more Meseta or use the "Jukebox is free" Action Replay
  // code to be able to play songs.
  "Episode3JukeboxIsFree": false,

  // Episode 3 battle behavior flags. When set to zero, battles behave as they
  // did on the original Sega servers. Combinations of behaviors can be enabled
  // by bitwise-OR'ing together the following values:
  // 0x0001 => Disable deck verification entirely
  // 0x0002 => Disable owned card count check during deck verification (this
  //           enables the use of the non-saveable Have All Cards Action Replay
  //           code, but retains all the other validity checks)
  // 0x0004 => Allow cards with the D1 and D2 ranks to be used in battle
  // 0x0008 => Disable overall and per-phase battle time limits, regardless of
  //           the values chosen during battle rules setup
  // 0x0010 => Enable debug messages in Episode 3 games and battles
  // 0x0040 => Enable battle recording (after a battle, players can save the
  //           recording with the $saverec <filename> command)
  // 0x0080 => Disable command masking during battles
  // 0x0100 => Disable interference (COMs randomly coming to each other's
  //           rescue)
  // 0x0200 => Allow interference even when neither player is a COM
  "Episode3BehaviorFlags": 0x0002,

  // Trap assist cards for each trap type in Episode 3 battles. These are the
  // default values used offline, but you can change the trap types online here.
  // Only assist cards may be used as trap cards.
  "Episode3TrapCards": [
    ["Dice Fever", "Heavy Fog", "Muscular", "Immortality", "Snail Pace"], // Red
    ["Gold Rush", "Charity", "Requiem"], // Blue
    ["Powerless Rain", "Trash 1", "Empty Hand", "Skip Draw"], // Purple
    ["Brave Wind", "Homesick", "Fly"], // Green
    ["Dice+1", "Battle Royale", "Reverse Card", "Giant Garden", "Fix"], // Yellow
  ],

  // Episode 3 EX result values. This allows you to set the amount of EX players
  // will get for winning or losing online matches. Each set of numbers is a
  // list of thresholds; the first number in each pair is the level difference
  // threshold and the second is the amount of EX. The game scans each list for
  // the entry whose threshold value is less than or equal to the level
  // difference. For example, if player A's CLv is 70 and player B's CLv is 55,
  // and the lists are set up like this:
  //   "Win": [[30, 40], [20, 30], [10, 20], ...],
  //   "Lose": [[0, 0], [-10, -5], [-20, -10], ...],
  // ...then player A would get 20 EX for defeating player B (since the
  // difference between their CLvs is 15, so the first two Win entries don't
  // apply), and player B would lose 10 EX for losing to player A (again, since
  // the first two Lose entries don't apply). If none of the thresholds apply,
  // then the last entry's value is used regardless of its threshold. All lists
  // here must contain 10 [threshold, value] pairs.
  "Episode3EXResultValues": {
    "Default": {
      "Win": [[50, 100], [30, 80], [15, 70], [10, 55], [7, 45], [4, 35], [1, 25], [-1, 20], [-9, 15], [0, 10]],
      "Lose": [[1, 0], [-2, 0], [-3, 0], [-4, 0], [-5, 0], [-6, 0], [-7, 0], [-10, -10], [-30, -10], [0, -15]],
    },
    "Tournament": {
      "Win": [[60, 70], [40, 50], [25, 45], [20, 40], [13, 35], [8, 30], [5, 25], [2, 20], [-1, 15], [0, 10]],
      "Lose": [[1, 0], [-1, 0], [-3, 0], [-5, 0], [-7, 0], [-10, 0], [-12, 0], [-15, 0], [-18, 0], [0, 0]],
    },
    "TournamentFinalMatch": {
      "Win": [[40, 100], [25, 95], [20, 85], [15, 75], [10, 65], [8, 60], [5, 50], [2, 40], [-1, 30], [0, 20]],
      "Lose": [[1, -5], [-1, -10], [-3, -15], [-7, -20], [-15, -20], [-20, -25], [-30, -30], [-40, -30], [-50, -34], [0, -40]],
    },
  },

  // Episode 3 card auction configuration. CardAuctionPoints specifies how many
  // points each player gets when they join an auction (this may be anywhere
  // from 0 to 65535, but a somewhat-low number is generally good).
  // CardAuctionSize specifies how many cards will be present in each auction;
  // this can be an integer if auctions should always have the same number of
  // cards, or it can be a list of [min count, max count] and the server will
  // choose a random number of cards in that range for each auction.
  // CardAuctionPool is a dictionary specifying the relative frequencies and
  // costs of each card in the auction pool. Relative frequencies are 64-bit
  // integers, but should generally be less than 0x0100000000000000 to avoid
  // excessive bias. All relative frequencies must sum to a number less than
  // 0x10000000000000000 (the limit of an unsigned 64-bit integer). When players
  // enter an auction, the auctioned cards are drawn with replacement from the
  // distribution specified here.
  "CardAuctionPoints": 30,
  "CardAuctionSize": [6, 8],
  "CardAuctionPool": {
    // "CardName": [RelativeFrequency, MinPrice]
    "Beat +":          [500, 4],
    "Berserk +":       [800, 7],
    "Biboo":           [500, 6],
    "Chaos Bringer":   [900, 3],
    "Charity +":       [800, 4],
    "Counter +":       [800, 9],
    "Dark Flow":       [600, 11],
    "Dolmolm":         [500, 8],
    "Egg Rappy":       [800, 2],
    "Epsilon":         [300, 7],
    "Gather +":        [800, 8],
    "Gibbles +":       [700, 6],
    "Grants":          [200, 4],
    "Hallo Rappy +":   [800, 3],
    "Heart Of Poumn":  [600, 5],
    "Heaven Punisher": [500, 6],
    "Lavis Cannon":    [400, 7],
    "Piety":           [800, 5],
    "Rag Rappy +":     [800, 2],
    "Rich +":          [700, 2],
    "Snail Pace":      [900, 3],
    "Striker of Chao": [500, 5],
    "Thread +":        [800, 8],
  },

  // Episode 3 lobby banners. Currently only images are supported.
  // Image files are expected to be in BMP or PPM format, and should be placed
  // in the system/ep3/banners directory. Image sizes must be a multiple of 4
  // pixels in both dimensions, must be no larger than 0x37000 bytes when
  // encoded as a GVM file (newserv will do this encoding internally), and must
  // compress to no larger than 0x3800 bytes. newserv will fail on startup if
  // any of these constraints aren't satisfied.
  // Banners are specified as lists of [type, where, filename]. type should be
  // 1 for image files. where is a bitmask specifying where in the lobby the
  // banner should appear; the bits are:
  // 00000001: South above-counter banner (facing away from teleporters)
  // 00000002: West above-counter banner
  // 00000004: North above-counter banner (facing toward jukebox)
  // 00000008: East above-counter banner
  // 00000010: Banner above west (left) teleporter
  // 00000020: Banner above east (right) teleporter
  // 00000040: Banner at south end of lobby (opposite the jukebox)
  // 00000080: Immediately left of 00000040
  // 00000100: Immediately right of 00000040
  // 00000200: Same as 00000080, but further left and at a slight inward angle
  // 00000400: Same as 00000100, but further right and at a slight inward angle
  // 00000800: Banner at north end of lobby, above the jukebox
  // 00001000: Immediately right of 00000800
  // 00002000: Immediately left of 00000800
  // 00004000: Same as 00001000, but further right and at a slight inward angle
  // 00008000: Same as 00002000, but further left and at a slight inward angle
  // 00010000: Banners at west AND east ends of lobby, next to battle tables
  // 00020000: Immediately left of 00001000 (2 banners)
  // 00040000: Immediately right of 00001000 (2 banners)
  // 00080000: Banners on southwest AND southeast ends of the lobby
  // 00100000: Banners on south-southwest AND south-southeast ends of the lobby
  // 00200000: Floor banners in front of the counter (4 banners)
  // 00400000: Banners on both small walls in front of the battle tables
  // 00800000: On southern platform
  // 01000000: In front of jukebox
  // 02000000: In western battle table corner (next to 4-player tables)
  // 04000000: In eastern battle table corner (next to 2-player tables)
  // 08000000: In southeastern battle table corner (next to 2-player tables)
  // 10000000: In southwestern battle table corner (next to 4-player tables)
  // 20000000: Just north-northwest of the counter
  // 40000000: In front of the small wall in front of the 2-player battle tables
  // 80000000: Inside the lobby counter, facing southeast
  // For example, to make the image system/ep3/banners/test-image.bmp appear in
  // the lobby above both the left and right teleporters, you would set
  // Episode3LobbyBanners like so:
  // "Episode3LobbyBanners": [
  //   [1, 0x00000030, "test-image.bmp"],
  // ],
  "Episode3LobbyBanners": [],

  // Quest category configuration. See README.md for information on how quest
  // files should be named. This list specifies the quest category names and
  // descriptions. (We don't use a map here because the category order
  // specified here is the order that appears in the quest menu.)
  "QuestCategories": [
    // Each entry is [flags, directory_name, category_name, description].
    // These fields are:
    //   flags: a bit field containing the following:
    //       0x01 - appears in normal mode
    //       0x02 - appears in battle mode
    //       0x04 - appears in challenge mode
    //       0x08 - appears in solo mode (BB)
    //       0x10 - appears at government counter (BB)
    //       0x20 - appears in download quest menu
    //       0x40 - appears in Episode 3 download quest menu
    //   directory_name: the directory inside system/quests that contains quests
    //       for this category.
    //   category_name: what appears in the quest menu on the client.
    //   description: what appears in the category description window (may
    //       contain color escape codes like $C6).
    [0x01, "retrieval", "Retrieval", "$E$C6Quests that involve\nretrieving an object"],
    [0x01, "extermination", "Extermination", "$E$C6Quests that involve\ndestroying all\nmonsters"],
    [0x01, "events", "Events", "$E$C6Quests that are part\nof an event"],
    [0x01, "shops", "Shops", "$E$C6Quests that contain\nshops"],
    [0x01, "vr", "Virtual Reality", "$E$C6Quests that are\ndone in a simulator"],
    [0x01, "tower", "Control Tower", "$E$C6Quests that take\nplace at the Control\nTower"],
    [0x01, "team", "Team", "$E$C6Quests for you\nand your team\nmembers."],
    [0x02, "battle", "Battle", "$E$C6Battle mode rule\nsets"],
    [0x04, "challenge-ep1", "Challenge (Episode 1)", "$E$C6Challenge mode\nquests in Episode 1"],
    [0x04, "challenge-ep2", "Challenge (Episode 2)", "$E$C6Challenge mode\nquests in Episode 2"],
    [0x08, "solo-story", "Story", "$E$C6Quests that follow\nthe Episode 1 story"],
    [0x08, "solo-extra", "Solo", "$E$C6Quests that require\na single player"],
    [0x10, "government-ep1", "Hero in Red", "$E$CG-Red Ring Rico-\n$C6Quests that follow\nthe Episode 1\nstoryline"],
    [0x10, "government-ep2", "The Military's Hero", "$E$CG-Heathcliff Flowen-\n$C6Quests that follow\nthe Episode 2\nstoryline"],
    [0x10, "government-ep4", "The Meteor Impact Incident", "$E$C6Quests that follow\nthe Episode 4\nstoryline"],
    [0x20, "download", "Download", "$E$C6Quests to download\nto your Memory Card"],
    [0x40, "download-ep3-trial", "Trial Download", "$E$C6Quests to download\nto your Memory Card\nfrom Episode 3\nTrial Edition"],
    [0x40, "download-ep3", "Download", "$E$C6Quests to download\nto your Memory Card"],
  ],

  // Quest result item definitions for opcode F95E (used in Black Paper's
  // Dangerous Deal 1 and 2). This list is indexed as [reward_type][difficulty].
  // Reward types 0, 1, 2, and 4 are used by vanilla PSOBB; other reward types
  // can be specified when using the F95E quest opcode in custom quests. Rewards
  // are chosen uniformly at random from the list corresponding to the reward
  // location and difficulty level. All items in these lists must be hex item
  // codes (1-16 bytes); textual descriptions are not supported here.
  "QuestF95EResultItems": [
    [
      ["009000", "009001", "009002", "009003", "009004", "009005", "009006", "009007", "009008", "00B400", "01014E", "010307", "010341", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000"],
      ["00B900", "003400", "000901", "009002", "009007", "002C00", "002D00", "010235", "000106", "000105", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000"],
      ["00B600", "008A01", "001001", "001002", "001003", "001004", "001005", "001006", "002700", "000107", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000"],
      ["00B700", "001001", "001002", "001003", "001004", "001005", "001006", "002900", "008A00", "008A02", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000"],
    ], [
      ["01028B", "010228", "010134", "010303", "01030B", "031807", "005500", "010329", "01032F", "01032C", "010323", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000"],
      ["01028C", "010215", "01028A", "010140", "010344", "010346", "010345", "010347", "031807", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000"],
      ["00CB00", "003A00", "008C02", "01022B", "005000", "000B06", "000A06", "000A04", "005500", "002300", "003B00", "031807", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000"],
      ["005100", "010352", "010320", "01033E", "010229", "031807", "000B04", "000A06", "005600", "003B00", "002300", "000A05", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000"],
    ], [
      ["010132", "002F01", "00B300", "005E00", "000E02", "002E00", "009500", "009A00", "002F00", "01031B", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000"],
      ["00C000", "00D200", "008D00", "01012E", "008B00", "000907", "004E00", "006D00", "001500", "008B02", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000"],
      ["00AA00", "010141", "010151", "010223", "003F00", "004100", "000507", "000506", "000505", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000"],
      ["00AF00", "004300", "010351", "00CD00", "009900", "006C00", "004500", "006B00", "001200", "006500", "010229", "001300", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000", "040000"],
    ], [], [
      ["00BA00", "000D03", "004301", "000708", "004201", "00C900", "031000", "010295", "01028F", "010291"],
      ["00BB00", "000D03", "00B700", "004201", "000708", "00C900", "010136", "01028A", "010299", "010351", "01035B", "010352", "031000", "03180A"],
      ["00BA00", "00B400", "000D03", "00B600", "00B300", "000708", "004301", "00C900", "010136", "01028A", "010299", "010285", "010348", "010351", "01035B", "010352", "031000"],
      ["00BA00", "00B400", "000D03", "00B600", "00B300", "000708", "004301", "00C900", "010136", "01028A", "010299", "010285", "010348", "010351", "01035B", "010352"],
    ],
  ],
  // Results for quest opcode F95F (used in Gallon's Plan). This list is indexed
  // by type (which is the third argument to the opcode). The entries here are
  // [num_photon_tickets, item_hex].
  "QuestF95FResultItems": [
    [0, "000100"], // Unused
    [10, "00D500"],
    [15, "000A07"],
    [20, "010157"],
  ],
  // Result item definitions for Secret Lottery Ticket exchange (quest opcode
  // F95C, used in the Good Luck quest).
  "SecretLotteryResultItems": [
    "000106", "000107", "000206", "000407", "000606", "000807", "000D01",
    "001300", "002000", "002700", "002C00", "003400", "003900", "003C00",
    "003E00", "004100", "004400", "004500", "004C00", "006A00", "008F07",
    "009A00", "01011B", "01011C", "010129", "010129", "010130", "010131",
    "010132", "010133", "010221", "010224", "010229", "01022B", "010235",
    "031000",
  ],

  // Result items for Coren (quest opcodes F960/F961). Indexed by prize_tier.
  // When a prize is requested, the server chooses a random number and checks it
  // against the tier's probability. If the check passes, one of the items for
  // the current weekday is chosen uniformly at random and given to the player.
  // If the check fails, the next lower tier is checked in a similar manner,
  // but uses BaseProbability + ProbabilityUpgrade. If that check fails, the
  // next lower tier is checked, with 2x ProbabilityUpgrade, and so on. If no
  // tiers produce an item, one of the QuestF960FailureResultItems is given.
  "QuestF960SuccessResultItems": [
    {
      "MesetaCost": 1000,
      "BaseProbability": 0x0A3D70A3, // 4%
      "ProbabilityUpgrade": 0x0A3D70A3, // 4%
      "Sunday": ["God/Power", "Cure/Poison", "Cure/Paralysis", "Cure/Slow", "Cure/Confuse", "Cure/Freeze", "Cure/Shock", "Tablet"],
      "Monday": ["Three Seals", "God/Mind", "God/Arm", "Hero/Ability", "HP/Revival", "PB/Create", "Devil/Battle", "Cure/Slow"],
      "Tuesday": ["God/HP", "God/Body", "PB/Create", "Cure/Poison", "Cure/Paralysis", "Cure/Freeze"],
      "Wednesday": ["God/Legs", "Hero/Ability", "TP/Revival", "Devil/Battle", "Cure/Slow", "Tablet"],
      "Thursday": ["God/TP", "Hero/Ability", "HP/Revival", "God/Technique", "Cure/Shock"],
      "Friday": ["God/Luck", "TP/Revival", "PB/Create", "Devil/Battle", "Cure/Paralysis", "Cure/Slow", "Cure/Shock", "Tablet"],
      "Saturday": ["Three Seals", "Hero/Ability", "God/Ability", "HP/Revival", "PB/Create", "Cure/Poison", "Cure/Paralysis", "Cure/Freeze"],
    }, {
      "MesetaCost": 10000,
      "BaseProbability": 0x0A3D70A3, // 4%
      "ProbabilityUpgrade": 0x0A3D70A3, // 4%
      "Sunday": ["Kaladbolg", "Durandal", "Blade Dance", "M&A60 Vise", "H&S25 Justice", "L&K14 Combat", "Club of Laconium", "Photon Claw", "Silence Claw", "Stag Cutlery", "Holy Ray", "Ancient Saber", "Elysion", "Twin Psychogun", "Guilty Light", "Red Scorpio", "DB's Saber", "DF Field", "Morning Prayer", "S-Parts ver1.16", "Standstill Shield", "Kasami Bracer", "Secure Feet", "AddSlot", "Photon Crystal", "Dragon Scale", "Rappy's Beak"],
      "Monday": ["Kaladbolg", "Flowen's Sword", "Last Survivor", "Dragon Slayer", "Rianov 303SNR", "H&S25 Justice", "L&K14 Combat", "Crush Bullet", "Meteor Smash", "Final Impact", "Club of Zumiuran", "Brave Hammer", "Alive Aqhu", "Ice Staff:Dagon", "Double Saber", "Elysion", "Red Saber", "Meteor Cudgel", "Red Sword", "Panzer Faust", "Plantain Leaf", "Fatsia", "Sange", "Kamui", "Talis", "DB's Saber", "Guardianna", "Regenerate Gear", "DB's Shield", "AddSlot", "Photon Crystal", "Dragon Scale", "Rappy's Beak"],
      "Tuesday": ["Blade Dance", "Bloody Art", "Cross Scar", "Brionac", "Diska of Braveman", "M&A60 Vise", "Club of Laconium", "Mace of Adaman", "Twin Brand", "Brave Knuckle", "Angry Fist", "God Hand", "Red Dagger", "Maser Beam", "Asuka", "Talis", "DB's Saber", "Red Coat", "Secret Gear", "Regenerate Gear", "Black Ring", "AddSlot", "Photon Crystal", "Dragon Scale", "Rappy's Beak"],
      "Wednesday": ["Bloody Art", "Brionac", "Vjaya", "Rianov 303SNR", "Battle Verge", "Brave Hammer", "Alive Aqhu", "Soul Banish", "Red Partisan", "Yasminkov 2000H", "Yasminkov 7000V", "Maser Beam", "Musashi", "Yamato", "Zanba", "Ruby Bullet", "Sacred Guard", "S-Parts ver1.16", "S-Parts ver2.01", "Light Relief", "Attribute Wall", "AddSlot", "Photon Crystal", "Dragon Scale", "Rappy's Beak"],
      "Thursday": ["Gae Bolg", "Slicer of Assassin", "Diska of Liberator", "Diska of Braveman", "Varista", "M&A60 Vise", "Mace of Adaman", "Battle Verge", "Fire Scepter:Agni", "Ice Staff:Dagon", "Storm Wand:Indra", "Twin Brand", "Spread Needle", "Holy Ray", "Inferno Bazooka", "Victor Axe", "Flight Cutter", "Red Slicer", "Branch of Pakupaku", "Heart of Poumn", "Photon Launcher", "Guilty Light", "Talis", "Demolition Comet", "Ruby Bullet", "Guard Wave", "DF Field", "Luminous Field", "Morning Prayer", "Red Coat", "Infantry Mantle", "Regenerate Gear", "AddSlot", "Photon Crystal", "Dragon Scale", "Rappy's Beak"],
      "Friday": ["Varista", "Custom Ray ver.OO", "Bravace", "Visk-235W", "Rianov 303SNR", "M&A60 Vise", "H&S25 Justice", "Crush Bullet", "Club of Laconium", "Fire Scepter:Agni", "Victor Axe", "Caduceus", "Sting Tip", "Ancient Saber", "Red Saber", "Red Handgun", "Twin Psychogun", "Fatsia", "The Sigh of a God", "Guilty Light", "Talis", "Mahu", "Graviton Plate", "Attribute Plate", "Aura Field", "Electro Frame", "Sacred Cloth", "Smoking Plate", "Red Coat", "AddSlot", "Photon Crystal", "Dragon Scale", "Rappy's Beak"],
      "Saturday": ["Kaladbolg", "Varista", "Visk-235W", "Wals-MK2", "Justy-23ST", "Rianov 303SNR", "Club of Zumiuran", "Storm Wand:Indra", "Double Saber", "Caduceus", "Sting Tip", "Suppressed Gun", "Ancient Saber", "Twin Psychogun", "Red Mechgun", "Windmill", "Plantain Leaf", "Fatsia", "Revival Garment", "Spirit Garment", "Stink Frame", "D-Parts ver1.01", "D-Parts ver2.10", "Sense Plate", "Graviton Plate", "Custom Frame ver.OO", "AddSlot", "Photon Crystal", "Dragon Scale", "Rappy's Beak"],
    }, {
      "MesetaCost": 100000,
      "BaseProbability": 0x0A3D70A3, // 4%
      "ProbabilityUpgrade": 0x0A3D70A3, // 4%
      "Sunday": ["Zero Divide", "Asteron Belt", "Raikiri", "Skyly Card", "Purplenum Card", "Oran Card", "Guren", "Black Odoshi Red Nimaidou", "V101"],
      "Monday": ["Earth Wand Brownie", "Viridia Card", "Greenill Card", "Yellowboze Card", "Yunchang", "Black Odoshi Domaru", "Revival Cuirass", "Gratia", "Regenerate Gear B.P.", "Honeycomb Reflector", "V501", "Heavenly/Battle"],
      "Tuesday": ["Zero Divide", "Asteron Belt", "Phoenix Claw", "Skyly Card", "Pinkal Card", "Whitill Card", "Morning Glory", "Ignition Cloak", "Bunny Ears", "Cat Ears", "V502", "Smartlink"],
      "Wednesday": ["Phoenix Claw", "Bluefull Card", "Purplenum Card", "Pinkal Card", "Morning Glory", "Cannon Rouge", "Clio", "Morning Prayer", "Sacred Guard", "Honeycomb Reflector", "Heavenly/Legs"],
      "Thursday": ["Asteron Belt", "Earth Wand Brownie", "Phoenix Claw", "Raikiri", "Greenill Card", "Redria Card", "Whitill Card", "Flamberge", "Cannon Rouge", "Glide Divine", "Star Cuirass", "Stink Shield"],
      "Friday": ["Zero Divide", "Phoenix Claw", "Raikiri", "Power Maser", "Viridia Card", "Yellowboze Card", "Ophelie Seize", "Black Odoshi Domaru", "Black Odoshi Red Nimaidou"],
      "Saturday": ["Earth Wand Brownie", "Bluefull Card", "Redria Card", "Oran Card", "Kusanagi", "Honeycomb Reflector"],
    },
  ],
  "QuestF960FailureResultItems": { // Items given when all tiers failed to give a prize
    "Sunday": ["Monomate x1", "Dimate x1", "Trimate x1", "Monofluid x1", "Difluid x1", "Trifluid x1", "Sol Atomizer x1", "Moon Atomizer x1", "Antidote x1", "Antiparalysis x1", "Telepipe x1", "Trap Vision x1"],
    "Monday": ["Monomate x1", "Dimate x1", "Trimate x1", "Monofluid x1", "Difluid x1", "Trifluid x1", "Sol Atomizer x1", "Moon Atomizer x1", "Antidote x1", "Antiparalysis x1", "Telepipe x1", "Trap Vision x1"],
    "Tuesday": ["Monomate x1", "Dimate x1", "Trimate x1", "Monofluid x1", "Difluid x1", "Trifluid x1", "Sol Atomizer x1", "Moon Atomizer x1", "Antidote x1", "Antiparalysis x1", "Telepipe x1", "Trap Vision x1"],
    "Wednesday": ["Monomate x1", "Dimate x1", "Trimate x1", "Monofluid x1", "Difluid x1", "Trifluid x1", "Sol Atomizer x1", "Moon Atomizer x1", "Antidote x1", "Antiparalysis x1", "Telepipe x1", "Trap Vision x1"],
    "Thursday": ["Monomate x1", "Dimate x1", "Trimate x1", "Monofluid x1", "Difluid x1", "Trifluid x1", "Sol Atomizer x1", "Moon Atomizer x1", "Antidote x1", "Antiparalysis x1", "Telepipe x1", "Trap Vision x1"],
    "Friday": ["Monomate x1", "Dimate x1", "Trimate x1", "Monofluid x1", "Difluid x1", "Trifluid x1", "Sol Atomizer x1", "Moon Atomizer x1", "Antidote x1", "Antiparalysis x1", "Telepipe x1", "Trap Vision x1"],
    "Saturday": ["Monomate x1", "Dimate x1", "Trimate x1", "Monofluid x1", "Difluid x1", "Trifluid x1", "Sol Atomizer x1", "Moon Atomizer x1", "Antidote x1", "Antiparalysis x1", "Telepipe x1", "Trap Vision x1"],
  },
  // EXP multiplier for BB games. This must be an integer due to a client
  // limitation, and must be at least 1.
  "BBGlobalEXPMultiplier": 1,

  // BB team reward definitions. Team rewards have the following fields:
  //   Key: Internal name of the reward. Must be unique across all rewards.
  //   Name: Reward name shown to the player.
  //   Description: Reward description shown to the player.
  //   Points: Cost in team points.
  //   PrerequisiteKeys: List of reward keys required to be purchased before
  //     this reward can be purchased.
  //   RewardFlag: Flag in the client's team rewards field. Not used for most
  //     rewards; only rewards that change client behavior need this.
  //   RewardItem: Item to be given to the team master when this reward is
  //     purchased. If the master's bank is full, item rewards do not appear in
  //     the purchase list.
  //   IsUnique: If false, the reward can be purchased multiple times (this only
  //     really makes sense for item rewards). If true or omitted, the reward
  //     can only be purchased once.
  "TeamRewards": [
    {
      "Key": "TeamFlag",
      "Name": "Team flag",
      "Description": "Show a custom banner\nabove your team's\nplayers in the lobby",
      "Points": 2500,
      "RewardFlag": 0x00000001,
    }, {
      "Key": "DressingRoom",
      "Name": "Dressing room",
      "Description": "Unlock the ability to\nchange your character's\nappearance",
      "Points": 3000,
      "RewardFlag": 0x00000002,
    }, {
      "Key": "Members20Leaders3",
      "Name": "20 team members",
      "Description": "Increase your team's\nsize limit to 30 members\nand 3 leaders",
      "Points": 1500,
      "RewardFlag": 0x00000004,
    }, {
      "Key": "Members40Leaders5",
      "Name": "40 team members",
      "Description": "Increase your team's\nsize limit to 40 members\nand 5 leaders",
      "Points": 4000,
      "PrerequisiteKeys": ["Members20Leaders3"],
      "RewardFlag": 0x00000008,
    }, {
      "Key": "Members70Leaders8",
      "Name": "70 team members",
      "Description": "Increase your team's\nsize limit to 70 members\nand 8 leaders",
      "Points": 9000,
      "PrerequisiteKeys": ["Members40Leaders5"],
      "RewardFlag": 0x00000010,
    }, {
      "Key": "Members100Leaders10",
      "Name": "100 team members",
      "Description": "Increase your team's\nsize limit to 100 members\nand 10 leaders",
      "Points": 18000,
      "PrerequisiteKeys": ["Members70Leaders8"],
      "RewardFlag": 0x00000020,
    }, {
      "Key": "PointOfDisasterQuest",
      "Name": "Quest: Point of Disaster",
      "Description": "Unlock the quest\nPoint of Disaster\nfor your team",
      "Points": 1000,
    }, {
      "Key": "TheRobotsReckoningQuest",
      "Name": "Quest: The Robots' Reckoning",
      "Description": "Unlock the quest\nThe Robots' Reckoning\nfor your team",
      "Points": 1000,
    }, {
      "Key": "CommanderBlade",
      "Name": "Commander Blade",
      "Description": "Create a Commander\nBlade weapon",
      "IsUnique": false,
      "Points": 8000,
      "RewardItem": "00B200",
    }, {
      "Key": "UnionGuard",
      "Name": "Union Guard",
      "Description": "Create a Union Guard\nshield",
      "IsUnique": false,
      "Points": 100,
      // TODO: There are 4 of these in names-v4.json; which should we use?
      "RewardItem": "010295",
    }, {
      "Key": "Ticket500",
      "Name": "Team Points Ticket 500",
      "Description": "Create a 500-point ticket",
      "IsUnique": false,
      "Points": 500,
      "RewardItem": "031900",
    }, {
      "Key": "Ticket1000",
      "Name": "Team Points Ticket 1000",
      "Description": "Create a 1000-point ticket",
      "IsUnique": false,
      "Points": 1000,
      "RewardItem": "031901",
    }, {
      "Key": "Ticket5000",
      "Name": "Team Points Ticket 5000",
      "Description": "Create a 5000-point ticket",
      "IsUnique": false,
      "Points": 5000,
      "RewardItem": "031902",
    }, {
      "Key": "Ticket10000",
      "Name": "Team Points Ticket 10000",
      "Description": "Create a 10000-point ticket",
      "IsUnique": false,
      "Points": 10000,
      "RewardItem": "031903",
    },
  ],

  // Persistent game timeout. This is the amount of time a game set to be
  // persistent (with the $persist command) will continue to exist with no
  // players in it before being deleted. The value is in microseconds; the
  // default value is 30 minutes. If this is set to zero or not specified,
  // persistent games never expire; such a game can then only deleted by joining
  // it, running $persist again, and leaving.
  "PersistentGameIdleTimeout": 1800000000,

  // Cheat mode behavior. There are three values:
  //   "Off": Cheat mode is disabled on the entire server. Cheat mode cannot be
  //       enabled in games, and the $cheat command does nothing. This also
  //       disables cheat options on the proxy server.
  //   "OffByDefault": Cheat mode is disabled on the entire server, but can be
  //       enabled in each game with the $cheat command. Cheat options are
  //       available on the proxy server.
  //   "OnByDefault": Cheat mode is enabled on the entire server, but can be
  //       disabled in each game with the $cheat command. Cheat options are
  //       available on the proxy server.
  "CheatModeBehavior": "OnByDefault",

  // Whether to enable patches on Episode 3 USA. This functionality depends on
  // exploiting a bug in Episode 3, and while it seems to work reliably on
  // Dolphin, it hasn't been tested on a real GameCube. So, newserv doesn't
  // enable Episode 3 USA patches by default; it only does if this option is on.
  // "EnableEpisode3SendFunctionCall": true,

  // Whether to allow cross-play for various game versions. DCv1 and DCv2 are
  // always allowed to join each other's games (though DCv2 can deny permission
  // for DCv1 players to join when creating a game); if AllowDCPCGames is
  // enabled, then PC players are allowed in DC games and vice versa. Similarly,
  // if AllowGCXBGames is enabled, then GameCube and Xbox players are allowed to
  // join each other's games. Note that this behavior is experimental; you are
  // likely to encounter bugs in cross-play games, especially in the DC/PC case.
  "AllowDCPCGames": false,
  "AllowGCXBGames": true,

  // These options control which item drop modes are used by default, and which
  // can be chosen by the player. The AllowedDropModes fields are a bitmask
  // specifying which modes players can choose with the $dropmode command. The
  // modes are (name = mask):
  //   DISABLED         = 0x01
  //   CLIENT           = 0x02
  //   SERVER_SHARED    = 0x04
  //   SERVER_PRIVATE   = 0x08
  //   SERVER_DUPLICATE = 0x10
  // See README.md for more information on drop modes and item tables.
  "AllowedDropModesV1V2Normal": 0x1F, // All modes
  "AllowedDropModesV1V2Battle": 0x07, // SERVER_PRIVATE and SERVER_DUPLICATE not allowed
  "AllowedDropModesV1V2Challenge": 0x07, // SERVER_PRIVATE and SERVER_DUPLICATE not allowed
  "AllowedDropModesV3Normal": 0x1F, // All modes allowed
  "AllowedDropModesV3Battle": 0x07, // SERVER_PRIVATE and SERVER_DUPLICATE not allowed
  "AllowedDropModesV3Challenge": 0x07, // SERVER_PRIVATE and SERVER_DUPLICATE not allowed
  "AllowedDropModesV4Normal": 0x1D, // CLIENT not allowed
  "AllowedDropModesV4Challenge": 0x05, // CLIENT, SERVER_PRIVATE, and SERVER_DUPLICATE not allowed
  "AllowedDropModesV4Battle": 0x05, // CLIENT, SERVER_PRIVATE, and SERVER_DUPLICATE not allowed
  "DefaultDropModeV1V2Normal": "CLIENT",
  "DefaultDropModeV1V2Battle": "CLIENT",
  "DefaultDropModeV1V2Challenge": "CLIENT",
  "DefaultDropModeV3Normal": "CLIENT",
  "DefaultDropModeV3Battle": "CLIENT",
  "DefaultDropModeV3Challenge": "CLIENT",
  "DefaultDropModeV4Normal": "SERVER_SHARED",
  "DefaultDropModeV4Battle": "SERVER_SHARED",
  "DefaultDropModeV4Challenge": "SERVER_SHARED",

  // Rare enemy rates for BB games. The default rates specified here match the
  // original rates on the official servers. There is a hard limit of 16 rare
  // enemies per room or quest, which you may run into if you increase these
  // rates significantly.
  // If no rates are specified for a difficulty, the previous difficulty's rates
  // will be used. (In the default configuration, only Normal is specified, so
  // all difficulties use the same rates.) If the Challenge set is not
  // specified, the default rates are used for Challenge mode, which is 1/500
  // for all enemies.
  "RareEnemyRates-Normal": {
    // These are probabilities out of 0xFFFFFFFF - so 0 means that rare enemy
    // will never appear, and 0xFFFFFFFF means it will always appear (until 16
    // rare enemies have been assigned).
    "Hildeblue": 0x0083126E,
    "Rappy": 0x0083126E,
    "NarLily": 0x0083126E,
    "PouillySlime": 0x0083126E,
    "MerissaAA": 0x0083126E,
    "Pazuzu": 0x0083126E,
    "DorphonEclair": 0x0083126E,
    "Kondrieu": 0x1999999A,
  },
  // "RareEnemyRates-Hard": {...},
  // "RareEnemyRates-VeryHard": {...},
  // "RareEnemyRates-Ultimate": {...},
  // "RareEnemyRates-Challenge": {...},

  // You can override the minimum character levels required to make BB games in
  // each episode and difficulty level here.
  "BBMinimumLevels": {
    "Episode1": [1, 20, 50, 90],
    "Episode2": [1, 30, 60, 100],
    "Episode4": [1, 40, 70, 110],
  },
  // Some quest flags should not be written to the character file when they're
  // updated during a quest. Specify the flag IDs here to prevent those flags
  // from being updated in saved BB character data. The default value here
  // prevents the door locks in CCA from being deactivated in free-roam by
  // loading a quest.
  "PreventPersistQuestFlags": [0x0046, 0x0047, 0x0048],

  // Whether to enable certain exception handling. Disabling this causes
  // newserv to abort when any client causes an exception, which is generally
  // only useful for debugging newserv itself. This setting should usually be
  // left on (which is the default behavior).
  "CatchHandlerExceptions": true,
}
