mirror of
https://github.com/Corfirean/coa-server-manager.git
synced 2026-11-11 03:51:01 +00:00
158 lines
18 KiB
Python
158 lines
18 KiB
Python
"""One-off: appends 20 more curated worldserver.conf settings to tools/gen_server_schema.py and their translations to
|
||
src/i18n/schema/*.json. Run once, then run gen_server_schema.py and tools/check-i18n.mjs."""
|
||
import json
|
||
import os
|
||
|
||
ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")
|
||
|
||
# key, type, category, title, description, default, min, max, unit, advanced, restart, dangerous
|
||
NEW = [
|
||
("Rate.Drop.Item.Uncommon", "float", "rates", "Uncommon item drop rate", "Multiplier for how often uncommon (green) items drop.", 1, 0, 20, "x", False, "world", False),
|
||
("Rate.Drop.Item.Rare", "float", "rates", "Rare item drop rate", "Multiplier for how often rare (blue) items drop.", 1, 0, 20, "x", False, "world", False),
|
||
("Rate.Drop.Item.Epic", "float", "rates", "Epic item drop rate", "Multiplier for how often epic (purple) items drop.", 1, 0, 20, "x", False, "world", False),
|
||
("Rate.Drop.Item.Legendary", "float", "rates", "Legendary item drop rate", "Multiplier for how often legendary (orange) items drop.", 1, 0, 20, "x", False, "world", False),
|
||
("Rate.Talent", "float", "rates", "Talent points", "Multiplier for the talent points a character earns per level.", 1, 0, 10, "x", True, "world", False),
|
||
("Rate.Skill.Discovery", "float", "rates", "Recipe discovery chance", "Multiplier for the chance to discover a new recipe while crafting.", 1, 0, 20, "x", True, "world", False),
|
||
("Rate.RepairCost", "float", "rates", "Repair cost", "Multiplier for what repairing equipment costs. 0 makes repairs free.", 1, 0, 10, "x", False, "world", False),
|
||
("Rate.Auction.Cut", "float", "rates", "Auction house cut", "Multiplier for the share of a sale the auction house keeps. 0 means no cut.", 1, 0, 10, "x", True, "world", False),
|
||
("Rate.ArenaPoints", "float", "rates", "Arena points gain", "Multiplier for arena points earned.", 1, 0, 20, "x", True, "world", False),
|
||
("Rate.XP.Pet", "float", "rates", "Pet experience", "Multiplier for the experience hunters' pets gain.", 1, 0, 20, "x", True, "world", False),
|
||
("Instance.IgnoreLevel", "bool", "gameplay", "Ignore dungeon level requirements", "Characters of any level can enter dungeons and raids.", False, None, None, None, False, "world", False),
|
||
("Instance.IgnoreRaid", "bool", "gameplay", "Enter raids without a raid group", "Players can enter raid instances without being in a raid group.", False, None, None, None, False, "world", False),
|
||
("Instance.ResetTimeHour", "int", "gameplay", "Dungeon reset hour", "Hour of the day (0-23) when dungeon and raid lockouts reset.", 4, 0, 23, None, True, "world", False),
|
||
("MaxPrimaryTradeSkill", "int", "gameplay", "Primary professions per character", "How many primary professions (such as Blacksmithing or Herbalism) a character may learn.", 2, 0, 11, None, False, "world", False),
|
||
("AlwaysMaxSkillForLevel", "bool", "gameplay", "Skills always at maximum for level", "Weapon and other skills are always at their maximum for the character's level, no training needed.", False, None, None, None, False, "world", False),
|
||
("ActivateWeather", "bool", "gameplay", "Weather", "Turns rain, snow and storms on or off.", True, None, None, None, False, "world", False),
|
||
("Group.Raid.LevelRestriction", "int", "gameplay", "Minimum level to invite to a raid", "Characters below this level cannot be invited to a raid group.", 10, 1, 80, None, True, "world", False),
|
||
("AllowTwoSide.Interaction.Group", "bool", "accounts", "Cross-faction groups", "Alliance and Horde players can form groups together.", False, None, None, None, False, "world", False),
|
||
("AllowTwoSide.Interaction.Guild", "bool", "accounts", "Cross-faction guilds", "Alliance and Horde players can join the same guild.", False, None, None, None, False, "world", False),
|
||
("AllowTwoSide.Interaction.Auction", "bool", "accounts", "Shared auction house", "Alliance and Horde players can use the same auction house.", False, None, None, None, False, "world", False),
|
||
]
|
||
|
||
# language -> key -> (title, description)
|
||
T = {
|
||
"ru": {
|
||
"Rate.Drop.Item.Uncommon": ("Шанс выпадения необычных предметов", "Множитель частоты выпадения необычных (зелёных) предметов."),
|
||
"Rate.Drop.Item.Rare": ("Шанс выпадения редких предметов", "Множитель частоты выпадения редких (синих) предметов."),
|
||
"Rate.Drop.Item.Epic": ("Шанс выпадения эпических предметов", "Множитель частоты выпадения эпических (фиолетовых) предметов."),
|
||
"Rate.Drop.Item.Legendary": ("Шанс выпадения легендарных предметов", "Множитель частоты выпадения легендарных (оранжевых) предметов."),
|
||
"Rate.Talent": ("Очки талантов", "Множитель очков талантов, которые персонаж получает за уровень."),
|
||
"Rate.Skill.Discovery": ("Шанс открытия рецептов", "Множитель шанса открыть новый рецепт при создании предметов."),
|
||
"Rate.RepairCost": ("Стоимость ремонта", "Множитель стоимости ремонта снаряжения. 0 делает ремонт бесплатным."),
|
||
"Rate.Auction.Cut": ("Комиссия аукциона", "Множитель доли от продажи, которую забирает аукцион. 0 — без комиссии."),
|
||
"Rate.ArenaPoints": ("Очки арены", "Множитель получаемых очков арены."),
|
||
"Rate.XP.Pet": ("Опыт питомцев", "Множитель опыта, который получают питомцы охотников."),
|
||
"Instance.IgnoreLevel": ("Игнорировать требования уровня для подземелий", "Персонажи любого уровня могут входить в подземелья и рейды."),
|
||
"Instance.IgnoreRaid": ("Вход в рейды без рейдовой группы", "Игроки могут входить в рейдовые подземелья, не состоя в рейдовой группе."),
|
||
"Instance.ResetTimeHour": ("Час сброса подземелий", "Час суток (0–23), когда сбрасываются привязки к подземельям и рейдам."),
|
||
"MaxPrimaryTradeSkill": ("Основных профессий на персонажа", "Сколько основных профессий (например, кузнечное дело или травничество) может изучить персонаж."),
|
||
"AlwaysMaxSkillForLevel": ("Навыки всегда на максимуме для уровня", "Навыки оружия и другие навыки всегда на максимуме для уровня персонажа, учиться не нужно."),
|
||
"ActivateWeather": ("Погода", "Включает или выключает дождь, снег и бури."),
|
||
"Group.Raid.LevelRestriction": ("Минимальный уровень для приглашения в рейд", "Персонажей ниже этого уровня нельзя пригласить в рейдовую группу."),
|
||
"AllowTwoSide.Interaction.Group": ("Группы между фракциями", "Игроки Альянса и Орды могут создавать общие группы."),
|
||
"AllowTwoSide.Interaction.Guild": ("Гильдии между фракциями", "Игроки Альянса и Орды могут состоять в одной гильдии."),
|
||
"AllowTwoSide.Interaction.Auction": ("Общий аукцион", "Игроки Альянса и Орды пользуются одним аукционом."),
|
||
},
|
||
"de": {
|
||
"Rate.Drop.Item.Uncommon": ("Droprate für ungewöhnliche Gegenstände", "Multiplikator dafür, wie oft ungewöhnliche (grüne) Gegenstände fallen."),
|
||
"Rate.Drop.Item.Rare": ("Droprate für seltene Gegenstände", "Multiplikator dafür, wie oft seltene (blaue) Gegenstände fallen."),
|
||
"Rate.Drop.Item.Epic": ("Droprate für epische Gegenstände", "Multiplikator dafür, wie oft epische (lila) Gegenstände fallen."),
|
||
"Rate.Drop.Item.Legendary": ("Droprate für legendäre Gegenstände", "Multiplikator dafür, wie oft legendäre (orange) Gegenstände fallen."),
|
||
"Rate.Talent": ("Talentpunkte", "Multiplikator für die Talentpunkte, die ein Charakter pro Stufe erhält."),
|
||
"Rate.Skill.Discovery": ("Chance auf Rezeptentdeckung", "Multiplikator für die Chance, beim Herstellen ein neues Rezept zu entdecken."),
|
||
"Rate.RepairCost": ("Reparaturkosten", "Multiplikator für die Kosten der Ausrüstungsreparatur. 0 macht Reparaturen kostenlos."),
|
||
"Rate.Auction.Cut": ("Auktionshaus-Gebühr", "Multiplikator für den Anteil eines Verkaufs, den das Auktionshaus behält. 0 bedeutet keine Gebühr."),
|
||
"Rate.ArenaPoints": ("Arenapunkte", "Multiplikator für erhaltene Arenapunkte."),
|
||
"Rate.XP.Pet": ("Begleiter-Erfahrung", "Multiplikator für die Erfahrung, die Begleiter von Jägern erhalten."),
|
||
"Instance.IgnoreLevel": ("Stufenanforderungen für Dungeons ignorieren", "Charaktere jeder Stufe können Dungeons und Schlachtzüge betreten."),
|
||
"Instance.IgnoreRaid": ("Schlachtzüge ohne Schlachtzugsgruppe betreten", "Spieler können Schlachtzugsinstanzen betreten, ohne in einer Schlachtzugsgruppe zu sein."),
|
||
"Instance.ResetTimeHour": ("Dungeon-Reset-Stunde", "Uhrzeit (0–23), zu der Dungeon- und Schlachtzugssperren zurückgesetzt werden."),
|
||
"MaxPrimaryTradeSkill": ("Hauptberufe pro Charakter", "Wie viele Hauptberufe (z. B. Schmiedekunst oder Kräuterkunde) ein Charakter erlernen darf."),
|
||
"AlwaysMaxSkillForLevel": ("Fertigkeiten immer auf Maximum der Stufe", "Waffen- und andere Fertigkeiten sind immer auf dem Maximum der Charakterstufe, Training ist nicht nötig."),
|
||
"ActivateWeather": ("Wetter", "Schaltet Regen, Schnee und Stürme ein oder aus."),
|
||
"Group.Raid.LevelRestriction": ("Mindeststufe zum Einladen in einen Schlachtzug", "Charaktere unter dieser Stufe können nicht in eine Schlachtzugsgruppe eingeladen werden."),
|
||
"AllowTwoSide.Interaction.Group": ("Gruppen über Fraktionen hinweg", "Spieler der Allianz und der Horde können gemeinsam Gruppen bilden."),
|
||
"AllowTwoSide.Interaction.Guild": ("Gilden über Fraktionen hinweg", "Spieler der Allianz und der Horde können derselben Gilde beitreten."),
|
||
"AllowTwoSide.Interaction.Auction": ("Gemeinsames Auktionshaus", "Spieler der Allianz und der Horde nutzen dasselbe Auktionshaus."),
|
||
},
|
||
"fr": {
|
||
"Rate.Drop.Item.Uncommon": ("Taux de butin des objets inhabituels", "Multiplicateur de la fréquence de butin des objets inhabituels (verts)."),
|
||
"Rate.Drop.Item.Rare": ("Taux de butin des objets rares", "Multiplicateur de la fréquence de butin des objets rares (bleus)."),
|
||
"Rate.Drop.Item.Epic": ("Taux de butin des objets épiques", "Multiplicateur de la fréquence de butin des objets épiques (violets)."),
|
||
"Rate.Drop.Item.Legendary": ("Taux de butin des objets légendaires", "Multiplicateur de la fréquence de butin des objets légendaires (orange)."),
|
||
"Rate.Talent": ("Points de talent", "Multiplicateur des points de talent gagnés par niveau."),
|
||
"Rate.Skill.Discovery": ("Chance de découvrir des recettes", "Multiplicateur de la chance de découvrir une nouvelle recette en fabriquant."),
|
||
"Rate.RepairCost": ("Coût des réparations", "Multiplicateur du coût de réparation de l'équipement. 0 rend les réparations gratuites."),
|
||
"Rate.Auction.Cut": ("Commission de l'hôtel des ventes", "Multiplicateur de la part d'une vente que garde l'hôtel des ventes. 0 signifie aucune commission."),
|
||
"Rate.ArenaPoints": ("Points d'arène", "Multiplicateur des points d'arène gagnés."),
|
||
"Rate.XP.Pet": ("Expérience des familiers", "Multiplicateur de l'expérience gagnée par les familiers des chasseurs."),
|
||
"Instance.IgnoreLevel": ("Ignorer les niveaux requis des donjons", "Les personnages de tout niveau peuvent entrer dans les donjons et les raids."),
|
||
"Instance.IgnoreRaid": ("Entrer dans les raids sans groupe de raid", "Les joueurs peuvent entrer dans les instances de raid sans être dans un groupe de raid."),
|
||
"Instance.ResetTimeHour": ("Heure de réinitialisation des donjons", "Heure de la journée (0-23) à laquelle les verrouillages de donjons et de raids sont réinitialisés."),
|
||
"MaxPrimaryTradeSkill": ("Métiers principaux par personnage", "Nombre de métiers principaux (comme la forge ou l'herboristerie) qu'un personnage peut apprendre."),
|
||
"AlwaysMaxSkillForLevel": ("Compétences toujours au maximum du niveau", "Les compétences d'armes et autres sont toujours au maximum du niveau du personnage, sans entraînement."),
|
||
"ActivateWeather": ("Météo", "Active ou désactive la pluie, la neige et les tempêtes."),
|
||
"Group.Raid.LevelRestriction": ("Niveau minimum pour inviter dans un raid", "Les personnages en dessous de ce niveau ne peuvent pas être invités dans un groupe de raid."),
|
||
"AllowTwoSide.Interaction.Group": ("Groupes entre factions", "Les joueurs de l'Alliance et de la Horde peuvent former des groupes ensemble."),
|
||
"AllowTwoSide.Interaction.Guild": ("Guildes entre factions", "Les joueurs de l'Alliance et de la Horde peuvent rejoindre la même guilde."),
|
||
"AllowTwoSide.Interaction.Auction": ("Hôtel des ventes commun", "Les joueurs de l'Alliance et de la Horde utilisent le même hôtel des ventes."),
|
||
},
|
||
"es": {
|
||
"Rate.Drop.Item.Uncommon": ("Probabilidad de botín de objetos poco comunes", "Multiplicador de la frecuencia con que caen objetos poco comunes (verdes)."),
|
||
"Rate.Drop.Item.Rare": ("Probabilidad de botín de objetos raros", "Multiplicador de la frecuencia con que caen objetos raros (azules)."),
|
||
"Rate.Drop.Item.Epic": ("Probabilidad de botín de objetos épicos", "Multiplicador de la frecuencia con que caen objetos épicos (morados)."),
|
||
"Rate.Drop.Item.Legendary": ("Probabilidad de botín de objetos legendarios", "Multiplicador de la frecuencia con que caen objetos legendarios (naranjas)."),
|
||
"Rate.Talent": ("Puntos de talento", "Multiplicador de los puntos de talento que gana un personaje por nivel."),
|
||
"Rate.Skill.Discovery": ("Probabilidad de descubrir recetas", "Multiplicador de la probabilidad de descubrir una receta nueva al fabricar."),
|
||
"Rate.RepairCost": ("Coste de reparación", "Multiplicador del coste de reparar el equipo. 0 hace las reparaciones gratuitas."),
|
||
"Rate.Auction.Cut": ("Comisión de la casa de subastas", "Multiplicador de la parte de una venta que se queda la casa de subastas. 0 significa sin comisión."),
|
||
"Rate.ArenaPoints": ("Puntos de arena", "Multiplicador de los puntos de arena obtenidos."),
|
||
"Rate.XP.Pet": ("Experiencia de mascotas", "Multiplicador de la experiencia que ganan las mascotas de los cazadores."),
|
||
"Instance.IgnoreLevel": ("Ignorar el nivel requerido de las mazmorras", "Personajes de cualquier nivel pueden entrar en mazmorras y bandas."),
|
||
"Instance.IgnoreRaid": ("Entrar en bandas sin grupo de banda", "Los jugadores pueden entrar en instancias de banda sin estar en un grupo de banda."),
|
||
"Instance.ResetTimeHour": ("Hora de reinicio de mazmorras", "Hora del día (0-23) a la que se reinician los bloqueos de mazmorras y bandas."),
|
||
"MaxPrimaryTradeSkill": ("Profesiones principales por personaje", "Cuántas profesiones principales (como herrería o herboristería) puede aprender un personaje."),
|
||
"AlwaysMaxSkillForLevel": ("Habilidades siempre al máximo del nivel", "Las habilidades de armas y otras están siempre al máximo para el nivel del personaje, sin entrenar."),
|
||
"ActivateWeather": ("Clima", "Activa o desactiva la lluvia, la nieve y las tormentas."),
|
||
"Group.Raid.LevelRestriction": ("Nivel mínimo para invitar a una banda", "Los personajes por debajo de este nivel no pueden ser invitados a un grupo de banda."),
|
||
"AllowTwoSide.Interaction.Group": ("Grupos entre facciones", "Jugadores de la Alianza y de la Horda pueden formar grupos juntos."),
|
||
"AllowTwoSide.Interaction.Guild": ("Hermandades entre facciones", "Jugadores de la Alianza y de la Horda pueden unirse a la misma hermandad."),
|
||
"AllowTwoSide.Interaction.Auction": ("Casa de subastas compartida", "Jugadores de la Alianza y de la Horda usan la misma casa de subastas."),
|
||
},
|
||
}
|
||
|
||
|
||
def fmt(v):
|
||
if isinstance(v, bool):
|
||
return "True" if v else "False"
|
||
return repr(v) if isinstance(v, str) else str(v)
|
||
|
||
|
||
def main():
|
||
path = os.path.join(ROOT, "tools", "gen_server_schema.py")
|
||
src = open(path, encoding="utf-8").read()
|
||
if "Rate.Drop.Item.Uncommon" in src:
|
||
print("generator already updated")
|
||
else:
|
||
lines = []
|
||
for k, t, c, title, desc, d, mn, mx, unit, adv, rs, dang in NEW:
|
||
lines.append(" (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s),\n" % (
|
||
json.dumps(k), json.dumps(t), json.dumps(c), json.dumps(title), json.dumps(desc), fmt(d),
|
||
fmt(mn) if mn is not None else "None", fmt(mx) if mx is not None else "None",
|
||
json.dumps(unit) if unit else "None", fmt(adv), json.dumps(rs), fmt(dang)))
|
||
marker = "]\nenums = {"
|
||
assert marker in src
|
||
src = src.replace(marker, "".join(lines) + marker, 1)
|
||
open(path, "w", encoding="utf-8", newline="\n").write(src)
|
||
for lang, tr in T.items():
|
||
p = os.path.join(ROOT, "src", "i18n", "schema", lang + ".json")
|
||
data = json.load(open(p, encoding="utf-8"))
|
||
for k, (t, d) in tr.items():
|
||
data["settings"][k] = {"t": t, "d": d}
|
||
with open(p, "w", encoding="utf-8", newline="\n") as f:
|
||
json.dump(data, f, indent=1, ensure_ascii=False)
|
||
f.write("\n")
|
||
|
||
|
||
main()
|