mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-23 19:49:50 +02:00
feat: migrated tankopedia search
This commit is contained in:
1 parent
73c7bdf0c0
commit
e1c8194beb
59 files changed
+146
-131
No files matched your search
@@ -0,0 +1,653 @@
|
||||
{
|
||||
"common": {
|
||||
"wn8_percentile": {
|
||||
"0": "Very bad",
|
||||
"1": "Bad",
|
||||
"2": "Below average",
|
||||
"3": "Average",
|
||||
"4": "Above average",
|
||||
"5": "Good",
|
||||
"6": "Very good",
|
||||
"7": "Great",
|
||||
"8": "Unicum",
|
||||
"9": "Super unicum"
|
||||
},
|
||||
|
||||
"bkni_percentile": {
|
||||
"0": "Super malum",
|
||||
"1": "Malum",
|
||||
"2": "Very bad",
|
||||
"3": "Bad",
|
||||
"4": "Below average",
|
||||
"5": "Average",
|
||||
"6": "Above average",
|
||||
"7": "Good",
|
||||
"8": "Very good",
|
||||
"9": "Unicum",
|
||||
"10": "Super unicum"
|
||||
},
|
||||
|
||||
"nations": {
|
||||
"ussr": "U.S.S.R.",
|
||||
"germany": "Germany",
|
||||
"usa": "U.S.A.",
|
||||
"china": "China",
|
||||
"uk": "U.K.",
|
||||
"france": "France",
|
||||
"japan": "Japan",
|
||||
"european": "European Nation",
|
||||
"other": "Hybrid Nation"
|
||||
},
|
||||
|
||||
"nations_adjectives": {
|
||||
"ussr": "U.S.S.R.",
|
||||
"germany": "German",
|
||||
"usa": "U.S.A.",
|
||||
"china": "Chinese",
|
||||
"uk": "U.K.",
|
||||
"france": "French",
|
||||
"japan": "Japanese",
|
||||
"european": "European",
|
||||
"other": "Hybrid"
|
||||
},
|
||||
|
||||
"tank_class_short": {
|
||||
"lightTank": "Light",
|
||||
"mediumTank": "Medium",
|
||||
"heavyTank": "Heavy",
|
||||
"AT-SPG": "TD"
|
||||
},
|
||||
|
||||
"tank_class_medium": {
|
||||
"lightTank": "Light",
|
||||
"mediumTank": "Medium",
|
||||
"heavyTank": "Heavy",
|
||||
"AT-SPG": "Tank destroyer"
|
||||
},
|
||||
|
||||
"tree_type": {
|
||||
"researchable": "Tech tree",
|
||||
"premium": "Premium",
|
||||
"collector": "Collector"
|
||||
},
|
||||
|
||||
"regions": {
|
||||
"normal": {
|
||||
"com": "North America",
|
||||
"eu": "Europe",
|
||||
"asia": "Asia-Pacific"
|
||||
},
|
||||
"short": {
|
||||
"com": "NA",
|
||||
"eu": "EU",
|
||||
"asia": "APAC"
|
||||
}
|
||||
},
|
||||
|
||||
"leagues": {
|
||||
"diamond": "Diamond",
|
||||
"platinum": "Platinum",
|
||||
"gold": "Gold",
|
||||
"silver": "Silver",
|
||||
"bronze": "Bronze"
|
||||
},
|
||||
|
||||
"composite_stats": {
|
||||
"normalized_damage_dealt": "Damage",
|
||||
"normalized_damage_received": "Damage received",
|
||||
"normalized_deaths": "Deathrate",
|
||||
"normalized_frags": "Kills",
|
||||
"normalized_hits": "Hits",
|
||||
"normalized_losses": "Lossrate",
|
||||
"normalized_misses": "Misses",
|
||||
"normalized_shots": "Shots",
|
||||
"normalized_spotted": "Spots",
|
||||
"normalized_survived_battles": "Survival rate",
|
||||
"normalized_win_and_survived": "Winning and surviving rate",
|
||||
"normalized_wins": "Winrate",
|
||||
"normalized_xp": "XP",
|
||||
"normalized_battle_life_time": "Battle time",
|
||||
|
||||
"cumulative_accuracy": "Accuracy",
|
||||
"cumulative_battles": "Battles",
|
||||
"cumulative_capture_points": "Total encounter points",
|
||||
"cumulative_damage_dealt": "Total damage",
|
||||
"cumulative_damage_ratio": "Damage ratio",
|
||||
"cumulative_damage_received": "Total damage received",
|
||||
"cumulative_deaths": "Total deaths",
|
||||
"cumulative_dropped_capture_points": "Total dropped encounter points",
|
||||
"cumulative_frags": "Total kills",
|
||||
"cumulative_hits": "Total hits",
|
||||
"cumulative_inaccuracy": "Inaccuracy",
|
||||
"cumulative_kills_to_death_ratio": "Kills to death ratio",
|
||||
"cumulative_losses": "Losses",
|
||||
"cumulative_misses": "Total misses",
|
||||
"cumulative_shots": "Total shots",
|
||||
"cumulative_spotted": "Total spots",
|
||||
"cumulative_survived_battles": "Survived battles",
|
||||
"cumulative_win_and_survived": "Won and survived battles",
|
||||
"cumulative_wins": "Wins",
|
||||
"cumulative_xp": "Total XP",
|
||||
"cumulative_wn8": "WN8",
|
||||
"cumulative_battle_life_time": "Total battle time"
|
||||
}
|
||||
},
|
||||
|
||||
"bot": {
|
||||
"common": {
|
||||
"errors": {
|
||||
"clan_not_found": "# Could not find clan\nCouldn't find \"%s\". Try selecting a clan from the search result.",
|
||||
"player_not_found": "# Could not find user\nI couldn't find user \"%s\". Try picking an user from the search result, typing in a valid username, or using the `/link` command.",
|
||||
"player_not_linked": "# Use `/link` to get started\nI don't know who you are but you can tell me today!",
|
||||
"tank_name_not_found": "# Tank not found\nCould not find tank by the name \"%s\".",
|
||||
"tank_id_not_found": "# Tank not found\nCould not find tank by the ID \"%s\". Try typing the name of the tank instead of a number.",
|
||||
"no_tank_stats": "# No tank stats available\nThis player doesn't have any stats available. This may not be the player you are looking for.",
|
||||
"get_help": "Help Discord server",
|
||||
"uncaught_error": "# BlitzKit ran into an error!\nWe're so sorry about this. Feel free to [join the official Discord server](https://discord.gg/nDt7AjGJQH) to get help.",
|
||||
"preview": "# This command is in preview\n\nYou can only access this command in [the official Discord server](https://discord.gg/nDt7AjGJQH). The command will be generally available soon."
|
||||
},
|
||||
|
||||
"wn8": {
|
||||
"$": "WN8",
|
||||
"very_bad": "Very bad",
|
||||
"bad": "Bad",
|
||||
"below_average": "Below average",
|
||||
"average": "Average",
|
||||
"above_average": "Above average",
|
||||
"good": "Good",
|
||||
"very_good": "Very good",
|
||||
"great": "Great",
|
||||
"unicum": "Unicum",
|
||||
"super_unicum": "Super unicum"
|
||||
},
|
||||
|
||||
"subcommands": {
|
||||
"today": {
|
||||
"$": "today",
|
||||
"description": "Today"
|
||||
},
|
||||
"30": {
|
||||
"$": "30",
|
||||
"description": "30 days"
|
||||
},
|
||||
"60": {
|
||||
"$": "60",
|
||||
"description": "60 days"
|
||||
},
|
||||
"90": {
|
||||
"$": "90",
|
||||
"description": "90 days"
|
||||
},
|
||||
"career": {
|
||||
"$": "career",
|
||||
"description": "Career"
|
||||
},
|
||||
"custom": {
|
||||
"$": "custom",
|
||||
"description": "Custom range",
|
||||
|
||||
"options": {
|
||||
"start": {
|
||||
"$": "start",
|
||||
"description": "Start in number of days ago from today"
|
||||
},
|
||||
"end": {
|
||||
"$": "end",
|
||||
"description": "End in number of days ago from today"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"options": {
|
||||
"clan": {
|
||||
"$": "clan",
|
||||
"description": "The clan name or tag"
|
||||
},
|
||||
|
||||
"tank": {
|
||||
"$": "tank",
|
||||
"description": "The tank to get stats for"
|
||||
},
|
||||
|
||||
"username": {
|
||||
"$": "username",
|
||||
"description": "The Blitz username of the player"
|
||||
},
|
||||
|
||||
"filters": {
|
||||
"nation": {
|
||||
"$": "nation",
|
||||
"description": "Nation"
|
||||
},
|
||||
"tank_class": {
|
||||
"$": "tank-class",
|
||||
"description": "Tank class"
|
||||
},
|
||||
"tree_type": {
|
||||
"$": "tree-type",
|
||||
"description": "Tree type"
|
||||
}
|
||||
},
|
||||
|
||||
"region": {
|
||||
"$": "region",
|
||||
"description": "Region"
|
||||
},
|
||||
|
||||
"tier": {
|
||||
"$": "tier",
|
||||
"description": "Tier",
|
||||
|
||||
"choices": {
|
||||
"tier": "Tier %s - %s"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"periods": {
|
||||
"career": "Career",
|
||||
"today": "Today",
|
||||
"days": "%s days",
|
||||
"custom": "%s - %s days"
|
||||
},
|
||||
|
||||
"filters": {
|
||||
"none": "No filters",
|
||||
"tier": "Tier %s"
|
||||
},
|
||||
|
||||
"no_data": {
|
||||
"battles_in_period": "No battles played in this period",
|
||||
"battles_in_season": "No battles played in this season",
|
||||
"players_in_period": "No players in this period",
|
||||
"tanks_found": "No tanks found"
|
||||
},
|
||||
|
||||
"buttons": {
|
||||
"refresh": "Refresh"
|
||||
},
|
||||
|
||||
"hero_stats": {
|
||||
"battles": "Battles",
|
||||
"winrate": "Winrate",
|
||||
"damage": "Damage",
|
||||
"damage_ratio": "Damage ratio",
|
||||
"tier": "Tier",
|
||||
"survival": "Survival",
|
||||
"accuracy": "Accuracy",
|
||||
"kills": "Kills"
|
||||
}
|
||||
},
|
||||
|
||||
"commands": {
|
||||
"replay": {
|
||||
"$": "replay",
|
||||
"description": "Display replay results"
|
||||
},
|
||||
|
||||
"research": {
|
||||
"$": "research",
|
||||
"description": "Lists the expenses in researching a line",
|
||||
|
||||
"options": {
|
||||
"target_tank": {
|
||||
"$": "target-tank",
|
||||
"description": "The final tank to research in the line"
|
||||
},
|
||||
"starting_tank": {
|
||||
"$": "starting-tank",
|
||||
"description": "The starting tank in the line (inferred automatically if not provided)"
|
||||
}
|
||||
},
|
||||
|
||||
"body": {
|
||||
"subtitle": "Research",
|
||||
"total": "Total",
|
||||
"research": "Research: %s",
|
||||
"upgrades": "Upgrades: %s",
|
||||
"purchase": "Purchase: %s",
|
||||
"equipment": "Equipment: %s",
|
||||
"estimation": "# This is an estimation!\n\nThis list may include already researched tanks because of the inaccurate information Wargaming provides. Try providing a `starting-tank` from the line when using the command if you can."
|
||||
},
|
||||
|
||||
"errors": {
|
||||
"non_tech_tree": "# %s is not on the tech tree\n\nYou cannot research a premium/collector tank.",
|
||||
"tier_1": "# %s is a tier I\n\nTier I tanks are always unlocked for free for all players.",
|
||||
"already_researched": "# %s is already researched\n\nTry providing a `starting-tank` when using the command to view the totals for a line you have already researched.",
|
||||
"start_end_equal": "# %s was provided twice\n\nMake sure `starting-tank` and `target-tank` are different.",
|
||||
"tanks_not_on_line": "# %s and %s are not on the same line\n\nMake sure `starting-tank` and `target-tank` are on the same tech-tree line.",
|
||||
"unordered": "# %s higher tiered to %s\n\nMake sure to provide %s as the `starting-tank` instead as it is the lower tiered tank."
|
||||
}
|
||||
},
|
||||
|
||||
"about": {
|
||||
"$": "about",
|
||||
"description": "All the info you need about the bot",
|
||||
"subcommands": {
|
||||
"commands": {
|
||||
"$": "commands",
|
||||
"description": "List of all commands and their descriptions",
|
||||
"body": "# Commands\n\nBlitzKit offers the following commands:\n\n"
|
||||
},
|
||||
"embeds": {
|
||||
"$": "embeds",
|
||||
"description": "How embeds work"
|
||||
},
|
||||
"introduction": {
|
||||
"$": "introduction",
|
||||
"description": "About the bot"
|
||||
},
|
||||
"invite": {
|
||||
"$": "invite",
|
||||
"description": "How to invite the bot"
|
||||
},
|
||||
"timezones": {
|
||||
"$": "timezones",
|
||||
"description": "How BlitzKit infers and uses your timezone"
|
||||
},
|
||||
"creators": {
|
||||
"$": "creators",
|
||||
"description": "People who have worked on the bot"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"breakdown": {
|
||||
"$": "breakdown",
|
||||
"description": "A period's breakdown by tanks played",
|
||||
|
||||
"body": {
|
||||
"total": "Total",
|
||||
"battles": "Battles",
|
||||
"wn8": "WN8",
|
||||
"winrate": "Winrate",
|
||||
"damage": "Damage",
|
||||
"unknown_tank": "Unknown tank %s"
|
||||
}
|
||||
},
|
||||
|
||||
"debug": {
|
||||
"$": "debug",
|
||||
"description": "Debug information about the bot",
|
||||
|
||||
"body": {
|
||||
"title": "# Debug\n\n",
|
||||
"version": "Version",
|
||||
"shard": {
|
||||
"$": "Shard",
|
||||
"default": "default"
|
||||
},
|
||||
"uptime": "Uptime"
|
||||
}
|
||||
},
|
||||
|
||||
"evolution": {
|
||||
"$": "evolution",
|
||||
"description": "Evolution of statistics",
|
||||
|
||||
"groups": {
|
||||
"player": {
|
||||
"$": "player",
|
||||
"description": "Player statistics"
|
||||
},
|
||||
|
||||
"tank": {
|
||||
"$": "tank",
|
||||
"description": "Tank statistics"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"inactive": {
|
||||
"$": "inactive",
|
||||
"description": "Lists all inactive players in a clan above a threshold",
|
||||
|
||||
"options": {
|
||||
"threshold": {
|
||||
"$": "threshold",
|
||||
"description": "The number of days inactive (default: %s days)"
|
||||
}
|
||||
},
|
||||
|
||||
"body": {
|
||||
"subtitle": "Inactive for %s+ days",
|
||||
"listing": "%s days"
|
||||
}
|
||||
},
|
||||
|
||||
"full_stats": {
|
||||
"$": "full-stats",
|
||||
"description": "Full in-game statistics",
|
||||
|
||||
"body": {
|
||||
"cards": {
|
||||
"games": {
|
||||
"$": "Games",
|
||||
"winrate": "Winrate",
|
||||
"battles": "Battles",
|
||||
"wins_losses": "Wins / losses"
|
||||
},
|
||||
"efficiency": {
|
||||
"$": "Efficiency",
|
||||
"wn8": "WN8",
|
||||
"survival": "Survival",
|
||||
"accuracy": "Accuracy"
|
||||
},
|
||||
"lethality": {
|
||||
"$": "Lethality",
|
||||
"average_damage": "Average damage",
|
||||
"damage_per_tier": "Damage per tier",
|
||||
"damage_ratio": "Damage ratio",
|
||||
"average_kills": "Average kills"
|
||||
},
|
||||
"miscellaneous": {
|
||||
"$": "Miscellaneous",
|
||||
"average_tier": "Average tier",
|
||||
"average_spots": "Average spots",
|
||||
"average_xp": "Average XP",
|
||||
"kills_to_death_ratio": "Kills to death ratio"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"link": {
|
||||
"$": "link",
|
||||
"description": "Links your Blitz and Discord account",
|
||||
|
||||
"body": {
|
||||
"accounts_linked": "Accounts linked",
|
||||
"no_role_permissions": {
|
||||
"$": "%s failed to verify",
|
||||
"description": "I don't have the permission to manage roles."
|
||||
}
|
||||
},
|
||||
|
||||
"embed": {
|
||||
"title": "Incorrect account?",
|
||||
"description": "Use the command again and select a username from the search results."
|
||||
}
|
||||
},
|
||||
|
||||
"search_clans": {
|
||||
"$": "search-clans",
|
||||
"description": "Search clans",
|
||||
|
||||
"options": {
|
||||
"limit": {
|
||||
"$": "limit",
|
||||
"description": "The max number of clan results (default: %s)"
|
||||
}
|
||||
},
|
||||
|
||||
"body": {
|
||||
"title": "Clan search for %s in region %s",
|
||||
"no_results": "No clans found"
|
||||
}
|
||||
},
|
||||
|
||||
"search_players": {
|
||||
"$": "search-players",
|
||||
"description": "Search players",
|
||||
|
||||
"options": {
|
||||
"limit": {
|
||||
"$": "limit",
|
||||
"description": "The max number of player results (default: %s)"
|
||||
}
|
||||
},
|
||||
|
||||
"body": {
|
||||
"title": "Player search for %s in region %s",
|
||||
"no_results": "No players found"
|
||||
}
|
||||
},
|
||||
|
||||
"rating_leaderboard": {
|
||||
"$": "rating-leaderboard",
|
||||
"description": "Rating battles statistics",
|
||||
|
||||
"subcommands": {
|
||||
"neighbors": {
|
||||
"$": "neighbors",
|
||||
"description": "Neighboring players on the leaderboard"
|
||||
},
|
||||
|
||||
"league": {
|
||||
"$": "league",
|
||||
"description": "Top players of a league"
|
||||
}
|
||||
},
|
||||
|
||||
"options": {
|
||||
"limit": {
|
||||
"$": "limit",
|
||||
"description": "How many neighbors to display (default: %s)"
|
||||
},
|
||||
|
||||
"season": {
|
||||
"$": "season",
|
||||
"description": "Season number (default: current)",
|
||||
|
||||
"choices": {
|
||||
"current": "%s (current)"
|
||||
}
|
||||
},
|
||||
|
||||
"league": {
|
||||
"$": "league",
|
||||
"description": "The league to display"
|
||||
}
|
||||
},
|
||||
|
||||
"body": {
|
||||
"top_players": "Top %s players",
|
||||
"no_participation": "# %s didn't play rating in season %s\n\nThis player did not participate in this season or did not get past calibration.",
|
||||
"no_ongoing_season": "# No ongoing season\n\nThere isn't a currently running rating season.",
|
||||
"deleted_player": "Deleted %s",
|
||||
"neighbors": "Rating neighbors",
|
||||
"more": "+ %s more"
|
||||
}
|
||||
},
|
||||
|
||||
"today": {
|
||||
"$": "today",
|
||||
"description": "Today's played tanks and statistics"
|
||||
},
|
||||
|
||||
"stats": {
|
||||
"$": "stats",
|
||||
"description": "Quick statistics for a period"
|
||||
},
|
||||
|
||||
"owned_tanks": {
|
||||
"$": "owned-tanks",
|
||||
"description": "Shows all own tanks in a tier",
|
||||
|
||||
"body": {
|
||||
"title": "# %s's owned tier %s tanks\n\n"
|
||||
}
|
||||
},
|
||||
|
||||
"permissions": {
|
||||
"$": "permissions",
|
||||
"description": "Checks wether the bot has the required permissions to function",
|
||||
|
||||
"body": {
|
||||
"title": "# Permissions\n\n%s",
|
||||
"view_channels": "View channels: needed to find the message the refresh button was used on",
|
||||
"read_message_history": "Read message history: needed to find the message to refresh",
|
||||
"attach_files": "Attach files: needed to add images to image-based commands",
|
||||
"external_emojis": "External emojis: needed to add national flags and tank class emojis"
|
||||
}
|
||||
},
|
||||
|
||||
"ping": {
|
||||
"$": "ping",
|
||||
"description": "Check wether the bot is alive.",
|
||||
|
||||
"body": {
|
||||
"pong": "Pong 🏓",
|
||||
"pong_with_time": "Pong 🏓 - %sms"
|
||||
},
|
||||
|
||||
"subcommands": {
|
||||
"blitzkit": {
|
||||
"$": "blitzkit",
|
||||
"description": "Ping BlitzKit"
|
||||
},
|
||||
"wotb": {
|
||||
"$": "wotb",
|
||||
"description": "Ping World of Tanks Blitz"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"player_info": {
|
||||
"$": "player-info",
|
||||
"description": "Basic information about a player",
|
||||
|
||||
"body": {
|
||||
"title": "%s's information",
|
||||
"nickname": "Nickname",
|
||||
"battles": "Battles",
|
||||
"winrate": "Winrate",
|
||||
"account_id": "Account ID",
|
||||
"created": "Created",
|
||||
"last_battle": "Last battle"
|
||||
}
|
||||
},
|
||||
|
||||
"rating": {
|
||||
"$": "rating",
|
||||
"description": "Rating player's statistics",
|
||||
|
||||
"subcommands": {
|
||||
"today": {
|
||||
"$": "today",
|
||||
"description": "Today's rating statistics"
|
||||
},
|
||||
"season": {
|
||||
"$": "season",
|
||||
"description": "This season's rating statistics"
|
||||
}
|
||||
},
|
||||
|
||||
"body": {
|
||||
"subtitle": {
|
||||
"today": "Today's rating statistics",
|
||||
"season": "This season's rating statistics"
|
||||
}
|
||||
},
|
||||
|
||||
"errors": {
|
||||
"no_participation": "# %s hasn't played rating\n\nThis player hasn't participated in the rating gamemode this season.",
|
||||
"unrecorded_stats": "# Statistics currently unavailable\n\nWargaming may be currently be facing server downtime. If there is an on-going season, statistics should be available withing 24 hours."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"website": {}
|
||||
}
|
||||
@@ -0,0 +1,491 @@
|
||||
{
|
||||
"common": {
|
||||
"wn8_percentile": {
|
||||
"0": "Muy malo",
|
||||
"1": "Malo",
|
||||
"2": "Inferior al promedio",
|
||||
"3": "Promedio",
|
||||
"4": "Superior al promedio",
|
||||
"5": "Bueno",
|
||||
"6": "Muy bueno",
|
||||
"7": "Genial",
|
||||
"8": "Unicum",
|
||||
"9": "Super unicum"
|
||||
},
|
||||
"nations": {
|
||||
"ussr": "URSS",
|
||||
"germany": "Alemania",
|
||||
"usa": "EE. UU.",
|
||||
"china": "China",
|
||||
"uk": "Reino Unido",
|
||||
"france": "Francia",
|
||||
"japan": "Japón",
|
||||
"european": "Nación europea",
|
||||
"other": "Nación híbrida"
|
||||
},
|
||||
"tank_class_short": {
|
||||
"lightTank": "Ligero",
|
||||
"mediumTank": "Mediano",
|
||||
"heavyTank": "Pesado",
|
||||
"AT-SPG": "Cazacarro"
|
||||
},
|
||||
"tree_type": {
|
||||
"researchable": "Árbol tecnológico",
|
||||
"premium": "Prémium",
|
||||
"collector": "Coleccionista"
|
||||
},
|
||||
"regions": {
|
||||
"normal": {
|
||||
"com": "Norteamérica",
|
||||
"eu": "Europa",
|
||||
"asia": "Asia-Pacífico"
|
||||
},
|
||||
"short": {
|
||||
"com": "NA",
|
||||
"eu": "Europa",
|
||||
"asia": "APAC"
|
||||
}
|
||||
},
|
||||
"leagues": {
|
||||
"diamond": "Diamante",
|
||||
"platinum": "Platino",
|
||||
"gold": "Oro",
|
||||
"silver": "Plata",
|
||||
"bronze": "Bronce"
|
||||
}
|
||||
},
|
||||
"bot": {
|
||||
"common": {
|
||||
"wn8": {
|
||||
"$": "WN8",
|
||||
"very_bad": "Muy malo",
|
||||
"bad": "Malo",
|
||||
"below_average": "Inferior al promedio",
|
||||
"average": "Promedio",
|
||||
"above_average": "Superior al promedio",
|
||||
"good": "Bueno",
|
||||
"very_good": "Muy bueno",
|
||||
"great": "Genial",
|
||||
"unicum": "Unicum",
|
||||
"super_unicum": "Super unicum"
|
||||
},
|
||||
"subcommands": {
|
||||
"today": {
|
||||
"$": "hoy",
|
||||
"description": "Hoy"
|
||||
},
|
||||
"30": {
|
||||
"$": "30",
|
||||
"description": "30 días"
|
||||
},
|
||||
"60": {
|
||||
"$": "60",
|
||||
"description": "60 días"
|
||||
},
|
||||
"90": {
|
||||
"$": "90",
|
||||
"description": "90 días"
|
||||
},
|
||||
"career": {
|
||||
"$": "carrera",
|
||||
"description": "Carrera"
|
||||
},
|
||||
"custom": {
|
||||
"$": "personalizado",
|
||||
"description": "Rango personalizado",
|
||||
"options": {
|
||||
"start": {
|
||||
"$": "comienzo",
|
||||
"description": "Comenzar en cantidad de días pasados desde hoy"
|
||||
},
|
||||
"end": {
|
||||
"$": "fin",
|
||||
"description": "Terminar en cantidad de días pasados desde hoy"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"clan": {
|
||||
"$": "clan",
|
||||
"description": "El nombre o etiqueta del clan"
|
||||
},
|
||||
"tank": {
|
||||
"$": "tanque",
|
||||
"description": "El tanque al cual conseguirle estadísticas"
|
||||
},
|
||||
"username": {
|
||||
"$": "usuario",
|
||||
"description": "El nombre de usuario de Blitz"
|
||||
},
|
||||
"filters": {
|
||||
"nation": {
|
||||
"$": "nación",
|
||||
"description": "Nación"
|
||||
},
|
||||
"tank_class": {
|
||||
"$": "clase-de-tanque",
|
||||
"description": "Clase de tanque"
|
||||
},
|
||||
"tree_type": {
|
||||
"$": "tipo-de-árbol",
|
||||
"description": "Tipo de árbol"
|
||||
}
|
||||
},
|
||||
"region": {
|
||||
"$": "región",
|
||||
"description": "Región"
|
||||
},
|
||||
"tier": {
|
||||
"$": "nivel",
|
||||
"description": "Nivel",
|
||||
"choices": {
|
||||
"tier": "Nivel %s - %s"
|
||||
}
|
||||
}
|
||||
},
|
||||
"periods": {
|
||||
"career": "Carrera",
|
||||
"today": "Hoy",
|
||||
"days": "%s días",
|
||||
"custom": "%s - %s días"
|
||||
},
|
||||
"filters": {
|
||||
"none": "Sin filtros",
|
||||
"tier": "Nivel %s"
|
||||
},
|
||||
"no_data": {
|
||||
"battles_in_period": "No hay batallas jugadas en este período",
|
||||
"battles_in_season": "No hay batallas jugadas en esta temporada",
|
||||
"players_in_period": "No hay jugadores en este período",
|
||||
"tanks_found": "No se encontraron tanques"
|
||||
},
|
||||
"buttons": {
|
||||
"refresh": "Actualizar"
|
||||
},
|
||||
"errors": {
|
||||
"clan_not_found": "# No se pudo encontrar el clan\nNo se pudo encontrar \"%s\". Prueba seleccionando un clan de los resultados de búsqueda.",
|
||||
"player_not_found": "# No se pudo encontrar el usuario\nNo pude encontrar al usuario \"%s\". Prueba eligiendo un usuario de los resultados de búsqueda, escribiendo un nombre de usuario aceptable o usando el comando `/vincular`.",
|
||||
"player_not_linked": "# No sé quién eres\nUsa el comando `/vincular` para comenzar.",
|
||||
"tank_name_not_found": "# No se pudo encontrar el tanque\nNo se pudo encontrar el tanque con el nombre \"%s\".",
|
||||
"tank_id_not_found": "# Tanque no encontrado\nNo se pudo encontrar al tanque del ID \"%s\". Prueba escribiendo el nombre del tanque en vez de un número.",
|
||||
"no_tank_stats": "# No hay estadísticas de tanque disponibles\nEste jugador no tiene estadísticas disponibles. Este podría no ser el jugador que estás buscando.",
|
||||
"get_help": "Servidor de ayuda de Discord",
|
||||
"uncaught_error": "# ¡Blitzkrieg sufrió un error!\nLo sentimos mucho. Siéntete libre de [unirte al servidor oficial de Discord](https://discord.gg/nDt7AjGJQH) para obtener ayuda.",
|
||||
"preview": "# Este comando es una vista previa\n\nSolo puedes acceder a este comando en [el servidor oficial de Discord](https://discord.gg/nDt7AjGJQH). Generalmente este comando estará disponible pronto."
|
||||
},
|
||||
"hero_stats": {
|
||||
"battles": "Batallas",
|
||||
"winrate": "Tasa de victorias",
|
||||
"damage": "Daño",
|
||||
"damage_ratio": "Relación de daño",
|
||||
"tier": "Nivel",
|
||||
"survival": "Supervivencia",
|
||||
"accuracy": "Precisión",
|
||||
"kills": "Bajas"
|
||||
}
|
||||
},
|
||||
"commands": {
|
||||
"research": {
|
||||
"$": "investigar",
|
||||
"description": "Enumera los gastos por investigar una línea",
|
||||
"options": {
|
||||
"target_tank": {
|
||||
"$": "tanque-objetivo",
|
||||
"description": "El último tanque a investigar en la línea"
|
||||
},
|
||||
"starting_tank": {
|
||||
"$": "tanque-inicial",
|
||||
"description": "El tanque inicial en la línea (se deduce automáticamente si no se proporciona)"
|
||||
}
|
||||
},
|
||||
"body": {
|
||||
"subtitle": "Investigar",
|
||||
"total": "Total",
|
||||
"research": "Investigar: %s",
|
||||
"upgrades": "Mejoras: %s",
|
||||
"purchase": "Comprar: %s",
|
||||
"equipment": "Equipamiento: %s",
|
||||
"estimation": "# ¡Esto es una estimación!\n\nEsta lista podría incluir tanques ya investigados debido a la información errónea que proporciona Wargaming. Si puedes, prueba proporcionando un `tanque-inicial` de la línea al usar el comando."
|
||||
},
|
||||
"errors": {
|
||||
"non_tech_tree": "# %s no está en el árbol tecnológico\n\nNo puedes investigar un tanque prémium o coleccionista.",
|
||||
"tier_1": "# %s es un nivel I\n\nLos tanque de nivel I están siempre desbloqueados gratuitamente para todos los jugadores.",
|
||||
"already_researched": "# %s ya está investigado\n\nPrueba proporcionando un `tanque-inicial` al usar el comando para ver los totales para una línea que ya has investigado.",
|
||||
"start_end_equal": "# %s fue proporcionado dos veces\n\nAsegúrate de que `tanque-inicial` y `tanque-objetivo` son diferentes.",
|
||||
"tanks_not_on_line": "# %s y %s no están en la misma línea\n\nAsegúrate de que `tanque-inicial` y `tanque-objetivo` están en la misma línea del árbol tecnológico.",
|
||||
"unordered": "# %s de nivel superior a %s\n\nAsegúrate de proporcionar %s como el `tanque-inicial` en su lugar ya que es el tanque de nivel inferior."
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
"$": "sobre",
|
||||
"description": "Toda la información que necesitas sobre el bot",
|
||||
"subcommands": {
|
||||
"commands": {
|
||||
"$": "comandos",
|
||||
"description": "Lista de todos los comandos y sus descripciones",
|
||||
"body": "# Comandos\n\nBlitzkrieg ofrece los siguientes comandos:\n\n"
|
||||
},
|
||||
"embeds": {
|
||||
"$": "embeds",
|
||||
"description": "Cómo funcionan los embeds"
|
||||
},
|
||||
"introduction": {
|
||||
"$": "introducción",
|
||||
"description": "Sobre el bot"
|
||||
},
|
||||
"invite": {
|
||||
"$": "invitar",
|
||||
"description": "Cómo invitar al bot"
|
||||
},
|
||||
"timezones": {
|
||||
"$": "zonas-horarias",
|
||||
"description": "Cómo Blitzkrieg infiere y utiliza tu zona horaria"
|
||||
},
|
||||
"creators": {
|
||||
"$": "creadores",
|
||||
"description": "Personas que han trabajado en el bot"
|
||||
}
|
||||
}
|
||||
},
|
||||
"breakdown": {
|
||||
"$": "resumen",
|
||||
"description": "Resumen de un período por tanques jugados",
|
||||
"body": {
|
||||
"total": "Total",
|
||||
"battles": "Batallas",
|
||||
"wn8": "WN8",
|
||||
"winrate": "Tasa de victorias",
|
||||
"damage": "Daño",
|
||||
"unknown_tank": "Tanque desconocido %s"
|
||||
}
|
||||
},
|
||||
"debug": {
|
||||
"$": "depurar",
|
||||
"description": "Muestra más información sobre el bot",
|
||||
"body": {
|
||||
"title": "# Depuración\n\n",
|
||||
"version": "Versión",
|
||||
"shard": {
|
||||
"$": "Partición",
|
||||
"default": "predeterminado"
|
||||
},
|
||||
"uptime": "Tiempo en línea"
|
||||
}
|
||||
},
|
||||
"evolution": {
|
||||
"$": "evolución",
|
||||
"description": "Evolución de estadísticas",
|
||||
"groups": {
|
||||
"player": {
|
||||
"$": "jugador",
|
||||
"description": "Estadísticas del jugador"
|
||||
},
|
||||
"tank": {
|
||||
"$": "tanque",
|
||||
"description": "Estadísticas del tanque"
|
||||
}
|
||||
}
|
||||
},
|
||||
"inactive": {
|
||||
"$": "inactivo",
|
||||
"description": "Enumera a todos los jugadores inactivos en un clan por encima de un umbral",
|
||||
"options": {
|
||||
"threshold": {
|
||||
"$": "umbral",
|
||||
"description": "El número de días inactivo (predeterminado: %s días)"
|
||||
}
|
||||
},
|
||||
"body": {
|
||||
"subtitle": "Inactivo por %s+ días",
|
||||
"listing": "%s días"
|
||||
}
|
||||
},
|
||||
"full_stats": {
|
||||
"$": "estadísticas-completas",
|
||||
"description": "Estadísticas completas del juego",
|
||||
"body": {
|
||||
"cards": {
|
||||
"games": {
|
||||
"$": "Partidas",
|
||||
"winrate": "Tasa de victorias",
|
||||
"battles": "Batallas",
|
||||
"wins_losses": "Victorias / derrotas"
|
||||
},
|
||||
"efficiency": {
|
||||
"$": "Eficiencia",
|
||||
"wn8": "WN8",
|
||||
"survival": "Supervivencia",
|
||||
"accuracy": "Precisión"
|
||||
},
|
||||
"lethality": {
|
||||
"$": "Letalidad",
|
||||
"average_damage": "Daño promedio",
|
||||
"damage_per_tier": "Daño por nivel",
|
||||
"damage_ratio": "Relación de daño",
|
||||
"average_kills": "Promedio de bajas"
|
||||
},
|
||||
"miscellaneous": {
|
||||
"$": "Misceláneo",
|
||||
"average_tier": "Nivel promedio",
|
||||
"average_spots": "Promedio de detecciones",
|
||||
"average_xp": "Promedio de XP",
|
||||
"kills_to_death_ratio": "Relación bajas-muertes"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"link": {
|
||||
"$": "vincular",
|
||||
"description": "Vincula tu cuenta de Blitz y Discord",
|
||||
"body": {
|
||||
"accounts_linked": "Cuentas vinculadas",
|
||||
"no_role_permissions": {
|
||||
"$": "%s no se pudo verificar",
|
||||
"description": "No tengo permiso para administrar roles."
|
||||
}
|
||||
},
|
||||
"embed": {
|
||||
"title": "¿Cuenta incorrecta?",
|
||||
"description": "Usa el comando de nuevo y selecciona un usuario de los resultados de búsqueda."
|
||||
}
|
||||
},
|
||||
"search_clans": {
|
||||
"$": "buscar-clanes",
|
||||
"description": "Buscar clanes",
|
||||
"options": {
|
||||
"limit": {
|
||||
"$": "límite",
|
||||
"description": "El número máximo de resultados de clanes (predeterminado: %s)"
|
||||
}
|
||||
},
|
||||
"body": {
|
||||
"title": "Búsqueda del clan %s en la región %s",
|
||||
"no_results": "No se encontraron clanes"
|
||||
}
|
||||
},
|
||||
"search_players": {
|
||||
"$": "buscar-jugadores",
|
||||
"description": "Buscar jugadores",
|
||||
"options": {
|
||||
"limit": {
|
||||
"$": "límite",
|
||||
"description": "El número máximo para resultados de jugador (predeterminado: %s)"
|
||||
}
|
||||
},
|
||||
"body": {
|
||||
"title": "Búsqueda del jugador %s en la región %s",
|
||||
"no_results": "No se encontraron jugadores"
|
||||
}
|
||||
},
|
||||
"rating_leaderboard": {
|
||||
"$": "rating-leaderboard",
|
||||
"description": "Rating battles statistics",
|
||||
"subcommands": {
|
||||
"neighbors": {
|
||||
"$": "vecinos",
|
||||
"description": "Neighboring players on the leaderboard"
|
||||
},
|
||||
"league": {
|
||||
"$": "liga",
|
||||
"description": "Mejores jugadores de una liga"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"limit": {
|
||||
"$": "límite",
|
||||
"description": "Cuántos vecinos a mostrar (predeterminado: %s)"
|
||||
},
|
||||
"season": {
|
||||
"$": "temporada",
|
||||
"description": "Número de temporada (predeterminado: actual)",
|
||||
"choices": {
|
||||
"current": "%s (actual)"
|
||||
}
|
||||
},
|
||||
"league": {
|
||||
"$": "liga",
|
||||
"description": "La liga a mostrar"
|
||||
}
|
||||
},
|
||||
"body": {
|
||||
"top_players": "Mejores %s jugadores",
|
||||
"no_participation": "# %s didn't play rating in season %s\n\nThis player did not participate in this season or did not get past calibration.",
|
||||
"no_ongoing_season": "# No ongoing season\n\nThere isn't a currently running rating season.",
|
||||
"deleted_player": "%s eliminado",
|
||||
"neighbors": "Rating neighbors",
|
||||
"more": "+ %s más"
|
||||
}
|
||||
},
|
||||
"today": {
|
||||
"$": "hoy",
|
||||
"description": "Tanques jugados hoy y estadísticas"
|
||||
},
|
||||
"stats": {
|
||||
"$": "estadísticas",
|
||||
"description": "Estadísticas rápidas para un período"
|
||||
},
|
||||
"owned_tanks": {
|
||||
"$": "tanques-propios",
|
||||
"description": "Muestra todos los tanques propios en un nivel",
|
||||
"body": {
|
||||
"title": "# Tanques de %s de nivel %s\n\n"
|
||||
}
|
||||
},
|
||||
"permissions": {
|
||||
"$": "permisos",
|
||||
"description": "Comprueba si el bot tiene los permisos requeridos para funcionar",
|
||||
"body": {
|
||||
"title": "# Permisos\n\n%s",
|
||||
"view_channels": "Ver canales: necesario para encontrar el mensaje en el cual el botón \"actualizar\" fue usado",
|
||||
"read_message_history": "Leer historial de mensajes: necesario para encontrar el mensaje a actualizar",
|
||||
"attach_files": "Adjuntar archivos: necesario para añadir imágenes a los comandos basados en estas",
|
||||
"external_emojis": "Emoticonos externos: necesario para añadir emoticonos de banderas nacionales y clases de tanque"
|
||||
}
|
||||
},
|
||||
"ping": {
|
||||
"$": "ping",
|
||||
"description": "Comprueba si el bot está vivo.",
|
||||
"body": {
|
||||
"pong": "Pong 🏓",
|
||||
"pong_with_time": "Pong 🏓 - %sms"
|
||||
},
|
||||
"subcommands": {
|
||||
"blitzkrieg": {
|
||||
"$": "blitzkrieg",
|
||||
"description": "Hacerle un ping a Blitzkrieg"
|
||||
},
|
||||
"wotb": {
|
||||
"$": "wotb",
|
||||
"description": "Hacerle un ping a World of Tanks Blitz"
|
||||
}
|
||||
}
|
||||
},
|
||||
"player_info": {
|
||||
"$": "info-jugador",
|
||||
"description": "Información básica sobre un jugador",
|
||||
"body": {
|
||||
"title": "Información de %s",
|
||||
"nickname": "Apodo",
|
||||
"battles": "Batallas",
|
||||
"winrate": "Tasa de victorias",
|
||||
"account_id": "ID de cuenta",
|
||||
"created": "Creado",
|
||||
"last_battle": "Última batalla"
|
||||
}
|
||||
},
|
||||
"rating": {
|
||||
"$": "rating-session",
|
||||
"description": "Rating player's statistics",
|
||||
"body": {
|
||||
"subtitle": "Today's rating statistics"
|
||||
},
|
||||
"errors": {
|
||||
"no_participation": "# %s hasn't played rating\n\nThis player hasn't participated in the rating gamemode this season.",
|
||||
"unrecorded_stats": "# Estadísticas no disponibles actualmente\n\nWargaming podría estar sufriendo una caída del servidor. Si hay alguna temporada en curso, las estadísticas deberían estar disponibles en 24 horas."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"website": {}
|
||||
}
|
||||
@@ -0,0 +1,491 @@
|
||||
{
|
||||
"common": {
|
||||
"wn8_percentile": {
|
||||
"0": "Jako loše",
|
||||
"1": "Loše",
|
||||
"2": "Ispod prosečnog",
|
||||
"3": "Prosečno",
|
||||
"4": "Nad prosečno",
|
||||
"5": "Dobro",
|
||||
"6": "Jako dobro",
|
||||
"7": "Super",
|
||||
"8": "Legendarno",
|
||||
"9": "Super Legendarno"
|
||||
},
|
||||
"nations": {
|
||||
"ussr": "S.S.S.R.",
|
||||
"germany": "Nemačka",
|
||||
"usa": "S.A.D.",
|
||||
"china": "Kina",
|
||||
"uk": "Vel. Brit.",
|
||||
"france": "Francuska",
|
||||
"japan": "Japan",
|
||||
"european": "Evropska Unija",
|
||||
"other": "Hibridna nacija"
|
||||
},
|
||||
"tank_class_short": {
|
||||
"lightTank": "Svetlo",
|
||||
"mediumTank": "Prosečno",
|
||||
"heavyTank": "Teško",
|
||||
"AT-SPG": "TD"
|
||||
},
|
||||
"tree_type": {
|
||||
"researchable": "Razvojna tabla",
|
||||
"premium": "Premijum",
|
||||
"collector": "Kolektor"
|
||||
},
|
||||
"regions": {
|
||||
"normal": {
|
||||
"com": "Severna Amerika",
|
||||
"eu": "Evropa",
|
||||
"asia": "Azija-Pasifik"
|
||||
},
|
||||
"short": {
|
||||
"com": "NA",
|
||||
"eu": "EU",
|
||||
"asia": "APAC"
|
||||
}
|
||||
},
|
||||
"leagues": {
|
||||
"diamond": "Dijamant",
|
||||
"platinum": "Platina",
|
||||
"gold": "Zlato",
|
||||
"silver": "Srebro",
|
||||
"bronze": "Bronza"
|
||||
}
|
||||
},
|
||||
"bot": {
|
||||
"common": {
|
||||
"wn8": {
|
||||
"$": "WN8",
|
||||
"very_bad": "Jako loše",
|
||||
"bad": "Loše",
|
||||
"below_average": "Ispod prosečnog",
|
||||
"average": "Prosečno",
|
||||
"above_average": "Nad prosečno",
|
||||
"good": "Dobro",
|
||||
"very_good": "Jako dobro",
|
||||
"great": "Super",
|
||||
"unicum": "Legendarno",
|
||||
"super_unicum": "Super Legendarno"
|
||||
},
|
||||
"subcommands": {
|
||||
"today": {
|
||||
"$": "danas",
|
||||
"description": "Danas"
|
||||
},
|
||||
"30": {
|
||||
"$": "30",
|
||||
"description": "30 dana"
|
||||
},
|
||||
"60": {
|
||||
"$": "60",
|
||||
"description": "60 dana"
|
||||
},
|
||||
"90": {
|
||||
"$": "90",
|
||||
"description": "90 dana"
|
||||
},
|
||||
"career": {
|
||||
"$": "karijera",
|
||||
"description": "Karijera"
|
||||
},
|
||||
"custom": {
|
||||
"$": "proizvoljno",
|
||||
"description": "Proizvoljna daljina",
|
||||
"options": {
|
||||
"start": {
|
||||
"$": "kreni",
|
||||
"description": "Start in number of days ago from today"
|
||||
},
|
||||
"end": {
|
||||
"$": "kraj",
|
||||
"description": "End in number of days ago from today"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"clan": {
|
||||
"$": "klan",
|
||||
"description": "The clan name or tag"
|
||||
},
|
||||
"tank": {
|
||||
"$": "tank",
|
||||
"description": "The tank to get stats for"
|
||||
},
|
||||
"username": {
|
||||
"$": "username",
|
||||
"description": "The Blitz username of the player"
|
||||
},
|
||||
"filters": {
|
||||
"nation": {
|
||||
"$": "nation",
|
||||
"description": "Nation"
|
||||
},
|
||||
"tank_class": {
|
||||
"$": "tank-class",
|
||||
"description": "Tank class"
|
||||
},
|
||||
"tree_type": {
|
||||
"$": "tree-type",
|
||||
"description": "Tree type"
|
||||
}
|
||||
},
|
||||
"region": {
|
||||
"$": "region",
|
||||
"description": "Region"
|
||||
},
|
||||
"tier": {
|
||||
"$": "tier",
|
||||
"description": "Tier",
|
||||
"choices": {
|
||||
"tier": "Tier %s - %s"
|
||||
}
|
||||
}
|
||||
},
|
||||
"periods": {
|
||||
"career": "Career",
|
||||
"today": "Today",
|
||||
"days": "%s days",
|
||||
"custom": "%s - %s days"
|
||||
},
|
||||
"filters": {
|
||||
"none": "No filters",
|
||||
"tier": "Tier %s"
|
||||
},
|
||||
"no_data": {
|
||||
"battles_in_period": "No battles played in this period",
|
||||
"battles_in_season": "No battles played in this season",
|
||||
"players_in_period": "No players in this period",
|
||||
"tanks_found": "No tanks found"
|
||||
},
|
||||
"buttons": {
|
||||
"refresh": "Refresh"
|
||||
},
|
||||
"errors": {
|
||||
"clan_not_found": "# Could not find clan\nCouldn't find \"%s\". Try selecting a clan from the search result.",
|
||||
"player_not_found": "# Could not find user\nI couldn't find user \"%s\". Try picking an user from the search result, typing in a valid username, or using the `/link` command.",
|
||||
"player_not_linked": "# I don't know who you are\nUse the `/link` command to get started.",
|
||||
"tank_name_not_found": "# Tank not found\nCould not find tank by the name \"%s\".",
|
||||
"tank_id_not_found": "# Tank not found\nCould not find tank by the ID \"%s\". Try typing the name of the tank instead of a number.",
|
||||
"no_tank_stats": "# No tank stats available\nThis player doesn't have any stats available. This may not be the player you are looking for.",
|
||||
"get_help": "Help Discord server",
|
||||
"uncaught_error": "# Blitzkrieg ran into an error!\nWe're so sorry about this. Feel free to [join the official Discord server](https://discord.gg/nDt7AjGJQH) to get help.",
|
||||
"preview": "# This command is in preview\n\nYou can only access this command in [the official Discord server](https://discord.gg/nDt7AjGJQH). The command will be generally available soon."
|
||||
},
|
||||
"hero_stats": {
|
||||
"battles": "Battles",
|
||||
"winrate": "Winrate",
|
||||
"damage": "Damage",
|
||||
"damage_ratio": "Damage ratio",
|
||||
"tier": "Tier",
|
||||
"survival": "Survival",
|
||||
"accuracy": "Accuracy",
|
||||
"kills": "Kills"
|
||||
}
|
||||
},
|
||||
"commands": {
|
||||
"research": {
|
||||
"$": "research",
|
||||
"description": "Lists the expenses in researching a line",
|
||||
"options": {
|
||||
"target_tank": {
|
||||
"$": "target-tank",
|
||||
"description": "The final tank to research in the line"
|
||||
},
|
||||
"starting_tank": {
|
||||
"$": "starting-tank",
|
||||
"description": "The starting tank in the line (inferred automatically if not provided)"
|
||||
}
|
||||
},
|
||||
"body": {
|
||||
"subtitle": "Research",
|
||||
"total": "Total",
|
||||
"research": "Research: %s",
|
||||
"upgrades": "Upgrades: %s",
|
||||
"purchase": "Purchase: %s",
|
||||
"equipment": "Equipment: %s",
|
||||
"estimation": "# This is an estimation!\n\nThis list may include already researched tanks because of the inaccurate information Wargaming provides. Try providing a `starting-tank` from the line when using the command if you can."
|
||||
},
|
||||
"errors": {
|
||||
"non_tech_tree": "# %s is not on the tech tree\n\nYou cannot research a premium/collector tank.",
|
||||
"tier_1": "# %s is a tier I\n\nTier I tanks are always unlocked for free for all players.",
|
||||
"already_researched": "# %s is already researched\n\nTry providing a `starting-tank` when using the command to view the totals for a line you have already researched.",
|
||||
"start_end_equal": "# %s was provided twice\n\nMake sure `starting-tank` and `target-tank` are different.",
|
||||
"tanks_not_on_line": "# %s and %s are not on the same line\n\nMake sure `starting-tank` and `target-tank` are on the same tech-tree line.",
|
||||
"unordered": "# %s higher tiered to %s\n\nMake sure to provide %s as the `starting-tank` instead as it is the lower tiered tank."
|
||||
}
|
||||
},
|
||||
"about": {
|
||||
"$": "about",
|
||||
"description": "All the info you need about the bot",
|
||||
"subcommands": {
|
||||
"commands": {
|
||||
"$": "commands",
|
||||
"description": "List of all commands and their descriptions",
|
||||
"body": "# Commands\n\nBlitzkrieg offers the following commands:\n\n"
|
||||
},
|
||||
"embeds": {
|
||||
"$": "embeds",
|
||||
"description": "Kako embed radi"
|
||||
},
|
||||
"introduction": {
|
||||
"$": "uvod",
|
||||
"description": "O bot-u"
|
||||
},
|
||||
"invite": {
|
||||
"$": "pozovi",
|
||||
"description": "Kako pozvati robota"
|
||||
},
|
||||
"timezones": {
|
||||
"$": "vremenske zone",
|
||||
"description": "Kako \"Blitzkrieg\" koristi podatke o tvojoj vremenskoj zoni"
|
||||
},
|
||||
"creators": {
|
||||
"$": "stvarači",
|
||||
"description": "Ljudi koji su radili na robotu"
|
||||
}
|
||||
}
|
||||
},
|
||||
"breakdown": {
|
||||
"$": "analiza",
|
||||
"description": "A period's breakdown by tanks played",
|
||||
"body": {
|
||||
"total": "Total",
|
||||
"battles": "Borbe",
|
||||
"wn8": "WN8",
|
||||
"winrate": "Procenat pobede",
|
||||
"damage": "Šteta",
|
||||
"unknown_tank": "Ne poznat tenk %s"
|
||||
}
|
||||
},
|
||||
"debug": {
|
||||
"$": "odklanjanje-grešaka",
|
||||
"description": "Debug information about the bot",
|
||||
"body": {
|
||||
"title": "# Debug\n\n",
|
||||
"version": "Version",
|
||||
"shard": {
|
||||
"$": "Shard",
|
||||
"default": "default"
|
||||
},
|
||||
"uptime": "Uptime"
|
||||
}
|
||||
},
|
||||
"evolution": {
|
||||
"$": "evolution",
|
||||
"description": "Evolution of statistics",
|
||||
"groups": {
|
||||
"player": {
|
||||
"$": "player",
|
||||
"description": "Player statistics"
|
||||
},
|
||||
"tank": {
|
||||
"$": "tank",
|
||||
"description": "Tank statistics"
|
||||
}
|
||||
}
|
||||
},
|
||||
"inactive": {
|
||||
"$": "inactive",
|
||||
"description": "Lists all inactive players in a clan above a threshold",
|
||||
"options": {
|
||||
"threshold": {
|
||||
"$": "threshold",
|
||||
"description": "The number of days inactive (default: %s days)"
|
||||
}
|
||||
},
|
||||
"body": {
|
||||
"subtitle": "Inactive for %s+ days",
|
||||
"listing": "%s days"
|
||||
}
|
||||
},
|
||||
"full_stats": {
|
||||
"$": "full-stats",
|
||||
"description": "Full in-game statistics",
|
||||
"body": {
|
||||
"cards": {
|
||||
"games": {
|
||||
"$": "Games",
|
||||
"winrate": "Winrate",
|
||||
"battles": "Battles",
|
||||
"wins_losses": "Wins / losses"
|
||||
},
|
||||
"efficiency": {
|
||||
"$": "Efficiency",
|
||||
"wn8": "WN8",
|
||||
"survival": "Survival",
|
||||
"accuracy": "Accuracy"
|
||||
},
|
||||
"lethality": {
|
||||
"$": "Lethality",
|
||||
"average_damage": "Average damage",
|
||||
"damage_per_tier": "Damage per tier",
|
||||
"damage_ratio": "Damage ratio",
|
||||
"average_kills": "Average kills"
|
||||
},
|
||||
"miscellaneous": {
|
||||
"$": "Miscellaneous",
|
||||
"average_tier": "Average tier",
|
||||
"average_spots": "Average spots",
|
||||
"average_xp": "Average XP",
|
||||
"kills_to_death_ratio": "Kills to death ratio"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"link": {
|
||||
"$": "link",
|
||||
"description": "Links your Blitz and Discord account",
|
||||
"body": {
|
||||
"accounts_linked": "Accounts linked",
|
||||
"no_role_permissions": {
|
||||
"$": "%s failed to verify",
|
||||
"description": "I don't have the permission to manage roles."
|
||||
}
|
||||
},
|
||||
"embed": {
|
||||
"title": "Incorrect account?",
|
||||
"description": "Use the command again and select a username from the search results."
|
||||
}
|
||||
},
|
||||
"search_clans": {
|
||||
"$": "search-clans",
|
||||
"description": "Search clans",
|
||||
"options": {
|
||||
"limit": {
|
||||
"$": "limit",
|
||||
"description": "The max number of clan results (default: %s)"
|
||||
}
|
||||
},
|
||||
"body": {
|
||||
"title": "Clan search for %s in region %s",
|
||||
"no_results": "No clans found"
|
||||
}
|
||||
},
|
||||
"search_players": {
|
||||
"$": "search-players",
|
||||
"description": "Search players",
|
||||
"options": {
|
||||
"limit": {
|
||||
"$": "limit",
|
||||
"description": "The max number of player results (default: %s)"
|
||||
}
|
||||
},
|
||||
"body": {
|
||||
"title": "Player search for %s in region %s",
|
||||
"no_results": "No players found"
|
||||
}
|
||||
},
|
||||
"rating_leaderboard": {
|
||||
"$": "rating-leaderboard",
|
||||
"description": "Rating battles statistics",
|
||||
"subcommands": {
|
||||
"neighbors": {
|
||||
"$": "neighbors",
|
||||
"description": "Neighboring players on the leaderboard"
|
||||
},
|
||||
"league": {
|
||||
"$": "league",
|
||||
"description": "Top players of a league"
|
||||
}
|
||||
},
|
||||
"options": {
|
||||
"limit": {
|
||||
"$": "limit",
|
||||
"description": "How many neighbors to display (default: %s)"
|
||||
},
|
||||
"season": {
|
||||
"$": "season",
|
||||
"description": "Season number (default: current)",
|
||||
"choices": {
|
||||
"current": "%s (current)"
|
||||
}
|
||||
},
|
||||
"league": {
|
||||
"$": "league",
|
||||
"description": "The league to display"
|
||||
}
|
||||
},
|
||||
"body": {
|
||||
"top_players": "Top %s players",
|
||||
"no_participation": "# %s didn't play rating in season %s\n\nThis player did not participate in this season or did not get past calibration.",
|
||||
"no_ongoing_season": "# No ongoing season\n\nThere isn't a currently running rating season.",
|
||||
"deleted_player": "Deleted %s",
|
||||
"neighbors": "Rating neighbors",
|
||||
"more": "+ %s more"
|
||||
}
|
||||
},
|
||||
"today": {
|
||||
"$": "today",
|
||||
"description": "Today's played tanks and statistics"
|
||||
},
|
||||
"stats": {
|
||||
"$": "stats",
|
||||
"description": "Quick statistics for a period"
|
||||
},
|
||||
"owned_tanks": {
|
||||
"$": "owned-tanks",
|
||||
"description": "Shows all own tanks in a tier",
|
||||
"body": {
|
||||
"title": "# %s's owned tier %s tanks\n\n"
|
||||
}
|
||||
},
|
||||
"permissions": {
|
||||
"$": "permissions",
|
||||
"description": "Checks wether the bot has the required permissions to function",
|
||||
"body": {
|
||||
"title": "# Permissions\n\n%s",
|
||||
"view_channels": "View channels: needed to find the message the refresh button was used on",
|
||||
"read_message_history": "Read message history: needed to find the message to refresh",
|
||||
"attach_files": "Attach files: needed to add images to image-based commands",
|
||||
"external_emojis": "External emojis: needed to add national flags and tank class emojis"
|
||||
}
|
||||
},
|
||||
"ping": {
|
||||
"$": "ping",
|
||||
"description": "Check wether the bot is alive.",
|
||||
"body": {
|
||||
"pong": "Pong 🏓",
|
||||
"pong_with_time": "Pong 🏓 - %sms"
|
||||
},
|
||||
"subcommands": {
|
||||
"blitzkrieg": {
|
||||
"$": "blitzkrieg",
|
||||
"description": "Ping Blitzkrieg"
|
||||
},
|
||||
"wotb": {
|
||||
"$": "wotb",
|
||||
"description": "Ping World of Tanks Blitz"
|
||||
}
|
||||
}
|
||||
},
|
||||
"player_info": {
|
||||
"$": "player-info",
|
||||
"description": "Basic information about a player",
|
||||
"body": {
|
||||
"title": "%s's information",
|
||||
"nickname": "Nickname",
|
||||
"battles": "Battles",
|
||||
"winrate": "Winrate",
|
||||
"account_id": "Account ID",
|
||||
"created": "Created",
|
||||
"last_battle": "Last battle"
|
||||
}
|
||||
},
|
||||
"rating": {
|
||||
"$": "rating-session",
|
||||
"description": "Rating player's statistics",
|
||||
"body": {
|
||||
"subtitle": "Today's rating statistics"
|
||||
},
|
||||
"errors": {
|
||||
"no_participation": "# %s hasn't played rating\n\nThis player hasn't participated in the rating gamemode this season.",
|
||||
"unrecorded_stats": "# Statistics currently unavailable\n\nWargaming may be currently be facing server downtime. If there is an on-going season, statistics should be available withing 24 hours."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"website": {}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
export const TREE_TYPES = ['researchable', 'premium', 'collector'] as const;
|
||||
|
||||
export const TANK_CLASSES = [
|
||||
'lightTank',
|
||||
'mediumTank',
|
||||
'heavyTank',
|
||||
'AT-SPG',
|
||||
] as const;
|
||||
@@ -1 +1,3 @@
|
||||
export * from './constants';
|
||||
export * from './idToRegion';
|
||||
export * from './resolveNearPenetration';
|
||||
@@ -0,0 +1,5 @@
|
||||
import { Vector2Tuple } from 'three';
|
||||
|
||||
export function resolveNearPenetration(penetration: number | Vector2Tuple) {
|
||||
return typeof penetration === 'number' ? penetration : penetration[0];
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
import { assertSecret } from '@blitzkit/core/src/blitzkit/assertSecret';
|
||||
import { ASSETS_REPO } from '../../../../src/constants/assets';
|
||||
|
||||
export function asset(path: string) {
|
||||
return `https://raw.githubusercontent.com/tresabhi/${ASSETS_REPO}/${assertSecret(
|
||||
process.env.NEXT_PUBLIC_ASSET_BRANCH,
|
||||
)}/${path}`;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import { asset } from '@blitzkit/core/src/blitzkit/asset';
|
||||
import { fetchCdonLz4 } from '@blitzkit/core/src/blitzkit/fetchCdonLz4';
|
||||
|
||||
export type CamouflageDefinitions = Record<
|
||||
number,
|
||||
{
|
||||
id: number;
|
||||
name: string;
|
||||
tankName?: string;
|
||||
tankNameFull?: string;
|
||||
}
|
||||
>;
|
||||
|
||||
export const camouflageDefinitions = fetchCdonLz4<CamouflageDefinitions>(
|
||||
asset('definitions/camouflages.cdon.lz4'),
|
||||
);
|
||||
@@ -0,0 +1,7 @@
|
||||
import { superDecompress } from '@blitzkit/core/src/blitzkit/superDecompress';
|
||||
|
||||
export async function fetchCdonLz4<Type>(url: string) {
|
||||
return await fetch(url, { cache: 'no-store' })
|
||||
.then((response) => response.arrayBuffer())
|
||||
.then((buffer) => superDecompress<Type>(buffer));
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import { TankFilters } from '../../../website/src/stores/tankFilters';
|
||||
import { TankDefinition } from './tankDefinitions';
|
||||
|
||||
export function filterTank(filters: TankFilters, tank: TankDefinition) {
|
||||
return (
|
||||
(filters.tiers.length === 0 || filters.tiers.includes(tank.tier)) &&
|
||||
(filters.nations.length === 0 || filters.nations.includes(tank.nation)) &&
|
||||
(filters.classes.length === 0 || filters.classes.includes(tank.class)) &&
|
||||
(filters.types.length === 0 || filters.types.includes(tank.treeType)) &&
|
||||
(filters.testing === 'include' ||
|
||||
(filters.testing === 'only' && tank.testing) ||
|
||||
(filters.testing === 'exclude' && !tank.testing))
|
||||
);
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
import { asset } from '../../../../src/core/blitzkit/asset';
|
||||
import { fetchCdonLz4 } from '../../../../src/core/blitzkit/fetchCdonLz4';
|
||||
import { asset } from './asset';
|
||||
import { fetchCdonLz4 } from './fetchCdonLz4';
|
||||
|
||||
interface GameMode {
|
||||
name: string;
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
export * from './assertSecret';
|
||||
export * from './asset';
|
||||
export * from './camouflageDefinitions';
|
||||
export * from './fetchCdonLz4';
|
||||
export * from './filterTank';
|
||||
export * from './gameDefinitions';
|
||||
export * from './modelDefinitions';
|
||||
export * from './superCompress';
|
||||
export * from './superDecompress';
|
||||
export * from './tankDefinitions';
|
||||
export * from './tankIcon';
|
||||
export * from './tankNames';
|
||||
@@ -0,0 +1,64 @@
|
||||
import { Vector3Tuple } from 'three';
|
||||
import { asset } from './asset';
|
||||
import { fetchCdonLz4 } from './fetchCdonLz4';
|
||||
|
||||
export type ModelDefinitions = Record<number, ModelDefinition>;
|
||||
|
||||
export interface ModelArmor {
|
||||
thickness: Record<number, number>;
|
||||
spaced?: number[];
|
||||
// dynamic?: Record<`${boolean}`, number[]>;
|
||||
}
|
||||
|
||||
export interface BoundingBox {
|
||||
min: Vector3Tuple;
|
||||
max: Vector3Tuple;
|
||||
}
|
||||
export interface ModelDefinition {
|
||||
armor: ModelArmor;
|
||||
turretOrigin: Vector3Tuple;
|
||||
turretRotation?: InitialTurretRotation;
|
||||
turrets: Record<number, TurretModelDefinition>;
|
||||
tracks: Record<number, TrackDefinition>;
|
||||
boundingBox: BoundingBox;
|
||||
}
|
||||
interface TrackDefinition {
|
||||
thickness: number;
|
||||
origin: Vector3Tuple;
|
||||
}
|
||||
export interface InitialTurretRotation {
|
||||
yaw: number;
|
||||
pitch: number;
|
||||
roll: number;
|
||||
}
|
||||
interface TurretModelDefinition {
|
||||
boundingBox: BoundingBox;
|
||||
armor: ModelArmor;
|
||||
model: number;
|
||||
gunOrigin: Vector3Tuple;
|
||||
guns: Record<number, GunModelDefinition>;
|
||||
yaw?: YawLimits;
|
||||
}
|
||||
export interface YawLimits {
|
||||
min: number;
|
||||
max: number;
|
||||
}
|
||||
interface GunModelDefinition {
|
||||
armor: ModelArmor;
|
||||
thickness: number;
|
||||
model: number;
|
||||
pitch: PitchLimits;
|
||||
mask?: number;
|
||||
}
|
||||
export interface PitchLimits {
|
||||
min: number;
|
||||
max: number;
|
||||
|
||||
front?: { min: number; max: number; range: number };
|
||||
back?: { min: number; max: number; range: number };
|
||||
transition?: number;
|
||||
}
|
||||
|
||||
export const modelDefinitions = fetchCdonLz4<ModelDefinitions>(
|
||||
asset('definitions/models.cdon.lz4'),
|
||||
);
|
||||
@@ -0,0 +1,72 @@
|
||||
import { CrewMember, GunDefinition, ShellType, Tier } from '.';
|
||||
|
||||
export const SHELL_NAMES: Record<ShellType, string> = {
|
||||
ap: 'AP',
|
||||
ap_cr: 'APCR',
|
||||
hc: 'HEAT',
|
||||
he: 'HE',
|
||||
};
|
||||
export const CREW_MEMBER_NAMES: Record<CrewMember, string> = {
|
||||
commander: 'Commander',
|
||||
radioman: 'Radioman',
|
||||
gunner: 'Gunner',
|
||||
driver: 'Driver',
|
||||
loader: 'Loader',
|
||||
};
|
||||
export const GUN_TYPE_NAMES: Record<GunDefinition['type'], string> = {
|
||||
regular: 'Regular',
|
||||
autoLoader: 'Auto loader',
|
||||
autoReloader: 'Auto reloader',
|
||||
};
|
||||
/**
|
||||
* @deprecated use svg
|
||||
*/
|
||||
export const TANK_ICONS: Record<TankClass, string> = {
|
||||
'AT-SPG': 'https://i.imgur.com/BIHSEH0.png',
|
||||
lightTank: 'https://i.imgur.com/CSNha5V.png',
|
||||
mediumTank: 'https://i.imgur.com/wvf3ltm.png',
|
||||
heavyTank: 'https://i.imgur.com/ECeqlZa.png',
|
||||
};
|
||||
/**
|
||||
* @deprecated use svg
|
||||
*/
|
||||
export const TANK_ICONS_PREMIUM: Record<TankClass, string> = {
|
||||
'AT-SPG': 'https://i.imgur.com/TCu3EdR.png',
|
||||
lightTank: 'https://i.imgur.com/zdkpTRb.png',
|
||||
mediumTank: 'https://i.imgur.com/3z7eHX6.png',
|
||||
heavyTank: 'https://i.imgur.com/P3vbmyA.png',
|
||||
};
|
||||
/**
|
||||
* @deprecated use svg
|
||||
*/
|
||||
export const TANK_ICONS_COLLECTOR: Record<TankClass, string> = {
|
||||
'AT-SPG': 'https://i.imgur.com/WTjeirB.png',
|
||||
lightTank: 'https://i.imgur.com/EwhtKkU.png',
|
||||
mediumTank: 'https://i.imgur.com/u8YDMBh.png',
|
||||
heavyTank: 'https://i.imgur.com/8xRf3nc.png',
|
||||
};
|
||||
export const TIERS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as const;
|
||||
export const TIER_ROMAN_NUMERALS: Record<Tier, string> = {
|
||||
1: 'I',
|
||||
2: 'II',
|
||||
3: 'III',
|
||||
4: 'IV',
|
||||
5: 'V',
|
||||
6: 'VI',
|
||||
7: 'VII',
|
||||
8: 'VIII',
|
||||
9: 'IX',
|
||||
10: 'X',
|
||||
};
|
||||
|
||||
export const flags: Record<string, string> = {
|
||||
ussr: '<:ussr:1218421042033197197>',
|
||||
germany: '🇩🇪',
|
||||
usa: '🇺🇸',
|
||||
china: '🇨🇳',
|
||||
uk: '🇬🇧',
|
||||
france: '🇫🇷',
|
||||
japan: '🇯🇵',
|
||||
european: '🇪🇺',
|
||||
other: '<:other:1218421572243558482>',
|
||||
};
|
||||
@@ -0,0 +1,182 @@
|
||||
import { Vector2Tuple } from 'three';
|
||||
import { TankClass, TreeType } from '../../../components/Tanks';
|
||||
import { asset } from '../asset';
|
||||
import { fetchCdonLz4 } from '../fetchCdonLz4';
|
||||
import { TIERS } from './constants';
|
||||
|
||||
export enum ShellType {
|
||||
AP = 'ap',
|
||||
APCR = 'ap_cr',
|
||||
HEAT = 'hc',
|
||||
HE = 'he',
|
||||
}
|
||||
|
||||
export type CrewMember =
|
||||
| 'commander'
|
||||
| 'radioman'
|
||||
| 'gunner'
|
||||
| 'driver'
|
||||
| 'loader';
|
||||
export type TankDefinitions = Record<number, TankDefinition>;
|
||||
export type ModuleType = 'vehicle' | 'engine' | 'chassis' | 'turret' | 'gun';
|
||||
export interface Unlock {
|
||||
type: ModuleType;
|
||||
id: number;
|
||||
cost: {
|
||||
// string being the season coins
|
||||
type: 'xp' | string;
|
||||
value: number;
|
||||
};
|
||||
}
|
||||
export interface Crew {
|
||||
type: CrewMember;
|
||||
count?: number;
|
||||
substitute?: CrewMember[];
|
||||
}
|
||||
export type ModuleDefinition =
|
||||
| TrackDefinition
|
||||
| EngineDefinition
|
||||
| TurretDefinition
|
||||
| GunDefinition;
|
||||
export interface TankDefinition {
|
||||
id: number;
|
||||
roles: Record<number, number>;
|
||||
description?: string;
|
||||
fixedCamouflage?: boolean;
|
||||
camouflages?: number[];
|
||||
ancestors?: number[];
|
||||
successors?: number[];
|
||||
crew: Crew[];
|
||||
health: number;
|
||||
nation: string;
|
||||
name: string;
|
||||
nameFull?: string;
|
||||
treeType: TreeType;
|
||||
consumables: number;
|
||||
provisions: number;
|
||||
tier: Tier;
|
||||
class: TankClass;
|
||||
testing: boolean;
|
||||
deprecated: boolean;
|
||||
turrets: TurretDefinition[];
|
||||
engines: EngineDefinition[];
|
||||
tracks: TrackDefinition[];
|
||||
price: TankPrice;
|
||||
xp?: number;
|
||||
speed: {
|
||||
forwards: number;
|
||||
backwards: number;
|
||||
};
|
||||
camouflage: {
|
||||
still: number;
|
||||
moving: number;
|
||||
onFire: number;
|
||||
};
|
||||
equipment: string;
|
||||
weight: number;
|
||||
}
|
||||
export interface TrackDefinition {
|
||||
id: number;
|
||||
tier: Tier;
|
||||
name: string;
|
||||
weight: number;
|
||||
traverseSpeed: number;
|
||||
xp?: number;
|
||||
dispersion: {
|
||||
move: number;
|
||||
traverse: number;
|
||||
};
|
||||
resistance: {
|
||||
hard: number;
|
||||
medium: number;
|
||||
soft: number;
|
||||
};
|
||||
unlocks?: Unlock[];
|
||||
}
|
||||
export interface EngineDefinition {
|
||||
id: number;
|
||||
name: string;
|
||||
xp?: number;
|
||||
tier: Tier;
|
||||
fireChance: number;
|
||||
power: number;
|
||||
weight: number;
|
||||
unlocks?: Unlock[];
|
||||
}
|
||||
export type TankPrice =
|
||||
| { type: 'credits'; value: number }
|
||||
| { type: 'gold'; value: number };
|
||||
export interface TurretDefinition {
|
||||
health: number;
|
||||
viewRange: number;
|
||||
traverseSpeed: number;
|
||||
xp?: number;
|
||||
id: number;
|
||||
name: string;
|
||||
tier: Tier;
|
||||
guns: GunDefinition[];
|
||||
weight: number;
|
||||
unlocks?: Unlock[];
|
||||
}
|
||||
export type GunDefinition =
|
||||
| GunDefinitionRegular
|
||||
| GunDefinitionAutoLoader
|
||||
| GunDefinitionAutoReloader;
|
||||
interface GunDefinitionBase {
|
||||
rotationSpeed: number;
|
||||
xp?: number;
|
||||
weight: number;
|
||||
id: number;
|
||||
name: string;
|
||||
tier: Tier;
|
||||
shells: ShellDefinition[];
|
||||
camouflageLoss: number;
|
||||
aimTime: number;
|
||||
dispersion: {
|
||||
base: number;
|
||||
traverse: number;
|
||||
shot: number;
|
||||
damaged: number;
|
||||
};
|
||||
unlocks?: Unlock[];
|
||||
}
|
||||
interface GunDefinitionRegular extends GunDefinitionBase {
|
||||
type: 'regular';
|
||||
reload: number;
|
||||
}
|
||||
interface GunDefinitionAutoLoader extends GunDefinitionBase {
|
||||
type: 'autoLoader';
|
||||
reload: number;
|
||||
intraClip: number;
|
||||
count: number;
|
||||
}
|
||||
interface GunDefinitionAutoReloader extends GunDefinitionBase {
|
||||
type: 'autoReloader';
|
||||
reload: number[];
|
||||
intraClip: number;
|
||||
count: number;
|
||||
}
|
||||
export type ShellDefinition = {
|
||||
id: number;
|
||||
name: string;
|
||||
speed: number;
|
||||
damage: { armor: number; module: number };
|
||||
caliber: number;
|
||||
icon: string;
|
||||
penetration: number | Vector2Tuple;
|
||||
type: ShellType;
|
||||
normalization?: number;
|
||||
ricochet?: number;
|
||||
explosionRadius?: number;
|
||||
};
|
||||
|
||||
export const tankDefinitions = fetchCdonLz4<TankDefinitions>(
|
||||
asset('definitions/tanks.cdon.lz4'),
|
||||
);
|
||||
|
||||
export const tankDefinitionsArray = tankDefinitions.then((tanks) =>
|
||||
Object.values(tanks),
|
||||
);
|
||||
export type Tier = (typeof TIERS)[number];
|
||||
|
||||
export * from './constants';
|
||||
@@ -0,0 +1,5 @@
|
||||
import { asset } from '@blitzkit/core/src/blitzkit/asset';
|
||||
|
||||
export function tankIcon(id: number, size: 'big' | 'small' = 'big') {
|
||||
return asset(`icons/tanks/${size}/${id}.webp`);
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
import { deburr } from 'lodash';
|
||||
import { camouflageDefinitions, tankDefinitionsArray } from '.';
|
||||
|
||||
export const tankNames = Promise.all([
|
||||
tankDefinitionsArray,
|
||||
camouflageDefinitions,
|
||||
]).then(([tanks, camouflages]) =>
|
||||
Promise.all(
|
||||
tanks.map(async (tank, index) => {
|
||||
const { id } = (await tankDefinitionsArray)[index];
|
||||
|
||||
return {
|
||||
id,
|
||||
name: tank.name,
|
||||
nameFull: tank.nameFull,
|
||||
searchableName: tank.nameFull ?? tank.name,
|
||||
searchableNameDeburr: deburr(tank.nameFull ?? tank.name),
|
||||
camouflages: tank.camouflages
|
||||
?.map((id) => camouflages[id].name)
|
||||
.join(' '),
|
||||
treeType: tank.treeType,
|
||||
};
|
||||
}),
|
||||
),
|
||||
);
|
||||
@@ -20,6 +20,7 @@
|
||||
"react-dom": "^18.3.1",
|
||||
"react-fuzzysort": "^1.0.1",
|
||||
"immer": "^10.1.1",
|
||||
"@vanilla-extract/dynamic": "^2.1.2",
|
||||
"zustand": "^4.5.5",
|
||||
"react-promise-suspense": "^0.3.4"
|
||||
},
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
'use client';
|
||||
|
||||
import {
|
||||
asset,
|
||||
gameDefinitions,
|
||||
TANK_CLASSES,
|
||||
Tier,
|
||||
TIER_ROMAN_NUMERALS,
|
||||
} from '@blitzkit/core';
|
||||
import strings from '@blitzkit/core/lang/en-US.json';
|
||||
import { ReloadIcon } from '@radix-ui/react-icons';
|
||||
import { Box, Flex, IconButton, Text, Tooltip } from '@radix-ui/themes';
|
||||
import { times } from 'lodash';
|
||||
@@ -9,12 +17,6 @@ import { ExperimentIcon } from '../../../../components/ExperimentIcon';
|
||||
import { ResearchedIcon } from '../../../../components/ResearchedIcon';
|
||||
import { ScienceIcon } from '../../../../components/ScienceIcon';
|
||||
import { ScienceOffIcon } from '../../../../components/ScienceOffIcon';
|
||||
import { TANK_CLASSES } from '../../../../components/Tanks/components/Item/constants';
|
||||
import { asset } from '../../../../core/blitzkit/asset';
|
||||
import { gameDefinitions } from '../../../../core/blitzkit/gameDefinitions';
|
||||
import { Tier } from '../../../../core/blitzkit/tankDefinitions';
|
||||
import { TIER_ROMAN_NUMERALS } from '../../../../core/blitzkit/tankDefinitions/constants';
|
||||
import strings from '../../../../lang/en-US.json';
|
||||
import * as TankFilters from '../../../../stores/tankFilters';
|
||||
|
||||
interface FilterControlProps {
|
||||
|
||||
@@ -1,17 +1,15 @@
|
||||
import {
|
||||
asset,
|
||||
modelDefinitions,
|
||||
resolveNearPenetration,
|
||||
TankDefinition,
|
||||
tankIcon,
|
||||
} from '@blitzkit/core';
|
||||
import { Flex, Text } from '@radix-ui/themes';
|
||||
import { assignInlineVars } from '@vanilla-extract/dynamic';
|
||||
import Link from 'next/link';
|
||||
import { use, useMemo } from 'react';
|
||||
import { classIcons } from '../../../../components/ClassIcon';
|
||||
import { resolveNearPenetration } from '../../../../core/blitz/resolveNearPenetration';
|
||||
import { asset } from '../../../../core/blitzkit/asset';
|
||||
import { modelDefinitions } from '../../../../core/blitzkit/modelDefinitions';
|
||||
import { normalizeBoundingBox } from '../../../../core/blitzkit/normalizeBoundingBox';
|
||||
import { resolveDpm } from '../../../../core/blitzkit/resolveDpm';
|
||||
import { resolveReload } from '../../../../core/blitzkit/resolveReload';
|
||||
import { TankDefinition } from '../../../../core/blitzkit/tankDefinitions';
|
||||
import { tankIcon } from '../../../../core/blitzkit/tankIcon';
|
||||
import { unionBoundingBox } from '../../../../core/blitzkit/unionBoundingBox';
|
||||
import * as TankopediaSort from '../../../../stores/tankopediaSort';
|
||||
import * as styles from './TankCard.css';
|
||||
|
||||
@@ -139,14 +137,16 @@ export function TankCard({ tank, onSelect }: TankCardProps) {
|
||||
tank.treeType === 'collector'
|
||||
? 'blue'
|
||||
: tank.treeType === 'premium'
|
||||
? 'amber'
|
||||
: 'gray'
|
||||
? 'amber'
|
||||
: 'gray'
|
||||
}
|
||||
highContrast={tank.treeType === 'researchable'}
|
||||
onClick={onSelect ? () => onSelect(tank) : undefined}
|
||||
className={styles.card}
|
||||
style={assignInlineVars({
|
||||
[styles.cardBackgroundVar]: `top left / contain no-repeat url(${asset(`flags/scratched/${tank.nation}.webp`)})`,
|
||||
[styles.cardBackgroundVar]: `top left / contain no-repeat url(${asset(
|
||||
`flags/scratched/${tank.nation}.webp`,
|
||||
)})`,
|
||||
})}
|
||||
>
|
||||
<Link
|
||||
|
||||
@@ -1,26 +1,22 @@
|
||||
'use client';
|
||||
|
||||
import {
|
||||
TANK_CLASSES,
|
||||
TankDefinition,
|
||||
filterTank,
|
||||
gameDefinitions,
|
||||
modelDefinitions,
|
||||
resolveNearPenetration,
|
||||
tankDefinitions,
|
||||
tankDefinitionsArray,
|
||||
tankNames,
|
||||
} from '@blitzkit/core';
|
||||
import { Callout, Flex, FlexProps, Link, Text } from '@radix-ui/themes';
|
||||
import { go } from 'fuzzysort';
|
||||
import { times } from 'lodash';
|
||||
import { Fragment, memo, use, useEffect, useMemo, useState } from 'react';
|
||||
import { AdMidSectionResponsive } from '../../../../../components/AdMidSectionResponsive';
|
||||
import { ExperimentIcon } from '../../../../../components/ExperimentIcon';
|
||||
import { TANK_CLASSES } from '../../../../../components/Tanks/components/Item/constants';
|
||||
import { resolveNearPenetration } from '../../../../../core/blitz/resolveNearPenetration';
|
||||
import { filterTank } from '../../../../../core/blitzkit/filterTank';
|
||||
import { gameDefinitions } from '../../../../../core/blitzkit/gameDefinitions';
|
||||
import { modelDefinitions } from '../../../../../core/blitzkit/modelDefinitions';
|
||||
import { normalizeBoundingBox } from '../../../../../core/blitzkit/normalizeBoundingBox';
|
||||
import { resolveDpm } from '../../../../../core/blitzkit/resolveDpm';
|
||||
import { resolveReload } from '../../../../../core/blitzkit/resolveReload';
|
||||
import {
|
||||
TankDefinition,
|
||||
tankDefinitions,
|
||||
tankDefinitionsArray,
|
||||
} from '../../../../../core/blitzkit/tankDefinitions';
|
||||
import { tankNames } from '../../../../../core/blitzkit/tankDefinitions/tankNames';
|
||||
import { unionBoundingBox } from '../../../../../core/blitzkit/unionBoundingBox';
|
||||
import { useAdExempt } from '../../../../../hooks/useAdExempt';
|
||||
import * as TankFilters from '../../../../../stores/tankFilters';
|
||||
import {
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
import { ComponentProps } from 'react';
|
||||
|
||||
export function ClassHeavy(props: ComponentProps<'svg'>) {
|
||||
return (
|
||||
<svg
|
||||
width="64"
|
||||
height="64"
|
||||
viewBox="0 0 64 64"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
{...props}
|
||||
>
|
||||
<g clipPath="url(#clip0_70_177)">
|
||||
<g clipPath="url(#clip1_70_177)">
|
||||
<rect
|
||||
y="32"
|
||||
width="45.2548"
|
||||
height="12.4183"
|
||||
rx="6.20914"
|
||||
transform="rotate(-45 0 32)"
|
||||
fill="currentColor"
|
||||
/>
|
||||
<rect
|
||||
x="11.6095"
|
||||
y="43.6095"
|
||||
width="45.2548"
|
||||
height="12.4183"
|
||||
rx="6.20914"
|
||||
transform="rotate(-45 11.6095 43.6095)"
|
||||
fill="currentColor"
|
||||
/>
|
||||
<rect
|
||||
x="23.2189"
|
||||
y="55.219"
|
||||
width="45.2548"
|
||||
height="12.4183"
|
||||
rx="6.20914"
|
||||
transform="rotate(-45 23.2189 55.219)"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_70_177">
|
||||
<rect width="64" height="64" fill="white" />
|
||||
</clipPath>
|
||||
<clipPath id="clip1_70_177">
|
||||
<rect
|
||||
width="45.2548"
|
||||
height="45.2548"
|
||||
fill="white"
|
||||
transform="translate(0 32) rotate(-45)"
|
||||
/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import { ComponentProps } from 'react';
|
||||
|
||||
export function ClassLight(props: ComponentProps<'svg'>) {
|
||||
return (
|
||||
<svg
|
||||
width="64"
|
||||
height="64"
|
||||
viewBox="0 0 64 64"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
{...props}
|
||||
>
|
||||
<rect
|
||||
y="32"
|
||||
width="45.2548"
|
||||
height="45.2548"
|
||||
rx="8"
|
||||
transform="rotate(-45 0 32)"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
import { ComponentProps } from 'react';
|
||||
|
||||
export function ClassMedium(props: ComponentProps<'svg'>) {
|
||||
return (
|
||||
<svg
|
||||
width="64"
|
||||
height="64"
|
||||
viewBox="0 0 64 64"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
{...props}
|
||||
>
|
||||
<g clipPath="url(#clip0_70_149)">
|
||||
<g clipPath="url(#clip1_70_149)">
|
||||
<rect
|
||||
y="32"
|
||||
width="45.2548"
|
||||
height="20.6274"
|
||||
rx="8"
|
||||
transform="rotate(-45 0 32)"
|
||||
fill="currentColor"
|
||||
/>
|
||||
<rect
|
||||
x="17.4142"
|
||||
y="49.4142"
|
||||
width="45.2548"
|
||||
height="20.6274"
|
||||
rx="8"
|
||||
transform="rotate(-45 17.4142 49.4142)"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_70_149">
|
||||
<rect width="64" height="64" fill="white" />
|
||||
</clipPath>
|
||||
<clipPath id="clip1_70_149">
|
||||
<rect
|
||||
width="45.2548"
|
||||
height="45.2548"
|
||||
fill="white"
|
||||
transform="translate(0 32) rotate(-45)"
|
||||
/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
import { ComponentProps } from 'react';
|
||||
|
||||
export function ClassTankDestroyer(props: ComponentProps<'svg'>) {
|
||||
return (
|
||||
<svg
|
||||
width="64"
|
||||
height="64"
|
||||
viewBox="0 0 64 64"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
{...props}
|
||||
>
|
||||
<path
|
||||
d="M36.6355 54.572C34.7073 57.886 29.9201 57.8861 27.992 54.572L4.68577 14.5145C2.74639 11.1812 5.15107 7 9.00751 7H55.6199C59.4764 7 61.881 11.1812 59.9417 14.5145L36.6355 54.572Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import { ComponentProps, ReactNode } from 'react';
|
||||
import { TankClass } from '../Tanks';
|
||||
import { ClassHeavy } from './components/ClassHeavy';
|
||||
import { ClassLight } from './components/ClassLight';
|
||||
import { ClassMedium } from './components/ClassMedium';
|
||||
import { ClassTankDestroyer } from './components/ClassTankDestroyer';
|
||||
|
||||
export const classIcons: Record<
|
||||
TankClass,
|
||||
(props: ComponentProps<'svg'>) => ReactNode
|
||||
> = {
|
||||
'AT-SPG': ClassTankDestroyer,
|
||||
heavyTank: ClassHeavy,
|
||||
lightTank: ClassLight,
|
||||
mediumTank: ClassMedium,
|
||||
};
|
||||
@@ -0,0 +1,16 @@
|
||||
import { ComponentProps } from 'react';
|
||||
|
||||
export function ExperimentIcon(props: ComponentProps<'svg'>) {
|
||||
return (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
height="24px"
|
||||
viewBox="0 -960 960 960"
|
||||
width="24px"
|
||||
fill="currentColor"
|
||||
{...props}
|
||||
>
|
||||
<path d="M200-120q-51 0-72.5-45.5T138-250l222-270v-240h-40q-17 0-28.5-11.5T280-800q0-17 11.5-28.5T320-840h320q17 0 28.5 11.5T680-800q0 17-11.5 28.5T640-760h-40v240l222 270q32 39 10.5 84.5T760-120H200Zm0-80h560L520-492v-268h-80v268L200-200Zm280-280Z" />
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
import { assertSecret } from '@blitzkit/core';
|
||||
import strings from '@blitzkit/core/lang/en-US.json';
|
||||
import { Button, ButtonProps, Dialog, Flex } from '@radix-ui/themes';
|
||||
import { REGIONS } from '../../../../../../src/constants/regions';
|
||||
import strings from '../../../../../../src/lang/en-US.json';
|
||||
import { Link } from '../../Link';
|
||||
import { WargamingIcon } from '../../WargamingIcon';
|
||||
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
import { ComponentProps } from 'react';
|
||||
|
||||
export function ResearchedIcon(props: ComponentProps<'svg'>) {
|
||||
return (
|
||||
<svg
|
||||
width="64"
|
||||
height="64"
|
||||
viewBox="0 0 64 64"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
{...props}
|
||||
>
|
||||
<path
|
||||
d="M63 25V43L48 51H60C58.5 53.6667 51.6 59 36 59L62 25H63Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
<path d="M48 3L60 18L54 27L48 3Z" fill="currentColor" />
|
||||
<path
|
||||
d="M3 25V43L18 51H6C7.5 53.6667 14.4 59 30 59L4 25H3Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
<path d="M18 3L6 18L12 27L18 3Z" fill="currentColor" />
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import { ComponentProps } from 'react';
|
||||
|
||||
export function ScienceIcon(props: ComponentProps<'svg'>) {
|
||||
return (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
height="24px"
|
||||
viewBox="0 -960 960 960"
|
||||
width="24px"
|
||||
fill="currentColor"
|
||||
{...props}
|
||||
>
|
||||
<path d="M200-120q-51 0-72.5-45.5T138-250l222-270v-240h-40q-17 0-28.5-11.5T280-800q0-17 11.5-28.5T320-840h320q17 0 28.5 11.5T680-800q0 17-11.5 28.5T640-760h-40v240l222 270q32 39 10.5 84.5T760-120H200Zm80-120h400L544-400H416L280-240Zm-80 40h560L520-492v-268h-80v268L200-200Zm280-280Z" />
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import { ComponentProps } from 'react';
|
||||
|
||||
export function ScienceOffIcon(props: ComponentProps<'svg'>) {
|
||||
return (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
height="24px"
|
||||
viewBox="0 -960 960 960"
|
||||
width="24px"
|
||||
fill="currentColor"
|
||||
{...props}
|
||||
>
|
||||
<path d="m600-473-80-80v-207h-80v127l-80-80v-47h-40q-17 0-28.5-11.5T280-800q0-17 11.5-28.5T320-840h320q17 0 28.5 11.5T680-800q0 17-11.5 28.5T640-760h-40v287ZM200-200h448L402-446 200-200ZM792-56l-64-64H200q-51 0-72.5-45.5T138-250l208-252L56-792l56-56 736 736-56 56ZM402-446Zm78-147Z" />
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import { ComponentProps } from 'react';
|
||||
|
||||
export function VerifiedIcon(props: ComponentProps<'svg'>) {
|
||||
return (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
height="24px"
|
||||
viewBox="0 -960 960 960"
|
||||
width="24px"
|
||||
fill="currentColor"
|
||||
{...props}
|
||||
>
|
||||
<path d="m344-60-76-128-144-32 14-148-98-112 98-112-14-148 144-32 76-128 136 58 136-58 76 128 144 32-14 148 98 112-98 112 14 148-144 32-76 128-136-58-136 58Zm34-102 102-44 104 44 56-96 110-26-10-112 74-84-74-86 10-112-110-24-58-96-102 44-104-44-56 96-110 24 10 112-74 86 74 84-10 114 110 24 58 96Zm102-318Zm-42 142 226-226-56-58-170 170-86-84-56 56 142 142Z" />
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
import { ObjectMap, useLoader } from '@react-three/fiber';
|
||||
import { Mesh, MeshStandardMaterial } from 'three';
|
||||
import { GLTF, GLTFLoader } from 'three-stdlib';
|
||||
import { asset } from '../core/blitzkit/asset';
|
||||
|
||||
const cache: Record<
|
||||
number,
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
'use client';
|
||||
|
||||
import { Tier, createNextSafeStore } from '@blitzkit/core';
|
||||
import { create } from 'zustand';
|
||||
import { TankClass, TreeType } from '../components/Tanks';
|
||||
import { Tier } from '../core/blitzkit/tankDefinitions';
|
||||
import { createNextSafeStore } from '../core/zustand/createNextSafeStore';
|
||||
|
||||
export interface TankFilters {
|
||||
tiers: Tier[];
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
'use client';
|
||||
|
||||
import { createNextSafeStore } from '@blitzkit/core';
|
||||
import { merge } from 'lodash';
|
||||
import { create } from 'zustand';
|
||||
import { persist, subscribeWithSelector } from 'zustand/middleware';
|
||||
import { ENVIRONMENTS } from '../../app/tools/tankopedia/[id]/components/Lighting';
|
||||
import { TankClass, TreeType } from '../../components/Tanks';
|
||||
import { Tier } from '../../core/blitzkit/tankDefinitions';
|
||||
import { createNextSafeStore } from '../../core/zustand/createNextSafeStore';
|
||||
import { SORT_NAMES, TankopediaDisplay } from './constants';
|
||||
|
||||
export type TankopediaSortBy = keyof typeof SORT_NAMES;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
'use client';
|
||||
|
||||
import { createNextSafeStore } from '@blitzkit/core';
|
||||
import { create } from 'zustand';
|
||||
import { createNextSafeStore } from '../core/zustand/createNextSafeStore';
|
||||
import {
|
||||
TankopediaSortBy,
|
||||
TankopediaSortDirection,
|
||||
|
||||
Reference in new issue
Block a user