Files
psopeeps-newserv/system/config.example.json
T
2025-06-12 18:49:38 -07:00

1284 lines
81 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 connect 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",
// 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.
// This option has no effect on Windows.
// "User": "$SUDO_USER",
// Number of threads to use for CPU-intensive work. This value must be at
// least 1, and should generally not be more than the number of CPUs in the
// system.
"WorkerThreads": 1,
// 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. By default, the DNS server listens on all
// interfaces, but you can specify an interface by replacing this with a list
// of [interface_addr_or_name, port].
"DNSServerPort": 53,
// Ports to listen for game connections on.
"PortConfiguration": {
// Format of entries in this dictionary:
// name: [port, version, behavior]
// port is normally just an integer (which will cause the server to listen
// on that port on all interfaces), but you can also replace the integer
// with a 2-list of [address, port] to listen in a specific port. For
// example, that might look like:
// "xb": [["en0", 9500], "xb", "login_server"],
// 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 game_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", "game_server"],
"gc-jp11": [9001, "gc", "game_server"],
"gc-jp3te": [9002, "gc", "game_server"],
"gc-jp3": [9003, "gc", "game_server"],
"gc-us12t1": [9064, "gc", "game_server"],
"gc-us10": [9100, "pc", "pc_console_detect"],
"gc-us3": [9103, "gc", "game_server"],
"gc-eu10": [9200, "gc", "game_server"],
"gc-eu11": [9201, "gc", "game_server"],
"gc-eu3-50": [9202, "gc", "game_server"],
"gc-eu3-60a": [9203, "gc", "game_server"],
"gc-eu3-60b": [9204, "gc", "game_server"],
"pc": [9300, "pc", "game_server"],
"xb": [9500, "xb", "game_server"],
"pc-patch": [10000, "patch", "patch_server_pc"],
"bb-patch": [11000, "patch", "patch_server_bb"],
"bb-jp-patch": [11100, "patch", "patch_server_bb"],
"bb-jp": [11101, "bb", "game_server"],
"bb-patch-hg": [11200, "patch", "patch_server_bb"],
"bb-data1": [12000, "bb", "game_server"],
"bb-data2": [12001, "bb", "game_server"],
},
// Where to listen for IP and PPP stack clients. This exists to interface
// with PSO GC clients running in a local Dolphin emulator. See README.md for
// details on how to get PSO to connect via this interface. You can also add
// "address:port" strings to these lists to listen for tapserver connections
// // on specific interfaces only.
// 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"] (which listens on port 5059 but only accepts
// connections from the local machine), and configure Dolphin's tapserver BBA
// to connect to 127.0.0.1:5059.
"IPStackListen": [5059],
"PPPStackListen": [5058],
// Where to listen for PPP clients. This exists to interface with PSO GC
// clients running on a Wii with Devolution, which emulates the modem adapter.
// The PPP stream can be forwarded directly to newserv on any port specified
// here without using pppd or another PPP server. When you start newserv, it
// will tell you the Devolution phone number you can use to connect.
"PPPRawListen": [5057],
// Where to listen for HTTP connections. The HTTP server is intended as a
// private interface to interact with newserv from e.g. an in-house Web portal
// or Discord bot. It would be unwise to expose any of these ports to the
// public Internet (hence why the default here is blank). The format of
// entries in this list is the same as for IPStackListen and PPPStackListen.
"HTTPListen": [],
// Banned IP address ranges. If a client whose remote IPv4 address is in any
// of these ranges connects to the server, they are immediately disconnected
// with no message. Entries in this list may be individiual IP addresses
// (e.g. "1.2.3.4") or CIDR ranges (e.g. "1.2.3.0/24"). This field takes
// effect immediately when `reload config` is run in the shell; any existing
// clients who are now banned are disconnected.
// Note that this setting does not apply to the HTTP server; it is not
// possible to ban IP ranges from the HTTP server. (It is also inadvisable
// to expose the HTTP server to the public Internet.)
"BannedIPV4Ranges": [],
// 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": {
"Schtserv": "psobb.dyndns.org:9200",
"Sylverant": "sylverant.net:9200",
"EU/Ragol": "ragol.org:9200",
},
"ProxyDestinations-PC": {
"Schtserv": "psobb.dyndns.org:9100",
"Sylverant": "sylverant.net:9100",
"EU/Ragol": "ragol.org:9100",
},
"ProxyDestinations-GC": {
"Schtserv": "psobb.dyndns.org:9103",
"Sylverant": "sylverant.net:9103",
"EU/Ragol": "ragol.org:9103",
},
"ProxyDestinations-XB": {
"Schtserv": "psobb.dyndns.org:9500",
"Sylverant": "sylverant.net:9500",
"EU/Ragol": "ragol.org:9500",
},
// 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": "",
// The server automatically pings clients if they haven't sent anything for a
// while to make sure they're still alive. This option specifies how long a
// client must be idle for the server to send a ping.
"ClientPingInterval": 30000000, // 30 seconds
// If a client doesn't send anything for this long, they will be disconnected.
// This should always be longer than ClientPingInterval, since an alive client
// should have a chance to respond to the server's ping.
"ClientIdleTimeout": 60000000, // 1 minute
// 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": {
// 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 accounts
// on the server to connect. If this is enabled, all users will be allowed to
// connect even if they don't have accounts. When a user connects with an
// unregistered license (serial number and access key combination, or username
// and password combination on BB), a new account is created for them.
// Accounts are addressed by serial numbers; on BB, the new account's serial
// number is a hash of the username.
"AllowUnregisteredUsers": true,
// If this option is enabled and AllowUnregisteredUsers is enabled, the server
// will use temporary accounts for the prototype versions (DC NTE, DC 11/2000,
// GC NTE, and Ep3 NTE) instead of permanent accounts. In this case, you can
// still manually create permanent accounts for NTE players.
"UseTemporaryAccountsForPrototypes": true,
// If this option is enabled, PC NTE players 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,
// Whether to enable chat commands for all players. If this is true, all
// players will be able to use chat commands as normal; if this is false, only
// players with the ALWAYS_ENABLE_CHAT_COMMANDS account flag will be able to
// use chat commands.
"EnableChatCommands": true,
// Number of backup character slots for each account, accessible with the
// $savechar, $loadchar, and $checkchar commands. This can be any value, but
// it's recommended to use a small number such as 16.
"BackupCharacterSlots": 16,
// 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-Milion\n10: Ruins 3 / Seabed Upper / $C6Test map$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.",
// Lobby search orders. When a player joins the lobby from the main menu, they
// are placed into the first lobby in the list that has empty spaces. In these
// lists, CARD lobbies C1-C5 are referenced as lobbies 16-20.
// The number of lobbies is hardcoded in the client and cannot be changed, so
// the server enforces these limits as well. Thus, the server will not add
// DCv1 players to lobbies above 10, for example, even if they are specified
// in these lists. Removing lobbies from these lists also does not prevent
// players from joining those lobbies via the lobby teleporter.
"LobbySearchOrders": [
[], // PC patch server (unused)
[], // BB patch server (unused)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], // DC NTE
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], // DC 11/2000 prototype
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], // DC V1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], // DC V2
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], // PC NTE
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], // PC
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], // GC NTE
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], // GC
[16, 17, 18, 19, 20, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], // GC Ep3 NTE
[16, 17, 18, 19, 20, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], // GC Ep3
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], // Xbox
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], // BB
],
"ClientCustomizationLobbySearchOrder": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
// Lobby holiday events. 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 values in this list can be strings like "xmas" (the names used here are
// the same as for the $event command), or an integer.
// There are always 20 lobbies; if a player can't be added to any public
// lobby, they are added to a dynamically-created private overflow lobby
// instead, which uses the event specified in MenuEvent below.
// The events are: "none", "xmas", "val", "easter", "hallo", "sonic",
// "newyear", "summer", "white", "wedding", "fall", "s-spring", "s-summer",
// and "spring".
"LobbyEvents": [
"none", // Lobby 1
"none", // Lobby 2
"none", // Lobby 3
"none", // Lobby 4
"none", // Lobby 5
"none", // Lobby 6
"none", // Lobby 7
"none", // Lobby 8
"none", // Lobby 9
"none", // Lobby 10 (or Lobby 0 on early versions)
"none", // Lobby 11 (DCv2 and later only)
"none", // Lobby 12 (DCv2 and later only)
"none", // Lobby 13 (DCv2 and later only)
"none", // Lobby 14 (DCv2 and later only)
"none", // Lobby 15 (DCv2 and later only)
"none", // Lobby C1 (Episode 3 only)
"none", // Lobby C2 (Episode 3 only)
"none", // Lobby C3 (Episode 3 only)
"none", // Lobby C4 (Episode 3 only)
"none", // Lobby C5 (Episode 3 only)
],
// Menu event. This is the holiday event the player sees at the main menu.
"MenuEvent": "none",
// Episode 3 menu song. If set, Episode 3 clients will hear this song when
// they are at the newserv main menu. The values are:
// 0: "Let the winds blow - Theme of PSO Episode3 -"
// 1: "Gate"
// 2: "Tune"
// 3: "Code"
// 4: "NEW LIFES"
// 5: "RIDE ON"
// 6: "ADVICES"
// 7: "Morgue PART1"
// 8: "Unguis lapis"
// 9: "Via Tubus "
// 10: "Tower of Caelum"
// 11: "Mortis Fons"
// 12: "Lupus Silva PART1 from Mother earth of dishonesty"
// 13: "Lupus Silva PART2 from Mother earth of dishonesty"
// 14: "Molae Venti "
// 15: "Tener Sinus"
// 16: "The whole new world - PSO OPENING THEME -"
// 17: "World with me - PSO EP2 ENDING THEME -"
// 18: "Can still see the light - PSO ENDING THEME -"
// 19: "Day dawns"
// 20: "Nebula Montana PART1 from Jungle -A forest cage-"
// 21: "Nebula Montana PART2 from Jungle -A forest cage-"
// 22: "Morgue PART2"
// 23: "Dolor Odor"
// 24: "Ravum Aedes Sacra"
// 25: "IDOLA the strange fruits"
// 26: "Cyber"
// 27: "Special Relaxies"
// 28: "Let the winds blow -Remix Version-"
// 29: "Leavin flow"
// 30: "Rose Confession"
// 31: "Day light"
// 32: "Versus1 -Tricktrack-"
// 33: "Versus2 -A longing to ancient times-"
// 34: "Burning Hearts - Burning Ranger -"
// 35: "Wedding March - SAMBA de AMIGO -"
// 36: "VAMOS A CARNAVAL - SAMBA de AMIGO -"
// 37: "dreams dreams - Nights -"
// 38: "dreams dreams (kids ver) - Nights -"
// 39: "CHANT THIS CHARM - BILLY HATCHER -"
// 40: "Let Mom Sleep - Jet Grind Radio -"
// 41: "THE CONCEPT OF LOVE - Jet Grind Radio Future -"
// 42: "Where is smiley? - NEW ROOMMANIA -"
// 43: "Buggie Running Beeps 01 - Rez -"
// 44: "Skies of Arcadia Opening Theme - Skies of Arcadia -"
// 45: "Shinobi :boutan - Shinobi -"
// 46: "Tsuioku - Panzer Dragoon ZWEI -"
// 47: "Sona mi areru ec sancitu - AZEL Panzer Dragoon RPG -"
// 48: "ANU ORTA VENIYA - Panzer Dragoon ORTA -"
// 49: "LET'S GO AWAY - DAYTONA 53! -"
// 50: "MAIN THEME-SPACE HARRIER - SPACE HARRIER -"
// 51: "OPA-OPA! - Fantasy Zone -"
// "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 account 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. (In the Git repository, the code is in
// notes/ar-codes.txt.)
"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": 0x0042,
// 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, .ppm, .gvm, or .gvm.prs format,
// and should be placed in the system/ep3/banners directory. Images are
// subject to a lot of restrictions due to GC hardware limitations:
// - The image must be square.
// - The image dimensions must be a power of 2 (e.g. 128x128 or 256x256).
// - The image data must be no larger than 0x37000 bytes when encoded as a
// GVM file (newserv will do this encoding internally if it's not a .gvm
// or .gvm.prs file already).
// - The GVM file must compress to no larger than 0x3800 bytes.
// newserv will fail on startup if the data size constraints aren't satisfied.
// Banners are specified as lists of [type, where, filename]. type should be
// 1 for image files. where is a bit field 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 00010000 (2 banners)
// 00040000: Immediately right of 00010000 (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 bits:
// 0x001 - appears in normal mode
// 0x002 - appears in battle mode
// 0x004 - appears in challenge mode
// 0x008 - appears in solo mode (BB)
// 0x010 - appears at government counter (BB)
// 0x020 - appears in download quest menu
// 0x040 - appears in Episode 3 download quest menu
// 0x080 - hide quests that don't match the game's episode
// 0x100 - is Episode 2 Challenge category
// 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).
[0x000, "hidden", "Hidden", "$E$C6Quests that do not\nappear in any menu"],
[0x081, "government-console-ep1", "Hero in Red", "$E$CG-Red Ring Rico-\n$C6Quests that follow\nthe Episode 1\nstoryline"],
[0x081, "government-console-ep2", "The Military's Hero", "$E$CG-Heathcliff Flowen-\n$C6Quests that follow\nthe Episode 2\nstoryline"],
[0x081, "retrieval", "Retrieval", "$E$C6Quests that involve\nretrieving an object"],
[0x081, "extermination", "Extermination", "$E$C6Quests that involve\ndestroying all\nmonsters"],
[0x081, "events", "Events", "$E$C6Quests that are part\nof an event"],
[0x081, "shops", "Shops", "$E$C6Quests that contain\nshops"],
[0x081, "vr", "Virtual Reality", "$E$C6Quests that are\ndone in a simulator"],
[0x081, "tower", "Control Tower", "$E$C6Quests that take\nplace at the Control\nTower"],
[0x081, "team", "Team", "$E$C6Quests for you\nand your team\nmembers."],
[0x002, "battle", "Battle", "$E$C6Battle mode rule\nsets"],
[0x004, "challenge-ep1", "Challenge (Episode 1)", "$E$C6Challenge mode\nquests in Episode 1"],
[0x004, "challenge-solo-ep1", "Solo Challenge (Episode 1)", "$E$C6Challenge mode\nquests in Episode 1\nthat you can solo"],
[0x104, "challenge-ep2", "Challenge (Episode 2)", "$E$C6Challenge mode\nquests in Episode 2"],
[0x104, "challenge-solo-ep2", "Solo Challenge (Episode 2)", "$E$C6Challenge mode\nquests in Episode 2\nthat you can solo"],
[0x088, "solo-story", "Story", "$E$C6Quests that follow\nthe story"],
[0x088, "solo-extra", "Solo", "$E$C6Quests that require\na single player"],
[0x010, "government-ep1", "Hero in Red", "$E$CG-Red Ring Rico-\n$C6Quests that follow\nthe Episode 1\nstoryline"],
[0x010, "government-ep2", "The Military's Hero", "$E$CG-Heathcliff Flowen-\n$C6Quests that follow\nthe Episode 2\nstoryline"],
[0x010, "government-ep4", "The Meteor Impact Incident", "$E$C6Quests that follow\nthe Episode 4\nstoryline"],
[0x020, "download", "Download", "$E$C6Quests to download\nto your Memory Card"],
[0x040, "download-ep3-trial", "Trial Download", "$E$C6Quests to download\nto your Memory Card\nfrom Episode 3\nTrial Edition"],
[0x040, "download-ep3", "Download", "$E$C6Quests to download\nto your Memory Card"],
],
// Item stack limits. Note that changing these does not affect the client's
// behavior automatically - this only exists to allow the server to understand
// the behavior of clients that are already patched with different stack
// limits. If you want to use an unpatched BB client but still have custom
// stack limits, you can use the StackLimits runtime patch by editing
// system/client-functions/BlueBurstExclusive/StackLimits.59NL.patch.s to
// match the BB stack limits and adding "StackLimits" to the BBRequiredPatches
// list. The ToolLimits list is indexed by data1[1] (that is, the second byte
// of the item data); for items beyond the end of the list, the last entry's
// value is used.
"ItemStackLimits": [
{"MesetaLimit": 999999, "ToolLimits": [10]}, // DC NTE
{"MesetaLimit": 999999, "ToolLimits": [10]}, // DC 11/2000
{"MesetaLimit": 999999, "ToolLimits": [10, 10, 1, 10, 10, 10, 10, 10, 10, 1]}, // DC V1
{"MesetaLimit": 999999, "ToolLimits": [10, 10, 1, 10, 10, 10, 10, 10, 10, 1]}, // DC V2
{"MesetaLimit": 999999, "ToolLimits": [10, 10, 1, 10, 10, 10, 10, 10, 10, 1]}, // PC NTE
{"MesetaLimit": 999999, "ToolLimits": [10, 10, 1, 10, 10, 10, 10, 10, 10, 1]}, // PC
{"MesetaLimit": 999999, "ToolLimits": [10, 10, 1, 10, 10, 10, 10, 10, 10, 1, 1, 1, 1, 1, 1, 1, 99, 1]}, // GC NTE
{"MesetaLimit": 999999, "ToolLimits": [10, 10, 1, 10, 10, 10, 10, 10, 10, 1, 1, 1, 1, 1, 1, 1, 99, 1]}, // GC
{"MesetaLimit": 999999, "ToolLimits": [10, 10, 1, 10, 10, 10, 10, 10, 10, 1, 1, 1, 1, 1, 1, 1, 99, 1]}, // GC Ep3 NTE
{"MesetaLimit": 999999, "ToolLimits": [10, 10, 1, 10, 10, 10, 10, 10, 10, 1, 1, 1, 1, 1, 1, 1, 99, 1]}, // GC Ep3
{"MesetaLimit": 999999, "ToolLimits": [10, 10, 1, 10, 10, 10, 10, 10, 10, 1, 1, 1, 1, 1, 1, 1, 99, 1]}, // XB
{"MesetaLimit": 999999, "ToolLimits": [10, 10, 1, 10, 10, 10, 10, 10, 10, 1, 1, 1, 1, 1, 1, 1, 99, 1]}, // BB
],
// 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", "M&A60 Vise", "H&S25 Justice", "L&K14 Combat", "Photon Claw", "Silence Claw", "Raikiri", "Twin Psychogun", "DB's Saber", "Morning Prayer", "Cure/Confuse", "Cure/Slow", "Cure/Paralysis", "Cure/Freeze", "Cure/Poison", "Photon Crystal", "Dragon Scale", "Rappy's Beak", "Power Material"],
"Monday": ["Flowen's Sword", "Last Survivor", "Dragon Slayer", "Rianov 303SNR", "H&S25 Justice", "Double Saber", "Crush Bullet", "Meteor Smash", "Final Impact", "Plantain Leaf", "Fatsia", "DB's Saber", "DB's Shield", "Devil/Battle", "Hero/Ability"],
"Tuesday": ["Bloody Art", "Maser Beam", "Regenerate Gear", "Black Ring", "Photon Crystal", "Dragon Scale", "Rappy's Beak"],
"Wednesday": ["Vjaya", "Musashi", "Yamato", "Rianov 303SNR", "Battle Verge", "Brave Hammer", "Alive Aqhu", "Sacred Guard", "S-Parts ver2.01", "Light Relief", "Attribute Wall", "TP/Revival", "Hero/Ability", "God/Legs", "Photon Crystal", "Rappy's Beak"],
"Thursday": ["Raikiri", "Slicer of Assassin", "Diska of Liberator", "Diska of Braveman", "Varista", "Battle Verge", "Fire Scepter:Agni", "Ice Staff:Dagon", "Storm Wand:Indra", "Victor Axe", "Photon Launcher", "Morning Prayer", "Red Coat", "Infantry Mantle", "Regenerate Gear", "HP/Revival", "Cure/Freeze", "AddSlot", "Photon Crystal", "Dragon Scale", "HP Material", "Luck Material"],
"Friday": ["Varista", "Custom Ray ver.OO", "Bravace", "Visk-235W", "Rianov 303SNR", "M&A60 Vise", "Club of Laconium", "Caduceus", "Sting Tip", "Fatsia", "Talis", "Mahu", "Twin Psychogun", "Aura Field", "Electro Frame", "Sacred Cloth", "Smoking Plate", "Red Coat", "TP/Revival", "Cure/Shock", "Cure/Slow", "God/Luck", "Photon Crystal", "Dragon Scale", "TP Material"],
"Saturday": ["Double Saber", "Suppressed Gun", "Wals-MK2", "Justy-23ST", "Rianov 303SNR", "Ancient Saber", "Custom Frame ver.OO", "Cure/Paralysis", "PB/Amplifier", "PB/Create", "Power Material"],
}, {
"MesetaCost": 100000,
"BaseProbability": 0x0A3D70A3, // 4%
"ProbabilityUpgrade": 0x0A3D70A3, // 4%
"Sunday": ["DB's Saber", "Ancient Saber", "Elysion", "Blade Dance", "Zero Divide", "Asteron Belt", "Raikiri", "Stag Cutlery", "Silence Claw", "Photon Claw", "Guren", "H&S25 Justice", "M&A60 Vise", "Holy Ray", "Guilty Light", "Red Scorpio", "Club of Laconium", "Skyly Card", "Whitill Card", "DF Field", "S-Parts ver1.16", "Black Odoshi Red Nimaidou", "Kasami Bracer", "Standstill Shield", "Secure Feet", "V101", "Cure/Shock", "Cure/Paralysis", "Cure/Freeze", "Perfect/Resist", "AddSlot", "Photon Crystal"],
"Monday": ["DB's Saber", "Kaladbolg", "Elysion", "Red Saber", "Dragon Slayer", "Flowen's Sword", "Last Survivor", "Red Sword", "Yunchang", "Double Saber", "Meteor Cudgel", "Kamui", "Sange", "H&S25 Justice", "L&K14 Combat", "Crush Bullet", "Meteor Smash", "Panzer Faust","Earth Wand Brownie", "Guardianna", "Talis", "Revival Cuirass", "Black Odoshi Domaru", "Gratia", "Honeycomb Reflector", "Regenerate Gear", "Regenerate Gear B.P.", "V501", "Heavenly/Battle", "Hero/Ability", "Cure/Slow", "God/Arm", "Photon Crystal", "Luck Material"],
"Tuesday": ["DB's Saber", "Cross Scar", "Bloody Art", "Blade Dance", "Zero Divide", "Brionac", "Asteron Belt", "Diska of Braveman", "Morning Glory", "Phoenix Claw", "Asuka", "Angry Fist", "God Hand", "Brave Knuckle", "M&A60 Vise", "Mace of Adaman", "Club of Laconium", "Skyly Card", "Talis", "Pinkal Card", "Ignition Cloak", "Red Coat", "Secret Gear", "Bunny Ears", "Cat Ears", "V502", "PB/Create", "Cure/Paralysis", "Smartlink", "Photon Crystal", "Mind Material"],
"Wednesday": ["Zanba", "Bloody Art", "Vjaya", "Brionac", "Soul Banish", "Red Partisan", "Morning Glory", "Phoenix Claw", "Yasminkov 2000H", "Ruby Bullet", "Yasminkov 7000V", "Maser Beam", "Cannon Rouge", "Clio", "Battle Verge", "Brave Hammer", "Morning Prayer", "S-Parts ver1.16", "S-Parts ver2.01", "Attribute Wall", "Sacred Guard", "Honeycomb Reflector", "AddSlot"],
"Thursday": ["Flamberge", "Victor Axe", "Gae Bolg", "Asteron Belt", "Slicer of Assassin", "Diska of Liberator", "Diska of Braveman", "Flight Cutter", "Red Slicer", "Demolition Comet", "Heart of Poumn", "Phoenix Claw", "Ruby Bullet", "Spread Needle", "Holy Ray", "M&A60 Vise", "Inferno Bazooka", "Cannon Rouge", "Glide Divine", "Branch of Pakupaku", "Fire Scepter:Agni", "Ice Staff:Dagon", "Storm Wand:Indra", "Earth Wand Brownie", "Talis", "DF Field", "Redria Card", "Guard Wave", "Star Cuirass", "Luminous Field", "Stink Shield", "HP/Generate", "HP/Restorate", "Cure/Shock", "God/TP", "Hero/Ability", "AddSlot", "HP Material", "TP Material"],
"Friday": ["Red Saber", "Victor Axe", "Zero Divide", "Phoenix Claw", "Varista", "Bravace", "Ophelie Seize" , "Red Handgun", "Visk-235W", "H&S25 Justice", "Crush Bullet", "Power Maser", "Guilty Light", "Caduceus", "Fire Scepter:Agni", "The Sigh of a God", "Attribute Plate", "Electro Frame", "Aura Field", "Graviton Plate", "Tempest Cloak", "Black Odoshi Domaru", "Black Odoshi Red Nimaidou", "PB/Create", "TP/Revival", "Devil/Battle"],
"Saturday": ["Kaladbolg", "Kusanagi", "Varista", "Suppressed Gun", "Visk-235W", "Wals-MK2", "Justy-23ST", "Twin Psychogun", "Red Mechgun", "Windmill", "Sting Tip", "Caduceus", "Plantain Leaf", "Fatsia", "Earth Wand Brownie", "Redria Card", "Oran Card", "D-Parts ver1.01", "D-Parts ver2.10", "Graviton Plate", "Spirit Garment", "Sense Plate", "Revival Garment", "Stink Frame", "Honeycomb Reflector", "PB/Create", "Cure/Freeze", "Cure/Poison", "God/Ability", "Photon Crystal", "AddSlot"],
},
],
"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,
// EXP share multiplier for BB games. The logic for EXP computation is:
// - If the player lands the killing blow on an enemy they get full EXP (or
// multiplied by this value, if this value is greater than 1).
// - If the player tags an enemy but doesn't kill it, they get full EXP
// multiplied by 80% (or multiplied by this value, if this value is greater
// than 0.8). This applies even if the player is on a different floor when
// the enemy dies.
// - If the player is on the same floor as an enemy when it is killed but
// the player never attacked it, they get full EXP multiplied by this value
// (50% by default).
// - If the player is not on the same floor as an enemy when it is killed and
// never tagged it, they get no EXP.
// To disable EXP share in BB games, set this to zero.
"BBEXPShareMultiplier": 0.5,
// Drop rate multiplier for all server drop tables. This applies to server
// drop modes in all game versions. If you want to scale the drop rates for
// only some versions, use the --multiply option to the convert-rare-item-set
// action instead.
"ServerGlobalDropRateMultiplier": 1.0,
// Client functions listed here are always enabled as auto patches for BB
// clients. For example, you can add "StackLimits" here if you've edited the
// StackLimits patch and the ItemStackLimits field in this file, and want the
// limits to take effect on BB clients. If a client connects using a client
// version that isn't compatible with one of these patches, the client will
// be disconnected.
"BBRequiredPatches": [
// You will probably want to uncomment the following line if you want to
// use items that were unreleased on the original Sega servers.
// "ClearUnreleasedItemList",
],
// Client functions listed here are automatically sent to all clients. If a
// client connects using a client version that isn't compatible with some of
// these patches, the incompatible patches are skipped and the client is
// allowed to connect. This option applies to all PSO versions, not only BB.
"AutoPatches": [
// "AccurateKillCount",
],
// Whether to retain server drop tables when game leaders change. The client
// reloads its drop tables when the leader joins a game or returns to Pioneer
// 2; this leads to some edge cases that could be confusing for players, so
// newserv instead switches its server tables instantly to the new leader's
// section ID when the leader leaves the game. This option, if enabled, causes
// the server to instead use the game creator's section ID for the entire
// duration of the game. On versions other than BB, this only has an effect in
// server drop modes.
"UseGameCreatorSectionID": false,
// 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": "UnionField",
"Name": "Union Field",
"Description": "Create a Union Field\narmor",
"IsUnique": false,
"Points": 100,
"RewardItem": "010155",
}, {
"Key": "UnionGuard",
"Name": "Union Guard",
"Description": "Create a Union Guard\nshield",
"IsUnique": false,
"Points": 100,
"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",
// Cheat mode behaviors. The keys present in this list determine what the
// server considers to be cheating. If you delete or comment out an item
// here, the server will allow that action even when cheat mode is off.
"CheatingBehaviors": [
"CreateItems", // Use of the $item command
"EditSectionID", // Use of $edit secid for characters past Level 1
"EditStats", // Use of $edit atp, etc.
"Ep3ReplaceAssist", // Use of $setassist
"Ep3UnsetFieldCharacter", // Use of $unset
"InfiniteHPTP", // Use of $infhp and $inftp
"InsufficientMinimumLevel", // Setting a $minlevel below the default
"OverrideRandomSeed", // Use of $rand
"OverrideSectionID", // Use of $secid
"OverrideVariations", // Use of $variations
"ProxyOverrideDrops", // Use of $dropmode on proxy server
// "ResetMaterials", // Use of $edit mat reset (by default, not cheating)
"Warp", // Use of $warp
],
// Default switch assist behavior. Players can always toggle switch assist
// with the $swa command; this only controls whether it's enabled by default
// for all players or not.
"EnableSwitchAssistByDefault": false,
// Whether to enable rare drop notifications by default. Players can toggle
// this behavior for themselves with the $itemnotifs command.
"RareNotificationsEnabledByDefaultV1V2": false,
"RareNotificationsEnabledByDefaultV3V4": false,
// If this is true, items generated in client drop mode can trigger rare drop
// notifications. By default, they can't.
"RareNotificationsEnabledForClientDrops": false,
// Items for which rare notifications should be broadcast to the game or
// entire server. These notifications occur when the item is picked up. They
// only are generated from items dropped by boxes and enemies; items dropped
// by players or created with the $item command do not cause notifications
// when picked up.
// Entries in these lists are primary identifiers, which are similar to the
// usual 3-byte item codes but are slightly more expressive. In summary,
// primary identifiers go like this:
// 0x00TTSS00 = weapon (T = type, S = subtype; subtype is 0 for ES weapons)
// 0x01TTSS00 = armor/shield/unit
// 0x02TT0000 = mag
// 0x03TTSS00 = tool item (except tech disks)
// 0x0302ZZLL = tech disk (Z = tech number, L = level - 1)
// 0x04000000 = meseta
// For example (you can check these in names-v4.json):
// 0x00020700 = DRAGON SLAYER (any stats)
// 0x01012A00 = DF FIELD (any stats)
// 0x020B0000 = Tapas (any level)
// 0x03010200 = Trifluid (any amount)
// 0x0302061D = Disk:Zonde Lv.30
// 0x04000000 = Meseta (any amount)
// As with most other places where you can specify items in this file, you
// can also put textual item descriptions in here (e.g. "DRAGON SLAYER"), but
// only data that would appear in the primary identifier will be used - that
// is, if you were to put something like "DRAGON SLAYER +5 5/0/0/5/0", the
// grind and bonuses would be ignored, and all DRAGON SLAYERs would result in
// notifications regardless of their stats. For textual descriptions, the
// items are parsed as they would be on BB, so certain V2-only items cannot
// be represented this way.
"NotifyGameForItemPrimaryIdentifiersV1V2": [],
"NotifyGameForItemPrimaryIdentifiersV3": [],
"NotifyGameForItemPrimaryIdentifiersV4": [],
"NotifyServerForItemPrimaryIdentifiersV1V2": [],
"NotifyServerForItemPrimaryIdentifiersV3": [],
"NotifyServerForItemPrimaryIdentifiersV4": [],
// Whether to notify the entire server when a player reaches the maximum level
// (100 on v1, 200 on other versions, or 999 on Episode 3).
"NotifyServerForMaxLevelAchieved": false,
// This setting allows the server to enable server patching for versions that
// don't natively support it. This is not enabled by default because it
// increases the loading time considerably - the player has to wait for the
// initial server connection, then wait for the quest to load, then wait for
// the client to leave the "game", before getting to the welcome message.
"EnableSendFunctionCallQuestNumbers": {
// "3OE2": 88530, // US Plus (v1.2) + customizations
// "3OJ5": 88531, // JP Plus (v1.5)
// "3SE0": 88532, // US Ep3
// "3SP0": 88533, // EU Ep3
},
// Whether to enable protected subcommands on GC and Xbox. This enables the
// infinite HP cheat to also automatically revive players and clear conditions
// like poison and freeze. (On v1 and v2, those functions are always enabled
// in infinite HP mode.)
"EnableV3V4ProtectedSubcommands": false,
// These flags specify which versions to allow to join games, depending on
// the version that created the game. Each entry here is a bit field
// specifying which versions can join. The bits are in the same order as
// specified here in the comments, starting from the right (so DC_NTE is the
// third bit from the right). By default, all non-prototype v1 and v2
// versions can play with each other, and GC and Xbox can play with each
// other also.
// Note that there are some built-in restrictions. If a game is in the
// Ultimate difficulty level, for example, it will not be accessible to v1
// players regardless of what's specified below. There are similar
// restrictions based on the game mode and episode number.
// I don't plan to implement the ability for NTE or prototype versions to
// play with each other or with non-NTE versions. If you allow any NTE or
// prototype versions to play with other versions and you encounter a bug in
// that scenario, don't submit a ticket about it.
"CompatibilityGroups": [
0x0000, // PC_PATCH
0x0000, // BB_PATCH
0x0004, // DC_NTE compatible only with itself
0x0008, // DC_11_2000 compatible only with itself
0x00B0, // DC_V1 compatible with DC_V1, DC_V2, and PC_V2
0x00B0, // DC_V2 compatible with DC_V1, DC_V2, and PC_V2
0x0040, // PC_NTE compatible only with itself
0x00B0, // PC_V2 compatible with DC_V1, DC_V2, and PC_V2
0x0100, // GC_NTE compatible only with itself
0x1200, // GC_V3 compatible with GC_V3 and XB_V3
0x0400, // GC_EP3_NTE compatible only with itself
0x0800, // GC_EP3 compatible only with itself
0x1200, // XB_V3 compatible with GC_V3 and XB_V3
0x2000, // BB_V4 compatible only with itself
],
// This option causes the server to override name colors for all players based
// on which version of the game they're using. If this option is missing or
// commented out (the default), the server does not override any name colors.
// There must be 12 entries in this list, and colors are specified as ARGB32.
// "VersionNameColors": [
// 0xFFBBBBBB, // DC NTE
// 0xFF666666, // DC 11/2000
// 0xFFFFFFFF, // DC v1
// 0xFFFFAE35, // DC v2
// 0xFF875C1C, // PC NTE
// 0xFFFFAE35, // PC v2
// 0xFF663366, // GC NTE
// 0xFFFFBBFF, // GC
// 0xFF666600, // Ep3 NTE
// 0xFFDFF56E, // Ep3
// 0xFFBBFFBB, // Xbox
// 0xFF55FDE3, // BB (the official Episode 4 color is probably 0xFFC69141)
// ],
// "ClientCustomizationNameColor": 0xFFFFBBBB,
// These options control which item drop modes are used by default, and which
// can be chosen by the player. The AllowedDropModes fields are bit fields
// specifying which modes players can choose with the $dropmode command. See
// "Item tables and drop modes" in README.md for details on how each drop
// mode behaves. The mode bits are:
// 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.
// The Mericarand rate applies to Mericarol enemies whose arguments specify
// that they may be replaced with Mericus or Merikle. (Specifically, if
// uparam1 > 2, this is the case.) When a Mericarol is replaced, the enemy
// index is used to determine whether it will be a Mericus (even enemy index)
// or Merikle (odd enemy index).
"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, // 1/500
"Rappy": 0x0083126E, // 1/500
"NarLily": 0x0083126E, // 1/500
"PouillySlime": 0x0083126E, // 1/500
"Mericarand": 0x33333333, // 1/5
"MerissaAA": 0x0083126E, // 1/500
"Pazuzu": 0x0083126E, // 1/500
"DorphonEclair": 0x0083126E, // 1/500
"Kondrieu": 0x1999999A, // 1/10
},
// "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 be changed when a game is started in order to fix
// certain in-game issues (noted in the comments in the default values below).
// These can be true, false, or expressions to make values conditional on
// other flags' values. For non-BB versions, you should generally only use
// true and false here, since the server doesn't have direct access to the
// client's quest flags from their save file.
// If you use an expression, the format is the same as the AvailableIf and
// EnabledIf fields in quest JSON files (see system/quests/battle/b88001.json
// for details). Note that the expression is only evaluated at the time the
// game is created, and the player-specific tokens like C_EpX_YY refer to the
// player who created the game.
// The UnlockAllAreas option is now gone; if you want the same behavior as if
// it were enabled, uncomment all the "area unlocks" lines below. Note that
// some late PSOBB client versions (for example, the Tethealla client) open
// all areas by default, so the area unlock flags have no effect for them.
"QuestFlagRewritesV1V2": {
// "F_0017": true, // Ep1 area unlocks
// "F_0020": true, // Ep1 area unlocks
// "F_002A": true, // Ep1 area unlocks
},
"QuestFlagRewritesV3": {
// "F_0017": true, // Ep1 area unlocks
// "F_0020": true, // Ep1 area unlocks
// "F_002A": true, // Ep1 area unlocks
// "F_004C": true, // Ep2 area unlocks
// "F_004F": true, // Ep2 area unlocks
// "F_0052": true, // Ep2 area unlocks
},
"QuestFlagRewritesV4": {
// "F_01F9": true, // Ep1 area unlocks
// "F_0201": true, // Ep1 area unlocks
// "F_0207": true, // Ep1 area unlocks
// "F_021B": true, // Ep2 area unlocks
// "F_0225": true, // Ep2 area unlocks
// "F_022F": true, // Ep2 area unlocks
// "F_02BD": true, // Ep4 area unlocks
// "F_02BE": true, // Ep4 area unlocks
// "F_02BF": true, // Ep4 area unlocks
// "F_02C0": true, // Ep4 area unlocks
// "F_02C1": true, // Ep4 area unlocks
"F_0046": false, // Ep2 CCA door lock fix
"F_0047": false, // Ep2 CCA door lock fix
"F_0048": false, // Ep2 CCA door lock fix
"F_004F": "F_0225", // Ep2 Elly appears in town = 6-5 cleared
"F_002C": "F_01F7", // Ep1 Forest monument state = 1-2 cleared
"F_002D": "F_01FD", // Ep1 Cave monument state = 2-2 cleared
"F_002E": "F_0209", // Ep1 Mine monument state = 4-1 cleared
"F_002F": "F_01F7 && F_01FD && F_0209", // All monuments state
},
// This setting defines fields that can be used with the $qfread command.
"QuestCounterFields": {
// Entries are [quest_counter_index, field_mask]. field_mask must contain
// exactly one contiguous sequence of one or more 1 bits. If there is
// exactly one bit set in the mask, it is reported as true or false; if
// there are multiple bits set, it is reported as a numeric value.
"betaluckycoins": [0x01, 0x003F8000], // Beta Lucky Coins
"garonbscore": [0x00, 0x0003FC00], // Garon button-mashing game score
"garonpoints": [0x00, 0x000003FF], // Garon points
"garontscore": [0x00, 0x03FC0000], // Garon timing game score
"killcount": [0x03, 0x003FFF00], // Kill count
"luckycoins": [0x0B, 0x000001FC], // Lucky Coins
"luckytickets1": [0x03, 0x000000FF], // Lucky Tickets
"luckytickets2": [0x06, 0x0FF00000], // Lucky Tickets
"luckytickets3": [0x0A, 0x7FC00000], // Lucky Tickets
"ma1v2points": [0x09, 0x00003FFF], // MA1v2 points
"ma2v2points": [0x09, 0x0FFFC000], // MA2v2 points
"ma4kills": [0x0E, 0x7FFFFFFF], // MA4 kills (Total)
"ma4killsc": [0x08, 0x7FFFFFFF], // MA4 kills (Crater)
"ma4killscd": [0x03, 0x7FFFFFFF], // MA4 kills (Central Dome)
"ma4killsgdv": [0x04, 0x7FFFFFFF], // MA4 kills (Gal Da Val)
"ma4tickets": [0x0F, 0x000000FF], // MA4 Tickets
"pgcandyid": [0x05, 0x00007FFF], // Principal's Gift: Random Candy ID
"rhpoints": [0x02, 0x003FC000], // Rappy's Holiday points
"songcount": [0x03, 0x07C00000], // Song count
"wrappingpapers": [0x0B, 0x1FF00000], // Wrapping Papers
},
}