Files
psopeeps-newserv/system/config.example.json
T
2023-12-16 12:33:37 -08:00

784 lines
51 KiB
JSON

{
// 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",
},
// 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,
// 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, ""], // 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",
],
// 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],
},
// 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,
}