Skip to content

Configuration

Tarot configuration is managed through config/tarot/config.json.

Location: config/tarot/config.json

{
"debug": false,
"bankEnabled": false,
"shinyBoosts": [
{
"uuid": "boost_uuid_here",
"name": "Weekend Event",
"multiplier": 2.0,
"startTime": 1709280000000,
"endTime": 1709366400000,
"global": true,
"playerUUIDs": []
}
],
"playerLevelSpawnEquation": "math.floor(q.player_level * 0.8 + math.random(1, 10))",
"mongoConnection": {
"host": "localhost",
"port": 27017,
"database": "tarot",
"username": "",
"password": "",
"authDatabase": "admin",
"useAuth": false
}
}
{
"debug": true
}

Enables detailed logging for troubleshooting.

{
"bankEnabled": true
}

Enables the Pokemon bank storage system. Requires MongoDB setup.

{
"shinyBoosts": [
{
"uuid": "unique_boost_id",
"name": "Community Event",
"multiplier": 3.0,
"startTime": 1709280000000,
"endTime": 1709366400000,
"global": true,
"playerUUIDs": []
}
]
}
  • uuid: Unique identifier for the boost
  • name: Display name
  • multiplier: Shiny rate multiplier (2.0 = 2x chance)
  • startTime: Unix timestamp (milliseconds) when boost starts
  • endTime: Unix timestamp (milliseconds) when boost ends
  • global: If true, applies to all players
  • playerUUIDs: List of player UUIDs (if not global)

Get Unix timestamps:

Example:

October 1, 2025 12:00:00 PM = 1727784000000
{
"playerLevelSpawnEquation": "math.floor(q.player_level * 0.8 + math.random(1, 10))"
}

MoLang equation to calculate wild Pokemon levels based on player level.

  • q.player_level: Player’s level
  • math.floor(): Round down
  • math.ceil(): Round up
  • math.random(min, max): Random number
  • math.min(): Minimum value
  • math.max(): Maximum value

Scaled to player level:

"math.floor(q.player_level * 0.8 + math.random(1, 10))"

Level 50 player = Pokemon ~40-50

Fixed range:

"math.random(10, 30)"

Always level 10-30

Progressive scaling:

"math.min(100, math.floor(q.player_level * 1.2))"

Player level × 1.2, capped at 100

Level brackets:

"q.player_level < 20 ? math.random(5, 15) : q.player_level < 50 ? math.random(20, 40) : math.random(50, 75)"

Different ranges based on player level

{
"mongoConnection": {
"host": "localhost",
"port": 27017,
"database": "tarot",
"useAuth": false
}
}
{
"mongoConnection": {
"host": "your-mongo-server.com",
"port": 27017,
"database": "tarot",
"username": "tarot_user",
"password": "secure_password",
"authDatabase": "admin",
"useAuth": true
}
}
{
"mongoConnection": {
"host": "cluster0.example.mongodb.net",
"port": 27017,
"database": "tarot",
"username": "username",
"password": "password",
"authDatabase": "admin",
"useAuth": true,
"connectionString": "mongodb+srv://username:password@cluster0.example.mongodb.net/tarot?retryWrites=true&w=majority"
}
}

Pokemon size system is automatically enabled. Configure in the Scale enum:

enum class Scale(val weight: Int, val scalar: Double) {
XXS(5, 0.6),
XS(10, 0.75),
S(20, 0.9),
M(30, 1.0),
L(20, 1.1),
XL(10, 1.25),
XXL(5, 1.5)
}

Weights determine spawn frequency:

  • Higher weight = more common
  • Scalar is the size multiplier
{
"shinyBoosts": [
{
"uuid": "halloween_2025",
"name": "Halloween Event",
"multiplier": 5.0,
"startTime": 1730419200000,
"endTime": 1730851199000,
"global": true,
"playerUUIDs": []
}
]
}
{
"shinyBoosts": [
{
"uuid": "donor_boost",
"name": "Donor Reward",
"multiplier": 2.5,
"startTime": 1709280000000,
"endTime": 1711958400000,
"global": false,
"playerUUIDs": [
"069a79f4-44e9-4726-a5be-fca90e38aaf5",
"f84c6a79-0a4e-45e0-879b-cd49ebd4c4e2"
]
}
]
}

Multiple active boosts stack multiplicatively:

Base Rate × Boost1 × Boost2 × Boost3 = Final Rate

Example:

  • Base: 1/4096 (0.024%)
  • Event 2x: 1/2048 (0.049%)
  • Player 1.5x: 1/1365 (0.073%)

Apply changes without restart:

/tarot reload
  • Use descriptive UUIDs and names
  • Set reasonable multipliers (2x-5x)
  • Schedule around events
  • Clean up expired boosts
  • Monitor player engagement
  • Test equations with different levels
  • Avoid Pokemon higher than players can handle
  • Consider progression balance
  • Provide variety in level ranges
  • Regular database backups
  • Monitor storage growth
  • Set player limits if needed
  • Secure authentication
  • Disable debug mode in production
  • Clean expired boost entries
  • Monitor database size
  • Optimize MongoDB queries
{
"debug": false,
"bankEnabled": false,
"shinyBoosts": [
{
"uuid": "community_day",
"name": "Community Day",
"multiplier": 10.0,
"startTime": 1730548800000,
"endTime": 1730577600000,
"global": true,
"playerUUIDs": []
}
],
"playerLevelSpawnEquation": "math.floor(q.player_level * 1.0)"
}
{
"debug": false,
"bankEnabled": true,
"shinyBoosts": [],
"playerLevelSpawnEquation": "math.min(100, math.floor(q.player_level * 1.5))",
"mongoConnection": {
"host": "localhost",
"port": 27017,
"database": "competitive_tarot",
"useAuth": true,
"username": "tarot_admin",
"password": "secure_pass"
}
}
{
"debug": false,
"bankEnabled": false,
"shinyBoosts": [
{
"uuid": "permanent_boost",
"name": "Always Active",
"multiplier": 3.0,
"startTime": 1704067200000,
"endTime": 2051222400000,
"global": true,
"playerUUIDs": []
}
],
"playerLevelSpawnEquation": "math.random(10, 50)"
}
  • Check start/end times are correct
  • Verify UUID is unique
  • Ensure global is true or playerUUIDs set
  • Check system time is correct
  • Verify MongoDB is running
  • Test connection details
  • Check authentication credentials
  • Review MongoDB logs
  • Test MoLang equation syntax
  • Check for divide-by-zero
  • Verify variable names
  • Add debug logging