From 8065300faeae4580d0e0b3af450fcf85f02cc302 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sat, 7 Feb 2026 22:34:45 -0800 Subject: [PATCH] replace item names with IDs in config.json --- src/ItemData.hh | 8 +- src/ServerState.cc | 83 ++- src/ServerState.hh | 3 +- system/config.example.json | 1148 +++++++++++++++--------------------- tests/config.json | 140 +++-- 5 files changed, 646 insertions(+), 736 deletions(-) diff --git a/src/ItemData.hh b/src/ItemData.hh index 960e4a96..3510b31b 100644 --- a/src/ItemData.hh +++ b/src/ItemData.hh @@ -92,7 +92,7 @@ struct ItemData { // C = stack size (for tools) // D = DEF bonus // E = EVP bonus - // F = armor/shield/unit flags (40=present; low 4 bits are present color) + // F = armor/shield/unit flags (40=wrapped; low 4 bits are present color) // G = weapon grind // H = mag DEF // I = mag POW @@ -101,12 +101,12 @@ struct ItemData { // L = mag level // M = meseta amount // N = present color (weapon only; for other types this is in the flags field) - // P = mag flags (40=present, 04=has left pb, 02=has right pb, 01=has center pb) + // P = mag flags (40=wrapped, 04=has left pb, 02=has right pb, 01=has center pb) // Q = mag IQ // R = unit modifier (little-endian) - // S = weapon flags (80=unidentified, 40=present) and special (low 6 bits) + // S = weapon flags (80=unidentified, 40=wrapped) and special (low 6 bits) // T = slot count - // U = tool flags (40=present; unused if item is stackable) + // U = tool flags (40=wrapped; unused if item is stackable) // V = mag color // W = photon blasts // X = kill count (big-endian; high bit always set) diff --git a/src/ServerState.cc b/src/ServerState.cc index c4047633..09fccf7c 100644 --- a/src/ServerState.cc +++ b/src/ServerState.cc @@ -50,7 +50,8 @@ CheatFlags::CheatFlags(const phosg::JSON& json) : CheatFlags() { this->warp = enabled_keys.count("Warp"); } -ServerState::QuestF960Result::QuestF960Result(const phosg::JSON& json, shared_ptr name_index) { +ServerState::QuestF960Result::QuestF960Result( + const phosg::JSON& json, shared_ptr name_index, const ItemData::StackLimits& limits) { static const array day_names = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; this->meseta_cost = json.get_int("MesetaCost", 0); @@ -58,11 +59,15 @@ ServerState::QuestF960Result::QuestF960Result(const phosg::JSON& json, shared_pt this->probability_upgrade = json.get_int("ProbabilityUpgrade", 0); for (size_t day = 0; day < 7; day++) { for (const auto& item_it : json.get_list(day_names[day])) { - try { - this->results[day].emplace_back(name_index->parse_item_description(item_it->as_string())); - } catch (const exception& e) { - config_log.warning_f( - "Cannot parse item description \"{}\": {} (skipping entry)", item_it->as_string(), e.what()); + if (item_it->is_int()) { + this->results[day].emplace_back(ItemData::from_primary_identifier(limits, item_it->as_int())); + } else { + try { + this->results[day].emplace_back(name_index->parse_item_description(item_it->as_string())); + } catch (const exception& e) { + config_log.warning_f( + "Cannot parse item description \"{}\": {} (skipping entry)", item_it->as_string(), e.what()); + } } } } @@ -1408,15 +1413,32 @@ void ServerState::load_config_late() { for (size_t trap_type = 0; trap_type < 5; trap_type++) { auto& trap_card_ids = this->ep3_trap_card_ids[trap_type]; for (const auto& card_it : ep3_trap_cards_json.at(trap_type)->as_list()) { - const string& card_name = card_it->as_string(); - try { - const auto& card = this->ep3_card_index->definition_for_name_normalized(card_name); - if (card->def.type != Episode3::CardType::ASSIST) { - throw runtime_error(std::format("Ep3 card \"{}\" in trap card list is not an assist card", card_name)); + if (card_it->is_int()) { + int64_t card_id = card_it->as_int(); + try { + const auto& card = this->ep3_card_index->definition_for_id(card_id); + if (card->def.type != Episode3::CardType::ASSIST) { + throw runtime_error(std::format( + "Ep3 card \"{}\" ({:04X}) in trap card list is not an assist card", + card->def.en_name.decode(), card->def.card_id)); + } + trap_card_ids.emplace_back(card->def.card_id); + } catch (const out_of_range&) { + throw runtime_error(std::format("Ep3 card {:04X} in trap card list does not exist", card_id)); + } + } else { + const string& card_name = card_it->as_string(); + try { + const auto& card = this->ep3_card_index->definition_for_name_normalized(card_name); + if (card->def.type != Episode3::CardType::ASSIST) { + throw runtime_error(std::format( + "Ep3 card \"{}\" ({:04X}) in trap card list is not an assist card", + card->def.en_name.decode(), card->def.card_id)); + } + trap_card_ids.emplace_back(card->def.card_id); + } catch (const out_of_range&) { + throw runtime_error(std::format("Ep3 card \"{}\" in trap card list does not exist", card_name)); } - trap_card_ids.emplace_back(card->def.card_id); - } catch (const out_of_range&) { - throw runtime_error(std::format("Ep3 card \"{}\" in trap card list does not exist", card_name)); } } } @@ -1438,10 +1460,15 @@ void ServerState::load_config_late() { for (const auto& difficulty_it : type_it->as_list()) { auto& difficulty_res = type_res.emplace_back(); for (const auto& item_it : difficulty_it->as_list()) { - try { - difficulty_res.emplace_back(this->parse_item_description(Version::BB_V4, item_it->as_string())); - } catch (const exception& e) { - config_log.warning_f("Cannot parse item description \"{}\": {} (skipping entry)", item_it->as_string(), e.what()); + if (item_it->is_int()) { + difficulty_res.emplace_back(ItemData::from_primary_identifier( + *this->item_stack_limits(Version::BB_V4), item_it->as_int())); + } else { + try { + difficulty_res.emplace_back(this->parse_item_description(Version::BB_V4, item_it->as_string())); + } catch (const exception& e) { + config_log.warning_f("Cannot parse item description \"{}\": {} (skipping entry)", item_it->as_string(), e.what()); + } } } } @@ -1452,20 +1479,28 @@ void ServerState::load_config_late() { for (const auto& it : this->config_json->get_list("QuestF95FResultItems")) { auto& list = it->as_list(); size_t price = list.at(0)->as_int(); - try { + const auto& desc = list.at(1); + if (desc->is_int()) { this->quest_F95F_results.emplace_back(make_pair( - price, this->parse_item_description(Version::BB_V4, list.at(1)->as_string()))); - } catch (const exception& e) { - config_log.warning_f("Cannot parse item description \"{}\": {} (skipping entry)", list.at(1)->as_string(), e.what()); + price, ItemData::from_primary_identifier(*this->item_stack_limits(Version::BB_V4), desc->as_int()))); + } else { + try { + this->quest_F95F_results.emplace_back(make_pair( + price, this->parse_item_description(Version::BB_V4, list.at(1)->as_string()))); + } catch (const exception& e) { + config_log.warning_f("Cannot parse item description \"{}\": {} (skipping entry)", list.at(1)->as_string(), e.what()); + } } } } catch (const out_of_range&) { } try { + auto name_index = this->item_name_index(Version::BB_V4); + auto stack_limits = this->item_stack_limits(Version::BB_V4); this->quest_F960_failure_results = QuestF960Result( - this->config_json->at("QuestF960FailureResultItems"), this->item_name_index(Version::BB_V4)); + this->config_json->at("QuestF960FailureResultItems"), name_index, *stack_limits); for (const auto& it : this->config_json->get_list("QuestF960SuccessResultItems")) { - this->quest_F960_success_results.emplace_back(*it, this->item_name_index(Version::BB_V4)); + this->quest_F960_success_results.emplace_back(*it, name_index, *stack_limits); } } catch (const out_of_range&) { } diff --git a/src/ServerState.hh b/src/ServerState.hh index 3221f15c..46c61431 100644 --- a/src/ServerState.hh +++ b/src/ServerState.hh @@ -232,7 +232,8 @@ struct ServerState : public std::enable_shared_from_this { std::array, 7> results; QuestF960Result() = default; - QuestF960Result(const phosg::JSON& json, std::shared_ptr name_index); + QuestF960Result( + const phosg::JSON& json, std::shared_ptr name_index, const ItemData::StackLimits& limits); }; // Indexed as [type][difficulty][random_choice] diff --git a/system/config.example.json b/system/config.example.json index e9248f2a..22fccd9e 100644 --- a/system/config.example.json +++ b/system/config.example.json @@ -1,57 +1,44 @@ { // 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. + // 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'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 + // 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. + // 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 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. + // 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. + // 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. + // 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]. + // 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. @@ -59,93 +46,77 @@ // 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: + // 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: // "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"], + // 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. + // 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. + // 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. + // 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.) + // 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. + // 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", @@ -166,136 +137,108 @@ "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. + // 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. + // 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. + // 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. + // 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. + // 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. + // 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 + // 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. + // Channel exceptions are messages about clients disconnecting unexpectedly, or other network-level events. "ChannelExceptions": "INFO", - // Client messages describe events that are specific to a single client's - // connection or game state. + // 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). + // 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 sessions. "CommandData": "INFO", - // Config messages describe server-wide events, and generally only occur - // during the startup procedure. + // 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. + // 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. + // Function compiler messages are generated when building client functions, which only happens at startup time or + // when `reload functions` is used in the shell. "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. + // 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. + // 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. + // Patch file index messages describe finding and preloading the patch files for download to BB and PC clients. "PatchFileIndex": "INFO", - // Player data messages describe the loading and saving of player and - // account data files. + // 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. + // 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 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. + // 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. + // 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. + // 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 + // 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. + // 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. + // 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, - // Sentinel to use for chat commands. If this is specified, chat commands are - // prefixed by this character instead of $. + // Sentinel to use for chat commands. If this is given, chat commands are prefixed by this character instead of $. // "ChatCommandSentinel": "/", - // 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. + // 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.) + // 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 $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 $C7: Run a patch on your client\n\n$C8Episode 3 only:$C7\n$C6%ssong $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 $C7: Set your override section ID\n$C6%srand $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 $C7: Set maximum level to join\n$C6%sminlevel $C7: Set minimum level to join\n$C6%spassword [password]$C7: Lock or unlock the game"], @@ -315,29 +258,22 @@ ["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. + // 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. + // 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 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. + // 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 doesn't prevent players from joining those lobbies via the lobby teleporter. "LobbySearchOrders": [ [], // PC patch server (unused) [], // BB patch server (unused) @@ -356,18 +292,14 @@ ], "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". + // 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 @@ -393,107 +325,95 @@ // 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 -" + // Episode 3 menu song. If set, Episode 3 clients will hear this song when they are at the newserv main menu. Values: + // 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. + // 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. + // 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.) + // 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: + // 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) + // 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 + // 0x0008 => Disable overall and per-phase battle time limits, regardless of the values chosen during battle 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 command) + // 0x0040 => Enable recording (after battle, players can save the recording with the $saverec command) // 0x0080 => Disable command masking during battles - // 0x0100 => Disable interference (COMs randomly coming to each other's - // rescue) + // 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. + // 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 @@ -502,21 +422,17 @@ ["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: + // 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. + // ...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]], @@ -532,24 +448,19 @@ }, }, - // 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. + // 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] + // "CardName": [RelativeFrequency, MinPrice] "Beat +": [500, 4], "Berserk +": [800, 7], "Biboo": [500, 6], @@ -575,81 +486,72 @@ "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: + // 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 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: + // 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.) + // 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: + // 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 - // 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. + // 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 + // 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). + // 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"], @@ -673,30 +575,21 @@ [0x020, "download", "Download", "$E$C6Quests to download\nto your Memory Card"], ], - // BB bank size. If you change either of these values, you must also add - // "BankSize" to BBRequiredPatches, and change the patch contents in - // system/client-functions/BlueBurstExclusive/BankSize.59NL.patch.s to - // reflect the counts you set here. + // BB bank size. If you change either of these values, you must also add "BankSize" to BBRequiredPatches, and change + // the patch contents in system/client-functions/BlueBurstExclusive/BankSize.59NL.patch.s to reflect the counts here. "BBMaxBankItems": 200, "BBMaxBankMeseta": 999999, - // 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. - // It's important that all players in the same game have the same stack - // limits, both on the client and server! So, if you change the BB stack - // limits, you must either prevent BB from playing with other versions (see - // CompatibilityGroups) or write an analogous patch for all other versions - // and add it to AutoPatches. - // 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. + // 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. + // It's important that all players in the same game have the same stack limits, both on the client and server! So, if + // you change the BB stack limits, you must either prevent BB from playing with other versions (see + // CompatibilityGroups) or write an analogous patch for all other versions and add it to AutoPatches. + // 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 @@ -712,152 +605,136 @@ {"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. + // 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"], + [0x00900000, 0x00900100, 0x00900200, 0x00900300, 0x00900400, 0x00900500, 0x00900600, 0x00900700, 0x00900800, 0x00B40000, 0x01014E00, 0x01030700, 0x01034100, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000], + [0x00B90000, 0x00340000, 0x00090100, 0x00900200, 0x00900700, 0x002C0000, 0x002D0000, 0x01023500, 0x00010600, 0x00010500, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000], + [0x00B60000, 0x008A0100, 0x00100100, 0x00100200, 0x00100300, 0x00100400, 0x00100500, 0x00100600, 0x00270000, 0x00010700, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000], + [0x00B70000, 0x00100100, 0x00100200, 0x00100300, 0x00100400, 0x00100500, 0x00100600, 0x00290000, 0x008A0000, 0x008A0200, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000], ], [ - ["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"], + [0x01028B00, 0x01022800, 0x01013400, 0x01030300, 0x01030B00, 0x03180700, 0x00550000, 0x01032900, 0x01032F00, 0x01032C00, 0x01032300, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000], + [0x01028C00, 0x01021500, 0x01028A00, 0x01014000, 0x01034400, 0x01034600, 0x01034500, 0x01034700, 0x03180700, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000], + [0x00CB0000, 0x003A0000, 0x008C0200, 0x01022B00, 0x00500000, 0x000B0600, 0x000A0600, 0x000A0400, 0x00550000, 0x00230000, 0x003B0000, 0x03180700, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000], + [0x00510000, 0x01035200, 0x01032000, 0x01033E00, 0x01022900, 0x03180700, 0x000B0400, 0x000A0600, 0x00560000, 0x003B0000, 0x00230000, 0x000A0500, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000], ], [ - ["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"], + [0x01013200, 0x002F0100, 0x00B30000, 0x005E0000, 0x000E0200, 0x002E0000, 0x00950000, 0x009A0000, 0x002F0000, 0x01031B00, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000], + [0x00C00000, 0x00D20000, 0x008D0000, 0x01012E00, 0x008B0000, 0x00090700, 0x004E0000, 0x006D0000, 0x00150000, 0x008B0200, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000], + [0x00AA0000, 0x01014100, 0x01015100, 0x01022300, 0x003F0000, 0x00410000, 0x00050700, 0x00050600, 0x00050500, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000], + [0x00AF0000, 0x00430000, 0x01035100, 0x00CD0000, 0x00990000, 0x006C0000, 0x00450000, 0x006B0000, 0x00120000, 0x00650000, 0x01022900, 0x00130000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000], ], [], [ - ["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"], + [0x00BA0000, 0x000D0300, 0x00430100, 0x00070800, 0x00420100, 0x00C90000, 0x03100000, 0x01029500, 0x01028F00, 0x01029100], + [0x00BB0000, 0x000D0300, 0x00B70000, 0x00420100, 0x00070800, 0x00C90000, 0x01013600, 0x01028A00, 0x01029900, 0x01035100, 0x01035B00, 0x01035200, 0x03100000, 0x03180A00], + [0x00BA0000, 0x00B40000, 0x000D0300, 0x00B60000, 0x00B30000, 0x00070800, 0x00430100, 0x00C90000, 0x01013600, 0x01028A00, 0x01029900, 0x01028500, 0x01034800, 0x01035100, 0x01035B00, 0x01035200, 0x03100000], + [0x00BA0000, 0x00B40000, 0x000D0300, 0x00B60000, 0x00B30000, 0x00070800, 0x00430100, 0x00C90000, 0x01013600, 0x01028A00, 0x01029900, 0x01028500, 0x01034800, 0x01035100, 0x01035B00, 0x01035200], ], ], - // 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]. + // 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"], + [0, 0x00010000], // Unused + [10, 0x00D50000], + [15, 0x000A0700], + [20, 0x01015700], ], - // 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. + // 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"], + "Sunday": [0x01030300, 0x01034200, 0x01034300, 0x01034400, 0x01034500, 0x01034600, 0x01034700, 0x03180000], + "Monday": [0x01028D00, 0x01030700, 0x01030B00, 0x01031F00, 0x01033500, 0x01033B00, 0x01034000, 0x01034400], + "Tuesday": [0x01031300, 0x01031B00, 0x01033B00, 0x01034200, 0x01034300, 0x01034600], + "Wednesday": [0x01030F00, 0x01031F00, 0x01033800, 0x01034000, 0x01034400, 0x03180000], + "Thursday": [0x01031700, 0x01031F00, 0x01033500, 0x01033E00, 0x01034700], + "Friday": [0x01031D00, 0x01033800, 0x01033B00, 0x01034000, 0x01034300, 0x01034400, 0x01034700, 0x03180000], + "Saturday": [0x01028D00, 0x01031F00, 0x01032000, 0x01033500, 0x01033B00, 0x01034200, 0x01034300, 0x01034600], }, { "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"], + "Sunday": [0x00010600, 0x00010700, 0x00080500, 0x00080600, 0x00080700, 0x000D0000, 0x000D0100, 0x00100700, 0x00490000, 0x00010500, 0x01013700, 0x01034500, 0x01034400, 0x01034300, 0x01034600, 0x01034200, 0x03100200, 0x03180200, 0x03180700, 0x030B0000], + "Monday": [0x00020500, 0x00020600, 0x00020700, 0x00070800, 0x00080600, 0x000E0000, 0x00090500, 0x00090600, 0x00090700, 0x00560000, 0x00560100, 0x00010500, 0x01022600, 0x01034000, 0x01031F00], + "Tuesday": [0x00030600, 0x006D0000, 0x01022200, 0x01027B00, 0x03100200, 0x03180200, 0x03180700], + "Wednesday": [0x00040600, 0x00890000, 0x00890100, 0x00070800, 0x000B0400, 0x000B0500, 0x000B0600, 0x01021600, 0x01021800, 0x01021900, 0x01021E00, 0x01033800, 0x01031F00, 0x01030F00, 0x03100200, 0x03180700], + "Thursday": [0x00100700, 0x00050500, 0x00050600, 0x00050700, 0x00060500, 0x000B0400, 0x000C0400, 0x000C0500, 0x000C0600, 0x00200000, 0x008B0000, 0x01013700, 0x01014000, 0x01015300, 0x01022200, 0x01033500, 0x01034600, 0x030F0000, 0x03100200, 0x03180200, 0x030B0300, 0x030B0600], + "Friday": [0x00060500, 0x00060600, 0x00060700, 0x00070500, 0x00070800, 0x00080500, 0x000A0400, 0x00220000, 0x00230000, 0x00560100, 0x008C0000, 0x008C0100, 0x00490000, 0x01013100, 0x01013200, 0x01013300, 0x01013400, 0x01014000, 0x01033800, 0x01034700, 0x01034400, 0x01031D00, 0x03100200, 0x03180200, 0x030B0400], + "Saturday": [0x000E0000, 0x00260000, 0x00070600, 0x00070700, 0x00070800, 0x00270000, 0x01012700, 0x01034300, 0x01033900, 0x01033B00, 0x030B0000], }, { "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"], + "Sunday": [0x00010500, 0x00270000, 0x002C0000, 0x00030500, 0x00030800, 0x00040800, 0x00100700, 0x000E0100, 0x000D0100, 0x000D0000, 0x00B60000, 0x00080600, 0x00080500, 0x00130000, 0x008B0100, 0x008B0200, 0x000A0400, 0x00930200, 0x00930900, 0x01012A00, 0x01021700, 0x01013A00, 0x01022B00, 0x01022900, 0x01023500, 0x01034900, 0x01034700, 0x01034300, 0x01034600, 0x01033200, 0x030F0000, 0x03100200], + "Monday": [0x00010500, 0x00010600, 0x002C0000, 0x002D0000, 0x00020700, 0x00020500, 0x00020600, 0x00340000, 0x00BA0000, 0x000E0000, 0x002E0000, 0x008A0200, 0x008A0000, 0x00080600, 0x00080700, 0x00090500, 0x00090600, 0x004E0000, 0x000C0700, 0x00920000, 0x008C0000, 0x01014C00, 0x01013800, 0x01028500, 0x01029200, 0x01022200, 0x01028800, 0x01034A00, 0x01035300, 0x01031F00, 0x01034400, 0x01030B00, 0x03100200, 0x030B0600], + "Tuesday": [0x00010500, 0x00030700, 0x00030600, 0x00030500, 0x00030800, 0x00040500, 0x00040800, 0x00050700, 0x00940000, 0x000D0300, 0x00890200, 0x000F0100, 0x000F0200, 0x000F0000, 0x00080500, 0x000A0500, 0x000A0400, 0x00930200, 0x008C0000, 0x00930500, 0x01014600, 0x01014000, 0x01021F00, 0x01028B00, 0x01028C00, 0x01034B00, 0x01033B00, 0x01034300, 0x01035100, 0x03100200, 0x030B0100], + "Wednesday": [0x00970000, 0x00030600, 0x00040600, 0x00040500, 0x00110100, 0x003E0000, 0x00940000, 0x000D0300, 0x006A0000, 0x00A30000, 0x006B0000, 0x006D0000, 0x00C00000, 0x00C30000, 0x000B0400, 0x000B0500, 0x01013700, 0x01021700, 0x01021800, 0x01021E00, 0x01021600, 0x01029200, 0x030F0000], + "Thursday": [0x00B90000, 0x00200000, 0x00040700, 0x00040800, 0x00050500, 0x00050600, 0x00050700, 0x003F0000, 0x00410000, 0x009A0000, 0x00690000, 0x000D0300, 0x00A30000, 0x00120000, 0x00130000, 0x00080500, 0x00140000, 0x00C00000, 0x00C50000, 0x00680000, 0x000C0400, 0x000C0500, 0x000C0600, 0x000C0700, 0x008C0000, 0x01012A00, 0x00930600, 0x01012900, 0x01013500, 0x01012B00, 0x01029900, 0x01033400, 0x01033300, 0x01034700, 0x01031700, 0x01031F00, 0x030F0000, 0x030B0300, 0x030B0400], + "Friday": [0x002D0000, 0x00200000, 0x00030800, 0x000D0300, 0x00060500, 0x00060700, 0x00AF0000, 0x00440000, 0x00070500, 0x00080600, 0x00090500, 0x006D0100, 0x008B0100, 0x00220000, 0x000C0400, 0x005B0000, 0x01012500, 0x01013200, 0x01013100, 0x01012400, 0x01014800, 0x01013800, 0x01013A00, 0x01033B00, 0x01033800, 0x01034000], + "Saturday": [0x00010600, 0x00B40000, 0x00060500, 0x00260000, 0x00070500, 0x00070600, 0x00070700, 0x00490000, 0x004C0000, 0x00500000, 0x00230000, 0x00220000, 0x00560000, 0x00560100, 0x000C0700, 0x00930600, 0x00930700, 0x01011E00, 0x01011F00, 0x01012400, 0x01011C00, 0x01012300, 0x01011B00, 0x01011D00, 0x01029200, 0x01033B00, 0x01034600, 0x01034200, 0x01032000, 0x03100200, 0x030F0000], }, ], "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"], + "Sunday": [0x03000000, 0x03000100, 0x03000200, 0x03010000, 0x03010100, 0x03010200, 0x03030000, 0x03040000, 0x03060000, 0x03060100, 0x03070000, 0x03080000], + "Monday": [0x03000000, 0x03000100, 0x03000200, 0x03010000, 0x03010100, 0x03010200, 0x03030000, 0x03040000, 0x03060000, 0x03060100, 0x03070000, 0x03080000], + "Tuesday": [0x03000000, 0x03000100, 0x03000200, 0x03010000, 0x03010100, 0x03010200, 0x03030000, 0x03040000, 0x03060000, 0x03060100, 0x03070000, 0x03080000], + "Wednesday": [0x03000000, 0x03000100, 0x03000200, 0x03010000, 0x03010100, 0x03010200, 0x03030000, 0x03040000, 0x03060000, 0x03060100, 0x03070000, 0x03080000], + "Thursday": [0x03000000, 0x03000100, 0x03000200, 0x03010000, 0x03010100, 0x03010200, 0x03030000, 0x03040000, 0x03060000, 0x03060100, 0x03070000, 0x03080000], + "Friday": [0x03000000, 0x03000100, 0x03000200, 0x03010000, 0x03010100, 0x03010200, 0x03030000, 0x03040000, 0x03060000, 0x03060100, 0x03070000, 0x03080000], + "Saturday": [0x03000000, 0x03000100, 0x03000200, 0x03010000, 0x03010100, 0x03010200, 0x03030000, 0x03040000, 0x03060000, 0x03060100, 0x03070000, 0x03080000], }, - // EXP multiplier for BB games. If this is not an integer, the client will - // display incorrect EXP values, unless you also add "ServerEXPDisplay" to - // BBRequiredPatches. + + // EXP multiplier for BB games. If this is not an integer, the client will display incorrect EXP values, unless you + // also add "ServerEXPDisplay" to BBRequiredPatches. "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. EXP share is always - // disabled during battle and challenge quests (but not in free-play battle - // mode). + // - 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. EXP share is always disabled during battle and challenge + // quests (but not in free-play battle mode). "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. + // 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. + // 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. + // 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. + // 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. + // 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: @@ -865,16 +742,13 @@ // 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. + // 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", @@ -977,29 +851,23 @@ }, ], - // 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. + // 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. + // "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. + // 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 @@ -1017,28 +885,23 @@ "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. + // 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. + // 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. + // 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: + // 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 @@ -1052,14 +915,11 @@ // 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. + // 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": [], @@ -1067,15 +927,14 @@ "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). + // 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. + // 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) @@ -1083,27 +942,18 @@ // "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.) + // 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. + // 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. "CompatibilityGroups": [ 0x0000, // PC_PATCH 0x0000, // BB_PATCH @@ -1121,9 +971,8 @@ 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. + // 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 @@ -1141,11 +990,9 @@ // ], // "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: + // 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 @@ -1171,24 +1018,18 @@ "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). + // 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). + // 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 @@ -1204,8 +1045,7 @@ // "RareEnemyRates-Ultimate": {...}, // "RareEnemyRates-Challenge": {...}, - // You can override the minimum character levels required to make games in - // each episode and difficulty level here. + // You can override the minimum character levels required to make games in each episode and difficulty level here. "V1V2MinimumLevels": { "Episode1": [1, 20, 40, 80], }, @@ -1219,21 +1059,16 @@ "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 JSONs (see system/quests/retrieval/q058.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. + // 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 JSONs (see + // system/quests/retrieval/q058.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 @@ -1271,10 +1106,9 @@ // 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. + // 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 diff --git a/tests/config.json b/tests/config.json index d1f4a0e9..33befbf8 100644 --- a/tests/config.json +++ b/tests/config.json @@ -280,80 +280,120 @@ {"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 ], - "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"], + [0x00900000, 0x00900100, 0x00900200, 0x00900300, 0x00900400, 0x00900500, + 0x00900600, 0x00900700, 0x00900800, 0x00B40000, 0x01014E00, 0x01030700, + 0x01034100, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, + 0x04000000, 0x04000000, 0x04000000, 0x04000000], + [0x00B90000, 0x00340000, 0x00090100, 0x00900200, 0x00900700, 0x002C0000, + 0x002D0000, 0x01023500, 0x00010600, 0x00010500, 0x04000000, 0x04000000, + 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, + 0x04000000], + [0x00B60000, 0x008A0100, 0x00100100, 0x00100200, 0x00100300, 0x00100400, + 0x00100500, 0x00100600, 0x00270000, 0x00010700, 0x04000000, 0x04000000, + 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, + 0x04000000], + [0x00B70000, 0x00100100, 0x00100200, 0x00100300, 0x00100400, 0x00100500, + 0x00100600, 0x00290000, 0x008A0000, 0x008A0200, 0x04000000, 0x04000000, + 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, + 0x04000000], ], [ - ["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"], + [0x01028B00, 0x01022800, 0x01013400, 0x01030300, 0x01030B00, 0x03180700, + 0x00550000, 0x01032900, 0x01032F00, 0x01032C00, 0x01032300, 0x04000000, + 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, + 0x04000000, 0x04000000], + [0x01028C00, 0x01021500, 0x01028A00, 0x01014000, 0x01034400, 0x01034600, + 0x01034500, 0x01034700, 0x03180700, 0x04000000, 0x04000000, 0x04000000, + 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000], + [0x00CB0000, 0x003A0000, 0x008C0200, 0x01022B00, 0x00500000, 0x000B0600, + 0x000A0600, 0x000A0400, 0x00550000, 0x00230000, 0x003B0000, 0x03180700, + 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, + 0x04000000, 0x04000000, 0x04000000], + [0x00510000, 0x01035200, 0x01032000, 0x01033E00, 0x01022900, 0x03180700, + 0x000B0400, 0x000A0600, 0x00560000, 0x003B0000, 0x00230000, 0x000A0500, + 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, + 0x04000000, 0x04000000, 0x04000000], ], [ - ["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"], + [0x01013200, 0x002F0100, 0x00B30000, 0x005E0000, 0x000E0200, 0x002E0000, + 0x00950000, 0x009A0000, 0x002F0000, 0x01031B00, 0x04000000, 0x04000000, + 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, + 0x04000000], + [0x00C00000, 0x00D20000, 0x008D0000, 0x01012E00, 0x008B0000, 0x00090700, + 0x004E0000, 0x006D0000, 0x00150000, 0x008B0200, 0x04000000, 0x04000000, + 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, + 0x04000000], + [0x00AA0000, 0x01014100, 0x01015100, 0x01022300, 0x003F0000, 0x00410000, + 0x00050700, 0x00050600, 0x00050500, 0x04000000, 0x04000000, 0x04000000, + 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000], + [0x00AF0000, 0x00430000, 0x01035100, 0x00CD0000, 0x00990000, 0x006C0000, + 0x00450000, 0x006B0000, 0x00120000, 0x00650000, 0x01022900, 0x00130000, + 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, 0x04000000, + 0x04000000, 0x04000000, 0x04000000], ], [], [ - ["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"], + [0x00BA0000, 0x000D0300, 0x00430100, 0x00070800, 0x00420100, 0x00C90000, + 0x03100000, 0x01029500, 0x01028F00, 0x01029100], + [0x00BB0000, 0x000D0300, 0x00B70000, 0x00420100, 0x00070800, 0x00C90000, + 0x01013600, 0x01028A00, 0x01029900, 0x01035100, 0x01035B00, 0x01035200, + 0x03100000, 0x03180A00], + [0x00BA0000, 0x00B40000, 0x000D0300, 0x00B60000, 0x00B30000, 0x00070800, + 0x00430100, 0x00C90000, 0x01013600, 0x01028A00, 0x01029900, 0x01028500, + 0x01034800, 0x01035100, 0x01035B00, 0x01035200, 0x03100000], + [0x00BA0000, 0x00B40000, 0x000D0300, 0x00B60000, 0x00B30000, 0x00070800, + 0x00430100, 0x00C90000, 0x01013600, 0x01028A00, 0x01029900, 0x01028500, + 0x01034800, 0x01035100, 0x01035B00, 0x01035200], ], ], "QuestF95FResultItems": [ - [0, "000100"], // Unused - [10, "00D500"], - [15, "000A07"], - [20, "010157"], + [0, 0x00010000], // Unused + [10, 0x00D50000], + [15, 0x000A0700], + [20, 0x01015700], ], "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"], + "Sunday": [0x01030300, 0x01034200, 0x01034300, 0x01034400, 0x01034500, 0x01034600, 0x01034700, 0x03180000], + "Monday": [0x01028D00, 0x01030700, 0x01030B00, 0x01031F00, 0x01033500, 0x01033B00, 0x01034000, 0x01034400], + "Tuesday": [0x01031300, 0x01031B00, 0x01033B00, 0x01034200, 0x01034300, 0x01034600], + "Wednesday": [0x01030F00, 0x01031F00, 0x01033800, 0x01034000, 0x01034400, 0x03180000], + "Thursday": [0x01031700, 0x01031F00, 0x01033500, 0x01033E00, 0x01034700], + "Friday": [0x01031D00, 0x01033800, 0x01033B00, 0x01034000, 0x01034300, 0x01034400, 0x01034700, 0x03180000], + "Saturday": [0x01028D00, 0x01031F00, 0x01032000, 0x01033500, 0x01033B00, 0x01034200, 0x01034300, 0x01034600], }, { "MesetaCost": 10000, "BaseProbability": 0x0A3D70A3, // 4% "ProbabilityUpgrade": 0x0A3D70A3, // 4% - "Sunday": ["Kaladbolg", "Durandal", "Blade Dance", "M&A60 Vise", "H&S25 Justice", "L&K14 Combat", "Club of Laconium", "Photon Claw", "Silence Claw", "Stag Cutlery", "Holy Ray", "Ancient Saber", "Elysion", "Twin Psychogun", "Guilty Light", "Red Scorpio", "DB's Saber", "DF Field", "Morning Prayer", "S-Parts ver1.16", "Standstill Shield", "Kasami Bracer", "Secure Feet", "AddSlot", "Photon Crystal", "Dragon Scale", "Rappy's Beak"], - "Monday": ["Kaladbolg", "Flowen's Sword", "Last Survivor", "Dragon Slayer", "Rianov 303SNR", "H&S25 Justice", "L&K14 Combat", "Crush Bullet", "Meteor Smash", "Final Impact", "Club of Zumiuran", "Brave Hammer", "Alive Aqhu", "Ice Staff:Dagon", "Double Saber", "Elysion", "Red Saber", "Meteor Cudgel", "Red Sword", "Panzer Faust", "Plantain Leaf", "Fatsia", "Sange", "Kamui", "Talis", "DB's Saber", "Guardianna", "Regenerate Gear", "DB's Shield", "AddSlot", "Photon Crystal", "Dragon Scale", "Rappy's Beak"], - "Tuesday": ["Blade Dance", "Bloody Art", "Cross Scar", "Brionac", "Diska of Braveman", "M&A60 Vise", "Club of Laconium", "Mace of Adaman", "Twin Brand", "Brave Knuckle", "Angry Fist", "God Hand", "Red Dagger", "Maser Beam", "Asuka", "Talis", "DB's Saber", "Red Coat", "Secret Gear", "Regenerate Gear", "Black Ring", "AddSlot", "Photon Crystal", "Dragon Scale", "Rappy's Beak"], - "Wednesday": ["Bloody Art", "Brionac", "Vjaya", "Rianov 303SNR", "Battle Verge", "Brave Hammer", "Alive Aqhu", "Soul Banish", "Red Partisan", "Yasminkov 2000H", "Yasminkov 7000V", "Maser Beam", "Musashi", "Yamato", "Zanba", "Ruby Bullet", "Sacred Guard", "S-Parts ver1.16", "S-Parts ver2.01", "Light Relief", "Attribute Wall", "AddSlot", "Photon Crystal", "Dragon Scale", "Rappy's Beak"], - "Thursday": ["Gae Bolg", "Slicer of Assassin", "Diska of Liberator", "Diska of Braveman", "Varista", "M&A60 Vise", "Mace of Adaman", "Battle Verge", "Fire Scepter:Agni", "Ice Staff:Dagon", "Storm Wand:Indra", "Twin Brand", "Spread Needle", "Holy Ray", "Inferno Bazooka", "Victor Axe", "Flight Cutter", "Red Slicer", "Branch of Pakupaku", "Heart of Poumn", "Photon Launcher", "Guilty Light", "Talis", "Demolition Comet", "Ruby Bullet", "Guard Wave", "DF Field", "Luminous Field", "Morning Prayer", "Red Coat", "Infantry Mantle", "Regenerate Gear", "AddSlot", "Photon Crystal", "Dragon Scale", "Rappy's Beak"], - "Friday": ["Varista", "Custom Ray ver.OO", "Bravace", "Visk-235W", "Rianov 303SNR", "M&A60 Vise", "H&S25 Justice", "Crush Bullet", "Club of Laconium", "Fire Scepter:Agni", "Victor Axe", "Caduceus", "Sting Tip", "Ancient Saber", "Red Saber", "Red Handgun", "Twin Psychogun", "Fatsia", "The Sigh of a God", "Guilty Light", "Talis", "Mahu", "Graviton Plate", "Attribute Plate", "Aura Field", "Electro Frame", "Sacred Cloth", "Smoking Plate", "Red Coat", "AddSlot", "Photon Crystal", "Dragon Scale", "Rappy's Beak"], - "Saturday": ["Kaladbolg", "Varista", "Visk-235W", "Wals-MK2", "Justy-23ST", "Rianov 303SNR", "Club of Zumiuran", "Storm Wand:Indra", "Double Saber", "Caduceus", "Sting Tip", "Suppressed Gun", "Ancient Saber", "Twin Psychogun", "Red Mechgun", "Windmill", "Plantain Leaf", "Fatsia", "Revival Garment", "Spirit Garment", "Stink Frame", "D-Parts ver1.01", "D-Parts ver2.10", "Sense Plate", "Graviton Plate", "Custom Frame ver.OO", "AddSlot", "Photon Crystal", "Dragon Scale", "Rappy's Beak"], + "Sunday": [0x00010600, 0x00010700, 0x00080500, 0x00080600, 0x00080700, 0x000D0000, 0x000D0100, 0x00100700, 0x00490000, 0x00010500, 0x01013700, 0x01034500, 0x01034400, 0x01034300, 0x01034600, 0x01034200, 0x03100200, 0x03180200, 0x03180700, 0x030B0000], + "Monday": [0x00020500, 0x00020600, 0x00020700, 0x00070800, 0x00080600, 0x000E0000, 0x00090500, 0x00090600, 0x00090700, 0x00560000, 0x00560100, 0x00010500, 0x01022600, 0x01034000, 0x01031F00], + "Tuesday": [0x00030600, 0x006D0000, 0x01022200, 0x01027B00, 0x03100200, 0x03180200, 0x03180700], + "Wednesday": [0x00040600, 0x00890000, 0x00890100, 0x00070800, 0x000B0400, 0x000B0500, 0x000B0600, 0x01021600, 0x01021800, 0x01021900, 0x01021E00, 0x01033800, 0x01031F00, 0x01030F00, 0x03100200, 0x03180700], + "Thursday": [0x00100700, 0x00050500, 0x00050600, 0x00050700, 0x00060500, 0x000B0400, 0x000C0400, 0x000C0500, 0x000C0600, 0x00200000, 0x008B0000, 0x01013700, 0x01014000, 0x01015300, 0x01022200, 0x01033500, 0x01034600, 0x030F0000, 0x03100200, 0x03180200, 0x030B0300, 0x030B0600], + "Friday": [0x00060500, 0x00060600, 0x00060700, 0x00070500, 0x00070800, 0x00080500, 0x000A0400, 0x00220000, 0x00230000, 0x00560100, 0x008C0000, 0x008C0100, 0x00490000, 0x01013100, 0x01013200, 0x01013300, 0x01013400, 0x01014000, 0x01033800, 0x01034700, 0x01034400, 0x01031D00, 0x03100200, 0x03180200, 0x030B0400], + "Saturday": [0x000E0000, 0x00260000, 0x00070600, 0x00070700, 0x00070800, 0x00270000, 0x01012700, 0x01034300, 0x01033900, 0x01033B00, 0x030B0000], }, { "MesetaCost": 100000, "BaseProbability": 0x0A3D70A3, // 4% "ProbabilityUpgrade": 0x0A3D70A3, // 4% - "Sunday": ["Zero Divide", "Asteron Belt", "Raikiri", "Skyly Card", "Purplenum Card", "Oran Card", "Guren", "Black Odoshi Red Nimaidou", "V101"], - "Monday": ["Earth Wand Brownie", "Viridia Card", "Greenill Card", "Yellowboze Card", "Yunchang", "Black Odoshi Domaru", "Revival Cuirass", "Gratia", "Regenerate Gear B.P.", "Honeycomb Reflector", "V501", "Heavenly/Battle"], - "Tuesday": ["Zero Divide", "Asteron Belt", "Phoenix Claw", "Skyly Card", "Pinkal Card", "Whitill Card", "Morning Glory", "Ignition Cloak", "Bunny Ears", "Cat Ears", "V502", "Smartlink"], - "Wednesday": ["Phoenix Claw", "Bluefull Card", "Purplenum Card", "Pinkal Card", "Morning Glory", "Cannon Rouge", "Clio", "Morning Prayer", "Sacred Guard", "Honeycomb Reflector", "Heavenly/Legs"], - "Thursday": ["Asteron Belt", "Earth Wand Brownie", "Phoenix Claw", "Raikiri", "Greenill Card", "Redria Card", "Whitill Card", "Flamberge", "Cannon Rouge", "Glide Divine", "Star Cuirass", "Stink Shield"], - "Friday": ["Zero Divide", "Phoenix Claw", "Raikiri", "Power Maser", "Viridia Card", "Yellowboze Card", "Ophelie Seize", "Black Odoshi Domaru", "Black Odoshi Red Nimaidou"], - "Saturday": ["Earth Wand Brownie", "Bluefull Card", "Redria Card", "Oran Card", "Kusanagi", "Honeycomb Reflector"], + "Sunday": [0x00010500, 0x00270000, 0x002C0000, 0x00030500, 0x00030800, 0x00040800, 0x00100700, 0x000E0100, 0x000D0100, 0x000D0000, 0x00B60000, 0x00080600, 0x00080500, 0x00130000, 0x008B0100, 0x008B0200, 0x000A0400, 0x00930200, 0x00930900, 0x01012A00, 0x01021700, 0x01013A00, 0x01022B00, 0x01022900, 0x01023500, 0x01034900, 0x01034700, 0x01034300, 0x01034600, 0x01033200, 0x030F0000, 0x03100200], + "Monday": [0x00010500, 0x00010600, 0x002C0000, 0x002D0000, 0x00020700, 0x00020500, 0x00020600, 0x00340000, 0x00BA0000, 0x000E0000, 0x002E0000, 0x008A0200, 0x008A0000, 0x00080600, 0x00080700, 0x00090500, 0x00090600, 0x004E0000, 0x000C0700, 0x00920000, 0x008C0000, 0x01014C00, 0x01013800, 0x01028500, 0x01029200, 0x01022200, 0x01028800, 0x01034A00, 0x01035300, 0x01031F00, 0x01034400, 0x01030B00, 0x03100200, 0x030B0600], + "Tuesday": [0x00010500, 0x00030700, 0x00030600, 0x00030500, 0x00030800, 0x00040500, 0x00040800, 0x00050700, 0x00940000, 0x000D0300, 0x00890200, 0x000F0100, 0x000F0200, 0x000F0000, 0x00080500, 0x000A0500, 0x000A0400, 0x00930200, 0x008C0000, 0x00930500, 0x01014600, 0x01014000, 0x01021F00, 0x01028B00, 0x01028C00, 0x01034B00, 0x01033B00, 0x01034300, 0x01035100, 0x03100200, 0x030B0100], + "Wednesday": [0x00970000, 0x00030600, 0x00040600, 0x00040500, 0x00110100, 0x003E0000, 0x00940000, 0x000D0300, 0x006A0000, 0x00A30000, 0x006B0000, 0x006D0000, 0x00C00000, 0x00C30000, 0x000B0400, 0x000B0500, 0x01013700, 0x01021700, 0x01021800, 0x01021E00, 0x01021600, 0x01029200, 0x030F0000], + "Thursday": [0x00B90000, 0x00200000, 0x00040700, 0x00040800, 0x00050500, 0x00050600, 0x00050700, 0x003F0000, 0x00410000, 0x009A0000, 0x00690000, 0x000D0300, 0x00A30000, 0x00120000, 0x00130000, 0x00080500, 0x00140000, 0x00C00000, 0x00C50000, 0x00680000, 0x000C0400, 0x000C0500, 0x000C0600, 0x000C0700, 0x008C0000, 0x01012A00, 0x00930600, 0x01012900, 0x01013500, 0x01012B00, 0x01029900, 0x01033400, 0x01033300, 0x01034700, 0x01031700, 0x01031F00, 0x030F0000, 0x030B0300, 0x030B0400], + "Friday": [0x002D0000, 0x00200000, 0x00030800, 0x000D0300, 0x00060500, 0x00060700, 0x00AF0000, 0x00440000, 0x00070500, 0x00080600, 0x00090500, 0x006D0100, 0x008B0100, 0x00220000, 0x000C0400, 0x005B0000, 0x01012500, 0x01013200, 0x01013100, 0x01012400, 0x01014800, 0x01013800, 0x01013A00, 0x01033B00, 0x01033800, 0x01034000], + "Saturday": [0x00010600, 0x00B40000, 0x00060500, 0x00260000, 0x00070500, 0x00070600, 0x00070700, 0x00490000, 0x004C0000, 0x00500000, 0x00230000, 0x00220000, 0x00560000, 0x00560100, 0x000C0700, 0x00930600, 0x00930700, 0x01011E00, 0x01011F00, 0x01012400, 0x01011C00, 0x01012300, 0x01011B00, 0x01011D00, 0x01029200, 0x01033B00, 0x01034600, 0x01034200, 0x01032000, 0x03100200, 0x030F0000], }, ], - "QuestF960FailureResultItems": { - "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"], + "QuestF960FailureResultItems": { // Items given when all tiers failed to give a prize + "Sunday": [0x03000000, 0x03000100, 0x03000200, 0x03010000, 0x03010100, 0x03010200, 0x03030000, 0x03040000, 0x03060000, 0x03060100, 0x03070000, 0x03080000], + "Monday": [0x03000000, 0x03000100, 0x03000200, 0x03010000, 0x03010100, 0x03010200, 0x03030000, 0x03040000, 0x03060000, 0x03060100, 0x03070000, 0x03080000], + "Tuesday": [0x03000000, 0x03000100, 0x03000200, 0x03010000, 0x03010100, 0x03010200, 0x03030000, 0x03040000, 0x03060000, 0x03060100, 0x03070000, 0x03080000], + "Wednesday": [0x03000000, 0x03000100, 0x03000200, 0x03010000, 0x03010100, 0x03010200, 0x03030000, 0x03040000, 0x03060000, 0x03060100, 0x03070000, 0x03080000], + "Thursday": [0x03000000, 0x03000100, 0x03000200, 0x03010000, 0x03010100, 0x03010200, 0x03030000, 0x03040000, 0x03060000, 0x03060100, 0x03070000, 0x03080000], + "Friday": [0x03000000, 0x03000100, 0x03000200, 0x03010000, 0x03010100, 0x03010200, 0x03030000, 0x03040000, 0x03060000, 0x03060100, 0x03070000, 0x03080000], + "Saturday": [0x03000000, 0x03000100, 0x03000200, 0x03010000, 0x03010100, 0x03010200, 0x03030000, 0x03040000, 0x03060000, 0x03060100, 0x03070000, 0x03080000], }, "BBGlobalEXPMultiplier": 1, "BBEXPShareMultiplier": 0.5,